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

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

 

 

 

 

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(). Второй – это указа-

тель на беззнаковое целое, в которое будет помещен номер идентифи-

190 Глава 3. BSD сокеты

 

 

 

 

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().