안랩 ASEC은 갠드크랩 악성코드관련 정보를 게시하는 marcelo 트위터를 통해 GandCrab의 새로운 버전인 v5.0.9 파일을 확인하였다.


현재 국내에서 활발히 유포 되고있는 Gandcrab v5.0.4와 다른 점은 아래 [그림 1]과 같은 메시지 창을 가장 먼저 띄운다. 이 메시지를 보면 곧 국내에도 Gandcrab v5.0.9가 유포될 것으로 보이며 사용자들의 주의가 필요하다.


[그림 1] 메시지 박스


해당 메시지 박스를 클릭하기 전 까지는 감염이 되지 않으며 확인을 누를 시 기존에 알려진 Gandcrab과 동일하게 특정 프로세스 종료 및 특정 사용자 언어를 확인하여 감염 유무 결정, 암호화 시 랜덤명으로 확장자 변경 등의 행위를 한다. 바탕화면과 랜섬노트, 내부버전 모두 5.0.9로 변경되었다.

[그림 2] GandCrab v5.0.9 감염 배경화면


[그림 3] GandCrab 랜섬노트


[그림 4] GandCrab 내부버전


현재 V3에서는 Gandcrab v5.0.9가 실행될 경우 다음과 같이 차단하고 있다.

[그림 5] V3 행위 차단 메시지


Posted by 분석팀

안랩 ASEC은 국내 사용자를 대상으로 문서 확장자를 사용하는 XML파일을 스팸 메일을 통해 유포되고 있음을 확인하였다. 

XML(Extensible Markup Language)파일은 구조적인 데이터를 쓰기위해 만들어진 파일로 다양하게 사용되고 있다.

 

현재 국내에 유포되는 doc확장자의 XML파일은 아래 그림처럼 상단에 <?mso-application progid="Word.Document"?> 가 명시되어 있다. 이는 XML파일을 Word로 연결하여 실행하겠다는 의미이며, 이후 내용은 Word로 읽어 실행된다. progid값은 다른 값으로도 사용될 수 있으며 이는 <?mso-application progid="Excel.Sheet"?> 형태의 Excel 파일로 악용될 수 있음을 시사한다.


 

 

 

XML파일을 실행하면 Word 프로그램을 통해 실행되며 VBA (Visual Basic for Applications, Microsoft Office 응용프로그램의 확장을 위한 프로그래밍 언어) 매크로를 포함하고 있다. 아래 그림처럼 VBA 매크로를 실행하도록 유도하는 문구의 그림이 존재한다.

 

 

XML파일 내부에는 base64 로 인코딩 된 데이터가 존재한다. 이 중 "editdata.mso" 인 데이터를 디코딩하면 ActiveMime 헤더를 갖는 파일이 생성된다. ActiveMime은 Office 매크로 인코딩에 사용되는 문서화되지 않은(undocumented) Microsoft 파일 형식이다. 오프셋 0x32 위치부터 데이터를 풀면 OLE개체가 생성되며, 생성된 OLE 개체에 VBA 매크로가 존재한다.

 

 

 

VBA 매크로는 문서파일이 열릴 때 동작하며, XML 파일 가장 아래에 존재하는 난독화 된 데이터를 읽어 와 실행하는 행위를 한다. cmd로 실행되는 난독화된 데이터는 powershell을 실행하여 특정 주소의 파일을 사용자 PC의 %TEMP% 경로에 다운로드하여 실행 하는 행위를 한다.

 

 

 

안랩 ASEC에서 사용중인 자동분석 시스템(RAPIT)에서의 행위 정보를 통해 다운로드 시도하는 주소를 알 수 있다. 

 

 

powershell 을 통해 다운로드되는 파일은 Emotet 유형의 악성코드로 확인되었다.




서두에서 언급한 것과 같이 해당 악성 파일은 스팸 메일을 통해 유포되고 있으며, Word 문서 파일 내부의 이미지를 통해 사용자로 하여금 큰 의심 없이 매크로를 실행시키도록 유도하므로 출처를 알 수 없는 메일의 첨부 파일 실행을 삼가고 확인되지 않은 문서 파일 내부의 매크로를 실행하는데 있어서 주의가 필요하다.

 

V3 제품에서는 아래와 같이 진단하고 있다.

 

- XML/Dropper.S1

- XML/Downloader

- Trojan/Win32.Emotet


Posted by 분석팀

안랩 ASEC은 랜섬웨어를 포함하여 국내 악성코드 유포에 널리 사용되는 IE 취약점 CVE-2018-8174에 대한 분석을 진행하였다. 해당 취약점은 메그니베르 랜섬웨어 유포에도 사용되고 있으며, 보안패치 적용을 통해 피해를 예방하는 작업이 필요하다.


AhnLab_분석팀_CVE-2018-8174_분석보고서.pdf



MS 보안 업데이트 페이지 (CVE-2018-8174)

https://portal.msrc.microsoft.com/ko-kr/security-guidance/advisory/CVE-2018-8174




01. 요약

1) CVE-2018-8174 개요

CVE-2018-8174 취약점은 VBScript엔진의 Use After Free 발생으로 인한 객체 재사용으로 발생한다.

원격 실행이 가능한 취약점이며, 영향받는 버전은 Internet explorer8, Internet explorer9, Internet explorer10, Internet explorer11(1803 이하 버젼), Windows 10(1803 이하), Windows 7, Windows 8, Windows Server 이다.


02. 사전지식

1) VBScript 엔진이 스크립트를 실행하는 방법

) 정의

VBScript 엔진에서 스크립트는 엔진이 해석 가능한 Precompiled Code(이하 P-Code) 로 변환되어 실행된다. 변환된 P-Code 0x00 ~ 0x6F112개의 값을 가지며, VBScript 엔진의 내부 함수인 RunNoEH 에서 해석 후 P-Code에 적합한 VBScript 함수를 호출한다. RunNoEH 함수는 [그림 1] 와 같다.


[그림 1] RunNoEH 함수 정의

 

) 실행방법

