如何利用开源软件实现企业级的攻击面监控

译文来源:https://hakluke.com/open-source-asm-spiderfoot/。受个人知识所限及偏见影响,部分内容或存在过度曲解误解问题,请各位师傅包含并提出意见,感谢

近年来,随着各大团体机构互联网足迹的增加,攻击面检测已经变得越发的重要与流行。黑客们正在利用各种先进的侦察方法来挖掘并监控一个机构面向互联网的所有资产。当攻击面信息发生变化时,如果黑客们能够立即检查这些新的变化是否可能带来安全问题,那么这样的通知对于他们来说是非常有益的。当然,对于相关机构组织来说,检测自己的攻击面也同样重要,这样它们至少能够获得与攻击者相同的可见性。

如今已经有了大量的能够帮助我们自动化检测攻击面这一流程的可用工具。其中的一些工具相当的昂贵,并且是被专门为在企业环境中使用而设计的。好在对于个人用户、OSINT爱好者和漏洞赏金猎人来说,还有一些不错的免费、开源的替代产品。接下来,我将会深入研究其中的一个工具, SpiderFoot

开源版的SpiderFoot可以说是相当的了不起,而且完全免费。它已经工作了近十年之久,非常稳定,功能也很丰富。如果你想获得全方位的攻击面监控能力,你需要使用SpiderFoot HX,这是一个云端托管的高级付费产品。如果你不想在云上做这些事情,或者预算紧张的话,我将会介绍一些更为简单的方法,你可以使用开源版本的SpiderFoot和其他工具脚本一起来获得一些基本的攻击面监控能力。这将使你能做到以下这些:

  • 当新的主机出现在证书透明度、SHODAN和其他挂载了SpiderFoot用来识别新主机的地方时,会得到通知。
  • 当确定新主机时对其进行捕获屏幕截图
  • 剩下的就看你的想象力了——如果SpiderFoot检测到了新的资产,你可以得到相关的提醒信息。

首先,让我们选择我们需要模仿的SpderFoot HX功能来进行获取。在开源版本之外的SpiderFoot HX的主要功能中,那些用黑体字标出来的功能看上去就是不错的选择,因为它们能够提供很多有价值的信息,而且也似乎很容易实现:

  • 托管、预安装与预配置
  • 更好的性能(5倍-10倍)
  • 团队协作
  • 可单次扫描多个目标
  • 具有资产变更检测及提醒的监控功能
  • 资产关联性
  • 可通过图形化UI进行调查勘测
  • 客户支持
  • 内置TOR集成
  • 向Splunk,ElasticSearch和REST端点提供数据
  • API
  • 屏幕截图

API

或许令人惊讶的是,这一点是非常容易实现的。开源版的SpiderFoot使用SQLite3作为后端数据库。如果你已经执行过了一次扫描。你只需打开SpiderFoot安装根目录下的spiderfoot.db文件,就可以轻松查看数据库中的原始结果。

有一个很好的开源项目叫做Datasette,它可以接收任何SQLite文件,并把它变成一个可浏览的web界面,同时还有一个完整的JSON API。它还有其他一些方便的功能,如运行原始SQL查询语句和以CSV格式导出数据的能力。需要提醒的是,Datasette没有任何认证,它允许任何访问该页面的人运行任意的SQL命令并查看你的所有数据,所以千万不要把它暴露在localhost以外的地方!

我们可以简单地通过使用pip来安装Datasette并进行设置(需要Python3.6或更高版本):

pip install datasette

如果你用的是Mac的话,你还可以使用Homebrew:

brew install datasette

然后我们就可以用下面的命令启动datasette。你可能需要修改数据库的位置,这取决于它在你系统中的存储位置。

datasette serve ./spiderfoot.db

然后你就会看到与下面类似的内容:

wKg0C2FQYFGAU5CtAABsFO5dLA0076.png

导航到http://127.0.0.1:8001,就可以看到Datasette的web界面:

wKg0C2FQYY2AIfTKAAByBEf6ws059.png

扫描结果存储在名为“tbl_scan_results”的表中,导航到该表将在web UI中的一个表中显示数据。

wKg0C2FQYgKAQQwLAADpnBk0GDk333.png

你可能会注意到这里的一个“json”链接,在上面的截图中用红色箭头指出的。点击这里将会把你带到到该表的JSON端点。

wKg0C2FQYhyAKnw9AAFGdH0Wlv4119.png

为了过滤数据,你可以使用HTTP GET请求参数。例如,为了只查看SpiderFoot sfp_whois模块的结果,我们可以导航到以下URL。注意最后的&module=sfp_whois

http://127.0.0.1:8001/spiderfoot/tbl_scan_results.json?_labels=on&module=sfp_whois

wKg0C2FQYjSAKnhGAAHHh1PsiuM748.png

这就对了!在几分钟内,我们已经建立了一个完整的JSON API,包含了我们所有的SpiderFoot数据。

