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

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

 

 

 

 

 

 

Написание сценариев на языке NASL 121

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

 

 

Сценарий на языке NASL может выступать в одной из двух ролей. Некото-

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Написание сценариев для личного пользования

Программируя на NASL, очень важно не забывать, что язык был спроектирован прежде всего для облегчения поиска уязвимостей. Поэтому в нем есть десятки встроенных функций, упрощающих манипулирование сетевыми сокетами, создание и модификацию пакетов и работу с протоколами верхнего уровня (например, HTTP, FTP и SSL). Эти задачи на NASL решаются проще, чем на универсальных языках.

Если сценарий пишется для решения узкоспециальной задачи, то нет нужды заботиться о соблюдении требований, предъявляемых к сценариям общего пользования. Вы можете сконцентрироваться именно на тех аспектах, которые служат получению желаемого результата. Тут-то и пригодятся функции, включенные в библиотеку NASL.

Сетевые функции

В NASL есть немало функций, обеспечивающих простой и быстрый доступ к удаленным хостам по протоколам TCP и UDP. С их помощью можно открывать и закрывать сокеты, посылать и принимать данные, выяснять, сохранил ли хост работоспособность после атаки, имеющей целью вызвать отказ от обслуживания (DoS-атака), и получать разнообразную информацию о хосте: его имя, IP-адрес и номер следующего открытого порта.

Функции, связанные с протоколом HTTP

Эти функции в библиотеке NASL предоставляют программе интерфейс для взаимодействия с HTTP-серверами. Для вашего удобства уже решены такие задачи, как извлечение HTTP-заголовков из ответа, отправка запросов типа GET, POST, PUT è DELETE, а также определение компонента пути к CGI-про- граммам.

Функции манипулирования пакетами

В NASL есть встроенные функции для изготовления специальных пакетов протоколов IGMP (Internet Group Management Protocol – межсетевой протокол управления группами), ICMP (Internet Control Message Protocol – протокол

 

 

 

 

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

 

 

 

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

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

контроля сообщений в сети Internet), IP, TCP и UDP. С помощью семейства-x cha

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

функций get è set можно задавать и получать отдельные поля в пакете.

Функции манипулирования строками

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

Криптографические функции

Если программа Nessus была собрана вместе с библиотекой OpenSSL, то NASL предоставляет функции для вычисления различных криптографических сверток и контрольных сумм, включая Message Digest 2 (MD2), Message Digest 4 (MD4). Message Digest 5 (MD5), RIPEMD160, Secure Hash Algorithm (SHA) и Secure Hash Algorithm version 1.0 (SHA1). Есть также несколько функций для генерирования кода аутентификации сообщений (Message Authentication Code) на основе произвольных данных и заданного ключа. К ним относятся функции для вычисления сверток HMAC_DSS, HMAC_MD2, HMAC_MD4, HMAC_MD5, HMAC_RIPEMD160, HMAC_SHA и HMAC_SHA1.

Интерпретатор команд NASL

Программируя на NASL, пользуйтесь встроенным интерпретатором команд nasl для тестирования своих сценариев. В системах Linux и FreeBSD интерпретатор команд находится в каталоге /usr/local/bin. На момент написания этой книги еще не существовало автономного интерпретатора команд NASL для Windows. Пользоваться интерпретатором несложно. Порядок вызова таков:

nasl -t target_ip scriptname1.nasl scriptname2.nasl ...

Если вам нужны только «безопасные проверки», добавьте флаг -s. Есть и другие флаги, подробнее о них можно узнать, выполнив команду man nasl.

Пример

Представьте, что перед вами стоит задача обновления всех своих серверов Apache с версии 1.x до версии 2.x. Тогда можно написать NASL-сценарий, который просканирует все компьютеры в вашей сети, извлечет из ответов «шапки» (banner – строка, в которой указаны имя и версия программы) и вы-

 

 

 

 

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 123

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

-xchведетa

сообщение при обнаружении старой версии Apache. Приведенный

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

в следующем примере сценарий не предполагает, что Apache работает на стандартном порту 80.

Этот сценарий нетрудно модифицировать так, чтобы он печатал все обнаруженные шапки, то есть превратить его в простой сканер TCP-портов. Если сценарию присвоено имя apache_find.nasl, а вашей сети выделен диапазон IP-адресов от 192.168.1.1 до 192.168.1.254, то команда для запуска могла бы выглядеть примерно так:

nasl -t 192.168.1.1-254 apache_find.nasl

1 # сканировать все 65 535 портов в поисках Web-серверов Apache 1.x

