本文作者:3s_NwGeek
原創投稿詳情:重金懸賞|合天原創投稿等你來!
背景介紹:公司檢測到异常流量,及多名員工收到釣魚郵件,發現某郵件系統存在漏洞,駭客通過該漏洞獲取大量資訊,所以抽取當天網路流量進行分析,數量有5.3G,大概一千三百萬個數据包。
分析目標:
1.攻擊者使用的偽造郵箱地址是多少
2.攻擊者發送釣魚郵件的ip是多少
3.郵件中的惡意url是多少
4.攻擊者發送成功的釣魚郵件是什麼
5.服務器的漏洞是什麼
6.駭客對系統進行了什麼攻擊
前期準備:
- Wireshark(流量分析工具)
- Python(pyshark數据包處理模塊)
- 面對一千三百萬個數据包不放弃的精神
分析過程大綱:
1.流量清洗
2.流量分層
3.入侵流量追跡
4.漏洞溯源分析
0x01:流量清洗
在等量分解的數据包中,取樣抽查,每個分包大概有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萬個數据包左右,以下過程都基於這個數据包
0x02:流量分層
接下來先看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郵件發現[email protected]這個郵箱出現次數异常,比其他郵箱出現次數多10倍,由此綜合上面先前推測可疑郵件發送ip地址,和發送這個郵件的ip地址101.36.79.67地址相吻合,所以推斷:
攻擊者ip為101.36.79.67
攻擊者使用的偽造郵箱地址是[email protected]
可疑釣魚連結為:http://211341.vhost328.cloudvhost.cn
發現基本只有172.16.60.200在使用郵件伺服器172.16.60.247
並且登入郵箱為
0x03:入侵流量追跡
根據發現攻擊者的ip
去重新篩選數据包,條件為源ip為101.36.79.67的數据包
嘗試蒐索木馬及注入或xss關鍵字
ip.addr == 101.36.79.67 && http matches“upload|alert|script|eval|select”
最終在條件為POST請求,內容包含eval篩選出木馬流量
0x04:漏洞溯源分析
根據url路徑和頁面名稱,推出該網站漏洞是任意文件上傳漏洞
(該post數据包有upload關鍵字→推測試上傳頁面)
(該post數据包訪問檔案為hack.php→推測為webshell)
總體推測:上傳頁面上傳了webshell
查看該上傳源碼,發現的確存在沒有任何安全防護,存在任意文件上傳漏洞。
Up.php沒有任何檔案尾碼等過濾
證實:任意文件上傳漏洞
攻擊者上傳木馬後,執行命令
命令進行了base64加密,相關命令如下
V2hvYW1p
SWZjb25maWc=
Q2F0IC9ldGMvcGFzc3dk
解密後為Whoami、Ifconfig、Cat /etc/passwd等等
但此次分析目標到此已達成
1.攻擊者使用的偽造郵箱地址是多少
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._%+-][email protected][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:啟用某一層的地址名字解析。“m”代表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設定解碼結果的時間格式。“ad”表示帶日期的絕對時間,“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報文是最初的,用戶名和密碼都不加密。現在改為EHLO,用戶名和密碼都進行base64編碼發送)
4.服務器響應程式碼250(請求命令完成)或根據情况的其他一些程式碼。
郵件傳送階段:
在SMTP客戶與服務器之間建立連接後,發件人就可以與一個或多個收件人交換單個的報文了。若收件人超過一個,則下麵步驟3和步驟4將重複進行。
1.客戶發送MAIL FROM報文介紹報文的發送者。它包括發送人的郵寄地址(郵箱名和功能變數名稱,如[email protected])。這個步驟是必要的:因為可以給服務器在返回差錯或報文時的返回郵寄地址。
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連接必須關閉。
注:本文屬“合天智匯”原創獎勵文章,未經允許,禁止以任何形式轉載!