socat
2016/05/11 Chenxin整理
socat簡介
黑客小工具—socat
socat 被稱為是NC的plus,plus版,號稱NC的最強的衍生版本。socat是一款雙向數據流通道工具。具有許多強大的功能:端口的連接、端口偵聽、收發文件、傳遞shell、端口轉發、端口掃描等
官方網站:http://www.dest-unreach.org/socat/
socat是一個多功能的網絡工具,名字來由是” Socket CAT”,可以看作是 netcat 的 N 倍加強版,socat 的官方網站: http://www.dest-unreach.org/socat/ 。
Socat是一個兩個獨立數據通道之間的雙向數據傳輸的繼電器。這些數據通道包含文件、管道、設備(終端或調制解調器等)、插座(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源代碼包
http://www.dest-unreach.org/socat/download/
socat的基本用法
監聽端口:
socat tcp-l:12345 -
發送數據到端口:
echo xxx | socat - tcp:127.0.0.1:12345
其中tcp-l是tcp-listen的簡寫,tcp是tcp-connect的簡寫,簡寫后就不比nc長多少了。
udp: udp-listen, udp-connect
unix socket: unix-listen, unix-connect
unix datagram socket: unix-recvfrom, unix-sendto
發送文件:
ip1 # socat -u open:a.txt tcp-listen:8888
ip2 # socat -u tcp:ip1:8888 open:a.txt,create
開telnet:
ip1 # socat tcp-listen:8888 exec:bash,pty,stderr
ip2 # socat readline tcp:ip1:888
端口轉發(好像是這樣,沒用過):
ip1(外網機器的內網地址) # socat tcp-listen:1234 tcp-listen:3389
ip2(內網機器) # socat tcp:ip1的外網地址:1234 tcp:ip1:3389
socat手冊部分
7.2.1 TCP TCP:
7.2.2 UDP UDP:
7.3.4 本地開啟端口
socat tcp-l:7777,reuseaddr,fork system:bash 同nc -l -p 7777 -e bash。
7.3.5 執行bash的完美用法
在目標上 socat tcp-l:8888 system:bash,pty,stderr 本地socat readline tcp:$target:8888 用readline替代-,就能支持歷史功能了。
在這個模式下的客戶端有本地一樣的效果
7.3.6 文件傳遞
再看文件傳遞的例子。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表示從第二個到第一個。文件傳完了,自動退出。
7.3.7 轉發
7.3.7.1 本地端口轉向遠程主機
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
7.3.7.2 端口映射
再來一個大家喜歡用的例子。在一個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端口上。
7.3.7.3 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
7.3.8 重定向
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上去。
7.3.9 讀寫分流
socat還具有一個獨特的讀寫分流功能,比如: socat open:read.txt!!open:write.txt,create,append tcp-listen:80,reuseaddr,fork 這個命令實現一個假的web server,客戶端連過來之后,就把read.txt里面的內容發過去,同時把客戶的數據保存到write.txt里面。”!!”符號用戶合並讀寫流,前面的用於讀,后面的用於寫。
7.3.10 通過openssl來加密傳輸過程
7.3.10.1 證書生成
FILENAME=server openssl genrsa -out $FILENAME.key 1024openssl req -new
-key $FILENAME.key -x509 -days
3653 -out $FILENAME.crtcat $FILENAME.key $FILENAME.crt >$FILENAME.pem 在當前目錄下生成 server.pem server.crt
7.3.10.2 使用
在服務端 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