
背景介紹:
公司檢測到異常流量,及多名員工收到釣魚郵件,發現某郵件系統存在漏洞 , 黑客通過該漏洞獲取大量信息 ,所以抽取當天網絡流量進行分析,數量有5.3G,大概一千三百萬個數據包。

分析目標:
1. 攻擊者使用的偽造郵箱地址是多少
2. 攻擊者發送釣魚郵件的ip是多少
3. 郵件中的惡意url是多少
4. 攻擊者發送成功的釣魚郵件是什么
5. 服務器的漏洞是什么
6. 黑客對系統進行了什么攻擊前期準備:
1. Wireshark(流量分析工具)
2. Python(pyshark數據包處理模塊)
3. 面對一千三百萬個數據包不放棄的精神分析過程大綱:
1. 流量清洗
2. 流量分層
3. 入侵流量追蹤
4. 漏洞溯源分析
0×01: 流量清洗
在等量分解的數據包中,取樣抽查,每個分包大概有66萬個包左右

再看看數據包協議分層

協議分層中看到smtp協議(郵件服務協議) #SMTP協議詳解請見附錄4
根據背景描述,公司檢測到異常流量,及多名員工收到釣魚郵件,初步猜測,攻擊者對網站攻擊引發異常流量并且使用郵件服務協議發送的釣魚郵件。
所以暫且先看smtp協議和http協議的數據包
進行流量清洗Wireshark自帶工具:
mergecap(合并流量包)
tshark(流量包過濾)
editcap(流量包分解)
(用法參考附錄:流量包分解合并(wireshark自帶))
清洗思路(合并流量包→篩選smtp、http協議→得出流量包)
第一步將所有流量包合并:
mergecap -w total.pcap a.pcap b.pcap //(文件名太長簡寫成a和b)
得到total.pcap,對它經行流量清洗,目標是過濾出,smtp,http流量
清洗:tshark -r total.pcap -Y pop||smtp||http -w result.pcap(total.pcap為上一步合并的數據包)
(過濾參數可以參考文末附錄:Tshark使用參數詳解)
得出:result.pcap 2萬個數據包左右,以下過程都基于這個數據包
0×02: 流量分層
接下來先看smtp數據包,wireshark過濾條件為:smtp

選擇統計→對話,查看流量走向情況

發現兩個ip地址存在。分別查看他們ip的流量

1). 過濾條件為smtp and ip.addr==101.36.79.67
發現一個郵箱發到多個郵箱相同的郵件,
郵件內容為:A new system of IT is online, please click on the link below, to assist to test the running state of system,thank you!http://211341.vhost328.cloudvhost.cn
郵件內容有誘導性點擊鏈接并帶有url地址http://211341.vhost328.cloudvhost.cn,比較可疑

嘗試過濾條件為smtp and ip.addr==112.90.83.115

從該ip郵件中內容上看未發現異常
相比之下101.36.79.67比較可疑,需再一步證實
再回到篩選條件為smtp的數據包,遍歷所有的數據包,統計郵箱出現最多的次數(附件在附錄解釋下,先看圖)

遍歷所有stmp郵件發現it@t3sec.cc這個郵箱出現次數異常,比其他郵箱出現次數多10倍,由此綜合上面先前推測可疑郵件發送ip地址,和發送這個郵件的ip地址101.36.79.67地址相吻合,所以推斷:
攻擊者ip為101.36.79.67
攻擊者使用的偽造郵箱地址是it@t3sec.cc
可疑釣魚鏈接為: http://211341.vhost328.cloudvhost.cn
發現基本只有172.16.60.200在使用郵件服務器172.16.60.247
并且登陸郵箱為
0×03: 入侵流量追蹤
根據發現攻擊者的ip
去重新篩選數據包,條件為源ip為101.36.79.67的數據包
嘗試搜索木馬及注入或xss關鍵字
ip.addr == 101.36.79.67 && http matches “upload|alert|script|eval|select”
最終在條件為POST請求,內容包含eval 篩選出木馬流量

0×04: 漏洞溯源分析
根據url路徑和頁面名稱,推出該網站漏洞是任意文件上傳漏洞
(該post數據包有upload關鍵字→推測試上傳頁面)
(該post數據包訪問文件為hack.php→推測為webshell)
總體推測:上傳頁面上傳了webshell
查看該上傳源碼,發現的確存在沒有任何安全防護,存在任意文件上傳漏洞。

