document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. /*
  2. * Cliente DNS que resuelve servidores MAIL EXCHANGE
  3. * (Servidores de correo), con peticiones recursivas.
  4. * Adrián Ruiz Bermudo 2005-06.
  5. */
  6.  
  7. #include
  8. #include
  9. #include
  10. #define size    1024
  11. /*
  12. * Prototipos
  13. */
  14.  
  15. //Prepara la estructura para conectar con el servidor
  16. int conexion_dns_mx(char*, int);
  17.  
  18. //Extrae el dominio para realizar la consulta
  19. char *extract_dom_mx(char*);
  20.  
  21. //Envía y recibe el paquete de la consulta
  22. int sendrecv_packet_mx(int,char*);      
  23. //Devuelve el número de carácteres que hay en una variable
  24. //establecidas por dos posiciones.
  25. int tam_mail(char*,int,char,char);      
  26. //Extrae los servidores de correo del paquete recibido
  27. int format_recv_packet(char*);          
  28. //Extrae cadenas de carácteres de los mensajes comprimidos
  29. int compress_msg(char*);                
  30. //Copia los carácteres del paquete mientras éstos no estén comprimidos
  31. int copy_c(char*);
  32.  
  33. /*
  34. * Estructura de la consulta DNS a realizar
  35. * (A modo informativo)
  36. struct query_mx{
  37. WORD transaction;      2 bytes, indica el número de transacción [0x0001]
  38. WORD flags;        2 bytes, Banderas, [0x0100] indica consulta recursiva.
  39. WORD questions;        2 bytes, número de consultas [0x0001]
  40. WORD answer_rrs;       2 bytes, [0x0000] vacío.
  41. WORD authority_rrs;    2 bytes, [0x0000] vacío.
  42. WORD additional_rrs;   2 bytes, [0x0000] vacío.
  43. char host[size];       n bytes, dominio a consultar.
  44. WORD type;         2 bytes, tipo de servidor [0x0f00] servidor MX (correo).
  45. WORD Class;        2 bytes, Clase del servidor [0x0001] clase IN, internet.
  46. };
  47. */
  48.  
  49. struct sockaddr_in conexion;    //Estructura para realizar la conexión
  50. struct hostent *dns;            //Estructura para resolver el nombre de dominio
  51. char result[size];              //Almacena el nombre de dominio formateado para la consulta(aux)
  52. char packet[size];              //Paquete que almacena el envío y recibo.
  53. char dominio[size];             //Almacena el nombre de dominio formateado para la consulta      
  54. char servers_mx[size];          //Almacena los servidores resueltos
  55. int pos_servers_mx;             //Contiene la posición actual del paquete de servidores resueltos
  56. int pos_act_packet;             //Contiene la posición actual del paquete recibido
  57.  
  58. /*
  59. * Función que conecta con el servidor DNS remoto
  60. * y devuelve el descriptor de socket si la conexión
  61. * se realizó con éxito, en otro caso devuelve -1
  62. * si ocurrieron errores durante la operación.
  63. */
  64. int conexion_dns_mx(char *host,int port){
  65. int sd;
  66.  
  67. memset(&conexion,0,sizeof(conexion));
  68. if((sd=socket(PF_INET,SOCK_DGRAM,0))<0){
  69. perror("[SOCKET]");
  70. return -1;
  71. }
  72.  
  73. if((dns=gethostbyname(host))==NULL){
  74. perror("[DNS]");
  75. return -1;
  76. }
  77.  
  78. conexion.sin_family = AF_INET;
  79. conexion.sin_port = htons(port);
  80. conexion.sin_addr = *((struct in_addr *)dns -> h_addr);
  81. return sd;
  82. }
  83.  
  84. /*
  85. * Prepara el paquete para ser transferido al servidor DNS
  86. * y por consiguiente obtiene respuesta del servidor.
  87. */
  88. int sendrecv_packet_mx(int sd, char *domain){
  89. int x,y;
  90.  
  91. /*
  92. * Incluyendo todos los flags, hay una constante de 16 bytes +
  93. * el dominio a consultar
  94. */
  95. /*
  96. * Banderas que indican como se va a realizar la consulta.
  97. * Van al principio de cabecera
  98. */
  99. char flags_x[] = {
  100. "\\x00" "\\x01"       //transaction
  101. "\\x01" "\\x00"       //flags
  102. "\\x00" "\\x01"       //questions
  103. "\\x00" "\\x00"       //answer_rrs
  104. "\\x00" "\\x00"       //authority_rrs
  105. "\\x00" "\\x00"       //additional_rrs
  106. };
  107. /*
  108. * Banderas que indican que tipo de consulta a realizar.
  109. * Van al final de cabecera
  110. */
  111. char flags_q[] = {
  112. "\\x00" "\\x0f"       //type
  113. "\\x00" "\\x01"       //Class IN (INternet)
  114. };
  115. // flags_x + consulta + flag_q
  116. memset(packet,0,size);
  117. memcpy(packet,flags_x,11);          //Copiamos la cabecera
  118. y = 12;
  119. for(x=0;x=tam) return NULL;
  120. memset(result,0,size);
  121. y = 0;
  122. result[y] = tam_mail(mail,x+1,0x2E,0x00);   // @ o NULL
  123. y++;
  124. z=0;
  125. for(x=pos;x   \\n\\n ",argv[0]);
  126. else{
  127. if(WSAStartup(MAKEWORD(2,0), &win_sock)<0){
  128. printf("Error al crear sockets windows\\n");
  129. return 1;
  130. }
  131. printf("[+] Sockets inicializados.\\n");
  132. printf("[!] Extrayendo dominio...\\n");
  133. if((dom = extract_dom_mx(argv[1]))==NULL){
  134. printf("[x] Email no valido\\n");
  135. return 1;
  136. }
  137. printf("[!] Conectando con el servidor DNS...\\n");
  138. if((sock = conexion_dns_mx(argv[2],atoi(argv[3])))==-1){
  139. printf("[x] Error durante la conexion\\n");
  140. return 1;
  141. }
  142. printf("[+] Conectado correctamente\\n");
  143. printf("[!] Transfiriendo paquete...\\n");
  144. if(sendrecv_packet_mx(sock,dom)==-1){
  145. printf("[x] Error al transferir paquete\\n");
  146. return 1;
  147. }
  148. printf("[!] Obteniendo resultados...\\n");
  149. if(format_recv_packet(packet)==-1){
  150. printf("[x] Errores durante la operacion\\n");
  151. return 1;
  152. }
  153. printf("%s",servers_mx);
  154. printf("\\n** Hecho **\\n\\n\\a");
  155. }
  156. return 0;
  157. }
');