域名管理工具——Shepherd(牧羊人)

本系列的第1部分(Part 1)介绍了红队用于管理域名的解决方案,主要讨论了数据收集方面,此外还介绍了DomainCheck工具。正如该文所述,SpecterOps团队继续研究和开发一个将DomainCheck的数据收集与团队管理功能相结合的解决方案。Shepherd就是第一个从这项工作中产生的产品。

Shepherd旨在供运营团队使用。它会跟踪域名和每个域名的当前DNS设置、分类、历史记录和状态。跟踪状态包括哪些域名:准备好使用,销毁/退役或正在使用,以及哪个团队成员签出了活动域名。

Shepherd是GhostManager系列的最新成员。参看这里:

GhostManager/Shepherd
A Django application to help red team operators manage a library of domain names – GhostManager/Shepherdgithub.com

一、形成合力Tending to the Flock

越是检查域管理解决方案需要什么,我们就意识到初始设计(第1部分中提到的)越不合适。一个简化域名检查、自动化签到和跟踪分类的解决方案将是一个良好的开端,但它只适用于小团队。如果有人对域名有疑问,可以轻松联系小团队确认信息。但这对于分布在多个时区的大型团队来说没有效果。

谁购买?

这是SpecterOps聊天中常见的问题。该团队为不同目的购买了许多域名,但这些目的并不总是很清楚。如果跟踪域名的历史记录,任何人都可以看到它的购买时间、购买原因、是否为特定项目购买以及如何使用。

销毁

项目跟踪导致了域的健康状态不是全局的。如果向安全团队报告了网络钓鱼链接,则该域很可能会在短时间内被列入黑名单,但该域还不只是一个域名。如果域名本身未向第三方报告,则该域名有生命的第二次机会。跟踪域的历史记录意味着任何人都可以看到他们不应该再为特定客户端使用该域,但不要认为它被“销毁”。

迷途羔羊

与上述情况一样,如果域名的分类更改为“可疑”或“网络钓鱼”,则无需深思熟虑即可收回该域名,Shepherd会自动执行此操作。但是,有些情况比较模糊,需要有人来打电话。我们决定为管理用户(即高级运营商)提供快速收回任何域名并将其从池中删除的能力。

运营商可能还希望出于其他原因从池中删除域,例如将其保留用于将来的项目或使域老化。新域名在池中默认为“可用”,因为它们未被使用或与项目绑定。我们确定“保留”状态对将来购买的域名有用。

二、管理

随着设计和目标图的勾勒显现,Shepherd的开发向前迈进了一步。为了方便测试,我们设计了这个新工具,以便可以在将来其他一些正在开发的GhostManager项目可以添加或扩展它。最终界面干净且易于使用。中国菜刀

域名管理工具——Shepherd(牧羊人)

Shepherd的主页和摘要信息

我们设计的Shepherd很简单。用户通过身份验证后,会向他们显示域目录的摘要,并可以查看所有团队的域或根据域的状态进行过滤。域目录跟踪所有域名及其各种状态和历史记录。还有一个备注字段可用于记录域名的购买原因,提供之前如何使用域名的详细信息,或者为何暂时保留或永久停用域名。

域名管理工具——Shepherd(牧羊人)

查看可用域及其状态

这也是团队成员可以签出域以用于项目的地方。签出域时,用户将看到第二个屏幕,询问有关跟踪该域名使用情况的详细信息。Shepherd跟踪谁正在检查域名、客户名称、项目类型(例如渗透测试,红队),域名将如何使用(例如网络钓鱼,C2),以及域名将被使用的日期范围。单击目录中的域名将向用户显示为该域记录的所有详细信息以及该域的历史记录。

目前,Shepherd会检查客户端名称是否已存在于数据库中。如果在数据库中找不到该名称,则会创建一个新条目。由于拼写错误以及不同名称可能用于同一组织的可能性,这并不理想,但为将来的更新奠定了基础,该更新将包括客户经理以及编辑客户端和查看与客户关联的项目和域的能力。

域名管理工具——Shepherd(牧羊人)

签出项目的域名

