经验分享 | 关于“入侵检测”的一些想法
作者:admin | 时间:2018-6-15 03:39:15 | 分类:黑客技术 隐藏侧边栏展开侧边栏
离开长沙的时候写了一篇文章“左右互博:站在攻击者的角度来做防护”(freebuf上可以找到),一晃已经是三年了。这三年接触了很多东西,自己也有过很多想法,但实际上去做的却很少。花了很多时间,做了一款插件化的漏洞扫描器,这里不做介绍。这里主要介绍的是另外一个想法(这些年做的最有成就感的事情),我把它理解为真正意义上的“入侵检测”。
很多安全人员对“入侵检测”这个东西都是持吐槽的态度(记得发“使用Pfsense+Snorby构建入侵检测系统”出来后,有好些人吐槽“不觉得用nmap扫描一下 然后一大堆告警还值得牛逼 那么多告警没人看的”,印象深刻啊!),光有吐槽还不够,我们还要想着怎么去改变。只有不断的改进,这个世界才有可能不断的进步变好。
0×00、前面的废话
“入侵检测”,从字面上的意思来解释就是“对入侵行为的检测”。但目前市面上的商业产品和开源产品实际上都是对“攻击行为的检测”,入侵行为日志往往淹没在攻击行为日志里面去了,实在是有些鸡肋。
0×01、我想要成为的样子
上面那张图就是我想要表达的想法(通过流量镜像,将请求数据全量保存,响应存在异常才保存)。
通过分析网络中的请求和响应,来判断漏洞的存在(攻击者前脚发现漏洞,我们可以实现实时发现,并溯源)。
正常的漏洞检测过程(将漏洞poc打向服务器,根据服务器的响应判断漏洞是否存在)。
站在守护者的角度,我也能够将请求和响应拿到,然后来做判断。
0×02、效果A(发现漏洞的存在)
我目前做的是“检测http响应数据(基于关键字)”,检测出问题然后关联http请求。
案例一、Directory:(目录遍历漏洞)
http响应里面出现Directory:,关联http请求,下面是部分详细数据(我把http请求头里面的字段都做了切割)。
案例二:”\system”(这是一个误报,只是攻击行为)
案例三、svn信息泄露漏洞
案例四、远程命令执行漏洞
案例五、文件读取漏洞
通过上面几个案例,大家会发现这种对只针对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
我这边实现了一个zip的(只是存储下了http响应头,理论上整个文件都可以保存下来。)
详细如下:
实现过程:捕获到响应数据包,判断头部是否存在“Content-Type”字段,存在且内容为“application/zip”,然后把http请求数据包关联起来就行存储到Elasticsearch中去。
题外话:
如果实现了从流量中提取整个文件,那可以接入一些病毒检测引擎,对文件做安全检测。
0×04、扩展
除http外的协议
1、ssh: ssh登录判断,从流量中判断是否登录成功(这个目前还真不知道怎么去实现)。
2、dns: 获取dns请求(这里可以结合现在比较流行的威胁情报来玩)
无意中在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隧道木马就是这样做的,它会对执行命令的结果进行编码后传输。),这样肯定会加大检测的难度。
这种明文传输的命令执行,肯定是很容易从流量中检测到的。
这里我们将命令执行结果做了一次编码,然后再传输,这样就加大了检测难度了。这样我们就需要对响应数据包进行编码的识别了,效率大大降低,成本将大大提高。
0×07、后面的废话
这套系统是我用python写的,目前实行了一些功能(上面提到的基本都有了),不过还存在很多bug。本打算开源出来,一想没必要,不懂的拿来也没法用好,没法改进,能看懂的,有了上面我提供的思路下面的逻辑图,基本上也能弄出来。
下面是精简化的逻辑图(python为开发语言,redis为缓存,Elasticsearch为存储,Kibana为前端展示):
PS:该写的不该写的都写了,写的不好,发现错别字,请不要大惊小怪,理解万岁!
*本文原创作者:PgHook