Archive for Dev. (junyup2)

์ง€์‹์„ ์ฑ„์›Œ๊ฐ€๋Š” ใ€Ž๊ฐœ๋ฐœ์ž/ํ™”์ดํŠธํ•ด์ปคใ€๋ฅผ ๋ชฉํ‘œ๋กœ ์ •๋ฆฌํ•˜๋Š” ๋ธ”๋กœ๊ทธ

Wargame & CTF/SegFault

[SegFault] (Authentication Bypass) - Admin is Mine

Gearvirus(junyup2) 2023. 12. 6. 04:00

[SegFault] Authentication Bypass (Admin)

Admin is Mine.

admin ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•˜์ž!

๋ฌธ์ œ ํŒŒ์•…

  • ์œ„์˜ ํŽ˜์ด์ง€์— ์ ‘์†ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค.
  • ์•Œ๊ณ  ์žˆ๋Š” ๊ณ„์ • :  [ID/PW] : doldol / dol1234

  • Burp Suite์„ ์ด์šฉํ•˜์—ฌ ์‚ฌ์ดํŠธ ์ ‘์† ๊ณผ์ •์˜ ์ƒํƒœ์ฝ”๋“œ(Status code) ํ™•์ธ
    • 200 OK : ์ •์ƒ์ ์ธ ์‘๋‹ต
  • ๋กœ๊ทธ์ธ ๊ณผ์ •์˜ ๊ตฌ์กฐ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด, ๋จผ์ € ์•Œ๊ณ  ์žˆ๋Š” ์ •๋ณด๋กœ ๋กœ๊ทธ์ธ ํ•ด๋ณธ๋‹ค.

  • ์ œ๊ณต๋œ ID/PW๋ฅผ ์ž…๋ ฅํ–ˆ์Œ์—๋„ ํ•ด๋‹น ์ฐฝ์—์„œ ๋„˜์–ด๊ฐ€์ง€ ์•Š์Œ์„ ํ™•์ธ, ๋กœ๊ทธ์ธ์ด ์ง„ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค?!
  • ๋กœ๊ทธ์ธ ๊ณผ์ •์˜ ํžˆ์Šคํ† ๋ฆฌ(HTTP history) ํ™•์ธ ํ•ด๋ณด์ž !

  • ID์™€ PW๋ฅผ ์ž…๋ ฅํ–ˆ์Œ์—๋„ ํŒŒ๋ผ๋ฏธํ„ฐ(Params)๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์š”์ฒญ(Request)๊ณผ ์‘๋‹ต(Response)์„ ์‚ดํŽด๋ณด์ž !

<script>location.href='login.php';</script>
  • ๊ฐ•์ œ๋กœ ๋ฆฌ๋””๋ ‰์…˜ ์‹œํ‚ค๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
<script src="js/login.js">
  • login.js์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ ,, ๋‚ด๋ถ€๋ฅผ ๋“ค์—ฌ๋‹ค ๋ณธ๋‹ค.

const userId = loginForm.querySelector("#inputUserid").value;
const userPw = loginForm.querySelector("#inputPassword").value;

const url = `/4/loginProc.php?userId=${userId}&userPw=${userPw}`;
  • ์œ„์˜ login.js ๋ฅผ ํ†ตํ•ด loginProc์œผ๋กœ์˜ parameter ์ „์†ก ๋ฐฉ์‹์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ’€์ด ๊ณผ์ • (ํ•ด๊ฒฐ ๋ฐฉ์•ˆ)

1. intercopt ํ›„, ๋ธŒ๋ผ์šฐ์ € ์ฐฝ ๋ฐ ํžˆ์Šคํ† ๋ฆฌ(HTTP history) ํ™•์ธํ•ด๋ณธ๋‹ค.

2. ๊ฒฝ๋กœ๋ฅผ /4/loginProc.php๋กœ ์„ค์ •ํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋‹ด์•„์„œ Forward ํ•ด์ค€๋‹ค.

1. (์ œ๊ณต๋œ) ๋กœ๊ทธ์ธ ์‹œ๋„
2. ์ธํ„ฐ์…‰ํŠธ(Intercept) : /4/
3. GET /4/loginProc.php?userId=doldol&userPw=dol1234 ์œผ๋กœ ๋ณ€๊ฒฝ
4. Forward -> GET /4/index.php
5. GET /4/loginProc.php?userId=admin&userPw=dol1234 ์œผ๋กœ ๋ณ€๊ฒฝ
6.  Forward -> ์ƒˆ๋กœ๊ณ ์นจ

