When TLS Hacks You -- BlackHat2020
When TLS Hacks You
0x00 简介
这是在blackhat2020上进行展示的一个关于SSRF+TLS rebinding的talk。具体来说就是利用TLS中的session id来承载payload对内网的应用进行攻击,它达到的目标跟之前 @orangetw 讲述的 SNI injection 方法是一样的,但是之前的方法是依赖于bug,而这种方法则依赖于TLS本身的特性。
0x01 什么条件下可以实现这种攻击?
1. 首先是要有SSRF的常见攻击点
- OIDC discovery
- Webpush
- Webmention
- Apple Pay Web
- In browsers, just phishing people (Then we call it CSRF)
- Wificaptive portals
- SSDP
- SVG conversion
- URL-based XXE
- Scraping
- Webhooks
- PDF renderers with images enabled
2.看什么东西会缓存TLS sessions
3. 内网潜在的攻击对象有哪些
0x02 Real-world SSRF
- Youtrack – CVE-2019-12852
- Nextcloud
Federated sharing:
@someone@example.com
@someone@example.com:11211
Use TLS rebinding, write to memcached!
Fix: no great options
Still added a request timeout and gave me a bounty
0x03 Demo: Phishing->CSRF->RCE
这个Demo基于以下假设:
受害者是一个使用django.core.cache的项目的开发者,并且使用了memcached。
受害者在Chrome等易受影响的浏览器中浏览电子邮件。
攻击者知道/猜到这一点。
受害者很聪明,不会下载附件。
示例代码如下:
0x04 未来的工作
- 内存崩溃链
- NAT pinning
- DOS放大攻击
- 更好的测试基础设施
- 在物联网设备上基于Image的CSRF
- 使用session ticket承载payload攻击内部HTTP服务器
- 攻击消息队列
0x05 防御手段
- 改变缓存的key
- 比如当前是(hostname,port),可以修改为(hostname,port,ip_addr)
- 如果你关心大型TLS部署的问题那么可以修改为(hostname,port,addr_type(ip_addr)),这方面与CORS and RFC1918比较相似
- 禁用出站TLS session resumption
- libcurl: CURLOPT_SSL_SESSIONID_CACHE=false
- firefox: security.ssl.disable_session_identifiers=true
- Tor browser: disabled by default
- Java, Nodejs, Chrome, others: no option
- web app是没有办法禁止出站TLS session resumption的,所以只能:
- 特别留意一下 webhooks, apple pay
- 对出站请求设置代理,例如使用smokescreen
- 避免运行未经身份验证的内部TCP内容,特别是在使用换行分隔符时
0x06 总结
- TLS对SSRF攻击是十分有效的
- 遵循最新的规格是打破常规的好方法
- 我们需要重新考虑TLS session resumption的优点
PS: 本文是对议题做了一个简单的简述,如果有误还请指正