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

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

 

 

 

 

 

 

Программирование серверных приложений 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, "");