3. ๊ฐ•์ œ๋กœ ๋กœ๊ทธ์ธ ์‹œ์ผœ์ฃผ๋ฉด, ๋กœ๊ทธ์ธ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์™œ? ๊ฐ•์ œ๋กœ ๋กœ๊ทธ์ธ ์‹œ์ผœ์ค€๋‹ค๋ฉด ๋กœ๊ทธ์ธ์ด ๋˜๋Š” ๊ฒƒ์ผ๊นŒ?

์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์ด๋ฏธ ์ •๋‹ต(๋กœ๊ทธ์ธ์ด ๋˜๊ณ  ์žˆ์—ˆ๋‹ค)์„ ๋ฟŒ๋ ค์ฃผ๊ณ  ์žˆ์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ!
ํ† ํฐ์ด ์—†๋Š” ๊ฒฝ์šฐ js์— ์˜ํ•ด์„œ ๋ฆฌ๋””๋ ‰์…˜ ์‹œํ‚ค๊ณ  ์žˆ์—ˆ์„ ๋ฟ์ด๋‹ค.
๊ทธ๋ž˜์„œ ํ† ํฐ ๋ฆฌ๋””๋ ‰์…˜์„ ๊ฐ•์ œ๋กœ ์‹œ์ผœ์ฃผ๋ฉด ๋กœ๊ทธ์ธ์ด ๋˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์ด๋‹ค.

4. ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด Flag๊ฐ€ ๋‚˜์˜ค๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


ํ’€์ด ๋ฐฉ์‹์˜ ์˜ค๋ฅ˜

์‚ฌ์‹ค ํ•ด๋‹น ํ’€์ด ๋ฐฉ๋ฒ•์€ ์ž˜๋ชป๋˜์—ˆ๋‹ค.

์œ„์˜ ํ’€์ด๋กœ ํ’€์–ด์กŒ๊ธฐ์— ๋„˜์–ด๊ฐ„ ๋’ค์— ๊นจ๋‹ฌ์•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐ˜์„ฑํ•˜๋ฉฐ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค.

์ž˜๋ชป๋œ ํ’€์ด (์™œ ๊ฐ€๋Šฅํ–ˆ๋Š”๊ฐ€?)

ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ์œ„์˜ ํ’€์ด ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€๋ฆฐ ์ด์œ ๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.

๊ธฐ์กด์— ์ฃผ์–ด์ง„ id/pw๋กœ ๋กœ๊ทธ์ธํ•˜์—ฌ ์ธ์ฆ ์„ฑ๊ณต์‹œ์— ์„ธ์…˜์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’์ด ๋‹ด๊ธด๋‹ค.
$_SESSION['loginUser'] = 'doldol';
$_SESSION['loginStatus'] = 'ok';

์—ฌ๊ธฐ์„œ ์›๋ž˜๋ผ๋ฉด ๋กœ๊ทธ์ธ ์ธ์ฆ์— ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.
$_SESSION['loginStatus'] = 'ok'; ์˜ ๊ฐ’์„
$_SESSION['loginStatus'] = 'fail'; ๊ณผ ๊ฐ™์ด fail๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋ณธ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ๋กœ๊ทธ์ธ ์ธ์ฆ ์‹คํŒจ์‹œ ์•ˆ ๋„ฃ์–ด ์ค€ ๊ฒƒ์ด๋‹ค.(์ž˜ ๋ชป ๋œ๊ฒƒ)
๊ทธ๋ž˜์„œ admin์œผ๋กœ ์žฌ์š”์ฒญ์‹œ ์„ธ์…˜์˜ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.
$_SESSION['loginUser'] = 'admin';
$_SESSION['loginStatus'] = 'ok';
์œ„์™€ ๊ฐ™์ด ๋‚ ์•„๊ฐ„ ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์— admin์œผ๋กœ ๋กœ๊ทธ์ธ์ด ๋œ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

์‚ฌ์‹ค ๋ฌธ์ œ์˜ ๋˜ ๋‹ค๋ฅธ ์ทจ์•ฝ์ ์— ์˜ํ•ด ๋ฌธ์ œ๊ฐ€ ํ’€๋ฆฐ ๊ฒƒ์ด์—ˆ๊ณ , ํ•ด๋‹น ๋ฌธ์ œ์˜ ์˜๋„์™€๋Š” ๋‹ฌ๋ž๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ฌธ์ œ์˜ ์›๋ž˜ ์˜๋„ (์˜ฌ๋ฐ”๋ฅธ ํ’€์ด๋ฒ•)

