这个项目——以及它的姊妹项目崩溃——属于我的反审查工具集,它允许在敌对审查环境中设置完全工作的加密 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
的标准输入会被阻止,以便注入的输入不会与任何键入混淆。如果pscsh
中省略-S
,则自动使用~/psc.script_sock
。出于安全原因,脚本必须以script_
前缀开头。
作为奖励, pscr
现在包含对文件进行 Base64 编码/解码的功能,甚至为了方便起见还嵌入了 CR 字符。它与uuencode -m
兼容。