P-CodeRunNoEH 함수에서 실행이 되며 [그림 1]의 첫번째 파라미터인 CScriptRuntime 클래스 내부에 위치한다. CScriptRuntime 클래스는 [그림 2]와 같으며 0xC0에 위치한 멤버변수 Compiled Script를 통해 P-Code의 위치를 알 수 있다. [그림 2]0xB4에 위치한 멤버변수 Position Counter는 다음 실행할 P-Code 명령어를 가리키고 있다. 이는 EIP 레지스터와 유사한 역할을 수행한다.


[그림 2] CScriptRuntime 클래스

 

VBScript엔진에서 P-Code[그림 3]처럼 Call-Return 방식으로 실행된다. Call-Return 방식이란 Global CodeP-Code를 실행하면서 내부적으로 Call을 호출하는 P-Code를 만났을 때 다음 실행할 P-Code를 저장하고 해당 함수의 P-Code 명령어를 실행하는 방식이다


[그림 3] P-Code 실행 흐름

 

) 도구 소개

Kaspersky 사에서 P-Code를 추출하는 스크립트를 github에 공개했다(참고문헌[1]). 이를 이용하면 위에서 설명한 CScriptRuntime 클래스의 Compiled Script 를 추출하여 분석에 이용할 수 있다.

 


03. 상세 분석

1) CVE-2018-8174

) 취약점 발생 원리


CVE-2018-8174 취약점은 VBScript엔진의 Use After Free 발생으로 인한 객체 재사용 문제를 명명한 것이다.

아래 [그림 4], [그림 5] CVE-2018-8174 취약점에서 Use After Free 발생원리를 정리한 그림이다. 그림의 스크립트는 CVE-2018-1874 PoC(Proof of Concept) 스크립트 이다. 그림에 정의된 숫자 순서대로 진행되며 [그림 4], [그림 5]는 순서대로 이어진다.

 


[그림 4] Use After Free 원리-1

 

[그림 4]의 스크립트 내용 중 1번의 Dim은 변수 선언이며, 전역변수 o를 선언하게 된다. 2번의 Redim의 의미는 배열 선언이고 arr로 명명된 2개의 배열이 선언된다. 3번의 과정을 통해 cal1 클래스객체를 선언된 첫번째 배열 arr(0)에 할당 한다. 이 과정으로 첫번째 배열 arr(0)cal1 클래스객체의 주소가 저장되고 클래스 객체에 대한 참조 횟수(레퍼런스 카운트)1이 된다.

 

[그림 5] Use After Free 원리-2

 

[그림 4] 과정 이후, [그림 5] 4번의 메모리 해제 과정을 진행한다. Erase 문에 의해서 선언된 배열 arr 삭제를 시도 한다. arr배열의 첫 번째 요소인 arr(0)을 삭제할 때 해당 배열에 저장된 cla1 클래스의 Class_Terminate함수가 콜백함수로 호출되어 5번의 과정을 진행한다. 5번의 과정은 1번의 과정에서 선언된 전역변수 oarr(0)에 저장된 cla1 클래스객체 주소 값을 저장한다. 자신을 참조하는 변수가 늘었으므로 cla1 클래스의 참조 횟수는 1 증가한다. 6번 에서 arr(0)에 저장된 클래스객체 주소를 다른 값으로 바꾸게 되고 이로 인해 cla1 클래스의 참조 횟수는 1 감소된다. 이후 7번에서 콜백함수는 종료 되며, 참조 횟수의 증가, 감소가 일정하여 클래스객체 주소에 대한 free() 함수를 호출한다. 마지막 8번을 통해 전역변수 o의 값을 출력하면 이미 해제된 메모리 주소를 가리키고 있다.

 


[그림 6] VBScriptClass::Release 함수

 

매모리 해제는 VBScript.dll 에 정의된 [그림 6] 의 함수를 통해 진행된다. 코드에서 알 수 있듯 InterlockedDecrement 호출 후 참조 횟수가 0이면 VBScriptClass::TerminateClass 함수가 호출되며, 이 후 해제 대상인 클래스(v1 변수)의 참조 횟수가 1이면 free()함수가 호출된다. Class_Terminate 콜백 함수 호출 시 콜백 함수 내에서 전역변수 o에 해제하기 전 클래스 객체의 주소값을 저장하고, 참조 횟수에 대한 균형을 맞춰줌으로써 free () 함수를 호출한다. 따라서 실제 메모리는 해제되므로 해당 주소값을 Dangling pointer로 사용할 수 있다.

 

) Use After Free

앞서 설명한 Use After Free 의 발생원리를 아래 [그림 7]의 코드(참고문헌 [7])를 이용하여 상세히 설명한다.

 

[그림 7] Use After Free 스크립트

 

[그림 7] 1번 부분에서 Redim 은 내부적으로 [그림 8]과 같은 함수들을 호출한다.


[그림 8] Redim 내부 호출

 

SafeArrayAllocData 함수까지 호출이 끝나면 tagSAFEARRAY 구조체가 생성된다. tagSAFEARRAY 구조체는 [그림 9]과 같은 구조를 가진다(참고문헌 [2]).

 

[그림 9] tagSAFEARRAY 구조체

 

[그림 10] 할당된 메모리 값

 


 

[그림 11] Variant 구조체

 

[그림 7] 1번 부분의 redim 으로 할당되어 초기화 된 메모리 영역이 생성되며, Set 명령어를 통해 값이 할당된다. [그림 10]는 이 과정을 통해 할당된 값 이다. 이때 저장되는 값의 형태는 Variant 구조체이다(참고문헌 [4]). Variant 구조체는 많은 유형의 데이터를 전달하는 구조체로, 첫번째 멤버인 VT(Variant Type)(참고문헌 [5])에 따라 유효한 데이터 유형이 결정된다. 현재 할당된 Variant 구조체의 VT값이 0x09(VT_DISPATCH) 임을 확인할 수 있다[그림 11].

 

[그림 12] VBScriptClass 객체

 

Variant구조체의 VTVT_DISPATCH은 객체 포인터가 저장되며 0x021C6AB8 이 저장되어 있음을 확인할 수 있다. 이 주소에 저장된 값은 VBScriptClass로 할당된 cla1의 객체 정보가 저장된 공간이다. Set을 통해 cla1에 대한 참조값이 증가하여 참조 횟수가 2가 되었음을 확인할 수 있다.

 

[그림 13] VbsErase 내부 호출

 

