Encapsular datos en paquetes DNS

Iniciado por Paniic, 28 Octubre 2015, 19:51 PM

0 Miembros y 1 Visitante están viendo este tema.

Paniic

Suponiendo que el resto de puertos están cerrados, mi idea es, mediante un programa y con conexión inversa, encapsular paquetes de datos en paquetes DNS (en el payload, supongo,)

Luego los recibirá el cliente que los interpretará.

PD: No he tocado con anterioridad esto y no veo una información descriptiva. Mi idea es hacerlo en C# pero lo posteo aquí para conocer primero el funcionamiento, ya cuando sepa como hacerlo, lo aplicaré a C#.

Perdonad si mi pregunta es atrevida, es únicamente didáctico.
\x31\xc9\x83\xe9\xee\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x5e\x10\xdb\x16\x83\xeb\xfc\xe2\xf4\x6f\xcb\x88\x55\x0d\x7a\xd9\x7c\x38\x48\x52\xf7\x93\x90\x48\x4f\xee\x2f\x16\x96\x17\x69\x22\x4d\x04\x78\xd1\x16\x5e\x89\xbd\x7e\x79\x1f\x98\x70\x0d\x99\x3a\xa6\x38\x40\x8a\x45\xd7\xf1\x98\xdb\xde\x42\xb3\x39\x71\x63\xb3\x7e\x71\x72\xb2\x78\xd7\xf3\x89\x45\xd7\xf1\x6b\x1d\x93\x90\xdb\x16

engel lex

explica en detalle el caso, suena interesante, pero puede no ser lo que esperas
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Paniic

Cita de: engel lex en 28 Octubre 2015, 19:53 PM
explica en detalle el caso, suena interesante, pero puede no ser lo que esperas

Te cuento el caso que intento reproducir.

Suponiendo que un equipo tenga unicamente abierto el puerto 53, programaría un troyano cortito de conexión inversa que encapsule paquetes para ser enviados por el único puerto abierto, osea, por DNS.

Esto llegaría a mi equipo y podría establecer conexión.

Mi problema es en la falta de información tan grande que tengo acerca del encapsulamiento de paquetes.

Como curiosidad: Hasta los equipos más protegidos en España tienen este puerto abierto, y el error está en no utilizar un IDS(snort) que detecte estas anomalías (paquetes demasiado grandes y con contenido cifrado ilegible).
\x31\xc9\x83\xe9\xee\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x5e\x10\xdb\x16\x83\xeb\xfc\xe2\xf4\x6f\xcb\x88\x55\x0d\x7a\xd9\x7c\x38\x48\x52\xf7\x93\x90\x48\x4f\xee\x2f\x16\x96\x17\x69\x22\x4d\x04\x78\xd1\x16\x5e\x89\xbd\x7e\x79\x1f\x98\x70\x0d\x99\x3a\xa6\x38\x40\x8a\x45\xd7\xf1\x98\xdb\xde\x42\xb3\x39\x71\x63\xb3\x7e\x71\x72\xb2\x78\xd7\xf3\x89\x45\xd7\xf1\x6b\x1d\x93\x90\xdb\x16

engel lex

si tienes un troyano de conexión inversa, no importa cual puerto uses, así que deberías usar uno entre 1024 y menor a 40000, esto es porque son los puertos comunes de salida, si intentas conectarte por debajo de 1024 es sospechoso, por otro lado, si el puerto se ve "abierto" quiere decir que un programa lo está usando, en ese caso tu programa no podrá usarlo
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Paniic

#4
Cita de: engel lex en 28 Octubre 2015, 20:04 PM
si tienes un troyano de conexión inversa, no importa cual puerto uses, así que deberías usar uno entre 1024 y menor a 40000, esto es porque son los puertos comunes de salida, si intentas conectarte por debajo de 1024 es sospechoso, por otro lado, si el puerto se ve "abierto" quiere decir que un programa lo está usando, en ese caso tu programa no podrá usarlo

Engel, no te lo tomes mal, pero no estoy pidiendo la información encontrada en un manual para kiddies, estoy yendo más a lo hondo, a lo técnico, te cuento.

Un troyano puede usar cualquier puerto entre el 1 y 65000 y pico, siempre y cuando dicho socket no lo tenga ocupado otro programa.
Por un lado, un puerto puede estar abierto y no haber ningún programa escuchando, y por otro un puerto solo está ocupado cuando un programa lo tiene asignado.

En caso de DNS no hay un programa que tenga asignado dicho puerto, simplemente son consultas (paquetes) que se envían y los servidores DNS resuelven. Lo que yo quiero hacer es que mi programa encapsule información en paquetes DNS (Ejemplo de lo que quiero).




¿Que quiero hacer realmente? ─ Por si no ha quedado muy claro, me explico mejor.

