Thursday, February 01, 2007

HTTP Response Splitting Attacks Without Proxies

I've had this paper sitting around collecting dust for so long, but I've been keeping it for a reason, me and a friend (troopa) are trying to start a hacker/infosec community focused around Research and Development of ideas and attacks, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than simply a teaching and learning ground for people, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are plenty of those already in existence, but very few places where people come togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r to collaborate on new ideas, and so I present to you Sudo Labs.

I initially posted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full paper on Sudo Labs here: http://sudolabs.com/forum/viewtopic.php?t=3

But now that I've directed a bit of traffic cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re (that really didn't help), I'm posting it here as well:

[EDIT (14/02/07)]: I've been informed, that my introduction was completely wrong and may have mislead people, and so I've replaced it.

HTTP Response Splitting Attacks Without Proxies


By kuza55
of Sudo labs

Contents:

1.0 Introduction
2.0 The Attack
    2.1 Theory
    2.2 Browser Inconsistencies
    2.3 Working Exploits
3.0 Implementation Notes
4.0 Conclusion

1.0 Introduction

At cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 moment, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only know technique (AFAIK - Correct me if I'm wrong) for attacking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser cache to alter cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache for pages ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one vulnerable to HTTP Response Splitting is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 One proposed by Amit Klein on page 19-21 of this paper: http://www.packetstormsecurity.org/papers/general/whitepaper_httpresponse.pdf

It utilises cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that IE operates on only 4 connections to request pages from a single server.

This paper will illustrate something similar.

2.0 The Attack

As many people before me have discovered; if you can force cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser to make a request for a page on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection you control, you can replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page.

The problem has been to force cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser to do just that.

But what if we ask nicely?

2.1 Theory

If in our doctored response we redirect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r page on our site and we send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Keep-Alive: timeout=300" and "Connection: Keep-Alive" headers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser does exactly what we asked it and sends cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request on that connection (except Opera 9, which doesn't want to - Opera 8 does).

The next thing we need to do is to send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser a "Content-Length: 0" header so that it thinks its received everything its going to from its first request and sends cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second request straight away.

We cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser a couple of new lines, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n lots of extraneous spaces and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n a new line as well.

This works much like a NOP sled in Buffer Overflow attack, because this way we can prepare a landing zone for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser which it will just ignore before reading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual response, this gives us greater flexibility in regards to browser inconsistencies and network latency issues.

2.2 Browser Inconsistencies



Sadly not all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browsers react cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same way, and so not everything can be done easily, here's a little chart at what I've been able to produce in various browsers so far:

1 = Second request made on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same connection.
2 = Second Response can be injected into
3 = Headers can be injected into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second response
4 = Content-Length Header is strictly obeyed

+ = yes
~ = Sort of
- = No
x = N/A

-----------------
|Browser|1|2|3|4|
-----------------
|Opera 8|+|+|+|+|
-----------------
|IE 6 |+|+|+|~|
-----------------
|Firefox|+|+|-|x|
-----------------
|Opera 9|-|-|-|x|
-----------------

So essentially I've only really been able to exploit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack's full potential under IE 6 and Opera 8. So getting this to work under Firefox (and possibly Opera 9) is for people with more experience in how browser work with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network.

The issue with Internet Explorer is that it reads things in 1024 byte blocks, and so any Content-Length headers which to not fall on that boundary will be rounded up to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 nearest kilobyte, but that's not much of an issue.

Internet Explorer also has a 2047 byte limitation on query strings, so my original design of using new lines doesn't work because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y get encoded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 query string to 3 times cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir length (6 bytes - %0d%0a - instead of two), and so spaces had to be used as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 white spaces to be ignored.

For some reason I can't seem to get Firefox to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 headers I provide, but you can easily inject into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page, and simply make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser not render cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest by using an unclosed div tag with a display: none style attribute.

Opera 9 (as I mentioned earlier) though, just doesn't want to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same socket, and so I haven't been able to get this attack to work.

2.3 Working Exploits



Now, onto cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interesting part - Working Exploits.

This *works* (To cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extent explained above) in both IE and Firefox:

http://www.dataplace.org/redir.html?url=index.html%0d%0aKeep-Alive: timeout=60%0d%0aConnection: Keep-Alive%0d%0aContent-Type: text/html%0d%0aContent-Length: 0%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        %0d%0aHTTP/1.x 200 OK%0d%0aKeep-Alive: timeout=5%0d%0aConnection: Keep-Alive%0d%0aContent-Type: text/html%0d%0aContent-Length: 55%0d%0a%0d%0a


But it doesn't work on Opera 8, Opera 8 works cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way you would sort of expect a browser to work, in that it begins reading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stream from where it left off, and so we don't need to provide much whitespace:

http://www.dataplace.org/redir.html?url=index.html%0d%0aKeep-Alive: timeout=60%0d%0aConnection: Keep-Alive%0d%0aContent-Type: text/html%0d%0aContent-Length: 0%0d%0a%0d%0a%0d%0aHTTP/1.x 200 OK%0d%0aKeep-Alive: timeout=5%0d%0aConnection: Keep-Alive%0d%0aContent-Type: text/html%0d%0aContent-Length: 55%0d%0a%0d%0a



3.0 Implementation Notes



If anyone wants to use this to use this to perform browser cache poisoning attacks (eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r to hide cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 suspicious URL or something similar) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best way would probably be to check if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL you are poisoning sends an Etag header and if so replicate that header so that when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser sends a If-Modified-Since header, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 web server will honestly say it hasn't, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resource you want to poison is a dynamic resource, you'll have to rely on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Cache-Control and Date headers alone (though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se should be used along with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Etag header).


4.0 Conclusion



So as we can see, we don't need a proxy to implement interesting protocol oriented HTTP Response Splitting attacks, and hopefully someone with a deeper understanding of browsers than me can figure out why cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above attacks aren't working in Firefox and Opera 9.

2 comments:

Anonymous said...

Hi!

Have you found why it is not working in firefox?

kuza55 said...

No, sorry, I never worked out why it wasn't working for Firefox. Maybe you'll have some more luck than I did.