[그림 7] 1번 부분의 Erase 는 내부적으로 [그림 13] 과 같은 함수들을 호출한다. oleaut32!ReleaseResources 함수는

FreedObjectArray 배열을 순회하며 저장된 값을 초기화하는 기능을 수행하고 oleaut32!VariantClear 함수는 Variant구조체를 초기화 하는 함수이다. VariantClear 함수는 Variant구조체의 VT값에 따라 Clear하는 루틴이 달라진다. Variant구조체의 VT값이 DISPATCH이므로 VBScriptClass::TerminateClass가 호출된다. [그림 7] Erase 함수가 호출되는 시점은 할당 후 즉시 해제하였으므로 참조 횟수는 아래 [그림 13]처럼 1이 되고 이후에 TerminateClass가 호출되고 초기화 함수를 거치면서 [그림 7]번의 2번 콜백 함수부분으로 넘어간다.


[그림 14] Erase 함수 호출 후 참조 횟수

 

초기화를 거친 cla1배열의 참조 횟수는 4 이며, [그림 7] 2번 부분에서 Set부분은 cla1 객체 주소 정보를 가지고 있는 FreedObjectArray 배열을 UafArrayA에 할당하여 참조 횟수를 1 증가시킨다. UafArrayA에 저장된 주소값이 Dangling pointer로 사용된다[그림 15].

 

[그림 15] Dangling pointer

 

[그림 16] FreedObjectArray(1) 후 메모리 변화

 

이후 Redim으로 선언된 FreedObjectArray(1) 배열에 새로운 값을 할당하여 vbscript내부적으로 AssginVar가 호출된다. 이 때 1Variant구조체의 VT값 중 0x02(VT_I2)에 해당하기 때문에 기존 0x09(VT_Dispatch) 값은 0x02(VT_I2)로 위 [그림 16]처럼 할당된다. FreedObjectArray(1) 배열에 객체 참조로 인해 cla1의 참조 횟수는 1 감소한다. 콜백 함수에서 시작값인 4와 동일하게 맞춰진 상태에서 콜백 함수 호출이 종료되어 참조 횟수는 0이 되어 메모리는 해제된다.

결과적으로 클래스 구조체의 참조 횟수에 대한 검증이 제대로 이루어 지지 않아 Use After Free가 발생하였다. 여기서 발생된 Dangling pointerUafArrayA 배열에 저장되고 [그림 7] 3번과정을 통해 ReuseClass 로 재할당되어 이후 TypeConfusion 취약점에 사용된다.

 

) TypeConfusion

TypeConfusion이란 선언된 Type에 대해 혼동을 주는 것을 뜻한다. 아래 [그림 17] 에서 처럼 할당된 Type A 형태의 데이터가 있다고 가정하면 구성된 쉘 코드를 통해 할당된 데이터의 영역에 덮어쓰게 되면 덮어써진 쉘 코드에 의해 데이터의 타입이 변형된다. 변형된 Type A의 영역을 읽게 되면 할당한 Type A가 아닌 변형된 Type B로 인식된다. 이 방식이 TypeConfusion의 원리이다.

 

[그림 17] TypeConfusion 원리

 

CVE-2018-8174 취약점에서 Use After Free2번 진행되며 2개의 Dangling Pointer2ReuseClass 로 할당 한다. Use After Free의 부분에서는 방법과 원리에 차이가 없어 1개의 설명만 했지만, TypeConfusion 부분에서는 2개가 각각 다르게 사용된다. 우선 첫번째 방식을 설명하고 이어 차이점을 뒷 부분에 기술한다.

아래 [그림 18]CVE-2018-8174 코드의 TypeConfusion 부분이다. [그림 7] 3 과정인 Use After Free 로 구해진 Dangling pointer로 할당된 ReuseClass의 주소 resueObjectA_arrTypeConfusion을 위한 메모리를 구성하는 코드이다. resueObjectA_arr 클래스의 SetProp 함수가 호출되면 ReuseClass에 선언된 디폴트 프로퍼티를 수행한다. 디폴트 프로퍼티함수 내에 구성된 Q 0x0C, 0x20값으로 Variant 구조체의 VT값이 0x200C가 되며 변수형은 VT_ARRAY, T_VARIANT 이다. UafArrayA0을 대입하면 VBScript Terminate Class를 호출하게 되고 참조 횟수가 0이 되면서 ReuseClassfree 된다. 이후 objectImitatingArray FakeReuseClass 객체를 할당하는데 이때 ReuseClass 객체 주소와 같은 주소를 할당한다.

 

[그림 18] TypeConfusion 스크립트-1

 

할당된 FakeReuseClass 객체는 아래 [그림 19]와 같다. 아래 [그림 19]의 윗 부분은 ReuseClass 객체를 할당한 공간이며 아래 부분은 FakeReuseClass 객체를 할당한 공간이다. 흰색 네모박스 부분이 함수명, 변수명을 나타내며 흰색 네모박스의 앞의 공간이 할당된 데이터이다. Function0x4C값으로 시작하며, dim으로 선언된 변수는 0x00으로 시작한다.

[그림 19]ReuseClass 객체를 할당한 공간에 FakeReuseClass 객체를 할당하는데 첫번째 함수명이 p에서 10개의 문자열이 추가되어 16byte가 늘어나고 SPP 함수가 이후에 할당된다.

 

[그림 19] TypeConfusion 전 후 메모리 값

 

