cve-2016-0189 exploit 시도..

2020. 5. 6. 03:591-DAY 분석

오늘은 처음으로 1-day 취약점을 분석해보는 시간을 가졌다. 오늘 풀어야 할 원데이 분석은 cve-2016-0189인데

깃 허브의 https://github.com/theori-io/cve-2016-0189/blob/master/README.md로 들어가면 theori에서 활동하는분이 

찾으신 코드이다.  이 취약점을 가장 먼저 분석해보기로 한것은 cve exploit , 1-day exploit 등등 여러가지 키워드를 쳐서

가장 설명이 잘 되어있는 블로그나 티스토리를 참고하여 "처음 시작할때 확실하게 배우자" 라는 마인드였다. 

 

결론적으로는 실패했다... 원인이 뭔지 모르겠다. 나중에 지식이 더욱 쌓여간다면 그때 다시 도전해야겠다.

왕초보인만큼 여태까지 내가 이해한 내용들을 차근차근 기록해보도록 하겠다.

 

cve-2016-0189는 internet explore 9, 10, 11에서만 일어나는 취약점이다 만약 사용자의 IE가 8이라면 

exploit을 하더라도 사용못한다는 뜻이다. 또한 깃허브에 나와있는 정보로는 tested on windows 10 IE11

즉 윈도우 10 환경, IE 11을 사용하여 테스트를 했다고 한다. 

 

그리고 깃허브를 사용하는데도 아직 초보자라 내가 잘 모르는것일수도 있지만 자꾸 코드를 다운받으니 

윈도우에서 파일을 다운 못받게하고 아나콘다를 설치하여 다운받아도 중요한 exploit파일안의 내용이

보이지 않았다. 그래서 윈도우 디펜더를 다 꺼주고 바이러스 접근도 다 꺼주며 window search도 꺼주니깐

파일을 다운받아도 삭제가 안되었다. 아직 다른 원데이 취약점은 안해봤지만 그때도 다운로드가 안된다면

디펜더, 바이러스 등등.. 다 꺼주고 다운을 받아야 할것같다. 

 

내가 사용한 버전은 IE 11이다.

CVE-2016-0189은 2가지의 문제가 발생한 부분의 틈을 파고드는데 첫번째는  AccessArray이다.

이 함수는 도중에 배열에 대한 보안장치가 존재하지 않아서 취약점이 발생하는 부분이다. 

취약점이 있을때는 오류가 발생하여도 SafeArrayLock이 안되었지만 지금은 업데이트를 하여서 

SafeArrayLock이 추가되었다. 이 함수는 접근 과정에서 수정되지 않도록 안전하게 잠궈주는 함수이다.

 

SafeArrayLock이 없는 AccessArray는 cDims, cbElements에서 변수 선언 구간이기 때문에 공격자가 임의로

배열하는 도중에 배열을 수정할 수 있게되는 것이다. 만약 AccessArray 함수가 호출된 후

할당 된 버퍼가 16*2*2001 = 64032byte 이면 문제가 되지 않지만 버퍼의 크기가 더 작은 경우에 

오프셋은 범위를 벗어나게 된다. 배열 크기를 조정 한 후 사용 가능한 메모리를 익스플로잇 문자열과

겹친다면 vbscript 문자열과 변형을 만들어 범위를 벗어난 읽기/ 쓰기의 기본 형식을 얻을 수 있다. 

이 버그를 반복적으로 트리거하여 객체의 주소를 가져오며 주소에서 메모리를 읽고 주소에서 

메모리를 쓸 수가 있다. 즉 버퍼 크기가 조정되어 작은 크기로 바뀐다면 별도의 검증 로직이 없었기 때문에 OOB가 발생한다. 공격자는 해당 배열에 값을 쓰고 하고, Free를 통해 메모리에 조금씩 값을 쓸 수 있다.

이것을 반복해서 일정 영역의 메모리에 조금씩 값을 쓸 수 있다는 말이다.

 

두번째로 IsUnsafeAllowed 이다. 인터넷 익스플로러는 기본적으로 시스템에 유해한 스크립트는 실행하지 못하게 하는데

아래의 코드를 보면 알 수 있다. 이 코드는 개발자가 IsUnSafeAllow가 호출되면 내부에서 Unsafe로 되게하려고 했지만

무조건 1을 반환하는 더미 함수가 존재하기 때문에 함수가 if문에서 분기되지 않고 아래로 내려가게 되어있다. 

분기문에서 절대 빠지지 않기 때문에 이것을 호출해주면 safemode를 해제할 수 있다. 

즉 ColeScript를 호출하여 SafetyOption이 overwrite만 해준다면 손쉽게 god mode를 얻을 수 있는것이다.

 

두가지를 정리하면 VBScript 코드로 20000 사이즈의 배열을 선언한 뒤 해당 배열 사이즈를 1로 변경 후 

다시 원래의 값을 불러온다면 메모리의 충돌을 일으키는 것이다.

 

 

 

github 에서 cve-2016-0189를 commit하여 다운받은 파일을 열어서 나온 코드이다.

코드에  ' Execute cmd
            Set Object = CreateObject("Shell.Application")
            Object.ShellExecute "cmd"
        End Function

이부분은 cmd로 바꿔주어서 crtl + s로 저장후 인터넷 익스플로러 11로 실행해보면 원래는 cmd 창이 떠야하는것으로

알고있는데.....

이렇게밖에 안뜬다... cmd에 calc.exe나 notepad.exe를 넣어도 다른사람들은 실행이 되는데 

무엇인가 내가 빼먹은것이 있는지 창이 뜨지않고있는 모습이다.

 

후에 이 문제가 풀리게 된다면 다시 글을 올리도록 하겠다.

 

처음 분석해본 1-day였는데 exploit에 실패해서 너무 아쉽다.....

'1-DAY 분석' 카테고리의 다른 글

CVE-2017-15048 Buffer-Overflow  (0) 2020.05.18
Exploit-db를 이용한 cve-2016-1960,cve-2017-5375 분석  (0) 2020.05.06