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 什么条件下可以实现这种攻击?

-w373

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

-w428

3. 内网潜在的攻击对象有哪些

-w592

0x02 Real-world SSRF

  1. Youtrack – CVE-2019-12852
  2. 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等易受影响的浏览器中浏览电子邮件。
攻击者知道/猜到这一点。
受害者很聪明,不会下载附件。

示例代码如下:
-w511

-w470

0x04 未来的工作

  • 内存崩溃链
  • NAT pinning
  • DOS放大攻击
  • 更好的测试基础设施
  • 在物联网设备上基于Image的CSRF
  • 使用session ticket承载payload攻击内部HTTP服务器
  • 攻击消息队列

0x05 防御手段

  1. 改变缓存的key
    • 比如当前是(hostname,port),可以修改为(hostname,port,ip_addr)
    • 如果你关心大型TLS部署的问题那么可以修改为(hostname,port,addr_type(ip_addr)),这方面与CORS and RFC1918比较相似
  2. 禁用出站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
  3. web app是没有办法禁止出站TLS session resumption的,所以只能:
    • 特别留意一下 webhooks, apple pay
    • 对出站请求设置代理,例如使用smokescreen
    • 避免运行未经身份验证的内部TCP内容,特别是在使用换行分隔符时

0x06 总结

  1. TLS对SSRF攻击是十分有效的
  2. 遵循最新的规格是打破常规的好方法
  3. 我们需要重新考虑TLS session resumption的优点
    PS: 本文是对议题做了一个简单的简述,如果有误还请指正