FakeReuseClass 객체로 할당한 objectImitatingArray mem 에 미리 구성된 FakeArrayString 로 덮어쓴다. FakeArrayStringString으로 구성된 값(0x08,BSTR)으로 비정상적인 크기의 tagSAFEARRAY 를 만들기 위해 구성된 값이다. 쓰는 값인 FakeArrayString BSTR memVT값이 0x08로 바뀐다. 이 중 0xFFFF, 0x7FFF 값이 있는데, 이 값은 TypeConfusion을 할 때 SafeArray 배열의 크기를 0x7FFFFFFF크기로 만들기 위해 구성된 값이다. 또한 0x00010x0880, 0x0001값이 있는데 이 값은 tagSAFEARRAY 구조체의 첫번째, 두번째, 세번째 인자값으로 설정되는데 각각 배열의 차원정보, 배열 피쳐정보, 배열 요소의 크기값이 된다. 이렇게 구성된 값을 objectImitatingArraymem 변수에 덮어쓴다. 이렇게 덮어쓰면 아래 [그림 20]처럼 변경된 tagSAFEARRAY 구조를 볼 수 있다. 1차원 배열의 0x880( FADF_VARIANT | FADF_HAVEVARTYPE )속성과 배열 요소의 크기가 10x7FFFFFFF 개의 배열을 갖게 된다. 디폴트 프로퍼티 함수가 끝나고 SetProp로 돌아가서 정의된 mem 을 구성된 Q 값으로 ReuseClassmem 위치에 덮어쓰게 되어 타입이 0x08(BSTR)에서 0x200C(ARRAY, VARIANT)로 바뀌게 된다. 이 후 reuseObjectA_arrmem을 호출하게 되면 0x7FFFFFFF 크기의 배열을 사용할 수 있게 된다. 비 정상적인 크기의 이 배열은 스크립트가 로드된 iexplore.exe의 힙 영역으로 같은 크기만큼의 메모리를 접근할 수 있다.

 

[그림 20] TypeConfusionreuseObjectA_arr 메모리

 

resueObjectB_intresueObjectA_arr 와 같은 방식으로 TypeConfusion이 된다. 위 설명과 차이점은 디폴트 프로퍼티함수 내에 구성된 P 값과 미리 구성된 FakeArrayString 값이다. 디폴트 프로퍼티함수 내에 구성된 P 값의 VT값이 BSTR(0x08) 에서 LONG(0x03) 으로 바뀌며 비어있는 16byte로 채워진다. 비어있는 공간의 reuseObjectB_int mem을 전역변수 주소를 some_memory 에 넣는다. 비어있는 값은 스크립트가 로드된 iexplore.exe의 힙 영역으로 이후 메모리의 특정 공간을 저장할 때 사용된다.

 


[그림 21] TypeConfusion 스크립트-2

 

[그림 22] TypeConfusionreuseObjectB_int 메모리


 

 

) LeakVBAddr

LeakVBAddr 부분에서는 앞선 TypeConfusion으로 만들어진 배열(resueObjectA_arr) 과 힙 주소(resueObjectB_int)를 이용하여 VBScript.dllbase addresss를 획득한다.

 

[그림 23] LeakVBAddr 스크립트

 

[그림 24] LeakVBAddr 과정의 메모리 변화

 

비어있는 함수 EmptySub emptySub_addr_placeholder 변수에 할당함으로써 vbscript.dll 내부 주소를 포함한 객체가 할당된다. 이때 빈 함수를 변수에 할당하는 것은 문법상 오류가 나지만, On Error Resume Next를 통해서 이후 루틴이 수행가능하다. 이후 null 을 할당하여 VT값이 Func(0x4C) 에서 NULL(0x01) 로 바뀜을 확인할 수 있다. EmptySub를 할당 후 Null을 할당한 상태에서 VTNull(VT=0x01)에서 LONG(0x03)으로 수정하여 메모리 주소를 변수로 출력하여 메모리 주소 누출 시킨다. TypeConfusion 함수를 통해 얻어낸 0x7FFFFFFF 크기의 배열(reuseObjectA_arr.mem) heap Address (some_memory) 에 접근하여 타입변경을 자유롭게 수행할 수 있다.

 

) Execute ShellCode

 

[그림 25] 코드 실행 스크립트

 

쉘 코드의 실행은 0x4D값을 할당하면서 실행된다. 0x4D값을 할당하면 AssignVar가 호출되며 Variant구조체의 VT값을 확인하여 값에 맞는 분기를 한다. VT값이 0x4D일때는 VAR::Clear가 호출되고 구성된 메모리로 인해 NtContinue VirtualProtect로 쉘 코드까지 실행 된다.

 

[그림 26] 코드 실행 과정

 

[그림 27]VirtualProtect로 쉘 코드에 실행 권한을 주기 위해 메모리를 구성하는 스크립트이다. VirtualProtect는 대상주소, 크기, 보호옵션으로 호출된다. 실행 권한으로 64(0x40)가 사용되며 이는 PAGE_EXECUTE_READWRITE 권한이다.

 

[그림 27] VirtualProtect 콜 파라메터 메모리 구성 스크립트

 

[그림28 ]NtContinue를 호출할 때 사용되는 CONTEXT 구조체를 구성하는 스크립트이다. 레지스트리 위치에는 패딩값으로 채워지며, EIP, ESP 값의 위치에 각각 VirtualProtect 의 주소값과 쉘 코드의 EP주소값을 써서 메모리를 구성한다.

 

[그림 28] CONTEXT 구조체 구성 스크립트

 

위에서 설명한 것 처럼 VT0x4D값을 할당하면 AssignVar Var::Clear로 호출되는데, Var::Clear에서 아래 [그림 29]의 분기문을 수행하게 된다. [그림 29]loc_6E50089C에서 첫 번째 줄은 Variant 구조체의 데이터에 해당하는 위치([esi+8])로 위 [그림 28] StructForNtContinue 로 구성한 메모리를 가리킨다. 이후 StructForNtContinue 로 구성한 메모리의 주소를 push 하고 call하여 NtContinue 를 실행하게 한다.

 

[그림 29] 구성된 메모리 실행

 

NtContinue가 호출될 때 위에서 구성된 CONTEXT구조체 주소와 함께 호출되어 VirtualProtect함수를 호출하게 된다.

구성된 CONTEXT구조체로 인해 VirtualProtect 에서 쉘 코드 주소를 받아 실행권한을 주고 return 하여 쉘 코드로 분기하여 쉘 코드가 실행된다.

 

[그림 30] 쉘 코드 실행

 

[그림 31] 메모리 실행권한 변화

 

) 취약점 패치

