IMDSPOOF 是一个网络欺骗工具,用于伪造 AWS IMDS 服务。攻击者在云环境中提升权限或横向移动的一种方式是通过从位于 http://169.254.169.254/latest/meta-data/iam/security-credentials/<user> 的 IMDS 服务 端点获取 AWS 访问密钥。该工具伪造该端点,并将发送至 169.254.169.254 的流量重定向到一个返回虚假数据的本地 Web 服务器。通过在伪造的 IMDS 响应中插入 蜜罐 AWS 令牌,可以用于高度定制的检测。

该工具适用于在 不 主动使用 IMDS(v1 或 v2)的 AWS 实例上工作的蓝队。
从攻击者的角度来看,他们不知道所处 EC2 实例上是否正在使用 IMDS。IMDSPOOF 的目标是欺骗攻入你云环境的攻击者,使其认为自己在与合法的 IMDS 服务交互。
再次强调,如果运行在 EC2 实例上的应用程序确实使用了 IMDS 服务,则该工具一定会引发问题!
要在一个测试环境中试用 IMDSPOOF,创建一个 EC2 实例,并确保安装了 iptables(如果使用 Amazon Linux 则运行 yum install iptables-services)。
IMDS.go(如何编译 Go 代码)curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ec2-admin{
"Code": "Success",
"Message": "The request was successfully processed.",
"LastUpdated": "2023-11-22T03:33:51Z",
"Type": "AWS-HMAC",
"AccessKeyId": "InsertHoneyToken",
"SecretAccessKey": "InsertHoneyToken",
"Token": "HoneyToken",
"Expiration": "2023-11-22T09:33:51Z"
}
iptables -t nat -D OUTPUT -p tcp -d 169.254.169.254 --dport 80 -j DNAT --to-destination 127.0.0.1:54321为了使其有用,你必须更改 IMDS.go 文件顶部的变量,使其看起来更真实。我强烈建议在文件中放入蜜罐令牌。你可以保留 token 变量不变,或将其改为自定义内容。
IMDS.go 顶部的这些变量,以定义访问 http://169.254.169.254/latest/meta-data/iam/security-credentials/ec2-admin 时返回的内容:var accessKey string = "InsertHoneyToken"
var secretAccessKey string = "InsertHoneyToken"
var token string = "IQoJb3Jpz2cXpQRkpVX3Uf////////////xMdLZHNjb<snip>"
Thinkst Canary 的团队提供了一个出色的工具,可以轻松生成 AWS 凭证,并在使用时触发告警。

aws_access_key_id = AKIA....
aws_secret_access_key = uZF0y/l5X....
accessKey 和 secretAccessKey 变量替换为 CanaryTokens 提供的 aws_access_key_id 和 aws_secret_access_key 值。



通过创建一个 systemd 服务并启用该服务,可以轻松实现 IMDSPOOF 的开机自启。
sudo vim /etc/systemd/system/IMDS.service(如果你愿意,可以将其命名为其他更隐蔽的名字,但以下 systemctl 命令期望服务名为 IMDS.service)IMDS.service 文件中:[Unit]
# 如果有需要,可以更改为其他内容
Description=IMDSPOOF
# 在依赖项可用之后启动
After=multi-user.target
[Service]
# 服务类型
Type=simple
# 执行服务程序的命令
ExecStart=/bin/IMDS
# 运行服务的用户
User=root
# 如果服务崩溃则重启
Restart=always
# 重启延迟时间(秒)
RestartSec=10
[Install]
# 在启动时启用该服务
WantedBy=multi-user.target
/bin/ 目录:sudo mv IMDS /bin/sudo systemctl enable IMDSsudo systemctl start IMDSsudo systemctl status IMDS 确保一切正常运行是的!由于 IMDSPOOF 操纵 EC2 实例上的 iptables 的方式,无论流量来自何处都没有关系。这意味着除了在 EC2 实例上通过 curl 工具工作外,如果通过托管在 EC2 实例上的 Web 应用程序发现了 SSRF 漏洞,IMDSPOOF 也同样有效。使用 AlexanderHose 博客中关于 IMDS 渗透测试的脆弱应用,我们可以利用 SSRF 漏洞,它也会从 IMDSPOOF 返回伪造的凭证。

sudo systemctl stop IMDSsudo systemctl disable IMDSiptables -t nat -D OUTPUT -p tcp -d 169.254.169.254 --dport 80 -j DNAT --to-destination 127.0.0.1:54321