/src/strategies/mixed_strategy.c

https://github.com/seclab-ucr/INTANG · C · 238 lines · 160 code · 48 blank · 30 comment · 1 complexity · 40cd02abb923c81c49495cfabe541f5c MD5 · raw file

  1. /*
  2. * Strategy implementation
  3. * .setup function: Set up triggers, which listen to specific
  4. * incoming or outgoing packets, and bind
  5. * triggers to these events.
  6. * .teardown function: Unbind triggers.
  7. *
  8. */
  9. #include "mixed_strategy.h"
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <arpa/inet.h>
  14. #include <netinet/in.h>
  15. #include "globals.h"
  16. #include "socket.h"
  17. #include "protocol.h"
  18. #include "logging.h"
  19. #include "helper.h"
  20. static void send_fake_SYN(
  21. const char *src_ip, unsigned short src_port,
  22. const char *dst_ip, unsigned short dst_port,
  23. unsigned int seq_num)
  24. {
  25. char pkt[MAX_PACKET_SIZE];
  26. struct send_tcp_vars vars;
  27. memset(&vars, 0, sizeof vars);
  28. strncpy(vars.src_ip, src_ip, 16);
  29. strncpy(vars.dst_ip, dst_ip, 16);
  30. vars.src_port = src_port;
  31. vars.dst_port = dst_port;
  32. vars.flags = TCP_SYN;
  33. vars.seq_num = seq_num;
  34. vars.ack_num = 0;
  35. //vars.wrong_tcp_checksum = 1;
  36. // mss
  37. u_char bytes[4] = {0x02, 0x04, 0x05, 0xb4};
  38. memcpy(vars.tcp_opt, bytes, 4);
  39. vars.tcp_opt_len = 4;
  40. //dump_send_tcp_vars(&vars);
  41. send_tcp(&vars);
  42. }
  43. static void send_RST_super(
  44. const char *src_ip, unsigned short src_port,
  45. const char *dst_ip, unsigned short dst_port,
  46. unsigned int seq_num)//, unsigned char ttl)
  47. {
  48. char pkt[MAX_PACKET_SIZE];
  49. struct send_tcp_vars vars;
  50. //log_debug("size of vars: %ld", sizeof vars);
  51. memset(&vars, 0, sizeof vars);
  52. strncpy(vars.src_ip, src_ip, 16);
  53. strncpy(vars.dst_ip, dst_ip, 16);
  54. vars.src_port = src_port;
  55. vars.dst_port = dst_port;
  56. vars.flags = TCP_RST | TCP_ACK;
  57. vars.seq_num = seq_num;
  58. vars.ack_num = 0;
  59. //vars.wrong_tcp_checksum = 1;
  60. //vars.ttl = ttl;
  61. u_char bytes[20] = {0x13,0x12,0xf9,0x89,0x5c,0xdd,0xa6,0x15,0x12,0x83,0x3e,0x93,0x11,0x22,0x33,0x44,0x55,0x66,0x01,0x01};
  62. memcpy(vars.tcp_opt, bytes, 20);
  63. vars.tcp_opt_len = 20;
  64. //dump_send_tcp_vars(&vars);
  65. send_tcp(&vars);
  66. }
  67. static void send_fake_payload(
  68. const char *src_ip, unsigned short src_port,
  69. const char *dst_ip, unsigned short dst_port,
  70. unsigned int seq_num, unsigned int ack_num)
  71. {
  72. char pkt[MAX_PACKET_SIZE];
  73. struct send_tcp_vars vars;
  74. memset(&vars, 0, sizeof vars);
  75. strncpy(vars.src_ip, src_ip, 16);
  76. strncpy(vars.dst_ip, dst_ip, 16);
  77. vars.src_port = src_port;
  78. vars.dst_port = dst_port;
  79. vars.flags = TCP_ACK;
  80. //vars.seq_num = htonl(ntohl(seq_num) + (rand() % 10000000 + 1000000));
  81. vars.seq_num = seq_num;
  82. vars.ack_num = ack_num;
  83. vars.wrong_tcp_checksum = 1;
  84. //u_char bytes[20] = {0x13,0x12,0xf9,0x89,0x5c,0xdd,0xa6,0x15,0x12,0x83,0x3e,0x93,0x11,0x22,0x33,0x44,0x55,0x66,0x01,0x01};
  85. //memcpy(vars.tcp_opt, bytes, 20);
  86. //vars.tcp_opt_len = 20;
  87. vars.payload_len = 1;
  88. vars.payload[0] = 'A';
  89. //dump_send_tcp_vars(&vars);
  90. send_tcp(&vars);
  91. }
  92. static void send_junk_data_super(
  93. const char *src_ip, unsigned short src_port,
  94. const char *dst_ip, unsigned short dst_port,
  95. unsigned int seq_num, unsigned int ack_num,
  96. int len)
  97. {
  98. struct send_tcp_vars vars;
  99. //log_debug("size of vars: %ld", sizeof vars);
  100. memset(&vars, 0, sizeof vars);
  101. strncpy(vars.src_ip, src_ip, 16);
  102. strncpy(vars.dst_ip, dst_ip, 16);
  103. vars.src_port = src_port;
  104. vars.dst_port = dst_port;
  105. vars.flags = TCP_ACK;
  106. vars.seq_num = seq_num;
  107. //vars.ack_num = htonl(ntohl(ack_num) + 10000);
  108. vars.ack_num = ack_num;
  109. vars.wrong_tcp_checksum = 1;
  110. //u_char bytes[20] = {0x13,0x12,0xf9,0x89,0x5c,0xdd,0xa6,0x15,0x12,0x83,0x3e,0x93,0x11,0x22,0x33,0x44,0x55,0x66,0x01,0x01};
  111. //memcpy(vars.tcp_opt, bytes, 20);
  112. //vars.tcp_opt_len = 20;
  113. //if (len > 100)
  114. // len -= 20;
  115. vars.payload_len = len;
  116. int i;
  117. for (i = 0; i < len; i++) {
  118. vars.payload[i] = 'A';
  119. }
  120. //dump_send_tcp_vars(&vars);
  121. send_tcp(&vars);
  122. }
  123. int x13_setup()
  124. {
  125. char cmd[256];
  126. sprintf(cmd, "iptables -A INPUT -p tcp -m multiport --sport 53,80 --tcp-flags SYN,ACK SYN,ACK -j NFQUEUE --queue-num %d", NF_QUEUE_NUM);
  127. system(cmd);
  128. return 0;
  129. }
  130. int x13_teardown()
  131. {
  132. char cmd[256];
  133. sprintf(cmd, "iptables -D INPUT -p tcp -m multiport --sport 53,80 --tcp-flags SYN,ACK SYN,ACK -j NFQUEUE --queue-num %d", NF_QUEUE_NUM);
  134. system(cmd);
  135. return 0;
  136. }
  137. int x13_process_syn(struct mypacket *packet)
  138. {
  139. char sip[16], dip[16];
  140. unsigned short sport, dport;
  141. struct in_addr s_in_addr = {packet->iphdr->saddr};
  142. struct in_addr d_in_addr = {packet->iphdr->daddr};
  143. strncpy(sip, inet_ntoa(s_in_addr), 16);
  144. strncpy(dip, inet_ntoa(d_in_addr), 16);
  145. sport = ntohs(packet->tcphdr->th_sport);
  146. dport = ntohs(packet->tcphdr->th_dport);
  147. send_fake_SYN(sip, sport, dip, dport, packet->tcphdr->th_seq);
  148. send_fake_SYN(sip, sport, dip, dport, packet->tcphdr->th_seq);
  149. send_fake_SYN(sip, sport, dip, dport, packet->tcphdr->th_seq);
  150. return 0;
  151. }
  152. int x13_process_synack(struct mypacket *packet)
  153. {
  154. char sip[16], dip[16];
  155. unsigned short sport, dport;
  156. struct in_addr s_in_addr = {packet->iphdr->saddr};
  157. struct in_addr d_in_addr = {packet->iphdr->daddr};
  158. strncpy(sip, inet_ntoa(s_in_addr), 16);
  159. strncpy(dip, inet_ntoa(d_in_addr), 16);
  160. sport = ntohs(packet->tcphdr->th_sport);
  161. dport = ntohs(packet->tcphdr->th_dport);
  162. // choose the appropriate ttl
  163. //int ttl = choose_appropriate_ttl(packet->iphdr->ttl);
  164. send_ACK(dip, dport, sip, sport, packet->tcphdr->th_ack, htonl(ntohl(packet->tcphdr->th_seq)+1));
  165. send_ACK(dip, dport, sip, sport, packet->tcphdr->th_ack, htonl(ntohl(packet->tcphdr->th_seq)+1));
  166. send_ACK(dip, dport, sip, sport, packet->tcphdr->th_ack, htonl(ntohl(packet->tcphdr->th_seq)+1));
  167. send_RST_super(dip, dport, sip, sport, packet->tcphdr->th_ack);
  168. send_RST_super(dip, dport, sip, sport, packet->tcphdr->th_ack);
  169. send_RST_super(dip, dport, sip, sport, packet->tcphdr->th_ack);
  170. int seq_num = htonl(ntohl(packet->tcphdr->th_ack) + (rand() % 10000000 + 1000000));
  171. send_fake_payload(dip, dport, sip, sport, seq_num, htonl(ntohl(packet->tcphdr->th_seq)+1));
  172. send_fake_payload(dip, dport, sip, sport, seq_num, htonl(ntohl(packet->tcphdr->th_seq)+1));
  173. send_fake_payload(dip, dport, sip, sport, seq_num, htonl(ntohl(packet->tcphdr->th_seq)+1));
  174. return 0;
  175. }
  176. int x13_process_request(struct mypacket *packet)
  177. {
  178. char sip[16], dip[16];
  179. unsigned short sport, dport;
  180. struct in_addr s_in_addr = {packet->iphdr->saddr};
  181. struct in_addr d_in_addr = {packet->iphdr->daddr};
  182. strncpy(sip, inet_ntoa(s_in_addr), 16);
  183. strncpy(dip, inet_ntoa(d_in_addr), 16);
  184. sport = ntohs(packet->tcphdr->th_sport);
  185. dport = ntohs(packet->tcphdr->th_dport);
  186. send_junk_data_super(sip, sport, dip, dport, packet->tcphdr->th_seq, packet->tcphdr->th_ack, packet->payload_len);
  187. send_junk_data_super(sip, sport, dip, dport, packet->tcphdr->th_seq, packet->tcphdr->th_ack, packet->payload_len);
  188. send_junk_data_super(sip, sport, dip, dport, packet->tcphdr->th_seq, packet->tcphdr->th_ack, packet->payload_len);
  189. return 1;
  190. }