앞서 설명한 CVE-2018-8174 Use After Free 취약점은 oleaut32.dll 모듈 아래와 같이 패치 되었다(참고문헌 [6]). [그림 32]oleaut32.dll 패치 전 후의 VariantClear함수이다. 그림의 왼쪽 부분이 패치 전 이며 오른쪽 부분이 패치 후 이다. 할당된 Variant 구조체를 해제할 때 호출되는 함수는 [그림 13]과 같다. vbscript.dll VbsErase가 호출되고 내부 호출에 의해 oleaut32.dll 모듈의 VariantClear함수가 호출된다. 호출된 VariantClear함수에서 vbscript.dll 모듈의 TerminateClass로 해제되는데, [그림 32]의 오른쪽 부분처럼 해제할 때 해당 함수에서 Variant Type 값을 0x00(VT_EMPTY)로 채워 넣고 해제 하는 형태로 패치 되었다. 패치 전후의 메모리 값을 보면 VT값이 0x09(VT_DISPATCH)에서 0x00(VT_EMPTY)로 바뀌는 것을 볼 수 있다. 이렇게 패치되어 Use After Free 로 얻어진 Dangling pointer 를 사용면 UafArrayA 배열에 객체 주소를 복사하는 과정에서 오류가 발생하고 객체 재사용이 불가능 하다.

 

[그림 32] CVE-2018-8174 취약점 패치 전 후 VariantClear

 

 

04. 참고문헌

[1] https://github.com/KasperskyLab/VBscriptInternals , Github, KasperskyLab

[2] https://msdn.microsoft.com/ko-kr/windows/hardware/ms221482(v=vs.71) , MSDN, SAFEARRAY structure

[3] https://msdn.microsoft.com/en-us/library/cc237824.aspx , MSDN, ADVFEATUREFLAGS Advanced Feature Flags

[4] https://msdn.microsoft.com/en-us/library/ms931135.aspx , MSDN, VARIANT structure

[5] https://msdn.microsoft.com/en-us/library/cc237865.aspx , MSDN, VARIANT Type Constants

[6] https://portal.msrc.microsoft.com/ko-kr/security-guidance/advisory/CVE-2018-8174 , Microsoft , 보안 업데이트 가이드

[7] https://github.com/piotrflorczyk/cve-2018-8174_analysis/blob/master/analysis.vbs , Github, piotrflorczyk



Posted by 분석팀

안랩 ASEC은 11월 15일부터 국내에 유포되는 이력서 사칭 메일관련하여 아래의 글을 게시하였다.

- http://asec.ahnlab.com/1178 (이력서를 가장하여 유포중인 GandCrab 랜섬웨어 (2018.11.15))


당시 공격자가 사용하는 발신자 메일주소는 아래의 사이트를 통해 확인 가능하며, "mshuherk@gmail.com" 메일주소를 갖는 사용자에 의해 등록되는 것으로 확인되었다. https://domainbigdata.com/gmail.com/mj/AizKbe0W3X_QZVcjg5-C9Q



ASEC블로그를 통한 최초 공개 당시에는 11월 10일자에 생성한 도메인까지만 확인되었으나, 이후 11월 16일과 19일에도 새로운 도메인이 등록된 것을 알 수 있다. 11월 16일과 19일에 등록된 도메인은 다음과 같다.


- servicegoogletech.com 2018-11-16

- koreanodongcheong1.com 2018-11-19

- koreanodongcheong2.com 2018-11-19

- koreanodongcheong3.com 2018-11-19

- koreanodongcheong4.com 2018-11-19

- koreanodongcheong5.com 2018-11-19




이렇게 새롭게 생성된 도메인이 아래의 그림에서 처럼 정부기관 사칭 메일발송에 사용된 것을 알 수 있다. 즉, 공격자로 추정되는 "mshuherk@gmail.com" 사용자에 의해 등록되는 도메인은 지속적으로 모니터링할 필요가 있다.






[2018.11.26] Update


11월 26일 날짜에 새롭게 등록된 아래의 도메인들이 사칭 메일주소로 사용될 것으로 추정되어 해당 도메인으로 발송된 메일에 포함된 링크는 클릭하지 않는 주의가 필요하다.





- windykacja-orange.com 2018-11-26

- tojuntongsang.com         2018-11-26

- orange-platnosc.com         2018-11-26

- jihakimage.com                 2018-11-26

- hannasangsa.com         2018-11-26

- donghakimage.com         2018-11-26



Posted by 분석팀

우리나라 주요 공공기관과 기업 등 국내 많은 사용자가 이용하는 '한글과컴퓨터'의 한글 워드프로세서를 대상으로 하는 악성 문서파일(*.HWP)이 꾸준히 제작 및 유포되고 있다. 안랩 분석팀은 2016년부터 2018년 말 현재까지 접수되었던 악성 한글 파일의 상당수가 EPS를 이용하여 악성 기능을 수행한 것을 확인하였다. 


여기에서 EPS(Encapsulated PostScript) 파일이란 일종의 그래픽 파일 형식으로서, 어도비(Adobe)에서 만든 포스트스크립트(PostScript) 프로그래밍 언어를 이용하여 그래픽 이미지를 표현하는 파일이다. EPS를 통해 종 고화질 벡터 이미지를 표현할 수 있어 한글 프로그램에서는 문서에 EPS 이미지를 포함하거나 볼 수 있는 기능을 제공하였다. 그러나 이러한 EPS 파일을 악의적으로 만들어서 한글 문서에 포함하게 되면 문서 파일 실행 시 악성 기능이 실행되는 문제점이 있다. 또한 EPS 파일을 이용한 한글 문서 악성 파일은 일반적인 트로이목마나 랜섬웨어처럼 불특정 다수를 대상으로 공격하는 것보다 정부나 학교 등 공공기관, 금융 관련 기업, 주요 민간 인사 등을 대상으로 타겟형 공격을 하는 유형이 더 많기 때문에 민감 정보 유출 가능성 및 피해 규모가 더 크다. 


2017년 초 한글과컴퓨터에서는 EPS 파일 처리 과정에서 악성코드가 실행되는 문제를 막기 위한 보안 업데이트를 이미 제공하였다. 이를 통해 최신 업데이트가 적용된 한글 프로그램은 EPS를 이용한 악성 한글 파일이 동작하지 않는다. 따라서 한글 프로그램을 이용하는 사용자라면 보안 업데이트를 필수적으로 하기를 강력히 권고한다. 본 글에서는 EPS 파일을 이용한 악성 한글 HWP 문서의 동작 방식을 설명하고 이를 막기 위한 사용자의 보안 조치 가이드를 안내한다. 