2 # задайте first и last равными 80, если хотите проверять только

3# стандартный порт

4 first = 1;

5 last = 65535;

6

7 for (i = start; i < last; i++) {

8# пытаемся создать TCP-соединение с целевым портом

9soc = open_soc_tcp(i);

10if (soc) {

11# читать не более 1024 символов шапки или пока не встретится "\n"

12banner = recv_line(socket: soc, length:1024);

13# содержит ли шапка строку "Apache/1."?

14if (egrep(string: banner, pattern:"^Server: *Apache/1\.")) {

15display("Apache версии 1 найден на порту ", i, "\n");

16}

17close(soc);

18}

19}

Âстроках 4 и 5 задаются начальный и конечный номера сканируемых портов. Отметим, что это полный диапазон портов системы (за исключением нулевого порта, который часто используется для атаки или сбора информации).

Âстроках 9 и 10 открывается соединение с сокетом и проверяется, выполнилась ли эта операция успешно. Получив шапку с помощью функции recv_line (строка12), мы в строке 14 сопоставляем ее с регулярным выражением и выясняем, соответствует ли шапка серверу Apache. И наконец сценарий печатает сообщение о том, что на некотором порту найден Apache версии 1.

Хотя эта программа достаточно эффективно решает конкретную задачу, такого рода сценарии плохо приспособлены для работы в среде Nessus. Если 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

 

 

 

124 Глава 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

 

 

 

 

 

ку и ищет в ней строку «Apache». Только подумайте, насколько неэффективно функционировала бы Nessus, если бы каждому сценарию приходилось выполнять такой объем работы! В следующем разделе мы расскажем, как оптимизировать NASL-сценарии для запуска из-под Nessus.

Программирование в среде Nessus

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

Описательные функции

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

Функции, относящиеся к базе знаний

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

Пользоваться базой знаний нетрудно в силу двух причин:

Вызов функций, работающих с базой знаний, тривиален, это гораздо проще, чем сканировать порты, вручную извлекать из потока шапки или заниматься повторной реализацией любой имеющейся в базе знаний функциональности;

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

Для иллюстрации этих положений рассмотрим задачу анализа всех служб HTTP на конкретной машине. Не прибегая к базе знаний, можно было бы написать сценарий, который сканирует все порты на этой машине, проверяет шапки, и, обнаружив искомое, выполняет какие-то действия. Но запускать в среде Nessus подобные сценарии, каждый из которых выполняет лишнюю

 

 

 

 

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 125

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

-xchработуa

и потребляет время и полосу пропускания, чудовищно неэффектив-

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

но. Воспользовавшись базой знаний, сценарий может добиться того же эффекта, вызвав единственную функцию get_kb_item(«Services/www»), которая вернет номер порта найденного HTTP-сервера и автоматически запустит новый процесс для каждого ответа, возвращенного базой знаний (так, если служба HTTP обнаружена на портах 80 и 2701, то вызов функции вернет 80, запустит новый процесс и вернет 2701).

Функции извещения о результатах работы

В NASL есть четыре встроенных функции, возвращающие информацию о результатах работы сценария ядру Nessus. Функция scanner_status позволяет сценарию сообщить, сколько портов было просканировано и сколько еще осталось. Остальные три функции (security_note, security_warning è security_hole) применяются для передачи ядру отчета о различных аспектах безопасности, некритических предупреждений и сообщений о критических уязвимостях. Nessus собирает эти сведения и формирует на их основе сводный отчет.

Пример

Ниже приведен сценарий, представленный в предыдущем разделе, который был переписан с учетом требований среды Nessus. «Описательные» функции передают Nessus имя сценария, его назначение и категорию. После блока описания начинается собственно тело сценария. Обратите внимание на использование функции get_kb_item(«Services/www»). Как мы уже отмечали, при ее выполнении интерпретатор NASL запускает новый процесс для каждого найденного в базе знаний значения службы «Services/www». Таким образом, сценарий проверит шапку, возвращаемую каждым HTTP-сервером на целевой машине, не выполняя сканирования портов самостоятельно. Если будет обнаружена искомая версия Apache, то с помощью функции security_note эта информация будет сообщена ядру Nessus. Если сценарий проверяет нали- чие уязвимостей, то можно воспользоваться функциями security_warning

èëè security_hole.