๋ณธ ๋ฌธ์ œ์˜ ์˜ฌ๋ฐ”๋ฅธ ํ’€์ด๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 2๊ฐ€์ง€ ์ด๋‹ค. 

1. fail ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์žˆ๋Š” ์‘๋‹ต์„ ๋ณ€์กฐํ•˜์—ฌ ok๋กœ ๋ฐ”๊พธ์–ด ์ง„ํ–‰ํ•œ๋‹ค.
2. ์‘๋‹ต์˜ javascript๋ฅผ ์‚ญ์ œํ•˜์—ฌ ๋ฆฌ๋””๋ ‰์…˜์„ ์ €์ง€ํ•œ๋‹ค.

(๊ฒฐ๊ตญ ์‘๋‹ต์„ ๋ณ€์กฐํ•œ๋‹ค๋Š” ๊ฒƒ์œผ๋กœ ๋ณด๋ฉด ๊ฐ™์€ ํ’€์ด๋ฒ•์ด๋‹ค.)

์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ณ ์ฐฐ

๋ณธ ๋ฌธ์ œ์˜ ์ทจ์•ฝ์ ์€ ์ธ์ฆ ์ทจ์•ฝ์ ์œผ๋กœ์„œ ์‘๋‹ต ๋ณ€์กฐ๋ฅผ ํ†ตํ•˜์—ฌ ์ธ์ฆ์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์— ์žˆ๋‹ค.
์‘๋‹ต ๋ณ€์กฐ (Response Mod) ๋ฅผ ํ†ตํ•˜์—ฌ ๋กœ๊ทธ์ธ์— ์‹คํŒจํ•˜์—ฌ $_SESSION['loginStatus']  = fail ์ด๋ผ๊ณ  ๋‚˜์˜ค๊ณ  ์žˆ๋Š” ์‘๋‹ต์„ $_SESSION['loginStatus']  = ok๋กœ ๋ณ€์กฐํ•˜๊ฑฐ๋‚˜, ๊ฐ•์ œ๋กœ ํŽ˜์ด์ง€๋ฅผ ๋ฆฌ๋””๋ ‰์…˜ ์‹œํ‚ค๊ณ ์žˆ๋Š” javascript๋ฅผ ์‚ญ์ œํ•˜๋ฏ€๋กœ์จ ์ง„ํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์ƒ๊ฐํ•ด๋ณผ ์ ์€ ํ•ด๋‹น ์ทจ์•ฝ์ ์˜ ๊ฒฝ์šฐ ์ด๋Ÿฐ ๊ฒƒ๋„ ์žˆ๋‹ค ๋ผ๊ณ  ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์ธ์œ„์ ์œผ๋กœ ๋งŒ๋“  ์ทจ์•ฝ์ ์œผ๋กœ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž์ฒด๋ฅผ ์ž˜๋ชปํ•œ ๊ฒƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋‚˜์˜ค์ง€ ์•Š๋Š” ์ทจ์•ฝ์ ์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

login ์ฒ˜๋ฆฌ ๊ตฌํ˜„
์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ : id/pw -> ์ธ์ฆ ์„ฑ๊ณต -> session=admin

ํ•ด๋‹น ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ
์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ผ๋‹จ ์„ธ์…˜์— ๋„ฃ์–ด๋‘”๋‹ค. (session=admin) -> id/pw ๊ฒ€์ฆ

์œ„์™€ ๊ฐ™์ด ์ด๋ฏธ ์„ธ์…˜์— ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•˜๋Š” ์ทจ์•ฝ์ ์œผ๋กœ์„œ ์›นํŽ˜์ด์ง€์—์„œ๋Š” ๋งŽ์ด ๋‚˜์˜ค์ง€ ์•Š๋Š” ์ทจ์•ฝ์ ์ด๋ผ๊ณ  ํ•œ๋‹ค.(ํ•˜์ง€๋งŒ ๋ชจ๋ฐ”์ผ ์•ฑ์—์„œ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์ด ๋‚˜์˜ค๋Š” ์ทจ์•ฝ์ ์ด๋ผ๊ณ  ํ•˜๋‹ˆ ์ƒ๊ฐํ•ด๋ณผ๋งŒ ํ•˜๋‹ค.)

์งˆ๋ฌธ ํ™˜์˜, ์ˆ˜์ • ๋ฐ ๋ณด์™„์— ๋Œ€ํ•œ ์ง€์  ํ™˜์˜