< 2017년 2월 23일 한컴오피스 보안 공지사항 >


  • 2017년 2월 이후 업데이트가 되어 있지 않은 한글 프로그램은 반드시 최신 업데이트를 해야 합니다. 
  • 상세한 업데이트 방법은 한글과컴퓨터 홈페이지 공지사항을 참고 바랍니다. 
  • 업데이트 이후에는 한글 프로그램 설치 경로에 *.EPS 또는 *.PS 확장자의 파일 처리를 위한 인터프리터 프로그램이 삭제됩니다. (하단 참고)


EPS 파일을 이용한 악성 한글 문서는 한글 프로그램 자체가 문제가 되는 것이 아니고, EPS 파일을 읽고 처리하는 과정에서 실행되는 하위 프로세스에서 악성 행위가 발생한다. HWP 한글 문서에 삽입된 EPS 이미지 파일은 한글 파일의 복합 파일(Compound File) 구조 상 BinData 스토리지에 zlib 으로 압축되어 *.EPS 또는 *.PS 로 존재한다. 그리고 EPS 파일은 포스트스크립트(PostScript) 코드로 만들어졌기 때문에 이를 실행하기 위해서는 별도의 인터프리터가 필요한데 한글 프로그램은 이를 위해 고스트스크립트(GhostScript) 인터프리터를 한글 프로그램 설치 경로에 포함하고 있다. 


> dir "<한글프로그램설치경로>\Bin\ImgFilters\GS"

  • gbb.exe - 한글과컴퓨터 제공 포스트스크립트 인터프리터, gsdll32.dll 로드해서 동작
  • gsdll32.dll - 고스트스크립트 인터프리터 핵심 라이브러리
  • gswin32.exe - 고스트스크립트 인터프리터 GUI 버전, gsdll32.dll 로드해서 동작
  • gswin32c.exe - 고스트스크립트 인터프리터 커맨드 버전, gsdll32.dll 로드해서 동작

EPS 파일을 포함한 한글 문서가 이미지를 로드할 때 한글 OLE 구조상 BinData 폴더(스토리지)에 있는 EPS 파일(스트림)은 임시 파일로 생성된다. 한글 프로세스는 생성된 임시 파일을 인터프리터가 전달받아 처리하도록 gbb.exe 프로세스와 gswin32c.exe 프로세스에 임시 파일 경로를 인자로 전달하여 실행한다. 따라서 프로세스 트리는 Hwp.exe 프로세스 실행 후 Child Process로 gbb.exe 프로세스와 gswin32c.exe 프로세스가 실행되는 구조를 보인다. 


악성 EPS 파일은 실행 방식 및 기능에 따라 아래와 같은 두 가지 유형으로 나뉜다. EPS를 이용한 악성 한글 파일이 처음 등장한 2016년부터 두 가지 유형은 계속 등장하였는데, 시그니처 기반의 파일 탐지가 어려운 취약점 유형이 비교적 많은 추세였다가 현재는 드로퍼 유형이 좀 더 고도화되어 다시 많아지고 있다. 


[1] EPS 취약점 익스플로잇으로 쉘코드 실행


EPS 파일 뷰어 또는 인터프리터 취약점을 익스플로잇하여 쉘코드를 실행하는 유형으로 취약점별로 그 구분이 나뉘지만, 올해 발견된 등장하는 EPS 취약점 유형은 CVE-2017-8291이 대부분이었다. CVE-2017-8291는 고스트스크립트 취약점으로 9.21 버전 이하에 동작하는데, 한글 프로그램에 포함된 고스트스크립트는 버전이 8.6 또는 8.71 로 취약 버전에 해당된다. 


스트링 패턴 기반 탐지를 우회하기 위해 포스트스크립트 코드는 보통 인코딩되어 있다. 디코딩해서 보면 메모리에서 쉘코드를 실행하기 위해 의도적으로 비정상적인 코드 구성을 한 것을 볼 수 있다. 포스트스크립트는 스택 기반의 프로그래밍 언어로서 메모리 주소에 값을 저장하고 스택을 참조해서 값을 가져오기 때문에 쉘코드 HEX 스트링을 저장한 변수를 필수적으로 포함한다. 



참고로 EPS 파일의 로드시 익스플로잇 과정을 상세히 보기 위해서는 EPS 인터프리터인 gbb.exe 또는 gswin32c.exe 프로세스를 디버깅한다. 아래는 레지스터 값을 변경하는 스택 피벗(Stack Pivoting)부분으로 위 포스트스크립트에서도 이 코드를 구현한 것을 확인할 수 있다. ESP 레지스터를 변경한 다음 RETN 을 통해 실행 흐름이 변경되고 ROP로 VirtualProtect 함수를 구성하여 쉘코드를 실행할 메모리를 재정의한다. 이 때 VirtualProtect가 호출되는 스택 구조를 보면 (1) 특정 메모리 영역(쉘코드 부분)에 0x40 실행 권한을 주고 (2) 함수 RETN 이후 의도한 쉘코드(0x13D580C)로 분기하는 부분을 확인할 수 있다. 이 쉘코드는 위에서 언급한 대로 HEX 스트링 형태로 포스트스크립트에 변수로 선언되어 있다.


[2] 정상적인 문법 패턴을 이용해 악성 파일 생성


위에서 설명한 EPS 유형은 포스트스크립트의 문법적 또는 인터프리터의 실행 과정상 결함을 이용한 것이지만, 악성 파일을 생성하는 유형은 정상적인 포스트스크립트의 실행 결과이다. 파일 객체를 생성하고 접근할 수 있는 특성을 이용하여 readhexstring, writefile 등의 명령어를 이용하여 로컬에 파일을 생성한다. 메모리에서 쉘코드를 실행하는 방식이 아닌 파일을 드롭하는 것이기 때문에 백신 제품에서 탐지될 가능성이 높으며 이 때문에 단일 파일 생성이 아닌 여러 개의 파일을 생성 및 조합하여 최종 악성 실행 파일을 생성하는 것이 최근 동작 방식이다. 




한글 프로그램의 최신 보안 업데이트 이후에는 위에서 언급한 "<한글프로그램설치경로>\Bin\ImgFilters\GS" 디렉토리 자체가 삭제된다. 이 디렉토리가 있는 시스템은 반드시 업데이트를 해야 한다. 