屏幕快照

有许多不同的开源命令行工具用于对主机的HTTP响应进行截取快照,但其中我最喜欢的是michenriksen的Aquatone

首先,我们需要一份要进行截取快照的主机列表。不过好在我们已经搭建好了我们自己的API,所以这一步用下面的命令就很简单了:

curl -s "http://127.0.0.1:8001/spiderfoot/tbl_scan_results.json?_sort=rowid&type__exact=INTERNET_NAME" | jq ".rows[][9]"

curl命令查询API并返回JSON响应,然后用jq来提取主机名。输出结果如下所示:

wKg0C2FQYkOAX2RdAABsNwc0oGY284.png

你可能注意到了这里还有一些重复的内容,让我们用sortsed命令将这些和双引号都去掉。

那么,从SpiderFoot中提取所有原始、唯一的主机名最后的命令看上去就会像这样:

curl -s "http://127.0.0.1:8001/spiderfoot/tbl_scan_results.json?_sort=rowid&type__exact=INTERNET_NAME" | jq ".rows[][9]" | sort -u | sed "s/\"//g"

输出如下:

wKg0C2FQYlCAdFiGAACLcQjGG9Y340.png

为了方便起见,我准备把它保存在一个bash文件中,以便于后期执行,为了实现这一点,我只是把命令单纯地复制到了gethosts.sh中,并赋予了执行权限。

wKg0C2FQYmCAPfOOAABsmtTwk4E999.png

现在前往Aquatone的releases页面,选取适合你操作系统的最新版本,下载并解压。然后你就会在里面发现一个二进制文件。

这里的截图功能主要是利用无头的Chromium或Chrome。不过Aquatone的文档中提到,Chrome有时会不稳定,所以它们建议安装并使用Chromium,你可以在这里找到它。

一旦安装完毕,我们需要做的就是像这样把gethosts.sh的输出通过管道命令传给aquatone

~/gethosts.sh | aquatone

我建议尽量在一个新的空目录下执行这一操作,因为它将会创建大量的文件及文件夹。

输出结果如下所示:

wKg0C2FQYnaALYJPAACnAj8OvuY799.png

当aquatone执行完成时,它将会在你的当前目录下创建一些文件,如下所示:

wKg0C2FQYoOATUBbAAB3fRLZkIQ165.png

如果你看一下screenshots目录的话,你将会看到这些原始的屏幕截图:

wKg0C2FQYpKAFp4ZAACyLIz38641.png

除此之外,你可以打开aquatone_report.html文件,你将会看到一个已扫描主机概要的UI界面,其中包括了屏幕截图(按相似度分组)、原始响应及HTTP请求头。如下所示:

wKg0C2FQYqCAeatxAACaAEVF01U679.png

具有变更检测及通知的监控功能

目前来看,开源版本的SpiderFoot仅提供了单一的扫描功能,没有办法通过定期的扫描实现对目标的持续监测。这一功能只在SpiderFoot HX有所提供。理想情况下,如果我们正在入侵一个目标或是为我们自己提供防御,我们希望每天至少要进行一次扫描,任何的变更信息都应该给及时地通知给我们。

SpiderFoot是一款相当全面的应用程序,它支持接收多种不同地数据类型。如果对所有的数据类型进行报警的话就会产生大量的通知信息,所以在本文中,我们只对那些新发现的子域名进行监控。这对于监控大范围资产的漏洞赏金猎人,或是用于监控自己系统的安全团队来说,都非常有用。但需注意的是,你也可以用类似的方法使用SpiderFoot收集到的任何数据。

配置Cronjob实现持续化扫描

首先,让我们通过利用cronjob来设置定期扫描!要开始设置,只需运行如下命令:

crontab -e

然后就会在vim中打开含有你所有cronjob的文件。如果你知道如何使用vim的话,你只需要输入下面这行,然后保存并退出。你只需要根据你自己的设置来修改sf.py的位置,并将“yourtarget.com”改为你的扫描目标就可以了。

0 2 * * * ~/tools/spiderfoot/sf.py -s yourtarget.com

但如果你不确定如何使用vim编辑器的话,请严格按照以下说明进行操作。

  • 当你运行crontab -e命令之后,按下i键进入插入模式。

  • 输入如下内容,根据你的配置修改sf.py的所在路径及扫描目标

    0 2 * * * ~/tools/spiderfoot/sf.py -s yourtarget.com
  • 按下退出键(Esc)

  • 输入:wq

  • 回车

这里的“0 2 * * *”表示cron将在每天凌晨的2点运行该命令。想要更好的了解cron流程调度的工作方式或创建你自己的自动化流程的话,请查阅crontab.guru

这样就好了!现在你已经编辑好了crontab内容,扫描将在每天的凌晨2点运行。

资产变更检测

正如我前面所说,在本文中,我们只对发送新子域名的通知感兴趣,所以我们可以重复使用我们之前创建过的gethosts.sh脚本。