Up.php 沒有任何文件后綴等過濾

證實:任意文件上傳漏洞
攻擊者上傳木馬后,執行命令

命令進行了base64加密,相關命令如下
V2hvYW1p
SWZjb25maWc=
Q2F0IC9ldGMvcGFzc3dk
解密后為Whoami、Ifconfig、Cat /etc/passwd等等
但此次分析目標到此已達成
1. 攻擊者使用的偽造郵箱地址是多少
it@t3sec.cc
2. 攻擊者發送釣魚郵件的ip是多少
101.36.79.67
3. 郵件中的惡意url是多少
http://211341.vhost328.cloudvhost.cn
4. 攻擊者發送成功的釣魚郵件是什么
Hi all
A new system of IT is online, please click on the link below, to assist to test the running state of system,thank you! http://211341.vhost328.cloudvhost.cn
5. 服務器的漏洞是什么
任意文件上傳漏洞
6. 黑客對系統進行了什么攻擊
服務器遠程代碼執行;針對公司的apt攻擊(釣魚)
參加過鐵三的前輩大哥可能比較熟悉這些,數據包來源鐵三比賽,小弟想更多人認識到這個流量分析,網上搜了下好像關于使用流量分析的文章比較少,使用python進行分析流量包的更少之又少了,總結了一下特此一碼。
由于盡量使大家簡單明白分析的過程的原理,此次使用wireshark給大家分析過程
其實實際過程中所有的分析過程都可以用python寫的腳本來進行分析
Python 的pyshark模塊
上述文章分析過程中有錯誤的話請大家指點一下,謝謝大家
附上簡單的pyshark入門代碼
(python2.7) import sys import pyshark from pyshark.capture.capture import Capture reload(sys) sys.setdefaultencoding('utf-8') (環境初始化) def main(): pass path='C:\Users\Desktop\result.pcap' #讀取pcap文件路徑 cap = pyshark.FileCapture(path,display_filter='http') #定義對象并篩選過濾條件為http for p in cap: #遍歷所有數據包 try: print p.http.file_data #提取數據包中的http內容 except Exception as e: #報錯顯示 print e if __name__ == '__main__' : main() pass
初衷是想讀者了解 除了手工打開pcap一個一個看并分析,原來還可以用python讀取自動分析。
上面只是打開一個pcap文件讀取數據包的入門方法。直接貼代碼只能告訴大家可能只學到一個知識點,告訴大家入門方法去探索,就有學到無限知識的可能
而本次流量分分析用到的關鍵思路只是用正則匹配郵箱,然后做一次統計而已,比較簡單,下面追加關鍵代碼。
關鍵代碼如下
patten = re.compile(r'\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b') #正則爬郵箱 path='C:\Users\Desktop\\result.pcap '#文件路徑 cap = pyshark.FileCapture(path,display_filter='imf') #過濾文件smtp郵件內容imf for p in cap: #遍歷數據包 p=str(p) #轉str格式 try: print p # a=a+re.findall(re.compile(patten),p) #數組中加入郵箱方便統計 except Exception as e: print e print a
pyshark參數條件參考附錄附錄附錄一:流量包分解合并(wireshark自帶)
editcap.exe -c 100 D:\dump.pcap D:\test.pcap