보안 업데이트 전

보안 업데이트 후




Posted by 분석팀

현재 자바스크립트 형태(*.js) 로 국내에 유포 중인 GandCrab 의 유포 스크립트 에서 V3 제품 제거와 관련된 코드가 지속적으로 변화 하였는데, 11월 6일 V3 Lite Uninstall 프로그램에 캡차 코드 적용으로 인하여 더 이상 삭제가 불가능 해지자 V3 제품 Uninstall 기능을 제거한 스크립트의 유포가 확인 되었다.



[ 그림 1. Captcha 코드가 적용된 Uninstall 프로그램 ]


변경된 스크립트에서는 %appdata% 경로에 파일을 생성하고 이를 powershell로 로드하는 방식으로 GandCrab을 실행했다.


[ 그림 2. 변경된 GandCrab 유포 스크립트 ]


이로 인해 실행되는 Gandcrab의 버전은 v5.0.4 로 이전 유포되던 GandCrab과 동일 하였다.


[ 그림 3. GandCrab v5.0.4 랜섬노트 ]


안랩은 해당 GandCrab이 실행될 경우 아래와 같이 차단 하고 있다.



[ 그림 4. GandCrab 랜섬웨어 행위 차단 (M1996) ]


Posted by 분석팀

안랩 분석팀은 11월 16일(금) 악성 매크로 스크립트를 포함하고 있는 신규 한글 HWP 파일을 수집하였다. 최근 지속해서 발견되고 있는 악성 한글 파일이 EPS를 이용하고 있는 상황에서, 이번 한글 파일은 매크로 스크립트 방식을 다시 이용 하였다는 점이 독특하다. 매크로 스크립트를 포함한 악성 한글 파일은 2007~2008년에 유행하였다가 2015년에 다시 발견되는 등 비정기적으로 수집되고 있는데, 향후 이와 같은 방식의 한글 파일이 다시 많아질지 주목할 필요가 있다.


[문서 정보]

- 생성 날짜: 2018년 11월 8일 목요일 오전 12:21:49

- 작성자: st454


제작자는 한글 문서를 실행했을 때 악성 스크립트가 바로 실행되도록 OnDocument_Open( ) 부분에 자바스크립트(JavaScript) 코드를 삽입하였다. 한글 프로그램에서도 해당 스크립트 코드를 볼 수 있는데, 이는 파일 구조상 Scripts 스토리지의 DefaultJScript 스트림에 위치한다. 이 파일은 zlib 으로 압축되어 있으며 압축 해제 시 코드를 확인할 수 있다.


악성 한글 문서 본문 내용

한글 프로그램에서 편집할 수 있는 매크로 코드

파일 내 매크로 코드 바이너리 (좌: 바이너리 스트림 / 우: 압축 해제 후)

매크로 스크립트가 실행되면 파워쉘(powershell) 프로세스가 실행되는데, 인코딩된 Base64 커맨드를 통해 수행하고자 하는 악성 행위를 전달한다. 아래 화면은 실행되는 파워쉘 명령으로 다음과 같은 4가지 기능을 수행하도록 하였다. 


Command line: powershell.exe -noP -sta -w 1 -enc  SQBmACgAJABQAFMAVgBFAFIAcwBJAG8AbgBUA.... (생략)



