BishopFox/dufflebag
GitHub: BishopFox/dufflebag
一款部署在 AWS Elastic Beanstalk 上的自动化工具,用于大规模扫描公开 EBS 快照中意外泄露的敏感信息和凭证。
Stars: 302 | Forks: 40
# Dufflebag
Dufflebag 是一个用于搜索公共 Elastic Block Storage (EBS) 快照的工具,旨在查找可能被意外遗留在其中的秘密信息。你可能会惊讶地发现,竟然有这么多密码和机密信息随意散落在各处!
该工具被组织为一个 Elastic Beanstalk(简称“EB”,请勿与 EBS 混淆)应用程序,如果你尝试在自己的机器上运行它,肯定无法正常工作。
Dufflebag 包含许多动态组件,因为在实践中读取 EBS 卷的过程相当繁琐。你需要处于 AWS 环境中,克隆快照,从快照创建卷,挂载卷,挂载文件系统等等。这就是为什么它被制作成 Elastic Beanstalk 应用程序的原因,这样它就可以根据你的需要自动扩展或缩减,并且当你使用完毕后,整个环境可以轻松被拆除。
请留意你的 AWS 控制台,以确保没有出现异常情况导致账单激增。我们已经尽力考虑到各种意外情况并提供错误处理……但请务必备份!
# 入门指南
## 权限
你需要向角色添加一些额外的 AWS IAM 权限:`aws-elasticbeanstalk-ec2-role`。或者,你可以创建一个包含这些权限的全新角色,并设置 EB 使用该角色,但这稍微麻烦一些。无论哪种情况,你都需要添加以下权限:
* AttachVolume (ec2)
* CopySnapshot (ec2)
* CreateVolume (ec2)
* DeleteSnapshot (ec2)
* DeleteVolume (ec2)
* DescribeSnapshots (ec2)
* DescribeVolumes (ec2)
* DetachVolume (ec2)
* PurgeQueue (sqs)
* ListQueues (sqs)
* ListAllMyBuckets (s3)
* PutObject (s3)
## 构建
核心应用程序是用 Go 编写的,因此你需要一个 Golang 编译器。但是 EB 应用程序实际上会被构建成一个 .zip 文件(这就是 EB 的运作方式),因此 makefile 会为你输出一个 zip 包。
1. 检查你的区域。Dufflebag 一次只能在一个 AWS 区域中运行。如果你想搜索每个区域,则需要部署相应数量的实例。要更改区域,请修改源代码文件 `region.go` 的内容。
2. 安装依赖:Ubuntu 18.04 x64:
```
sudo apt install make golang-go git
go get -u github.com/aws/aws-sdk-go
go get -u github.com/deckarep/golang-set
go get -u github.com/lib/pq
go get -u lukechampine.com/blake3
```
3. 然后使用以下命令将 EB 应用程序构建为 zip 文件:
```
make
```
你现在应该会在项目根目录中看到一个 `dufflebag.zip` 文件。
4. 最后,你需要创建一个 S3 bucket。在 Dufflebag 内部自动设置这个可能是可行的,但实际上相当困难。所以还是你自己动手吧。你只需要创建一个具有默认权限的 S3 bucket,并使其名称以 `dufflebag` 开头。S3 bucket 名称必须是全局唯一的,因此你可能需要添加一些随机字符作为后缀。
## 部署到 Elastic Beanstalk
进入你的 AWS 控制台并找到 Elastic Beanstalk 菜单选项。这也可以通过 CLI 完成,但本说明将使用控制台进行操作。选择 `Actions -> Create Environment`。

在下一个窗口中,选择 `Worker environment` 并点击 `Select`。

在下一个窗口中,为 `Platform` 选择 `Preconfigured -> Go`。

在 `Application Code` 下,选择 `Upload your Code`。

点击 `Upload` 按钮并选择你刚刚构建的 `dufflebag.zip`。

