книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_
.pdf
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
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);