在资产梳理过程中,如何通过证书有效地排除干扰
在资产梳理过程中,如何通过证书有效地排除干扰
▌背景痛点
FOFA工程师一个主要的业务场景就是做攻击面梳理,又叫暴露面管理。核心的要求就是尽可能全面,并且尽可能准确。一个行之有效的方式是通过cert.is_valid语法来做组合查询,快速验证资产的证书是否是由受信任的证书颁发机构所颁发,比如使用语法:
cert="fofa.info" && cert.is_valid=true
cert.is_valid是判断这个证书有效的方式,但是后来大家发现在梳理攻击面的时候容易出现干扰:有很多不是企业资产,但是被人绑定DNS记录(比如很多网站被DDoS攻击后,故意把DNS绑定到baidu.com,会把攻击流量引导到大型互联网公司),如下图所示:
这个时候我们就发现那些故意绑定到大公司官方IP的域名并非我们需要梳理的有效攻击面,因此需要对这些干扰进行处理。
▌解决思路
一个最简单粗暴的方式就是,我们模拟浏览器的行为,判断域名跟证书内的信息是否匹配。但是这个方式马上会带来另一个问题:一个证书是有效的,但是并不匹配域名的资产,是否就不是目标暴露面的一部分?是我们认为的干扰数据?
我们看这个例子:
上面的搜索结果中,我们已知IP肯定都是某银行的资产,因为只有有证书私钥的情况下才可以绑定证书,打开后浏览器会提示证书无效,如果通过证书是否匹配,这个域名就被我们丢弃掉了,实际上我们肉眼可见的可以判断出来,这其实是我们目标的暴露面。
这种情况大量存在,我们推测一下情况应该是这样的:运维团队把有效的证书放到了一台服务器,内部有一个业务域名,但是不在证书中进行登记。有可能运维团队后续会进行更新只是目前还没有登记,也或者内部觉得证书是可信的就行了,不用再去登记,反正可以使用,至少比自签名的证书要强。
基于上面的案例,我们抛弃了简单的加一个“证书可信”的开关,而是要兼顾到全面性和准确性的要求,最终,我们在研究的基础上,添加了cert.is_match语法,同时顺便解决了证书是否过期的判断。
我们将以前的判断语法和新添加的两个语法放在一起进行解释:
cert.is_valid 证书是否可信(非自签名的验证是否为信任证书机构颁发,true可信、false不可信)
cert.is_match 证书是否匹配(资产的域名和证书使用者的域名是否匹配,true匹配、false不匹配)
cert.is_expired 证书是否过期(true为已过期、false为未过期)
我们回到举证的案例中,加上这个语法:
cert="fofa.info" && cert.is_valid=true && cert.is_match=true
就可以将干扰资产排除掉。
当然除此之外,还有当可信性是true,是否匹配是false,但是资产仍然是自身资产的情况,也就是我们上文中提到的案例,也可以通过这个语法获取到:
cert="abchina.com.cn" && cert.is_valid=true && cert.is_match=false
▌写在最后
关于新添加的证书验证语法,可以在资产收集的过程中起到了很大的作用,包括FOFA开放实验室里的攻击面梳理也已经应用了这个语法。
同时这种判断方式的语法可以单一使用,也可以多组合使用,更大程度上地给到了大家可选性。欢迎各位表哥们开发这套语法,发现他更多的新姿势。
最新评论