socat
2016/05/11 Chenxin整理
socat簡介
黑客小工具—socat
socat 被稱為是NC的plus,plus版,号稱NC的最強的衍生版本。socat是一款雙向資料流通道工具。具有許多強大的功能:端口的連接配接、端口偵聽、收發檔案、傳遞shell、端口轉發、端口掃描等
官方網站:socat
socat是一個多功能的網絡工具,名字來由是” Socket CAT”,可以看作是 netcat 的 N 倍加強版,socat 的官方網站: 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源代碼包
Index of /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:: 目标機器host對應端口portTCP-LISTEN: 本機監聽端口。
7.2.2 UDP UDP:: 目标機器host對應端口portUDP-LISTEN: 本機監聽端口。
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