Під час розробки експлоїта вам напевно необхідно генерувати shell код використовується в вашому експлоїт. У Metasploitpayloads може бути згенерована зсередини msfconsole. Коли ви використовуєте певний payload. Metasploit додає команди 'generate', 'pry' і 'reload'. Generate стане основним центром даної статті, вивчення використання Metasploit.
Давайте почнемо з розгляду різних опцій команди 'ganerate', запустимо його з '-h'.
Для генерації shell коду без будь-яких опцій, просто виконайте команду 'generate'.
Звичайно, ймовірність генерації shell коду без будь-яких недоліків є досить низькою. Досить часто погані символи і специфічні типи кодеров, будуть використовуватися в залежності від цільової машини.
Приклад коду вище містить практично універсальний поганий символ, нульовий байт (\ x00). Надані деякі експлоїти дозволяють його використовувати, але не багато. Давайте сгенерируем, той же shell код, тільки на цей раз ми будемо давати Metasploit інструкції для видалення цього небажаного байта.
Щоб цього досягти, ми задаємо команду 'ganerate' за якою слідує '-b' з супроводжуючими байтами яким ми хочемо відмовити в процесі генерації.
Дивлячись на цей shell код, можна легко побачити що в порівнянні з раніше генеруються shell. нульові байти були успішно видалені. Це дає нам нульовий байт вільним payload. Так само ми бачимо інші істотні відмінності пов'язані з насильницьким зміною генерації.
Одним з відмінностей є загальний байт розмір shell кодів. У попередній інтеграції розмір був 328байт. в новому shell коді він на 27 байт більше.
Під час генерації, початкові нульові байти, або корисні в коді, необхідно замінити, або кодувати, для того щоб підстрахуватися, тільки в пам'яті пов'язаної функціональної оболонки shell.
Ще одним важливим зміною є додавання використовуваного кодера. За замовчуванням Metasploit вибере кращий кодер, для виконання завдання під рукою. Кодер відповідає за видалення небажаних символів (серед іншого), введених при використанні '-b'. Кодери ми розглянемо більш докладно пізніше.
При вказівці небажаних символів, framework буде використовувати кращий кодер для роботи. Був використаний кодер x86 / shikata_ga_nai. коли був обмежений нульовий байт, під час генерації коду. Якщо ми додамо ще кілька небажаних символів, може бути використаний інший символ для виконання тієї ж самої задачі. Давайте додамо ще кілька байт в список і подивимося, що відбувається.
Ми бачимо що кодер відрізняється від того що раніше успішно видалив наші небажані байти. Shikata_ga_nai. ймовірно виявився не в змозі кодувати payload за допомогою нашого списку обмеження байт. Fnstenv_mov проте вдалося досягти цього.
Payload генерація не вдалася
Маючи можливість генерувати shell код без використання певних символів, є однією з величезних можливостей пропонованих цим framewark. Це зовсім не означає що вони безмежні.
Занадто багато байт обмежених кодером не зможуть виконається. В такий момент Metasploit буде відображати наступне повідомлення.
Це подібно до того як видалити багато букв з алфавіту і попросити когось написати повне пропозицію. Іноді він просто не зможе цього зробити.
Використання кодера під час генерації payloads
Як згадувалося раніше, framework вибере кращий доступний кодер при генерації payload. Однак бувають випадки коли необхідно використовувати певний тип кодера незалежно від того що думає Metasploit. Уявіть собі, що експлоїт виконається успішно тільки за умови що він не містить буквено цифрових символів. Кодер 'shikata_ga_nai' в даному випадку виявиться марний, так як він використовує досить багато символів для кодування. Подивившись список кодеров ми бачимо що кодер 'x86 / nonalpha' присутній.
Давайте заново прив'яжемо sheel payload але в цей раз скажемо framework використовувати кодер 'nonalpha'. Ми робимо це за допомогою перемикання за допомогою '-e' і подальшим ім'ям кодера, як показано в списку нижче.
Якщо все пішло за планом, то payload нічого очікувати утримувати які б то не було буквено-цифрові символи. Але ми повинні бути обережні при використанні іншого кодера ніж за замовчуванням. Як правило це дасть нам більший payload. Наприклад той що видав цей кодер набагато більше ніж в попередніх прикладах.
Наша наступна опція в списку це перемикач '-f'. Вона дає нам можливість зберегти висновок згенерованого payload в фаил замість відображення його на екрані. Як завжди він слід за командою 'generate' з шляхом файлу.
Використовуючи команду 'cat' ми можемо побачити payload який зберегли в нашому файлі. Як ми бачимо ми так само можемо використовувати більш ніж одну опцію при генерації shell коду.
Генерація payload з декількома потоками
Наступний перемикач в нашому списку опцій це перемикач ітерації '-i'. У двох словах він каже framework. скільки проходів кодування він повинен зробити перш ніж виробляти остаточну payload. Однією з причин для цього може бути стелс або анти-вірус ухилення. Більш докладно антивірусне ухилення я буду розглядати в іншому розділі MSFU.
Отже давайте порівняємо наш shell payload згенерований з використанням 1 ітерації в порівнянні з таким же shell кодом з 2 ітерації.
Порівнюючи два виходи, ми бачимо очевидний ефект другої ітерації нашого payload. Перш за все більше розмір байт, ніж перший. Чим більше ітерацій робить payload. тим більше він буде. По-друге порівняємо висновки байт і побачимо що вони також відрізняються. Це пов'язано з другої итерацией або другим проходом кодування. Він кодує наш payload один раз, потім бере payload і кодує знову. Давайте візьмемо shell код і подивимося яка різниця вийде при п'яти ітераціях.
Зміни є суттєвими при порівнянні з усіма попередніми висновками. Він дещо більше і відсутні схожі байти поруч. Який робить в теорії цей варіант нашого payload найменш схильним до виявлення.
Ми витратили багато часу, генеруючи shell код з самого початку від значення за замовчуванням. У разі прив'язки shell за замовчуванням прослуховує порт 4444. Часто це необхідно змінити. Ми можемо це зробити за допомогою перемикача '-o' перед значенням яке ми хочемо змінити. Давайте подивимося які опції ми можемо змінити для цього payload. З msfconsole ми задаємо команду 'show options'.
За замовчуванням наш shell прослуховує порт '4444' і вихід функції 'process'. Ми змінимо цей порт на '1234' і вихід функції 'seh' використовуючи '-o'. Синтаксис змінна = значення розділені комою між кожною опцією. В цьому випадку обидва порту прослуховуються і вихід функції змінюється наступним синтаксисом 'LPORT = 1234, EXITFUNC = seh'.
Payload генерується використовуючи NOP Sled
Нарешті давайте поглянемо NOP sled довжину і висновок формату опцій. Коли генеруємо payloads за замовчуванням формат виведення дається в 'ruby'. Хоча ruby мова є надзвичайно потужним і популярним, це не всі коди. У нас є можливість повідомити framework. для того щоб дати наш payload в різних форматах кодування таких як Perl. C і Java. для прикладу. Додати NOP sled можна так само на початку при генерації shell коду.
Спочатку давайте подивимося на кілька різних вихідних форматів і подивимося як використовується перемикач '-t'. Як і всі інші опції, все що необхідно зробити це ввести перемикач з подальшим ім'ям формату, як це показано в меню довідки.
Додавання NOP sled (немає операції або наступної операції) здійснюється з перемикачем '-s', перед числом NOPs. Це додасть sled на початку вашого payload. Майте на увазі що чим більше sled тим більше буде shell код. Тому додавання 14 NOPs додасть 14 байт до загального розміру.
Жовтим кольором виділено наш NOP sled на початку payload. Порівнюючи такі рядки в shell коді вище ми бачимо що вони точно такі ж. Всього як і очікувалося стало на 14 байт більше.