具有更高访问权限的用户(例如,高级操作员)可以将域标记为已退役/已销毁或不可用(即,保留状态)。这些用户可以暂时将域从池中拉出来让它们老化或将它们标记为已销毁,因此没有人可以检查它们以便于将来的评估。天空彩

域名管理工具——Shepherd(牧羊人)

查看单个域的详细信息和历史记录

最后,用户可以查看不可用域列表,以查看哪些已被销毁和删除,以及哪些域名处于观望状态。没有域从数据库中完全删除,由此维护了历史记录。

搜索栏也始终可用,可以按域名和类别进行搜索。

数据导出

可以从csv文件导入记录。Shepherd提供了一个模板,可以从该页面下载并进行编辑。只需要基本信息(例如域名,注册商,购买日期和到期日期),如果可以随时获取的话,也可以包括健康和类别信息。

域名管理工具——Shepherd(牧羊人)

使用csv文件一次性上传

此外,最新的DomainCheck输出一个准备导入Shepherd的csv。请先确保在2019年1月15日发布此帖子的日期之后更新DomainCheck。

自动更新

可以使用分类数据手动更新域记录。作为一个更好的选择,DomainCheck的功能已经融入Shepherd。Shepherd有一项任务可以更新目录的DNS和分类数据。 DNS更新可能需要一两分钟,但由于API限制,完整的运行状况检查可能需要一段时间(VirusTotal的免费API每60秒只允许四个请求,因此检查需要X分钟,其中X = TOTAL DOMAINS / 4 )。默认睡眠时间为20秒。

如果用户拥有付费的VirusTotal API密钥,则可以在Shepherd的设置中更改休眠时间。这将有助于加快检查速度,但减少太多检查并不可取,因为Shepherd将在一些网站上遇到一些reCAPTCHA。

更新将作为后台任务运行,并在更新域时审核每个域。

域名管理工具——Shepherd(牧羊人)

在Shepherd界面中监控域更新

此任务也可以安排在特定时间运行。然后,更新页面成为请求手动更新和查看上次更新状态的方式,无论是手动还是计划。

此外,SpecterOps团队正在研究条件任务执行。例如,可以在签出时为单个域安排定期类别检查。解除这些任务很简单,但其中一些(如类别更新)可能需要一段时间,而且只需偶尔触发它们。

Slack集成

与DomainCheck一样,Shepherd有一些Slack集成选项。如果启用了Slack消息并且在settings.py中填写了Slack配置,Shepherd将向指定的通道发送消息。发送消息以警告用户各种事件,例如域健康检查完成以及从“健康”翻转为“已销毁”的域。

我们也在考虑其他一些选择。 Shepherd可能最终支持通过Pushover等服务发送电子邮件和/或推送通知。

三、技术细节

我们开始想使用Python和Flask Web框架,但某些要求促使我们使用Django。对于像这样的项目,Django比Flask更具优势,比如内置的管理控制台,具有“开箱即用”的身份验证和帐户管理支持。此外,Django还支持几种类型的数据库,默认使用SQLite。Shepherd用户不太可能需要同时进行数据库编辑,因此Shepherd使用默认的SQLite数据库。

目录应用程序

为了使用Django的术语,Shepherd包含一个名为catalog的“应用程序”。这是跟踪域名及其相关内容的主要应用程序。用于目录的Django“模型”在可视化时看起来像这样。

域名管理工具——Shepherd(牧羊人)

Shepherd数据库模型和关系

这是一个简单的设计,允许编辑数据库和迁移。Django的makemigrations和migrate命令使数据库调整变得轻而易举。这些命令还应该帮助任何希望修改模型的用户添加新字段或更改Django管理控制台中数据的显示方式。

Web设计

Shepherd使用jQuery,jQuery UI,Bootstrap,JavaScript和Font Awesome进行一些网页设计,主要是菜单和日期选择器等小部件。它们在base_template.html文件中进行管理与加载。Django使用模板来呈现网页,可以轻松生成内容,例如域名表。

其余模板使用HTML和Jinja2构建。使用Jinja2,在一个文件中创建并维护基本模板。对于Shepherd,这是侧边栏菜单和导航栏所在的位置以及加载脚本和样式表的位置。

