Dieses Projekt gehört – ebenso wie sein Schwesterprojekt Crash – zu meinem Anti-Zensur-Toolset, das es ermöglicht, voll funktionsfähige verschlüsselte Shells und TCP/UDP-Weiterleitung in feindseligen Zensurumgebungen einzurichten. Für die Forensik ist es auch nützlich, Daten von Geräten über UART oder ADB zu sichern, wenn keine anderen Mittel verfügbar sind.
DNS-Suche und SSH-Sitzung werden über eine UART-Verbindung an einen Pi weitergeleitet
PSC ermöglicht die E2E-Verschlüsselung von Shell-Sitzungen, Single- oder Multip-Hop, unabhängig vom zugrunde liegenden Transport, sofern es zuverlässig ist und Base64-codierte Daten ohne Modifizierung/Filterung senden/empfangen kann. Zusammen mit dem e2e-PTY, das Sie erhalten (z. B. innerhalb einer Port-Shell), können Sie TCP- und UDP-Verbindungen weiterleiten, ähnlich dem -L
Parameter von OpenSSH. Dies funktioniert transparent und ohne die Notwendigkeit einer lokal am Ausgangspunkt vergebenen IP-Adresse. Dadurch können Forensiker und Penetrationstester Netzwerkverbindungen herstellen, beispielsweise über:
adb shell
Sitzungen, wenn der OEM- adbd
keine TCP-Weiterleitung unterstütztStellen Sie sich vor, Sie hätten eine unsichtbare PPP-Sitzung in Ihrer Shell-Sitzung, ohne dass der Remote-Peer PPP tatsächlich unterstützt.
Es läuft auf Linux, Android, OSX, Windows, FreeBSD, NetBSD und (möglicherweise) OpenBSD .
PSC umfasst außerdem SOCKS4- und SOCKS5- Proxy-Unterstützung, um echte Webbrowser-Sitzungen über Port-Shells oder Modem-Einwahlen aus der Ferne durchzuführen.
Bearbeiten Sie das Makefile
so, dass es Ihre vorab freigegebenen Schlüssel widerspiegelt, wie oben im Makefile
definiert.
Geben Sie dann einfach make
unter Linux und OSX ein.
Unter BSD müssen Sie GNU make installieren und stattdessen gmake
aufrufen.
Unter Windows müssen Sie Cygwin installieren und die entsprechenden Pakete gcc, gcc-g++, make
und git
auswählen.
Unter Linux verwendet PSC Unix98- Pseudoterminals, auf anderen Systemen verwendet es POSIX- PTYs, aber das sollte für Sie transparent sein. Ich habe in der Steinzeit einmal aus einem bestimmten Grund 4.4BSD pty und SunOS- Unterstützung hinzugefügt, sodass es möglicherweise sogar mit Solaris funktioniert oder nicht.
stolz gesponsert von:
Schlicht und einfach. Führen Sie auf Ihrer lokalen Box pscl
aus und übergeben Sie alle TCP- oder UDP-Ports, die Sie von der Remote-Site an eine bestimmte Adresse weiterleiten möchten. Zum 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 ... ]
Auf der Remote-Site (dem letzten Hop) mit der Shell-Sitzung, egal ob in einer Port-Shell, SSH, Konsolenanmeldung usw., führen Sie 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, richten beide Seiten einen Krypto-Handshake ein und legen ein zusätzliches Protokoll über Ihre bestehende Sitzung, das für Sie transparent ist. Anschließend können Sie eine Verbindung zu 127.0.0.1:1234
auf Ihrer lokalen Box 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 die Gegenstelle über IPv6-Konnektivität verfügt. Tatsächlich können Sie damit sogar IPv4-Software in IPv6 übersetzen, da Sie auf der lokalen Seite immer eine Verbindung zu 127.0.0.1
herstellen.
Sie können mehrere -T
und -U
Parameter übergeben. Wenn Sie den Überblick verloren haben, weil Ihre Sitzung bereits E2E-verschlüsselt ist, können Sie ein SIGUSR1
an den lokalen pscl
Prozess senden, der Sie darüber informiert.
PSC ist auch nützlich, wenn Sie Tor von einer Remote-SSH-Shell aus verwenden möchten, wo Sie die Socks5 und den DNS-Port an die Adresse 127.0.0.1
des Remote-Hosts weiterleiten können. Da SSH keine UDP-Pakete weiterleitet, würden Sie normalerweise zwei socat
-Anschlüsse oder ähnliches verwenden, um über den Tor-Knoten aufzulösen. PSC hat den Vorteil, dass die UDP-Datagrammgrenzen erhalten bleiben, während socat
über SSH -L
Datagrammgrenzen durchbrechen und fehlerhafte DNS-Anfragen erstellen kann.
Die Sitzung wird mit aes_256_ctr
eines PSK verschlüsselt, das Sie im Makefile
auswählen. Dieses Kryptoschema ist formbar, aber das Hinzufügen von AAD- oder OAD-Daten erhöht die Paketgröße, bei der jedes Byte zählt, da bei interaktiven Sitzungen und aufgrund der Base64-Kodierung jedes eingegebene Zeichen bereits dazu führt, dass viel mehr Daten gesendet werden.
UART-Sitzungen können über screen
verwendet werden, jedoch 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 einer gewissen Datenverfälschung leben, aber in manchen Situationen ist eine Wiederherstellung nicht möglich. Ähnliches gilt für tmux
. Sie sollten es vermeiden, PTY-Handler mit PSC zu stapeln, die ihre eingehenden Daten zu sehr durcheinander bringen/verarbeiten.
Die SHELL
Umgebungsvariable muss sowohl für pscl
als auch für pscr
festgelegt werden, damit PSC weiß, welche Shell auf dem pty ausgeführt werden soll. SHELL
ist in den meisten Umgebungen standardmäßig festgelegt, falls dies jedoch nicht der Fall ist, 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
). Dadurch wird der Port als SOCKS-Port für TCP-Verbindungen eingerichtet, sodass Sie beispielsweise Remote-Netzwerke von einer Port-Shell-Sitzung aus durchsuchen können, ohne während eines Pen-Tests eine andere Verbindung öffnen zu müssen. Wenn Sie -N
an pscl
übergeben, wird die DNS-Namensauflösung auf der Remote-Seite aktiviert, sodass Sie damit auch Chrome verwenden können. Aber seien Sie gewarnt: Es gibt ein Datenschutzproblem bei Browsern, die beim Start versuchen, eine Folge von DNS-Namen aufzulösen, die nicht unter Ihrer Kontrolle steht. Wenn auf Ihrer Gegenseite ein fehlerhaftes DNS-Setup vorliegt, kann es außerdem sein, dass Ihre Eingabe-Shell mehrere Sekunden lang blockiert, wenn DNS-Antwortpakete fehlen. Es gibt keine guten asynchronen Resolver-Funktionen, die einbettbar und portierbar sind, daher musste ich mich auf getaddrinfo()
im einzelnen Thread verlassen, auf Kosten möglicher Blockierungen für mehrere Sekunden, wenn DNS-Probleme bestehen. 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-address
ü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 gemeinsam nutzen können.
psc- Funktionen ermöglichen die Weiterleitung von TCP-Verbindungen oder binären Datenblobs von/an Remote-Geräte über mehrere Hops, auch wenn es nicht möglich ist, die pscr
Binärdatei am Remote-Standort zu installieren. Dies ist für forensische Zwecke sehr nützlich, wenn Sie keine Möglichkeit haben, Artefakte anderweitig vom Gerät herunterzuladen (z. B. ein mit UART verbundenes Telefon) oder Verbindungen weiterleiten müssen, ohne das FS zu berühren, um keine Beweise auf dem System zu zerstören oder wann Das Root-FS ist ro-gemountet und Sie können Ihr Toolset nicht hochladen.
Dies ist eine wirklich coole Funktion, da Sie sehen können, wie Ihre TCP-Verbindung über Ihr lokales TTY zu einer Remote-Box springt, ohne dass Sie etwas remote installieren müssen.
Dies funktioniert ausschließlich durch lokalen PTY-Punkrock und die Übergabe eines Bounce-Befehls an pscl
, der auf der Remote-Shell abgelegt wird (ohne dass pscr
ausgeführt wird), sowie durch etwas State-Engine-Magie, die die Daten auf der lokalen Seite herausfiltert und verarbeitet. Normalerweise erfordert dies, dass der Remote-PTY zunächst in den Raw-Modus versetzt wird, bevor der eigentliche Befehl und einige andere Details ausgegeben werden, die an -B
übergeben werden. Das Argument gliedert sich in folgende Teile:
:
, z. B. 1234:
.stty -echo raw
oder python -c "import tty;tty.setraw(0)"
(achten Sie auf die richtigen Anführungszeichen, da auch -B
in Anführungszeichen gesetzt werden muss) oder irgendetwas Ähnliches.pscl
anweist, mit dem Senden von Daten zu beginnen, um einen Wettlauf zwischen dem tatsächlichen Auftreten stty
und dem Start des cmd zu vermeiden, z. B. ist ein echo GO
perfekt.nc 127.0.0.1 22
um den lokalen Port 1234 an den SSH-Server der Fernbedienung weiterzuleitenpscl
seinen TTY-Status zurücksetzen kann. echo FIN
wird es tun. Empfohlen, da es sonst zu Problemen beim Erkennen des Endes Ihres Befehls kommen kann.;
getrennt. und in Klammern gesetzt.Beispiele:
Wenn Sie eine TCP-Verbindung weiterleiten möchten, müssen in diesem Beispiel stty
und nc
auf dem Gerät installiert sein, aber es könnte theoretisch auch alles andere sein, das die gleiche Funktion hat.
Starten Sie eine lokale Sitzung:
./pscl -B '1234:[stty -echo raw;echo GO;nc example.com 22;echo FIN]'
Dadurch wird der Befehl stty -echo raw;echo GO;nc example.com 22;echo FIN
an das Remote-Gerät ausgegeben, wenn Sie sich lokal mit Port 1234 verbinden und dann alle angezeigten Daten einfach hin und her weiterleiten und so den Datenverkehr begrenzen Die TTY-Geschwindigkeit des Geräts wird nicht überschritten (Standard ist 115200).
Wenn die pscl-Sitzung gestartet wird, stellen Sie über UART, ssh -e none ...
oder was auch immer eine Verbindung zum Remote-Gerät her und geben Sie, sobald Sie die Remote-Shell haben, auch lokal ein:
ssh [email protected] -p 1234
um die SSH-Verbindung von Ihrer lokalen Box über das Remote-Gerät zum Ziel example.com
weiterzuleiten. Natürlich wird die pscr
Variante bevorzugt, da -B
jeweils nur eine einzelne Verbindung zurückweisen kann (obwohl Sie mehrere -B
-Befehle für verschiedene Weiterleitungen übergeben können) und die Möglichkeit besteht, dass die Shell nach der TCP-Sitzung hängen bleibt, da der PTY im raw -echo
ist raw -echo
Modus und abhängig davon, ob die letzte Gegenstelle auch die Verbindung schließt, kann es sein, dass die Shell danach einfach hängt. Wenn Sie zufällig eine pscl-Benachrichtigung finden, dass die Verbindung beendet wurde, und eine Eingabeaufforderung sehen, sollten Sie diese reset
, damit eine neue Verbindung gestartet werden kann. Während Daten weitergeleitet werden, werden in pscl
7-Bit-ASCII-Benachrichtigungen <
und >
angezeigt, die nur lokal sind, um das Debuggen und die Fortschrittserkennung zu erleichtern.
Beachten Sie, dass die Verbindung zur Gegenstelle 8-Bit-sauber sein muss, d. h. der SSH-, Telnet-, UART- oder welcher Kanal auch immer darf keine Escape-Sequenzen verarbeiten (anders als bei der Verwendung pscr
). Für SSH-Verbindungen bedeutet dies, dass Sie in der pscl
-Sitzung ssh -e none
verwenden müssen.
Als Nächstes folgen einige Beispiele für den Umgang mit Binärdateien xfer, wobei rfile die Remote-Datei und lfile die lokale Datei bezeichnet.
So starten Sie eine Sitzung zum lokalen Löschen von Remotedateien:
./pscl -B '1234:[stty -echo raw;echo GO;dd of=rfile.bin bs=1 count=7350;echo FIN]'
Hier müssen Sie die Datenmenge angeben, die die Gegenseite erwartet. Es würde auch ohne (zB cat>...
) funktionieren, aber dann bleibt die Sitzung hängen, nachdem die Übertragung beendet ist, da cat
endlos auf Eingaben wartet. Durch die Verwendung dd count=...
erhalten Sie einen sauberen Exit und werden durch die FIN-Markierung darüber benachrichtigt.
Dann ssh oder was auch immer nötig ist, um aus der gerade gestarteten pscl
Sitzung heraus eine Shell auf dem Remote-Gerät zu erhalten. Auf einem zweiten Terminal vor Ort:
dd if=lfile.bin|nc 127.0.0.1 1234
Dies stellt eine Verbindung zum lokalen Port 1234 von pscl
her und löst den Dump-Befehl auf der Remote-Seite aus, wobei die Binärdaten der lokalen lfile.bin
an die Remote-Geräte rfile.bin
weitergeleitet werden. Aufgrund der Geschwindigkeitsbegrenzung kann dies eine Weile dauern und Sie vertrauen Ihrem PSC-Fortschrittsbildschirm nur dann, wenn die Übertragung abgeschlossen ist. Der Befehl local dd ...|nc ...
zeigt Ihnen nur den lokalen Status an, der aufgrund lokaler TCP-Puffer ganze Dateien in Millisekunden verschlingen kann, während die Datei noch über den PTY übertragen wird. Stellen Sie also sicher, dass Sie nur dann Ctrl-C
drücken, wenn der pscl- Bildschirm Ihnen mitteilt, dass der Vorgang abgeschlossen ist, oder wenn Sie sehen, dass die FIN
-Endmarkierung in der dd ...|nc ...
Sitzung an Sie zurückgesendet wird.
Ebenso könnten ähnliche Befehle verwendet werden, um Binärdaten für forensische Zwecke von einem Remote-Gerät an die lokale Box zu übertragen. Wieder Start der Sitzung lokal:
./pscl -B '1234:[stty -echo raw;echo GO;dd if=rfile.bin]'
oder
./pscl -B '1234:[stty -echo raw;echo GO;cat rfile.bin]'
Führen Sie dann eine SSH-Verbindung zum Remote-Gerät durch, um die Shell abzurufen, und dann erneut lokal:
nc 127.0.0.1 1234|dd of=lfile.bin bs=1 count=7350
Um rfile.bin
mit der Größe 7350 zu erhalten, kopieren Sie es in die lokale Datei lfile.bin
Wenn stty -echo raw
auf dem Gerät nicht verfügbar ist, funktioniert auch etwas wie python -c "import tty;tty.setraw(0)"
. Beachten Sie, dass Sie auf dem Remote-Gerät ein tty (nicht nur eine Port-Shell) benötigen, wenn Sie Bounce-Befehle verwenden, da der stty
-Befehl zum Festlegen des Raw-Modus ein echtes tty erfordert.
Wenn psc über eine serielle Verbindung läuft, können verlorene Bits Ihren ganzen Spaß zerstören. Wenn Sie ohne HW FC arbeiten, kommt es möglicherweise zu Bitverlusten und hängengebliebenen Verbindungen, insbesondere da keine Drosselung erfolgt, wenn das Gerät bei der Verwendung von Bounce-Befehlen Daten in Ihre Richtung sendet. Das Übertragen von Daten auf das Gerät funktioniert besser, da diese Daten die pscl
Ratengrenzen überschreiten.
Hier sind jedoch einige Tipps, die mir geholfen haben, wenn es nicht möglich ist, pscr
auf dem Gerät und HW FC zu verwenden. Dies gilt nur bei der Verwendung von UARTs, da es sich hierbei um einen potenziell unzuverlässigen Transportkanal handelt.
pscr
auf dem Gerät, damit Sie eine Ratenbegrenzung für die in Ihre Richtung gesendeten Daten festlegen können. Da die Richtung zum Gerät immer geschwindigkeitsbegrenzt ist, können Sie Bounce-Befehle verwenden, um eine übergreifend kompilierte pscr
Binärdatei auf das Gerät zu übertragen und eine bidirektionale geschwindigkeitsbegrenzte Sitzung damit zu starten.tio -o 1
oder -o 2
um Verzögerungen zwischen gesendeten Ausgabebytes hinzuzufügen38400
obwohl die serielle Leitung auf 115200
eingestellt ist).psc
mit -DRESPECT_UART_BUFSIZE=4096
. Dies führt jedoch dazu, dass die Sitzung sehr langsam wird Im contrib
-Ordner finden Sie auch einen tio-noprefix
-Patch, um die Verarbeitung von Escape-Zeichen zu deaktivieren. Dieser Patch ist jedoch nur für ältere Versionen erforderlich, da die Originalautoren diesen Patch bereits akzeptiert und integriert haben. Ich empfehle wirklich, tio
zu verwenden, wenn UARTs verwendet werden.
Wenn Sie Bounce-Befehle in tio verwenden, müssen Sie Folgendes zu Ihrer ~/.tioconfig
Datei hinzufügen:
[default]
prefix-ctrl-key = none
Dadurch wird die ESC-Verarbeitung deaktiviert und Sie erhalten einen sauberen 8-Bit-Kanal.
Sie können SIGUSR1
an pscl
senden, damit Ihnen mitgeteilt wird, ob die Sitzung verschlüsselt ist. Wenn der Remote- pscr
abstürzt oder beendet wird, ohne dass die Möglichkeit besteht, dies dem lokalen Teil zu signalisieren, bleibt pscl
im Verschlüsselungsmodus und bleibt daher hängen. In diesem Fall können Sie durch Senden SIGUSR2
ein Zurücksetzen in den Klartextmodus erzwingen, sodass eine neue Sitzung gestartet werden kann.
Ab Version 0.64 unterstützt psc Scripting-Sockets, sodass Sie keinen screen
mehr benötigen, um Dateien abzurufen/abzulegen oder Einfügepuffer auf der Remote-Konsole zu sichern. Stattdessen starten Sie Ihre lokale Sitzung folgendermaßen:
~ > ./pscl -S ~/psc.script_sock
Anschließend können Sie es wie bisher verwenden. Wenn Sie etwas „einfügen“ müssen, das Ihnen gefällt:
~ > ./pscsh -S ~/psc.script_sock -f script_/helloworld
Dadurch wird der Inhalt von script_/helloworld
in die Konsole „eingegeben“. Während der Skripterstellung wird die stdin von pscl
blockiert, sodass die eingefügte Eingabe nicht mit der Eingabe verwechselt wird. Wenn -S
in pscsh
weggelassen wird, wird ~/psc.script_sock
automatisch verwendet. Aus Sicherheitsgründen müssen Skripte mit dem Präfix script_
beginnen.
Als Bonus bietet pscr
jetzt die Möglichkeit, Dateien mit Base64 zu kodieren/dekodieren, der Einfachheit halber sogar mit eingebetteten CR-Zeichen. Es ist kompatibel zu uuencode -m
.