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

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

 

 

xch#define EXCEPTION_COMSUPPORT (0XDEADB33F)

 

 

 

 

f-

 

an

 

 

 

 

#define exit(x) \ if (g_IsCOM) { \

int arg[] = { ##x##, 0}; \ RaiseException( \

EXCEPTION_COMSUPPORT, \ EXCEPTION_NONCONTINUABLE, \ 1, (PULONG)&arg); \

} else TerminateProcess( \ GetCurrentProcess(), ##x##);

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Часто задаваемые вопросы 701

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

Чтобы перехватить это исключение, понадобится примерно такой код:

int nRes; LPEXCEPTION_POINTERS pi; __try {

nRes = rpcdump_main(g_argc, g_argv);

}

__except(pi = GetExceptionInformation(), EXECEPTION_EXECUTE_HANDLER) {

nRes = pi->ExceptionRecord->ExceptionInformation[0];

}

В принципе, этот код делает то же самое, что макрос BEGIN_ENTRYPOINT, только он получает возвращаемое значение, даже если функция rpcdump_main возбудила исключение.

Â: Иногда на экране промаргивает консоль, если я вызываю компонент из своего сценария. В чем дело?

Î: Это потому, что утилита может работать и как консольное приложение, и как COM-объект. Если она определяет, что вызвана в режиме COM, то консольное окно сразу закрывается. Есть два способа справиться с этим эффектом, и у каждого из них свои недостатки:

спроектировать утилиту как графическое приложение. Если она запущена в консольном режиме, присоединиться к родительской консоли с помощью функции AttachConsole и настроить функции ввода/вывода для работы с новыми STDIN и STDOUT. Недостаток в том, что текст, отображаемый на консоли, не будет выглядеть так же, как в случае, когда утилита разрабатывалась как консольное приложение;

вообще удалить часть приложения, связанную с консолью, и считать его исключительно COM-объектом. Очевидный недостаток в том,

что мы теперь имеем два инструмента вместо одного.

 

 

 

 

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

 

 

702 Глава 13. Написание компонентов для задач, связанных с безопасностью

 

 

 

 

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

 

 

 

 

 

Â: Почему необходимо переопределять метод RegisterServer в классе CCon--x cha

 

 

 

 

 

soleApp?

Î: Атрибут [module(exe)] говорит компилятору, что надо подставить подходящий код регистрации COM-объекта. Однако регистрации, выполняемой по умолчанию, для данного инструмента недостаточно. Дело в том, что он должен понимать, как его запустили: как компонент или оригинальную командную утилиту. Для этого следует проанализировать командную строку. Если в ней есть флаг «-COMSERVER», то программа переходит в режим COM, иначе работает как консольное приложение. Метод RegisterServer добавляет этот флаг в командную строку, хранящуюся в реестре. В результате при запуске EXE-сервера средой исполнения COM нужный флаг в командной строке будет присутствовать.

Â: Я добавил COM-расширения к приложению, написанному на языке C. Но при сборке проекта я получаю сообщение о том, что компоновщик не может найти мои процедуры интеграции с приложением. Ошибка выглядит примерно так: error LNK2019: unresolved external symbol _NextRecord referenced in function _try_protocol. Что случилось?

Î: Это очень распространенная ошибка, возникающая при сборке проекта, содержащего части, написанные на C и C++. Когда компилируется функция, написанная на C++, компилятор модифицирует ее имя, кодируя в нем типы аргументов. Но в языке C принято другое соглашение об именах в объектном файле. Поэтому нужно как-то прийти к единой точке зрения на имена.

Именно для этого служит директива extern «C» {. Поместите в такой блок все функции, написанные на C, но вызываемые из кода на C++, и компоновщик сможет разрешить коллизии. Ниже приведен простой пример:

extern "C" { BOOL g_IsCOM;

void SetInterfaceID(char *pIfaceID) {}

}

 

 

 

 

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

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

Глава 14

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Создание инструмента для проверки уязвимости Web приложения

Описание данной главы:

Проектирование

Сигнатуры

Углубленный анализ

Результаты работы См. также главы 4, 10, 11, 12, 13

Резюме

Обзор изложенного материала

Часто задаваемые вопросы

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

704 Глава 14. Создание инструмента для проверки уязвимости Web приложения

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

 

e

 

 

 

 

 

 

n

Введение

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

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

Whisker – сложный сценарий, написанный на языке Perl и предназна- ченный для поиска уязвимостей, которые можно атаковать через Web, был стандартом де факто для подобных приложений в течение трех лет. Rain Forest Puppy (RFP) написал Whisker, стремясь создать полноценный инструмент, который сканировал бы Web-серверы в поисках уязвимых приложений или точек внедрения для последующей атаки. Затем RFP на- чал новый проект LibWhisker, который должен был вобрать в себя большую часть функциональности, необходимой для запуска сложных запросов с помощью Whisker. Вскоре LibWhisker стала базовой технологией, на основе которой разрабатывались почти все инструменты для сканирования Web. А явным лидером среди всех бесплатных статических сканеров стала программа Nikto, созданная группой CIRT (Computer Incident Response Team – группа быстрого реагирования на компьютерные атаки при Министерстве энергетики США). К программе Nikto существует написанный на Perl интерфейс, который пользуется модулями LibWhisker для реализации сложных функций. Помимо этого интерфейса, в состав Nikto входит новая текстовая база данных, содержащая множество потенциально опасных запросов для поиска уязвимых CGI-приложений и получения «шапок» Web-серверов (часть ответа, по которой можно идентифицировать Webсервер).

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

 

 

 

 

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

 

 

 

e

 

 

 

 

 

 

n

 

 

 

 

 

 

 

Проектирование

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Проектирование 705

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Самое важное при разработке любого программного обеспечения – правильно спроектировать его. Создание программы – это нетривиальная зада- ча, поэтому к этапу проектирования следует подойти со всей серьезностью.

Формат сигнатуры атаки

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

âпредварительном разборе.

Âсозданном нами приложении используется общедоступная и весьма популярная база данных с сигнатурами уязвимостей, являющаяся частью программы Nikto и поддерживаемая группой CIRT. База пополняется добровольцами со всего мира, но, что самое важное, все сигнатуры в ней имеют единый формат, а именно:

тип web-сервера,корневой URL,ответ,метод,дополнительный вывод

Первое поле описывает тип уязвимости, к которому относится данная сигнатура, второе – это каталог, файл или строка атаки, которую нужно послать целевому Web-серверу. Поле «ответ» – это HTTP-код возврата, ожидаемый от уязвимой системы (например, «200 OK», «502 Bad Gateway» или «302 Moved Temporarily»). Поле «метод» описывает метод, которым запрос отправляется по протоколу HTTP. Почти во всех случаях это GET или POST, хотя в последнее время все больше внимания уделяется методу TRACE. Последнее поле содержит дополнительную информацию, которую можно включить в отчет или просто использовать как комментарий.

Сигнатуры

Итак, с форматом сигнатуры разобрались, теперь рассмотрим примеры:

Сигнатура атаки на файл htaccess

“generic”,”/.htaccess”,”200”,”GET”,”Contains authorization information”

IIS w3proxy.dll

“iis”,”/scripts/proxy/w3proxy.dll”,”502”,”GET”,”MSProxy v1.0 installed”

 

 

 

 

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

 

 

706 Глава 14. Создание инструмента для проверки уязвимости Web приложения

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

Заражение червем Code Red

 

 

p

 

-x cha

 

 

 

 

 

 

df

 

e

 

 

 

 

df

 

e

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

“iis”,”/scripts/root.exe?/c+dir+c:\+/OG”,”Directory of C”,”GET”,”This machine is infected with Code Red, or has Code Red leftovers”

Углубленный анализ

Поняв, как устроены сигнатуры атак, нужно сделать следующий логический шаг: реализовать средства для их организованного и массового применения. Чтобы эффективно решить эту задачу, нужно разработать хакерскую утилиту, без которой мы будем вынуждены вручную проверять каждую уязвимость. Такой утилитой является несложная программа SP-Rebel, которая была написана на языке C++ за сравнительно короткое время. Программа состоит из четырех основных частей:

управление соединениями;

анализ сигнатур;

хранилище данных об уязвимостях;

«пакетная пушка».

В совокупности эти четыре части определяют, что нужно послать для тестирования, осуществляют само тестирование и анализируют результаты. Для разбора базы данных были созданы два класса: VulnDBEntry (анализ одной сигнатуры) и VulnDB (доступ к хранилищу сигнатур). Для выполнения тестирования были написаны функции управления соединением на базе сокетов в Windows, с помощью которых реализована «пакетная пушка».

Сокеты и отправка сигнатуры

В файле sp-rebel.cpp находятся средства управления соединением и «пакетная пушка». Здесь определены функции для отправки Web-серверу запроса, содержащего строку атаки на потенциальную уязвимость. Функция main() интерпретирует переданные программе аргументы: имя хоста, номер порта, степень подробности выводимой информации и размер буфера. Затем устанавливается соединение, отправляется запрос и анализируется полученный ответ.

1/*

2* sp-rebel.cpp

3*

4* james c. foster jamescfoster@gmail.com

5* mike price <mike@insidiae.org>

6* tom ferris <tommy@security-protocols.com>

7* kevin harriford <kharrifo@csc.com>

 

 

 

 

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

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Углубленный анализ 707

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

9

10 #define WIN32_LEAN_AND_MEAN

11

12 #include <winsock2.h>

13 #include <windows.h>

14 #include <stdio.h>

15 #include "VulnDB.h"

16

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

18

19#define DB_FILENAME "scan_database.db"

20#define BUF_SIZE 0x0400

21#define DEF_PORT 80

22

23 int output = 0;

24

25/*

26* список CGIDIRS

27*/

28#define CGIDIRS_LEN 0x02

30string CGIDIRS[CGIDIRS_LEN] =

31{

32"/cgi-bin/",

33"/scripts/"

34

35/* сюда добавить другие каталоги CGI-программ */

36};

37

38/*

39* список ADMINDIRS

40*/

41#define ADMINDIRS_LEN 0x01

43string ADMINDIRS[ADMINDIRS_LEN] =

44{

45"/admin/"

46

47/* сюда добавить другие каталоги административных программ */

48};

49

50/*

51* twiddle()

52*

53*

54*/

55void twiddle (int &pos,

56int idx,

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

708 Глава 14. Создание инструмента для проверки уязвимости Web приложения

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

57

 

 

 

 

df-xchan

e

int size)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

58 {

 

 

 

 

 

 

 

 

 

 

 

59

char ch = 0;

 

 

 

 

 

 

 

 

 

 

60

 

61ch = (pos == 0 ? '|' :

62(pos == 1 ? '/' :

63(pos == 2 ? '-' :

64

'\\')));

65

++pos;

66

 

67if(pos == 4)

68{

69pos = 0;

70}

71

72printf("\r%c %d èç %d", ch, idx, size);

73}

74

75/*

76* isvuln()

77*

78*

79*/

80void isvuln (char *hostname, int port, VulnDBEntry *vdbe)

81{

82printf("————————————————————————————————————————————

\r\n");

83printf("\r\nХост: %s @ %d\r\n\r\nОписание:\r\n\r\n%s.\r\n",

hostname, port, vdbe->GetDesc().c_str());

84 }

85

86 /*

87

* doreq()

 

 

88

*

 

 

89

*

 

 

90

*/

 

 

91 bool doreq (

char

*hostname,

92

 

unsigned int

addr,

93

 

int

port,

94

 

VulnDBEntry *vdbe,

95

 

int

bufsize,

96

 

string

&req)

97{

98struct sockaddr_in sin;

99SOCKET sock = 0;

100

bool

vuln

= false;

101

char

*buf

=

NULL;

102

int

ret

=

0;

103

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

 

 

e

 

 

 

 

 

d

 

 

xch104

 

 

 

 

 

 

f-

 

an

 

 

 

 

 

105

106

107

108

109

110

buf = new char[bufsize]; if(buf == NULL)

{

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Углубленный анализ 709

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

printf("\r\n*** ошибка выделения памяти (при выполнении new char[%d]).\r\n", bufsize);

return(false);

}

111sock = socket(AF_INET, SOCK_STREAM, 0);

112if(sock < 0)

113{

114delete buf;

115printf("\r\n*** ошибка socket() при соединении с целью для данного запроса.\r\n");

116return(false);

117}

118

119

memset(&sin, 0x0, sizeof(sin));

120

sin.sin_family

=

AF_INET;

121

sin.sin_port

= htons(port);

122

sin.sin_addr.s_addr =

addr;

123

 

 

 

124// соединиться с удаленным TCP-портом

125ret = connect(sock, (struct sockaddr *) &sin, sizeof(sin));

126if(ret < 0)

127{

128delete buf;

129printf("\r\n*** ошибка connect() при соединении с целью для данного запроса.\r\n");

130closesocket(sock);

131return(false);

132}

133

134 // соединение установлено..

135

136// отправить запрос

137ret = send(sock, req.c_str(), req.length(), 0);

138if(ret != req.length())

139{

140delete buf;

141printf("\r\n*** ошибка send() при отправке данных для данного запроса.\r\n");

142closesocket(sock);

143return(false);

144}

145

146// получить ответ

147ret = recv(sock, buf, bufsize, 0);

148if(ret <= 0)

 

 

 

 

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

 

 

710 Глава 14. Создание инструмента для проверки уязвимости Web приложения

 

 

 

 

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

149

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

150

delete buf;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

151

printf("\r\n*** ошибка recv() при при получении ответа для данного

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

запроса).\r\n");

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

152

closesocket(sock);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

153

return(false);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

154

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

155

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

156

closesocket(sock);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

157

 

 

 

 

 

 

 

 

 

 

 

 

 

158 buf[ret – 1] = '\0';

159

160// получен ответ 200 OK?

161if(!strcmp(vdbe->GetResult().c_str(), "200"))

162{

163if(strstr(buf, "200 OK") != NULL)

164{

165vuln = true;

166}

167}

168else

169{

170if(strstr(buf, vdbe->GetResult().c_str()) != NULL)

171{

172vuln = true;

173}

174}

175

176

if(vuln)

177

{

178

if (output ==1)

179

{

180

printf("\r\n\r\n*** УЯЗВИМА.\r\n\r\n");

181

printf("ЗАПРОС :\r\n\r\n%s\r\n", req.c_str());

182

printf("ОТВЕТ:\r\n\r\n%s\r\n", buf);

183

}

184

else

185

{

186

printf("ЦЕЛЬ: %s @ %d, УСПЕШНЫЙ АТАКУЮЩИЙ ЗАПРОС :%s",

 

hostname, port, req.c_str());

187

}

188

 

189delete buf;

190return(true);

191}

192

193 delete buf;

194

195 return(false);