dds.c
上传用户:zht1018
上传日期:2007-01-07
资源大小:29k
文件大小:13k
源码类别:

系统/网络安全

开发平台:

Unix_Linux

  1. /*
  2.  * dds $Revision: 1.6 $ - a distributed DoS tool scanner
  3.  * 
  4.  * Based on the gag scanner, written by David Dittrich, University
  5.  * of Washington, Marcus Ranum, Network Flight Recorder, with
  6.  * code contributed by others, and based on an idea stolen from
  7.  * George Weaver, Pennsylvania State University.
  8.  * 
  9.  * Dave Dittrich <dittrich@cac.washington.edu>
  10.  * Marcus Ranum <mjr@nfr.net>
  11.  * George Weaver <gmw@psu.edu>
  12.  * David Brumley <dbrumley@rtfm.stanford.edu>
  13.  */
  14. #if YOU_HAVE_NOT_READ_THIS_YET
  15. This software should only be used in compliance with all applicable laws and
  16. the policies and preferences of the owners of any networks, systems, or hosts
  17. scanned with the software
  18. The developers and licensors of the software provide the software on an "as
  19. is" basis, excluding all express or implied warranties, and will not be liable
  20. for any damages arising out of or relating to use of the software.
  21. THIS SOFTWARE IS MADE AVAILABLE "AS IS", AND THE UNIVERSITY OF WASHINGTON
  22. DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO THIS SOFTWARE,
  23. INCLUDING WITHOUT LIMITATION ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  24. FITNESS FOR A PARTICULAR PURPOSE, AND IN NO EVENT SHALL THE UNIVERSITY OF
  25. WASHINGTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
  26. DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  27. ACTION OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING
  28. OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  
  29. #endif
  30. #define VERSION "$Revision: 1.6 $"
  31. #include <stdlib.h>
  32. #include <ctype.h>
  33. #include <signal.h>
  34. #include <stdio.h>
  35. #include <string.h>
  36. #include <unistd.h>
  37. #include <fcntl.h>
  38. #include <sys/types.h>
  39. #include <sys/time.h>
  40. #include <sys/wait.h>
  41. #include <sys/socket.h>
  42. #include <netinet/in.h>
  43. #include <netinet/in_systm.h>
  44. #include <netinet/ip.h>
  45. #include <netinet/udp.h>
  46. #include <netdb.h>
  47. #include <arpa/inet.h>
  48. #include <netinet/ip_icmp.h>
  49. #define BS 1024
  50. #define __FAVOR_BSD
  51. /* The two arrays below are for address range calculations.  They
  52.    should have been automatically generated, but
  53.    1) I am lazy.
  54.    2) There are a few special cases in them.
  55.    I will not scan more than a /16.  When we do scan a CIDR block, we
  56.    assume that it actually is a CIDR block, and do not scan the
  57.    network or broadcast address.
  58.    */
  59. static unsigned long MaskBits[] = {
  60.   0x00000000, /* /0 */
  61.   0x00000000, /* /1 */
  62.   0x00000000, /* /2 */
  63.   0x00000000, /* /3 */
  64.   0x00000000, /* /4 */
  65.   0x00000000, /* /5 */
  66.   0x00000000, /* /6 */
  67.   0x00000000, /* /7 */
  68.   0x00000000, /* /8 */
  69.   0x00000000, /* /9 */
  70.   0x00000000, /* /10 */
  71.   0x00000000, /* /11 */
  72.   0x00000000, /* /12 */
  73.   0x00000000, /* /13 */
  74.   0x00000000, /* /14 */
  75.   0x00000000, /* /15 */
  76.   0xffff0000, /* /16, Class B */
  77.   0xffff8000, /* /17, 128 * Class C */
  78.   0xffffc000, /* /18, 64 * Class C */
  79.   0xffffe000, /* /19, 32 * Class C */
  80.   0xfffff000, /* /20, 16 * Class C */
  81.   0xfffff800, /* /21, 8 * Class C */
  82.   0xfffffc00, /* /22, 4 * Class C */
  83.   0xfffffe00, /* /23, 2* Class C */
  84.   0xffffff00, /* /24, Class C */
  85.   0xffffff80, /* /25, 128 hosts */
  86.   0xffffffc0, /* /26, 64 hosts */
  87.   0xffffffe0, /* /27, 32 hosts */
  88.   0xfffffff0, /* /28, 16 hosts */
  89.   0xfffffff8, /* /29, 8 hosts */
  90.   0xfffffffc, /* /30, 4 hosts (PPP link) */
  91.   0xfffffffe, /* /31, invalid */
  92.   0xffffffff, /* /32, host */
  93. };
  94. static int NumHosts[] = {
  95.   0, 0, 0, 0,
  96.   0, 0, 0, 0,
  97.   0, 0, 0, 0,
  98.   0, 0, 0, 0, /* don't scan more than a /16 */
  99.   65534, /* These are all -2 so that we don't
  100.    scan the broadcast addr or the
  101.    network addr */
  102.   32766,
  103.   16382,
  104.   8190,
  105.   4094,
  106.   2046,
  107.   1022,
  108.   510,
  109.   254,
  110.   126,
  111.   62,
  112.   30,
  113.   14,
  114.   6,
  115.   2,
  116.   0,
  117.   1,
  118. };
  119. extern char *optarg;
  120. struct icmppkt_t {
  121. struct ip ipi;
  122. struct icmp icmpi;
  123. char buffer[BS];
  124. } icmppkt;
  125. struct udppkt_t {
  126. struct ip ipi;
  127. struct udphdr udpi;
  128. char buffer[BS];
  129. } udppkt;
  130. static unsigned short ip_sum(u_short *,int);
  131. static void listener();
  132. static int usage();
  133. static int vflg = 0; /* verbosity */
  134. static int dflg = 0; /* debugging */
  135. /* stacheldraht variables */
  136. static int stach_test = 668; /* sends test */
  137. static int stach_echo = 669; /* gets reply "sicken" */
  138. char stach_gagstr[] = "gesundheit!";
  139. char  stach_echostr[] = "sicken";
  140. /* trinoo variables */
  141. static short trinoo_dstport = 27444; /* handler listen port */
  142. static short trinoo_rctport = 31335; /* agent listen port */
  143. char  trinoo_scmd[] = "png";
  144. char  trinoo_spass[] = "l44adsl";
  145. char  trinoo_echostr[] = "PONG";
  146. /* TFN variables */
  147. u_short tfn_test = 789;
  148. u_short tfn_reply = 123;
  149. int 
  150. main(int argc, char **argv)
  151. {
  152. int             pid, host;
  153. char            target[128];
  154. unsigned long target_host;
  155. struct in_addr  target_ip;
  156. int mask;
  157. char * mask_ptr;
  158. int result;
  159. int isock, usock;
  160. char            buf[BS];
  161. struct icmp    *icmpi = (struct icmp *)buf;
  162. struct sockaddr_in
  163. isa,usa;
  164. int             i;
  165. char *jnk1;
  166. char *jnk2;
  167. int sleepytime = 500;
  168. int bigsleep = 30;
  169. int num_hosts;
  170. char scmd[BS], spass[BS], sbuf[BS];
  171. while((i = getopt(argc,argv,"ds:S:v")) != -1) {
  172. switch(i) {
  173. case 'd':
  174. dflg++;
  175. break;
  176. case 's':
  177. sleepytime = atoi(optarg);
  178. if(sleepytime <= 0) {
  179. fprintf(stderr,"WARNING: zero interping sleep time will probably overflow your system's transmit buffers and yield poor resultsn");
  180. sleepytime = 1;
  181. }
  182. break;
  183. case 'S':
  184. bigsleep = atoi(optarg);
  185. if(bigsleep <= 0) {
  186. fprintf(stderr,"WARNING: negative sleep value - staying with default of %dn", bigsleep);
  187. }
  188. break;
  189. case 'v':
  190. vflg++;
  191. break;
  192. default:
  193. exit(usage());
  194. }
  195. }
  196. if(optind >= argc || argc - optind > 1)
  197. exit(usage());
  198. mask_ptr = strchr(argv[optind], '/');
  199. /* if a CIDR block is passed in */
  200. if (mask_ptr) {
  201.   *mask_ptr = '';
  202.   mask_ptr ++;
  203.   
  204.   sscanf(mask_ptr, "%d", &mask);
  205.   
  206. } else {
  207.   printf("No mask passed, assuming host scan (/32)n");
  208.   mask = 32;
  209. }
  210.  
  211. result = inet_aton(argv[optind], &target_ip);
  212. if (result == 0) {
  213.   fprintf(stderr, "%s: Bad IP address: %sn", argv[0],
  214.   argv[optind]);
  215.   exit(-1);
  216. }
  217. if (mask < 16) {
  218.   fprintf(stderr, "Bad Network Admin!  Bad!  Do not scan more than a /16 at once!n");
  219.   exit(-1);
  220. }
  221. num_hosts = NumHosts[mask];
  222. if (num_hosts == 0) {
  223.   fprintf(stderr, "Cannot scan a /%d.  Exiting...n", mask);
  224.   exit(-1);
  225. }
  226. if(vflg) {
  227.   printf("Mask: %dn", mask);
  228.   printf("Target: %sn", inet_ntoa(target_ip));
  229.   printf("dds %s - scanning...nn", VERSION);
  230. }
  231. sprintf(sbuf,"%s %s",trinoo_scmd,trinoo_spass);
  232. target_host = ntohl(target_ip.s_addr);
  233. target_host &= MaskBits[mask];
  234. target_ip.s_addr = htonl(target_host);
  235. if((pid = fork()) < 0) {
  236. perror("cannot fork");
  237. exit(1);
  238. }
  239. /* child side listens for return packets */
  240. if (pid == 0)
  241. listener();
  242. sleep(1);
  243. /* let's see if we can open a raw ICMP socket */
  244. if((isock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
  245. perror("cannot open raw ICMP socket");
  246. exit(1);
  247. }
  248. /* main ping loop - COULD be expanded to whole Internet but... */
  249. /* but that would be _very_ bad.... */
  250. while (num_hosts) {
  251.   if (mask != 32) {
  252.     target_host ++;
  253.   }
  254.   target_ip.s_addr = htonl(target_host);
  255.   num_hosts--;
  256.   if(vflg)
  257.     printf("Probing address %sn", inet_ntoa(target_ip));
  258.   
  259. bzero(buf, sizeof(struct icmp) +
  260. sizeof(stach_gagstr));
  261. memcpy(buf + sizeof(struct icmp), stach_gagstr,
  262. sizeof(stach_gagstr));
  263. /* stacheldraht check */
  264. icmpi->icmp_type = 0;
  265. icmpi->icmp_hun.ih_idseq.icd_id =
  266. htons(stach_test);
  267. icmpi->icmp_cksum = ip_sum((u_short *)icmpi,
  268. sizeof(struct icmp) + sizeof(stach_gagstr));
  269. bzero((char *) &isa, sizeof(isa));
  270. isa.sin_family = AF_INET;
  271. isa.sin_addr.s_addr = target_ip.s_addr;
  272. if(dflg)
  273. fprintf(stderr,"Sending ICMP to: %sn",
  274. inet_ntoa(isa.sin_addr));
  275. i = sendto(isock,buf,
  276. sizeof(struct icmp)+sizeof(stach_gagstr),0,
  277. (struct sockaddr *)&isa, sizeof(isa));
  278. if (i < 0) {
  279. char ebuf[BS];
  280. sprintf(ebuf,"sendto: icmp %s",
  281. inet_ntoa(isa.sin_addr));
  282. perror(ebuf);
  283. break;
  284. }
  285. /* tfn check */
  286. bzero(buf, sizeof(struct icmp) + sizeof(stach_gagstr));
  287. if(dflg)
  288. fprintf(stderr,"Sending tfn ICMP to: %sn",
  289. inet_ntoa(isa.sin_addr));
  290. icmpi->icmp_type = ICMP_ECHOREPLY;
  291. icmpi->icmp_code= icmpi->icmp_seq = 0;
  292. icmpi->icmp_id = htons(tfn_test);
  293. icmpi->icmp_cksum = ip_sum((u_short *)icmpi, 
  294. sizeof(struct icmp));
  295. i = sendto(isock, buf, sizeof(struct icmp), 0, 
  296.    (struct sockaddr *)&isa, sizeof(isa));
  297. if(i != sizeof(struct icmp)){
  298. perror("Error sending full tfn packetn");
  299. break;
  300. }
  301. /* trinoo check */
  302. bzero((char *) &usa, sizeof(usa));
  303. usa.sin_family = AF_INET;
  304. usa.sin_addr.s_addr = target_ip.s_addr;
  305. usa.sin_port = htons(trinoo_dstport);
  306. if (dflg)
  307. fprintf(stderr,"Sending UDP to: %sn",
  308. inet_ntoa(usa.sin_addr));
  309. if ((usock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  310. perror("cannot open UDP socket");
  311. exit(1);
  312. }
  313. i = sendto(usock,sbuf,strlen(sbuf), 0,
  314. (struct sockaddr *)&usa,
  315. sizeof(usa));
  316. if (i < 0) {
  317. char ebuf[BS];
  318. sprintf(ebuf,"sendto: udp %s",
  319. inet_ntoa(usa.sin_addr));
  320. perror(ebuf);
  321. break;
  322. }
  323. close(usock);
  324. usleep(sleepytime);
  325. }
  326. (void)close(isock);
  327. /* wait for any late responses */
  328. if (dflg)
  329. fprintf(stderr,"Waiting %d seconds for late responses.n",
  330. bigsleep);
  331. sleep(bigsleep);
  332. /* shut listener. if this fails the listener exits on its own */
  333. (void)kill(pid, SIGHUP);
  334. exit(0);
  335. }
  336. static void listener()
  337. {
  338. int             isock, usock;
  339. int             i, len;
  340. fd_set          fdset;
  341. char buf[BS];
  342. char rcmd[BS], filler[BS], rpass[BS];
  343. struct timeval  timi;
  344. struct icmppkt_t
  345. ipacket;
  346. struct udppkt_t
  347. upacket;
  348. struct sockaddr_in
  349. sa, from;
  350. /* child becomes a listener process */
  351. if ((isock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
  352. perror("cannot open raw ICMP socket");
  353. exit(1);
  354. }
  355. if ((usock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
  356. perror("cannot open raw UDP listen socket");
  357. exit(1);
  358. }
  359. bzero((char *) &sa, sizeof(sa));
  360. sa.sin_family = AF_INET;
  361. sa.sin_addr.s_addr = INADDR_ANY;
  362. sa.sin_port = htons(trinoo_rctport);
  363. if (bind(usock, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
  364. perror("cannot bind to socket");
  365. exit(-1);
  366. }
  367.   
  368. while (1) {
  369. /* if parent has exitted, die */
  370. if(getppid() == 1)
  371. exit(0);
  372. FD_ZERO(&fdset);
  373. FD_SET(isock, &fdset);
  374. FD_SET(usock, &fdset);
  375. timi.tv_sec = 1;
  376. timi.tv_usec = 0;
  377. select(FD_SETSIZE, &fdset, NULL, NULL, &timi);
  378. usleep(100);
  379. if (FD_ISSET(isock, &fdset)) {
  380. /* read data from ICMP listen socket */
  381. memset((void *) &ipacket, 0, sizeof(struct icmppkt_t));
  382. i = read (isock, (char *) &ipacket, BS) -
  383. (sizeof (struct ip) + sizeof (struct icmp));
  384. sa.sin_addr.s_addr = ipacket.ipi.ip_src.s_addr;
  385. if(dflg)
  386. fprintf(stderr,"Listener got an ICMP packetn");
  387. /* stacheldraht check */
  388. if ((ipacket.icmpi.icmp_type == ICMP_ECHOREPLY) &&
  389.      (ntohs(ipacket.icmpi.icmp_hun.ih_idseq.icd_id)
  390. == stach_echo)) {
  391. if (strstr(ipacket.buffer, stach_echostr)) {
  392. printf("Received '%s' from %s",
  393. stach_echostr,
  394. inet_ntoa(sa.sin_addr));
  395. printf(" - probable stacheldraht agentn");
  396. }
  397. else {
  398. printf("Unexpected ICMP packet from %sn",
  399. inet_ntoa(sa.sin_addr));
  400. }
  401. }
  402. /* TFN Check */
  403. if ((ipacket.icmpi.icmp_type == ICMP_ECHOREPLY) &&
  404.    (ntohs(ipacket.icmpi.icmp_hun.ih_idseq.icd_id) == 
  405. tfn_reply)) {
  406. printf("Received TFN Reply from %s",
  407.   inet_ntoa(sa.sin_addr));
  408. printf(" - probable tfn agentn");
  409. }
  410. }
  411. if (FD_ISSET (usock, &fdset)) {
  412. /* read data from UDP listen socket */
  413. memset((void *) &upacket, 0, sizeof(struct udppkt_t));
  414. len = sizeof(from);
  415. #if 1
  416. if ((i = recvfrom(usock, buf, BS, 0,
  417. (struct sockaddr *) &from, &len)) < 0) {
  418. perror("recvfrom");
  419. continue;
  420. }
  421. #else
  422. i = read (usock, (char *) buf, BS) -
  423. (sizeof (struct ip) + sizeof (struct udphdr));
  424. #endif
  425. sa.sin_addr.s_addr = upacket.ipi.ip_src.s_addr;
  426. if(dflg)
  427. fprintf(stderr,
  428. "Listener got a UDP packet on port %sn",
  429. trinoo_rctport);
  430. /* trinoo check */
  431. if (strstr(buf,trinoo_echostr)) { 
  432. printf("Received '%s' from %s",
  433. trinoo_echostr,
  434. inet_ntoa(from.sin_addr));
  435. printf(" - probable trinoo agentn");
  436. }
  437. else {
  438. printf("Unexpected UDP packet received on port %d from %sn",
  439. trinoo_rctport, inet_ntoa(from.sin_addr));
  440. }
  441. }
  442. }
  443. }
  444. /* standard IP checksum */
  445. static unsigned short
  446. ip_sum(u_short *addr, int len)
  447. {
  448. register int    nleft = len;
  449. register u_short *w = addr;
  450. register int    sum = 0;
  451. u_short         answer = 0;
  452. while (nleft > 1) {
  453. sum += *w++;
  454. nleft -= 2;
  455. }
  456. if (nleft == 1) {
  457. *(u_char *) (&answer) = *(u_char *) w;
  458. sum += answer;
  459. }
  460. sum = (sum >> 16) + (sum & 0xffff);
  461. sum += (sum >> 16);
  462. answer = ~sum;
  463. return (answer);
  464. }
  465. static int
  466. usage()
  467. {
  468. fprintf(stderr,"usage: dds [options] <target>n");
  469. fprintf(stderr,"target is CIDR block to scan in form:n");
  470. fprintf(stderr,"tA.B.C.D/maskn");
  471. fprintf(stderr,"Options:n");
  472. fprintf(stderr,"t[-v] turns on verbosityn");
  473. fprintf(stderr,"t[-d] turns on debuggingn");
  474. fprintf(stderr,"t[-s] interpacket sleep in microsecondsn");
  475. fprintf(stderr,"t[-S] delay for late packetsn");
  476. return(1);
  477. }