Linux-Kernel
如何“追踪”一個 unix 域套接字?
有點難以解釋,但我注意到在
strace
打開套接字的 PID 時,我看不到任何通信。我怎樣才能坐在套接字文件的中間觀看通信?
套接字是用於通信的核心 API。使用套接字 API,您可以通過 TCP/IP 連接、SCTP 關聯、UDP 數據報在兩個端點之間交換數據,或者使用 Unix 域套接字在兩個程序(數據報或連接)之間交換數據……
作為核心 API,任何與套接字的互動都是通過系統呼叫(
socket
,bind
,connect
,listen
,accept
,sendmsg
,send
,recv
,write/read
…)。所以通常情況下,
strace
將能夠跟踪那些,因為strace
跟踪系統呼叫。唯一strace
無法追踪的通信機制是共享記憶體上的 IPC(因為在記憶體中讀/寫某些東西顯然不涉及系統呼叫)。更有可能的是,在你的情況下,它是別的東西。我敢打賭,該應用程序是多執行緒的,並且您沒有跟踪正確的執行緒。或者可能是應用程序是 setuid/setgid 並且沒有以超級使用者身份啟動。
如果您想跟踪通過 Unix 域套接字交換的內容,可以選擇:
strace
和其他ptrace
調試器(跟踪伺服器或客戶端)- 審計系統(
auditd
/auditctl
),再次跟踪系統呼叫- 使用
LD_PRELOAD
技巧來包裝與套接字互動的系統呼叫- 檢測應用程序的程式碼以在其中添加日誌記錄。
- 如前所述,systemtap 和其他低級核心跟踪/調試系統
- 在中間插入一個人。
例如,對於 MITM,您可以使用
socat
. 這裡是面向連接的 Unix 域套接字,如 X11:socat -x unix-listen:/tmp/.X11-unix/X42,fork unix:/tmp/.X11-unix/X0 DISPLAY=:42 xlogo
然後,您會看到
xlogo
與 X 伺服器交換的 X11 流量。