目录
前言
对于没有系统学过Linux的我来说,毕设做 libnids 真是脑壳疼。
对于小白来说,我们首先要做的就是熟悉这个软件,知道它有什么功能。
请大家养成一个好习惯,
去看官方文档!官方文档!官方文档!
下面给大家指路:
这是被翻译成中文的api文档(适合我们这种英文不好,还没习惯读官方文档的人。)
https://wwwpf.github.io/2017/03/02/Libnids-API%E6%96%87%E6%A1%A3/
着重看 数据结构 和 函数 作用。你现在不看以后也会看...
读了官方文档后,我们发现有这样一章:
简单的例子能帮我们快速熟悉这个库。
跑通 samples
首先,我们去安装libnids的目录下:
这里有一个samples文件夹,(也就是说api文档里的示例不用你自己建了!然后 src 装着各种库函数,你也一定有机会阅读的,毕竟坑那么多....)
点进去以后:
稍微有点 Linux 知识的朋友会知道 Makefile 的作用是把一些编译命令都放到这个文件里,然后在命令行中输入“make”,
就可以生成可执行文件了。
这里在我 “make” 的时候出现了很多警告和错误。
我是这样解决的:
第一步:在 libnids-1.24 目录(也就是主目录下)依次敲如下命令:
./configure --disable-libnet --disable-libglib
make clean
make
sudo make install
第二步:在 samples 里的 sniff.c 的头文件中引入以下三个库:
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
根据错误可以看到缺少一些库,你可能还缺其它的,缺啥补啥。(ps:我也不知道为什么示例文件还会少库...)
这样之后呢,我们再 make
红框框出来的是一些无伤大雅的警告。
我们回到samples文件夹里看一下:
多了这样三个可执行文件。
overflows 和 sniff 我还没精力看它俩是干啥的,printall 细细研究了下,包括了调用Libpcap抓包以及重组。
分析printall.c
下面来简单说一下 printall.c,其实内容很少,主要就是main函数中调用,然后写了回调函数 tcp_callback。
tcp_callback 如下,tcp_stream 结构体定义了 tcp的连接信息,其中 nids_state 定义了连接状态,根据不同的连接状态我们做出不同的响应,很明显最重要的是接收到数据后怎么做,也就是当 nids_state == NIDS_DATA时。
你可以做一些简单的处理达到分析数据的目的:比如下图红框里,我把数据打印到终端,然后写入了一个文件中。
再给大家指路一个数据结构注释写得特别好的博客:
http://lihuia.com/2015/02/16/libnids%E5%B8%B8%E7%94%A8%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/
执行printall之后未报错也未捕获数据
我这边出现了两个问题:完全捕获不到数据 or 捕获不到图片数据
这两个问题都可以采用如下方法解决:在main函数中关闭校验和。
原理是:我们 tcp 流在传输时不是会进行差错检验么,然后就是根据校验和来检验数据是否完好无缺的。nids_chksum_ctl 结构体的 action 定义了是否开启检验校验和,因为某些我还没研究透的py交易,当校验和出错时会错过数据包,从而不能重组。
等到哪天我搞透彻了再来写一篇博客。以下是捕获到的数据一览:
多么熟悉的 header 头,让人流泪 TT
框出来的箭头,-> 是 我发出去的, <- 是服务器发过来的。乱码是图片,我以二进制格式保存到了.bin文件里。
一些小tips
1、你可以随意浏览网页抓包,但是很多网页都是https协议,由于https协议是加密的,你会抓到乱码。而且浏览器中请求太多,不方便我们分析。
2、推荐大家使用httpbin。可以发送简单的http请求。指路:http://httpbin.org/
比如:curl -X GET "http://httpbin.org/image/jpeg" -H "accept: image/jpeg"
这是获取 jpeg格式的图片。一个终端发送请求,一个终端执行printall捕获数据,美哉。
3、使用 hexdump -C XX.bin 在终端中将二进制数据转换为16进制展示。
4、使用 ctrl + shift + f 在终端中查找数据,比如我在捕获的数据中找到了 ff d8,也就是jpeg文件头,感人!
下次讲讲如何分析捕获的数据并重组为源文件。