Отримання джигмі з Busybox і LD_PRELOAD

Який найважливіший компонент операційної системи? Ну, можливо, це ядро. І якщо щось зійдеться з ядром та пов'язаними з ним файлами, ви не зможете у вашому вікні, вірно? Наприклад, initrd Проблему, про яку ми говорили кілька років тому.

Але як щодо glibc? Що трапиться, якщо ви видалите деякі важливі бібліотеки C, які використовують завантажувальну систему? Як би ви відновилися після такого фіаско? У цьому навчальному посібнику я збираюся займатися деякою напівм'якою хакерами і навчатиме вас різного роду чудовими методами самозабезпечення для фіксації турбонадзорних систем із використанням busybox та деяких інших вигадливих прийомів. Якщо вам все ще цікаво, це буде посібник для Linux. Після мене.

сценарій

Гаразд. Давайте поговоримо про нашу систему і про те, як ми можемо легко її знищити. До речі, трохи тла про те, як Linux працює під капотом. Я вже докладно пояснив це в моєму четвертий хакерський підручник, але ось короткий огляд. І, будь ласка, вибачте з лінгво, я не збираюся тут 100% точно.

Програми Linux зазвичай входять до складу двох асортиментів - виконуваних і спільних бібліотек, які зазвичай динамічно пов'язані. Програми складаються у форматі Executable and Linkable Format (ELF), який визначає як програмний код потрібно завантажувати в пам'ять і виконувати.

Завантаження даних в пам'ять падає на плечі двох інших програм, стандартної бібліотеки C (glibc) та динамічного компонувальника (ld), яка викликає спільні бібліотеки, з якими зібрані програми. Вся інформація про структуру файлу, включаючи сегменти, розділи, символи тощо, зберігається в ELF, і її можна проаналізувати за допомогою команди readelf.

Читайте, заголовок

Читайте, заголовки розділів

Якщо ви хочете видалити glibc або ld, більшість програм перестануть функціонувати, оскільки вони не зможуть завантажуватись у пам'ять і працювати правильно. Тож що станеться, якщо ви видалите, скажіть файл /usr/lib64/glibc.so.6, який, як видається, є такою критично важливою бібліотекою?

/ bin / ld -v
GNU ld версія 2.25-17.fc23

/usr/lib64/libc.so.6
Бібліотека GNU C (GNU libc) стабільна версія версії 2.22, автор: Роланд МакГрат та інші.
Авторське право (C) 2015 Free Software Foundation, Inc.
Це вільне програмне забезпечення; див джерело для умов копіювання.
Гарантія відсутня; навіть не для ТОВАРНОГО ПРИДАТНОСТІ або ПРИДАТНОСТІ ДЛЯ КОНКРЕТНОЇ МЕТИ.
Складено GNU CC версією 5.3.1 20151207 (Red Hat 5.3.1-2).
Доступні розширення:
Додаткова версія C-Nubs версії 2.1.2.
схема додаткової версії 2.1 від Майкла Глада та інших
GNU Libidn Саймон Джозефссон
Нативна бібліотека посилань POSIX, написана Ульріхом Дрепфером та ін
BIND-8.2.3-T5B
RT за допомогою ядра linux AIO
libc ABIs: UNIQUE IFUNC
Для інструкцій з повідомлення про помилки, будь ласка, перегляньте:
<http://www.gnu.org/software/libc/bugs.html>.

Так чи інакше, це станеться - я навмисно НЕ пишу команду, яка переміщує бібліотеку libc далеко від свого природного місця, щоб ви випадково не скопіювали її та не руйнували вашу коробку. Але як тільки ви це зробите, будь-яка наступна команда, яку ви намагаєтеся запустити, ще не завантажена в пам'ять, не зможе:

ls
ls: помилка під час завантаження загальних бібліотек: libc.so.6: неможливо відкрити об'єднаний файл загального характеру: немає такого файлу чи каталогу

Не можу відкрити

І якщо ми намагаємося виправити, повернувши glibc назад на своє місце, знову ж таки немає радості:

Не можу виправити

Спіймати 22. Нам потрібна libc.so.6, щоб завантажити інші бібліотеки, але це не так. Отже, нічого не буде працювати. На цьому етапі більшість людей будуть панікувати, перезавантажувати, а потім ще більше панікувати. Знову ж таки, немає biggie, завантажившись в живий сеанс, скопіюйте файли в потрібне місце, а Bob - ваш дядько. Але ми обговоримо це окремо. Давайте зосередимося на наших спеціальних інструментах торгівлі - Busybox і LD_PRELOAD зламати. Але, по-перше, відмова від відповідальності.

Застереження

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

Busybox

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

Якщо це не встановлено, отримайте його. Наприклад, на Fedora 23, це не там, тому вам потрібно буде встановити цілу 1.2MB своєї власної власності. Давайте розглянемо підпис програми. Найголовніше, це не динамічно пов'язаний виконуваний файл.

ldd / usr / sbin / busybox
не динамічний виконуваний файл

файл / usr / sbin / busybox
/ usr / sbin / busybox: виконуваний файл ELF 64-біт LSB, x86-64, версія 1 (SYSV), статично зв'язана, знята

Програма повністю самозалежна. Вона не має ніяких фантазійних символів, групових розділів, динамічного розділу, переміщення або підтримуваних розділів розкручування. Якщо ви не розробник, деякі з цих матеріалів можуть виглядати безтурботно, але те, що він говорить нам, полягає в тому, що busybox може жити самостійно, незалежно від glibc та ld.

Групові секції

Динамічний розділ

Переселення

Розкрутити секції

...

Відокремлення розділу до сегмента:
Розділи сегментів ...
00 .note.gnu.build-id .init .text .fini.rodata .eh_frame
01. Дані .bss
02 .note.gnu.build-id
03

