it.c
上传用户:lylmjq
上传日期:2020-10-14
资源大小:4k
文件大小:5k
源码类别:

弱点检测代码

开发平台:

C/C++

  1. /*
  2.  * itunnel - an ICMP tunnel by edi / teso
  3.  * usage: it [-i id] [-s packetsize] host
  4.  * establishes   a   bidirectional   ICMP 
  5.  * 'connection' with 'host'  by listening 
  6.  * to  ICMP  packets with  a  specific id
  7.  * (default: 7530). uses stdin and stdout
  8.  * and needs to run as root.
  9.  *
  10.  */
  11. #include <stdio.h>
  12. #include <unistd.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <sys/types.h>
  16. #include <sys/time.h>
  17. #include <sys/socket.h>
  18. #include <netinet/in_systm.h>
  19. #include <netinet/in.h>
  20. #include <netinet/ip.h>
  21. #include <netinet/ip_icmp.h>
  22. #include <netinet/icmp6.h>
  23. #include <arpa/inet.h>
  24. #include <netdb.h>
  25. /* struct icmp
  26. {
  27. uint8_t type;
  28. uint8_t code;
  29. uint16_t cksum;
  30. uint16_t id;
  31. uint16_t seq;
  32. }; */
  33. typedef uint16_t u_int16_t
  34. struct icmp {
  35.         u_char  type;              /* type of message, see below */
  36.         u_char  code;              /* type sub code */
  37.         u_short cksum;             /* ones complement cksum of struct */
  38.         union {
  39.                 u_char ih_pptr;                 /* ICMP_PARAMPROB */
  40.                 struct in_addr ih_gwaddr;       /* ICMP_REDIRECT */
  41.                 struct ih_idseq {
  42.                         n_short icd_id;
  43.                         n_short icd_seq;
  44.                 } ih_idseq;
  45.                 struct ih_pmtu {
  46.                    u_short  ih_unused;
  47.                    u_short  ih_next_hop_mtu;
  48.                 }ih_mtu;
  49.                 int ih_void;
  50.         } icmp_hun;
  51. /* u_short in_cksum(u_short *, int); */
  52. /* u_short in_cksum(u_short , int);  */
  53. /* icmp_tunnel - does the ICMP tunneling :-)
  54. int sock - ICMP socket used to communicate
  55. struct sockaddr_in *target - other side
  56. int infd - input
  57. int outfd - output
  58. int packetsize - ...
  59. uint16_t id - ...
  60. */
  61. int icmp_tunnel(int sock, struct sockaddr_in *target, int infd, int outfd, int packetsize, uint16 id) {
  62. char* packet;
  63. struct icmp *icmp, *icmpr;
  64. int len;
  65. int result;
  66. fd_set fs;
  67. struct sockaddr_in from;
  68. int fromlen;
  69. int num;
  70. len = sizeof (struct icmp);
  71. packet = malloc (len+packetsize);
  72. memset (packet, 0, len+packetsize);
  73. icmp = (struct icmp*)(packet);
  74. icmpr = (struct icmp*)(packet+sizeof(struct ip));
  75. while (1) {
  76. FD_ZERO (&fs);
  77. FD_SET (infd, &fs);
  78. FD_SET (sock, &fs);
  79. select (infd>sock?infd+1:sock+1, &fs, NULL, NULL, NULL);
  80. if (FD_ISSET (infd, &fs)) {
  81. result = read (infd, packet+len, packetsize);
  82. if (!result) {
  83. return 0;
  84. } else if (result==-1) {
  85. perror ("read");
  86. return -1;
  87. }
  88. icmp->type = 0;
  89. icmp->code = 0;
  90. icmp->id = id;
  91. icmp->seq = 0;
  92. icmp->cksum = 0;
  93. icmp->cksum = in_cksum((u_short*)packet, len+result);
  94. result = sendto (sock, (char*)packet, len+result, 0, (struct sockaddr*)target, sizeof (struct sockaddr_in));
  95. if (result==-1) {
  96. perror ("sendto");
  97. return -1;
  98. }
  99. }
  100. if (FD_ISSET (sock, &fs)) {
  101. fromlen = sizeof (struct sockaddr_in);
  102. num = recvfrom (sock, packet, len+packetsize, 0, (struct sockaddr*)&from, &fromlen);
  103. if (icmpr->id == id) {
  104. write (outfd, packet+sizeof(struct ip)+sizeof(struct icmp), num-sizeof(struct ip)-sizeof(struct icmp));
  105. }
  106. }
  107. }
  108. return 0;
  109. }
  110. int main (int argc, char** argv) {
  111. struct sockaddr_in target;
  112. int s;
  113. int packetsize = 100;
  114. char* desthost = NULL;
  115. uint16_t id = 7530;
  116. argv++;
  117. argc--;
  118. while (argc--) {
  119. if (!strcmp(*argv, "-i")) {
  120. if (!argc--) {
  121. fprintf (stderr, "need argumentn");
  122. return -1;
  123. }
  124. argv++;
  125. id = atoi(*argv++);
  126. } else if (!strcmp(*argv, "-s")) {
  127. if (!argc--) {
  128. fprintf (stderr, "need argumentn");
  129. return -1;
  130. }
  131. argv++;
  132. packetsize = atoi(*argv++);
  133. } else desthost = *argv++;
  134. }
  135. if (!desthost) {
  136. fprintf (stderr, "no destinationn");
  137. return -1;
  138. }
  139. if ((target.sin_addr.s_addr = inet_addr (desthost)) == -1) {
  140. struct hostent* he;
  141. if (!(he = gethostbyname (desthost))) {
  142. herror ("gethostbyname");
  143. return -1;
  144. }
  145. memcpy (&target.sin_addr.s_addr, he->h_addr, he->h_length);
  146. }
  147. target.sin_family = AF_INET;
  148. if ( (s = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP)) == -1) {
  149. perror ("socket");
  150. return -1;
  151. }
  152. icmp_tunnel(s, &target, STDIN_FILENO, STDOUT_FILENO, packetsize, id);
  153. close(s);
  154. return 0;
  155. }
  156. unsigned short
  157. /* u_short in_cksum(u_short , int);  */
  158. in_cksum (u_short *addr, int len)
  159.      u_short *addr;
  160.      int len;
  161. {
  162.   register int nleft = len;
  163.   register u_short *w = addr;
  164.   register int sum = 0;
  165.   u_short answer = 0;
  166.   while (nleft > 1) { sum += *w++; nleft -= 2; }
  167.   if (nleft == 1) { *(u_char *) (&answer) = *(u_char *) w; sum += answer; }
  168.   sum = (sum >> 16) + (sum & 0xffff);   /* add hi 16 to low 16 */
  169.   sum += (sum >> 16);           /* add carry */
  170.   answer = ~sum;                /* truncate to 16 bits */
  171.   return (answer);
  172. }