relay.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <regex.h>
  5. #include <sys/socket.h>
  6. #include <sys/types.h>
  7. #include <netinet/in.h>
  8. #include <netdb.h>
  9. #include <unistd.h>
  10. #include "relay.h"
  11. #include "slitheen.h"
  12. #include "flow.h"
  13. #include "crypto.h"
  14. int replace_packet(flow *f, uint8_t *packet){
  15. const struct ip_header *ip_hdr;
  16. const struct tcp_header *tcp_hdr;
  17. uint8_t *p = packet;
  18. p += ETHER_HEADER_LEN; //skip ethernet header
  19. ip_hdr = (struct ip_header*) p;
  20. int size_ip = IP_HEADER_LEN(ip_hdr);
  21. if (ip_hdr->proto != IPPROTO_TCP){
  22. return 0;
  23. }
  24. p += size_ip; //skip IP header
  25. tcp_hdr = (struct tcp_header*) p;
  26. int size_tcp = TCP_HEADER_LEN(tcp_hdr);
  27. p += size_tcp;
  28. /*fprintf(stderr,"Flow: %d > %d (%s)\n", ip_hdr->src.s_addr, ip_hdr->dst.s_addr, (ip_hdr->src.s_addr != f->src_ip.s_addr)? "incoming":"outgoing");
  29. fprintf(stderr,"ID number: %u\n", htonl(ip_hdr->id));
  30. fprintf(stderr,"Sequence number: %u\n", htonl(tcp_hdr->sequence_num));
  31. fprintf(stderr,"Acknowledgement number: %u\n", htonl(tcp_hdr->ack_num));*/
  32. int app_data_len = htons(ip_hdr->len) - (size_ip + size_tcp);
  33. if(app_data_len <= 0){
  34. return 0;
  35. }
  36. /* if outgoing, decrypt and look at header */
  37. if(ip_hdr->src.s_addr == f->src_ip.s_addr){
  38. read_header(f, packet);
  39. return 0;
  40. }
  41. return 0;
  42. }
  43. int read_header(flow *f, uint8_t *packet){
  44. const struct ip_header *ip_hdr;
  45. const struct tcp_header *tcp_hdr;
  46. uint8_t *p = packet;
  47. p += ETHER_HEADER_LEN; //skip ethernet header
  48. ip_hdr = (struct ip_header*) p;
  49. int size_ip = IP_HEADER_LEN(ip_hdr);
  50. if (ip_hdr->proto != IPPROTO_TCP){
  51. return 0;
  52. }
  53. p += size_ip; //skip IP header
  54. tcp_hdr = (struct tcp_header*) p;
  55. int size_tcp = TCP_HEADER_LEN(tcp_hdr);
  56. p += size_tcp;
  57. int app_data_len = htons(ip_hdr->len) - (size_ip + size_tcp);
  58. struct record_header *record_hdr = (struct record_header*) p;
  59. uint32_t record_length = RECORD_LEN(record_hdr);
  60. uint8_t *decrypted_data = calloc(1, app_data_len);
  61. /*fprintf(stderr,"record:\n");
  62. for(int i=0; i< RECORD_HEADER_LEN; i++){
  63. fprintf(stderr,"%02x ", p[i]);
  64. }
  65. fprintf(stderr,"\n");*/
  66. p+= RECORD_HEADER_LEN;
  67. memcpy(decrypted_data, p, record_length);
  68. if(!encrypt(f, decrypted_data, decrypted_data, record_length, 0, 0x17)){
  69. fprintf(stderr,"decryption failed\n");
  70. return 0;
  71. } else {
  72. fprintf(stderr, "decryption succeeded!\n");
  73. decrypted_data+= EVP_GCM_TLS_EXPLICIT_IV_LEN;
  74. fprintf(stderr, "request:");
  75. fprintf(stderr,"%s\n ", decrypted_data);
  76. }
  77. /* search through decrypted data for x-ignore */
  78. regex_t r;
  79. const uint8_t *regex_text = "x-ignore";
  80. const uint8_t *match = decrypted_data;
  81. if(regcomp(&r, regex_text, REG_EXTENDED|REG_NEWLINE)){
  82. printf("could not compile regex\n");
  83. return 0;
  84. }
  85. regmatch_t m;
  86. if(regexec(&r, match, 1, &m, 0)){
  87. printf("no x-ignore found\n");
  88. return 0;
  89. }
  90. uint8_t *message = decrypted_data;
  91. //remove escape characters
  92. for(int i=m.rm_eo+2; i< strlen(match); i++){
  93. if(match[i] != '\\'){
  94. *(message++) = match[i];
  95. } else if (match[i+1] == 'r') {
  96. *(message++) = '\r';
  97. i++;
  98. } else if (match[i+1] == 'n') {
  99. *(message++) = '\n';
  100. i++;
  101. }
  102. }
  103. *message = '\0';
  104. message = decrypted_data;
  105. regex_t r2;
  106. const uint8_t *regex_text2 = "host";
  107. const uint8_t *match2 = decrypted_data;
  108. regmatch_t m2;
  109. if(regcomp(&r2, regex_text2, REG_EXTENDED|REG_NEWLINE)){
  110. printf("could not compile regex\n");
  111. return 0;
  112. }
  113. if(regexec(&r2, match2, 1, &m2, 0)){
  114. printf("no host found\n");
  115. return 0;
  116. }
  117. uint8_t server[50];
  118. for(int i=m2.rm_eo+2; i< strlen(match2); i++){
  119. if(match2[i] != '\n'){
  120. server[i-m2.rm_eo-2] = match2[i];
  121. } else {
  122. server[i-m2.rm_eo-2] = '\0';
  123. break;
  124. }
  125. }
  126. /* Send GET request to site */
  127. printf("sending request to site: %s\n", server);
  128. struct hostent *host;
  129. host = gethostbyname((const char *) server);
  130. if(host == NULL){
  131. printf("gethostbyname failed\n");
  132. return 0;
  133. }
  134. int32_t handle = socket(AF_INET, SOCK_STREAM, 0);
  135. if(handle < 0){
  136. printf("error: constructing socket failed\n");
  137. return 0;
  138. }
  139. printf("constructed socket\n");
  140. struct sockaddr_in dest;
  141. dest.sin_family = AF_INET;
  142. dest.sin_port = htons(80);
  143. dest.sin_addr = *((struct in_addr *) host->h_addr);
  144. bzero (&(dest.sin_zero), 8);
  145. printf("connecting...");
  146. int32_t error = connect (handle, (struct sockaddr *) &dest, sizeof (struct sockaddr));
  147. printf(" done\n");
  148. if(error <0){
  149. printf("error connecting\n");
  150. return 0;
  151. }
  152. int32_t bytes_sent = send(handle, message, strlen(message), 0);
  153. if( bytes_sent < 0){
  154. printf("error sending request\n");
  155. close(handle);
  156. return 0;
  157. } else if (bytes_sent < strlen(message)){
  158. printf("send partial request\n");
  159. close(handle);
  160. return 0;
  161. }
  162. printf("sent request!\n");
  163. //change this to realloc and loop later
  164. uint8_t *buf = calloc(1, 2048);
  165. memset(buf, 0, 2048);
  166. int32_t bytes_read = recv(handle, buf, 2048, 0);
  167. printf("Received message:\n %s\n", buf);
  168. for(int i=0; i< bytes_read; i++){
  169. f->censored_queue[i] = buf[i];
  170. }
  171. //for now, just close socket
  172. close(handle);
  173. return 0;
  174. }