Quiero cargar en la máquina remota mi "servidor troyano", que encapsule toda la información que envíe en paquetes DNS (por tcp o udp) y las envíe a mi "cliente troyano".  Básicamente, encapsular tráfico en paquetes DNS. También conocido como "tunel"
\x31\xc9\x83\xe9\xee\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x5e\x10\xdb\x16\x83\xeb\xfc\xe2\xf4\x6f\xcb\x88\x55\x0d\x7a\xd9\x7c\x38\x48\x52\xf7\x93\x90\x48\x4f\xee\x2f\x16\x96\x17\x69\x22\x4d\x04\x78\xd1\x16\x5e\x89\xbd\x7e\x79\x1f\x98\x70\x0d\x99\x3a\xa6\x38\x40\x8a\x45\xd7\xf1\x98\xdb\xde\x42\xb3\x39\x71\x63\xb3\x7e\x71\x72\xb2\x78\xd7\xf3\x89\x45\xd7\xf1\x6b\x1d\x93\x90\xdb\x16

engel lex

lo que pasa es que estás cayendo en el caso que cae mucha gente, que es creer que los puertos son compuertas fisicas o similar...

un puerto es simplemente un numero asignado a un programa en una tabla... si el puerto se ve "abierto", significa que se envió un paquete tcp de conexión y respondió... que significa esto? que hay un programa tras el intentando hacer el handshake tcp... un puerto incluso no filtrado puede mostrarse como "cerrado" si no hay un programa activo para que intente establecer el handshake...

a que lleva esto?
que es un encapsulado DNS? es simplemente un paquete cuya cabecera contiene 53 como numero de origen o destino... como mucho un sistema de seguridad puede comprobar que tenga una cabecera bien formada (12 bytes, que puedes escribir a mano)

muchos sistemas ni si quiera comprueban eso... y si lo comprueban será un dolor de cabeza para ti, ya que solo podrás enviar unos pocos bytes por vez estableciendo una conexión hiperlenta y a la vez consumiéndote los recursos de red... (perderías más datos solo en cabeceras que en datos reales)

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Paniic

Empezamos a entendernos.

En primer lugar comentarte que tengo experiencia, conozco lo que es un puerto, y he trabajado bastante con puertos, sockets, bind connections, shellcodes en payload... Un puerto puede estar abierto y no tener programa detrás, otra cosa es que una conexión externa sepa reconocer si está abierto (permitido por el firewall o TMG) o cerrado (o filtrado). Agradezco que me des la información masticada, pero vayamos un poco más allá.

Respecto al tema que tratamos:
Respecto al DNS, la velocidad se ralentiza pero muy poco (en caso de usar UDP), en caso de usar TCP se ralentiza más, pero yo no voy a usar Poison, voy a usar un troyano que únicamente hace 3 Handshake y envía comandos. Por lo tanto la velocidad no es un problema, ya que tanto por TCP como UDP irá fluido.

Lo que yo voy a hacer es encapsular en el payload del paquete UDP como DNS. En otras palabras, disfrazar a un paquete IPV4 como DNS, y luego el que reciba este paquete tendrá que saber utilizarlo.

Seguiré buscando a ver si encuentro información, y si algún compañero por aquí puede prestar ayuda se lo agradeceré.

Os dejo algunos documentos que he encontrado de como hacerlo, pero a mi sigue sin quedarme claro de como se hace a nivel de programación [DNS request]... Si encuentro algo lo postearé aquí.
Encapsular HTTP sobre DNS

Gracias Engel.
\x31\xc9\x83\xe9\xee\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x5e\x10\xdb\x16\x83\xeb\xfc\xe2\xf4\x6f\xcb\x88\x55\x0d\x7a\xd9\x7c\x38\x48\x52\xf7\x93\x90\x48\x4f\xee\x2f\x16\x96\x17\x69\x22\x4d\x04\x78\xd1\x16\x5e\x89\xbd\x7e\x79\x1f\x98\x70\x0d\x99\x3a\xa6\x38\x40\x8a\x45\xd7\xf1\x98\xdb\xde\x42\xb3\x39\x71\x63\xb3\x7e\x71\x72\xb2\x78\xd7\xf3\x89\x45\xd7\xf1\x6b\x1d\x93\x90\xdb\x16

Paniic

Lo encontré y en BlackHat !!:

https://www.blackhat.com/presentations/bh-usa-08/Miller/BH_US_08_Ty_Miller_Reverse_DNS_Tunneling_Shellcode.pdf

Es justo lo que busco. Solo me faltaría ahora implementarlo en C#. Si alguien sabe algo... es de agradecer.
\x31\xc9\x83\xe9\xee\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x5e\x10\xdb\x16\x83\xeb\xfc\xe2\xf4\x6f\xcb\x88\x55\x0d\x7a\xd9\x7c\x38\x48\x52\xf7\x93\x90\x48\x4f\xee\x2f\x16\x96\x17\x69\x22\x4d\x04\x78\xd1\x16\x5e\x89\xbd\x7e\x79\x1f\x98\x70\x0d\x99\x3a\xa6\x38\x40\x8a\x45\xd7\xf1\x98\xdb\xde\x42\xb3\x39\x71\x63\xb3\x7e\x71\x72\xb2\x78\xd7\xf3\x89\x45\xd7\xf1\x6b\x1d\x93\x90\xdb\x16