브라우저 취약점 쉘코드를 작성하여, html의 unescape 부분에 %ue8fc%u00c3%u0000%u8960 이런 형태로 붙여넣었습니다. 그런데 작동이 되지 않았습니다.

원인을 찾아봤는데, bad character라고 하여 \x00 이 들어가면 동작이 되지 않던 것이었습니다.

이는 메타스플로잇에서 공개한 브라우저 취약점 공격 PoC에서도 확인할 수 있습니다.

http://www.exploit-db.com/exploits/23785/

 

 

아래는 메타스플로잇에서 제공하는 어셈블리어 코드로 쉘코드를 생성하는 방법입니다. LoadLibrary기능을 하는 쉘코드이며, generate 로 생성이 가능합니다. bad char 0x00 이 포함되어있어서 브라우저에서 정상동작하지 않습니다. 

https://github.com/rapid7/metasploit-framework/blob/master/external/source/shellcode/windows/x86/src/single/single_loadlibrary.asm

그대로 디버거에 붙여넣은 화면입니다.  

 

아래는 옵션을 주어 0x00을 제거하였습니다. 디폴트로 시카타가 나이라는 인코더가 선택됩니다. (일본어로, "어쩔수가 없지". 이름을 재미있게 지었군요. 

 그대로 디버거에 붙여넣은 화면입니다.  

디코더가 처음 부분에 삽입되어 있어서 한 라인씩 실행하다 보면, 평문으로 복호화가 됩니다. 

# 쉘코드 인코딩 하는 방법

msfencode라는 프로그램이 내장되어 있습니다.

옵션 설명

-e x86/shikata_ga_nai : 인코더 선택

-b '\x00' : Bad Character 제거

-i /root/loadlibrary.bin : 경로명 (쉘코드를 바이너리로 저장해주세요)

-t c : C언어 변수 타입으로 출력

 Windows 7은 기본적으로 DLL이 랜덤한 주소로 매핑되지만, 컴파일 시 고정된 주소를 설정할 수 있습니다. JAVA 1.6버전의 MSVCR71.dll이 그 대표적인 예 인데, 항상 0x7C340000에 매핑됩니다.

EMET 에는 MandatoryASLR이라는 기능이 있는데, 이 옵션을 키면 NON-ASLR DLL을 랜덤한 주소로 매핑시켜 줍니다.

이렇게 주소가 바뀌게 되면, ROP 시 NON-ASLR DLL을 사용할 수 없게 됩니다.

 

 

EMET 4.1에서는 ROP가 주요 함수들을 호출하여 공격하는 것을 막기 위하여 주요 함수들에 후킹을 걸어 감시합니다.

Deep Hooks 라는 기능이 있는데 이것은 좀 더 많은 API를 커버하는 기능입니다.

예를 들어, VirtualProtect를 호출하면 VirualProtect->VirtualProtectEx->NtProtectVirtualMemory 순으로 호출하는데요, Deep Hooks 기능을 키면 NtProtectVirtualMemory를 후킹합니다. 이걸 옵션으로 뺀 이유가, 다른 시큐리티 회사들이 호환성 문제 때문에 클레임을 걸었다는군요.

아래는 비교 표 입니다. Undocumented API를 커버하여 주네요. 

 

Deep Hooks가 기본 값이 아니기 때문에, 공격자들은 VirtualProtect가 아닌 NtProtectVirtualMemory를 호출하여 우회할 수도 있습니다.

또한 Deep Hooks를 키면 Kernelbase도 추가로 후킹을 합니다.

+ Recent posts