본문 바로가기

Malware Analysis

VBA 사용자 정의 폼을 이용한 데이터 은닉

문서형 악성코드를 분석할 때, 정적 분석 과정에서 olevba.py, OfficeMalScanner, ... 등을 사용하여 소스코드를 추출하고

추출한 소스코드를 분석하여 악성코드가 어떤 행위를 하는지 파악할 때가 있다.

 

해당 기법은 VBA 프로젝트에서 사용자 정의 폼을 삽입한 후, 컨트롤을 추가하고 Text, Value 속성에
난독화된 문자열을 저장하고 모듈에서 난독화된 문자열을 역난독화하여 사용하는 형태로 사용될 수 있다.

 

이 때 중요한 점은, 소스코드를 추출했을 때 폼에서 데이터를 불러오는 형태로 사용되기 때문에,

데이터를 어떤 폼에 어떤 컨트롤에서 가져오는지는 알 수 있어도, 정적분석 과정만으로는 실제 어떤 데이터를

불러오는지 알기 힘들다는 것이다.

 

샘플 두 개를 만들어서 간단히 실습을 해보자.

 

Normal.docm 파일은 문서 파일이 열렸을 때, "Powershell BlaBlaBla!"라는 문자열을 보여주는 행동을 한다.

 

 

DataHide.docm 파일은 ComboBox에 문자열을 저장하고 모듈에서 값을 가져와 문자열을 보여주는 행동을 한다.

(물론 출력하는 문자열은 Normal.docm과 다르지 않다.)

 

 

이제 각 매크로를 포함한 문서 파일(Normal, DataHide)에서 olevba, OfficeMalScanner를 이용해서 소스코드를 추출한다.

 

(추출 과정 생략)

 

normal.docm 파일에서 추출된 결과들을 살펴보자.

둘 다 정상적으로 Powershell과 관련된 문자열이 잘 추출됐다.

olevba에서는 Powershell을 사용할지도 모른다고 알려주고 있다.

 

(olevba)

olevba 0.56 on Python 3.8.5 - http://decalage.info/python/oletools
===============================================================================
FILE: C:\Users\forgo\Desktop\normal.docm
Type: OpenXML
-------------------------------------------------------------------------------
VBA MACRO ThisDocument.cls 
in file: word/vbaProject.bin - OLE stream: 'VBA/ThisDocument'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
(empty macro)
-------------------------------------------------------------------------------
VBA MACRO Module1.bas 
in file: word/vbaProject.bin - OLE stream: 'VBA/Module1'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Sub Autoopen()
    MsgBox "Powershell BlaBlaBla!"
End Sub
+----------+--------------------+---------------------------------------------+
|Type      |Keyword             |Description                                  |
+----------+--------------------+---------------------------------------------+
|AutoExec  |Autoopen            |Runs when the Word document is opened        |
|Suspicious|Powershell          |May run PowerShell commands                  |
+----------+--------------------+---------------------------------------------+

 

(officemalscanner, module1)

Attribute VB_Name = "Module1"
Sub Autoopen()
    MsgBox "Powershell BlaBlaBla!"
End Sub

 

 

datahide.docm 파일에서 추출된 결과들을 살펴보자.

olevba에서는 문자열을 따로 난독화하지 않아서 Powershell 관련 문구가 발견되긴 했지만

소스코드와 관련된 결과만 봤을 때는 어떤 문자열을 출력하는지 알 수 없다.

officemalscanner에서도 마찬가지이다.

 

(olevba)

olevba 0.56 on Python 3.8.5 - http://decalage.info/python/oletools
===============================================================================
FILE: C:\Users\forgo\Desktop\DataHide.docm
Type: OpenXML
-------------------------------------------------------------------------------
VBA MACRO ThisDocument.cls 
in file: word/vbaProject.bin - OLE stream: 'VBA/ThisDocument'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
(empty macro)
-------------------------------------------------------------------------------
VBA MACRO UserForm1.frm 
in file: word/vbaProject.bin - OLE stream: 'VBA/UserForm1'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
(empty macro)
-------------------------------------------------------------------------------
VBA MACRO Module1.bas 
in file: word/vbaProject.bin - OLE stream: 'VBA/Module1'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Sub Autoopen()
    MsgBox UserForm1.ComboBox1
End Sub
-------------------------------------------------------------------------------
VBA FORM STRING IN 'word/vbaProject.bin' - OLE stream: 'UserForm1/o'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Powershell BlaBlaBla!
-------------------------------------------------------------------------------
VBA FORM Variable "b'ComboBox1'" IN 'word/vbaProject.bin' - OLE stream: 'UserForm1'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
b'Powershell BlaBlaBla!'
+----------+--------------------+---------------------------------------------+
|Type      |Keyword             |Description                                  |
+----------+--------------------+---------------------------------------------+
|AutoExec  |Autoopen            |Runs when the Word document is opened        |
|Suspicious|Powershell          |May run PowerShell commands                  |
|Suspicious|Hex Strings         |Hex-encoded strings were detected, may be    |
|          |                    |used to obfuscate strings (option --decode to|
|          |                    |see all)                                     |
+----------+--------------------+---------------------------------------------+

 

(officemalscanner, module1)

Attribute VB_Name = "Module1"
Sub Autoopen()
    MsgBox UserForm1.ComboBox1
End Sub

 

결론적으로 사용자 정의 폼을 프로젝트에 삽입하고 컨트롤을 생성하여 Text, Value 같은 속성에 데이터를 난독화하거나 인코딩하여 숨긴다면 정적 분석만으로 해당 프로그램이 어떤 행동을 하는지 상세히 알아내기는 힘들다.

 

실습에 사용한 파일을 업로드해놨다.

 

test.zip
0.03MB