Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_

.pdf
Скачиваний:
14
Добавлен:
19.04.2024
Размер:
3.68 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Разработка эксплойтов с помощью каркаса Metasploit 611

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Рис. 12.23. Шаг 4: интерпретация результатов

в колонке «Address». В колонках «Module» и «OS Versions» содержится дополнительная информация, которая может быть полезна для организации атаки. Нашему эксплойту нужен только один адрес, чтобы перезаписать адрес возврата. Поскольку все равно, какой выбрать, возьмем команду CALL EAX из ntdll.dll, расположенную по адресу 0x77F76385.

Примечание

Программы постоянно изменяются и обновляются. Поэтому смеще ние адреса возврата для одной и той же уязвимости может оказаться разным в разных версиях. Взять, к примеру, тот же IIS 4. Мы знаем, что при установленном пакете обновлений смещение равно 589 бай там. Но при тестировании с Service Pack 3 и 4 обнаружилось, что ад ресу возврата должно предшествовать 593 байта. Это означает, что при разработке эксплойта нужно учитывать версию атакуемой про граммы и выбирать соответствующее ей смещение.

Выше мы уже говорили, что файлы разделяемых библиотек тоже мо гут зависеть от версии ОС и пакета обновлений. Но иногда удается найти такой адрес кода операции, который остается инвариантным для разных версий ОС. Редко, но бывает, что адрес одинаков для всех версий Windows и пакетов обновлений. Такой адрес называется универсальным адресом возврата. В качестве примера можно на звать эксплойт для атаки на переполнение буфера в программе Seattle Lab Mail 5.5 POP3, который включен в каркас Metasploit.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

612 Глава 12. Написание эксплойтов III

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Рис. 12.24. Использование утилиты msfpescan

Помимо базы данных с огромным набором кодов операций, Metasploit содержит две командных утилиты: msfpescan è msfelfscan, которые позволяют искать коды операций в файлах формата PE и ELF соответственно. PE – это формат исполняемых файлов в Windows, а ELF – в большинстве UNIX-сис- тем. При сканировании вручную важно пользоваться утилитой для той платформы, которую вы намереваетесь атаковать. На рис. 12.24 показаны результаты работы msfpescan, запущенной для поиска в ntdll.dll команд перехода, в которых используется регистр EAX.

Использование адреса возврата

Теперь можно исправить эксплойт так, чтобы он записал вместо сохраненного адреса возврата найденный нами адрес адрес команды CALL EAX, то есть 0x77F76385. На месте сохраненного адрес возврата окажутся байты полезной нагрузки с 590 по 593. В примере 12.4 показано, как следует модифицировать текст эксплойта.

Пример 12.4. Вставка адреса возврата

1$string = "GET /";

2$string .= "\xcc" x 589;

3$string .= "\x85\x63\xf7\x77";

4$string .= "\xcc" x 500;

5 $string .= ".htr HTTP/1.0\r\n\r\n";

6

7 open(NC, "|nc.exe 192.168.181.129 80");

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

 

 

NOW!

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

 

 

.c

 

 

 

p

d

 

 

xch8

 

e

print

 

 

 

f-

g

 

 

 

 

 

 

 

an

 

 

 

 

 

NC $string;

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Разработка эксплойтов с помощью каркаса Metasploit 613

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

9close(NC);

Âстроках 1 и 5 задаются префикс и суффикс строки атаки, содержащие вид запроса, а также расширение имени файла и версию протокола. В строке 3 сохраненный адрес возврата переписывается адресом команды CALL EAX. Так как жертва работает на платформе x86, то адрес следует представлять в формате little endian. В строках 2 и 4 строка запроса дополняется слева и справа байтом 0xCC. Строки 7 и 9 нужны для коммуникации через сокет.

На всех процессорах x86 байтом 0xCC представляется команда INT 3, которая останавливает процесс при работе под отладчиком. Заполнив строку этой командой, мы можем быть уверены, что на какое бы место в строке атаки ни указывал EIP, отладчик перехватит управление процессом. Тем самым мы убедимся, что наш адрес возврата работает правильно. Когда процесс будет остановлен, можно будет в отладчике посмотреть, куда именно указывает EIP (рис. 12.25).

