非常强大的多功能网络工具socat→Socket+Cat,官网在这里
主要特点是在两个流之间建立双向的通道,支持多种地址类型:ip, tcp, udp,pipe,exec,system,open,proxy,openssl
安装1
2
3
4
5
6
7
8
9
源码安装:
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(从右到左)参数
1
socat [ options] <bi-address> <bi-address>
输入→输出横杠是标准输入输出,下面的命令表示将输入连接到输出,输入什么就会在终端上输出什么。
TCP连接下面的命令可以用于建立TCP连接,建立TCP连接之后就可以开始发送消息了,横杠是标准输入输出,表示将对方的消息输出到终端。因为连接是双向的,所以左右两边可以交换位置
1
2
socat - tcp-listen:8888 //服务端监听8888端口
socat - tcp:127.0.0.1:8888 //客户端连接8888端口
UDP使用UDP只能单向传输消息
1
2
socat - tcp-listen:8888 //服务端监听8888端口
socat - tcp:127.0.0.1:8888 //客户端的消息发送到对方的8888端口
SCTPsocat还支持某个比较冷门的协议:
1
2
socat - sctp-listen:8888
socat - sctp:127.0.0.1:8888
反弹shell可以加上pty,stderr和setsid参数,也可以不加
1
2
3
4
5
服务器: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协议
1
2
socat sctp-listen:8888,fork,reuseaddr exec:/bin/bash,pty,stderr,setsid
socat - sctp:127.0.0.1:8888
文件传输使用-u参数指定方向为从左到右,在使用的时候传输文件只能传一次,第二次传输会提示传输到了文件尾,传不了任何东西。-U为从右到左,配合fork和reuseaddr参数可以进行多次传输。
1
2
socat -u open:1.mp4 tcp-listen:8888
socat -u tcp:127.0.0.1:8888 open:1.mp4,create
读写分离传输index.html并将请求写入log.txt
1
socat open:index.html!!open:log.txt,create,append tcp-listen:8888,fork,reuseaddr
假Web服务器只能返回静态页面,index.txt里需要加上完整的响应头,可以用ncat生成index.txt
1
2
3
4
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管道实现,可多次请求。(可能没什么用)
1
2
服务器: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端口,可用于远程连接,但是只能连接一次。
1
2
有公网ip的服务器:socat tcp-listen:8888,fork,reuseaddr tcp-listen:3389,fork,reuseaddr
内网的电脑:socat tcp:yourip:8888 tcp:localhost:3389
加密连接客户端和服务器都要有证书,将服务器crt文件复制到客户端,客户端crt文件复制到服务器。然后将tcp换成openssl,填写好参数,就能实现加密连接。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
生成证书( 服务器) :
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 -
连接的时候可能会出现:certificate is valid but its commonName does not match hostname,可以在客户端处指定verify=0,也可以重新生成服务器的证书,指定Common Name。 引用新版瑞士军刀:socat
socat 實用網路工具 和 使用解析 unix socket 方法
nc,socat,frp笔记