在正常情况下,Slack的集成功能允许用户提交一个合法的外部URL,然后服务器会访问该URL。例如:
POST /services/4814366410 HTTP/1.1
Host: agarri.slack.com
...
url=http://example.com/resource~
在这种情况下,服务器会访问http://example.com/resource,这是一个正常的请求行为。
如果攻击者利用了SSRF漏洞,他们可以提交一个恶意的URL,例如使用IPv6格式的地址[::]来绕过黑名单,并访问内部服务:
POST /services/4814366410 HTTP/1.1
Host: agarri.slack.com
...
url=http://[::]:25/
在这个例子中,Slack的服务器会尝试访问http://[::]:25/,而这个地址实际上指向了攻击者意图访问的内部网络的端口25(通常是SMTP服务)。
攻击者首先发现了Slack集成功能中可以提交URL的地方,并且意识到这些URL会由服务器直接访问。同时,攻击者注意到黑名单检查可以通过使用IPv6的特定表示法[::]绕过。
攻击者构造了一个恶意的HTTP请求,这个请求中包含了一个绕过黑名单的URL。具体来说,他们使用了[::]表示法来指向内部网络中的服务。例如:
POST /services/4814366410 HTTP/1.1
Host: agarri.slack.com
...
url=http://[::]:25/
这个URL中的[::]表示本地的IPv6地址,而端口25通常用于SMTP服务,攻击者希望通过这个请求访问内部网络的SMTP服务器。
攻击者发送这个构造好的HTTP请求,Slack服务器会尝试访问攻击者指定的内部服务:
curl -X POST https://agarri.slack.com/services/4814366410 \
-H "Content-Type: application/x-www-form-urlencoded" \
--data "url=http://[::]:25/"
服务器访问该URL后会返回响应,攻击者可以通过这个响应判断内部服务的存在。例如,如果SMTP服务在运行,可能会返回类似于220 squid3.tinyspeck.com ESMTP Postfix的响应。攻击者可以进一步分析这个响应以确定内部网络中的服务状态和版本信息。
一旦确认了内部服务的存在,攻击者可能会尝试进一步利用其他已知漏洞进行更深入的攻击,比如尝试通过SMTP服务发送恶意邮件,或者通过其他服务获取更高权限的访问。
这里Slack使用了一个黑名单机制来阻止访问内部网络(如localhost、10.0.0.0/8、192.168.0.0/24等),但这个黑名单可以通过使用“[::]”作为主机名来绕过。这个攻击手法只能影响那些绑定了所有接口并支持IPv6的服务。
如果你是一个长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,精细化运营,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款
https://hackerone.com/reports/61312