На рис. 12.25 в окне отладчика показано четыре области (по часовой стрелке, начиная с левого верхнего угла): дизассемблированные команды, значения регистров, содержимое стека и содержимое памяти. В окне дизассемблера, где показаны команды программы, видно, что EIP указывает на одну из команд INT 3. В окне регистров показаны текущие значения регист-

Рис. 12.25. Проверка правильности адреса возврата

 

 

 

 

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

 

 

 

614 Глава 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

 

 

ров. EIP содержит адрес следующей исполняемой команды – 0x00F0FC7D, так-x cha

 

 

 

 

 

что текущая команда должна находиться по адресу 0x00F0FC7C. Окно распе- чатки памяти подтверждает, что 0x00F0FC7C – это адрес первого байта, следующего за адресом возврата, так что команда, на которую указывал адрес возврата, честно скопировала содержимое EAX в EIP.

Нам нужно, чтобы процессор выполнил не команду INT 3, а код нашей полезной нагрузки, но сначала необходимо выяснить, какие на нее налагаются ограничения.

Определение недопустимых символов

Многие приложения фильтруют получаемые извне данные, поэтому перед тем как посылать жертве полезную нагрузку, важно выяснить, нет ли в ней символов, которые будут удалены или изменены. Есть два способа проверить, пройдет ли полезная нагрузка через установленные приложением фильтры.

Первый метод состоит в том, чтобы послать полезную нагрузку и посмотреть, выполнится она или нет. Если выполнилась, можно успокоиться. Но обычно так не бывает и приходится прибегать ко второму методу.

Мы знаем, что все возможные символы в кодировке ASCII представляются числами от 0 до 255. Значит, можно создать тестовую строку, которая будет содержать каждый из них. Эту последовательность можно повторить

âобласти, окружающей адрес возврата, а в качестве самого адреса возврата указать заведомо некорректный адрес в памяти. Когда этот адрес загрузится

âEIP, произойдет нарушение защиты, и мы с помощью отладчика сможем посмотреть, какие символы отфильтровались, а какие считаются признаком конца строки.

Если символ был удален из середины строки, то его следует избегать в полезной нагрузке. Если же строка преждевременно оборвалась, значит символ, следующий за последним видимым, приложение интерпретирует как признак конца строки. Таких символов в полнезной нагрузке тоже не должно быть. Двоичный ноль (0x00) практически всегда считается концом строки, поэтому в тестовую строку его даже включать не надо. Если обнаружен еще какой-то символ, обрывающий строку, надо исключить и его и послать модифицированную тестовую строку еще раз.

При отправке тестовой строки жертве она часто повторяется несколько раз, так как, возможно, дело не в фильтре, а в том, что какая-то функция программы модифицирует данные в стеке. Так как эта функция вызывается до останова процесса, то невозможно сказать, что именно стало причиной модификации. Повторив строку несколько раз, мы сможем выяснить, кто виноват: фильтр или функция. Если некоторый символ будет удален или из-

менен во всех экземплярах тестовой строки, значит, это, скорее всего, фильтр,

 

 

 

 

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

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Разработка эксплойтов с помощью каркаса Metasploit 617

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Рис. 12.28. Свободное место в строке атаки

Дорожка из NOP3команд

Чтобы полезная нагрузка выполнилась правильно, регистр EIP должен указывать точно на ее начало. Но предсказать адрес полезной нагрузки в стеке для разных систем с точностью до байта сложно, поэтому часто ее начинают с последовательности («дорожки») NOP-команд, не выполняющих никаких полезных операций. По такой дорожке можно «скользить» до первой полезной команды, даже если EIP будет указывать не совсем туда, куда нужно. Таким образом, этот прием повышает шансы на успешное выполнение эксплойта, поскольку расширяет область допустимых адресов для EIP, сохраняя

âто же время состояние процессора.

