Network Namespace

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Основна інформація

Простір імен мережі - це функція ядра Linux, яка забезпечує ізоляцію мережевого стеку, дозволяючи кожному простору імен мережі мати власну незалежну мережеву конфігурацію, інтерфейси, IP-адреси, таблиці маршрутизації та правила брандмауера. Ця ізоляція корисна в різних сценаріях, таких як контейнеризація, де кожен контейнер повинен мати свою власну мережеву конфігурацію, незалежну від інших контейнерів та системи хоста.

Як це працює:

  1. При створенні нового простору імен мережі він починається з повністю ізольованого мережевого стеку, з жодними мережевими інтерфейсами, крім інтерфейсу зворотного зв'язку (lo). Це означає, що процеси, які працюють в новому просторі імен мережі, за замовчуванням не можуть спілкуватися з процесами в інших просторах імен або системі хоста.

  2. Віртуальні мережеві інтерфейси, такі як пари veth, можуть бути створені та переміщені між просторами імен мережі. Це дозволяє встановлювати мережеве з'єднання між просторами імен або між простором імен та системою хоста. Наприклад, один кінець пари veth може бути розміщений в просторі імен мережі контейнера, а інший кінець може бути підключений до моста або іншого мережевого інтерфейсу в просторі імен хоста, забезпечуючи мережеве з'єднання з контейнером.

  3. Мережеві інтерфейси в межах простору імен можуть мати свої власні IP-адреси, таблиці маршрутизації та правила брандмауера, незалежні від інших просторів імен. Це дозволяє процесам в різних просторах імен мати різні мережеві конфігурації та працювати так, ніби вони працюють на окремих мережевих системах.

  4. Процеси можуть переміщатися між просторами імен за допомогою системного виклику setns(), або створювати нові простори імен за допомогою системних викликів unshare() або clone() з прапорцем CLONE_NEWNET. Коли процес переходить до нового простору імен або створює його, він почне використовувати мережеву конфігурацію та інтерфейси, пов'язані з цим простором імен.

Лабораторія:

Створення різних просторів імен

CLI

sudo unshare -n [--mount-proc] /bin/bash
# Run ifconfig or ip -a

Монтувавши новий екземпляр файлової системи /proc, якщо ви використовуєте параметр --mount-proc, ви забезпечуєте, що новий простір імен має точний та ізольований перегляд інформації про процес, специфічний для цього простору імен.

Помилка: bash: fork: Неможливо виділити пам'ять

Коли unshare виконується без опції -f, виникає помилка через те, як Linux обробляє нові простори імен PID (ідентифікатори процесів). Основні деталі та рішення наведено нижче:

  1. Пояснення проблеми:

  • Ядро Linux дозволяє процесу створювати нові простори імен за допомогою системного виклику unshare. Однак процес, який ініціює створення нового простору імен PID (відомий як "процес unshare"), не входить в новий простір імен; лише його дочірні процеси.

  • Виконання %unshare -p /bin/bash% запускає /bin/bash в тому ж процесі, що й unshare. В результаті /bin/bash та його дочірні процеси знаходяться в початковому просторі імен PID.

  • Перший дочірній процес /bin/bash в новому просторі імен стає PID 1. Коли цей процес завершується, він спричиняє очищення простору імен, якщо немає інших процесів, оскільки PID 1 має спеціальну роль у прийнятті сирітських процесів. Після цього ядро Linux вимикає виділення PID в цьому просторі імен.

  1. Наслідок:

  • Виходження PID 1 в новому просторі імен призводить до очищення прапорця PIDNS_HASH_ADDING. Це призводить до невдалого виділення PID під час створення нового процесу, що призводить до помилки "Неможливо виділити пам'ять".

  1. Рішення:

  • Проблему можна вирішити, використовуючи опцію -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]'

Знайдіть всі мережові простори імен

```bash 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 ``` ### Увійдіть всередину простору імені мережі ```bash nsenter -n TARGET_PID --pid /bin/bash ``` Також, ви можете **увійти в інший простір процесу лише як root**. І ви **не можете** **увійти** в інший простір без дескриптора, що вказує на нього (наприклад, `/proc/self/ns/net`).

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated