如何在沒有文件路徑的情況下嗅探 unix dgram 套接字?
從那篇文章中,我意識到:
UNIX 域套接字綁定到文件路徑。
所以,我需要通過這裡
socat
提到的嗅探 DGRAM Unix 套接字。但是當我嘗試為此目的檢索路徑時,我發現目標應用程序使用了一個沒有文件路徑的套接字。該
ss -apex
命令顯示有和沒有文件路徑的結果,例如:u_dgr UNCONN 0 0 /var/lib/samba/private/msg.sock/32222 1345285 * 0 users:(("nmbd",pid=32222,fd=7)) u_dgr UNCONN 0 0 * 8567674 * 0 users:(("gnome-shell",pid=16368,fd=23))
從ss 手冊頁
* 8567674
我無法找到,例如沒有文件路徑是什麼意思。所以,兩個問題:
- 為什麼在某些情況下沒有指向 unix 套接字的文件路徑?
- 如何在
socat
沒有文件路徑的情況下通過嗅探 unix DGRAM 套接字?
問題 #1
Q1:從 ss 手冊頁我找不到,這是什麼意思,例如 * 8567674 沒有文件路徑。
從文件中,它解釋了 Address:Port 列,如下所示:
摘抄
ADDRESS_PATTERN的格式和語義取決於地址族。
- inet - ADDRESS_PATTERN由 IP 前綴組成,後跟冒號和埠可選。如果前綴或埠部分不存在或替換為 *,則表示萬用字元匹配。
- inet6 - 與inet相同,只是前綴指的是 IPv6 地址。不像inet冒號變得模棱兩可,所以 ss 允許使用方案,就像在 URL 中使用的那樣,其中地址被支持$$ … $$.
- unix - ADDRESS_PATTERN是 shell 樣式的萬用字元。
- 數據包格式看起來像inet,只有介面索引而不是埠和鏈路層協議 id 而不是地址。
- netlink - 格式看起來像inet,只有套接字 pid 保留而不是埠和 netlink 通道而不是地址。
PORT在語法上是帶有萬用字元地址部分的*ADDRESS_PATTERN 。*當然,對於 UNIX 套接字,它是未定義的。
最後一句話就是你的答案。
問題2
Q2:為什麼有些情況下沒有unix socket的文件路徑?
請參閱此 SO Q&A,標題為:如何在不創建套接字文件的情況下使用 unix 域套接字。
摘抄
您可以使用“抽象套接字地址”創建一個 unix 域套接字。只需將傳遞給綁定的
sun_path
字元串的第一個字元設置為。在此初始之後,將字元串寫入其餘部分並將其填充為with (或其他任何內容)。sockaddr_un``'\0'``NUL``sun_path``UNIX_PATH_MAX``NULs
以這種方式創建的套接字將沒有任何文件系統條目,….
問題 #3
Q3:如何在沒有文件路徑的情況下通過socat嗅探unix DGRAM socket?
一旦你知道什麼叫做什麼,再次Google搜尋:socat docs。
摘抄
- 抽象聆聽:
- 摘要-發送到:
- 摘要-RECVFROM:
- 摘要-RECV:
- 抽象客戶: >
> > ABSTRACT 地址幾乎與相關的 UNIX 地址相同,只是它們不定址基於文件系統的套接字,而是替代 UNIX 域地址空間。為了歸檔它,套接字地址字元串在內部以“\0”為前綴。此功能(僅?)在 Linux 上可用。選項組與相關的 UNIX 地址相同,只是 ABSTRACT 地址不是 NAMED 組的成員。 > > >