Àсохранять состояние процессора важно, так как не исключено, что для работы полезной нагрузки должны удовлетворяться некоторые предусловия. NOP-команда не изменяет состояния процессора, который просто тратит один такт на переход к следующей команде. При этом лишь увеличивается значение регистра EIP.

На рис. 12.29 показано, как дорожка из NOP-команд приводит к тому адресу, на который указывает EIP.

Рис. 12.29. Повышение надежности за счет дорожки из NOP*команд

В любом процессоре есть одна или несколько команд, которые могут выступать в роли «пустышки». Так, в процессорах семейства x86 можно взять команду с кодом 0x90, а на некоторых RISC-платформах воспользоваться командой сложения и отбросить результат. Если компьютер-жертва работает на платформе x86, то дорожку можно выложить из команд с кодом 0x90. Строго говоря, код операции 0x90 соответствует команде XCHG EAX,EAX, которая обменивает регистр EAX с самим собой, не изменяя тем самым состояния процессора.

 

 

 

 

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).

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Разработка эксплойтов с помощью каркаса Metasploit 619

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Рис. 12.30. Строка атаки, содержащая дорожку из команд NOP

Выбор полезной нагрузки и кодировщика

Последний шаг разработки эксплойта – это создание и кодирование полезной нагрузки, которую предстоит вставить в строку атаки и послать жертве для исполнения. Полезная нагрузка состоит из команд, позволяющих достичь поставленной цели, например, запустить на атакованном компьютере некую программу или открыть серверный сокет, при соединении с которым будет запускаться оболочка. Чтобы создать полезную нагрузку с нуля, разработчик эксплойта должен уметь программировать на ассемблере для конкретного процессора, а также разбираться в особенностях целевой операционной системы. Требования серьезные! Хуже того, в полезной нагрузке могут оказаться символы, которые приложение отфильтрует. Хотя кому-то задача создания полезной нагрузки для конкретной архитектуры и операционной системы может показаться интересной, очевидно, что это не самый простой и быстрый способ написания работоспособного эксплойта.

Чтобы не утруждать себя тяжкой задачей написания специализированного shell-кода для конкретной уязвимости, мы вновь обратимся к каркасу Metasploit. Одна из его самых сильных сторон – это возможность автоматически генерировать полезные нагрузки для заданной аппаратной платформы и операционной системы, которые затем кодируются, чтобы избавиться от недопустимых символов. По сути дела, каркас берет на себя всю работы по созданию и кодированию полезной нагрузки, предлагая пользователю лишь выбрать ее тип. В последнюю версию Metasploit включено свыше 65 полезных нагрузок для девяти операционных систем на четырех аппаратных платформах. Конечно, каждую из них мы обсудить не сможем, но все же опишем основные категории.

В класс «Bind» входят полезные нагрузки, привязывающие запуск оболоч- ки к порту. Если удаленный клиент установит соединение с этим портом на уязвимой машине, то получит в ответ оболочку. Полезные нагрузки с обратным вызовом («Reverse shell») делают практически то же самое, только соединение инициирует жертва, а не клиент. Класс «Execute» содержит полезные нагрузки, запускающие на удаленной машине конкретные команды, а нагрузки класса «VNC» предоставляют удаленному клиенту графический интерфейс для управления взломанной машиной. Существует механизм Meterpreter, который позволяет динамически внедрять и исполнять модули в виртуальной памяти машины-жертвы. Подробнее об этом см. статью на сайте www.nologin.com.

 

 

 

 

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

 

 

620 Глава 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

 

 

 

 

 

Каркас Metasploit предлагает два интерфейса для генерирования и коди--x cha

 

 

 

 

 

рования полезной нагрузки. С Web-интерфейсом, находящимся по адресу www.metasploit.com/ shellcode.html, работать проще, но для желающих имеется и командный вариант, состоящий из утилит msfpayload è msfencode. Мы начнем обсуждение именно с них, а затем посмотрим, как сделать то же самое из Web-интерфейса.

На рис. 12.31 показано, что первым делом при использовании утилиты msfpayload нужно вывести список всех полезных нагрузок.

Рис. 12.31. Перечень имеющихся полезных нагрузок