книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
|||
|
D |
|
|
|
|
|
|
|
|
i |
r |
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
|||||
P |
|
|
|
|
|
NOW! |
o |
P |
|
|
|
|
|
NOW! |
o |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
Разработка эксплойтов с помощью каркаса Metasploit 615 |
|
to |
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
-x cha |
|
|
|
||||||
|
|
|
|
-xchòàêa |
|
как вероятность, что некоторая функция модифицирует один и тот же |
|
|
e |
|
||||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
символ в разных местах, мала.
Процесс можно ускорить, если принять некоторые допущения об атакуемом приложении. В нашем случае URL – это длинная строка, завершаемая нулем. Так как URL может содержать буквы и цифры, то эти символы заведомо допустимы. По опыту мы знаем, что символы, из которых состоит адрес возврата, тоже не были отфильтрованы, то есть байты 0x77, 0xF7, 0x63 и 0x85 разрешены, как и байт 0xCC. Если нам удастся составить полезную нагрузку так, что она будет содержать только буквы, цифры и символы с кодами 0x77, 0xF7, 0x63, 0x85 и 0xCC, то, скорее всего, фильтры не станут ей помехой.
На рис. 12.26 приведен пример тестовой строки для выявления недопустимых символов.
Рис. 12.26. Строка для тестирования на недопустимые символы
Определение ограничений на размер
Выявив недопустимые символы, мы теперь должны понять, сколько в нашем распоряжении места. Чем больше места, тем больше кода, а чем больше кода, тем шире выбор полезных нагрузок.
Простейший способ определить объем памяти, доступной для атаки, – послать столько данных, сколько возможно, пока строка не будет обрезана. В примере 12.5 мы уже знаем, что до адреса возврата нам доступно 589 байтов, но не знаем, сколько места есть после этого адреса. Чтобы выяснить это, модифицируем эксплойт, послав чуть больше данных.
Пример 12.5. Определение объема доступной памяти
1$string = "GET /";
2$string .= "\xcc" x 589;
3$string .= "\x85\x63\xf7\x77";
4$string .= "\xcc" x 1000;
5 $string .= ".htr HTTP/1.0\r\n\r\n";
6
7open(NC, "|nc.exe 192.168.181.129 80");
8print NC $string;
9close(NC);
Âстроке 4 мы послали после адреса возврата не 500 байт, как раньше,
à1000. Когда процессор выполнит команду 0xCC, непосредственно следую-
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
616 Глава 12. Написание эксплойтов III |
|
|
|
|
to |
|
|
|
|
|
|
||||
w Click |
|
|
|
|
w Click |
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
m |
|||||||||||
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|||||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
-xcha |
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
щую за адресом возврата, процесс остановится, и мы сможем определить,-x cha |
|
e |
|
||||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
сколько места доступно для полезной нагрузки.
Чрезмерно увеличивая размер строки атаки, мы рискуем послать слишком много данных. Это вызовет программное исключение, которое перехватит обработчик, в результате чего мы не перейдем по нашему адресу возврата. Тогда определить размер доступной памяти окажется труднее.
Просмотр содержимого памяти перед адресом возврата подтверждает, что 589 байтов действительно заполнены байтом 0xCC. Как видно из рис. 12.27, память, следующая за адресом возврата, начинается с 0x00F0FCCC и продолжается до 0x00F0FFFF. Похоже, что на адресе 0x00F0FFFF полезная нагрузка обрывается и любые попытки обратиться к памяти по адресам старше этого наталкиваются на сообщение отладчика о том, что память по такому адресу отсутствует.
Рис. 12.27. Конец строки атаки
На адресе 0x00F0FFFF память заканчивается, так как мы дошли до конца страницы, а адреса, начиная с 0x00F10000, программе не выделены. Но все же память от 0x00F0FCCC до 0x00F0FFFF была заполнена байтом 0xCC, и, значит, в дополнение к 589 байтам до адреса возврата, мы еще имеем 820 байтов после него. При необходимости можно воспользоваться командой JMP, чтобы предоставить в распоряжение полезной нагрузки оба этих участка, что в совокупности дает 1409 байтов. Этого хватит для размещения почти любой полезной нагрузки. Окончательная схема распределения памяти показана на рис. 12.28.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
i |
|
|
|
F |
|
|
|
|
|
|
|
i |
|
||
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
t |
|
||||
P |
D |
|
|
|
|
|
|
|
|
o |
|
P |
D |
|
|
|
|
|
|
|
|
o |
||
|
|
|
|
NOW! |
r |
|
|
|
|
|
NOW! |
r |
||||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
618 Глава 12. Написание эксплойтов III |
|
|
|
|
to |
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
m |
|
w |
|
|
|
|
|
|
|
|
|
m |
||
w Click |
|
|
|
|
|
|
o |
|
w Click |
|
|
|
|
|
|
o |
||||||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
||
|
. |
|
|
|
|
|
|
.c |
|
|
|
. |
|
|
|
|
|
|
.c |
|
||||
|
|
p |
df |
|
|
|
|
e |
|
|
|
|
p |
df |
|
|
|
|
e |
|
||||
|
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
g |
|
|
|
||||||
|
|
|
|
|
n |
|
|
|
|
|
|
|
|
|
|
n |
|
|
|
|
||||
|
|
|
|
-xcha |
|
|
|
|
|
С точки зрения успешности атаки, в качестве NOP-команды можно выб--x cha |
|
|
|
|
|
рать любую команду, которая не изменяет те аспекты состояния процессора, которые важны для работы эксплойта, и позволяет в конце концов достичь адреса, на который указывает EIP. Например, если эксплойту важно лишь зна- чение регистра EAX, то допустима любая команда, не модифицирующая его: можно инкрементировать EBX, изменять ESP, обнулять ECX и так далее. Зная это, мы можем не ограничиваться только последовательностью байтов 0x90 и тем самым снизить вероятность того, что эксплойт будет опознан, ведь многие IDS ищут такие цепочки в проходящем трафике.
На выяснение того, какие коды операции совместимы с нашей полезной нагрузкой и каких символов в ней нужно избегать, может уйти очень много времени. Но, к счастью, исходя из параметров эксплойта, шесть имеющихся в Metasploit генераторов NOP-команд могут создать миллионы дорожек, делая обнаружение эксплойта по их сигнатурам практически невозможным. Хотя такие генераторы можно использовать только для эксплойтов, уже встроенных в каркас, все же для полноты изложения мы их рассмотрим.
Имеется по одному генератору дорожек для платформ Alpha, MIPS, PPC и SPARC. Что касается архитектуры x86, то на выбор предоставляются два генератора: Pex и OptyNop2. Генератор Pex создает последовательности однобайтовых команд, тогда как OptyNop2 включает команды длиной от одного до шести байтов. Вспомните об одном из важнейших требований к дорожке из NOP-команд: на какой бы байт внутри нее ни указывал EIP, дорожка должна к нему вести, причем исполнение должно продолжаться, пока не будет достигнуто начало полезной нагрузки. В случае однобайтовых команд никакой проблемы не возникает, так как по такой дорожке заведомо можно дойти до любого байта. Если же допускаются многобайтовые команды, то надо учитывать возможность «приземления» EIP в середине такой команды, тогда до начала полезной нагрузки мы никогда не дойдем. Генератор OptyNop2 строит последовательность команд так, что даже если EIP будет указывать внутрь команды, процессор все равно доберется до нужного байта. Без сомнения OptyNop2 на сегодняшний день является одним из самых передовых генераторов NOP-команд.
Дорожки из NOP-команд часто используются в сочетании с техникой прямой передачи управления по адресу в стеке в связи со сложностью точного предсказания адреса возврата. Если же применяется метод «отталкивания» от разделяемой библиотеки, то таким способом надежность эксплойта не повысить. Впрочем, и в этом случае описанный прием не бесполезен, так как уменьшает шансы распознавания полезной нагрузки системой обнаружения вторжений. В рассматриваемом примере мы разместим полезную нагрузку после адреса возврата и, хотя это необязательно, замостим предшествующие ему 589 байтов случайными NOP-командами (см. рис. 12.30).