
Ende-zu-Ende-Verschlüsselung für Multi-Hop-TTY-Sitzungen oder Portshells + TCP/UDP-Portweiterleitung
Dieses Projekt – ebenso wie sein Schwesterprojekt crash – gehört zu meinem Anti-Zensur-Werkzeugsatz, mit dem sich voll funktionsfähige verschlüsselte Shells und TCP/UDP-Weiterleitungen in feindlichen Zensurumgebungen einrichten lassen. Es ist auch für die Forensik nützlich, um Daten von Geräten über UART oder adb auszulesen, wenn keine anderen Mittel verfügbar sind.
DNS-Lookup und SSH-Sitzung über eine UART-Verbindung zu einem Pi weitergeleitet
PSC ermöglicht die Ende-zu-Ende-Verschlüsselung von Shell-Sitzungen, ein- oder mehrfach hüpfend, unabhängig vom zugrunde liegenden Transport, solange dieser zuverlässig ist und Base64-codierte Daten ohne Änderung/Filterung senden/empfangen kann. Zusammen mit der e2e-PTY, die Sie erhalten (z. B. innerhalb einer Port-Shell), können Sie TCP- und UDP-Verbindungen weiterleiten, ähnlich wie bei OpenSSHs -L-Parameter. Dies funktioniert transparent und ohne die Notwendigkeit einer lokal am Startpunkt zugewiesenen IP-Adresse. Dadurch können Forensiker und Pen-Tester beispielsweise Netzwerkverbindungen herstellen über:
adb shell-Sitzungen, wenn der OEM-adbd kein TCP-Forwarding unterstütztStellen Sie sich vor, Sie hätten eine unsichtbare ppp-Sitzung innerhalb Ihrer Shell-Sitzung, ohne dass der entfernte Peer tatsächlich ppp unterstützt.
Es läuft auf Linux, Android, OSX, Windows, FreeBSD, NetBSD und (möglicherweise) OpenBSD.
PSC enthält auch SOCKS4- und SOCKS5-Proxy-Unterstützung, um tatsächliche Web-Browsing-Sitzungen über Port-Shells oder Modem-Einwahl aus der Ferne zu ermöglichen.
Bearbeiten Sie die Makefile, um Ihre Pre-Shared-Keys widerzuspiegeln, wie am Anfang der Makefile definiert.
Dann geben Sie einfach make auf Linux und OSX ein.
Auf BSD müssen Sie GNU make installieren und stattdessen gmake aufrufen.
Auf Windows müssen Sie cygwin installieren und die entsprechenden Pakete gcc, gcc-g++, make und git auswählen.
Auf Linux verwendet PSC Unix98-Pseudoterminals, auf anderen Systemen POSIX-PTYs, was für Sie transparent sein sollte. Ich habe vor Urzeiten aus einem bestimmten Grund mal 4.4BSD-PTY- und SunOS-Unterstützung hinzugefügt, daher könnte es sogar mit Solaris bauen.
stolz gesponsert von:
Einfach und klar. Führen Sie auf Ihrem lokalen Rechner pscl aus und übergeben Sie alle TCP- oder UDP-Ports, die Sie vom entfernten Standort an eine bestimmte Adresse weiterleiten möchten. Beispiel:
linux:~ > ./pscl -T 1234:[192.168.0.254]:22 -U 1234:[8.8.8.8]:53
PortShellCrypter [pscl] v0.60 (C) 2006-2020 stealth -- github.com/stealth/psc
pscl: set up local TCP port 1234 to proxy to 192.168.0.254:22 @ remote.
pscl: set up local UDP port 1234 to proxy to 8.8.8.8:53 @ remote.
pscl: Waiting for [pscr] session to appear ...
linux:~ >
[ UART / SSH / ... login to remote side ... ]
Führen Sie auf dem entfernten Standort (dem letzten Hop) mit der Shell-Sitzung – egal ob in einer Port-Shell, SSH, Konsolenlogin usw. – pscr aus:
linux:~ > ./pscr
PortShellCrypter [pscr] v0.60 (C) 2006-2020 stealth -- github.com/stealth/psc
pscl: Seen STARTTLS sequence, enabling crypto.
linux:~ >
Sobald Sie pscr ausführen, etablieren beide Enden einen Krypto-Handshake und legen ein zusätzliches Protokoll über Ihre bestehende Sitzung, das für Sie transparent ist. Sie können dann auf Ihrem lokalen Rechner eine Verbindung zu 127.0.0.1:1234 herstellen, um 192.168.0.254:22 über TCP oder den 8.8.8.8-Resolver über UDP zu erreichen. Dies funktioniert auch mit [IPv6]-Adressen, wenn der entfernte Standort IPv6-Konnektivität hat. Tatsächlich können Sie es sogar verwenden, um IPv4-Software auf IPv6 zu übertragen, da Sie sich lokal immer mit 127.0.0.1 verbinden.
Sie können mehrere -T- und -U-Parameter übergeben. Wenn Sie den Überblick verloren haben, ob Ihre Sitzung bereits e2e-verschlüsselt ist, können Sie ein SIGUSR1 an den lokalen pscl-Prozess senden, und er wird es Ihnen mitteilen.
PSC ist auch nützlich, wenn Sie tor von einer entfernten SSH-Shell aus verwenden möchten, wobei Sie den socks5- und den DNS-Port an die 127.0.0.1-Adresse der entfernten Hosts weiterleiten können. Da SSH keine UDP-Pakete weiterleitet, würden Sie normalerweise zwei socat-Verbinder oder ähnliches verwenden, um über den tor-Knoten aufzulösen. PSC hat den Vorteil, dass die UDP-Datagramm-Grenzen eingehalten werden, während socat über SSH -L Datagramm-Grenzen brechen und fehlerhafte DNS-Anfragen erzeugen kann.
Die Sitzung wird mit aes_256_ctr eines PSK, den Sie in der Makefile wählen, verschlüsselt. Dieses Krypto-Schema ist formbar, aber das Hinzufügen von AAD- oder OAD-Daten bläht die Paketgröße auf, wobei jedes Byte zählt, da bei interaktiven Sitzungen und aufgrund der Base64-Codierung jedes getippte Zeichen bereits viel mehr Daten verursacht.
UART-Sitzungen können über screen verwendet werden, aber beispielsweise nicht über minicom, da minicom unsichtbare Fenster mit Statuszeilen erstellt und wie ein Filter wirkt, der das PSC-Protokoll zerstört. PSC versucht, Filterung zu erkennen und kann mit einem gewissen Maß an Datenverfälschung umgehen, aber in manchen Situationen ist keine Wiederherstellung möglich. Ähnliches gilt für tmux. Sie sollten vermeiden, PSC-PTY-Handler zu stapeln, die ihre eingehenden Daten zu stark manipulieren/verarbeiten.
Die Umgebungsvariable SHELL muss sowohl für pscl als auch für pscr gesetzt sein, damit PSC weiß, welche Shell auf der PTY ausgeführt werden soll. SHELL ist in den meisten Umgebungen standardmäßig gesetzt, falls nicht, muss PSC wie SHELL=/bin/bash pscl usw. ausgeführt werden.
pscl unterstützt auch die Weiterleitung von TCP-Verbindungen über SOCKS4 (-4 port) und SOCKS5 (-5 port). Dies richtet port als SOCKS-Port für TCP-Verbindungen ein, sodass Sie beispielsweise während eines Pen-Tests aus einer Port-Shell-Sitzung heraus in entfernten Netzwerken surfen können, ohne eine andere Verbindung öffnen zu müssen. Wenn Sie -N an pscl übergeben, wird die DNS-Namensauflösung auf der entfernten Seite aktiviert, sodass Sie es auch mit Chrome verwenden können. Aber Vorsicht: Es gibt ein Datenschutzproblem mit Browsern, die beim Start eine Folge von DNS-Namen auflösen, die nicht unter Ihrer Kontrolle stehen. Wenn Ihre entfernte Seite außerdem eine fehlerhafte DNS-Konfiguration hat, kann Ihre tippende Shell für mehrere Sekunden blockieren, wenn DNS-Antwortpakete fehlen. Es gibt keine guten asynchronen Resolver-Funktionen, die einbettbar und portabel sind, daher musste ich mich auf getaddrinfo() im einzelnen Thread verlassen, um den Preis möglicher Blockaden für mehrere Sekunden bei DNS-Problemen. Deshalb muss die Namensauflösung explizit aktiviert werden. pscr versucht jedoch, dieses potenzielle Problem mit DNS-Lookup-Caches zu minimieren, sodass es in den meisten Situationen problemlos funktionieren sollte.
Wenn Sie -X IP-Adresse übergeben (muss das erste Argument sein), können Sie Ihren lokalen Proxy an eine andere Adresse als 127.0.0.1 binden, sodass Sie den Proxy in Ihrem lokalen Netzwerk teilen können.
psc bietet Funktionen, um TCP-Verbindungen oder binäre Datenblöcke von/zu entfernten Geräten über mehrere Hops weiterzuleiten, selbst wenn es nicht möglich ist, das pscr-Binär auf dem entfernten Standort zu installieren. Dies ist sehr nützlich für forensische Zwecke, wenn Sie keine anderen Mittel haben, um Artefakte vom Gerät herunterzuladen (das kann z. B. ein über UART verbundenes Telefon sein), oder Verbindungen weiterleiten müssen, ohne das Dateisystem zu berühren, um keine Beweise auf dem System zu zerstören, oder wenn das Root-Dateisystem ro eingehängt ist und Sie Ihr Werkzeugsatz nicht hochladen können.
Dies ist eine wirklich coole Funktion, da Sie Ihre TCP-Verbindung durch Ihr lokales tty zu einer entfernten Maschine hüpfen sehen, ohne dass Sie etwas aus der Ferne installieren müssen.
Dies funktioniert ausschließlich durch lokales pty-punkrock und die Übergabe eines Bounce-Befehls an pscl, den es auf der entfernten Shell ablegt (ohne dass pscr läuft), sowie etwas Zustandsmaschinen-Magie, die die Daten auf der lokalen Seite herausfiltert und verarbeitet. Normalerweise erfordert dies, die entfernte pty zuerst in den Raw-Modus zu versetzen, bevor der eigentliche Befehl ausgeführt wird, sowie einige andere Details, die an -B übergeben werden. Das Argument wird in die folgenden Teile aufgeteilt:
:, z. B. 1234:.stty -echo raw oder python -c "import tty;tty.setraw(0)" (achten Sie auf die korrekte Anführungszeichen, da -B ebenfalls in Anführungszeichen gesetzt werden muss) oder ähnliches.pscl mitteilt, dass es mit dem Senden von Daten beginnen kann, um einen Wettlauf zwischen dem tatsächlichen stty und dem Start des Befehls zu vermeiden, z. B. ein echo GO ist perfekt.nc 127.0.0.1 22, um den lokalen Port 1234 zum SSH-Server der entfernten Maschine zu hüpfen.pscl ermöglicht, seinen tty-Zustand zurückzusetzen. echo FIN tut dies. Empfohlen, da Sie sonst Probleme haben könnten, das Ende Ihres Befehls zu erkennen.Beispiele:
Wenn Sie eine TCP-Verbindung weiterleiten möchten, erfordert dieses Beispiel, dass stty und nc auf dem Gerät installiert sind, aber theoretisch könnte es alles andere sein, das Äquivalentes tut.
Starten Sie eine lokale Sitzung:
./pscl -B '1234:[stty -echo raw;echo GO;nc example.com 22;echo FIN]'
Dies sendet den Befehl stty -echo raw;echo GO;nc example.com 22;echo FIN an das entfernte Gerät, wenn Sie sich lokal mit Port 1234 verbinden, und leitet dann einfach alle sichtbaren Daten hin und her, wobei der Datenverkehr gedrosselt wird, sodass er die tty-Geschwindigkeit des Geräts (Standard 115200) nicht überschreitet.
Wenn die pscl-Sitzung gestartet ist, verbinden Sie sich per UART, ssh -e none ... oder was auch immer mit dem entfernten Gerät, und sobald Sie die entfernte Shell haben, geben Sie lokal ein:
ssh [email protected] -p 1234 um die SSH-Verbindung von Ihrem lokalen Rechner über das entfernte Gerät zum example.com-Ziel zu hüpfen. Natürlich wird die pscr-Variante bevorzugt, da -B nur eine einzelne Verbindung gleichzeitig hüpfen kann (obwohl Sie mehrere -B-Befehle für verschiedene Weiterleitungen übergeben können) und es möglich ist, dass die Shell nach der TCP-Sitzung hängt, da sich die pty im raw -echo-Modus befindet und je nachdem, ob der endgültige entfernte Peer die Verbindung ebenfalls schließt, die Shell danach einfach hängen bleiben kann. Wenn Sie eine pscl-Benachrichtigung finden, dass die Verbindung beendet ist, und eine Eingabeaufforderung sehen, sollten Sie sie reseten, damit eine neue Verbindung gestartet werden kann. Während Daten weitergeleitet werden, sehen Sie in pscl 7-Bit-ASCII-< und >-Benachrichtigungen, die nur lokal zur einfacheren Fehlerbehebung und Fortschrittserkennung dienen.
Beachten Sie, dass die Verbindung zum entfernten Standort 8-Bit-sauber sein muss, d. h. der SSH-, Telnet-, UART- oder sonstige Kanal darf keine Escape-Sequenzen behandeln (anders als bei Verwendung von pscr). Für SSH-Verbindungen bedeutet dies, dass Sie ssh -e none in der pscl-Sitzung verwenden müssen.
Als Nächstes folgen einige Beispiele zur Handhabung des binären Dateitransfers, wobei rfile die entfernte Datei und lfile die lokale Datei bezeichnet.
So starten Sie eine Sitzung zum Ablegen von entfernten Dateien lokal:
./pscl -B '1234:[stty -echo raw;echo GO;dd of=rfile.bin bs=1 count=7350;echo FIN]'
Dabei müssen Sie die Datenmenge angeben, die die entfernte Seite erwartet. Es würde auch ohne funktionieren (z. B. cat>...), aber dann hängt die Sitzung nach Ende der Übertragung, da cat endlos auf Eingaben wartet. Durch die Verwendung von dd count=... erhalten Sie einen sauberen Ausstieg und werden durch den FIN-Marker darüber benachrichtigt.
Stellen Sie dann per SSH oder was auch immer eine Verbindung zur entfernten Shell innerhalb der gerade gestarteten pscl-Sitzung her. Öffnen Sie ein zweites Terminal lokal:
dd if=lfile.bin|nc 127.0.0.1 1234
Dies verbindet sich mit dem lokalen Port 1234 von pscl und löst den Dump-Befehl auf der entfernten Seite aus, wobei die Binärdaten der lokalen lfile.bin an das entfernte rfile.bin weitergeleitet werden. Aufgrund der Ratenbegrenzung kann dies eine Weile dauern und Sie vertrauen nur Ihrem psc-Fortschrittsbildschirm, ob die Übertragung abgeschlossen ist. Der lokale Befehl dd ...|nc ... zeigt Ihnen nur den lokalen Status, der aufgrund lokaler TCP-Puffer ganze Dateien in Millisekunden fressen kann, während die Datei noch durch die pty übertragen wird. Stellen Sie also sicher, dass Sie Ctrl-C nur drücken, wenn der pscl-Bildschirm Ihnen mitteilt, dass es fertig ist, oder Sie den FIN-Endmarker auf Ihrer dd ...|nc ...-Sitzung sehen.
Ebenso könnten ähnliche Befehle verwendet werden, um Binärdaten von einem entfernten Gerät auf den lokalen Rechner für forensische Zwecke zu übertragen. Starten Sie die Sitzung lokal erneut:
./pscl -B '1234:[stty -echo raw;echo GO;dd if=rfile.bin]' oder
./pscl -B '1234:[stty -echo raw;echo GO;cat rfile.bin]'
Dann SSH zum entfernten Gerät, um die Shell zu erhalten, dann erneut lokal:
nc 127.0.0.1 1234|dd of=lfile.bin bs=1 count=7350
Um rfile.bin der Größe 7350 in die lokale Datei lfile.bin zu kopieren.
Wenn stty -echo raw auf dem Gerät nicht verfügbar ist, funktioniert auch so etwas wie python -c "import tty;tty.setraw(0)". Beachten Sie, dass Sie auf dem entfernten Gerät ein tty (nicht nur eine Port-Shell) haben müssen, wenn Sie Bounce-Befehle verwenden, da der stty-Befehl zum Setzen des Raw-Modus ein echtes tty erfordert.
Wenn psc über eine serielle Verbindung läuft, können verlorene Bits den ganzen Spaß verderben. Wenn Sie ohne HW-Flusskontrolle laufen, werden Sie irgendwann Bitverluste und hängende Verbindungen erleben, insbesondere da es keine Drosselung gibt, wenn das Gerät Daten in Ihre Richtung sendet, wenn Sie Bounce-Befehle verwenden. Das Auslesen von Daten auf das Gerät funktioniert besser, da diese Daten durch die pscl-Ratenbegrenzung gehen.
Hier sind jedoch einige Tipps, die bei mir unter Umständen funktioniert haben, wenn es nicht möglich ist, pscr auf dem Gerät und HW-Flusskontrolle zu verwenden. Dies gilt nur bei Verwendung von UARTs, da dies ein potenziell unzuverlässiger Transportkanal ist.
pscr auf dem Gerät, damit Sie die Ratenbegrenzung für Daten, die in Ihre Richtung gesendet werden, einstellen können. Da die Richtung zum Gerät immer ratenbegrenzt ist, können Sie Bounce-Befehle verwenden, um ein kreuzkompiliertes pscr-Binär auf das Gerät zu übertragen und eine bidirektionale ratenbegrenzte Sitzung damit zu starten.tio -o 1 oder -o 2, um Verzögerungen zwischen gesendeten Ausgabebytes hinzuzufügen.38400, obwohl die serielle Leitung auf 115200 eingestellt ist).psc mit -DRESPECT_UART_BUFSIZE=4096, dies macht die Sitzung jedoch sehr langsam.Im contrib-Ordner finden Sie auch einen tio-noprefix-Patch, um die Verarbeitung von Escape-Zeichen zu deaktivieren, aber dieser Patch ist nur für ältere Versionen notwendig, da Upstream diesen Patch bereits akzeptiert und integriert hat. Ich empfehle wirklich die Verwendung von tio bei Verwendung von UARTs.
Bei Verwendung von Bounce-Befehlen über tio müssen Sie Ihrer ~/.tioconfig-Datei Folgendes hinzufügen:
[default]
prefix-ctrl-key = none
Dies deaktiviert die ESC-Behandlung und ergibt einen 8-Bit-sauberen Kanal.
Sie können SIGUSR1 an pscl senden, damit es Ihnen mitteilt, ob die Sitzung verschlüsselt ist. Wenn das entfernte pscr stirbt oder beendet wird, ohne dies dem lokalen Teil signalisieren zu können, bleibt pscl im Verschlüsselungsmodus und hängt daher. In diesem Fall können Sie einen Rücksetzvorgang in den Klartextmodus erzwingen, indem Sie SIGUSR2 senden, sodass eine neue Sitzung gestartet werden kann.
Ab Version 0.64 unterstützt psc Skripting-Sockets, sodass Sie nicht länger screen benötigen, um Dateien zu holen/legen oder Pufferinhalte in die entfernte Konsole einzufügen. Stattdessen starten Sie Ihre lokale Sitzung wie folgt:
~ > ./pscl -S ~/psc.script_sock
Sie können es dann wie zuvor verwenden. Wenn Sie etwas 'einfügen' müssen, machen Sie Folgendes:
~ > ./pscsh -S ~/psc.script_sock -f script_/helloworld
Dies 'tippt' den Inhalt von script_/helloworld in die Konsole. Während des Skriptings wird die Standardeingabe von pscl blockiert, sodass die injizierte Eingabe nicht mit eventuellen Tippeingaben vermischt wird. Wenn -S in pscsh weggelassen wird, wird automatisch ~/psc.script_sock verwendet. Aus Sicherheitsgründen müssen Skripte mit dem Präfix script_ beginnen.
Als Bonus enthält pscr nun die Fähigkeit, Dateien base64 zu en-/decodieren, sogar mit eingebetteten CR-Zeichen der Einfachheit halber. Es ist kompatibel zu uuencode -m.
; getrennt und in Klammern gesetzt.