用簡單的話來定義tcpmp,就是:mp the traffic on a network,根據使用者的定義對網路上的數據包進行截獲的包分析工具。 tcpmp可以將網路中傳送的數據包的「頭」完全截獲下來提供分析。它支持針對網路層、協議、主機、網路或埠的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的信息。
實用命令實例
默認啟動
tcpmp
普通情況下,直接啟動tcpmp將監視第一個網路介面上所有流過的數據包。
監視指定網路介面的數據包
tcpmp -i eth1
如果不指定網卡,默認tcpmp只會監視第一個網路介面,一般是eth0,下面的例子都沒有指定網路介面。
監視指定主機的數據包
列印所有進入或離開sundown的數據包.
tcpmp host sundown
也可以指定ip,例如截獲所有210.27.48.1 的主機收到的和發出的所有的數據包
tcpmp host 210.27.48.1
列印helios 與 hot 或者與 ace 之間通信的數據包
tcpmp host helios and \( hot or ace \)
截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通信
tcpmp host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
列印ace與任何其他主機之間通信的IP 數據包, 但不包括與helios之間的數據包.
tcpmp ip host ace and not helios
如果想要獲取主機210.27.48.1除了和主機210.27.48.2之外所有主機通信的ip包,使用命令:
tcpmp ip host 210.27.48.1 and ! 210.27.48.2
截獲主機hostname發送的所有數據
tcpmp -i eth0 src host hostname
監視所有送到主機hostname的數據包
tcpmp -i eth0 dst host hostname
監視指定主機和埠的數據包
如果想要獲取主機210.27.48.1接收或發出的telnet包,使用如下命令
tcpmp tcp port 23 and host 210.27.48.1
對本機的udp 123 埠進行監視 123 為ntp的服務埠
tcpmp udp port 123
監視指定網路的數據包
列印本地主機與Berkeley網路上的主機之間的所有通信數據包(nt: ucb-ether, 此處可理解為'Berkeley網路'的網路地址,此表達式最原始的含義可表達為: 列印網路地址為ucb-ether的所有數據包)
tcpmp net ucb-ether
列印所有通過網關snup的ftp數據包(注意, 表達式被單引號括起來了, 這可以防止shell對其中的括弧進行錯誤解析)
tcpmp 'gateway snup and (port ftp or ftp-data)'
列印所有源地址或目標地址是本地主機的IP數據包
(如果本地網路通過網關連到了另一網路, 則另一網路並不能算作本地網路.(nt: 此句翻譯曲折,需補充).localnet 實際使用時要真正替換成本地網路的名字)
tcpmp ip and not net localnet
B. Tcpmp 看這一篇就夠了
tcpmp 是一款強大的網路抓包工具,它使用 libpcap 庫來抓取網路數據包,這個庫在幾乎在所有的 Linux/Unix 中都有。熟悉 tcpmp 的使用能夠幫助你分析調試網路數據,本文將通過一個個具體的示例來介紹它在不同場景下的使用方法。不管你是系統管理員,程序員,雲原生工程師還是 yaml 工程師,掌握 tcpmp 的使用都能讓你如虎添翼,升職加薪。
tcpmp 的常用參數如下:
額外再介紹幾個常用參數:
-A 表示使用 ASCII 字元串列印報文的全部數據,這樣可以使讀取更加簡單,方便使用 grep 等工具解析輸出內容。 -X 表示同時使用十六進制和 ASCII 字元串列印報文的全部數據。這兩個參數不能一起使用。例如:
後面可以跟上協議名稱來過濾特定協議的流量,以 UDP 為例,可以加上參數 udp 或 protocol 17 ,這兩個命令意思相同。
同理, tcp 與 protocol 6 意思相同。
使用過濾器 host 可以抓取特定目的地和源 IP 地址的流量。
也可以使用 src 或 dst 只抓取源或目的地:
使用 tcpmp 截取數據報文的時候,默認會列印到屏幕的默認輸出,你會看到按照順序和格式,很多的數據一行行快速閃過,根本來不及看清楚所有的內容。不過,tcpmp 提供了把截取的數據保存到文件的功能,以便後面使用其他圖形工具(比如 wireshark,Snort)來分析。
-w 選項用來把數據報文輸出到文件:
如果想實時將抓取到的數據通過管道傳遞給其他工具來處理,需要使用 -l 選項來開啟行緩沖模式(或使用 -c 選項來開啟數據包緩沖模式)。使用 -l 選項可以將輸出通過立即發送給其他命令,其他命令會立即響應。
過濾的真正強大之處在於你可以隨意組合它們,而連接它們的邏輯就是常用的 與/AND/&& 、 或/OR/|| 和 非/not/!。
關於 tcpmp 的過濾器,這里有必要單獨介紹一下。
機器上的網路報文數量異常的多,很多時候我們只關系和具體問題有關的數據報(比如訪問某個網站的數據,或者 icmp 超時的報文等等),而這些數據只佔到很小的一部分。把所有的數據截取下來,從裡面找到想要的信息無疑是一件很費時費力的工作。而 tcpmp 提供了靈活的語法可以精確地截取關心的數據報,簡化分析的工作量。這些選擇數據包的語句就是過濾器(filter)!
Host 過濾器用來過濾某個主機的數據報文。例如:
該命令會抓取所有發往主機 1.2.3.4 或者從主機 1.2.3.4 發出的流量。如果想只抓取從該主機發出的流量,可以使用下面的命令:
Network 過濾器用來過濾某個網段的數據,使用的是 CIDR[2] 模式。可以使用四元組(x.x.x.x)、三元組(x.x.x)、二元組(x.x)和一元組(x)。四元組就是指定某個主機,三元組表示子網掩碼為 255.255.255.0,二元組表示子網掩碼為 255.255.0.0,一元組表示子網掩碼為 255.0.0.0。例如,
抓取所有發往網段 192.168.1.x 或從網段 192.168.1.x 發出的流量:
抓取所有發往網段 10.x.x.x 或從網段 10.x.x.x 發出的流量:
和 Host 過濾器一樣,這里也可以指定源和目的:
也可以使用 CIDR 格式:
Proto 過濾器用來過濾某個協議的數據,關鍵字為 proto,可省略。proto 後面可以跟上協議號或協議名稱,支持 icmp, igmp, igrp, pim, ah, esp, carp, vrrp, udp和 tcp。因為通常的協議名稱是保留欄位,所以在與 proto 指令一起使用時,必須根據 shell 類型使用一個或兩個反斜杠(/)來轉義。Linux 中的 shell 需要使用兩個反斜杠來轉義,MacOS 只需要一個。
例如,抓取 icmp 協議的報文:
Port 過濾器用來過濾通過某個埠的數據報文,關鍵字為 port。例如:
截取數據只是第一步,第二步就是理解這些數據,下面就解釋一下 tcpmp 命令輸出各部分的意義。
最基本也是最重要的信息就是數據報的源地址/埠和目的地址/埠,上面的例子第一條數據報中,源地址 ip 是 192.168.1.106,源埠是 56166,目的地址是 124.192.132.54,目的埠是 80。> 符號代表數據的方向。
此外,上面的三條數據還是 tcp 協議的三次握手過程,第一條就是 SYN 報文,這個可以通過 Flags [S] 看出。下面是常見的 TCP 報文的 Flags:
下面給出一些具體的例子,每個例子都可以使用多種方法來獲得相同的輸出,你使用的方法取決於所需的輸出和網路上的流量。我們在排障時,通常只想獲取自己想要的內容,可以通過過濾器和 ASCII 輸出並結合管道與 grep、cut、awk 等工具來實現此目的。
例如,在抓取 HTTP 請求和響應數據包時,可以通過刪除標志 SYN/ACK/FIN 來過濾雜訊,但還有更簡單的方法,那就是通過管道傳遞給 grep。在達到目的的同時,我們要選擇最簡單最高效的方法。下面來看例子。
從 HTTP 請求頭中提取 HTTP 用戶代理:
通過 egrep 可以同時提取用戶代理和主機名(或其他頭文件):
抓取 HTTP GET 流量:
也可以抓取 HTTP POST 請求流量:
注意:該方法不能保證抓取到 HTTP POST 有效數據流量,因為一個 POST 請求會被分割為多個 TCP 數據包。
上述兩個表達式中的十六進制將會與 GET 和 POST 請求的 ASCII 字元串匹配。例如,tcp[((tcp[12:1] & 0xf0) >> 2):4] 首先會確定我們感興趣的位元組的位置[3](在 TCP header 之後),然後選擇我們希望匹配的 4 個位元組。
提取 HTTP 請求的主機名和路徑:
從 HTTP POST 請求中提取密碼和主機名:
提取 Set-Cookie(服務端的 Cookie)和 Cookie(客戶端的 Cookie):
查看網路上的所有 ICMP 數據包:
通過排除 echo 和 reply 類型的數據包使抓取到的數據包不包括標準的 ping 包:
可以提取電子郵件的正文和其他數據。例如,只提取電子郵件的收件人:
抓取 NTP 服務的查詢和響應
通過 SNMP 服務,滲透測試人員可以獲取大量的設備和系統信息。在這些信息中,系統信息最為關鍵,如操作系統版本、內核版本等。使用 SNMP 協議快速掃描程序 onesixtyone,可以看到目標系統的信息:
當抓取大量數據並寫入文件時,可以自動切割為多個大小相同的文件。例如,下面的命令表示每 3600 秒創建一個新文件 capture-(hour).pcap,每個文件大小不超過 200*1000000 位元組:
這些文件的命名為 capture-{1-24}.pcap,24 小時之後,之前的文件就會被覆蓋。
可以通過過濾器 ip6 來抓取 IPv6 流量,同時可以指定協議如 TCP:
從之前保存的文件中讀取 IPv6 UDP 數據報文:
在下面的例子中,你會發現抓取到的報文的源和目的一直不變,且帶有標志位 [S] 和 [R],它們與一系列看似隨機的目標埠進行匹配。當發送 SYN 之後,如果目標主機的埠沒有打開,就會返回一個 RESET。這是 Nmap 等埠掃描工具的標准做法。
本例中 Nmap NSE 測試腳本 http-enum.nse 用來檢測 HTTP 服務的合法 URL。
在執行腳本測試的主機上:
在目標主機上:
向 Google 公共 DNS 發起的出站 DNS 請求和 A 記錄響應可以通過 tcpmp 抓取到:
抓取 80 埠的 HTTP 有效數據包,排除 TCP 連接建立過程的數據包(SYN / FIN / ACK):
通常 Wireshark(或 tshark)比 tcpmp 更容易分析應用層協議。一般的做法是在遠程伺服器上先使用 tcpmp 抓取數據並寫入文件,然後再將文件拷貝到本地工作站上用 Wireshark 分析。
還有一種更高效的方法,可以通過 ssh 連接將抓取到的數據實時發送給 Wireshark 進行分析。以 MacOS 系統為例,可以通過 brew cask install wireshark 來安裝,然後通過下面的命令來分析:
例如,如果想分析 DNS 協議,可以使用下面的命令:
抓取到的數據:
找出一段時間內發包最多的 IP,或者從一堆報文中找出發包最多的 IP,可以使用下面的命令:
cut -f 1,2,3,4 -d '.' : 以 . 為分隔符,列印出每行的前四列。即 IP 地址。
sort | uniq -c : 排序並計數
sort -nr : 按照數值大小逆向排序
本例將重點放在標准純文本協議上,過濾出於用戶名和密碼相關的報文:
最後一個例子,抓取 DHCP 服務的請求和響應報文,67 為 DHCP 埠,68 為客戶機埠。
本文主要介紹了 tcpmp 的基本語法和使用方法,並通過一些示例來展示它強大的過濾功能。將 tcpmp 與 wireshark 進行組合可以發揮更強大的功效,本文也展示了如何優雅順滑地結合 tcpmp 和 wireshark。如果你想了解更多的細節,可以查看 tcpmp 的 man 手冊。
C. Linux下用tcpmp -p arp命令抓包獲取的信息幫忙分析下
這些數據包是ARP請求,請求獲得192.168.1.1的MAC地址
D. Linux 系統掃描nmap與tcpmp抓包
NMAP掃描
一款強大的網路探測利器工具
支持多種探測技術檔神遲
--ping掃描
--多埠掃描
-- TCP/IP指紋校驗
為什麼需要掃描?
以獲取一些公開/非公開信息為目的
--檢測潛在風險
--查找可攻擊目標
--收集設備/主機/系統/軟體信息
--發現可利用的安全漏洞
基本用法
nmap [掃描類型] [選項] <掃描目標...>
常用的掃描類型
常用選項
-sS TCP SYN掃描(半開) 該方式發送SYN到目標埠,如果收到SYN/ACK回復,那麼判斷埠是開放的;如果收到RST包,說明該埠是關閉的。簡單理解就是3次握手只完成一半就可以判斷埠是否打開,提高掃描速度
-sT TCP 連接掃描(全開)
-sU UDP掃描
-sP ICMP掃描
-sV 探測打開的埠對應的服務版本信息
-A 目標系統全面分析 (可能會比較慢)
-p 掃描指定埠
1 ) 檢查目標主機是否能ping通
2)檢查目標主機所開啟的TCP服務
3 ) 檢查192.168.4.0/24網段內哪些主機開啟了FTP、SSH服務
4)檢查目標主機所開啟的UDP服務
5 ) 探測打開的埠對應的服務版本信息
6)全面分析目標主機192.168.4.100的操作系統信息
tcpmp
命令行抓取數據包工具
基本用法
tcpmp [選項] [過濾條件]
常見監控選項
-i,指定監控的網路介面(默認監聽第一個網卡)
-A,轉換為 ACSII 碼,以方便閱讀
-w,將數據包信息保存到指定文件
-r,從指定文件讀取數據包信息
常用的過濾條件:
類型:host、net、port、portrange
方向:src、dst
協議:tcp、udp、ip、wlan、arp、……
多個條件組合:and、or、not
案例1
案例2:使用tcpmp分析FTP訪問中的明文交換信息
1 ) 安裝部署vsftpd服務
2 ) 並啟動tcpmp等待抓包
執行tcpmp命令行,添加適當的過濾條件,只抓取訪問主機192.168.4.100的21埠的數據通信 ,並轉換為ASCII碼格式的易讀文本。
3 ) case100作為客戶端訪問case254服務端
4 ) 查看tcpmp抓包
5 ) 再次使用tcpmp抓包,行李使用-w選項可瞎知以將抓取的數據包另存為文件,方便後期慢慢分析。
6 ) tcpmp命令的-r選項,可以去讀之前抓取的歷史數據文件
E. linux下tcpmp抓包存在什麼位置
tcpmp默認的是標准輸出,一般來講就是顯示器,如果要將抓包結果保存到文件則需要使用-w參數,例如:
$tcpmp-ieth1-w/tmp/xxx.cap
抓eth1的包
F. linux-2.4 如何安裝 tcpmp
安裝過程參照以下步驟:
1、打開網址:www.tcpmp.org/ 下載 libpcap-1.0.0.tar.gz (512.0KB) 軟體包,通過命令 tar zxvf libpcap-1.0.0.tar.gz 解壓文件,並將其放入自定義的安裝目錄。
2、打開網址:flex.sourceforge.net/ 下載 flex-2.5.35.tar.gz (1.40MB) 軟體包,通過 tar zxvf flex-2.5.35.tar.gz 解壓文件,並將其放入上述自定義的安裝目錄中。
註:如果沒有編譯安裝此文件,在編譯安裝libpcap時,就會出現 「configure: error: Your operating system's lex is insufficient to compile libpcap.」的錯誤提示。
3、打開網址:ftp.gnu.org/gnu/bison/ 下載 bison-2.4.1.tar.gz (1.9MB) 軟體包,通過 tar zxvf bison-2.4.1.tar.gz 解壓文件,並將其放入上述自定義的安裝目錄中。
註:如果沒有編譯安裝此文件,在編譯安裝libpcap時,就會出現 "configure: WARNING: don't have both flex and bison; reverting to lex/yacc checking for capable lex... insufficient" 的錯誤提示。
4、打開網址:ftp.gnu.org/gnu/m4/ 下載 m4-1.4.13.tar.gz (1.2MB)軟體包,通過 tar zxvf m4-1.4.13.tar.gz 解壓文件,並將其放入上述自定義的安裝目錄中。
註:如果沒有編譯安裝此文件,在編譯安裝bison-2.4.1時,就會出現 「configure: error: GNU M4 1.4 is required」的錯誤提示。
5、而後依次進入目錄m4-1.4.13,bison-2.4.1,flex-2.5.35,libpcap-1.0.0 並執行以下命令:
(sudo) ./configure
(sudo) make
(sudo) make install