Hace tiempo que decidí echar un ojo al concepto de ocultar información dentro de los protocolos TCP, UDP o IP. Mi idea era generar una pequeña prueba de concepto dónde pudiera utilizar un protocolo común, el cual será utilizado como Covert Channel, y transmitir información de manera oculta, como una prueba de esteganografía. Tras estudiar diferentes opciones y revisar algún paper que habla de ello - que la idea no es nueva ni mucho menos y en el libro de Esteganografía & Estegoanálisis se le dedica un capítulo a esta parte -, opté por utilizar los flags de TCP y el número de secuencia de los paquetes TCP.
En esta prueba de concepto, los paquetes TCP son reales, pero no tienen ningún sentido. Es cierto que se podría lograr un ejemplo de esteganografía más real que permitiese transmitir información sobre tráfico coherente TCP que se genere en el equipo. Es cierto, que si un administrador de red lee el tráfico que generaremos no me encontrará coherencia, y pensará que es tráfico erróneo, pero el mensaje se encuentra ahí, oculto.
Planteamiento
El primer planteamiento es ocultar información dentro de las estructuras que proporciona el protocolo TCP. Si nos fijamos en los flags más famosos de este protocolo, se tienen 6 “huecos” para almacenar bits. Los flags son: SYN, ACK, PSH, URG, RST y FIN. Aquí tenemos 6 bits y utilizando el número de secuencia o Sequence Number del protocolo se puede aumentar el ratio de bits. Para la prueba de concepto se ha decidido utilizar, solo 2 bits más con el número de secuencia.
En otras palabras, si queremos enviar el mensaje “esto es un secreto”, cada carácter se enviará oculto en los flags y en el número de secuencia de cada paquete TCP. A continuación desglosamos los bits de, por ejemplo, la letra "e", que se traduce en “01100101”, por lo que los 2 bits más significativos serán introducidos como número de secuencia, siendo éste el valor “1”. En el caso de ser “10” sería un “2”, y en el caso de ser “11” sería un “3”. El resto de bits menos significativos se corresponden con los 6 flags comentados anteriormente. Los flags RST, ACK y URG irían a 1. En la captura de Wireshark se puede visualizar.
En la máquina destino tendremos un programa que es capaz de leer el tráfico TCP y decodificar el tráfico oculto en TCP. ¿Cómo sabemos que el tráfico es especial? Para esta PoC hemos utilizado un puerto destino concreto como clave. Es decir, cuando recibamos un TCP destino 3030 entendemos que es un paquete con esteganografía.
El proceso de decodificación es el proceso inverso al de ocultación. El programa remoto leerá el número de secuencia y esos 2 bits (del 0 al 3) serán los bits más significativos. Después concatenaremos los flags, y obtendremos de nuevo un valor de 8 bits. Este valor se identifica con un carácter. Una vez entendido el mecanismo sencillo que se utilizará para ocultar los caracteres en los paquetes TCP vamos a hablar de la implementación.
Implementación
Para llevar a cabo la prueba de concepto se utilizó Ruby. La librería PacketFu, la cual es parecida a Scapy en Python, permite “jugar” y crear paquetes TCP y datagramas IP a nuestro antojo. Ya fue utilizado para el Port-Knocking con Latch y el modo paranoia. En la siguiente imagen se puede ver el código de la función main. El coder recibe 2 parámetros: Dirección IP destino y mensaje a ocultar en el protocolo TCP.
El coder invoca un método denominado send_message, el cual proporciona la funcionalidad de ocultar el mensaje en el protocolo TCP, tal y como se explicó anteriormente. La función send_message inyecta el tráfico en la red a través de la función inject y prepara mediante unpack los caracteres que forman el mensaje en formato bytes.
Hay una función importante como es write_byte_into_packet que permite ocultar la información en el paquete TCP gracias a PacketFu, tal y como puede verse en la siguiente imagen. En esta imagen se puede ver la explicación de dónde se oculta dentro de un paquete TCP los bits.
Y, ¿El orden?
El orden de los paquetes TCP importa, ya que no es lo mismo que la “e” de “esto es un secreto” llegue antes o después que la “s”. El mecanismo válido en un ámbito real sería utilizar el Sequence Number para lo que es, y utilizar el ACK Number cómo lo estamos utilizando nosotros en esta prueba de concepto. En este caso, para evitar problemas se ha decidido enviar los paquetes con 1 segundo de diferencia, aunque en entornos LAN no habría problema.
En la siguiente imagen se puede visualizar como el emisor lanza el mensaje a una dirección IP concreta y al puerto 3030. El mensaje es “esto es un secreto”.
El receptor recibe el tráfico y puede obtener el mensaje oculto uniendo los bits del Sequence Number y los flags TCP, tal y como se puede ver en la imagen. El resultado es el mensaje original. Si viéramos con Wireshark el tráfico veríamos paquetes TCP que podrían ser considerados incoherentes, pero que esconden el mensaje.
Quiero agradecer a mi compañero Daniel Ruiz su apoyo y colaboración en llevar la prueba de concepto hacia adelante.
Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking" y “Pentesting con Powershell”
Figura 1: Esteganografía en TCP/IP: Una PoC en Ruby |
En esta prueba de concepto, los paquetes TCP son reales, pero no tienen ningún sentido. Es cierto que se podría lograr un ejemplo de esteganografía más real que permitiese transmitir información sobre tráfico coherente TCP que se genere en el equipo. Es cierto, que si un administrador de red lee el tráfico que generaremos no me encontrará coherencia, y pensará que es tráfico erróneo, pero el mensaje se encuentra ahí, oculto.
Planteamiento
El primer planteamiento es ocultar información dentro de las estructuras que proporciona el protocolo TCP. Si nos fijamos en los flags más famosos de este protocolo, se tienen 6 “huecos” para almacenar bits. Los flags son: SYN, ACK, PSH, URG, RST y FIN. Aquí tenemos 6 bits y utilizando el número de secuencia o Sequence Number del protocolo se puede aumentar el ratio de bits. Para la prueba de concepto se ha decidido utilizar, solo 2 bits más con el número de secuencia.
Figura 2: Visualización de transmisión de letra "e" |
En la máquina destino tendremos un programa que es capaz de leer el tráfico TCP y decodificar el tráfico oculto en TCP. ¿Cómo sabemos que el tráfico es especial? Para esta PoC hemos utilizado un puerto destino concreto como clave. Es decir, cuando recibamos un TCP destino 3030 entendemos que es un paquete con esteganografía.
El proceso de decodificación es el proceso inverso al de ocultación. El programa remoto leerá el número de secuencia y esos 2 bits (del 0 al 3) serán los bits más significativos. Después concatenaremos los flags, y obtendremos de nuevo un valor de 8 bits. Este valor se identifica con un carácter. Una vez entendido el mecanismo sencillo que se utilizará para ocultar los caracteres en los paquetes TCP vamos a hablar de la implementación.
Implementación
Para llevar a cabo la prueba de concepto se utilizó Ruby. La librería PacketFu, la cual es parecida a Scapy en Python, permite “jugar” y crear paquetes TCP y datagramas IP a nuestro antojo. Ya fue utilizado para el Port-Knocking con Latch y el modo paranoia. En la siguiente imagen se puede ver el código de la función main. El coder recibe 2 parámetros: Dirección IP destino y mensaje a ocultar en el protocolo TCP.
Figura 3: Coder. Implementación de la función main |
El coder invoca un método denominado send_message, el cual proporciona la funcionalidad de ocultar el mensaje en el protocolo TCP, tal y como se explicó anteriormente. La función send_message inyecta el tráfico en la red a través de la función inject y prepara mediante unpack los caracteres que forman el mensaje en formato bytes.
Figura 4: Implementación de la función send_message |
Hay una función importante como es write_byte_into_packet que permite ocultar la información en el paquete TCP gracias a PacketFu, tal y como puede verse en la siguiente imagen. En esta imagen se puede ver la explicación de dónde se oculta dentro de un paquete TCP los bits.
Figura 5: Función writ_byte_into_packet |
Y, ¿El orden?
El orden de los paquetes TCP importa, ya que no es lo mismo que la “e” de “esto es un secreto” llegue antes o después que la “s”. El mecanismo válido en un ámbito real sería utilizar el Sequence Number para lo que es, y utilizar el ACK Number cómo lo estamos utilizando nosotros en esta prueba de concepto. En este caso, para evitar problemas se ha decidido enviar los paquetes con 1 segundo de diferencia, aunque en entornos LAN no habría problema.
En la siguiente imagen se puede visualizar como el emisor lanza el mensaje a una dirección IP concreta y al puerto 3030. El mensaje es “esto es un secreto”.
Figura 6: Envío del mensaje secreto con esteganografía en TCP/IP |
El receptor recibe el tráfico y puede obtener el mensaje oculto uniendo los bits del Sequence Number y los flags TCP, tal y como se puede ver en la imagen. El resultado es el mensaje original. Si viéramos con Wireshark el tráfico veríamos paquetes TCP que podrían ser considerados incoherentes, pero que esconden el mensaje.
Figura 7: Lectura del mensaje por el covert channel en Kali Linux |
Quiero agradecer a mi compañero Daniel Ruiz su apoyo y colaboración en llevar la prueba de concepto hacia adelante.
Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking" y “Pentesting con Powershell”
¡¡¡ espectacular !!!, alucinante ... pablo, cada día nos sorprendes con algo nuevo
ResponderEliminar....enhorabuena....
Genial pero esto se lleva haciendo desde hace años, décadas incluso... Covert_TCP es de mediado de los 90. Aquí el código fuente en C de su prueba de concepto: http://www-scf.usc.edu/~csci530l/downloads/covert_tcp.c
ResponderEliminarMuy interesante. Personalmente aunque lleve desde mediado de los 90 no había leído nunca nada al respecto.
ResponderEliminarExcelente!
ResponderEliminarPor una duda que tengo ¿podemos usar el campo de compensación utilizado para lograr que el encabezado llegue a los 20 bytes [160 bits=4+4+8+16+16+3+(13)+8+8+16+32+32]?
ResponderEliminarUnos dicen que debe ser rellenado con ceros:
h t t p s : / / en . wiki pedia. org/wiki/Transmission_Control_Protocol#TCP_segment_structure
Otros dicen que tiene otro uso:
"This contains the number of unacknowledged segments that are allowed on the network at any one time. This is negogiated by the Source and Destination TCP layers. "
h t t p : / / w w w . techbooks forfree . com/intro_to_data_com/page254.html
Acá hay una "discusión" al respecto de la longitud del encabezado:
h t t p s : / / stack overflow. com/questions/6189128/sending-tcp-frames-of-fixed-length
Otra "opinión":
"The number of data octets beginning with the one indicated in the acknowledgment field which the sender of this segment is willing to accept."
TCP Header Format
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
h t t p s : / / tools. ietf . org/html/rfc793
PIENSO QUE SI LOS ENRUTADORES, ETC NO REVISAN ese campo, pudieramos utilizarlo para nuestros propósitos, O POR CONTRARIO si examinan dicho "campo" y si no encuentran solo ceros lo desechan,
enséñenos por favor, gracias.
Como diría Jesulín. En dos palabras: GRA - CIAS
ResponderEliminarMuy bueno
Muchas gracias Pablo y Daniel, me he quedado estupefacto al ver esta técnica de ocultación de datos, es simplemente impresionante.
ResponderEliminarSois unos genios, aquí se ve el elevado nivel que tienen nuestros expertos en seguridad informática españoles.
Lo que mas me sorprende de este blog son los comentarios de la gente. Entiendo que a Pablo le pudiera parece útil y a ciertos lectores. Yo valoraría un poco más de rigor en las publicaciones. Pablo, hace más de 20 años que se usan estas técnicas, hay herramientas y hay post muy currados. No sé, yo personalmente agradeceria que te lo trabajaras un poco mas...
ResponderEliminarsigo pensando que falta mucho rigor en este sector
En cuanto al anonimo anterior... las palabras genios y expertos es mejor guardalas...
Ultimo anónimo, sal de casa, disfruta de la vida, enamórate y deja tus penas guardadas :)
ResponderEliminarSi hablas de rigor, no publiques como anónimo.
Si no te gusta lo que lees, no lo hagas.
Ten talante. A muchos nos gusta lo que se publica aquí. Decirte que Pablo, Dani o Chema han podido publicar cosas antiguas, lo dicen, pero a muchos nos acercan cosas que no conocíamos.
Ánimo anónimo, y recuerda... Vive, sal y disfruta, que la vida, de verdad, puede ser maravillosa.
Muchas gracias. Por compartir.
ResponderEliminarultimo anónimo. Tus palabras muestran el tipo de lector que alberga este blog. En este sector o se escriben cosas de valor, o no escribas. Y si lo haces, atente a las consecuencias. Se es una imagen publica, y si escribes mierda recibes mierda.
ResponderEliminarAnónimo, ¿Tu eres el sector? xD No te ancles al pasado. De verdad haz algo sano por ti y descontaminate. Te crees con la autoridad de decirnos como es el sector. Prepotencia mode on. Enorme. De verdad, sal, diviértete, vive, relacionate, que la vida, de verdad, puede ser maravillosa ;)
ResponderEliminarYo si. La cuestión es, lo eres tu que desconocías esta técnica? Espero que no
ResponderEliminarun beso. Y acepta los consejos.
ResponderEliminarDescuida, que ademas de saber de lo que hablo disfruto de mi vida. No necesito tus consejos.
ResponderEliminarUno de los nichos de mercado de muchas industrias es coger algo que está un poco antiguo y volverlo a poner de moda. Se ve a menudo en el mundo de la música, refritos y recauchutados de música de los 70,80 y 90 que hacen una versión de una tema que ya tuvo éxito en su momento y los quincieañeros del momento lo flipan.
ResponderEliminarNo quiero sugerir que este fuera el objetivo de los autores, pero entiendo los comentarios de algunos anónimos anteriores a los que les parecen excesivos los elogios y que proceden de personas muy jóvenes.
Creo que eso podría ser verdad que hay mucho público jóven y/o inexperto. Se ha dicho muchas veces que muchos estudiantes leen esto y Chema hace una fantástica labor didáctica ahí.
Lo que falta también es tener una visión crítica y objetiva y si algún artículo publicado no es una novedad, no tiene nada de especial no hace falta ser exagerado en los elogios. Tampoco es necesario ni justo poner a parir al autor, no realizar críticas desmesuradas en caso que no tenga errores de bulto. Simplemente con agradecer el exfuerzo es bastante.
El corolario que muchas veces saco yo de esto comentarios de elogios exagerados, no sólo para temas "informáticos" es que hay que tener sentido crítico, valorar por uno mismo los hechos, investigar el valor real y no ser gregario ni seguidor fanático.
Estos valores se hechan mucho de menos en nuestra sociedad y los resultados más palpables se ven y se han visto en todas las épocas en todas las facetas de la vida, especialmente en la política: gente sin criterio ni criterios que hacen de alguien su héroe personal.
Saludos.
Como sabéis, tanto Pablo, Amador, Dipu y yo mismo, amamos la profesión de enseñar y hemos dado infinidad de clases. Clases sobre cosas que no son pura investigación, sino enseñar a la gente a usar herramientas como Metasploit, Kali Linux, hacer ataques de SQL Injection, buscar bugs, etc... En este blog se habla de eso desde el día 1 y no pretende ni mucho menos ser un congreso de investigación que solo publica papers. Es un sitio al que acuden diariamente más de 50.000 personas por RSS, e-mail, RRSS, etc...
ResponderEliminarEn este artículo Pablo explica al principio que no es nuevo, e incluso está en el libro de Esteganografía que editamos. El que quiera "atacar" a Pablo por probar algo por sí mismo y compartir su experiencia es que tiene muchas frustraciones y mucha inseguridad en sí mismo, y por ello necesita atacar el trabajo de otros. No le deis más importancia. Este blog es para gente que disfruta la informática, no para "gurus" que sean los número 1 de lo suyo y no sepan compartir con los que no sabemos todo.
Saludos!
Buenas chema, un par de cosas
ResponderEliminar1. Me sorprende esa relación tan "especial" que tienes con Pablo. No se si teneis parejas pero si teneis relaciones sexuales mutuas usar proteccion... que luego ya se sabe :)
2. Veo, con disgusto, que ultimamente Pablo escribe mucho en tu blog.No estaras utilizando personas de Telefonica (recursos privados) para escribir en tu blog personal? eso esta feo y es poco etico....
3. En cuanto a Pablo, compartir esta bien... pero si hablas de algo de hace mas de 20 años una actitud critica y comparativa es mas util. Defender su publicacion pq hay lectores que no conocen la tecnica... en fin. Mi primo no sabe que es el lenguaje binario... por favor, publicar un post al respecto. Pq publicar todos los dias un post? Tendrías que hacertelo mirar cuando la calidad es nefasta.
4. Chema me haces gracias cuando hablas de los "gurus".... cuando vendes las bondades de 11paths siempre hablas de gente tecnica de lo mejor y luego cuando te dan un zas en toda la boca... sacas el populismo, decidete. Yo prefiero que la historia la escriban los listos de la clase... no los tontos. Por desgracia, de estos ultimos hay muchos mas. Viva belen esteban!
5. No metas a otras personas en tu post (populismo?). No voy a juzgar su conocimiento. Quizas su unica culpa sea querer un poquillo de fama...
6. A los lectores que critican a la gente que publica como anonimo. El anonimato tiene utilidaad historica para defender la verdad y minimizar los ataques de gente influyente en un sector. Quizás chema tendrías que hacerte una pregunta: pq tanta gente te ataca? envidia? Bueno, ...., quizas en tu camino al "estrellato" has hecho las cosas mal y mucha gente habla de tus malas practicas....
7. Pq los anonimos (trolls?) no debemos dejar de comentar en este blog? la respuesta es facil... nos negamos a pensar que la mediocridad sea el ejemplo para las generaciones futuras. No te conozco mas alla de haberte visto en alguna Con y he de decirte (sentimiento compartido con otros) que tus charlas hace tiempo que aportan muy poco... de hecho me parecio un poco vergonzante lo que hicisteis en la ultima rooted... especialmente si lo comparas con las cosas tan curradas y originales que se presentaron. Mira, has conseguido que compren tu empresa de barrio, posiblemente tengas dinero para retirarte, te aprovechas continuamente del humo de este sector... pero una y mil veces no des ejemplo de algo que no eres, no eres un hacker.... no pq lo diga yo... por lo que veo y oigo nadie medianemente competente de este sector te otorga esa etiqueta...
Y ahora que siga la comparsa...
@Anónimo
ResponderEliminar1.- Ese comentario deja muy a las claras tu edad mental e intelectual. Lamentable.
2.- Pablo, y muchos otros, escriben en mi blog personal hace años. Y no sé por qué me da, que en Telefónica están muy contentos con mi trabajo en la empresa y mi trabajo fuera de la empresa, como este blog.
3.- Hay tantas cosas que tienen 20 años y que tú no sabes, que este comentario que haces es ridículo. Si hay un post chulo de lenguaje binario, lo publicaré. Es mi blog y publico las cosas que creo que aportan algo. El de Pablo aportaba una PoC en Ruby de como hacer esteganografía en TCP/IP. Ha aportado mucho más que tú. Lo más interesante de tu personalidad es que eres como los alcohólicos que piensan que están aparcando el coche bien cuando están haciendo el ridículo. Tú crees que has hecho una crítica "constructiva". Tienes que aprender a comportarte en la vida.
4.- En Eleven Paths hacemos Latch, Tacyt, Mobile Connect, Sandas, Faast, etc... en mi blog explico SQL Injection, cómo funciona el ataque DROWN o cosas personales. Tengo la suerte de estar rodeado de gente mucho más lista que yo en Eleven Paths y lo adoro. En mi blog, seguiré publicando lo que me parezca interesante.
5.- El post es de Pablo - no mío -, y tú te has metido con él. He hablado de Amador y Dipu porque son los otros que han escrito con más asiduidad aquí y tienen el mismo perfil que Pablo y yo. Eres muy simple.
6.- El anonimato, igual que la confianza, es un derecho que hay que cuidar. Amo a los hackers y hacktivistas que crearon TOR para luchar contra la persecución de activistas políticos e ideológicos. Odio a los que usan TOR para la pederastia, la pedofilia o el terrorismo. Los que como tú usan el anonimato - que yo permito en mi blog para que la gente se sienta cómoda - para hacer Trolling, sois detestables. De hecho, dais asco los que usáis el anonimato - tan preciado y tan costoso de conseguir - para hacer el infantil en un blog. Todo comentario que pongas de troll te lo voy a borrar en mi derecho de no tener que aguantar tontos.
6.1.- Gente que me ataca. Anónimo, tengo la suerte de que he recibido mucho más de lo que he dado. ¿la gente me ataca? Todos los días. Absolutamente todos los días recibo cientos de comentarios de gente que me felicita, anima o piensa que soy mucho mejor de lo que soy. Soy solo un informático que ha tenido suerte en la vida y no voy a dejar que se me suba por los miles de halagos que recibo, ni hundirme por las unidades de críticas de "anónimos" como tú. Si pensar que tu comentario hizo daño a Pablo o que este comentario me hace daño a mí... nos conoces poco.
7.- El problema es ese, que no me conoces de nada. Llevo 20 años trabajando y mi trabajo está por todo Internet. ¿Que no te gustó la charla? Sorry, a otros sí. Sobre lo demás... sigue hablando de oídas de mí sin conocerte. Eso demuestra que tú sí que tienes poco rigor en tus opiniones y trabajo.
Saludos y EOT