在wireshark中通過filter過濾出sip信令,但是在多個文件中,megecap可以將多個pcap文件合并為一個文件。
用法:mergecap -w <輸出文件> <源文件1> <源文件2> …
示例:
mergecap -w compare.pcap a.pcap b.pcap
Tshark -r target.pcap -Y pop -w pop.pcap附錄二:Tshark使用參數詳解
Tshark官方文檔https://www.wireshark.org/docs/man-pages/tshark.html
捕獲接口:
-i: -i <interface> 指定捕獲接口,默認是第一個非本地循環接口;
-f: -f <capture filter> 設置抓包過濾表達式,遵循libpcap過濾語法,這個實在抓包的過程中過濾,如果是分析本地文件則用不到。
-s: -s <snaplen> 設置快照長度,用來讀取完整的數據包,因為網絡中傳輸有65535的限制,值0代表快照長度65535,默認也是這個值;
-p: 以非混合模式工作,即只關心和本機有關的流量。
-B: -B <buffer size> 設置緩沖區的大小,只對windows生效,默認是2M;
-y: -y<link type> 設置抓包的數據鏈路層協議,不設置則默認為-L找到的第一個協議,局域網一般是EN10MB等;
-D: 打印接口的列表并退出;
-L 列出本機支持的數據鏈路層協議,供-y參數使用。
捕獲停止選項:
-c: -c <packet count> 捕獲n個包之后結束,默認捕獲無限個;
-a: -a <autostop cond.> … duration:NUM,在num秒之后停止捕獲;
filesize:NUM,在numKB之后停止捕獲;
files:NUM,在捕獲num個文件之后停止捕獲;
捕獲輸出選項:
-b <ringbuffer opt.> … ring buffer的文件名由-w參數決定,-b參數采用test:value的形式書寫;
duration:NUM – 在NUM秒之后切換到下一個文件;
filesize:NUM – 在NUM KB之后切換到下一個文件;
files:NUM – 形成環形緩沖,在NUM文件達到之后;
RPCAP選項:
remote packet capture protocol,遠程抓包協議進行抓包;
-A: -A <user>:<password>,使用RPCAP密碼進行認證;
輸入文件:
-r: -r <infile> 設置讀取本地文件
處理選項:
-2: 執行兩次分析
-R: -R <read filter>,包的讀取過濾器,可以在wireshark的filter語法上查看;在wireshark的視圖->過濾器視圖,在這一欄點擊表達式,就會列出來對所有協議的支持。
-Y: -Y <display filter>,使用讀取過濾器的語法,在單次分析中可以代替-R選項;
-n: 禁止所有地址名字解析(默認為允許所有)
-N: 啟用某一層的地址名字解析?!癿”代表MAC層,“n”代表網絡層,“t”代表傳輸層,“C”代表當前異步DNS查找。如果-n和-N參數同時存在,-n將被忽略。如果-n和-N參數都不寫,則默認打開所有地址名字解析。
-d: 將指定的數據按有關協議解包輸出,如要將tcp 8888端口的流量按http解包,應該寫為“-d tcp.port==8888,http”;tshark -d. 可以列出所有支持的有效選擇器。
輸出選項:
-w: -w <outfile|-> 設置raw數據的輸出文件。這個參數不設置,tshark將會把解碼結果輸出到stdout,“-w -”表示把raw輸出到stdout。如果要把解碼結果輸出到文件,使用重定向“>”而不要-w參數。
-F: -F <output file type>,設置輸出的文件格式,默認是.pcapng,使用tshark -F可列出所有支持的輸出文件類型。
-V: 增加細節輸出;
-O: -O <protocols>,只顯示此選項指定的協議的詳細信息。
-P: 即使將解碼結果寫入文件中,也打印包的概要信息;
-S: -S <separator> 行分割符
-x: 設置在解碼輸出結果中,每個packet后面以HEX dump的方式顯示具體數據。
-T: -T pdml|ps|text|fields|psml,設置解碼結果輸出的格式,包括text,ps,psml和pdml,默認為text
-e: 如果-T fields選項指定,-e用來指定輸出哪些字段;
-E: -E <fieldsoption>=<value>如果-T fields選項指定,使用-E來設置一些屬性,比如
header=y|n
separator=/t|/s|<char>
occurrence=f|l|a
aggregator=,|/s|<char>
-t: -t a|ad|d|dd|e|r|u|ud 設置解碼結果的時間格式?!癮d”表示帶日期的絕對時間,“a”表示不帶日期的絕對時間,“r”表示從第一個包到現在的相對時間,“d”表示兩個相鄰包之間的增量時間(delta)。
-u: s|hms 格式化輸出秒;
-l: 在輸出每個包之后flush標準輸出
-q: 結合-z選項進行使用,來進行統計分析;
-X: <key>:<value> 擴展項,lua_script、read_format,具體參見 man pages;
-z:統計選項,具體的參考文檔;tshark -z help,可以列出,-z選項支持的統計方式。
其他選項:
-h: 顯示命令行幫助;
-v: 顯示tshark 的版本信息;附錄三:Pyshark過濾參數
a= pyshark.FileCapture(path,display_filter=’http’)
a為定義pcap文件對象
本次主要用到過濾參數有
a.highest_layer 最高層的協議內容
a.http.request_method 請求方法
a.http.chat 訪問方法加路徑
a.http.request_uri 訪問路徑
a.http.host 訪問host地址
a.http.field_names http包參數
a.ip.src_host 源ip地址
a.ip.dst_host 目的地址
a.http.request_full_uri url地址
str(c.http.file_data) 返回包內容附錄四:SMTP協議解釋
SMTP協議 服務器的熟知端口號為25 ,與之前總結過的telnet協議和FTP協議類似的地方是,SMTP協議的客戶端和服務器端都是通過命令和響應的形式進行交互 ,即SMTP客戶通過命令向SMTP服務器發送操作請求,而服務器則通過3位的數字對響應的請求作出響應。SMTP規定了14條命令和21中應答信息,每條命令有4個字母組成,而每一種應答一般只有一行信息,有一個3位數字的代碼開始,后面附上很簡單的附加說明。
郵件傳送主要包括3個階段: 建立連接 、 郵件傳送 和 終止連接 。
建立連接階段:
1.當SMTP客戶端每隔一定時間對郵件緩存掃描一次,如發現有郵件,就使用SMTP的熟知端口號25與接收方的郵件服務器的SMTP服務器建立TCP連接。
2.接收方SMTP服務器發出“220 Service ready”告訴客戶端它已經準備好接收郵件。若服務器未就緒,它就發送代碼421(服務器不可用)。
3.客戶發送HELO報文,并使用它的域名地址標志自己。目的是:用來把客戶的域名通知服務器,值得注意的是, 在TCP的連接建立階段,發送方和接收方都是通過它們的IP地址來告訴對方的 。(HELO報文是最初的,用戶名和密碼都不加密?,F在改為EHLO,用戶名和密碼都進行base64編碼發送)
4.服務器響應代碼250(請求命令完成)或根據情況的其他一些代碼。
郵件傳送階段:
在SMTP客戶與服務器之間建立連接后,發件人就可以與一個或多個收件人交換單個的報文了。若收件人超過一個,則下面步驟3和步驟4將重復進行。
1.客戶發送MAIL FROM報文介紹報文的發送者。它包括發送人的郵件地址(郵箱名和域名,如house@qq)。這個步驟是必要的:因為可以給服務器在返回差錯或報文時的返回郵件地址 。
2.服務器響應代碼250(請求命令完成)或其他適當的代碼。
3.客戶發送RCPT(收件人)報文,包括收件人的郵件地址,RCPT命令的作用是 : 先弄清接收方系統是否已經準備好接收郵件的準備,然后才發送郵件,這樣做視為了避免浪費通信資源,不至于發送了很長的郵件以后才知道是因地址錯誤 。
4.服務器響應代碼250或其他適當的代碼。
5.客戶發送DATA報文對報文的傳送進行初始化,DATA命令表示要開始傳送郵件的內容了。
6.服務器響應代碼”354 Start mail input: end with <CRLF>.<CRLF>”或其他適當的報文(如421 服務器不可用,500 命令無法識別)。
7.客戶用連續的行發送報文的內容。每一行的行結束時輸入 <CRLF>.<CRLF> ,即回車換行.回車換行,表示郵件內容結束。
8.服務器響應代碼(250 請求命令完成)或其他適當的代碼。
值得注意的是:雖然SMTP使用TCP連接試圖使郵件的傳送可靠,但它并不能保證不丟失郵件。也就是說,使用SMTP傳送郵件只能說可以可靠地傳送接收方的郵件服務器,在往后的情況就不知道了。接收方的郵件服務器也許會出故障,使收到的服務器全部丟失(在收件人讀取信件之前)。
終止連接
在報文傳送成功后,客戶就終止連接。包括如下步驟:
1.客戶發送QUIT命令。
2.服務器響應221(服務關閉)或其他代碼。
在連接終止階段后,TCP連接必須關閉。
文章轉載自公眾號 合天智匯,作者 3s_NwGeek