티스토리 뷰

반응형

[Malware analysis] CVE-2017-8291, 고스트스크립트 취약점 ① 


파일

> (첨부2)20-0206_법인_운영상황_평가표_서식(법인작성용).hwp


[Malware analysis] CVE-2017-8291, 고스트스크립트 취약점 ②


1. 취약점 발생 원인

CVE-2017-8291 취약점은 고스트스크립트 인터프리터가 .eqproc 함수에서 매개변수 타입 유효성을 검증하지 않아 피연산자 스택의 메모리 변조를 허용해 발생한다. 즉, 포스트스크립트를 이용하여 스택을 변조하여 공격 코드를 실행할 수 있다. 취약점은 gsdll32.dll에서 발생한다고 한다.


1.2 취약점 분석 방법#1 (PostScript)

https://jeongzzang.com/129

https://jeongzzang.com/142


○ 취약점 분석 방법#1 와 같은 방법으로 분석 시 쉘코드만 삽입해서 진행하기 때문에 진행 시 accession violation 오류가 발생한 걸 알 수 있다.


1.2 취약점 분석 방법#2 (gsdll32.dll)

정보 검색 시 취약점 발생을 확인하기 위해서는 고스트스크립트 기능이 구현된 “gsdll32.dll”을 디버깅해야 된다. 추가적으로 취약점에 영향을 받는 버전은 8.6, 8.71이다.


취약점이 있는 파일을 실행하게 되면 아래와 같이 보여지는 걸 확인할 수 있다. Gsdll32.dll 로드를 통해 gbb.exe 동작하는 것을 알 수 있다.



2. (첨부2)20-0206_법인_운영상황_평가표_서식(법인작성용).hwp 내 .EPS 분석

API loading 후 GetTempPathA(), GetComputerNameA(), GetSystemTime(), CreateFileA() 등 API를 호출하였다.

Temp 경로와 랜덤한 파일명을 얻은 후 CreateFileA()을 이용하여 파일이 존재 할 경우에 파일을 열지만 Temp 경로에 해당 파일이 없으므로 반복 후 리턴하는 걸 알 수 있다.


ZwQuerySystemInformation(), ZwDuplicateObject(), ZwQueryObject(), GetCurrentProcessId(), GetCurrentProcess() 등 API를 호출하는 걸 알 수 있다.

먼저 Nt ZwQuerySystemInformation() API을 보게 되면 첫번째 멤버는 System_Information_class로 인자 값에 대한 시스템 정보를 보여준다. 해당 API의 스택에 쌓인 인자를 보게 되면 “10”을 가지고 있으며, SystemHandleInformation로 시스템 핸들의 정보를 원하는 것을 확인할 수 있다.

이후 진행 시 ZwDuplicateObject API을 보게 되면 커널에 요청해 핸들을 가지고와 복사하는 것을 확인할 수 있다.

다음으로 ZwQueryObject() API을 이용하여 위에서 얻은 객체의 핸들을 통해 커널의 객체 타입에 대한 정보를 얻어오는 것을 확인할 수 있다. 두번째 멤버의 인자 값 “2”, ”1”에 따라 정보를 얻을 수 있다.


Mapping 관련 API를 호출하는 것을 할 수 있으며, 아래와 같이 PostScript을 확인할 수 있다. 이후 진행 시 253(FD) XOR 연산하는 것을 확인할 수 있으며, XOR 연산 완료 시 악성 쉘코드를 얻는 것을 확인할 수 있다.