취약점분석보고서 [Elecard AVC_HD/MPEG Player 5.7 Buffer Overflow] 2012-08-02 RedAlert Team 봉용균
목 차 1. 개요... 1 1.1. 배경... 1 1.2. 요약... 1 1.3. 정보... 1 1.4. 대상시스템... 1 2. 공격... 2 2.1. 시나리오... 2 2.2. 대상프로그램... 2 2.3. Exploit Code... 3 2.4. 공격테스트... 4 3. 분석... 8 3.1. 디버깅도구를이용한분석... 8 3.2. Payload 삽입확인... 10 3.3. 대안... 12 4. 결론... 13 5. 대응방안... 13 6. 참고자료... 13
1. 개요 1.1. 배경 미디어재생프로그램인 MpegPlayer 는 Buffer Overflow 취약점입니다. Payload 가삽입된위장파일을실행시킬때악의적인코드가동작하는비교적간단한방식의 Exploit 입니다. 기존에는계산기를실행하는 Shell Code 였지만, 저는 Reverse Shell 이동작하는 Shell Code 로바꾸어보려고시도했고, 결과는실패였습니다. 실패한이유를자세히살펴보면서, Buffer Overflow 취약점에대한상세한이해와, 대응방법을고민해보겠습니다. 1.2. 요약 MpegPlayer 는할당크기이상의데이터를삽입해서, 악의적인코드의동작을유도합니다. 이때오류가발생하면서, Windows 의오류처리메커니즘인 SE Handler 가동작하고, 오류처리를시도합니다. 그렇지만, Buffer Overflow 기법을이용해오류처리메커니즘을조작할수있기때문에 Shell Code 를실행할수있습니다. 해당프로그램은일정크기이상의데이터는일부만삽입되고, 일부는제거됩니다. 1.3. 정보 취약점이름 Elecard AVC_HD/MPEG Player 5.7 Buffer Overflow 최초발표일 2011 년 2 월 27 일 문서작성일 2012 년 8 월 02 일 Version 5.7 상태 업데이트 Vender Elecard Author sickness 공격범위 Local 공격유형 Buffer overflow 표 1. 취약점정보 1.4. 대상시스템 해당문서는 Windows XP SP3 를대상으로테스트를수행했습니다. Microsoft Windows XP SP3 표 2. 대상시스템 1
2. 공격 2.1. 시나리오 1 Exploit Code 를동작시켜서, Payload 가삽입된 Play List 파일을생성합니다. 2 MpegPlayer 를실행시키고, 생성된 Play List 파일을불러옵니다. 만일운영체제에 DEP 기능이동작한다면, 해당프로그램을 DEP 대상목록에서제외시킵니다. 3 공격성공여부를확인하고, Shell Code 를 Reverse Shell Code 로변환하기위해 Metasploit 을이용해, Shell Code 를생성합니다. 4 생성된 Shell Code 를 Exploit Code 에삽입한후동작시켜서, Play List 파일을생성합니다. 5 마찬가지로 MpegPlayer 를실행시키고, Play List 파일을불러옵니다. 하지만, 공격은반드시실패합니다. 6 실패한이유를분석해보고, 성공시킬수있는방법을모색합니다. 2.2. 대상프로그램 1 MpegPlayer [ 그림 1] MpegPlayer 2
2.3. Exploit Code 1 SE Handler 를이용하고, 계산기를동작시키는 Shell Code 가삽입된, Exploit Code 입니다. [ 그림 2] Exploit Code JUNK 값이후 SE Handler 를 Overwrite 할값을삽입합니다. Shell Code 부분으로현재는계산기를실행하는 Code 입니다. Shell Code 실행후프로그램의흐름을원활하게하기위해 nop 를다량삽입합니다. Payload 를구성합니다. 각변수의데이터가 Stack 에순서대로삽입될것입니다. 구성된 Payload 가삽입된 Play List 파일을생성합니다. 3
2.4. 공격테스트 1 Exploit Code 를실행시키면, Payload 가삽입된, Play List 파일이생성됩니다. [ 그림 3] Simple Web Server 정보 2 생성된 Play List 파일을피해자시스템의 MpegPlayer 로불러옵니다. [ 그림 4] Payload 가삽입된 Play List 파일불러오기 4
3 Play List 파일을불러왔는데, Shell Code 가실행되지않는다면, Windows DEP 기능을확인해보고, 해당프로그램을제외시켜야합니다. [ 그림 5] 공격진행과정과확인 4 결과적으로 Shell Code 가실행되면서, 계산기가동작합니다. [ 그림 6] Shell Code 실행확인 5
5 기존의 Shell Code 대신 Reverse Shell Code 로변환하기위해, Shell Code 를 생성합니다. [ 그림 7] Reverse Shell Code 생성 Metasploit 의 Payload 제작도구를이용합니다. 생성할 Shell Code 의종류와 Shell Code 에따른 옵션값을설정하고, Metasploit 의 Encoding 도구를이용해 Encoding 합니다. 생성된 Shell Code 의간략한정보를볼수있습니다. 주목할부분은 Size 입니다. 생성된 Shell Code 입니다. 이부분만복사해서, 사용합니다. 6 Reverse Shell 연결에대기하기위해 ReverSE Handler 모듈을동작시킵니다. [ 그림 8] Reverse Shell Code 생성 ReverSE Handler 모듈을불러오고, Payload 정보및연결될주소를지정합니다. 연결될주소는공격자시스템의주소이며, 연결될 Port 는기본값 4444 입니다. 피해자시스템이 Reverse Shell 연결을위주소와 Port 로시도할경우공격자시스템은 Meterpreter Shell 을 획득하게됩니다. 6
7 피해자시스템에서 Payload 가변환된 Play List 파일을불러옵니다. 기존의 Exploit Code 에서바뀐부분은 Shell Code 부분외에없습니다. 나머지부분은 이전과동일하기때문에, 성공할것으로예상됩니다. [ 그림 9] Reverse Shell Code 생성 8 결과는실패입니다. 실패이유를분석해보겠습니다. 7
3. 분석 3.1. 디버깅도구를이용한분석 1 SE Handler 부분에삽입된 POP/POP/RET 구문에 Break Point 를설정해, Stack 에삽입된 Payload 를확인합니다. [ 그림 10] shell code 실행직전 POP/POP/RET 주소로이동한후 Break Point 를설정합니다. Break Point 가제대로설정되었는지, 확인합니다. 2 POP/POP/RET 가실행되기직전실행흐름이일시정지했습니다. 여기서부터한 단계씩확인합니다. [ 그림 11] SE Handler 실행직전 8
3 SE Handler 부분이실행되고, next SE Handler 의 \xeb\x06 부분으로실행순서가이동됩니다. 이 Code 는 6Byte 를이동해서, 0x0013C9C4 위치의 Code 가실행되도록합니다. [ 그림 12] next SE Handler 실행직전 next SE Handler 의 \xeb\x06 Code 입니다. +6Byte 위치인 0x0013C9C4 로이동됩니다. next SE Handler 가실행되면서, 이동되는위치로, nop 값이위치합니다. 프로그램흐름은연속된 nop 값을실행하면서이동될것입니다. 4 연속된 nop 값의흐름을따라가다보면, Shell Code 의시작부분에도달합니다. Shell Code 를 Reverse Shell 로변환해서, 확인해봐도마찬가지의순서로 Shell Code 시작부분에도달합니다. 그러나기존의 Shell Code 는실행이되고, Reverse Shell Code 는실행이안됩니다. [ 그림 13] Shell Code 시작부분 9
3.2. Payload 삽입확인 1 Reverse Shell Code 가실패하는이유를알기위해 Payload 가삽입된 Stack 을확인했습니다. Shell Code 부분이끝까지삽입되지않고중간에누락된것을확인할수있습니다. 즉, Shell Code 가일정크기만큼만삽입되었습니다. 이후 rest 변수의 nop 값일부가삽입됩니다. rest 변수의나머지부분중일부는 Buffer 이후에삽입됩니다. Shell Code 가일부만삽입되고, rest 변수의 nop 값이 위치합니다. [ 그림 14] Reverse Shell Payload 의 Stack 구조 Payload 에서 Shell Code 이후에실행흐름을원활히하기위해삽입했던 nop 값입니다. Payload 의시작부분입니다. 순서대로 JUNK + next SE Handler + SE Handler + nops 입니다. 계산기실행 Shell Code 전체가삽입되었고, 이후 rest 변수의 nops 가삽입된다. 10
2 기존의계산기실행 Shell Code 는어떻게삽입되어있을지확인합니다. Shell Code 전체가누락없이삽입되어있는것을확인할수있고, Payload 전체가같은구조로계속해서반복되어삽입되어있습니다. [ 그림 15] Calc Shell Code Payload 의 Stack 구조 계산기의 Shell code 는누락없이전체가삽입되었습니다. 이후 rest 변수의 nop 값이누락되고, Payload 의처음부분부터다시삽입되어있습니다. 계산기실행 Shell Code 입니다. 11
3.3. 대안 1 기존의 Stack 구조와예상한 Stack 구조입니다. 왼쪽은 Shell Code 이후에 rest 변수의 nop 값이삽입되다가, 이후데이터가 Buffer 위쪽으로쌓이게됩니다. 이후 next SE Handler 로 Shell Code 에접근합니다. 하지만 Shell Code 의길이제한이있기때문에다른위치에삽입해야합니다. 오른쪽처럼 rest 의 nop 값이어느위치부터 Buffer 위쪽으로쌓이는지확인하고그부분부터 Shell Code 를삽입한단다음 next SE Handler 를이용해접근하게된다면, Shell Code 의크기가조금더커도문제없이삽입될수있을것입니다. [ 그림 16] 기존 Stack 구조와대안예시 12
4. 결론 해당프로그램은 Buffer Overflow 취약점이있었고, 이에대한 Exploit 이가능했습니다. 하지만 Shell Code 의길이에따라 Exploit 이안될수있기때문에, 이를가능하게하기위한분석을시도했습니다. 결과적으로조금더큰사이즈의 Shell Code 도실행이가능할것이라고확인됩니다. 또한 Omelet Egg Hunting 기법을이용하는방법도가능할수있습니다. 5. 대응방안 메모리보호기법이추가된다면, 우회가가능할지라도, Payload 의길이가상당히길어질수있기때문에현상태에서메모리보호기법만추가되도, 공격난이도가어려워집니다. 하지만근본적인보호를위해서는취약점자체를업데이트해야합니다. Buffer Overflow 취약점은삽입될데이터에대한검증절차만거치더라도간단히보호가가능합니다. 6. 참고자료 본취약점본문 http://www.exploit-db.com/exploits/16253/ 13