книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_
.pdf
|
|
|
|
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 |
|
|
|
|
|
|
Программирование серверных приложений 211 |
|
to |
|
|
|
|
|
|
|||||
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
-xcha |
|
|
В строке 43 полученный IP-адрес копируется в структуру sockaddr_in. |
|
|
p |
|
-x cha |
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
e |
|
|||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
В строках 44–45 мы заполняем остальные поля этой структуры: адресное семейство и номер порта.
В строках 46–52 производится попытка установить соединение с указанным IP-адресом и портом. Функции connect() передается дескриптор ранее созданного сокета (MySock), указатель на структуру, содержащую адресную информацию (sock), а также длина этой структуры.
В строках 53 и 54 объявляются переменные для хранения возвращенной сервером информации и числа прочитанных байтов.
В строке 55 вызывается функция recv(), которая читает данные с сервера.В строках 56 и 57 мы выделяем из кучи память1, в которую будут скопированы полученные от сервера данные. Далее проверяется, нормально ли завершилась операция recv(), в случае ошибки на экран выводится сообщение. Иначе полученный ответ копируется в буфер output* *. (Если этот шаг опустить, то поскольку буфер recvString не был предварительно инициализирован, а полученная строка может оказаться короче MAX, то при печати результата будет выведена не только эта строка, но
и мусор, следующий за ней).
В строках 67–70 освобождаются захваченные программой ресурсы и возвращается результат.
В строках 72–90 объявляются перемен7ные для хранения адреса и номера порта удаленной машины. Разбираются аргументы, заданные в командной строке, вызывается функция client_send() и полученный от нее результат печатается на экране.
Программирование серверных приложений
Серверное приложение во многом похоже на клиентское: оба посылают и принимают данные. Разница состоит в том, как устанавливается соединение. По своей природе сервер должен пассивно ждать, пока не придет запрос от клиента. После того как запрос будет принят, сервер может пользоваться теми же функциями для работы с сокетами, что и клиент. В примере 4.4 демонстрируется программа, работающая в роли сервера.
1 Особенно хорошо это будет выглядеть, если recv() вернет отрицательное значение. При попытке выделить память под массив отрицательной длины приложение немедленно «выполнит недопустимую операцию и будет закрыто». (Прим. перев.)
2 В котором не хватает места для завершающего нуля. Вот так и возникает переполнение буфера. (Прим. перев.)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
|
NOW! |
o |
|
||||
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
|
||||
|
|
|
|
to |
|
|
|
212 Глава 4. Сокеты на платформе Windows (Winsock) |
||||
w Click |
|
|
|
|
||||||||
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
m |
|
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
. |
|
-xcha |
|
|
.c |
|
|
||||
|
|
p |
|
|
|
Пример 4.4. Серверное TCP*приложение |
||||||
|
|
|
|
|
|
g |
|
|
|
|||
|
|
|
df |
|
|
n |
e |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
1 #include <stdio.h> |
|
|
|
|
|
|
|
|
|
|
|
|
2 #include <winsock2.h> |
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
4 #pragma comment (lib, "ws2_32.lib") |
||
|
|
|
|
|
|
|
|
|
|
5 |
|
|
|
|
|
|
|
|
|
|
|
|
6 #define STRING_MAX |
2048 |
|
|
|
|
|
|
|
|
|
|
|
7 #define MAX |
640000 |
|
|
|
|
|
|
|
|
|
|
|
8 #define MAX_CON |
16 |
|
|
|
|
|
|
|
|
|
|
|
9 bool server(int port, char* send_string) |
10{
11WSADATA wsaData;
12WORD wVersionRequested;
13SOCKET MyServer;
14int nret;
15
16wVersionRequested = MAKEWORD(2, 2);
17if (WSAStartup(wVersionRequested, &wsaData) < 0)
18{
19printf("################# ОШИБКА!#######################\n");
20printf("Ваша версия ws2_32.dll слишком стара.\n");
21printf("Зайдите на сайт Microsoft и скачайте более свежую\n");
22printf("версию ws2_32.dll.\n");
23
24WSACleanup();
25return (FALSE);
26}
27
28 MyServer = socket(AF_INET,SOCK_STREAM,0);
29
30if (MyServer == INVALID_SOCKET)
31{
32nret = WSAGetLastError();
33printf("Ошибка при создании сокета.\n");
34closesocket(MyServer);
35WSACleanup();
36return (FALSE);
37}
38struct sockaddr_in serverInfo;
39serverInfo.sin_family = AF_INET;
40serverInfo.sin_addr.s_addr = INADDR_ANY;
41serverInfo.sin_port = htons(port);
42nret = bind(MyServer, (struct sockaddr *)&serverInfo,
sizeof (serverInfo) );
43
44if (nret == SOCKET_ERROR)
45{
46nret = WSAGetLastError();
47printf("Ошибка bind \n");
48
|
|
|
|
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 |
|
|
|
|
|
|
|
Программирование серверных приложений 213 |
|
|
to |
|
|
|
|
|
|
||||||
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
|
|
|
m |
|||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
|
|
.c |
|
|
|
. |
|
|
|
|
|
|
|
|
.c |
|
||||
|
|
p |
|
|
|
|
|
|
|
e |
|
closesocket(MyServer); |
|
|
p |
|
|
|
x cha |
|
e |
|
||||||
|
|
|
d |
|
|
xch49 |
|
|
|
|
|
|
d |
|
|
g |
|
|
|
|||||||||
|
|
|
|
f- |
|
an |
|
|
|
|
|
|
|
|
|
f- |
|
|
n |
|
|
|
|
|||||
|
|
|
|
|
|
|
50 |
|
|
|
WSACleanup(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
51 |
|
|
|
return (FALSE); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
52 |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
53 |
|
|
nret = listen(MyServer, MAX_CON); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
54 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
55if (nret == SOCKET_ERROR)
56{
57nret = WSAGetLastError();
58printf("Ошибка listen\n");
60closesocket(MyServer);
61WSACleanup();
62return (FALSE);
63}
64SOCKET MyClient;
65MyClient = accept(MyServer, NULL, NULL);
67if (MyClient == INVALID_SOCKET)
68{
69nret = WSAGetLastError();
70printf("Ошибка accept\n");
71closesocket(MyServer);
72closesocket(MyClient);
73WSACleanup();
74return (FALSE);
75}
76char *sendStr = new char[STRING_MAX];
77strcpy(sendStr, "");
78strcpy(sendStr, send_string);
79
80 nret = send(MyClient, sendStr, strlen(sendStr)-1, 0);
81
82if (nret == SOCKET_ERROR)
83{
84printf("Ошибка при отправке сообщения")
85}
86else
87{
88printf("Сообщение отправлено. \n");
89}
90
91delete [ ] sendStr;
92closesocket(MyClient);
93closesocket(MyServer);
95WSACleanup();
96return (TRUE);
97}
98int main(int argc, char *argv[])
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
|||
|
F |
|
|
|
|
|
|
|
t |
|
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
|
NOW! |
|
o |
|
||||
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
|
|
||||
|
|
|
|
to |
|
|
|
214 Глава 4. Сокеты на платформе Windows (Winsock) |
|||||
w Click |
|
|
|
|
|||||||||
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
m |
|
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
g |
.c |
|
|
||||
|
|
p |
|
|
|
|
|
|
99 |
{ |
|||
|
|
|
df-xchan |
e |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
100 |
int port = 777; |
|||
|
|
|
|
|
|
|
|
|
101 |
char* targetip; |
|||
|
|
|
|
|
|
|
|
|
102 |
char* output = NULL; |
|||
|
|
|
|
|
|
|
|
|
103 |
|
|||
|
|
|
|
|
|
|
|
|
104 |
if (argc < 2) |
|||
|
|
|
|
|
|
|
|
|
105 |
{ |
106printf("ServerApp usage:\r\n");
107printf(" %s [port]\r\n", argv[0]);
108return(0);
109}
110
111targetip = argv[1];
112if (argc >= 2)
113{
114port = atoi(argv[1]);
115}
116
117bool up = TRUE;
118char sendStr[STRING_MAX];
120 strcpy(sendStr, "\r\n Hello World! \r\n\r\n");
121
122 printf("Сервер запускается...\n");
123
124do
125{
126up = server(port, sendStr);
127} while(up);
128
129 return(0);
130}
|
|
|
|
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 |
|
|
|
|
Собрав программы ClientApp.exe è ServerApp.exe, вы можете протестировать их совместную работу. Откройте два окна команд. В первом запустите ServerApp.exe на любом порту. Если вы не укажете номер порта, по умолча- нию будет принято значение 777. Программа сообщит о запуске и будет ожидать запроса на соединение. Во втором окне запустите ClientApp.exe, задав в качестве первого аргумента localhost, а в качестве второго – номер порта, выбранный для сервера. Нажмите Enter. В окне клиента вы должны увидеть строку Hello World!, а в окне сервера строку «Сообщение отправлено». Сервер продолжит работу и будет ожидать следующего запроса на соединение. Чтобы остановить сервер, нажмите Ctrl+C.
Анализ
В строке 38 объявлена переменная serverInfo для хранения адресной информации о сервере. В поле sin_addr.s_addr структуры sockaddr_in çàïè-
|
|
|
|
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 |
|
|
|
|
|
|
Написание эксплойтов и программ для проверки наличия уязвимостей 215 |
|
to |
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
-xcha |
|
|
|
|
|
p |
|
-x cha |
|
|
|
||||||||
|
|
|
df |
|
e |
|
сывается константа INADDR_ANY, означающая, что сервер готов |
df |
|
e |
|
||||||||||||
|
|
|
|
|
n |
|
|
|
|
|
|
|
|
|
n |
|
|
|
|
принимать соединения на любом из сетевых интерфейсов локального компьютера.
В строке 41 сокет привязывается к адресу локального компьютера с помощью функции bind().
В строке 52 сервер начинает прослушивать свой порт.
В строках 64–75 сервер принимает поступивший запрос и создает новый сокет (MyClient) для обмена данными с клиентом. А исходный сокет можно продолжать использовать для приема новых соединений.
В строке 80 вызывается функция send(), которая отправляет данные. В случае успеха она вернет число отправленных байтов, в противном случае – признак ошибки (отрицательное число).
В строках 98–130 определяется функция main(), которая разбирает аргументы, заданные в командной строке, и передает их функции server(). Сервер пассивно ожидает запроса на соединение и, получив его, отправляет в ответ строку Hello World. Он будет продолжать работать, пока не произойдет ошибка в функции server().
Написание эксплойтов и программ для проверки наличия уязвимостей
Освоившись с программированием на основе Winsock 2, можно приступать к написанию эксплойтов и программ для проверки наличия уязвимостей. При этом хорошо бы иметь в своем распоряжении набор протестированных функций, которые можно повторно использовать в разных проектах. Приведенный ниже «пустой» эксплойт состоит из двух файлов: empty.cpp è hack.h. Не все содержащиеся в них функции относятся к работе с сокетами, но так или иначе оказываются полезными при написании реальных эксплойтов или сканеров уязвимостей. Все функции, кроме одной, находятся в заголовочном файле hack.h, который включается в исходный текст реальных эксплойтов, приведенных далее в этой главе.
Пример 4.5. Функции в файле hack.h
1 #include <winsock2.h>
2
3#pragma comment(lib,"ws2_32.lib")
4#define STRING_MAX 65536
5 #define MAX |
8388608 |
6char *junk(char *input, int repeat)
7{
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
to |
|
|
|
216 Глава 4. Сокеты на платформе Windows (Winsock) |
|||
w Click |
|
|
|
|
|||||||
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
8 int maxSize; |
|||
|
|
|
df-xchan |
e |
|||||||
|
|
|
|
|
9char *junkString = new char[STRING_MAX];
10 strcpy(junkString, "");
11
12if( repeat < STRING_MAX && repeat > 0 && strlen(input) != 0
13&& strlen(input) <= (STRING_MAX – 1))
14{
15maxSize = (STRING_MAX – 1)/strlen(input);
16for(int count = 0; count < repeat
17 |
&& count < maxSize; count++) |
18{
19strcat(junkString, input);
20}
21}
22else
23{
24printf("Некорректные параметры! \n");
25strcpy(junkString,"—FAILURE—");
26}
27delete [] junkString;
28return (junkString);
29}
30bool is_up(char *targetip, int port)
31{
32WSADATA wsaData;
33WORD wVersionRequested;
34struct hostent target_ptr;
35struct sockaddr_in sock;
36SOCKET MySock;
37wVersionRequested = MAKEWORD(2, 2);
38if (WSAStartup(wVersionRequested, &wsaData) < 0)
39{
40printf("############ОШИБКА!####################\n");
41printf("Ваша версия ws2_32.dll слишком стара.\n");
42printf("Зайдите на сайт Microsoft и скачайте более свежую\n");
43printf("версию ws2_32.dll.\n");
44
45WSACleanup();
46return (FALSE);
47}
48MySock = socket(AF_INET, SOCK_STREAM, 0);
49if(MySock==INVALID_SOCKET)
50{
51printf("Ошибка при создании сокета!\r\n");
52closesocket(MySock);
53WSACleanup();
54return (FALSE);
55}
56 if ((pTarget = gethostbyname(targetip)) == NULL)
|
|
|
|
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 |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
e |
|
|
|
|
|
|
df-xchan57 |
|
|
|||||
|
|
|
|
|
|
58 |
|
|
||
|
|
|
|
|
|
59 |
|
|
{
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Написание эксплойтов и программ для проверки наличия уязвимостей 217 |
|
to |
|
|
|
|
|
|||
|
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
printf("\nНе удалось разрешить имя %s, попробуйте еще раз.\n.\n",
targetip);
60closesocket(MySock);
61WSACleanup();
62return (FALSE);
63}
64memcpy(&sock.sin_addr.s_addr, pTarget->h_addr, pTarget->h_length);
65sock.sin_family = AF_INET;
66sock.sin_port = htons((USHORT)port);
67if ( (connect(MySock, (struct sockaddr *)&sock, sizeof (sock) )))
68{
69closesocket(MySock);
70WSACleanup();
71
72return (FALSE);
73}
74else
75{
76closesocket(MySock);
77WSACleanup();
78return (TRUE);
79}
80}
81bool is_string_in(char *needle, char *haystack)
82{
83char *loc = strstr(haystack, needle);
84if( loc != NULL )
85{
86return(TRUE);
87}
88else
89{
90return(FALSE);
91}
92}
93char *replace_string(char *new_str, char *old_str, char *whole_str)
94{
95int len = strlen(old_str);
96char buffer[MAX] = "";
97char *loc = strstr(whole_str, old_str);
98if(loc != NULL)
99{
100strncpy(buffer, whole_str, loc-whole_str );
101strcat(buffer, new_str);
102strcat(buffer, loc + (strlen(old_str)));
103strcpy(whole_str, buffer);
104}
|
|
|
|
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 |
|
|
218 Глава 4. Сокеты на платформе Windows (Winsock) |
|
|
|
|
to |
|
|
|
|
|
|
|||||
w Click |
|
|
|
w Click |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
m |
||||||||||||
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|
|||||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
|
. |
|
|
|
|
g |
.c |
|
|||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
e |
|
return whole_str; |
|
|
|
df-x chan |
e |
|
||||||||
|
|
|
df-xchan |
105 |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
106 |
} |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
107 char *send_exploit(char *targetip, int port, char *send_string) |
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
108 |
{ |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
109 |
WSADATA wsaData; |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
110 |
WORD wVersionRequested; |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
111 |
struct hostent target_ptr; |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
112 |
struct sockaddr_in sock; |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
113 |
SOCKET MySock; |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
114 |
wVersionRequested = MAKEWORD(2, 2); |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
115 |
if (WSAStartup(wVersionRequested, &wsaData) != 0) |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
116 |
{ |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
117 |
printf("############ОШИБКА!####################\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
118 |
printf("Ваша версия ws2_32.dll слишком стара.\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
119 |
printf("Зайдите на сайт Microsoft и скачайте более свежую\n"); |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
120 |
printf("версию ws2_32.dll.\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
121 |
WSACleanup(); |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
122 |
exit(1); |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
123 |
} |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
124 |
MySock = socket(AF_INET, SOCK_STREAM, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
125 |
if(MySock==INVALID_SOCKET) |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
126 |
{ |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
127 |
printf("Ошибка при создании сокета!\r\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
128 |
|
|
|
|
|
|
|
|
|
|
|
|
|
129closesocket(MySock);
130WSACleanup();
131exit(1);
132}
133if ((pTarget = gethostbyname(targetip)) == NULL)
134{
135printf("\nНе удалось разрешить имя %s, попробуйте еще раз.\n.\n",
targetip);
136
137closesocket(MySock);
138WSACleanup();
139exit(1);
140}
141memcpy(&sock.sin_addr.s_addr, pTarget->h_addr, pTarget->h_length);
142sock.sin_family = AF_INET;
143sock.sin_port = htons((USHORT)port);
144
145if ( (connect(MySock, (struct sockaddr *)&sock, sizeof (sock) )))
146{
147printf("Не удалось соединиться с хостом.\n");
148
149closesocket(MySock);
150WSACleanup();
151exit(1);
152 }
|
|
|
|
|
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 |
|
|
|
|
|
|
|
Написание эксплойтов и программ для проверки наличия уязвимостей 219 |
|
|
to |
|
|
|
|
|
|
|||||||
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
|
|
|
m |
|||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
|
|
.c |
|
|
|
. |
|
|
|
|
|
|
|
|
.c |
|
|||||
|
|
p |
d |
|
|
|
|
|
|
e |
|
|
char sendfile[STRING_MAX]; |
|
|
p |
d |
|
|
|
|
|
|
e |
|
||||
|
|
|
|
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
x cha |
g |
|
|
|
|||||||
|
|
|
|
f- |
xch153 |
|
|
|
|
|
|
f- |
|
|
|
|
|
||||||||||||
|
|
|
|
|
an |
|
|
|
|
|
|
|
|
|
|
|
|
n |
|
|
|
|
|||||||
|
|
|
|
|
|
|
154 |
|
strcpy(sendfile, send_string); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
155 |
|
if (send(MySock, sendfile, sizeof(sendfile)-1, 0) == -1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
156 |
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
157 |
|
|
printf("Ошибка при отправке пакета\r\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
158 |
|
|
closesocket(MySock); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
159 |
|
|
exit(1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
160 |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
161 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
162send(MySock, sendfile, sizeof(sendfile)-1, 0);
163char *recvString = new char[MAX];
164int nret;
165nret = recv(MySock, recvString, MAX + 1, 0);
166char *output= new char[nret];
167strcpy(output, "");
168if (nret == SOCKET_ERROR)
169{
170printf("Ошибка при попытке принять данные.\n");
171}
172else
173{
174strncat(output, recvString, nret);
175delete [ ] recvString;
176}
177closesocket(MySock);
178WSACleanup();
179return (output);
180delete [ ] output;
181}
182char *get_http(char *targetip, int port, char *file)
183{
184WSADATA wsaData;
185WORD wVersionRequested;
186struct hostent target_ptr;
187struct sockaddr_in sock;
188SOCKET MySock;
189
190wVersionRequested = MAKEWORD(2, 2);
191if (WSAStartup(wVersionRequested, &wsaData) < 0)
192{
193printf("############ОШИБКА!####################\n");
194printf("Ваша версия ws2_32.dll слишком стара.\n");
195printf("Зайдите на сайт Microsoft и скачайте более свежую\n");
196printf("версию ws2_32.dll.\n");
197
198WSACleanup();
199exit(1);
200}
201MySock = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
||
|
|
X |
|
|
|
|
|
|
|
||
|
- |
|
|
|
|
d |
|
|
|||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
to |
|
|
220 Глава 4. Сокеты на платформе Windows (Winsock) |
||||
w Click |
|
|
|
||||||||
|
|
|
|
||||||||
|
|
|
|
|
|
m |
|
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
e |
|
if(MySock==INVALID_SOCKET) |
||
|
|
|
df-xchan |
202 |
|||||||
|
|
|
|
|
|
|
|
203 |
{ |
204 printf("Ошибка при создании сокета!\r\n");
205
|
|
|
|
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 |
|
|
|
|
206closesocket(MySock);
207WSACleanup();
208exit(1);
209}
210if ((pTarget = gethostbyname(targetip)) == NULL)
211{
212printf("\nНе удалось разрешить имя %s, попробуйте еще раз.\n.\n",
targetip);
213
214closesocket(MySock);
215WSACleanup();
216exit(1);
217}
218memcpy(&sock.sin_addr.s_addr, pTarget->h_addr, pTarget->h_length);
219sock.sin_family = AF_INET;
220sock.sin_port = htons((USHORT)port);
221
222if ( (connect(MySock, (struct sockaddr *)&sock, sizeof (sock) )))
223{
224printf("Не удалось соединиться с хостом.\n");
225
226closesocket(MySock);
227WSACleanup();
228exit(1);
229}
230char sendfile[STRING_MAX];
231strcpy(sendfile, "GET ");
232strcat(sendfile, file);
233strcat(sendfile, " HTTP/1.1 \r\n" );
234strcat(sendfile, "Host: localhost\r\n\r\n");
235if (send(MySock, sendfile, sizeof(sendfile)-1, 0) == -1)
236{
237printf("Error sending Packet\r\n");
238closesocket(MySock);
239WSACleanup();
240exit(1);
241}
242send(MySock, sendfile, sizeof(sendfile)-1, 0);
243
244char *recvString = new char[MAX];
245int nret;
246nret = recv(MySock, recvString, MAX + 1, 0);
248char *output= new char[nret];
249strcpy(output, "");