Network Namespace
Reading time: 5 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Basic Information
Мережевий простір імен - це функція ядра Linux, яка забезпечує ізоляцію мережевого стеку, дозволяючи кожному мережевому простору імен мати свою власну незалежну мережеву конфігурацію, інтерфейси, IP-адреси, таблиці маршрутизації та правила брандмауера. Ця ізоляція корисна в різних сценаріях, таких як контейнеризація, де кожен контейнер повинен мати свою власну мережеву конфігурацію, незалежну від інших контейнерів і хост-системи.
How it works:
- Коли створюється новий мережевий простір імен, він починає з повністю ізольованого мережевого стеку, з жодними мережевими інтерфейсами, окрім інтерфейсу зворотного зв'язку (lo). Це означає, що процеси, що виконуються в новому мережевому просторі імен, не можуть за замовчуванням спілкуватися з процесами в інших просторах імен або з хост-системою.
- Віртуальні мережеві інтерфейси, такі як пари veth, можуть бути створені та переміщені між мережевими просторами імен. Це дозволяє встановлювати мережеву зв'язність між просторами імен або між простором імен і хост-системою. Наприклад, один кінець пари veth може бути розміщений у мережевому просторі імен контейнера, а інший кінець може бути підключений до мосту або іншого мережевого інтерфейсу в просторі імен хоста, забезпечуючи мережеву зв'язність для контейнера.
- Мережеві інтерфейси в межах простору імен можуть мати свої власні IP-адреси, таблиці маршрутизації та правила брандмауера, незалежно від інших просторів імен. Це дозволяє процесам у різних мережевих просторах імен мати різні мережеві конфігурації та працювати так, ніби вони виконуються на окремих мережевих системах.
- Процеси можуть переміщатися між просторами імен, використовуючи системний виклик
setns()
, або створювати нові простори імен, використовуючи системні викликиunshare()
абоclone()
з прапоромCLONE_NEWNET
. Коли процес переміщується в новий простір імен або створює його, він почне використовувати мережеву конфігурацію та інтерфейси, пов'язані з цим простором імен.
Lab:
Create different Namespaces
CLI
sudo unshare -n [--mount-proc] /bin/bash
# Run ifconfig or ip -a
Монтування нової інстанції файлової системи /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
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
# Run ifconfig or ip -a
Перевірте, в якому просторі імен знаходиться ваш процес
ls -l /proc/self/ns/net
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/net -> 'net:[4026531840]'
Знайти всі мережеві простори імен
sudo find /proc -maxdepth 3 -type l -name net -exec readlink {} \; 2>/dev/null | sort -u | grep "net:"
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name net -exec ls -l {} \; 2>/dev/null | grep <ns-number>
Увійти в мережевий простір імен
nsenter -n TARGET_PID --pid /bin/bash
Також ви можете входити в інший простір процесів лише якщо ви є root. І ви не можете входити в інший простір без дескриптора, що вказує на нього (наприклад, /proc/self/ns/net
).
References
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.