倾旋的博客

倾旋的博客

现阶段在进行有效性验证/攻击模拟相关的安全研究工作,我的博客会记录一些我的学习过程和部分安全技术研究成果。

09 Nov 2017

socat 使用手册

socat简介

socat是一个多功能的网络工具,名字来由是” Socket CAT”,可以看作是netcat的N倍加强版,socat的官方网站:http://www.dest-unreach.org/socat/ 。

Socat是一个两个独立数据通道之间的双向数据传输的继电器。这些数据通道包含文件、管道、设备(终端或调制解调器等)、socket(Unix,IP4,IP6 - raw,UDP,TCP)、SSL、SOCKS4客户端或代理CONNECT。

Socat支持广播和多播、抽象Unix sockets、Linux tun/tap、GNU readline 和 PTY。它提供了分叉、记录和进程间通信的不同模式。多个选项可用于调整socat和其渠道,Socat可以作为TCP中继(一次性或守护进程),作为一个守护进程基于socksifier,作为一个shell Unix套接字接口,作为IP6的继电器,或面向TCP的程序重定向到一个串行线。

socat的主要特点就是在两个数据流之间建立通道;且支持众多协议和链接方式:ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl,socket等。

socat的安装

网络安装:

ps:Kali linux 里已经集成了此工具

下载软件包

下载socat源代码包:http://www.dest-unreach.org/socat/download/

编译安装

把下载的软件包解压后按照传统的方式编译安装:

1
2
3
./configure
make
make install

具体的细节可以参考安装文档 README 。

安装错误解决

在编译的过程中可能遇到如下错误:

解决方法有两种:

./configure --disable-fips

首先到网站http://www.openssl.org/source/ 下载openssl-fips安装包,然后解压安装:

1
2
3
./config
make
make install

socat的使用

socat的具体文档参见网站:http://www.dest-unreach.org/socat/doc/socat.html 。

工作机理

socat的运行有4个阶段:

1
2
TCP:<host>:<port> 目标机器IP对应端口port
TCP-LISTEN:<port> 本机监听端口。
1
2
UDP:<host>:<port> 目标机器host对应端口port
UDP-LISTEN:<port> 本机监听端口。

需要一个证书,否则会失败提示: 2012/04/06 11:29:11 socat[1614] E SSL_connect(): error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

1
2
OPENSSL:<host>:<port> 目标机器host对应端口port
OPENSSL-LISTEN:<port> 本机监听端口。

TUN[:<if-addr>/<bits>] 建立vpn,双方都需要root权限。

典型使用

连接目标

socat - tcp:192.168.1.18:80

这个命令等同于 nc 192.168.1.18 80。

socat里面,必须有两个流,所以第一个参数-代表标准的输入输出,第二个流连接到192.168.1.18的80端口。

socat -d -d READLINE,history=$HOME/.http_history TCP4:www.qq.com:80

这个例子支持历史记录查询,类似于bash的历史记录。

反向连接

再看一个反向telnet的例子: on server:

socat tcp-listen:23 exec:cmd,pty,stderr

这个命名把cmd绑定到端口23,同时把cmd的Stderr复位向到stdout。

on client:

socat readline tcp:server:23

连接到服务器的23端口,即可获得一个cmd shell。readline是gnu的命令行编辑器,具有历史功能。

向远程端口发数据

echo “test” | socat – tcp-connect:127.0.0.1:12345

本地开启端口

socat tcp-l:7777,reuseaddr,fork system:bash

同nc -l -p 7777 -e bash。

执行bash的完美用法

| 服务端 | socat tcp-l:8888 system:bash,pty,stderr| | 本地 | socat readline tcp:$target:8888 |

用readline替代-,就能支持历史功能了。在这个模式下的客户端有本地一样的效果

文件传递

再看文件传递的例子。nc也经常用来传递文件,但是nc有一个缺点,就是不知道文件什么时候传完了,一般要用Ctrl+c来终止,或者估计一个时间,用-w参数来让他自动终止。用socat就不用这么麻烦了:

| 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

这个命令把文件myfile.exe用二进制的方式,从host 1 传到host 2。-u 表示数据单向流动,从第一个参数到第二个参数,-U表示从第二个到第一个。文件传完了,自动退出。

转发

| 本地端口转向远程主机 | socat TCP4-LISTEN:8888 TCP4:www.qq.com:80 |

如果需要使用并发连接,则加一个fork,如下:

socat TCP4-LISTEN:8888,fork TCP4:www.qq.com:80

本地监听8888端口,来自8888的连接重定向到目标www.qq.com:80

端口映射

再来一个大家喜欢用的例子。在一个NAT环境,如何从外部连接到内部的一个端口呢?只要能够在内部运行socat就可以了。

| 外部 | socat tcp-listen:1234 tcp-listen:3389 | | 内部 | socat tcp:outerhost:1234 tcp:192.168.12.34:3389 |

这样,你外部机器上的3389就映射在内部网192.168.12.34的3389端口上。

VPN

| 服务端 | socat -d -d TCP-LISTEN:11443,reuseaddr TUN:192.168.255.1/24,up | | 客户端 | socat TCP:1.2.3.4:11443 TUN:192.168.255.2/24,up |

重定向

socat TCP4-LISTEN:80,reuseaddr,fork TCP4:192.168.123.12:8080

|TCP4-LISTEN | 在本地建立的是一个TCP ipv4协议的监听端口| | reuseaddr | 绑定本地一个端口; |fork|设定多链接模式,即当一个链接被建立后,自动复制一个同样的端口再进行监听|

socat启动监听模式会在前端占用一个shell,因此需使其在后台执行。

socat -d -d tcp4-listen:8900,reuseaddr,fork tcp4:10.5.5.10:3389

或者

socat -d -d -lf /var/log/socat.log TCP4-LISTEN:15000,reuseaddr,fork,su=nobody TCP4:static.5iops.com:15000

-d -d -lf /var/log/socat.log是参数,前面两个连续的-d -d代表调试信息的输出级别,-lf则指定输出信息的保存文件。

TCP4-LISTEN:15000,reuseaddr,fork,su=nobody是一号地址,代表在15000端口上进行TCP4协议的监听,复用绑定的IP,每次有连接到来就fork复制一个进程进行处理,同时将执行用户设置为nobody用户。

TCP4:static.5iops.com:15000是二号地址,代表将socat监听到的任何请求,转发到static.5iops.com:15000上去。

读写分流

socat还具有一个独特的读写分流功能,比如:

socat open:read.txt!!open:write.txt,create,append tcp-listen:80,reuseaddr,fork

这个命令实现一个假的web server,客户端连过来之后,就把read.txt里面的内容发过去,同时把客户的数据保存到write.txt里面。”!!”符号用户合并读写流,前面的用于读,后面的用于写。

通过openssl来加密传输过程

证书生成

1
2
3
FILENAME=60.*.*.*
openssl genrsa -out $FILENAME.key 1024
openssl req -new -key $FILENAME.key -x509 -days 3653 -out $FILENAME.crtcat $FILENAME.key $FILENAME.crt >$FILENAME.pem

在当前目录下生成 server.pem 、server.crt

使用

|服务端 |socat openssl-listen:4433,reuseaddr,cert=srv.pem,cafile=srv.crt system:bash,pty,stderr | |本地 | socat readline openssl:localhost:4433,cert=srv.pem,cafile=srv.crt |