1 if (description) {

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

3

4name["english"] = "Поиск Apache версии 1.x";

5 script_name(english:name["english"]);

6

7desc["english"] = "Этот сценарий ищет серверы Apache 1.x.

8 Может использоваться администратором, желающим обновить все

9 экземпляры Apache до версии 2.x.

10

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

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

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

11 Оценка риска : низкая";

 

 

 

 

 

 

 

 

12

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

14

15summary["english"] = "Поиск серверов версии Apache 1.x.";

16script_summary(english:summary["english"]);

17

18 script_category(ACT_GATHER_INFO);

19

20 script_copyright(english:"No copyright.");

21

22family["english"] = "General";

23script_family(english:family["english"]);

24script_dependencies("find_service.nes","no404.nasl", "http_version.nasl");

25script_require_ports("Services/www");

26script_require_keys("www/apache");

27exit(0);

28}

29

30 # Начало проверки

31

32 include("http_func.inc");

33

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

35if (!port) port = 80;

36

 

 

 

 

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

 

 

 

 

37if (get_port_state(port)) {

38banner = recv_line(socket: soc, length:1024);

39# содержит ли шапка строку "Apache/1."?

40if (egrep(string: banner, pattern:"^Server: *Apache/1\.")) {

41display("Сервер Apache версии 1 обнаружен на порту ", i, "\n");

42}

43security_note(port);

44}

Хотя двух одинаковых NASL-сценариев не существует, большинство из них строятся по приведенной схеме. Вначале идут команды, поясняющие название, краткое описание проблемы или уязвимости и назначение сценария. Затем следует описание, передаваемое ядру Nessus, которое включается в отчет, формируемый, когда запущенный сценарий обнаруживает уязвимую систему. Наконец, обычно в тексте есть строка «Начало сценария», отмечающая, где начинается сам код.

Тела всех сценариев, конечно, различны, но сценарий, как правило, пользуется информацией из базы знаний и сохраняет в ней результаты своей работы, выполняет тот или иной анализ целевой системы, предварительно установив соединение с ней через сокет, и возвращает TRUE как свидетель-

 

 

 

 

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 127

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

-xchñòâîa

уязвимости системы по отношению к проверяемому условию. Ниже

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Пример: канонический сценарий на языке NASL

1 #

2

# Это прокомментированный шаблон NASL-сценария.

3

#

4

 

5

#

6

# Название и описание сценария

7

#

8

# Включите в начало сценария подробный комментарий, описывающий,

9

# что сценарий проверяет и какие версии проверяемой программы

10

# уязвимы, ваше имя, дату создания сценария, признание заслуг

11

# автора оригинального эксплойта и любую другую информацию, которую

12

# сочтете нужной.

13#

14#

16 if (description)

17{

18# Все сценарии должны содержать описание внутри условного

19# предложения "if (description) { ... }". Функции в этой секции

20# передают информацию ядру Nessus.

21#

22#

23# Многие функции в этом разделе принимают именованные параметры

24# для поддержки различных языков. В настоящее время Nessus

25# поддерживает английский (english), французский (francais),

26# немецкий (deutsch) и португальский (portuguese) языки. Если

27# имя аргумента не задано, предполагается английский язык.

28# Описание на английском обязательно, на других языках – по желанию.

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

32# script_name – это просто имя сценария. Выбирайте информативные

33# имена, например, имя "php_4_2_x_malformed_POST.nasl" лучше,

34# чем просто "php.nasl"

35#

36name["english"] = "Имя сценария на английском";

37 name["francais"] = "Имя сценария на французском";

 

 

 

 

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

 

 

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

 

 

 

 

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

39

 

 

 

 

 

 

 

 

 

 

 

 

40# script_description – это подробное описания уязвимости.

41desc["english"] = "

42Это описание Nessus покажет при просмотре сценария. В нем надо

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

44дать ссылки на источник исходной информации, на статьи в CVE и

45BugTraq (если они есть), ссылку на сайт производителя программы,

46на патч, а также любую другую информацию, которую вы сочтете

47полезной.

48

49

50

Текст не начинается с красной строки, чтобы он правильно отображался

51

в графическом интерфейсе Nessus.";

52

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

53

 

54# script_summary – это однострочное описание назначения сценария.

55summary["english"] = "Однострочное описание на английском.";

56summary["francais"] = " Однострочное описание на французском.";

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

francais:summary["francais"]);

58

59# script_category – это одна из следующих категорий:

60# ACT_INIT: сценарий инициализирует статьи в БЗ.

61# ACT_SCANNER: сканер портов или нечто подобное (типа ping)

62# ACT_SETTINGS: записывает информацию в БЗ после ACT_SCANNER.

63# ACT_GATHER_INFO: идентифицирует службы, разбирает шапки.

64# ACT_ATTACK: атака без последствий (например, обход каталогов)

