内容采集系统(查询语法如下:模块介绍有利于拓宽攻击面(组图))
优采云 发布时间: 2021-12-15 02:21内容采集系统(查询语法如下:模块介绍有利于拓宽攻击面(组图))
如果目标主机的ip暴露了443端口,那么可以直接访问这个ip来获取有效的SSL证书,发现主机信息,但是这样的查询需要基于全网扫描。恰好censys满足了这个要求。查询语法如下:
443.https.tls.certificate.parsed.extensions.subject_alt_name.dns_names:xxxx.com
模块介绍
考虑到实际查询效果,将以下方法集成到pipeline中:
端口扫描
查询到真实IP后,我们就可以开始端口扫描了。查找开放端口和发现易受攻击的应用程序服务将有助于扩大攻击面。
普通均值模块介绍
幻灯片站点
侧站为网站,与目标网站共享同一台服务器。如果主站无法攻破,侧站可以作为攻击入口。侧站查询的正确性需要基于真实IP的正确性。
常用方法
这段内容可以提供给一些在线网站如站长之家,一些网站提供了virustotal等方便的查询API。
模块介绍
依次使用virutotal, chinz, ipip, webscan, tscan 四个网站找到侧站。本内容主要由selenium爬虫和API查询完成。
指纹
网站的指纹,包括操作系统、中间件、脚本语言、数据库、服务器、Web容器、前端框架和cms类型等,这些信息一般会通过网站的一些特性@> 暴露值,如路由不存在时的页面、404错误页面、数据响应包等。 比如下面的网站,通过输入不存在的路由存在,错误信息中回显cms版本信息:
本地工具或浏览器插件的手动模块介绍
使用selenium爬虫抓取yunsee、whatweb、tscan三个网站的查询结果,并使用subprocess模块调用本地工具wappalyzer查询网站指纹相关信息。
网络扫描
网站 路径扫描可以帮助攻击者找到一些泄露的敏感信息,例如泄露.git文件、泄露.svn文件、泄露.DB_store文件、泄露WEB-INF/web.xml等,扫描效果更多取决于字典的覆盖范围。
常用方法
使用工具,这方面的工具有很多,比如御剑、dirsearch、DirBuster等。
模块介绍
模块分为两个功能
输出
将上述模块的json数据输出转换成html文件输出。
模块组装
模块划分好后,就是如何组装成流水线的问题了。
一开始,我想到了一个简单的管道程序,只有一个入口点。过程如下:
输入 -> whois查询 -> 子域名枚举 -> 真实ip查找 -> 端口扫描 -> 旁站查找 -> 指纹查询 -> 路径扫描 -> 输出
但是马上就发现了一个严重的问题:
假设一个场景:在管道中的真实ip搜索链接中,输出的ip列表可能不正确(可能收录无效ip,或者不收录正确的ip),但是这个时候我该怎么办?在单入的情况下,如果中断,只能从管道中重新开始执行,仍然找不到正确的ip。如果任其发展,势必会导致大量的时间消耗或根本得不到正确的结果。
因此,管道应该有多个入口点,为信息采集器手动采集信息留出空间。当发现管道的输出有问题时,可以立即终止,人工采集后输入正确的信息,从中断的地方继续。
最终的流水线结构如下
如图,我在三个地方设置了入口点。同时可以看出webscan模块和指纹搜索模块是交替执行的。这是因为指纹搜索模块网站的部分有频率限制。为了节省时间,请在等待时执行网页扫描。此外,主程序中设置了许多参数,允许跳过管道中第三个入口点之后的任何链接。
其他需要注意的问题
超时问题
在扫描过程中,主机经常响应太慢。很有可能是对方故意的,说不定是蜜罐。这时候扫描似乎意义不大,所以我们在程序中的扫描部分加入了超时中断函数,保证流水线不会浪费太多时间。
有两种解决方案。首先是在Popen的基础上设置一个定时器来控制时间,达到持续时间就杀掉进程:
kill = lambda process: process.kill()
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
my_timer = Timer(timeout, kill, [p])
try:
my_timer.start()
stdout, stderr = ping.communicate()
finally:
my_timer.cancel()
二是使用subprocess.Run函数,它有内置参数来控制进程的运行时间。
try:
subprocess.run(cmd, timeout=5)
except subprocess.TimeoutExpired:
print('timeout error')
多进程问题
我曾经在端口扫描模块部分写过一个多进程版本。每个进程使用一个 ip 被 tscan 和 nmap 扫描。扫描完成后,将结果通过管道传递给主程序。然而,在测试完成后,测试总是不尽如人意。由于超时,大多数进程直接被杀死。原因很简单:带宽跟不上,所以后来改回单进程版本。
参数提取
最好把各个模块需要的参数聚合成一个配置文件,方便使用。这是我的管道的配置文件。
[whois]
# 站长之家的apikey, 每个key使用500次后会失效需要重新申请
chinz_api_key =xxxxxxxxxxxxxxxxxx
[subdomainemu]
[realip]
# 向fofa发起请求后的睡眠时间
request_sleep =0
# viewdns api key
viewdns_key =xxxxxxxxxxxxxxxxxxxxxxxx
[sidesite]
# 使用virustotal查找时候需要用的apikey
virustotal_api_key =xxxxxxxxxxxxxxxxxxxxxxxx
# selenium等待目标元素加载完成的最大等待时间
selenium_wait =80
[portscan]
# 等待tscan扫描完成的最大等待时间
tscan_timeout =3600
# 等待nmap扫描完成的最大等待时间
nmap_timeout =1800
[fingerprint]
# 每次完成指纹查询后睡眠的时间
sleep_time =240
# 等待元素加载完成的最大等待时间
selenium_wait =60
[webscan]
# dirsearch 扫描的最长时间
dirsearch_timeout =600
# 每次爬虫请求后的延时
spider_delay =0.5
# dirsearch 扫描时候每次请求的延时
dirsearch_delay =0.5
# 是否跳过链接爬取
skip_spider =False
# 是否跳过路径扫描
skip_dirsearch =False
硒
这里踩的坑主要是环境问题。在服务器上测试的时候会遇到一些错误,但是本地运行正常。出现这种情况时,最好检查一下 selenium、chrome 和 chomedriver 的版本是否兼容。如果不协调,就会出现一些神秘的错误。建议到官方网站下载对应版本的chromedriver。
链接重复数据删除
网站链接的爬取一定要做好,否则会浪费很多时间在链接爬取上。比如目标网站上有1000个帖子文章,url类似at形式
http://xxxx/xxxx?p=xxxx
如果全部爬取,难免会耗费大量时间。根据经验,这类链接实际上收录有价值信息的可能性并不高,所以只需要爬取一次,其他类似的链接不会被访问和记录。那么如何去除重量呢?
比如下面这个网址链接
http://abc/def?p=1
http://abc/def?p=2
http://abc/def?p=3
http://abc/def/g/2020-01-20/p/1
http://abc/def/g/2020-01-20/p/2
http://abc/def/g/2020-01-20/p/3
基于以上两种方法,去重后的记录链接:
http://abc/def
http://abc/def/g/????-??-??/p/?
下次遇到同样形式的url链接,就不再访问记录了。
效果展示
由于整个管道的输出太多,这里只截取了各个模块的部分输出。
Whois 模块
子域Emu模块
RealIp 模块
端口扫描模块
SideSite 模块
指纹模块
WebScan模块(爬虫部分)
WebScan 模块(dirsearch 部分)
后记
管道框架在一定程度上节省了测试人员的时间和精力,并且易于扩展和集成更多工具。但是,真实场景复杂多变,程序对信息的过滤过滤非常重要。比如在真实ip搜索阶段,如果过滤条件没有做好,很可能会输出一些错误的ip,然后在后续模块中浪费一些时间。但是,由于流水线作业的运行时间长,测试人员不可能一直盯着流水线作业,更不可能在模块输出的那一刻检查输出结果的正确性. 在更多情况下,只能在明显的错误中发现。当需要中断并检查输出时,它将继续从中间链接运行。在这方面,管道设计本身将严重依赖过滤规则。未来将不断完善程序内的过滤规则,根据情况为每个模块集成更多优质工具。
网络安全领域的对抗本质上仍然是人与人之间的对抗。红军建设的主要目标是保护红军的业务资产安全,如何构建整体的红军安全保障体系成为当务之急。4月27日20:00-21:00,星澜科技攻防演练系列《红队建设之路上的道路与工具》邀您一起探讨红队建设战胜敌人的法宝。