這個專案——以及它的姊妹專案崩潰——屬於我的反審查工具集,它允許在敵對審查環境中設定完全工作的加密 shell 和 TCP/UDP 轉送。當沒有其他方法可用時,透過 UART 或 adb 從設備轉儲資料對於取證也很有用。
DNS 查找和 SSH 會話透過 UART 連線轉送至 Pi
PSC 允許 e2e 加密 shell 會話(單跳或多跳),與底層傳輸無關,只要它可靠且可以發送/接收 Base64 編碼資料而無需修改/過濾。除了您收到的 e2e pty(例如在 port-shell 內)之外,您還可以轉送 TCP 和 UDP 連接,類似於 OpenSSH 的-L
參數。此操作透明地進行,無需在起始點本地分配 IP 位址。這允許取證人員和筆測試人員建立網路連接,例如通過:
adb shell
會話,如果 OEM adbd
不支援 TCP 轉送想像一下,您的 shell 會話中有一個不可見的 ppp 會話,而遠端對等點實際上不支援 ppp。
它運行在Linux、Android、OSX、Windows、FreeBSD、NetBSD和(可能) OpenBSD上。
PSC 還包括SOCKS4和SOCKS5代理程式支持,以便透過連接埠 shell 或數據機撥號遠端進行實際的 Web 瀏覽工作階段。
編輯Makefile
以反映您的預先共用金鑰,如Makefile
頂部所定義。
然後只需在Linux和OSX上輸入make
即可。
在BSD上,您需要安裝GNU make並呼叫gmake
。
在Windows上,您需要安裝 cygwin 並選擇適當的gcc, gcc-g++, make
和git
軟體套件。
在Linux上,PSC 將使用Unix98偽終端,在其他系統上它將使用POSIX pty,但這對您來說應該是透明的。我曾經出於特殊原因在石器時代添加了4.4BSD pty 和SunOS支持,因此即使使用Solaris也可能會也可能不會建造。
自豪贊助:
簡單明了。在本機上,執行pscl
,並將您想要從遠端站台轉送至特定位址的任何 TCP 或 UDP 連接埠傳遞。例如:
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 ... ]
在具有 shell 會話的遠端站點(最後一跳)上,無論它是否在連接埠 shell、SSH、控制台登入等中,您都可以執行pscr
:
linux:~ > ./pscr
PortShellCrypter [pscr] v0.60 (C) 2006-2020 stealth -- github.com/stealth/psc
pscl: Seen STARTTLS sequence, enabling crypto.
linux:~ >
執行pscr
後,兩端都會建立加密握手,並在現有會話上建立一個對您透明的附加協定。然後,您可以連接到本機上的127.0.0.1:1234
,以透過 TCP 到達192.168.0.254:22
或透過 UDP 到達8.8.8.8
解析器。如果遠端站點具有 IPv6 連接,這也適用於 [IPv6] 位址。實際上,您甚至可以使用它將 IPv4 軟體轉換為 IPv6,因為您始終在本地連接到127.0.0.1
。
您可以傳遞多個-T
和-U
參數。如果您遺失了會話是否已進行 e2e 加密的訊息,您可以向本機pscl
進程發送SIGUSR1
,它會告訴您。
如果您想從遠端 SSH shell 使用 tor,PSC 也很有用,您可以將ocks5 和 DNS 連接埠轉送到遠端主機127.0.0.1
位址。由於 SSH 不會轉送 UDP 封包,因此您通常會使用兩個socat
連接器或類似的連接器透過 tor 節點進行解析。 PSC 的優點是保留 UDP 資料封包邊界,而SSH -L
上的socat
可能會破壞資料封包邊界並建立格式錯誤的 DNS 請求。
該會話將使用您在Makefile
中選擇的 PSK 的aes_256_ctr
進行加密。這種加密方案具有可塑性,但添加AAD 或OAD 資料會增加資料包大小,其中每個位元組都很重要,因為在互動式會話中並且由於Base64 編碼,每個鍵入的字元已經導致發送更多數據。
UART 會話可以透過screen
使用,但例如無法透過minicom
使用,因為 minicom 將建立具有狀態行的不可見窗口,並且充當破壞 PSC 協定的過濾器。 PSC 嘗試偵測過濾並可以承受一定程度的資料損壞,但在某些情況下無法復原。與tmux
類似。您應該避免將 pty 處理程序與 PSC 堆疊在一起,因為它們會過度混亂/處理傳入的資料。
需要為pscl
和pscr
設定SHELL
環境變量,以便 PSC 知道在 pty 上執行哪個 shell。大多數環境中預設設定了SHELL
,但如果沒有設置,則需要執行 PSC,如SHELL=/bin/bash pscl
等。
pscl
也支援透過SOCKS4 ( -4 port
)和SOCKS5 ( -5 port
)轉送 TCP 連線。這會將連接埠設定為 TCP 連接的 SOCKS 連接埠,因此,例如,您可以從連接埠 shell 會話瀏覽遠端網絡,而無需在筆測試期間開啟任何其他連接。如果將-N
傳遞給pscl
,它會在遠端啟用 DNS 名稱解析,因此您也可以使用 chrome。但請注意:瀏覽器在啟動時嘗試解析一系列不受您控制的 DNS 名稱序列,因此存在隱私問題。此外,如果您的遠端的 DNS 設定損壞,且 DNS 回覆封包遺失,您的鍵入 shell 可能會阻塞幾秒鐘。沒有好的可嵌入和可移植的非同步解析器函數,因此我不得不依賴單線程中的getaddrinfo()
但如果存在 DNS 問題,代價可能是阻塞幾秒鐘。這就是為什麼必須明確啟用名稱解析。 pscr
試圖透過 DNS 查找快取來最小化這個潛在問題,因此在大多數情況下它應該可以輕鬆工作。如果您傳遞-X IP-address
(必須是第一個參數),您可以將本機代理程式綁定到不同於127.0.0.1
位址,以便您可以在本機網路中共用代理程式。
psc功能允許跨多個躍點從遠端裝置轉送 TCP 連線或二進位資料 blob,即使無法在遠端站台安裝pscr
二進位檔案也是如此。如果您沒有任何方法從裝置(例如,可以是 UART 連線的電話)下載工件,或需要在不接觸 FS 的情況下轉送連線以免破壞系統上的證據,或當root-FS 已安裝,您無法上傳工具集。
這是一個非常酷的功能,因為您可以看到 TCP 連線透過本機 tty 跳到遠端機器,而無需遠端安裝任何東西。
這僅由本地 pty punkrock 工作,並將反彈命令移交給pscl
,該命令將落在遠端 shell 上(不運行pscr
),以及一些在本地過濾和處理資料的狀態引擎魔法。通常這需要先將遠端 pty 設定為原始模式,然後再發出實際命令和傳遞給-B
一些其他詳細資訊。論證分為以下幾個部分:
:
,例如1234:
。stty -echo raw
或python -c "import tty;tty.setraw(0)"
(注意引號正確,因為-B
也需要引號)或任何類似的東西。pscl
開始發送資料以避免stty
實際發生和 cmd 開始之間的競爭,例如echo GO
是完美的。nc 127.0.0.1 22
將本機連接埠 1234 反彈到遠端的 SSH 伺服器pscl
重置其 tty 狀態。 echo FIN
就可以了。建議使用,否則您可能無法辨識指令的結尾。;
分隔。並用括號括起來。範例:
如果要轉送 TCP 連接,此範例需要在裝置上安裝stty
和nc
,但理論上它可以是具有同等功能的任何其他東西。
啟動本機會話:
./pscl -B '1234:[stty -echo raw;echo GO;nc example.com 22;echo FIN]'
如果您本地連接到連接埠 1234,這將向遠端裝置發出命令stty -echo raw;echo GO;nc example.com 22;echo FIN
,然後只轉送它看到的任何資料來回並對流量進行速率限制,以便它不會超過設備的tty 速度(預設為115200)。
當 pscl 會話啟動時,透過 UART、 ssh -e none ...
或其他任何方式連接到遠端設備,一旦您擁有遠端 shell,也可以在本機輸入:
ssh [email protected] -p 1234
將 SSH 連線從本機裝置透過遠端裝置反彈到example.com
目標。當然, pscr
變體是首選,因為-B
一次只能反彈一個連接(儘管您可以為各種轉發傳遞多個-B
命令),並且有機會在 TCP 會話之後掛起 shell,因為 pty 處於raw -echo
模式,並且根據最終遠端對等點是否也關閉連接,shell 可能會在此之後掛起。如果您碰巧發現連接已完成的 pscl 通知並看到提示,則應reset
它,以便可以啟動新的連線。轉發資料時,您將在pscl
中看到 7 位元 ASCII <
和>
通知,這些通知只是本地的,以便於偵錯和進度檢測。
請注意,與遠端站點的連接必須是 8 位元乾淨的,即 ssh、telnet、UART 或任何通道不得處理轉義序列(與使用pscr
時不同)。對於 ssh 連接,這意味著您必須在pscl
會話中使用ssh -e none
。
接下來,按照一些範例來處理二進位檔案 xfer,其中rfile表示遠端文件, lfile表示本機檔案。
若要在本機啟動會話以刪除遠端檔案:
./pscl -B '1234:[stty -echo raw;echo GO;dd of=rfile.bin bs=1 count=7350;echo FIN]'
您需要在其中指定遠端期望的資料量。它也可以在沒有(例如cat>...
)的情況下工作,但是會話將在傳輸完成後掛起,因為cat
無休止地等待輸入。透過使用dd count=...
,您將獲得乾淨的退出並透過 FIN 標記收到通知。
然後,ssh 或任何從剛啟動的pscl
會話中取得遠端裝置上的 shell 所需的內容。在本地第二個終端上:
dd if=lfile.bin|nc 127.0.0.1 1234
它將連接到pscl
的本機連接埠 1234 並觸發遠端的 dump 命令,將本機lfile.bin
的二進位資料轉送到遠端rfile.bin
。由於速率限制,這可能需要一段時間,並且您只相信您的 psc 進度畫面是否已傳輸完成。 local dd ...|nc ...
指令只會顯示本地狀態,由於本地 TCP 緩衝區,該狀態可以在幾毫秒內吃掉整個文件,而文件仍在透過 pty 傳輸。因此,請確保僅在pscl螢幕告訴您已完成或您在dd ...|nc ...
會話中看到FIN
結束標記回顯時才按Ctrl-C
。
同樣,類似的命令可用於將二進位資料從遠端設備傳輸到本機設備以用於取證目的。再次在本地開始會話:
./pscl -B '1234:[stty -echo raw;echo GO;dd if=rfile.bin]'
或
./pscl -B '1234:[stty -echo raw;echo GO;cat rfile.bin]'
然後,ssh 到遠端設備以取得 shell,然後再次在本機:
nc 127.0.0.1 1234|dd of=lfile.bin bs=1 count=7350
取得大小為7350的rfile.bin
複製到本機檔案lfile.bin
如果stty -echo raw
在裝置上不可用,類似python -c "import tty;tty.setraw(0)"
的方法也可以使用。請注意,在遠端設備上使用反彈命令時,您需要有一個 tty(不僅僅是連接埠 shell),因為設定原始模式的stty
命令需要一個真正的 tty。
如果psc透過串列連接運行,丟失的位元可能會扼殺您的所有樂趣。如果您在沒有 HW FC 的情況下運行,您最終會遇到位元遺失和掛起的連接,特別是當裝置在使用反彈命令時向您的方向發送資料時沒有節流。當資料通過pscl
速率限制時,將資料轉儲到設備效果更好。
但是,在無法在裝置和 HW FC 上使用pscr
情況下,以下是一些對我有用的提示。這僅適用於使用 UART 時,因為這是一個可能不可靠的傳輸通道。
pscr
,以便您可以設定傳送到您的方向的資料的速率限制。由於朝向裝置的方向始終受到速率限制,因此您可以使用反彈命令將交叉編譯的pscr
二進位檔案轉儲到設備,並與其啟動雙向速率限制會話。tio -o 1
或-o 2
在發送的輸出位元組之間添加延遲38400
,儘管串行線已設定115200
)-DRESPECT_UART_BUFSIZE=4096
編譯psc
,但這會使會話非常慢在contrib
資料夾中,您還可以找到一個tio-noprefix
補丁來停用轉義字元處理,但此補丁僅對於舊版本是必需的,因為上游已經接受並整合了此補丁。我強烈建議在使用 UART 時使用tio
。
在tio中使用彈跳指令時,您必須新增至~/.tioconfig
檔:
[default]
prefix-ctrl-key = none
它會禁用 ESC 處理並為您提供 8 位元乾淨通道。
您可以將SIGUSR1
傳送到pscl
以便它告訴您會話是否已加密。如果遠端pscr
死亡或退出而無法向本地部分發出訊號, pscl
將保持加密模式並因此掛起。在這種情況下,您可以透過傳送SIGUSR2
強制重設為純文字模式,以便可以啟動新會話。
從版本 0.64 開始, psc支援腳本套接字,因此您不再需要screen
來取得/放置檔案或將貼上緩衝區轉儲到遠端控制台。相反,您可以像這樣啟動本機會話:
~ > ./pscl -S ~/psc.script_sock
然後您可以像以前一樣繼續使用它。如果您需要「貼上」您喜歡的內容:
~ > ./pscsh -S ~/psc.script_sock -f script_/helloworld
這會將script_/helloworld
的內容「輸入」到控制台。編寫腳本時, pscl
的 stdin 會被阻止,以便注入的輸入不會與任何鍵入混淆。如果pscsh
中省略-S
,則自動使用~/psc.script_sock
。出於安全原因,腳本必須以script_
前綴開頭。
作為獎勵, pscr
現在包含對檔案進行 Base64 編碼/解碼的功能,甚至為了方便起見也嵌入了 CR 字元。它與uuencode -m
相容。