PortShellCrypter-PSC
PortShellCrypter支持对shell会话进行E2E加密,可以帮助研究人员在完全不需要了解底层传输机制的情况下,对会话信息进行可靠的加密。除此之外,PortShellCrypter还可以发送/接收Base64编码的数据而无需对数据进行修改或过滤。除了接收E2E PTY之后,还可以转发TCP和UDP连接,这个功能有些类似于OpenSSH的-L参数。而且不需要在信息发起点本地分配IP地址,这将允许取证人员或渗透测试人员通过下列方式创建网络连接:
到设备的UART会话; ADB Shell会话,如果OEM adbd不支持TCP转发; Telnet会话; 不带ppp的调制解调器拨号; 其它类型的控制台登录方式; SSH/telnet/modem混合会话; ….
想象一下,在Shell会话中有一个不可见的ppp会话,而目标远程设备实际上不支持ppp,那么PortShellCrypter就可以发挥作用了。
PortShellCrypter支持在Linux、Android、OSX、FreeBSD、NetBSD和OpenBSD上运行。
PSC还提供了针对SOCKS4和SOCKS5代理的支持,以便通过Portshell或调制解调器拨号进行实际的Web浏览会话。
工具下载和项目构建
广大研究人员可以使用下列命令将该项目源码克隆至本地:
代码语言:javascript复制git clone https://github.com/stealth/psc.git
接下来,我们需要编辑Makefile来映射我们的预共享密钥,即在Makefile的头部编辑。然后,在Linux设备上切换到该项目目录,并运行make命令即可。
在BSD上,我们还需要安装GNU make,并调用gmake命令。
在macOS上,我们需要安装OpenSSL,并在Makefile中声明正确的安装路径,然后运行make命令即可。
在Linux系统上,PSC使用的是Unix98伪命令行终端,在其他系统上它将使用POSIX pty,不过对于用户来说不会有什么太大的区别。
工具使用
PortShellCrypter的使用非常简单且直接。在我们计算机上,执行pscl,然后传递需要转发的TCP或UDP端口号即可,比如说:
代码语言:javascript复制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会话连接远程站点之后,执行pscr命令:
代码语言:javascript复制linux:~ > ./pscr
PortShellCrypter [pscr] v0.60 (C) 2006-2020 stealth -- github.com/stealth/psc
pscl: Seen STARTTLS sequence, enabling crypto.
linux:~ >
一旦执行了pscr命令,两端就建立了一个加密握手,并在现有会话上建立了一个对我们透明的附加协议。然后,我们可以通过TCP连接到本地设备上的127.0.0.1:1234以达到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也很有用,我们可以将socks5和DNS端口转发到远程主机127.0.0.1地址。由于SSH不转发UDP数据包,因此通常会使用两个socat连接器或类似的连接器通过Tor节点进行解析。PSC的优点是保持UDP数据报边界,而SSH-L上的socat可能会打破数据报边界并创建格式错误的DNS请求。
会话将使用我们在Makefile中选择的PSK的aes_256_ctr进行加密。这种加密方案是可以修改的,但是添加AAD或OAD数据会破坏数据包的大小,因为在交互式会话中,由于Base64编码,每个类型的字符都会导致发送更多的数据。
UART会话可以通过屏幕使用,但不能通过minicom使用,因为minicom将创建带有状态行的不可见窗口,并充当破坏PSC协议的过滤器。PSC尝试检测过滤,并且可以承受一定数量的数据损坏,但在某些情况下无法恢复。tmux也有类似的东西。我们应该避免将pty处理程序与PSC堆叠在一起,因为PSC会过多地混乱/处理它们的传入数据。
在这里,我们需要为pscl和pscr设置SHELL环境变量,以便PSC知道在pty上执行哪个SHELL。默认情况下,大多数环境中都设置了SHELL,但如果没有设置,则需要像SHELL=/bin/bash pscl等那样执行PSC。
SOCKS4和SOCKS5支持
pscl还支持通过SOCKS4(-4端口)和SOCKS5(-5端口)转发TCP连接。这将端口设置为TCP连接的SOCKS端口,我们可以从portshell会话浏览远程网络,而无需在渗透测试期间打开任何其他连接。对于chrome,必须使用SOCKS4,因为pscsocks实现本身不支持解析域名。相反,它要求传递IPv4或IPv6地址。由于Chrome会将SOCKS5协议地址类型始终设置为域名(0x03)-即使在地址栏中输入了IP地址-SOCKS5不能与chrome一起使用。但是你可以将chrome与SOCKS4结合使用,因为这个协议只支持IPv4地址,而不支持域名。