Підвищуємо користувальницькі привілеї в Linux

Ми вже розглядали, як можна підняти свої привілеї до системних Windows Windows. Як виявилося, варіантів для цього більш ніж достатньо. Що вибрати залежить як від ситуації, так і від твоїх переваг. Однак, як ти розумієш, розширювати свої повноваження доводиться не лише для віконців, а й для пінгвінів. Які тут є здібності? Ну що ж, давай подивимося…

  1. Визначити версію ядра та дистрибутива.
  2. Отримати список доступних інструментів для складання сплоїту.
  3. Доставити сплоїти на цільову машину.
  4. Скомпілювати (при необхідності) та запустити.
  5. Насолоджуватися отриманим root'ом.

Ну а тепер про кожен крок детальніше.

Ідентифікація

Судячи із плану, спочатку треба дізнатися, куди ми взагалі потрапили, що за дистр використовуємо і яка версія ядра. Версію ядра можна витягнути за допомогою всієї відомої команди uname -a або її аналогів. Для того ж, щоб отримати інформацію про дистрибутив, що використовується, треба глянути у файлик *-release , що лежить в каталозі etc (залежно від дистра він може називатися по-різному: lsb-release в Ubuntu, redhat-release в Red Hat / CentOS і так далі): cat /etc/*-release

Знаючи дистрибутив і версію ядра, можна зайнятися другим етапом — пошуком відповідної «відмички».

Пошук експлойту

Як тільки вся необхідна інформація опиниться на руках, настане час шукати відповідний експлойт. Перше, що спадає на думку, - це exploit-db.com, але є й альтернативи: 1337day, SecuriTeam, ExploitSearch, Metasploit, securityreason, seclists. Зрештою, є гугл, він точно знає про сплоїти найбільше. Забігаючи трохи вперед, скажу: іноді з якоїсь причини «відмичка» може не працювати або її треба трохи адаптувати під певні умови або своїпотреби, тобто пройтися нею напилком. У такому разі не завадить вивудити про неї додаткову інформацію, яку можна почерпнути на одному з таких ресурсів: www.cvedetails.com packetstormsecurity.org cve.mitre.org

Отже, припустимо, ти знайшов відповідний експлойт, який дарує тобі перепустку у світ рута. Залишилось лише якось переправити його на машину.

Доставка додому

Для того щоб доставити сплоїти на місце, існує досить багато способів, від всіх відомих cURL/wget, Netcat, FTP, SCP/SFTP, SMB до використання DNS TXT записів. Щоб з'ясувати, які з цих інструментів у нас представлені, виконуємо:

Допустимо, у нас знайшовся Netcat. Для передачі файлу з його допомогою на стороні, що приймає, запускаємо: nc -l -p 1234 > out.file

Тобто слухаємо порт 1234. На відправляючій виконуємо наступне: nc -w 3 [destination] 1234

Якщо передача відбувається з *nix-на *nix-систему, тобто там і там є стандартні утиліти, то для прискорення процесу передачі можна скористатися стисненням. У такому разі команди виглядатимуть так:

Інші варіанти ще простіше, тому не будемо розглядати використання wget, FTP та інших загальновідомих методів.

Добре, як доставити, розібралися. Але як при цьому не спалитись? Якщо твій сплоїт виявлять, будь впевнений, що лазівку швидко прикриють. Тож розміщувати його, компілювати та запускати треба з якогось непомітного місця. У лінуксі директорії, що починаються з точки (наприклад, .secret_folder), є прихованими. Тому логічно було б використовувати їх для приховування своєї активності. Наприклад, помістити код експлойта: /tmp/.nothingthere/exploit.c . Щоправда, у такому разі треба спочатку переконатися, що tmp змонтована без опції noexec і з неї можнабуде запустити зібраний сплоїт (для цього скористайся командою mount ).

Складання та запуск сплоїта

Як тільки ми доставили та розмістили сплоїт, його треба буде зібрати/налаштувати. Як правило, сплоїти пишуться на С або однією зі скриптових мов Python/Perl/PHP. Постійні читачі знають, що залишати на своєму сервері компілятор — не найкраще рішення, тому зазвичай його випилюють. Якщо на твоє запитання про версію компілятора gcc -v bash свариться gcc: command not found , значить, тобі пощастило і доведеться йти в обхід. Тобто або шукати сплоїть на пітоні, перлі або ще, або компілити його на віртуальній машині з аналогічною ОС і версією ядра. Після цього перемістити отриманий виконуваний файл на цільовий хост (щоправда, стовідсоткової роботи цей метод не гарантує, сплоїть може впасти і обрушити систему, так що акуратніше тут). Однак, як показує практика, інтерпретатор для однієї зі згаданих мов все-таки має бути присутнім у системі. Тож не слід відразу опускати руки, натомість перевіряємо всі варіанти:

У разі успіху тобі залишиться лише запустити скомпільований експлойт та насолоджуватися підвищенням. Або ж розбиратися, чому він не спрацював, тут як пощастить.

Протидія сплоїтам

Якісь новаторські рецепти тут вигадати складно. Все й так давно відомо. Треба просто вчасно встановлювати латки. Це перше. Друге — обмежити місця, звідки можна запускати на виконання файли (папку tmp точно слід позбавити цієї можливості). Ну і застосувати якесь захисне рішення, наприклад grsecurity.

Права, файли, шляхи та конфіги

Таких може виявитися досить велика кількість, і серед них можна знайти щось цікаве: конфігураційні файли, вихідники сайтів/додатків,скрипти, що запускаються init'ом або cron'ом. В принципі, ситуація, коли файл доступний всім на читання та запис, – це нормальне явище. Проблеми виникають, коли користувачі/адміністратори/скрипти починають бездумно змінювати дозволи. Тому, коли ти змінюєш дозволи, намагайся уникати використання chmod 777 . Ну і проводи періодичний аудит, щоб важливі файли не були доступні всім підряд.

Setuid + setgid

Як свідчить документація, setuid і setgid є прапорами прав доступу, які дозволяють запускати файли, що виконуються, з правами власника або групи виконуваного файлу (зазвичай root'а). Такі файли, запущені з підвищеними привілеями, можуть отримувати доступ до більш привілейованої інформації. Наприклад, у разі встановлення setuid на команду ls ти отримаєш можливість переглядати вміст директорій, доступ до яких тобі спочатку було заборонено. А у випадку vim - правити конфігураційні файли, в які раніше не мав права заглядати.

Відповідно, якщо у додатках із встановленим setuid/setgid-прапором, є такі вразливості, як buffer overflow або command injection, то атакуючий може виконати довільний код з підвищеними привілеями. Тому наступним варіантом зазвичай шукають виконувані файли з цими прапорами. sudo find / -xdev \(-perm 4000\) -type f -print0 -exec ls -s <> \;

В принципі, можна і без sudo, це необхідно лише для того, щоб перевірити директорії, до яких ти не маєш доступу.

Зазвичай існує три варіанти подальшого використання таких файлів, що виконуються. Перший - спробувати підняти привілеї, спираючись на функціонал, що надається цим додатком (вірніше, вигадати свій спосіб незвичайного використання цього функціоналу). Другий варіант – знайтипублічний сплоїть або провести самостійний фазинг з метою виявлення багів. Третій – command injection. Універсального рецепту немає, все залежить від ситуації.

А тепер уявимо ситуацію, що у нас є два користувача: Джо (атакуючий) та Боб. Джо знає, що Боб має sudo-привілеї на зміну паролів користувачів, у тому числі і рута. Крім того, Боб лінивий і додав. в змінну оточення PATH. Хитрий Джо пише програму, яка змінюватиме пароль рута, називає її ls і кладе в папку, куди любить заглядати Боб. Тепер, коли останній зайде до папки та захоче подивитися її вміст, виконається програма, яку написав Джо, і пароль рута буде змінено. Тому завжди перевіряємо змінні оточення на наявність цікавих речей, а для себе робимо такі висновки:

  1. Ніколи не використовуємо. у змінній PATH.
  2. Якщо точка там таки присутні, розміщуємо наступний рядок у .bashrc або .profile : PATH= echo $PATH sed -e's/::/:/g; s/. /:/g; s/:.$//; s/^://'

Інструменти

Для автоматизації пошуку слабких місць можна скористатися такими тулзами:

1. LinEnum - bash-скрипт, який зробить всю брудну роботу за тебе, виконуючи всі перевірки, описані в цьому cheat sheet'e. Загалом у його арсеналі близько 65 різних перевірок, починаючи від отримання інформації про версію ядра і до пошуку потенційно цікавих SUID/GUID-файлів. Крім того, скрипту можна передати ключове слово, яке він шукатиме у всіх конфігураційних та лог-файлах. Запускається перевірка в такий спосіб: ./LinEnum.sh -k keyword -r report -e /tmp/ -t . Після того, як сканування завершиться, тобі буде представлений докладний звіт, найцікавіші місця якого будуть підсвічені жовтим кольором. 2.LinuxPrivChecker - Python-скрипт, який також стане в нагоді в пошуку потенційних варіантів для підвищення привілеїв. Загалом, він виконує ті самі стандартні речі: перевірку привілеїв, отримання інформації про систему... Але основна його фішка в тому, що після завершення перевірки він запропонує тобі список експлойтів, які, на його думку, допоможуть підняти привілеї. Такий ось молодець:). 3. unix-privesc-check - даний скрипт дозволяє шукати варіанти для прокачування привілеїв не тільки в Linux, але і в Solaris, HPUX, FreeBSD. Він намагається виявити помилки конфігурації, які б непривілейованому користувачеві піднятися у системі. 4. g0tmi1k's Blog — це блог, в якому добре описані всі ті перевірки, що виконуються трьома названими інструментами. Тож наполегливо рекомендую заглянути туди і познайомитися, щоб уявляти, як ці інструменти працюють «зсередини».

користувальницькі

Основні опції LinEnum

можна

unix-privesc-check пропонує на вибір лише дві опції

підвищуємо

LinuxPrivChecker містить великий список експлойтів, що постійно поповнюється з Exploit Database

Як ти переконався, у світі Linux з підняттям привілеїв все теж досить буденно. Секрет успіху простий: щоб досягти своєї мети, треба бути терплячим і знати, де шукати і що шукати. Куди дивитися, ти тепер знаєш, які утиліти задіяти для автоматизації - теж, так що тепер тобі під силу підкорити не лише win-, а й nix-систему. Дерзай!