Linux Privilege Escalation
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Давайте почнемо отримувати деякі знання про ОС, що працює
Якщо у вас є права на запис у будь-яку папку всередині змінної PATH
, ви можете мати можливість перехопити деякі бібліотеки або двійкові файли:
Цікава інформація, паролі або API ключі в змінних середовища?
Перевірте версію ядра та чи є якісь експлойти, які можна використати для ескалації привілеїв
Ви можете знайти хороший список вразливих ядер та деякі вже скомпільовані експлойти тут: https://github.com/lucyoa/kernel-exploits та exploitdb sploits. Інші сайти, де ви можете знайти деякі скомпільовані експлойти: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
Щоб витягти всі вразливі версії ядер з цього веб-сайту, ви можете зробити:
Інструменти, які можуть допомогти в пошуку експлойтів ядра:
linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py (виконати НА жертві, перевіряє експлойти лише для ядра 2.x)
Завжди шукайте версію ядра в Google, можливо, ваша версія ядра згадується в якому-небудь експлойті ядра, і тоді ви будете впевнені, що цей експлойт дійсний.
Linux Privilege Escalation - Linux Kernel <= 3.19.0-73.8
На основі вразливих версій sudo, які з'являються в:
Ви можете перевірити, чи вразлива версія sudo, використовуючи цей grep.
Від @sickrov
Перевірте smasher2 box of HTB для прикла того, як цю уразливість можна експлуатувати
Якщо ви всередині контейнера docker, ви можете спробувати втекти з нього:
Docker SecurityПеревірте що змонтовано і розмонтовано, де і чому. Якщо щось розмонтовано, ви можете спробувати змонтувати це і перевірити на наявність приватної інформації.
Перерахуйте корисні двійкові файли
Також перевірте, чи встановлений будь-який компілятор. Це корисно, якщо вам потрібно використовувати якийсь експлойт ядра, оскільки рекомендується компілювати його на машині, де ви плануєте його використовувати (або на подібній).
Перевірте версію встановлених пакетів та сервісів. Можливо, є якась стара версія Nagios (наприклад), яку можна експлуатувати для підвищення привілеїв… Рекомендується вручну перевірити версію більш підозрілого встановленого програмного забезпечення.
Якщо у вас є доступ до машини через SSH, ви також можете використовувати openVAS для перевірки застарілого та вразливого програмного забезпечення, встановленого на машині.
Зверніть увагу, що ці команди покажуть багато інформації, яка в основному буде марною, тому рекомендується використовувати деякі програми, такі як OpenVAS або подібні, які перевірять, чи є будь-яка версія встановленого програмного забезпечення вразливою до відомих експлойтів
Подивіться на які процеси виконуються та перевірте, чи має який-небудь процес більше привілеїв, ніж повинен (можливо, tomcat виконується від імені root?)
Завжди перевіряйте наявність можливих [electron/cef/chromium дебагерів], які працюють, ви можете зловживати цим для ескалації привілеїв](electron-cef-chromium-debugger-abuse.md). Linpeas виявляє їх, перевіряючи параметр --inspect
у командному рядку процесу.
Також перевірте свої привілеї над бінарними файлами процесів, можливо, ви зможете перезаписати когось.
Ви можете використовувати інструменти, такі як pspy, для моніторингу процесів. Це може бути дуже корисно для виявлення вразливих процесів, які виконуються часто або коли виконуються певні умови.
Деякі служби сервера зберігають облікові дані у відкритому тексті в пам'яті. Зазвичай вам знадобляться привілеї root, щоб читати пам'ять процесів, які належать іншим користувачам, тому це зазвичай більш корисно, коли ви вже є root і хочете виявити більше облікових даних. Однак пам'ятайте, що як звичайний користувач ви можете читати пам'ять процесів, якими володієте.
Зверніть увагу, що в даний час більшість машин не дозволяють ptrace за замовчуванням, що означає, що ви не можете скинути інші процеси, які належать вашому непривабливому користувачу.
Файл /proc/sys/kernel/yama/ptrace_scope контролює доступність ptrace:
kernel.yama.ptrace_scope = 0: всі процеси можуть бути дебаговані, якщо у них однаковий uid. Це класичний спосіб, як працював ptracing.
kernel.yama.ptrace_scope = 1: тільки батьківський процес може бути дебагований.
kernel.yama.ptrace_scope = 2: тільки адміністратор може використовувати ptrace, оскільки це вимагає можливості CAP_SYS_PTRACE.
kernel.yama.ptrace_scope = 3: жоден процес не може бути відстежений за допомогою ptrace. Після встановлення потрібно перезавантаження, щоб знову активувати ptracing.
Якщо у вас є доступ до пам'яті служби FTP (наприклад), ви можете отримати Heap і шукати в його облікових даних.
Для заданого ідентифікатора процесу, maps показує, як пам'ять відображається в віртуальному адресному просторі цього процесу; також показує дозволи кожного відображеного регіону. Псевдофайл mem викриває пам'ять процесів. З файлу maps ми знаємо, які регіони пам'яті є читабельними та їх зсуви. Ми використовуємо цю інформацію, щоб перейти до файлу mem і скинути всі читабельні регіони в файл.
/dev/mem
надає доступ до фізичної пам'яті системи, а не до віртуальної пам'яті. Віртуальний адресний простір ядра можна отримати за допомогою /dev/kmem.
Зазвичай, /dev/mem
доступний лише для читання root та групи kmem.
ProcDump - це переосмислення класичного інструменту ProcDump з набору інструментів Sysinternals для Windows. Отримайте його за адресою https://github.com/Sysinternals/ProcDump-for-Linux
Щоб вивантажити пам'ять процесу, ви можете використовувати:
https://github.com/hajzer/bash-memory-dump (root) - _Ви можете вручну видалити вимоги до root і вивантажити процес, що належить вам
Скрипт A.5 з https://www.delaat.net/rp/2016-2017/p97/report.pdf (потрібен root)
Якщо ви виявите, що процес автентифікації працює:
Ви можете скинути процес (дивіться попередні розділи, щоб знайти різні способи скидання пам'яті процесу) і шукати облікові дані всередині пам'яті:
Інструмент https://github.com/huntergregal/mimipenguin викраде відкриті облікові дані з пам'яті та з деяких відомих файлів. Для правильної роботи потрібні права root.
Пароль GDM (Kali Desktop, Debian Desktop)
gdm-password
Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop)
gnome-keyring-daemon
LightDM (Ubuntu Desktop)
lightdm
VSFTPd (Активні FTP з'єднання)
vsftpd
Apache2 (Активні сесії HTTP Basic Auth)
apache2
OpenSSH (Активні сесії SSH - Використання Sudo)
sshd:
Перевірте, чи є які-небудь заплановані завдання вразливими. Можливо, ви зможете скористатися скриптом, що виконується від імені root (вразливість з підстановкою? можна змінювати файли, які використовує root? використовувати символічні посилання? створювати специфічні файли в каталозі, який використовує root?).
Наприклад, всередині /etc/crontab ви можете знайти PATH: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
(Зверніть увагу, що користувач "user" має права на запис у /home/user)
Якщо всередині цього crontab користувач root намагається виконати якусь команду або скрипт без встановлення шляху. Наприклад: * * * * root overwrite.sh Тоді ви можете отримати root shell, використовуючи:
Якщо скрипт, що виконується від імені root, містить “*” всередині команди, ви можете використати це для виконання несподіваних дій (наприклад, підвищення привілеїв). Приклад:
Якщо шаблон передує шляху, як /some/path/* , він не вразливий (навіть ./* не є).
Прочитайте наступну сторінку для отримання додаткових трюків експлуатації шаблонів:
Wildcards Spare tricksЯкщо ви можете змінити скрипт cron, що виконується від імені root, ви можете дуже легко отримати оболонку:
Якщо скрипт, виконуваний root, використовує каталог, до якого у вас є повний доступ, можливо, буде корисно видалити цей каталог і створити символічне посилання на інший, що обслуговує скрипт, контрольований вами.
Ви можете моніторити процеси, щоб шукати процеси, які виконуються кожні 1, 2 або 5 хвилин. Можливо, ви зможете скористатися цим і підвищити привілеї.
Наприклад, щоб моніторити кожні 0.1с протягом 1 хвилини, сортувати за менш виконуваними командами і видалити команди, які виконувалися найбільше, ви можете зробити:
Ви також можете використовувати pspy (це буде моніторити та перераховувати кожен процес, який запускається).
Можливо створити cronjob додавши символ повернення каретки після коментаря (без символу нового рядка), і cron завдання буде працювати. Приклад (зверніть увагу на символ повернення каретки):
Перевірте, чи можете ви записати будь-який .service
файл, якщо так, ви можете змінити його, щоб він виконував ваш бекдор, коли служба запускається, перезапускається або зупиняється (можливо, вам потрібно буде почекати, поки машина перезавантажиться).
Наприклад, створіть ваш бекдор всередині .service файлу з ExecStart=/tmp/script.sh
Майте на увазі, що якщо у вас є права на запис для бінарних файлів, які виконуються службами, ви можете змінити їх на бекдори, щоб, коли служби будуть повторно виконані, бекдори також виконувалися.
Ви можете побачити PATH, який використовується systemd за допомогою:
Якщо ви виявите, що можете записувати в будь-якій з папок шляху, ви можете підвищити привілеї. Вам потрібно шукати відносні шляхи, що використовуються в конфігураційних файлах сервісів, такі як:
Тоді створіть виконуваний файл з тим самим ім'ям, що й бінарний файл відносного шляху всередині папки системного шляху systemd, в яку ви можете писати, і коли служба буде запитана на виконання вразливої дії (Запустити, Зупинити, Перезавантажити), ваш бекдор буде виконано (користувачі без привілеїв зазвичай не можуть запускати/зупиняти служби, але перевірте, чи можете ви використовувати sudo -l
).
Дізнайтеся більше про служби за допомогою man systemd.service
.
Таймери - це файли одиниць systemd, назва яких закінчується на **.timer**
, які контролюють **.service**
файли або події. Таймери можуть використовуватися як альтернатива cron, оскільки вони мають вбудовану підтримку календарних подій і монотонних подій часу та можуть виконуватися асинхронно.
Ви можете перерахувати всі таймери за допомогою:
Якщо ви можете змінити таймер, ви можете змусити його виконати деякі екземпляри systemd.unit (як-от .service
або .target
)
У документації ви можете прочитати, що таке Unit:
Юніт, який потрібно активувати, коли цей таймер спливає. Аргумент - це назва юніта, суфікс якого не ".timer". Якщо не вказано, це значення за замовчуванням є сервісом, який має таку ж назву, як юніт таймера, за винятком суфікса. (Див. вище.) Рекомендується, щоб назва юніта, який активується, і назва юніта таймера були однаковими, за винятком суфікса.
Отже, щоб зловживати цим дозволом, вам потрібно:
Знайти якийсь юніт systemd (наприклад, .service
), який виконує записуваний бінарний файл
Знайти якийсь юніт systemd, який виконує відносний шлях і у вас є права на запис над шляхом systemd (щоб видавати себе за цей виконуваний файл)
Дізнайтеся більше про таймери за допомогою man systemd.timer
.
Щоб увімкнути таймер, вам потрібні права root і потрібно виконати:
Зверніть увагу, що таймер активується шляхом створення символічного посилання на нього в /etc/systemd/system/<WantedBy_section>.wants/<name>.timer
Сокети домену Unix (UDS) дозволяють комунікацію процесів на тих же або різних машинах у рамках моделей клієнт-сервер. Вони використовують стандартні файли дескрипторів Unix для міжкомп'ютерної комунікації та налаштовуються через файли .socket
.
Сокети можна налаштувати за допомогою файлів .socket
.
Дізнайтеся більше про сокети за допомогою man systemd.socket
. У цьому файлі можна налаштувати кілька цікавих параметрів:
ListenStream
, ListenDatagram
, ListenSequentialPacket
, ListenFIFO
, ListenSpecial
, ListenNetlink
, ListenMessageQueue
, ListenUSBFunction
: Ці параметри різні, але підсумок використовується для вказівки, де буде прослуховуватися сокет (шлях до файлу сокета AF_UNIX, IPv4/6 та/або номер порту для прослуховування тощо)
Accept
: Приймає булевий аргумент. Якщо істина, екземпляр служби створюється для кожного вхідного з'єднання і лише сокет з'єднання передається йому. Якщо хибність, всі сокети, що прослуховують, передаються запущеній одиниці служби, і лише одна одиниця служби створюється для всіх з'єднань. Це значення ігнорується для датаграмних сокетів і FIFO, де одна одиниця служби безумовно обробляє весь вхідний трафік. За замовчуванням - хибність. З міркувань продуктивності рекомендується писати нові демони лише в спосіб, який підходить для Accept=no
.
ExecStartPre
, ExecStartPost
: Приймає одну або кілька командних рядків, які виконуються перед або після того, як прослуховуючі сокети/FIFO створені та прив'язані відповідно. Перший токен командного рядка повинен бути абсолютним іменем файлу, за яким слідують аргументи для процесу.
ExecStopPre
, ExecStopPost
: Додаткові команди, які виконуються перед або після того, як прослуховуючі сокети/FIFO закриті та видалені відповідно.
Service
: Вказує ім'я одиниці служби, яку потрібно активувати при вхідному трафіку. Ця настройка дозволена лише для сокетів з Accept=no. За замовчуванням це служба, яка має таку ж назву, як сокет (з заміненим суфіксом). У більшості випадків не повинно бути необхідності використовувати цю опцію.
Якщо ви знайдете записуваний файл .socket
, ви можете додати на початку секції [Socket]
щось на кшталт: ExecStartPre=/home/kali/sys/backdoor
, і бекдор буде виконано перед створенням сокета. Тому вам можливо, доведеться почекати, поки машина перезавантажиться.
&#xNAN;Nотайте, що система повинна використовувати цю конфігурацію файлу сокета, інакше бекдор не буде виконано
Якщо ви виявите будь-який записуваний сокет (тепер ми говоримо про сокети Unix, а не про конфігураційні файли .socket
), тоді ви можете спілкуватися з цим сокетом і, можливо, експлуатувати вразливість.
Приклад експлуатації:
Socket Command InjectionЗверніть увагу, що можуть бути деякі сокети, які слухають HTTP запити (Я не говорю про .socket файли, а про файли, які діють як unix сокети). Ви можете перевірити це за допомогою:
Якщо сокет відповідає HTTP запитом, тоді ви можете взаємодіяти з ним і, можливо, використати деяку вразливість.
Docker сокет, який зазвичай знаходиться за адресою /var/run/docker.sock
, є критично важливим файлом, який слід захистити. За замовчуванням, він доступний для запису користувачу root
та членам групи docker
. Наявність доступу на запис до цього сокета може призвести до ескалації привілеїв. Ось розгляд того, як це можна зробити, а також альтернативні методи, якщо Docker CLI недоступний.
Якщо у вас є доступ на запис до Docker сокета, ви можете ескалувати привілеї, використовуючи наступні команди:
Ці команди дозволяють вам запустити контейнер з доступом на рівні root до файлової системи хоста.
У випадках, коли Docker CLI недоступний, сокет Docker все ще можна маніпулювати, використовуючи Docker API та команди curl
.
Список Docker образів: Отримати список доступних образів.
Створити контейнер: Відправити запит на створення контейнера, який монтує кореневий каталог системи хоста.
Запустіть новостворений контейнер:
Приєднатися до контейнера: Використовуйте socat
, щоб встановити з'єднання з контейнером, що дозволяє виконувати команди всередині нього.
Після налаштування з'єднання socat
ви можете виконувати команди безпосередньо в контейнері з доступом на рівні root до файлової системи хоста.
Зверніть увагу, що якщо у вас є права на запис над сокетом docker, тому що ви всередині групи docker
, у вас є більше способів підвищити привілеї. Якщо docker API слухає на порту, ви також можете його скомпрометувати.
Перевірте більше способів вийти з docker або зловживати ним для підвищення привілеїв в:
Docker SecurityЯкщо ви виявите, що можете використовувати команду ctr
, прочитайте наступну сторінку, оскільки ви можете зловживати нею для підвищення привілеїв:
Якщо ви виявите, що можете використовувати команду runc
, прочитайте наступну сторінку, оскільки ви можете зловживати нею для підвищення привілеїв:
D-Bus — це складна система міжпроцесорної комунікації (IPC), яка дозволяє додаткам ефективно взаємодіяти та обмінюватися даними. Розроблена з урахуванням сучасної системи Linux, вона пропонує надійну структуру для різних форм комунікації між додатками.
Система є універсальною, підтримуючи базову IPC, яка покращує обмін даними між процесами, нагадуючи покращені сокети домену UNIX. Крім того, вона допомагає у трансляції подій або сигналів, сприяючи безперешкодній інтеграції між компонентами системи. Наприклад, сигнал від демона Bluetooth про вхідний дзвінок може змусити музичний плеєр вимкнути звук, покращуючи досвід користувача. Крім того, D-Bus підтримує систему віддалених об'єктів, спрощуючи запити на послуги та виклики методів між додатками, спрощуючи процеси, які традиційно були складними.
D-Bus працює за моделлю дозволу/заборони, керуючи дозволами на повідомлення (виклики методів, випуск сигналів тощо) на основі кумулятивного ефекту відповідних політик. Ці політики визначають взаємодії з шиною, потенційно дозволяючи підвищення привілеїв через експлуатацію цих дозволів.
Приклад такої політики в /etc/dbus-1/system.d/wpa_supplicant.conf
надано, детально описуючи дозволи для користувача root на володіння, відправку та отримання повідомлень від fi.w1.wpa_supplicant1
.
Політики без зазначеного користувача або групи застосовуються універсально, тоді як політики "за замовчуванням" застосовуються до всіх, які не охоплені іншими специфічними політиками.
Дізнайтеся, як перерахувати та експлуатувати D-Bus комунікацію тут:
D-Bus Enumeration & Command Injection Privilege EscalationЗавжди цікаво перерахувати мережу та з'ясувати позицію машини.
Завжди перевіряйте мережеві сервіси, що працюють на машині, з якою ви не змогли взаємодіяти до її доступу:
Перевірте, чи можете ви перехоплювати трафік. Якщо так, ви зможете отримати деякі облікові дані.
Перевірте хто ви, які привілеї у вас є, які користувачі є в системах, які можуть увійти і які мають root-привілеї:
Деякі версії Linux були під впливом помилки, яка дозволяє користувачам з UID > INT_MAX підвищувати привілеї. Більше інформації: тут, тут та тут.
Використайте: systemd-run -t /bin/bash
Перевірте, чи є ви членом якоїсь групи, яка може надати вам root-привілеї:
Interesting Groups - Linux PrivescПеревірте, чи є щось цікаве в буфері обміну (якщо можливо)
Якщо ви знаєте будь-який пароль середовища, спробуйте увійти як кожен користувач, використовуючи цей пароль.
Якщо вам не шкода створювати багато шуму і бінарники su
та timeout
присутні на комп'ютері, ви можете спробувати брутфорсити користувача, використовуючи su-bruteforce.
Linpeas з параметром -a
також намагається брутфорсити користувачів.
Якщо ви виявите, що можете записувати в деяку папку $PATH, ви можете підвищити привілеї, створивши бекдор у записуваній папці з назвою якоїсь команди, яка буде виконуватися іншим користувачем (ідеально root) і яка не завантажується з папки, що розташована перед вашою записуваною папкою в $PATH.
Вам може бути дозволено виконувати деякі команди, використовуючи sudo, або вони можуть мати біт suid. Перевірте це, використовуючи:
Деякі неочікувані команди дозволяють вам читати та/або записувати файли або навіть виконувати команду. Наприклад:
Конфігурація Sudo може дозволити користувачу виконати деяку команду з привілеями іншого користувача без знання пароля.
У цьому прикладі користувач demo
може запускати vim
як root
, тепер тривіально отримати оболонку, додавши ssh-ключ у директорію root або викликавши sh
.
Ця директива дозволяє користувачу встановити змінну середовища під час виконання чогось:
Цей приклад, оснований на машині HTB Admirer, був вразливим до PYTHONPATH hijacking для завантаження довільної бібліотеки python під час виконання скрипта від імені root:
Перескочити для читання інших файлів або використати символьні посилання. Наприклад, у файлі sudoers: hacker10 ALL= (root) /bin/less /var/log/*
Якщо використовується wildcard (*), це ще простіше:
Контрзаходи: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/
Якщо дозвіл sudo надано для однієї команди без вказівки шляху: hacker10 ALL= (root) less, ви можете скористатися цим, змінивши змінну PATH.
Цю техніку також можна використовувати, якщо suid бінар виконує іншу команду без вказівки шляху до неї (завжди перевіряйте за допомогою strings вміст дивного SUID бінару).
Приклади корисного навантаження для виконання.
Якщо suid бінар виконує іншу команду, вказуючи шлях, тоді ви можете спробувати експортувати функцію, названу так само, як команда, яку викликає файл suid.
Наприклад, якщо suid бінар викликає /usr/sbin/service apache2 start, вам потрібно спробувати створити функцію та експортувати її:
Тоді, коли ви викликаєте двійковий файл з suid, ця функція буде виконана
Змінна середовища LD_PRELOAD використовується для вказівки однієї або кількох спільних бібліотек (.so файлів), які повинні бути завантажені завантажувачем перед усіма іншими, включаючи стандартну бібліотеку C (libc.so
). Цей процес відомий як попереднє завантаження бібліотеки.
Однак, щоб підтримувати безпеку системи та запобігти експлуатації цієї функції, особливо з suid/sgid виконуваними файлами, система накладає певні умови:
Завантажувач ігнорує LD_PRELOAD для виконуваних файлів, де реальний ідентифікатор користувача (ruid) не збігається з ефективним ідентифікатором користувача (euid).
Для виконуваних файлів з suid/sgid попередньо завантажуються лише бібліотеки в стандартних шляхах, які також є suid/sgid.
Ескалація привілеїв може статися, якщо у вас є можливість виконувати команди з sudo
, і вихід sudo -l
містить твердження env_keep+=LD_PRELOAD. Ця конфігурація дозволяє змінній середовища LD_PRELOAD зберігатися та бути визнаною навіть при виконанні команд з sudo
, що потенційно може призвести до виконання довільного коду з підвищеними привілеями.
Зберегти як /tmp/pe.c
Тоді скомпілюйте це за допомогою:
Нарешті, підвищте привілеї запустивши
Схожий privesc може бути зловжито, якщо зловмисник контролює змінну середовища LD_LIBRARY_PATH, оскільки він контролює шлях, де будуть шукатися бібліотеки.
Коли ви стикаєтеся з бінарним файлом з SUID правами, який здається незвичайним, хорошою практикою є перевірка, чи правильно завантажуються .so файли. Це можна перевірити, виконавши наступну команду:
Наприклад, виникнення помилки, такої як "open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (Немає такого файлу або каталогу)" вказує на потенціал для експлуатації.
Щоб експлуатувати це, потрібно створити C файл, скажімо "/path/to/.config/libcalc.c", що міститиме наступний код:
Цей код, після компіляції та виконання, має на меті підвищити привілеї шляхом маніпуляції з правами доступу до файлів та виконання оболонки з підвищеними привілеями.
Скомпілюйте вищезазначений C файл у спільний об'єкт (.so) файл за допомогою:
Нарешті, виконання ураженого SUID бінарного файлу має активувати експлойт, що дозволяє потенційне компрометування системи.
Тепер, коли ми знайшли SUID бінарний файл, який завантажує бібліотеку з папки, в якій ми можемо записувати, давайте створимо бібліотеку в цій папці з необхідною назвою:
Якщо ви отримуєте помилку, таку як
це означає, що бібліотека, яку ви створили, повинна мати функцію під назвою a_function_name
.
GTFOBins - це кураторський список Unix-бінарників, які можуть бути використані зловмисником для обходу локальних обмежень безпеки. GTFOArgs - це те ж саме, але для випадків, коли ви можете тільки інжектувати аргументи в команду.
Проект збирає легітимні функції Unix-бінарників, які можуть бути зловживані для виходу з обмежених оболонок, ескалації або підтримки підвищених привілеїв, передачі файлів, створення прив'язаних і реверсних оболонок, а також полегшення інших завдань після експлуатації.
gdb -nx -ex '!sh' -ex quit sudo mysql -e '! /bin/sh' strace -o /dev/null /bin/sh sudo awk 'BEGIN {system("/bin/sh")}'
Якщо ви можете отримати доступ до sudo -l
, ви можете використовувати інструмент FallOfSudo, щоб перевірити, чи знайде він спосіб експлуатувати будь-яке правило sudo.
У випадках, коли у вас є доступ до sudo, але немає пароля, ви можете ескалувати привілеї, чекаючи виконання команди sudo, а потім перехоплюючи токен сесії.
Вимоги для ескалації привілеїв:
У вас вже є оболонка як користувач "sampleuser"
"sampleuser" використовував sudo
для виконання чогось за останні 15 хвилин (за замовчуванням це тривалість токена sudo, який дозволяє нам використовувати sudo
без введення пароля)
cat /proc/sys/kernel/yama/ptrace_scope
дорівнює 0
gdb
доступний (ви повинні мати можливість завантажити його)
(Ви можете тимчасово увімкнути ptrace_scope
за допомогою echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
або назавжди змінивши /etc/sysctl.d/10-ptrace.conf
і встановивши kernel.yama.ptrace_scope = 0
)
Якщо всі ці вимоги виконані, ви можете ескалувати привілеї, використовуючи: https://github.com/nongiach/sudo_inject
перше експлуатаційне (exploit.sh
) створить бінарний файл activate_sudo_token
в /tmp. Ви можете використовувати його для активації токена sudo у вашій сесії (ви не отримаєте автоматично root-оболонку, виконайте sudo su
):
Другий експлойт (exploit_v2.sh
) створить sh shell у /tmp власником якого є root з setuid
Третій експлойт (exploit_v3.sh
) створить файл sudoers, який робить токени sudo вічними та дозволяє всім користувачам використовувати sudo.
Якщо у вас є права на запис у папці або на будь-яких створених файлах всередині папки, ви можете використовувати бінарний write_sudo_token для створення токена sudo для користувача та PID. Наприклад, якщо ви можете перезаписати файл /var/run/sudo/ts/sampleuser і у вас є оболонка як цього користувача з PID 1234, ви можете отримати привілеї sudo без необхідності знати пароль, виконавши:
Файл /etc/sudoers
та файли всередині /etc/sudoers.d
налаштовують, хто може використовувати sudo
і як. Ці файли за замовчуванням можуть бути прочитані лише користувачем root та групою root.
Якщо ви можете прочитати цей файл, ви зможете отримати деяку цікаву інформацію, а якщо ви можете записати будь-який файл, ви зможете підвищити привілеї.
Якщо ви можете писати, ви можете зловживати цим дозволом.
Інший спосіб зловживати цими правами:
Існують деякі альтернативи бінарному файлу sudo
, такі як doas
для OpenBSD, не забудьте перевірити його конфігурацію за адресою /etc/doas.conf
Якщо ви знаєте, що користувач зазвичай підключається до машини і використовує sudo
для підвищення привілеїв, і ви отримали оболонку в контексті цього користувача, ви можете створити новий виконуваний файл sudo, який виконуватиме ваш код як root, а потім команду користувача. Потім, змініть $PATH контексту користувача (наприклад, додавши новий шлях у .bash_profile), щоб коли користувач виконує sudo, ваш виконуваний файл sudo виконується.
Зверніть увагу, що якщо користувач використовує іншу оболонку (не bash), вам потрібно буде змінити інші файли, щоб додати новий шлях. Наприклад, sudo-piggyback змінює ~/.bashrc
, ~/.zshrc
, ~/.bash_profile
. Ви можете знайти інший приклад у bashdoor.py
Або запустивши щось на зразок:
Файл /etc/ld.so.conf
вказує звідки завантажуються конфігураційні файли. Зазвичай, цей файл містить наступний шлях: include /etc/ld.so.conf.d/*.conf
Це означає, що конфігураційні файли з /etc/ld.so.conf.d/*.conf
будуть прочитані. Ці конфігураційні файли вказують на інші папки, де бібліотеки будуть шукатися. Наприклад, вміст /etc/ld.so.conf.d/libc.conf
є /usr/local/lib
. Це означає, що система буде шукати бібліотеки всередині /usr/local/lib
.
Якщо з якоїсь причини користувач має права на запис на будь-який з вказаних шляхів: /etc/ld.so.conf
, /etc/ld.so.conf.d/
, будь-який файл всередині /etc/ld.so.conf.d/
або будь-яка папка в конфігураційному файлі всередині /etc/ld.so.conf.d/*.conf
, він може мати можливість ескалації привілеїв.
Подивіться на те, як експлуатувати цю неправильну конфігурацію на наступній сторінці:
Копіюючи бібліотеку в /var/tmp/flag15/
, вона буде використовуватися програмою в цьому місці, як зазначено в змінній RPATH
.
Потім створіть зловмисну бібліотеку в /var/tmp
з gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6
Linux capabilities provide a підмножину доступних привілеїв root для процесу. This effectively breaks up root привілеї на менші та відмінні одиниці. Each of these units can then be independently granted to processes. This way the full set of privileges is reduced, decreasing the risks of exploitation. Read the following page to дізнатися більше про можливості та як їх зловживати:
Linux CapabilitiesIn a directory, the біт для "виконання" implies that the user affected can "cd" into the folder. The "читання" bit implies the user can переглядати the файли, and the "запис" bit implies the user can видаляти and створювати нові файли.
Access Control Lists (ACLs) represent the secondary layer of discretionary permissions, capable of перекривати традиційні ugo/rwx permissions. These permissions enhance control over file or directory access by allowing or denying rights to specific users who are not the owners or part of the group. This level of досконалості забезпечує більш точне управління доступом. Further details can be found тут.
Надайте користувачу "kali" права читання та запису над файлом:
Отримати файли з конкретними ACL з системи:
В старих версіях ви можете викрасти деякі сеанси оболонки іншого користувача (root). В нових версіях ви зможете підключитися лише до сеансів екрану вашого власного користувача. Однак ви можете знайти цікаву інформацію всередині сеансу.
Список сеансів екрану
Приєднатися до сесії
Це була проблема з старими версіями tmux. Я не зміг захопити сесію tmux (v2.1), створену root, як неприваблений користувач.
Список сесій tmux
Приєднатися до сесії
Перевірте Valentine box from HTB для прикладу.
Усі SSL та SSH ключі, згенеровані на системах на базі Debian (Ubuntu, Kubuntu тощо) між вереснем 2006 року та 13 травня 2008 року, можуть бути під впливом цього багу. Цей баг виникає під час створення нового ssh ключа в цих ОС, оскільки було можливих лише 32,768 варіацій. Це означає, що всі можливості можуть бути обчислені, і маючи ssh публічний ключ, ви можете шукати відповідний приватний ключ. Ви можете знайти обчислені можливості тут: https://github.com/g0tmi1k/debian-ssh
PasswordAuthentication: Вказує, чи дозволена аутентифікація за паролем. За замовчуванням no
.
PubkeyAuthentication: Вказує, чи дозволена аутентифікація за публічним ключем. За замовчуванням yes
.
PermitEmptyPasswords: Коли аутентифікація за паролем дозволена, вказує, чи дозволяє сервер вхід до облікових записів з порожніми рядками паролів. За замовчуванням no
.
Вказує, чи може root увійти за допомогою ssh, за замовчуванням no
. Можливі значення:
yes
: root може увійти за допомогою пароля та приватного ключа
without-password
або prohibit-password
: root може увійти лише з приватним ключем
forced-commands-only
: Root може увійти лише за допомогою приватного ключа, якщо вказані параметри команд
no
: ні
Вказує файли, які містять публічні ключі, які можуть бути використані для аутентифікації користувачів. Він може містити токени, такі як %h
, які будуть замінені на домашній каталог. Ви можете вказати абсолютні шляхи (починаючи з /
) або відносні шляхи від домашнього каталогу користувача. Наприклад:
Ця конфігурація вказує, що якщо ви спробуєте увійти з приватним ключем користувача "testusername", ssh буде порівнювати публічний ключ вашого ключа з тими, що знаходяться в /home/testusername/.ssh/authorized_keys
та /home/testusername/access
SSH агентне пересилання дозволяє вам використовувати ваші локальні SSH ключі замість того, щоб залишати ключі (без паролів!) на вашому сервері. Таким чином, ви зможете перескочити через ssh на хост і звідти перескочити на інший хост використовуючи ключ, розташований на вашому початковому хості.
Вам потрібно встановити цю опцію в $HOME/.ssh.config
ось так:
Зверніть увагу, що якщо Host
дорівнює *
, щоразу, коли користувач переходить на іншу машину, цей хост зможе отримати доступ до ключів (що є проблемою безпеки).
Файл /etc/ssh_config
може перезаписати ці опції та дозволити або заборонити цю конфігурацію.
Файл /etc/sshd_config
може дозволити або заборонити пересилання ssh-агента за допомогою ключового слова AllowAgentForwarding
(за замовчуванням дозволено).
Якщо ви виявите, що Forward Agent налаштовано в середовищі, прочитайте наступну сторінку, оскільки ви можете зловживати цим для ескалації привілеїв:
SSH Forward Agent exploitationФайл /etc/profile
та файли під /etc/profile.d/
є скриптами, які виконуються, коли користувач запускає нову оболонку. Тому, якщо ви можете записувати або змінювати будь-який з них, ви можете ескалувати привілеї.
Якщо знайдено будь-який дивний профільний скрипт, ви повинні перевірити його на чутливі дані.
В залежності від ОС файли /etc/passwd
та /etc/shadow
можуть мати іншу назву або може бути резервна копія. Тому рекомендується знайти всі з них та перевірити, чи можете ви їх прочитати, щоб побачити чи є там хеші:
В деяких випадках ви можете знайти хеші паролів всередині файлу /etc/passwd
(або еквівалентного).
Спочатку згенеруйте пароль за допомогою однієї з наступних команд.
Потім додайте користувача hacker
і додайте згенерований пароль.
E.g: hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash
Тепер ви можете використовувати команду su
з hacker:hacker
Альтернативно, ви можете використовувати наступні рядки, щоб додати фейкового користувача без пароля. ПОПЕРЕДЖЕННЯ: ви можете знизити поточний рівень безпеки машини.
NOTE: У платформах BSD /etc/passwd
знаходиться за адресою /etc/pwd.db
та /etc/master.passwd
, також /etc/shadow
перейменовано на /etc/spwd.db
.
Вам слід перевірити, чи можете ви записувати в деякі чутливі файли. Наприклад, чи можете ви записувати в якийсь файл конфігурації служби?
Наприклад, якщо машина працює на сервері tomcat і ви можете змінити файл конфігурації служби Tomcat всередині /etc/systemd/, тоді ви можете змінити рядки:
Ваш бекдор буде виконано наступного разу, коли буде запущено tomcat.
Наступні папки можуть містити резервні копії або цікаву інформацію: /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root (Можливо, ви не зможете прочитати останню, але спробуйте)
Прочитайте код linPEAS, він шукає декілька можливих файлів, які можуть містити паролі. Ще один цікавий інструмент, який ви можете використовувати для цього: LaZagne, який є відкритим програмним забезпеченням, що використовується для отримання багатьох паролів, збережених на локальному комп'ютері для Windows, Linux та Mac.
Якщо ви можете читати логи, ви можете знайти цікаву/конфіденційну інформацію всередині них. Чим дивніший лог, тим цікавішим він буде (ймовірно). Також деякі "погано" налаштовані (задніми дверима?) аудиторські логи можуть дозволити вам записувати паролі всередині аудиторських логів, як пояснено в цьому пості: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/.
Щоб читати журнали, група adm буде дійсно корисною.
Вам також слід перевірити файли, що містять слово "password" у назві або всередині вмісту, а також перевірити IP-адреси та електронні адреси в логах або регулярні вирази для хешів. Я не буду перераховувати тут, як це все зробити, але якщо вас це цікавить, ви можете перевірити останні перевірки, які виконує linpeas.
Якщо ви знаєте, з якого місця буде виконуватись python-скрипт і ви можете записувати в цю папку або ви можете модифікувати python-бібліотеки, ви можете змінити бібліотеку OS і створити бекдор (якщо ви можете записувати, де буде виконуватись python-скрипт, скопіюйте та вставте бібліотеку os.py).
Щоб створити бекдор для бібліотеки, просто додайте в кінець бібліотеки os.py наступний рядок (змініть IP та PORT):
Уразливість у logrotate
дозволяє користувачам з права на запис у файл журналу або його батьківські директорії потенційно отримати підвищені привілеї. Це пов'язано з тим, що logrotate
, який часто працює як root, може бути маніпульований для виконання довільних файлів, особливо в таких директоріях, як /etc/bash_completion.d/. Важливо перевіряти права доступу не лише в /var/log, але й у будь-якій директорії, де застосовується ротація журналів.
Ця уразливість впливає на версію logrotate
3.18.0
та старіші
Більш детальну інформацію про уразливість можна знайти на цій сторінці: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.
Ви можете експлуатувати цю уразливість за допомогою logrotten.
Ця уразливість дуже схожа на CVE-2016-1247 (журнали nginx), тому щоразу, коли ви виявляєте, що можете змінювати журнали, перевірте, хто керує цими журналами, і перевірте, чи можете ви підвищити привілеї, замінивши журнали на символічні посилання.
Посилання на уразливість: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
Якщо з якоїсь причини користувач може записати скрипт ifcf-<whatever>
у /etc/sysconfig/network-scripts або він може відкоригувати існуючий, то ваша система зламано.
Мережеві скрипти, наприклад, ifcg-eth0 використовуються для мережевих з'єднань. Вони виглядають точно як .INI файли. Однак вони ~підключаються~ на Linux через Network Manager (dispatcher.d).
У моєму випадку атрибут NAME=
в цих мережевих скриптах не обробляється належним чином. Якщо у вас є пробіли в імені, система намагається виконати частину після пробілу. Це означає, що все після першого пробілу виконується як root.
Наприклад: /etc/sysconfig/network-scripts/ifcfg-1337
Директорія /etc/init.d
є домом для скриптів для System V init (SysVinit), класичної системи управління сервісами Linux. Вона містить скрипти для start
, stop
, restart
, а іноді й reload
сервісів. Ці скрипти можуть виконуватись безпосередньо або через символічні посилання, знайдені в /etc/rc?.d/
. Альтернативний шлях у системах Redhat - це /etc/rc.d/init.d
.
З іншого боку, /etc/init
пов'язаний з Upstart, новішою системою управління сервісами, введеною Ubuntu, яка використовує конфігураційні файли для завдань управління сервісами. Незважаючи на перехід на Upstart, скрипти SysVinit все ще використовуються разом з конфігураціями Upstart через шар сумісності в Upstart.
systemd виступає як сучасний менеджер ініціалізації та сервісів, пропонуючи розширені функції, такі як запуск демонів за запитом, управління автоматичним монтуванням та знімки стану системи. Він організовує файли в /usr/lib/systemd/
для дистрибутивних пакетів та /etc/systemd/system/
для модифікацій адміністратора, спрощуючи процес адміністрування системи.
LinEnum: https://github.com/rebootuser/LinEnum(-t option) Enumy: https://github.com/luke-goddard/enumy Unix Privesc Check: http://pentestmonkey.net/tools/audit/unix-privesc-check Linux Priv Checker: www.securitysift.com/download/linuxprivchecker.py BeeRoot: https://github.com/AlessandroZ/BeRoot/tree/master/Linux Kernelpop: Перерахувати вразливості ядра в linux та MAC https://github.com/spencerdodd/kernelpop Mestaploit: multi/recon/local_exploit_suggester Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester EvilAbigail (фізичний доступ): https://github.com/GDSSecurity/EvilAbigail Збірка більше скриптів: https://github.com/1N3/PrivEsc
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)