User namespace — це функція ядра Linux, яка забезпечує ізоляцію відображень ідентифікаторів користувачів і груп, дозволяючи кожному простору користувача мати власний набір ідентифікаторів користувачів і груп. Ця ізоляція дозволяє процесам, що працюють у різних просторах користувачів, мати різні привілеї та власність, навіть якщо вони мають однакові числові ідентифікатори користувачів і груп.
Простори користувачів особливо корисні в контейнеризації, де кожен контейнер повинен мати свій незалежний набір ідентифікаторів користувачів і груп, що дозволяє забезпечити кращу безпеку та ізоляцію між контейнерами та хост-системою.
How it works:
Коли створюється новий простір користувача, він починається з порожнього набору відображень ідентифікаторів користувачів і груп. Це означає, що будь-який процес, що працює в новому просторі користувача, спочатку не матиме привілеїв поза межами простору.
Відображення ідентифікаторів можуть бути встановлені між ідентифікаторами користувачів і груп у новому просторі та тими, що в батьківському (або хост) просторі. Це дозволяє процесам у новому просторі мати привілеї та власність, що відповідають ідентифікаторам користувачів і груп у батьківському просторі. Однак відображення ідентифікаторів можуть бути обмежені до певних діапазонів і підмножин ідентифікаторів, що дозволяє точно контролювати привілеї, надані процесам у новому просторі.
У межах простору користувача процеси можуть мати повні привілеї root (UID 0) для операцій всередині простору, при цьому маючи обмежені привілеї поза межами простору. Це дозволяє контейнерам працювати з можливостями, подібними до root, у своєму власному просторі без повних привілеїв root на хост-системі.
Процеси можуть переміщатися між просторами, використовуючи системний виклик setns() або створювати нові простори, використовуючи системні виклики unshare() або clone() з прапором CLONE_NEWUSER. Коли процес переходить до нового простору або створює його, він почне використовувати відображення ідентифікаторів користувачів і груп, пов'язані з цим простором.
Lab:
Create different Namespaces
CLI
sudounshare-U [--mount-proc] /bin/bash
Монтування нового екземпляра файлової системи /proc, якщо ви використовуєте параметр --mount-proc, забезпечує, що новий простір монтування має точний та ізольований вигляд інформації про процеси, специфічної для цього простору.
Помилка: bash: fork: Не вдалося виділити пам'ять
Коли unshare виконується без параметра -f, виникає помилка через те, як Linux обробляє нові PID (ідентифікатори процесів) простори. Основні деталі та рішення наведені нижче:
Пояснення проблеми:
Ядро Linux дозволяє процесу створювати нові простори за допомогою системного виклику unshare. Однак процес, який ініціює створення нового PID простору (який називається "процесом unshare"), не входить до нового простору; лише його дочірні процеси входять.
Виконання %unshare -p /bin/bash% запускає /bin/bash в тому ж процесі, що й unshare. Відповідно, /bin/bash та його дочірні процеси знаходяться в оригінальному PID просторі.
Перший дочірній процес /bin/bash у новому просторі стає PID 1. Коли цей процес завершується, це викликає очищення простору, якщо немає інших процесів, оскільки PID 1 має особливу роль усиновлення сирітських процесів. Ядро Linux тоді вимкне виділення PID у цьому просторі.
Наслідок:
Завершення PID 1 у новому просторі призводить до очищення прапора PIDNS_HASH_ADDING. Це призводить до того, що функція alloc_pid не може виділити новий PID при створенні нового процесу, що викликає помилку "Не вдалося виділити пам'ять".
Рішення:
Проблему можна вирішити, використовуючи параметр -f з unshare. Цей параметр змушує unshare створити новий процес після створення нового PID простору.
Виконання %unshare -fp /bin/bash% забезпечує, що команда unshare сама стає PID 1 у новому просторі. /bin/bash та його дочірні процеси тоді безпечно містяться в цьому новому просторі, запобігаючи передчасному завершенню PID 1 та дозволяючи нормальне виділення PID.
Забезпечивши, що unshare виконується з прапором -f, новий PID простір правильно підтримується, що дозволяє /bin/bash та його підпроцесам працювати без виникнення помилки виділення пам'яті.
Щоб використовувати простір імен користувача, демон Docker потрібно запустити з --userns-remap=default (в ubuntu 14.04 це можна зробити, змінивши /etc/default/docker, а потім виконавши sudo service docker restart)
Перевірте, в якому просторі імен знаходиться ваш процес
sudofind/proc-maxdepth3-typel-nameuser-execreadlink{} \; 2>/dev/null|sort-u# Find the processes with an specific namespacesudofind/proc-maxdepth3-typel-nameuser-execls-l{} \; 2>/dev/null|grep<ns-number>
Увійти всередину простору імен користувача
nsenter-UTARGET_PID--pid/bin/bash
Також ви можете входити в інший простір процесів лише якщо ви root. І ви не можетевходити в інший простір без дескриптора, що вказує на нього (наприклад, /proc/self/ns/user).
Створити новий простір користувачів (з відображеннями)
# Containersudounshare-U/bin/bashnobody@ip-172-31-28-169:/home/ubuntu$#Check how the user is nobody# From the hostps-ef|grepbash# The user inside the host is still root, not nobodyroot2775627755021:11pts/1000:00:00/bin/bash
Відновлення можливостей
У випадку з просторами користувачів, коли створюється новий простір користувачів, процес, який входить у простір, отримує повний набір можливостей у цьому просторі. Ці можливості дозволяють процесу виконувати привілейовані операції, такі як монтуванняфайлових систем, створення пристроїв або зміна власності файлів, але тільки в контексті його простору користувачів.
Наприклад, коли у вас є можливість CAP_SYS_ADMIN у просторі користувачів, ви можете виконувати операції, які зазвичай вимагають цієї можливості, такі як монтування файлових систем, але тільки в контексті вашого простору користувачів. Будь-які операції, які ви виконуєте з цією можливістю, не вплинуть на хост-систему або інші простори.
Отже, навіть якщо отримання нового процесу всередині нового простору користувачів дасть вам всі можливості назад (CapEff: 000001ffffffffff), ви насправді можете використовувати лише ті, що пов'язані з простором (монтування, наприклад), але не всі. Тож цього самого по собі недостатньо, щоб втекти з контейнера Docker.
# There are the syscalls that are filtered after changing User namespace with:unshare-UmCpfbashProbando:0x067...ErrorProbando:0x070...ErrorProbando:0x074...ErrorProbando:0x09b...ErrorProbando:0x0a3...ErrorProbando:0x0a4...ErrorProbando:0x0a7...ErrorProbando:0x0a8...ErrorProbando:0x0aa...ErrorProbando:0x0ab...ErrorProbando:0x0af...ErrorProbando:0x0b0...ErrorProbando:0x0f6...ErrorProbando:0x12c...ErrorProbando:0x130...ErrorProbando:0x139...ErrorProbando:0x140...ErrorProbando:0x141...Error<div data-gb-custom-block data-tag="hint" data-style='success'>Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details><summary>Support HackTricks</summary>* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details></div>hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</div></details></div></details></div></details></div></details></div></details></div>