小工具 · 2021年5月1日 0

Socat工具的使用方法

非常强大的多功能网络工具socat→Socket+Cat,官网在这里

主要特点是在两个流之间建立双向的通道,支持多种地址类型:ip, tcp, udp,pipe,exec,system,open,proxy,openssl

安装

源码安装:
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端口

反弹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

文件传输

使用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 -
  • 连接的时候可能会出现:certificate is valid but its commonName does not match hostname,可以在客户端处指定verify=0,也可以重新生成服务器的证书,指定Common Name。

引用

新版瑞士军刀:socat

socat 實用網路工具 和 使用解析 unix socket 方法

nc,socat,frp笔记