Mount Namespace

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

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

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

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

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

Як це працює:

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

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

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

  4. Дескриптори файлів та іноди спільно використовуються між просторами імен, що означає, що якщо процес в одному просторі імен має відкритий дескриптор файлу, що вказує на файл, він може передати цей дескриптор файлу процесу в іншому просторі імен, і обидва процеси матимуть доступ до одного й того ж файлу. Однак шлях до файлу може бути різним у обох просторах імен через різницю в точках монтування.

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

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

CLI

sudo unshare -m [--mount-proc] /bin/bash

Монтувавши новий екземпляр файлової системи /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

Перевірте, в якому просторі імені знаходиться ваш процес

ls -l /proc/self/ns/mnt
lrwxrwxrwx 1 root root 0 Apr  4 20:30 /proc/self/ns/mnt -> 'mnt:[4026531841]'

Знайдіть всі простори імен точок монтування

```bash sudo find /proc -maxdepth 3 -type l -name mnt -exec readlink {} \; 2>/dev/null | sort -u # Find the processes with an specific namespace sudo find /proc -maxdepth 3 -type l -name mnt -exec ls -l {} \; 2>/dev/null | grep ``` ### Увійдіть всередину простору імені Mount ```bash nsenter -m TARGET_PID --pid /bin/bash ``` Також, ви можете **увійти в простір імен іншого процесу лише як root**. І ви **не можете** **увійти** в інший простір імен **без дескриптора**, що вказує на нього (наприклад, `/proc/self/ns/mnt`).

Оскільки нові монти доступні лише в межах простору імен, можливо, що простір імен містить чутливу інформацію, до якої можна отримати доступ лише з нього.

Підключіть щось

# Generate new mount ns
unshare -m /bin/bash
mkdir /tmp/mount_ns_example
mount -t tmpfs tmpfs /tmp/mount_ns_example
mount | grep tmpfs # "tmpfs on /tmp/mount_ns_example"
echo test > /tmp/mount_ns_example/test
ls /tmp/mount_ns_example/test # Exists

# From the host
mount | grep tmpfs # Cannot see "tmpfs on /tmp/mount_ns_example"
ls /tmp/mount_ns_example/test # Doesn't exist

Посилання

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

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

Last updated