У цьому файлі немає динамічного розділу.

У цьому файлі немає переміщень.

Розшифровка розгорткових секцій для типу машини Advanced Micro Devices X86-64 наразі не підтримується.

Немає інформації про версію в цьому файлі.

Відображення нотаток виявлено при зміщенні файлу 0x00000120
з довжиною 0x00000024:
Власник розміру даних Опис
GNU 0x00000014 NT_GNU_BUILD_ID
Build ID: 7a9ff994b55730b373cabf88c8ca219d7b40f652

Програма поставляється з великою кількістю вбудованих пристроїв. В принципі, практично будь-яка команда, яку ви можете думати, Busybox має. Наприклад, якщо ви хочете переглянути список завантажених модулів ядра, ви запустите busybox lsmod. Він також поставляється з важливими функціями, такими як su, mv, cp, ifconfig та інші. По суті, ви повинні вміти робити все.

Команди

І тоді виправлення стає просто (як визначено в нашому прикладі):

busybox mv /lib64/libc.so.6.bak/lib64/libc.so.6

Права на коріння

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

Самовільні права

busybox chown roger / usr / sbin / busybox
chown: / usr / sbin / busybox: операція не допускається

/ usr / sbin / busybox rm /usr/lib64/libc.so.6.bak
rm: видалити '/usr/lib64/libc.so.6.bak'? у
rm: неможливо видалити '/usr/lib64/libc.so.6.bak': дозвіл відхилено

busybox su
su: повинно бути suid для правильної роботи

Хитрість полягає в тому, щоб setuid на бінарному файлі busybox - через root, до фіаско. Оскільки він належить кореневим, то теоретично, так, будь-хто, що працює з оболонкою, повинен мати можливість виконувати такі дії як root. Проте сучасні механізми захисту, такі як SELinux та AppArmor, будуть перешкоджати вашим зусиллям, і тоді все-таки це не те, що, з очевидних причин, повинно бути надто легко досяжним. Ви дійсно не хочете мати оболонку, яка дозволяє користувачам керувати доступом. Подумай над цим. І будьте обережні.

sudo chmod + s / usr / sbin / busybox

Не срібна куля

Тоді, навіть якщо у вас є корінь, ви, можливо, не зможете робити все, особливо якщо ви знищили таку ніжну і ніжну квітку, як glibc. Я визнаю, що це не типове середовище для busybox, але якщо ви намагаєтесь запустити root у автобусі в системі, яка не має свого glibc у потрібному місці, вам не вдасться. Правильно так.

Не можу su

Завантажувальні ігри

Ви можете спробувати бути надто розумним і входити в busybox на ранніх стадіях завантаження системи. Так само, як ви оголошували init = / bin / bash за типовою та функціональною системою Linux для скидання пароля root, ви можете перейти до цього тут. Крім glibc, ви, ймовірно, отримаєте приємне, соковите ядро паніка. Тоді те ж саме відбувається, якщо ви намагаєтеся запустити busybox як ініціал.

Що робити, якщо у вас немає busybox?

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

LD_PRELOAD

У нашому прикладі ми знищили лише один файл, але ld.so також повинен бути функціональним. Це означає, що він може завантажувати об'єкти, але проблема полягає в тому, що glibc завантажує перше. На щастя, ви можете використовувати змінну оточення LD_PRELOAD, щоб повідомити вашій запущеній оболонці завантажувати певні об'єкти спочатку перед іншими, і, таким чином, ми сподіваємося подолати проблему glibc.

Говорячи про glibc, на диску є декілька екземплярів спільної бібліотеки glibc та декілька символьних посилань, що означає, що навіть якщо ви перенесли об'єкт glibc.so.6 з свого законного місця, ми все ще маємо спроможність спробувати відновити нашу систему. Нам, по суті, потрібно мати можливість переміщати або копіювати файл. Дійсно, в більшості систем Linux, з незначними відмінностями в угоді про місцезнаходження та іменування, повинна бути інша копія стандартної бібліотеки з повним ім'ям. Наприклад, використовуючи Fedora, ви матимете libc.so.6 та libc-2.22.so. Іноді обидві ці фактично можуть бути пов'язані символічно. Якщо вам пощастить, то копія чи переміщення виправляється:

LD_PRELOAD = / usr / lib64 / libc-2.22.so cp /usr/lib64/libc.so.6.bak /usr/lib64/libc.so.6

І ви повинні повернутися до функціональної системи.

Здорова практика

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

Ніколи не виконуйте фентези та вилучення файлів xargs під час роботи в системних каталогах. Завжди відтворюйте спорядження спочатку, завжди введіть команди з ключем hash (#) як перший символ, тому, якщо ви випадково натиснете клавішу Enter, нічого поганого не трапиться. Спробуйте тестування з невинними та неважливими файлами.

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

Резервне копіювання та системні зображення, geddit?

Більше читання

Ви прагнете більше фантастичних знань? Нижче прочитайте нижче:

Дуже корисний Linux Команди & конфігурації

Керівництво зломів Linux один два і три - немає. чотири пов'язані раніше

Система супер налагодження підручник

як використовувати пер

І книга звичайно!

Висновок

І ось ми, в кінці цієї довгої та незграбної статті. Але, сподіваюсь, ви багато чого навчилися, і я насправді маю на увазі багато нових речей: як працює Linux, тонкощі ELF, що не пов'язано з вашими системними файлами, і як уникнути сльози та болю, а потім вбивство методів відновлення, включаючи резервне копіювання, системні зображення, живі CD-ігри, а більш докладно - наша робота з busybox і LD_PRELOAD.

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


джерело

Залишити коментар

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.