[파워쉘 커맨드의 악성 행위]

  • Powershell ScriptBlock Logging 기능 OFF
  • Proxy 설정하여 웹 접속
  • 지정된 User-Agent 와 세션 쿠키 정보를 포함하여 특정 주소 (http://내부주소/login/process.php) 에 접속 
  • 접속 후 받은 파일을 복호화한 후 IEX (Invoke Expression) 실행

그룹 정책으로 관리되는 파워쉘 커맨드의 스크립트의 로깅을 우회하고 최종 페이로드를 수행하기 위한 목적으로, 이미 비슷한 코드가 ScriptBlock Logging Bypass 등의 이름으로 GitHub 등에 공개되어 있다. 2018년 2월 평창올림픽을 대상으로 한 공격에 사용된 악성코드 중에서도 이와 같은 파워쉘 코드가 존재하였다. 다만 이번에 수집된 한글 파일은 실행되는 파워쉘 커맨드가 접속하는 웹 주소가 로컬 IP이고 문서 내용이 'ㅁㅁㅁ' 에 그치는 점을 미루어 보았을 때 테스트 목적으로 제작하였을 가능성이 높다. 


안랩에서는 악성 매크로 스크립트를 포함하고 있는 한글파일을 다음과 같이 진단하고 있다. 

- SHA2: 645f9c9cf41aefa864f89593acee46c0b32117867585090298fbbac2d7f17d23

- V3 진단: Dropper/Exploit-HWP (2018.11.17.00)


또한 한글 프로그램에서는 매크로 스크립트를 포함하고 있는 문서 파일을 실행하였을 때 기본적으로 스크립트를 바로 실행하지 않고 [도구-매크로-스크립트 매크로 보안 설정] 에 따라 실행 확인 절차를 포함하고 있다. 사용자는 의심스러운 한글 문서 파일일 경우 다음과 같은 메시지 창이 떴을 때 이를 실행하지 않아야 한다.


한글 프로그램의 스크립트 실행 확인

Posted by 분석팀

11월 15일(목) 국내 사용자를 대상으로 입사 지원서를 가장한 갠드크랩 랜섬웨어 유포 시도가 확인되었다. 이메일을 통해 유포되고 있으며, 첨부파일이 아닌 외부 링크를 통해 *.DOC 형식의 문서를 다운로드 받도록 유도한다. 다운로드 받은 워드 문서파일에 포함된 악성 매크로 코드에 의해 갠드크랩 랜섬웨어가 다운로드 및 실행되는 구조이다. 아래의 [그림-1]은 11월 15일에 유포된 이메일의 내용이며, 이력서 다운로드 클릭 시 "donghakacademy.ddns.net/KIMJYONG.doc" 파일을 다운로드 받는다.




[그림-1] 이메일 내용


메일을 보낸사람은 "kimjyoong1121@soojawonpicture.com"으로 되어있으며, 실제 서비스되는 도메인이 아닌 것으로 확인되었다. 아래의 [그림-2]에서 처럼 11월 10일에 동일인에 의해 등록된 아래의 도메인들이 유사한 공격에 사용될 것으로 추정된다.

- https://domainbigdata.com/gmail.com/mj/AizKbe0W3X_QZVcjg5-C9Q (출처)


공격자가 사용할 것으로 추정되는 발신자 메일주소 도메인 리스트

- samkookinformation.com

- soojawonpicture.com

- noliteomoyeo.com

- haneuldongyang.com

- hangeulnaraman.com

- servicegoogletech.com


[그림-2] 공격에 사용된 도메인



V3 제품에서는 11월 15일자에 아래와 같이 탐지한 이력이 확인되었다.



지원서를 가장하여 유포되는 방식은 지속적으로 이용되고 있는 사회공학적 공격방식으로 출처가 불분명한 사람에게서 수신한 메일의 첨부파일은 실행 전 주의가 필요하며, 백신 프로그램을 최신으로 업데이트하는 작업이 필요하다.



[Update - 2018.11.19]


11월 19일자에도 예상했던 발신자 주소 (samkookinformation.com)로 부터 유사한 공격시도가 확인되었으며, 이번에는 실행파일 형태로 다운로드되는 구조이다.



그 외에도 아래의 이름으로도 유포된 이력이 확인되어 사용자 주의가 필요하다.


- 출석 요구서(작성후 출석시 지참요망).exe

- 박혜윤_이력서(181119)열심히하겠습니다.exe

- 경력증명서_양식.exe

- rix_폰트.exe

- 2018_달력.exe

- 카운터스트라이크_소스.exe

- 최신_영화_사이트.exe

- 폰허브_영상.exe

- 스팀_속도_빠르게.exe



Posted by 분석팀

안랩 ASEC은 Powershell로 동작하는 SEON 랜섬웨어를 발견하였다. 해당 방식은 7월에 발견된 "파워쉘 스크립트를 이용한 GandCrab 랜섬웨어의 유포 "(http://asec.ahnlab.com/1141)와 동일하게 파일리스(Fileless)로 동작한다.


Greenflash Sundown Exploit Kit 을 통해 악성 스크립트가 동작하면서 SEON 랜섬웨어가 실행된다. [그림 1]과 같이 악성 스크립트는 Base64 와 Gzip으로 내부 스크립트가 한번 더 암호화 되어있다.


[그림 1] 악성 스크립트


내부 스크립트를 풀면 [그림 2]와 같이 디코딩 루틴(rc4)과 파일을 다운로드 받는 URL을 확인 할 수 있다.


[그림 2] 그림 1 을 복호화 한 스크립트 일부


다운로드를 받은 인코딩 된 바이너리가 풀리면 Shell Code + SEON 랜섬웨어임을 알 수 있다.


[그림 3] 인코딩 된 Binary 

[그림 4] 디코딩 된 Binary (Shellcode 와 PE)


암호화가 되면 확장자는 .FIXT로 변경되고, YOUR_FILES_ARE_ENCRYPTED.TXT 파일을 생성한다.


[그림 5] 암호화 된 파일


[그림 6] YOUR_FILES_ARE_ENCRYPTED 내용


실제로 Powershell 형태로 동작하여 메모리에서만 동작하고 파일로 생성되지 않아 사용자의 주의가 필요하다. 신뢰할 수 없는 사이트 접근은 자제하며 OS 보안 업데이트 및 Anti-Virus제품 최신 업데이트를 통해 감염 예방을 해야한다.


V3제품에서는 아래와 같이 진단하고 있다.


SEON RANSOMWARE : Malware/Gen.Generic (2018.10.25.00

Malware Script : Powershell/Seoncrypt (2018.11.16.00)

Encrypted Binary: BinImage/EncPE (2018.11.16.00)

행위탐지 : Malware/MDP.Ransom.M1996

Posted by 분석팀

주말 사이 GandCrab 제작자는 Bitdefender의 복구 툴을 우회하기 위하여 v5.0.4를 배포하였다. 금일 수집된 v5.0.4로 복구 시도 시 다음과 같이 실패하게 된다.


[그림-1] GandCrab v5.0.4감염 시스템 복구 실패 화면


또한 V3 Lite제품에 대한 삭제 행위도 자사 행위 탐지 우회를 위해 기존과 다른 방식으로 변경되었다.


[그림-2] V3 Lite 언인스톨 관련 코드(GandCrab v5.0.4)


행위 주체를 WMIC.exe에서 cscript.exe로 변경하였으며 [그림-2]의 코드가 실행 시 아래와 같은 프로세스 구조로 실행된다.


[그림-3] 언인스톨 행위 관련 프로세스 구조


여전히 사용자의 검색어 관련된 제목의 압축파일을 다운로드 유도 후 실행 방식으로 유포되고 있는 점은 이전 버전과 다르지 않다.


[그림-4] 금일(10/29) 오전 GandCrab 유포 방식


랜섬노트도 유포 방식과 같이 v5.0.3에서 명시된 버전만 v5.0.4로 변경되었을 뿐 차이점은 없다.


[그림-5] GandCrab v5.0.4 랜섬노트


내부 바이너리도 버전은 변경되었으나 자사 관련 문구는 여전히 존재한다.


[그림-6] 바이너리 내부 버전 및 AhnLab 관련 문구


안랩은 다음과 GandCrab이 실행될 경우 아래와 같이 차단하고 있다.


[그림-7] V3 GandCrab 랜섬웨어 행위차단( M.1171), V3 삭제 행위차단( M.2015)


국내를 타겟으로 활발히 유포되고 있는 GandCrab v5.0.4버전부터는 공개된 복구 툴로 정상적인 복구가 되지 않기 때문에 사용자의 확인되지 않은 다운로드는 지양하여야 하며, OS 보안 업데이트 및 Anti-Virus제품 최신 업데이트를 통해 감염 예방이 필요하다.

V3 제품에서는 아래와 같이 GandCrab에 대하여 진단하고 있다.


- JS/GandCrab.S1

- JS/GandCrab.S2

- JS/Downloader

- Trojan/Win32.Gandcrab

- Malware/MDP.Ransom.M1171

- Malware/MDP.KillAV.M2015

 


Posted by 분석팀