0x00 简介
justniffer使用一个可用于替代Snort的网络协议分析器,可以交互式地跟踪或者探测一个网络连接。它可以在线抓取流量,也可以离线分析'libpcap'和'tcpdump'抓取过来的数据包。他也可以帮助我们分析一个wireshark难以处理的复杂网络。尤其是他可以帮助我们分析应用层流量,如图像,脚本以及HTML等内容。
justniffer的特点在于收集一个复杂网络的所有流量而不影响系统的性能,也可以保存日志便于日后分析,他还可以进行可靠的TCP流重建,能够基于连接时间,关闭时间,响应时间或请求时间来提取信息。justniffer还可以通过python||perl||bash来扩展其功能。
0x01 安装
安装相关的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 命令行选项
手册相关的Man Page
可以通过命令man justniffer
查看justniffer的手册。
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抓包器会重新组装与排序TCP数据包,连接IP数据包,在标准输出中展示TCP流。这对于以标准或定制的方式记录网络流量十分有效。justniffer能够记录网络服务的性能(服务器响应时间或者应用服务器行为等)。输出格式也能通过-l
来定制。
justniffer是用来监控网络性能的,而网络性能与以下信息有关。
属性 | 含义 |
---|---|
connection.time | 建立连接耗时 |
idle.time.0 | 连接建立后请求到来前时间间隔 |
request.time | 请求用时 |
respone.time | 响应用时 |
response.time.begin | 响应开始时刻 |
response.time.end | 响应终止时刻 |
idle.time.1 | 响应之后新请求或连接关闭之前时间间隔 |
而justniffer的命令行选项如下所示。
选项符号 | 选项名 | 用途 |
---|---|---|
-i | interface | 监听接口 |
-f | filecap | 待分析的pcap文件 |
-F | force read pcap | 强制读取不完整的pcap数据包 |
-p | packet filter | BPF语法,用于筛选数据包 |
-l | log format | 指定输出的日志格式 |
-r | raw | 输出原始数据流 |
-s | max tcp streams | tcp并发数调最大 |
-d | max fragmented IP | IP分片数调最大 |
-u | unprintable | 将不可打印的字符解析为'.' |
-x | hex encode | 将不可打印的字符以16进制数表示 |
-n | not found | 无法显示属性值时以该字符串代替 |
-e | execute | 对标准输出调用程序或脚本 |
-U | user | 使用特定用户身份执行-e 的程序 |
-c | config | 使用指定的配置文件,配置文件是以 属性-值 的方式来配置 |
格式关键字
- %close.time
- 最后一次响应到连接关闭之间的时长 值不存在时可以用
-n
的值代替
- 最后一次响应到连接关闭之间的时长 值不存在时可以用
- %close.timestamp
- 连接关闭的时刻
- %close.timestamp2
- 连接关闭的时刻 以‘秒.微秒’的格式显示 值不存在时可以用
-n
的值代替
- 连接关闭的时刻 以‘秒.微秒’的格式显示 值不存在时可以用
- %connection
- 连接持续指示器
- unique 唯一的TCP连接
- start 首个TCP连接
- last 末个TCP连接
- continue 中间的TCP连接
- 连接持续指示器
- %connection.time
- 打开连接所用时长 值不存在时可以用
-n
的值代替
- 打开连接所用时长 值不存在时可以用
- %connection.timestamp
- 打开连接的时刻
- %connection.timestamp2
- 连接开启的时刻 以‘秒.微秒’的格式显示 值不存在时可以用
-n
的值代替
- 连接开启的时刻 以‘秒.微秒’的格式显示 值不存在时可以用
- %idle.time.0
- 开启连接到首次请求间的时差 值不存在时可以用
-n
的值代替
- 开启连接到首次请求间的时差 值不存在时可以用
- %idle.time.1
- 末次响应到下次请求或连接关闭间的时差 值不存在时可以用
-n
的值代替
- 末次响应到下次请求或连接关闭间的时差 值不存在时可以用
- %response.time.begin
- 本次请求到本次响应间的时差 值不存在时可以用
-n
的值代替
- 本次请求到本次响应间的时差 值不存在时可以用
- %response.time.end
- 响应开始到响应结束间的时差 值不存在时可以用
-n
的值代替
- 响应开始到响应结束间的时差 值不存在时可以用
- %response.timestamp
- 响应的时刻
- %dest.ip
- %dest.port
- %source.ip
- %source.port
- %request
- 多行显示,可能含有不可打印的字符
- %request.timestamp
- %request.timestamp2
- 请求的时刻 以‘秒.微秒’的格式显示 值不存在时可以用
-n
的值代替
- 请求的时刻 以‘秒.微秒’的格式显示 值不存在时可以用
- %request.size
- %request.line
- “GET /index.html HTTP/1.1”
- %request.method
- GET POST HEAD
- %request.url
- %request.protocol
- %request.grep(<regular-expression>)
- 从整个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>)
- 获取请求头部中指定属性的值
- %request.header.transfer-encoding
- %request.header.via
- %request.header.grep(<regular-expression>)
- 从整个request.header里截取匹配正则的字符串
- %response
- %response.timestamp
- 响应的时刻
- %response.timestamp2
- 响应的时刻 以‘秒.微秒’的格式显示 值不存在时可以用
-n
的值代替
- 响应的时刻 以‘秒.微秒’的格式显示 值不存在时可以用
- %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>)
- 从整个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>)
- 获取响应头部中指定属性的值
- %response.header.grep(<regular-expression>)
- 从整个response.header里截取匹配正则的字符串
- %tab
- %-
- 用于断开关键词
- %%:%
- %newline
时间戳格式
- %A 星期几全称
- %a 星期几缩写
- %B 月份全称
- %b 月份缩写
- %C 年份/100 代表世纪
- %c 时间日期
- %D %m/%d/%y
- %d 日期数字显示 01-31
- %E*
- %e 日期显示 1-31
- %F %Y-%m-%d
- %G 带世纪的年份
- %g 不带实际的年份 00-99
- %H 24小时制 00-23
- %h 月份缩写
- %I 12小时制 01-12
- %j 一年中的第几天 001-366
- %k 24小时制 0-23
- %l 12小时制 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开始经过的秒数
- %T %H:%M:%S
- %t tab
- %U 一年的第几个月 以周日作为一周的开始 00-53
- %u 周几 1-7
- %V 一年的第几个月 以周一作为一周的开始 01-53
- %v %e-%b-%Y
- %W 一年的第几个月 以周一作为一周的开始 00-53
- %w 周几 周日作为一周的开始 0-6
- %X 时间
- %x 日期
- %Y 带世纪的日期
- %y 无世纪的日期
- %Z 时区名
- %z 时区偏移
- %+ 日期和时间
- %%
0x03 初体验
获取request中的数据代码
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(.*))
,该代码通过使用正则表达式去匹配request中的数据部分。
其他选项-u
将不可打印的字符解析成.
,而-l
是定制日志的格式。最后将数据输出至getpostdata.log文件。
其结果如图。
0x04 深入理解justniffer
施工中
0x05 优缺点
优点
- 开源
- 直接命令行可以控制抓包
- 配合python脚本能够封装justniffer源程序,将结果分类装入不同的文件夹下
- 可能可以进行python方面的扩展,作为进一步的事件触发(个人理解)
缺点
- 暂未发现其可以对检测的数据包进行模式匹配并触发检测封锁的操作
- 对http数据包中的部分字段需要使用正则表达式进行剥离,正则的方式可能难以理解。