安装
源码安装: wget http://www.dest-unreach.org/socat/download/socat-1.7.4.1.tar.gz tar xzf socat-1.7.4.1.tar.gz ./configure make make install apt安装: sudo apt install socat
基本用法
socat在两个address直接建立的管道传输数据。不加参数就是双向的管道,若要建立单向的管道需要加–u(从左到右)或者–U(从右到左)参数
socat [options] <bi-address> <bi-address>
输入→输出
横杠是标准输入输出,下面的命令表示将输入连接到输出,输入什么就会在终端上输出什么。
socat - -
TCP连接
下面的命令可以用于建立TCP连接,建立TCP连接之后就可以开始发送消息了,横杠是标准输入输出,表示将对方的消息输出到终端。因为连接是双向的,所以左右两边可以交换位置
socat - tcp-listen:8888 //服务端监听8888端口 socat - tcp:127.0.0.1:8888 //客户端连接8888端口
UDP
使用UDP只能单向传输消息
socat - tcp-listen:8888 //服务端监听8888端口 socat - tcp:127.0.0.1:8888 //客户端的消息发送到对方的8888端口
SCTP
socat还支持某个比较冷门的协议:
socat - sctp-listen:8888 socat - sctp:127.0.0.1:8888
反弹shell
可以加上pty,stderr和setsid参数,也可以不加
服务器:socat tcp-listen:8888,fork,reuseaddr exec:/bin/bash,pty,stderr,setsid 或者:socat tcp-listen:8888,fork,reuseaddr system:bash,pty,stderr,setsid 客户端:socat readline tcp:127.0.0.1:8888 或者:socat - tcp:127.0.0.1:8888
反弹shell时也可以使用SCTP协议
socat sctp-listen:8888,fork,reuseaddr exec:/bin/bash,pty,stderr,setsid socat - sctp:127.0.0.1:8888
文件传输
使用–u参数指定方向为从左到右,在使用的时候传输文件只能传一次,第二次传输会提示传输到了文件尾,传不了任何东西。–U为从右到左,配合fork和reuseaddr参数可以进行多次传输。
socat -u open:1.mp4 tcp-listen:8888 socat -u tcp:127.0.0.1:8888 open:1.mp4,create
读写分离
传输index.html并将请求写入log.txt
socat open:index.html!!open:log.txt,create,append tcp-listen:8888,fork,reuseaddr
假Web服务器
只能返回静态页面,index.txt里需要加上完整的响应头,可以用ncat生成index.txt
socat -U tcp-listen:80,reuseaddr,fork open:index.txt
用ncat生成index.txt:
printf "GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n"|ncat www.baidu.com 443 --ssl >> index.txt
流媒体
结合Linux管道实现,可多次请求。(可能没什么用)
服务器:socat -U tcp-listen:4444,fork,reuseaddr open:1.mp4 客户端:socat -U - tcp:192.168.145.129:8888 | mplayer -vo x11 -cache 30000 -
端口转发
将内网的3389端口映射到公网的3389端口,可用于远程连接,但是只能连接一次,所以并没有什么用。
有公网ip的服务器:socat tcp-listen:8888,fork,reuseaddr tcp-listen:3389,fork,reuseaddr 内网的电脑:socat tcp:yourip:8888 tcp:localhost:3389
加密连接
客户端和服务器都要有证书,将服务器crt文件复制到客户端,客户端crt文件复制到服务器。然后将tcp换成openssl,填写好参数,就能实现加密连接。
生成证书(服务器):
openssl genrsa -out server.key 2048 openssl req -new -key server.key -x509 -days 3653 -out server.crt //然后输入一些信息就能生成crt文件,在这里可以指定Common Name cat server.key server.crt >server.pem
生成证书(客户端):
openssl genrsa -out client.key 2048 openssl req -new -key client.key -x509 -days 3653 -out client.crt //客户端一路回车就行 cat client.key client.crt >client.pem
开启连接:
服务器:socat openssl-listen:4433,reuseaddr,cert=server.pem,cafile=client.crt - 客户端:socat openssl:localhost:4433,reuseaddr,cert=client.pem,cafile=server.crt -
引用