必须创建许多不同的表单来管理域目录。不是在HTML文件中创建单独的HTML表单,而是将表单传递给后端Python代码中的模板,并在使用Jinja2内容块加载网页时放置和呈现。

其他模板扩展了基本模板并使用了Shepherd的Django模型和表单,因此有些只是几行HTML和Jinja2代码,但显示了用于管理域的整个表单。可以根据需要自定义任何单个页面,也可以在一个位置管理需要应用于表单、模型或样式选择的所有实例的更改。

根据需要自定义Shepherd很简单。

App依赖库

Shepherd运行在Django之上。域状态更新需要一些额外的库:

· bs4

· cymon

· lxml

· pillow

· pytesseract

· requests

· django-q

· redis

主要的依赖是Django-Q及其自动消息队列协议(AQMP)“broker” Redis。需要AQMP,因为Shepherd必须运行一些不同的后台任务,包括发送Slack消息,在项目的结束日期自动释放域名,以及运行域状态更新。

释放域需要快速循环标记为正在使用的域并释放结束日期等于当前日期或更早的域。这需要一些时间来完成,并且可以作为Web请求按需运行,但我们希望这在每天午夜后自动进行。

另一方面,我们希望域更新是按需而非预定,但它们可能需要20分钟或更长时间才能完成。这对标准Web服务器请求不起作用,因此任务必须在后台运行。

请求域状态更新时,将任务交给代理进行处理。任务在后台排队并执行,因此最终用户无需等待20分钟即可获得服务器的响应。将域重新发布到池中的任务也会如此,除非它在预定时间发生,而不需要进行任何请求。

计划任务选项

我们简要地考虑使用一些更基本的替代方案,例如创建自定义管理任务和使用cron作业在预定时间通过Django的manage.py调用函数。这个选项本来可行,但它不那么优雅,选择有限,并难以进行监控。如果我们选择了这个选项,那就需要更高级的解决方案,所以现在最好这样做。事实证明,我们很快发现了Django Q的一些额外用途,如Slack消息队列和动态调度任务。避免使用cron作业是一个很好的选择,在以后的功能开发中得到了回报。

我们还研究了Celery,Huey和django-background-tasks。使用Redis或RabbitMQ的Celery仍然是许多项目使用的标准软件包,但是我们看不到将来对该级别的队列管理的需求。Shepherd需要执行的最复杂的工作是域健康检查,并且不经常执行,由于API限制而必须一次执行一个域并避免reCAPTCHA。如果我们可以为每个域启动任务,那么Celery将是管理100多个任务的绝佳选择。

django-background-tasks解决方案看起来很棒,但对于我们想要的产品来说太简单了。它基本上是一种以编程方式与crontab交互的好方法,并且(根据文档的建议)仍然使用cron作业来确保django-background-task队列管理器在任务失败时保持运行。这不是一件坏事,但与完整的cron作业解决方案一样有一些相同的缺点。

我们最终选择了Django-Q,因为它是Django原生的,集成到管理面板中以便于监控和故障排除,并且易于实现。它仍然需要broker,但设置broker很简单。 Django-Q默认使用Redis,Redis有一个Python库,它是一个非常简单的代理。所需要做的就是安装Redis(例如brew install redis),然后启动服务器。如果需要,Django-Q还支持更高级的选项,如RabbitMQ和Amazon SQS。总的来说,这是最好的选择。

域名管理工具——Shepherd(牧羊人)

Django Q集成到Shepherd管理面板中

四、总结

Shepherd希望通过自动化大量繁琐且易出错的管理来改善团队成员之间的沟通,这些管理用于记录域名使用背后的种种问题。这允许团队成员专注于项目的更有趣/技术方面,而不是ping Slack通道以查明域是否可用。

更令人兴奋的是Shepherd的未来潜力。如上所述,我们已经在努力扩展这个平台,很高兴在不久的将来分享结果。Shepherd只是开始;我们希望这个平台真正飙升到新的高度,所以请尽快关注更多新闻!

请注意,虽然我们已经包含了用户身份验证和基本用户角色的有限权限,但Shepherd不应该放在互联网上。请记住,Shepherd包含客户名称,域名和项目详细信息。我们强烈建议任何使用Shepherd的人在内部使用它并在外部访问时使用VPN。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值