首先,让我们来创建一个bash脚本,用来将新的主机追加到一个文件中。将该脚本保存为appendhosts.sh文件:

touch ~/hosts.txt
for line in `~/gethosts.sh`; do grep -qxF $line ~/hosts.txt || echo $line >> ~/hosts.txt; done

确保使用了chmod +x ~/appendhosts.sh命令赋予了执行权限。

接下来,运行crontab -e命令,添加下面这行,使脚本每小时运行一次。

0 * * * * ~/appendhosts.sh

现在,任何时候只要发现了新的子域名,它就会被添加到~/hosts.txt文件的末尾。只剩下最后一步了,设置通知功能!

设置通知

最后一步是为我们在前一步检测的变化来设置通知。同样,我们可以用一些bash脚本和一个cronjob来配置这一步。我将会使用一个Discord webhook机器人来进行通知。基本上,我们可以通过curl向我们自己的Discord webhook发送一条消息,然后它将会作为一条Discord消息发送出去。

要想设置Discord webhook URL,请遵照这里的说明。然后将webhook URL保存下来。

接下来,将下方脚本复制到~/sendnotification.sh文件中,并将示例webhook修改成你自己的。

tail -n 5 -f ~/hosts.txt | grep --line-buffered '.*' | while read line;

do

   curl -H "Content-Type: application/json" -d "{\"username\": \"SpiderFoot\", \"content\": \"$line\"}" "https://discord.com/api/webhooks/1234567890/ABCDEFG1234567";

done

这个脚本将持续监控~/hosts.txt文件的变化。每当有新的子域名信息追加进来,它就会将该子域名作为Discord信息发送出去。同样,注意确保该脚本是可执行的:

chmod +x ~/sendnotification.sh

由于这个脚本需要连续运行,因此最好是在tmux或VPS远程屏幕中运行,这样即便是你的SSH连接中断,它也能继续工作。

运行结果如下所示:

wKg0C2FQYraAMaBQAAAmBZ8TYk205.png

“此外,我在翻译本篇文章时,想起之前尝试写过的一个“缝合怪”脚本(也是用bash脚本写的联动利用Sublist3rcrawlergoradxray缝合成的一个信息收集工具,并且对工具扫描结果进行过滤判断,并调用企业微信API实现消息推送的脚本)。

由于脚本写的太烂这里不做分享,相关参考企业微信API文档在这里[1](发送应用消息 - 企业微信API (qq.com)),[2](获取access_token - 企业微信API (qq.com))。

相关调用API并发送消息的脚本如下:”

# 调用企业微信API获取access_token
# CorpId 处填写所注册企业微信企业ID
# Secret 处填写自建应用的 Secret
access_token=`curl "https://qyapi.weixin.qq.com/cgi-bin/gettoken?CorpId=corpid&corpsecret=Secret"|grep -oP '(?<=_token":").*(?=",)'`
url="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$access_token"
# 调用企业微信API进行消息推送
# userid 处填写要进行消息推送的联系人id,@all 为所有人
# agentid 处填写自建应用的 AgentId
# url 处可填写为云服务器的 web 服务地址
curl -i -X POST -H 'Content-type':'application/json' -d '{
       "touser" : "userid",
       "msgtype" : "textcard",
       "agentid" : agentid,
       "textcard" : {
                "title" : "联动扫描任务完成",
                "description" : "<div class=\"gray\">'$1'</div><br><div class=\"normal\">目标扫描结束,存在疑似敏感信息</div><div class=\"normal\">目标总数:'$2'</div><div class=\"highlight\">报告所在文件:'$3'.html</div>",
                "url" : "url/'$3'.html",
                            "btntxt":"更多"
       },
       "enable_id_trans": 0,
       "enable_duplicate_check": 0,
       "duplicate_check_interval": 1800
    }' $4
exit 0

最终推送效果如下:

wKg0C2FQZsKASomAAFQ69woqhU003.png

总结

本文的重点在于表明即使开源免费版本的SpiderFoot也是一个款非常强大的工具,可以很轻松地进行扩展以提供一些基本的攻击面监控能力。通过在其基础上编写一些简单地脚本,SpiderFoot HX的一些关键功能也能够免费地模仿出来。这对于个人用户、漏洞赏金猎人和OSINT业余爱好者来说可能是一个理想的选择。

如果你经常做OSINT相关的任务,或者是作为一个组织机构去使用它,你可能最好还是选择支付使用SpiderFoot HX,因为它有着更快的速度、支持、托管、多目标任务、关联性信息等功能。

“看到最后,我想作者原意也是希望大家不要被工具的限制性所限制,也不要局限于单纯地使用工具吧。个人觉得现在信息收集的工具和方法已经有千种万种了,但是却仍感觉在面对这些繁杂的信息时更多的还是‘循规蹈矩’(我菜随便说的,我也爱用漏扫什么的:( )。”

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。查看原文

为您推荐