最后,点击 `Create Environment` 开始创建。
AWS 需要几分钟时间来创建所有资源并启动。创建完成后,Dufflebag 将立即开始运行。无需进行其他操作。
## 移除安全阀
一旦启动并运行,你可以尝试移除安全阀。默认情况下,Dufflebag 只搜索 20 个 EBS 快照。(这样它就不会在你第一次尝试时失控)为了将搜索范围扩大到整个区域,请进入 `populate.go`,删除以下代码行,然后重新构建:
```
//#####################################################################
//#### Safety Valve ####
//#### Remove this line of code below to search all of your region ####
//#####################################################################
snapshots = snapshots_result.Snapshots[0:20]
```
## 扩展
Dufflebag 被设计为 Elastic Beanstalk 应用程序的原因之一是,你可以轻松地自动扩展或缩减程序。默认情况下,它只在一个实例上运行,速度较慢。但如果你想提升性能,可以在 Elastic Beanstalk 中调整自动缩放设置。完整的选项设置超出了本文档的范围,因此我将让你自行探索。但在实践中,我发现简单的 CPU 使用率触发器效果很好。
在上述设置环境时,你可以在 `Configure more options` 按钮(而不是点击 `Create environment`)下找到相关选项,然后点击 `Scaling`。

## 获取战利品
Dufflebag 会将任何有趣的文件复制到你之前创建的 S3 bucket 中。(从技术上讲,Dufflebag 会使用它找到的第一个名称以 "dufflebag" 开头的 S3 bucket。)
你可以直接在 S3 bucket 中逐一查看传入的文件。它们的命名格式为:
`originalfilename_blake3sum_volumeid`
## 检查状态
如果一切顺利,你应该不需要阅读日志。但以防万一,Elastic Beanstalk 允许应用程序在运行时写入日志文件,你可以通过导航到 `Logs` 选项卡来获取这些日志。然后点击 `Request Logs` 和 `Last 100 Lines`。这将为你提供最新的一批 Dufflebag 日志。点击 `Download` 按钮进行阅读。该文件将包含一系列其他系统日志,但 Dufflebag 的部分位于顶部的 "/var/log/web-1.log" 下。
要查看完整的日志历史记录,请选择 `Full Logs` 而不是 `Last 100 Lines`。(请注意,EB 默认情况下会非常频繁地轮换日志)
此外,你可以通过查看环境的 SQS 队列来了解整体进度。Elastic Beanstalk worker 环境使用 SQS 来管理工作流。Dufflebag 队列中的每条消息代表一个要处理的 EBS 卷:

`Messages Available` 列显示尚未处理的卷数量。`Messages in Flight` 列显示当前正在处理的卷数量。
## 调整搜索内容
Dufflebag 被编程为搜索我们认为可能“有趣”的内容。私钥、密码、AWS 密钥等……但如果你真的想搜索特定于你的内容怎么办?比如,也许你在 bank.com 工作,想看看外面有什么引用了 bank.com 的内容。
这样做需要对 Dufflebag 代码进行少量修改,但不会很多。别担心!搜索逻辑位于 `inspector.go` 中。`pilfer()` 函数是一个用于检查文件的 goroutine。那里的代码起初可能看起来有点令人生畏,但这是它正在做的事情。(以及如何轻松修改它)
文件名黑名单:
1. 根据黑名单检查文件名。(`blacklist_exact`)
2. 根据“包含”黑名单检查文件名。(如果文件名包含给定字符串则拒绝该文件)(`blacklist_contains`)
3. 根据前缀黑名单检查文件名。(如果文件名以给定字符串开头则拒绝该文件)(`blacklist_prefix`)
你可以通过更改这三个列表中的内容来轻松修改这里的搜索逻辑。不过我通常建议保留这些黑名单。这些黑名单旨在涵盖许多文件系统中存在的无聊文件,并防止 Dufflebag 需要深入检查 AWS 上的每一个文件。你寻找的敏感数据可能在这些文件中……但可能性不大。
文件名白名单:
1. `IsSensitiveFileName()` 函数根据正则表达式检查文件名,以查找敏感文件名。(例如 /etc/shadow, bash_history 等)
文件内容:
1. 函数 `checkContentsRegex()` 根据一组正则表达式检查文件内容。(文件输入参数是逐行的,因此该函数的输入是文件的一行,而不是整个文件。)因此,要查找与你组织相关的关键词,只需更改 `checkContentsRegex()` 中的正则表达式。
标签:DevSecOps, EBS 快照, Elastic Beanstalk, EVTX分析, EVTX分析, EVTX分析, Force Graph, Go 语言, LLM应用, Secrets Discovery, StruQ, 上游代理, 云计算安全, 代码生成, 凭证抓取, 合规性审计, 密钥泄露检测, 快照枚举, 敏感信息扫描, 日志审计, 渗透测试工具, 足迹分析