0x00 簡(jiǎn)介
justniffer使用一個(gè)可用于替代Snort的網(wǎng)絡(luò)協(xié)議分析器银室,可以交互式地跟蹤或者探測(cè)一個(gè)網(wǎng)絡(luò)連接。它可以在線抓取流量焙矛,也可以離線分析'libpcap'和'tcpdump'抓取過來的數(shù)據(jù)包毙石。他也可以幫助我們分析一個(gè)wireshark難以處理的復(fù)雜網(wǎng)絡(luò)掀虎。尤其是他可以幫助我們分析應(yīng)用層流量,如圖像狸剃,腳本以及HTML等內(nèi)容掐隐。
justniffer的特點(diǎn)在于收集一個(gè)復(fù)雜網(wǎng)絡(luò)的所有流量而不影響系統(tǒng)的性能,也可以保存日志便于日后分析钞馁,他還可以進(jìn)行可靠的TCP流重建虑省,能夠基于連接時(shí)間,關(guān)閉時(shí)間僧凰,響應(yīng)時(shí)間或請(qǐng)求時(shí)間來提取信息探颈。justniffer還可以通過python||perl||bash來擴(kuò)展其功能。
0x01 安裝
安裝相關(guān)的user-guide
sudo add-apt-repository ppa:oreste-notelli/ppa
sudo apt-get update
sudo apt-get install justniffer
要是其他的Linux版本的話训措,先裝以下依賴伪节。
- patch
- tar
- autotools
- make
- libc6
- libpcap0.8
- g++
- gcc
- libboost-iostreams
- libboost-program-options
- libboost-regex
解壓source package, 輸入:
./configure
make
sudo make install
0x02 命令行選項(xiàng)
手冊(cè)相關(guān)的Man Page
可以通過命令man justniffer
查看justniffer的手冊(cè)。
justniffer [ [-i interface] or [-f <tcpdump file>] ] [-F]
[-p <packet filter>] [-u or -x]
[ [-r] or [-l <log format>] or [-a <log format>] ]
[-c <config file>] [-e <external program>] [-U <user> ]
[-n <not-found> ] [-s <max concurrent tcp streams> ]
[-d <max concurrent IP fragments> ]
justniffer抓包器會(huì)重新組裝與排序TCP數(shù)據(jù)包绩鸣,連接IP數(shù)據(jù)包怀大,在標(biāo)準(zhǔn)輸出中展示TCP流。這對(duì)于以標(biāo)準(zhǔn)或定制的方式記錄網(wǎng)絡(luò)流量十分有效呀闻。justniffer能夠記錄網(wǎng)絡(luò)服務(wù)的性能(服務(wù)器響應(yīng)時(shí)間或者應(yīng)用服務(wù)器行為等)叉寂。輸出格式也能通過-l
來定制。
justniffer是用來監(jiān)控網(wǎng)絡(luò)性能的总珠,而網(wǎng)絡(luò)性能與以下信息有關(guān)屏鳍。
屬性 | 含義 |
---|---|
connection.time | 建立連接耗時(shí) |
idle.time.0 | 連接建立后請(qǐng)求到來前時(shí)間間隔 |
request.time | 請(qǐng)求用時(shí) |
respone.time | 響應(yīng)用時(shí) |
response.time.begin | 響應(yīng)開始時(shí)刻 |
response.time.end | 響應(yīng)終止時(shí)刻 |
idle.time.1 | 響應(yīng)之后新請(qǐng)求或連接關(guān)閉之前時(shí)間間隔 |
而justniffer的命令行選項(xiàng)如下所示。
選項(xiàng)符號(hào) | 選項(xiàng)名 | 用途 |
---|---|---|
-i | interface | 監(jiān)聽接口 |
-f | filecap | 待分析的pcap文件 |
-F | force read pcap | 強(qiáng)制讀取不完整的pcap數(shù)據(jù)包 |
-p | packet filter | BPF語法局服,用于篩選數(shù)據(jù)包 |
-l | log format | 指定輸出的日志格式 |
-r | raw | 輸出原始數(shù)據(jù)流 |
-s | max tcp streams | tcp并發(fā)數(shù)調(diào)最大 |
-d | max fragmented IP | IP分片數(shù)調(diào)最大 |
-u | unprintable | 將不可打印的字符解析為'.' |
-x | hex encode | 將不可打印的字符以16進(jìn)制數(shù)表示 |
-n | not found | 無法顯示屬性值時(shí)以該字符串代替 |
-e | execute | 對(duì)標(biāo)準(zhǔn)輸出調(diào)用程序或腳本 |
-U | user | 使用特定用戶身份執(zhí)行-e 的程序 |
-c | config | 使用指定的配置文件钓瞭,配置文件是以 屬性-值 的方式來配置 |
格式關(guān)鍵字
- %close.time
- 最后一次響應(yīng)到連接關(guān)閉之間的時(shí)長 值不存在時(shí)可以用
-n
的值代替
- 最后一次響應(yīng)到連接關(guān)閉之間的時(shí)長 值不存在時(shí)可以用
- %close.timestamp
- 連接關(guān)閉的時(shí)刻
- %close.timestamp2
- 連接關(guān)閉的時(shí)刻 以‘秒.微秒’的格式顯示 值不存在時(shí)可以用
-n
的值代替
- 連接關(guān)閉的時(shí)刻 以‘秒.微秒’的格式顯示 值不存在時(shí)可以用
- %connection
- 連接持續(xù)指示器
- unique 唯一的TCP連接
- start 首個(gè)TCP連接
- last 末個(gè)TCP連接
- continue 中間的TCP連接
- 連接持續(xù)指示器
- %connection.time
- 打開連接所用時(shí)長 值不存在時(shí)可以用
-n
的值代替
- 打開連接所用時(shí)長 值不存在時(shí)可以用
- %connection.timestamp
- 打開連接的時(shí)刻
- %connection.timestamp2
- 連接開啟的時(shí)刻 以‘秒.微秒’的格式顯示 值不存在時(shí)可以用
-n
的值代替
- 連接開啟的時(shí)刻 以‘秒.微秒’的格式顯示 值不存在時(shí)可以用
- %idle.time.0
- 開啟連接到首次請(qǐng)求間的時(shí)差 值不存在時(shí)可以用
-n
的值代替
- 開啟連接到首次請(qǐng)求間的時(shí)差 值不存在時(shí)可以用
- %idle.time.1
- 末次響應(yīng)到下次請(qǐng)求或連接關(guān)閉間的時(shí)差 值不存在時(shí)可以用
-n
的值代替
- 末次響應(yīng)到下次請(qǐng)求或連接關(guān)閉間的時(shí)差 值不存在時(shí)可以用
- %response.time.begin
- 本次請(qǐng)求到本次響應(yīng)間的時(shí)差 值不存在時(shí)可以用
-n
的值代替
- 本次請(qǐng)求到本次響應(yīng)間的時(shí)差 值不存在時(shí)可以用
- %response.time.end
- 響應(yīng)開始到響應(yīng)結(jié)束間的時(shí)差 值不存在時(shí)可以用
-n
的值代替
- 響應(yīng)開始到響應(yīng)結(jié)束間的時(shí)差 值不存在時(shí)可以用
- %response.timestamp
- 響應(yīng)的時(shí)刻
- %dest.ip
- %dest.port
- %source.ip
- %source.port
- %request
- 多行顯示,可能含有不可打印的字符
- %request.timestamp
- %request.timestamp2
- 請(qǐng)求的時(shí)刻 以‘秒.微秒’的格式顯示 值不存在時(shí)可以用
-n
的值代替
- 請(qǐng)求的時(shí)刻 以‘秒.微秒’的格式顯示 值不存在時(shí)可以用
- %request.size
- %request.line
- “GET /index.html HTTP/1.1”
- %request.method
- GET POST HEAD
- %request.url
- %request.protocol
- %request.grep(<regular-expression>)
- 從整個(gè)request里截取匹配正則的字符串
- %request.header
- %request.header.host
- %request.header.user-agent
- %request.header.accept
- %request.header.accept-language
- %request.header.accept-charset
- %request.header.accept-encoding
- %request.header.authorization
- %request.header.connection
- %request.header.content-encoding
- %request.header.content-length
- %request.header.content-md5
- %request.header.cookie
- %request.header.range
- %request.header.referer
- %request.header.keep-alive
- %request.header.value(<header-name>)
- 獲取請(qǐng)求頭部中指定屬性的值
- %request.header.transfer-encoding
- %request.header.via
- %request.header.grep(<regular-expression>)
- 從整個(gè)request.header里截取匹配正則的字符串
- %response
- %response.timestamp
- 響應(yīng)的時(shí)刻
- %response.timestamp2
- 響應(yīng)的時(shí)刻 以‘秒.微秒’的格式顯示 值不存在時(shí)可以用
-n
的值代替
- 響應(yīng)的時(shí)刻 以‘秒.微秒’的格式顯示 值不存在時(shí)可以用
- %response.size
- %response.time
- %response.line
- %response.protocol
- %response.code
- 200 404 500
- %response.message
- OK,Not Found,Internal Server Error
- %response.grep(<regular-expression>)
- 從整個(gè)response里截取匹配正則的字符串
- %response.header
- %response.header.allow
- %response.header.server
- %response.header.date
- %response.header.content-type
- %response.header.content-length
- %response.header.content-md5
- %response.header.content-range
- %response.header.content-encoding
- %response.header.content-language
- %response.header.transfer-encoding
- %response.header.etag
- %response.header.cache-control
- %response.header.last-modified
- %response.header.pragma
- %response.header.age
- %response.header.connection
- %response.header.keep-alive
- %response.header.via
- %response.header.vary
- %response.header.www-authenticate
- %response.header.accept-ranges
- %response.header.set-cookie
- %response.header.value(<header-name>)
- 獲取響應(yīng)頭部中指定屬性的值
- %response.header.grep(<regular-expression>)
- 從整個(gè)response.header里截取匹配正則的字符串
- %tab
- %-
- 用于斷開關(guān)鍵詞
- %%:%
- %newline
時(shí)間戳格式
- %A 星期幾全稱
- %a 星期幾縮寫
- %B 月份全稱
- %b 月份縮寫
- %C 年份/100 代表世紀(jì)
- %c 時(shí)間日期
- %D %m/%d/%y
- %d 日期數(shù)字顯示 01-31
- %E*
- %e 日期顯示 1-31
- %F %Y-%m-%d
- %G 帶世紀(jì)的年份
- %g 不帶實(shí)際的年份 00-99
- %H 24小時(shí)制 00-23
- %h 月份縮寫
- %I 12小時(shí)制 01-12
- %j 一年中的第幾天 001-366
- %k 24小時(shí)制 0-23
- %l 12小時(shí)制 1-12
- %M 第幾分鐘 00-59
- %m 第幾月 01-12
- %n 新一行
- %O*
- %p am/pm 午前午后
- %R %H:%M
- %r %I:%M:%S %p
- %S 第幾秒 00-60
- %s 從UTC開始經(jīng)過的秒數(shù)
- %T %H:%M:%S
- %t tab
- %U 一年的第幾個(gè)月 以周日作為一周的開始 00-53
- %u 周幾 1-7
- %V 一年的第幾個(gè)月 以周一作為一周的開始 01-53
- %v %e-%b-%Y
- %W 一年的第幾個(gè)月 以周一作為一周的開始 00-53
- %w 周幾 周日作為一周的開始 0-6
- %X 時(shí)間
- %x 日期
- %Y 帶世紀(jì)的日期
- %y 無世紀(jì)的日期
- %Z 時(shí)區(qū)名
- %z 時(shí)區(qū)偏移
- %+ 日期和時(shí)間
- %%
0x03 初體驗(yàn)
獲取request中的數(shù)據(jù)代碼
sudo justniffer -i eth0 -u \
-l "%source.ip %source.port \
%request.header.grep(X-Forwarded-For\:\s*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})) \
%dest.ip %dest.port \
%request.grep(^Host:\s(.*?)\r\n) \"%request.method %request.url \
%request.grep(\r\n\r\n(.*)) %request.protocol\" \
%response.code %response.header.content-length \
\"%request.header.referer\" \"%request.header.user-agent\"" \
>> getpostdata.log &
其中比較重要的就是其中的%request.grep(\r\n\r\n(.*))
淫奔,該代碼通過使用正則表達(dá)式去匹配request中的數(shù)據(jù)部分山涡。
其他選項(xiàng)-u
將不可打印的字符解析成.
,而-l
是定制日志的格式。最后將數(shù)據(jù)輸出至getpostdata.log文件鸭丛。
其結(jié)果如圖竞穷。
0x04 深入理解justniffer
施工中
0x05 優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 開源
- 直接命令行可以控制抓包
- 配合python腳本能夠封裝justniffer源程序,將結(jié)果分類裝入不同的文件夾下
- 可能可以進(jìn)行python方面的擴(kuò)展鳞溉,作為進(jìn)一步的事件觸發(fā)(個(gè)人理解)
缺點(diǎn)
- 暫未發(fā)現(xiàn)其可以對(duì)檢測(cè)的數(shù)據(jù)包進(jìn)行模式匹配并觸發(fā)檢測(cè)封鎖的操作
- 對(duì)http數(shù)據(jù)包中的部分字段需要使用正則表達(dá)式進(jìn)行剝離瘾带,正則的方式可能難以理解。