65# ACT_MIXED_ATTACK: запускает потенциально опасные атаки.

66# ACT_DESTRUCTIVE_ATTACK: пытается исказить данные.

67# ACT_DENIAL: пытается вызвать отказ службы.

68# ACT_KILL_HOST: пытается вывести машину-жертву из строя.

69script_category(ACT_DENIAL);

70

71# script_copyright дает возможность заявить об авторских правах на

72# сценарий. Часто содержит просто имя автора, иногда лицензию GPL

73# или строку "No copyright." (отказ от авторских прав)

74script_copyright(english:"No copyright.");

75

76# script_family классифицирует поведение сценария. Допустимы

77# следующие значения:

78# – Backdoors (черный ход)

79# – CGI abuses (атака на CGI-программу)

80# – CISCO

81# – Denial of Service (отказ от обслуживания)

82# – Finger abuses (атака на службу finger)

83# – Firewalls (межсетевые экраны)

84# – FTP

85 # – Gain a shell remotely (удаленное получение оболочки)

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

r

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

Пример: канонический сценарий на языке NASL 129

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

# – Gain root remotely (удаление получение прав пользователя root)

 

 

 

df-x chan

e

 

 

 

 

df-xchan86

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

87

 

 

# – General (общие)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

88

 

 

# – Misc. (разное)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

89

 

 

# – Netware

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

90

 

 

# – NIS

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

91

 

 

# – Ports scanners (сканеры портов)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

92

 

 

# – Remote file access (удаленный доступ к файлам)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

93

 

 

# – RPC

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

94

 

 

# – Settings (получение и изменение конфигурации)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

95

 

 

# – SMTP problems (проблемы в SMTP)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

96

 

 

# – SNMP

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

97

 

 

# – Untested (не тестировалось)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

98

 

 

# – Useless services (бесполезные службы)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

99

 

 

# – Windows

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

100

 

 

# – Windows : User management (Windows : управление пользователями)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

101

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

102

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

103

 

 

script_family(english:family["english"],

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

francais:family["francais"]);

 

 

 

 

 

 

 

 

 

 

 

 

104

105# script_dependencies это то же самое, что неправильно написанная

106# фраза "script_dependencie" в NASL1. Этот раздел говорит о том,

107# какие NASL-сценарии необходимы для правильной работы данного.

108#

109script_dependencies("find_service.nes");

110

111# Функция script_require_ports принимает один или несколько номеров

112# портов из базы знаний

113script_require_ports("Services/www",80);

114

115 # Всегда необходимо выходить из блока описания

116 exit(0);

117}

118

119#

120# Начало проверки

121#

122

123 # Сначала включим другие сценарии и библиотечные функции

124 include("http_func.inc");

125 126 # Получить начальную информации из БЗ или от целевой системы

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

128if ( !port ) port = 80;

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

131 if( safe_checks() ) {

132

133 # Пользователи Nessus могут убедиться, что при тестировании

 

 

 

 

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

 

 

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

 

 

 

 

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

134

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

135

# безопасные проверки. Наличие такого раздела необязательно, но

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

136

# настоятельно рекомендуется. К числу безопасных проверок

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

137

# относятся считывание шапки, HTTP-ответов и т.п..

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

138

 

 

 

 

 

 

 

 

 

 

 

 

 

139# считать шапку

140b = get_http_banner(port: port);

142# проверим, соответствует ли шапка Apache/2.

143if ( b =~ 'Server: *Apache/2\.' ) {

144report = "

145Найден Web-сервер Apache версии 2.x – может, уязвим, а, может,

146и нет. В конце концов, это только пример.

147

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

149 ** извлекла номер версии из шапки.

150

151 Решение : Зайдите на www.apache.org для получения последней версии.

152 Оценка риска : низкий";

153

154# сообщить Nessus об уязвимой версии

155# К функциям извещения относятся:

156# security_note: получена информация

157# security_warning: мелкая проблема

158# security_hole: серьезная проблема

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

160}

161

162# функция safe_checks завершилась, выйти

163exit(0);

164

165 } else {

166# Если режим safe_checks не задан, можно применять при тестировании

167# более жесткие методы, например, DoS-атаку или переполнение буфера

169# проверим, что хост жив перед началом атаки

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

171

172# открыть сокет для соединения с целевым хостом и портом

173soc = http_open_socket(port);

174if( soc ) {

175# сконструировать полезную нагрузку, в данном случае строку

176payload = "some nasty string\n\n\n\n\n\n\n\n\n";

177

178# отправить полезную нагрузку

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

181# прочитать результат.

182r = http_recv(socket:soc);