经验分享 | 关于“入侵检测”的一些想法

2018-06-13 192796人围观 ,发现 16 个不明物体 网络安全

*本文原创作者:PgHook,属于FreeBuf原创奖励计划,未经许可禁止转载

离开长沙的时候写了一篇文章“左右互博:站在攻击者的角度来做防护”(freebuf上可以找到),一晃已经是三年了。这三年接触了很多东西,自己也有过很多想法,但实际上去做的却很少。花了很多时间,做了一款插件化的漏洞扫描器,这里不做介绍。这里主要介绍的是另外一个想法(这些年做的最有成就感的事情),我把它理解为真正意义上的“入侵检测”。

很多安全人员对“入侵检测”这个东西都是持吐槽的态度(记得发“使用Pfsense+Snorby构建入侵检测系统”出来后,有好些人吐槽“不觉得用nmap扫描一下  然后一大堆告警还值得牛逼  那么多告警没人看的”,印象深刻啊!),光有吐槽还不够,我们还要想着怎么去改变。只有不断的改进,这个世界才有可能不断的进步变好。 

0×00、前面的废话

“入侵检测”,从字面上的意思来解释就是“对入侵行为的检测”。但目前市面上的商业产品和开源产品实际上都是对“攻击行为的检测”,入侵行为日志往往淹没在攻击行为日志里面去了,实在是有些鸡肋。

0×01、我想要成为的样子

1.png

上面那张图就是我想要表达的想法(通过流量镜像,将请求数据全量保存,响应存在异常才保存)。

通过分析网络中的请求和响应,来判断漏洞的存在(攻击者前脚发现漏洞,我们可以实现实时发现,并溯源)。

正常的漏洞检测过程(将漏洞poc打向服务器,根据服务器的响应判断漏洞是否存在)。

2.png

站在守护者的角度,我也能够将请求和响应拿到,然后来做判断。

0×02、效果A(发现漏洞的存在)

我目前做的是“检测http响应数据(基于关键字)”,检测出问题然后关联http请求。

3.png

案例一、Directory:(目录遍历漏洞)

http响应里面出现Directory:,关联http请求,下面是部分详细数据(我把http请求头里面的字段都做了切割)。

 4.png

5.png案例二:”\system”(这是一个误报,只是攻击行为)

6.png7.png

案例三、svn信息泄露漏洞

8.png

案例四、远程命令执行漏洞

9.png10.png

案例五、文件读取漏洞

11.png

通过上面几个案例,大家会发现这种对只针对http响应做关键字匹配的检测,还是会存在一些的误报。如果对http请求也做检测,如果http请求和响应都存在异常,那基本就可以90%确定问题了。 

0×03、效果B(监控文件下载行为)

我为什么想要去实现这个了?

1、  很多时候管理员部署应用的时候,都喜欢打个包上传,然后解压部署,往往忘记了删除压缩包,导致源代码泄漏。

2、  很多时候黑客攻击,想要窃取数据,也会通过打包下载的方式。

那怎么去实现“监控文件下载的行为”(这里我们只讨论http)?

其实答案很简单啦,多抓几个文件下载的数据包,看下就知道了。http响应里面有一个字段叫“Content-Type”,通过这个字段我们就可以知道文件的类型。

例如:

Content-Type 内容为“application/zip”,说明下载的文件类型为zip。

Content-Type 内容为“application/x-gzip”,说明下载的文件类型为gz。 

这里给大家提供个Content-Type内容对应的文件列表,方便大家查找。

https://github.com/hosom/file-extraction/blob/master/scripts/file-extensions.bro

12.png

我这边实现了一个zip的(只是存储下了http响应头,理论上整个文件都可以保存下来。)

13.png

详细如下:

14.png

实现过程:捕获到响应数据包,判断头部是否存在“Content-Type”字段,存在且内容为“application/zip”,然后把http请求数据包关联起来就行存储到Elasticsearch中去。

题外话:

如果实现了从流量中提取整个文件,那可以接入一些病毒检测引擎,对文件做安全检测。

0×04、扩展

除http外的协议

1、ssh:  ssh登录判断,从流量中判断是否登录成功(这个目前还真不知道怎么去实现)。

2、dns:  获取dns请求(这里可以结合现在比较流行的威胁情报来玩)

15.png

无意中在github中发现一个有意思的开源项目(可以结合起来玩)。

xsec ip database为一个恶意IP和域名库(Maliciousip database),它获取恶意IP和域名的方式有以下几种:

通过爬虫定期拉取网络中公开的恶意ip库(可能过增加新爬虫的方式订阅新的IP库)

支持与自有的其他安全产品联动(HIDS、WAF、蜜罐、防火墙等产品),实时更新IP库

https://github.com/netxfly/xsec-ip-database

0×05、怎么去实现上面的效果(拿http协议举例子)

要“成为想要的样子”需要做如下的工作:

A、 流量镜像(这个比较好弄,直接在网络设备上可配置)

B、 从流量中提取http请求数据和http响应数据

C、 组合http请求数据(一般出现在post请求中,tcp会分段)

D、 组合http响应数据

E、  解压缩http响应数据(很多都做了gzip压缩,需要解压)

F、  检测http请求和http响应数据(安全检测,也可以说是对数据的分析,判断数据是否异常。)

G、 关联http请求和http响应

PS:心里累,一堆问题,总是一次又一次把自己之前的观点(B到G)给推倒。

这里我不做介绍了,怕误导大家,因为我也没完全弄明白。

写的程序也还有些bug如:

1、如请求和响应关联不上

2、请求(响应)数据包没组合起来3

3、响应数据包没有解压

……

0×06、不该写的部分

攻击和防守总是在互相促进,如果我是攻击者,肯定会想办法去躲避这个检测。其实也很简单,检测都是基于数据是明文传输的基础上的。如果对http响应数据进行一些简单的编码再传输(dns隧道木马就是这样做的,它会对执行命令的结果进行编码后传输。),这样肯定会加大检测的难度。

16.png

这种明文传输的命令执行,肯定是很容易从流量中检测到的。

17.png

这里我们将命令执行结果做了一次编码,然后再传输,这样就加大了检测难度了。这样我们就需要对响应数据包进行编码的识别了,效率大大降低,成本将大大提高。 

0×07、后面的废话

这套系统是我用python写的,目前实行了一些功能(上面提到的基本都有了),不过还存在很多bug。本打算开源出来,一想没必要,不懂的拿来也没法用好,没法改进,能看懂的,有了上面我提供的思路下面的逻辑图,基本上也能弄出来。

下面是精简化的逻辑图(python为开发语言,redis为缓存,Elasticsearch为存储,Kibana为前端展示):

18.png

PS:该写的不该写的都写了,写的不好,发现错别字,请不要大惊小怪,理解万岁!

*本文原创作者:PgHook,属于FreeBuf原创奖励计划,未经许可禁止转载

发表评论

已有 16 条评论

取消
Loading...
css.php