книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_
.pdf
|
|
|
|
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-xchan61 |
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Сканирование сети с помощью ТСР сокетов 181 |
|
to |
|
|
|
|
|
|||
|
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
62for(y=0; y < 16; ++y)
63{
64printf("%c", isprint(tmp[y])? tmp[y] : '.');
66}
67printf("\n");
68}
69}
70
71if((x % 16) != 0)
72{
73for(y=0; y < (x % 16); ++y)
74{
75printf("%02X ", tmp[y] & 0xFF);
76}
77
78 for(y=(x % 16); y < 16 ; ++y)
79{
80printf(" ");
81}
82
83for(y=0; y < (x % 16); ++y)
84{
85printf("%c", isprint(tmp[y]) ? tmp[y] : '.');
86}
87}
88
89 printf("\n\n");
90}
91
92/*
93 * rpcidport()
94*
95*
96*/
98 |
#define RPC1_ID_HEAD "\x80\x00\x00\x28\x00\x00\x00\x12" \ |
99 |
"\x00\x00\x00\x00\x00\x00\x00\x02" |
100 |
#define RPC1_ID_TAIL "\x00\x00\x00\x00\x00\x00\x00\x00" \ |
101 |
"\x00\x00\x00\x00\x00\x00\x00\x00" \ |
102 |
"\x00\x00\x00\x00\x00\x00\x00\x00" |
103 |
|
104 |
int rpcidport (int sock, unsigned int *id, int verb) |
105{
106unsigned int cur = 0;
107char buf[RPC1_BUF_SIZE];
108int hlen = sizeof(RPC1_ID_HEAD) – 1;
109int tlen = sizeof(RPC1_ID_TAIL) – 1;
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
||
|
|
X |
|
|
|
|
|
|
|
|
||
|
- |
|
|
|
|
d |
|
|
|
|||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
||
P |
|
|
|
|
|
NOW! |
o |
|
|
|||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|
|||
|
|
|
|
to |
|
|
182 |
Глава 3. BSD сокеты |
||||
w Click |
|
|
|
|||||||||
|
|
|
|
|||||||||
|
|
|
|
|
|
m |
|
|
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
e |
|
int clen = sizeof(unsigned int); |
|||
|
|
|
df-xchan |
110 |
||||||||
|
|
|
|
|
|
|
|
111 |
int len |
= hlen + clen + tlen; |
||
|
|
|
|
|
|
|
|
112 |
int ret |
= 0; |
||
|
|
|
|
|
|
|
|
113 |
int x |
= 0; |
||
|
|
|
|
|
|
|
|
114 |
|
|
115for(x=0; progid[x] != 0x00000000; ++x)
116{
117cur = htonl(progid[x]);
118
119 memset(buf, 0x00, RPC1_BUF_SIZE);
120
121memcpy(buf, RPC1_ID_HEAD, hlen);
122memcpy(buf + hlen, &cur, clen);
123memcpy(buf + hlen + clen, RPC1_ID_TAIL, tlen);
125ret = send(sock, buf, len, 0);
126if(ret != len)
127{
128if(verb)
129{
130printf("ошибка send().\n");
131}
132return(-1);
133}
134
135ret = recv(sock, buf, RPC1_BUF_SIZE, 0);
136if(ret >= 28)
137{
138if(buf[0x04] == 0x00 &&
139buf[0x05] == 0x00 &&
140buf[0x06] == 0x00 &&
141buf[0x07] == 0x12 &&
142buf[0x0B] == 0x01 &&
143buf[0x1B] != 0x01)
144{
145*id = progid[x];
146return(0);
147}
148}
149else
150{
151// неожиданный ответ, вероятно, не RPC-программа
152// выходим из функции...
153return(0);
154}
155}
156
157return(0);
158}
|
|
|
|
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 |
|
|
xch159 |
|
|
||||||
|
|
|
|
f- |
|
an |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Сканирование сети с помощью ТСР сокетов 183 |
|
to |
|
|
|
|
|
|||
|
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
160/*
161* makesock()
162*
163*
164*/
165int makesock(unsigned int taddr, unsigned short port,
166unsigned int cto_sec, long rto_sec, int verb)
167{
168struct sockaddr_in sin;
169struct timeval tv;
170int sock = 0;
171int ret = 0;
172
173sock = socket(AF_INET, SOCK_STREAM, 0);
174if(sock < 0)
175{
176if(verb)
177{
178printf("ошибка socket().\n");
179}
180return(-1);
181}
182
183 |
memset(&sin, 0x00, sizeof(sin)); |
||
184 |
|
|
|
185 |
sin.sin_family |
= |
AF_INET; |
186 |
sin.sin_port |
= |
htons(port); |
187 |
sin.sin_addr.s_addr = |
taddr; |
|
188 |
|
|
|
189alarm(cto_sec);
190ret = connect(sock, (struct sockaddr *) &sin, sizeof(sin));
191alarm(0);
192if(ret < 0)
193{
194close (sock);
195if(verb)
196{
197printf("ошибка connect () %d.%d.%d.%d:%d.\n",
198(taddr >> 0x00) & 0xFF, (taddr >> 0x08) & 0xFF,
199(taddr >> 0x10) & 0xFF, (taddr >> 0x18) & 0xFF,
200port);
201}
202return(-1);
203}
204
205 memset(&tv, 0x00, sizeof(tv));
206
207 tv.tv_sec = rto_sec;
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
||
|
|
X |
|
|
|
|
|
|
|
||
|
- |
|
|
|
|
d |
|
|
|||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
to |
|
|
184 |
Глава 3. BSD сокеты |
|||
w Click |
|
|
|
||||||||
|
|
|
|
||||||||
|
|
|
|
|
|
m |
|
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
e |
|
|
||
|
|
|
df-xchan |
208 |
|
||||||
|
|
|
|
|
|
|
|
209 ret = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, |
|||
|
|
|
|
|
|
|
|
210 |
sizeof(tv)); |
211if(ret < 0)
212{
213close(sock);
214if(verb)
215{
216printf("ошибка setsockopt().\n");
217}
218return(-1);
219}
220
221return(sock);
222}
223
224/*
225* rpcid()
226*
227*
228*/
229int rpcid (unsigned int taddr, unsigned short port,
230unsigned int cto_sec, long rto_sec, int verb)
231{
232unsigned int id = 0;
233int sock = 0;
234int ret = 0;
235
236sock = makesock(taddr, port, cto_sec, rto_sec, verb);
237if(sock < 0)
238{
239if(verb)
240{
241printf("ошибка makesock ().\n");
242}
243return(0);
244}
245
246ret = rpcidport(sock, &id, verb);
247if(ret < 0)
248{
249close(sock);
250if(verb)
251{
252printf("ошибка rpcidport() @ %d.%d.%d.%d:%d\n",
253(taddr >> 0x00) & 0xFF, (taddr >> 0x08) & 0xFF,
254(taddr >> 0x10) & 0xFF, (taddr >> 0x18) & 0xFF,
255port);
256}
|
|
|
|
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 |
|
|
xch257 |
|
|
||||||
|
|
|
|
f- |
|
an |
|
|
|
|
|
return(0);
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Сканирование сети с помощью ТСР сокетов 185 |
|
to |
|
|
|
|
|
|||
|
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
258 }
259
260 close(sock);
261
262if(id != 0)
263{
264printf("RPC %d [%08X] @ %d.%d.%d.%d:%d\n", id, id,
265(taddr >> 0x00) & 0xFF, (taddr >> 0x08) & 0xFF,
266(taddr >> 0x10) & 0xFF, (taddr >> 0x18) & 0xFF,
267port);
268}
269
270return(0);
271}
272
273/*
274* scan()
275*
276*
277*/
278int scan (char *targ, unsigned short lport,
279unsigned short hport, unsigned int cto_sec,
280long rto_sec, int verb)
281{
282unsigned int taddr = 0;
283int ret = 0;
284
285taddr = inet_addr(targ);
286if(taddr == INADDR_NONE)
287{
288if(verb)
289{
290printf("ошибка inet_addr().\n");
291}
292return(-1);
293}
294
295while(lport <= hport)
296{
297ret = rpcid(taddr, lport, cto_sec, rto_sec, verb);
298if(ret < 0)
299{
300if(verb)
301{
302printf("rpcid() failed.\n");
303}
304return(-1);
305}
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||
|
|
X |
|
|
|
|
|
|
||
|
- |
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
186 Глава 3. BSD сокеты |
|||
w Click |
|
|
|
|||||||
|
|
|
|
|||||||
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
e |
|
||
|
|
|
df-xchan |
306 |
307++lport;
308}
309
310return(0);
311}
312
313/*
314* parse()
315*
316*
317*/
318int parse (char *sprt, unsigned short *lport,
319unsigned short *hport)
320{
321char *tmp = NULL;
322
323tmp = (char *) strchr(sprt, '-');
324if(tmp == NULL)
325{
326*hport =
327*lport = (unsigned short) atoi(sprt);
328}
329else
330{
331*tmp = '\0';
332*lport = (unsigned short) atoi(sprt);
333++tmp;
334*hport = (unsigned short) atoi(tmp );
335}
336
337if(*lport == 0 ||
338*hport == 0 ||
339(*lport > *hport))
340{
341return(-1);
342}
343
344return(0);
345}
346
347/*
348* sighandler()
349*
350*
351*/
352void sighandler (int sig)
353{
354}
|
|
|
|
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 |
|
|
xch355 |
|
|
||||||
|
|
|
|
f- |
|
an |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Сканирование сети с помощью ТСР сокетов 187 |
|
to |
|
|
|
|
|
|||
|
|
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
356/*
357* usage()
358*
359*
360*/
361void usage(char *prog)
362{
363printf("rpc1 00.00.01\n");
364printf("usage: %s -t target_ip -p port_range\n", prog);
365printf("пример: %s -t 127.0.0.1 -p 1-1024\n\n" , prog);
366}
367
368int
369main(int argc, char *argv[])
370{
371unsigned short lport = 0;
372unsigned short hport = 0;
373unsigned int cto_sec = RPC1_DEF_CTO_SEC;
374 |
char |
*targ |
= NULL; |
|
375 |
char |
*sprt |
= NULL; |
|
376 |
char |
*tmp |
= NULL; |
|
377 |
char |
ch |
= |
0; |
378 |
long |
rto_sec = |
RPC1_DEF_RTO_SEC; |
|
379 |
int |
verb |
= |
0; |
380 |
int |
ret |
= |
0; |
381 |
|
|
|
|
382signal(SIGALRM, sighandler);
383signal(SIGPIPE, sighandler);
385opterr = 0;
386while((ch = getopt(argc, argv, "t:p:c:r:v")) != -1)
387{
388switch(ch)
389{
390case 't':
391targ = optarg;
392break;
393case 'p':
394sprt = optarg;
395break;
396case 'c':
397cto_sec = (unsigned int) atoi(optarg);
398break;
399case 'r':
400rto_sec = (long) atoi(optarg);
401break;
402case 'v':
403verb = 1;
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
||
|
|
X |
|
|
|
|
|
|
|
||
|
- |
|
|
|
|
d |
|
|
|||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
to |
|
|
188 |
Глава 3. BSD сокеты |
|||
w Click |
|
|
|
||||||||
|
|
|
|
||||||||
|
|
|
|
|
|
m |
|
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
e |
|
break; |
||
|
|
|
df-xchan |
404 |
|||||||
|
|
|
|
|
|
|
|
405 |
case '?': |
||
|
|
|
|
|
|
|
|
406 |
default: |
||
|
|
|
|
|
|
|
|
407 |
usage(argv[0]); |
||
|
|
|
|
|
|
|
|
408 |
return(1); |
||
|
|
|
|
|
|
|
|
409 |
} |
||
|
|
|
|
|
|
|
|
410 |
} |
||
|
|
|
|
|
|
|
|
411 |
|
412if(targ == NULL ||
413sprt == NULL)
414{
415usage(argv[0]);
416return(1);
417}
418
419ret = parse(sprt, &lport, &hport);
420if(ret < 0)
421{
422printf("ошибка parse().\n");
423return(1);
424}
425
426printf("\nзадано: цель: %s; lport: %d; hport: %d\n\n",
427targ, lport, hport);
428
429ret = scan(targ, lport, hport, cto_sec, rto_sec, verb);
430if(ret < 0)
431{
432printf("ошибка scan().\n");
433return(1);
434}
435
436 printf("сканирование завершено.\n");
437
438return(0);
439}
Компиляция
obsd32# gcc -o rpc1 rpc1.c
Пример исполнения
obsd32# ./rpc1 rpc1 00.00.01
usage: ./rpc1 -t target_ip -p port_range пример: ./rpc1 -t 127.0.0.1 -p 1-1024
|
|
|
|
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 |
|
|
|
|
obsd32# ./rpc1 -t 10.0.8.16 -p 32770-32780
|
|
|
|
|
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 |
|
|
|
|
|
|
Сканирование сети с помощью ТСР сокетов 189 |
|
|
to |
|
|
|
|
|
|
|||||
w Click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
|
|
m |
|||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
g |
.c |
|
|
|
. |
|
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
öåëü: 10.0.8.16 lport: 32770l hport: 32780 |
|
|
p |
|
f-x cha |
|
|
|
|||||||
|
|
|
|
f-xchзадано:a |
|
|
|
|
|
e |
|
|||||||||||||||
|
|
|
d |
|
|
|
n |
e |
|
|
|
|
|
d |
|
|
|
n |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RPC 100024 [00186B8] @ 10.0.8.16:32771 RPC 100024 [00186A2] @ 10.0.8.16:32772 RPC 100024 [001877D] @ 10.0.8.16:32773 RPC 100024 [00186F3] @ 10.0.8.16:32775 RPC 100024 [0049636] @ 10.0.8.16:32776 RPC 100024 [0018799] @ 10.0.8.16:32775 сканирование завершено.
Программа rpc1.c принимает IP-адрес целевого хоста, начальный и конеч- ный номера портов, величину таймаута connect() в секундах, величину таймаута recv() и флаг выдачи подробной диагностики. В процессе работы она пытается открыть TCP-порты из заданного диапазона. Для каждого обнаруженного открытого порта выполняется операция RPC с целью определить номер программы. Если это удается, то номер порта и соответствующий ему номер программы выводятся на стандартный вывод.
Анализ
В строках 9–15 включаются необходимые заголовочные файлы.
В строках 17–19 определяются несколько констант. Константа RPC1_CTO_TO задает величину таймаута connect() в секундах, а константа RPC1_RTO_TO – величину таймаута recv(), тоже в секундах.
В строках 24–27 объявлен массив беззнаковых целых чисел. Это номера известных RPC-программ, которые мы пытаемся обнаружить. Каждый из этих номеров последовательно посылается службе RPC. Если какойлибо из номеров совпадет с зарегистрированным в этой службе, можно считать, что программа идентифицирована. Для увеличения числа идентифицируемых программ следует добавить их номера в этот массив.
В строках 44–89 определена функция hexdisp(), которая принимает два параметра: указатель на массив символов и длину этого массива в байтах. Эта функция форматирует находящиеся в указанном массиве символы, представляя их в читаемом виде, и выводит результат на печать. Формат аналогичен принятому в программе tcpdump, когда она вызывается с флагом –X.
В строках 97–101 определены фрагменты RPC-запроса. Впоследствии значение RPC1_ID_HEAD будет помещено в начало буфера сообщения, за ним – 4-байтовое беззнаковое целое, содержащее номер программы, и в конце – значение RPC1_ID_TAIL. В совокупности эти три части составляют полный RPC-запрос.
В строках 103–157 определяется функция rpcidport(), которая принимает три параметра. Первый – это дескриптор сокета, предварительно соединенного с целевым портом функцией connect(). Второй – это указа-
тель на беззнаковое целое, в которое будет помещен номер идентифи-
|
|
|
|
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 |
|
||
цированной RPC-программы. Третий параметр – целое число, говоря--x cha |
g |
|
|
|||||||
|
|
p |
|
|
|
|
|
|
||
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
|
|
|
|
щее о том, должна ли функция rpcidport() печатать сообщения об ошибках. Функция в цикле перебирает все номера программ, хранящиеся в массиве progid, который был объявлен в строке 24. Для каждого номера из констант RPC1_ID_HEAD, RPC1_ID_TAIL и номера программы строится RPC-запрос. В строке 124 этот запрос отправляется в целевой порт функцией send(). В строке 134 функция recv() читает ответ. Если длина ответа не менее 28 байтов, то он заслуживает рассмотрения. В строках 137–142 анализируются 6 байтов ответа, чтобы понять, содержал ли посланный запрос корректный номер RPC-программы. Если это так, то номер помещается в переменную id и функция возвращает управление.
В строках 164–221 определяется функция makesock(). Она преобразует заданный IP-адрес из точечно-десятичной нотации в беззнаковое целое число. Затем с помощью функции socket() создается сокет, пригодный для отправки и приема данных по протоколу TCP. Полученный сокет соединяется с целевым IP-адресом и портом с помощью функции connect(). Если все операции завершились успешно, то makesock() возвращает корректный дескриптор сокета, в противном случае – отрицательное число.
В строках 228–270 определяется функция rpcid(). Она создает сокет с помощью makesock() и вызывает rpcidport(), чтобы идентифицировать программу, работающую на порту, с которым соединен сокет. Если программа опознана, то печатается IP-адрес, номер порта и номер этой программы. Первым параметром функции является IP-адрес целевого хоста, вторым – номер порта, третьим – величина таймаута connect(),
четвертым – величина таймаута recv(), а пятым – флаг, говорящий
о том, должна ли функция rpcid() печатать сообщения об ошибках.
В строках 277–310 определяется функция scan(), которая принимает шесть параметров. Первый – это IP-адрес целевого хоста, второй – номер порта, с которого начинать сканирование, третий – номер порта, на котором сканирование следует закончить. Четвертый и пятый параметр без изменения передаются функции rpcid(). Шестой параметр – это флаг, говорящий о том, должна ли функция scan() печатать сообщения об ошибках. Функция в цикле перебирает все TCP-порты в указанном диапазоне и для каждого порта вызывает rpcid(), чтобы проверить, работает ли на этом порту какая-нибудь RPC-программа.
В строках 317–344 определяется функция parse(). Она занимается разбором заданного в командной строке номера порта или диапазона номеров и записывает значения начального и конечного портов в два беззнаковых коротких целых числа. Для преобразования строкового номера порта число вызывается функция atoi().