Skip to content
Research & Insights

SANDS Lab continuously collects and analyzes real-world cyber threat intelligence, tracking the flow and context of advanced attacks, including APTs. Drawing on large-scale threat data accumulated over years and hands-on CTI operations experience, we conduct in-depth research into malware, attack infrastructure, data breaches, and AI security issues. Through our Tech Reports, we share how real-world threats are evolving, along with our technical analysis.

[06월 | 악성코드 분석 보고서] 최신 AgentTesla 악성코드의 다단계 로딩 구조와 유출 기법 분석

Jul 1, 2025Threat analysis

샌즈랩 위협 분석팀은 매월 악성코드를 선정하여 보고서를 작성합니다.

샌즈랩 위협 분석팀은 매월 악성코드를 선정하여 보고서를 작성합니다.

전문 분석을 통해 파악한 악성코드의 특징과 위협 동향, 연관 정보 등을 공유해 안전한 사이버 환경을 만들어 가고자 합니다.

악성코드에 대한 더 상세한 정보는 사이버 위협 인텔리전스 서비스 <CTX>에서 확인하실 수 있습니다.



1. 개요

AgentTesla는 2014년경 처음 등장한 이후 지속적으로 진화해 온 정보 탈취형 악성코드로, 2024년에도 전 세계에서 가장 많이 탐지된 악성코드 Top 10에 포함되며 여전히 높은 위험 수준을 유지한다. 특히 피싱 이메일을 통해 유포되며, 다양한 정보 수집 기능을 결합해 기업과 개인 사용자 모두에게 광범위한 피해를 초래한다.


분석 대상인 AgentTesla는 AutoIt 스크립트 기반 드로퍼를 사용해 초기 로딩을 수행한다. 드로퍼는 내부에 포함한 쉘코드를 복호화 한 뒤 메모리에 로드하고, 쉘코드는 프로세스 할로잉 기법을 통해 인포스틸러 페이로드를 실행한다. 이 과정은 명시적인 파일 생성을 최소화하고 모든 실행 흐름을 메모리 내에서 처리해 탐지를 회피한다. 또한, 정적 분석을 방해하기 위해 문자열 난독화, CRC32 해시 기반 API 동적 로딩, Export Table 수동 파싱 등 다양한 안티 분석 기법을 적용하며, VBS 스크립트를 시작 프로그램에 등록해 실행 지속성을 확보한다.

시스템 환경 탐지, 자격 증명 수집, 키로깅, SMTP 기반 정보 유출 등 AgentTesla 계열에서 공통적으로 수행하는 기능을 가지며, 특히 웹 브라우저뿐 아니라 이메일 클라이언트, VPN, FTP 클라이언트 등 다양한 애플리케이션에서 사용자 인증 정보를 폭넓게 탈취한다.


본 보고서는 악성코드의 전체 동작을 "AutoIt 스크립트 기반 초기 로딩", "쉘코드 복호화 및 실행", "인포스틸러의 정보 수집과 유출"이라는 세 단계로 나누어 분석하고, 각 단계에서 사용된 기술적 특징과 우회 기법을 상세히 설명한다. 이를 통해 최신 AgentTesla 계열 악성코드의 고도화된 탐지 회피 기술을 명확히 파악할 수 있다.




2. 악성코드 정보

분석에 사용한 악성코드는 "VALVES.bat", "Project-Materials-RJ700-P73Q800-Technical-Details-pdf.txt"처럼 정상 파일로 위장해 유포되지만, 실제로는 AutoIt 스크립트를 기반으로 Microsoft Visual C++로 컴파일한 PE 실행 파일이다. 이 실행 파일은 내부에 "Roca" "underbalanced"라는 두 개의 바이너리 리소스를 포함하며, 사용자가 유포 파일을 실행하면 AutoIt 스크립트가 두 리소스를 "%TEMP%" 디렉토리에 설치 및 복호화 해 최종 페이로드를 실행한다.


AutoIt 언어로 작성한 스크립트("script.au3")는 전체 감염 단계의 진입점으로, 실행 시 내부 인코딩 데이터를 복호화 한 뒤 실행한다. 이 스크립트는 함수 호출, API 이름, 문자열 등을 모두 분할하거나 사용자 정의 함수로 감싸 정적 분석을 어렵게 구성했으며, 전반적으로 의미 없는 변수, 함수 등을 삽입해 분석 혼란을 유도한다.



[그림 1] 난독화된 AutoIt 기반 스크립트 (“script.au3”)

[그림 1] 난독화된 AutoIt 기반 스크립트 (“script.au3”)


“script.au3”의 주요 동작은 다음과 같다.

① "Roca"와 "underbalanced" 바이너리를 "%TEMP%" 디렉토리에 복사한다.

② "Roca" 바이너리를 복호화 한 후 메모리에 로드하고 오프셋 9200부터 실행한다.


"Roca"는 복호화 후 실행되는 x86 기반 쉘코드로, 최종 페이로드인 인포스틸러("underbalanced")를 메모리에 로드하는 중간 로더 역할을 수행한다. 먼저 하드코딩된 XOR 키로 "underbalanced" 페이로드를 복호화하고, 특정 프로세스를 일시 정지 상태로 생성한 뒤 복호화 된 페이로드를 해당 프로세스에 주입하는 프로세스 할로잉 기법으로 실행을 이어간다.

이때 쉘코드는 API 호출 시 함수명을 직접 참조하지 않고, CRC32 해시 기반의 동적 로딩 방식을 사용한다. 이를 위해 PEB 구조에 직접 접근하고, 각 DLL의 Export Table을 수동으로 파싱 해 필요한 API 주소를 추출하는 고도화된 우회 기법도 적용했다. 또한 디버깅 여부를 탐지하는 로직도 포함되어 있어 분석 환경에서의 실행을 회피할 수 있다. 실행 지속성을 위해 "Roca"는 초기 유포 파일을 "eupolyzoan.exe"라는 이름으로 "%LOCALAPPDATA%\recomplaint" 경로에 복사한 뒤, 시작 프로그램 폴더에 “eupolyzoan.exe”를 실행하는 VBS 스크립트를 생성해 시스템 부팅 시 자동 실행되도록 설정한다.


최종 페이로드인 "underbalanced"는 Microsoft Visual C# 기반의 .NET 실행 파일이며, 인포스틸러 기능을 수행한다.

코드 내부에는 함수명과 변수명을 의미 없는 문자열로 치환하고, 불필요한 분기와 흐름 제어를 삽입해 정적 분석을 방해한다.



[그림 2] “underbalanced”의 흐름 제어 및 난독화 예시

[그림 2] “underbalanced”의 흐름 제어 및 난독화 예시


"underbalanced"는 감염된 시스템에서 웹 브라우저, 이메일 클라이언트, FTP/VPN 클라이언트 등에 저장된 자격 증명, 시스템 정보, 실시간 키보드 입력 로그를 수집한다. 수집한 정보는 취합하여 HTML 형식으로 변환한 후, 내부에 하드코딩된 SMTP 서버 주소 "smt.treat@yandex.com"으로 전송한다. 이를 통해 공격자가 외부에서 실시간으로 수신할 수 있도록 구성되어 있다.


다음은 보고서에서 기술한 악성코드 구성 파일과 그 역할을 정리한 표이다.

파일명

설명 및 역할

VALVES.bat

최초 유포 실행 파일로, AutoIt 스크립트 실행

script.au3

AutoIt 기반 스크립트, Roca 복호화 후 Fileless 로딩

Roca

x86 쉘코드, underbalanced 복호화 후 프로세스 할로잉 및 시작 프로그램 등록

underbalanced

인포스틸러, 정보 수집/유출

[표 1] 악성코드 구성 파일 및 역할


결론적으로 이 악성코드는 AutoIt 드로퍼, x86 쉘코드 로더, .NET 인포스틸러가 계층적으로 구성된 다단계 감염 구조를 따르며, 파일 위장, 메모리 기반 실행, 안티 분석 기법, 프로세스 할로잉 등 다양한 기술을 정교하게 결합해 탐지를 회피하고 악성 행위를 지속하는 고도화된 사례로 평가할 수 있다.




3. 악성코드 동작 순서

공격자는 "VALVES.bat", "Project-Materials-RJ700-P73Q800-Technical-Details-pdf.txt"처럼 정상 파일로 위장한 실행 파일을 유포한다. 사용자가 해당 파일을 실행하면, 먼저 내부에 포함된 AutoIt 기반 드로퍼("script.au3")가 동작한다.

"script.au3"는 내장된 두 개의 리소스("Roca", "underbalanced")를 "%TEMP%" 경로에 복사한 뒤, 사용자 정의 복호화 루틴을 통해 "Roca"를 복원하고 오프셋 9200 지점부터 메모리에서 직접 실행한다. 이 과정은 파일을 생성하지 않고 Fileless 방식으로 수행해 분석을 회피한다.


복호화 된 "Roca"는 초기 유포 파일을 "eupolyzoan.exe"라는 이름으로 복사하고, 이 복사본을 실행한 다음 현재 프로세스를 종료한다.

이어서 "eupolyzoan.exe"는 "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup" 경로에 자신을 실행하는 "eupolyzoan.vbs"라는 VBS 스크립트를 생성해 자동 실행 항목에 등록하고, 시스템이 재부팅된 이후에도 악성 행위가 지속되도록 만든다.


이후 "eupolyzoan.exe"는 "underbalanced"를 메모리에 로드한 뒤, 하드코딩된 키를 활용해 XOR 방식으로 복호화하고, 인젝션 대상이 되는 정상 프로세스("svchost.exe" 또는 "RegSvcs.exe")를 생성한다. 생성한 프로세스에 복호화 한 "underbalanced"를 주입하는 프로세스 할로잉으로 최종 페이로드를 은밀하게 실행한다.


"underbalanced"가 실행되면 다음과 같은 정보를 수집한다.

- 웹 브라우저, 이메일, FTP, VPN 클라이언트에 저장된 로그인 자격 증명

- 사용자 이름 및 컴퓨터 이름, 운영체제 이름, CPU 모델명, 메모리 용량

- 키 입력 로그


수집한 정보는 HTML 형식으로 정리한 후, 외부 SMTP 서버 "smt.treat@yandex.com"으로 전송된다.



[그림 3] 악성코드 동작 순서도

[그림 3] 악성코드 동작 순서도




4. 악성코드 분석

4.1. AutoIt 스크립트를 이용한 초기 페이로드 로딩

초기 실행 파일은 AutoIt 언어로 작성된 스크립트("script.au3")를 기반으로 동작하는 드로퍼이며, 전체 스크립트에는 난독화가 적용되어 있다. 함수명, 문자열, API 이름은 모두 문자열 결합이나 사용자 정의 함수 호출 방식으로 구성되어 있으며, AutoIt의 기본 함수인 "Call"도 분할된 문자열을 통해 실행한다. VirtualProtect와 같은 주요 API는 암호화된 숫자 배열을 평문으로 복원한 뒤 호출하여 정적 분석을 방해한다. 이에 따라 본 분석에서는 난독화 로직을 수동으로 해제하고, 기능 단위로 스크립트를 재구성해 설명한다.



[그림 4] 난독화된 AutoIt 스크립트 예시 ("script.au3")

[그림 4] 난독화된 AutoIt 스크립트 예시 ("script.au3")


스크립트는 "Roca" 파일을 "%TEMP%" 경로에 생성하고, 파일 전체를 읽은 뒤 사용자 정의 복호화 루틴을 실행한다. 이 복호화 과정에서는 문자열을 "' & '" 구분자로 나누고, 각 문자열을 숫자로 변환한 다음 -5¹를 연산해 다시 문자열로 되돌리는 방식으로 진행된다. 이 과정을 통해 메모리 상에 존재하는 "Roca"의 원본 바이너리를 복원한다.

¹ 4294967291의 2의 보수는 -5이다



[그림 5] 사용자 정의 복호화 함수

[그림 5] 사용자 정의 복호화 함수


"Roca"를 복호화 한 뒤, 스크립트는 동일한 방식으로 "underbalanced" 파일도 "%TEMP%" 경로에 생성한다. 이후 복호화 한 "Roca" 바이너리가 위치한 메모리 영역에 읽기/쓰기/실행 권한을 부여하고, 오프셋 9200 지점을 진입점으로 지정해 CallWindowProc API로 메모리 내에서 직접 실행을 시작한다. 이 방식은 "Roca"를 디스크에 드롭하거나 독립적인 PE 실행 파일로 실행하는 전통적인 방식과 달리, 전체 코드를 메모리에서 직접 실행한다는 점에서 Fileless 기법의 전형적인 사례다. 이를 통해 보안 제품의 탐지를 우회하며, 실행 흔적을 시스템에 남기지 않는다.



[그림 6] VirtualProtect 권한 부여 및 CallWindowProc 호출

[그림 6] VirtualProtect 권한 부여 및 CallWindowProc 호출


4.2. Roca 쉘코드를 통한 인포스틸러 로딩 및 실행

복호화 된 "Roca"는 x86 기반의 쉘코드로, 인포스틸러 페이로드인 "underbalanced"를 메모리에 로드하고 실행하는 중간 로더 역할을 수행한다.



[그림 7] 복호화 된 "Roca"의 진입점 코드

[그림 7] 복호화 된 "Roca"의 진입점 코드


"Roca"는 정적 분석을 회피하기 위해 Windows API 함수명을 코드에 직접 명시하지 않고 CRC32 해시 기반의 동적 로딩 기법을 사용한다. 이 기법은 DLL 파일의 PE 구조 내 Export Table을 직접 파싱하고, 각 함수명에 대해 해시값을 계산한 뒤 목표 해시와 일치하는 함수 주소를 찾아낸다.


"Roca"가 동적으로 로딩하는 대상은 다음과 같다.

- "kernel32.dll": 37개 API 함수

- "user32.dll": 1개 API 함수

- "advapi32.dll": 3개 API 함수

- "shlwapi.dll": 1개 API 함수

- "shell32.dll": 2개 API 함수


API 함수 주소를 찾기 위해 "Roca"는 먼저 PEB(Process Environment Block)에 접근하고, 로드된 DLL 리스트를 순회하며 "BaseDllName" 값을 비교해 각 DLL의 ImageBase 주소를 확보한다.



[그림 8] PEB 구조를 통해 로드된 DLL의 Base 주소 획득

[그림 8] PEB 구조를 통해 로드된 DLL의 Base 주소 획득


이후 각 DLL의 Export Table을 파싱 하여 함수 이름 테이블, 함수 주소 테이블, Ordinal 테이블을 기반으로 함수명을 순회하고, CRC32 해시값을 비교해 최종적으로 함수 주소를 찾는다.



[그림 9] Export Table 파싱을 통한 API 주소 동적 획득 과정

[그림 9] Export Table 파싱을 통한 API 주소 동적 획득 과정


"Roca"는 안티 디버깅 기능도 포함한다. Sleep(500ms)을 호출한 직후 실제 경과 시간을 측정해 0.5초보다 짧을 경우 디버깅 환경으로 판단하고 프로세스를 종료한다.



[그림 10] 디버깅 탐지 로직

[그림 10] 디버깅 탐지 로직


이후 "Roca"는 현재 실행 중인 프로세스인 “VALVES.bat”를 "eupolyzoan.exe"라는 이름으로 “%LOCALAPPDATA%\recomplaint” 경로에 복사한 뒤, 해당 복사본을 실행한다.



[그림 11] “eupolyzoan.exe” 파일 생성에 사용되는 매개변수 설정

[그림 11] “eupolyzoan.exe” 파일 생성에 사용되는 매개변수 설정



[그림 12] 현재 실행 중인 “VALVES.bat” 내용 메모리로 읽기

[그림 12] 현재 실행 중인 “VALVES.bat” 내용 메모리로 읽기



[그림 13] “eupolyzoan.exe” 파일에 “VALVES.bat” 바이너리 쓰기

[그림 13] “eupolyzoan.exe” 파일에 “VALVES.bat” 바이너리 쓰기


생성된 "eupolyzoan.exe"는 "VALVES.bat"의 복사본으로 동일한 로직을 반복하지만, 내부 조건문을 통해 자신이 복사본임을 인식하고 실행 흐름을 분기한다. 이후 시작 프로그램 경로("%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup")에 자신을 실행하는 "eupolyzoan.vbs" 파일을 작성하여 시스템 부팅 시 자동으로 실행되도록 설정한다.


생성된 VBS 스크립트의 내용은 다음과 같다.

Set WshShell = CreateObject("WScript.Shell")

WshShell.Run "C:\Users\<사용자명>\AppData\Local\recomplaint\eupolyzoan.exe ", 1

Set WshShell = Nothing

이 방식은 레지스트리 대신 VBS 파일을 이용해 실행 지속성을 확보하므로, 일부 보안 솔루션의 탐지를 우회할 수 있다.


이후 "eupolyzoan.exe"는 "underbalanced"를 메모리에 로드한 뒤, 내부에 하드코딩된 키 "X0OHZLDCON3SG6XP92NOHLNH"를 사용해 XOR 방식으로 복호화 한다. 복호화가 완료되면, 악성코드는 다음 중 하나의 정상 프로세스를 일시정지 상태로 생성하고, 복호화 한 "underbalanced"를 주입해 프로세스 할로잉을 수행한다.

- "C:\Windows\System32\svchost.exe"

- "C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegSvcs.exe"

- "C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegSvcs.exe"


생성된 프로세스에서는 원래 로드된 실행 파일을 언매핑하고, 복호화 한 "underbalanced"를 메모리에 새로 매핑한 뒤 섹션 정보를 재구성한다. 이후 엔트리 포인트를 변경하고 프로세스를 재개해 악성코드의 실행을 시작한다. 이러한 일련의 과정은 디스크에 별도의 흔적을 남기지 않고 정상 프로세스 내부에 악성코드를 은닉해 실행함으로써 탐지를 회피한다. 결국 "Roca"는 단순한 쉘코드가 아니라, 인포스틸러 실행을 위한 복호화, 프로세스 할로잉, 실행 지속성 확보 등의 기능을 수행하는 다기능 로더 역할을 한다.



[그림 14] 기존 메모리 언매핑 및 underbalanced 매핑

[그림 14] 기존 메모리 언매핑 및 underbalanced 매핑



[그림 15] 엔트리 포인트 변경 및 프로세스 재개

[그림 15] 엔트리 포인트 변경 및 프로세스 재개


4.3. underbalanced 인포스틸러의 정보 수집 및 유출 기능

4.3.1. 환경 우회 및 안티 분석 기법

“underbalanced”는 정보 수집 및 유출에 앞서 다양한 분석 회피 기법을 먼저 실행한다. 악성코드는 HTTPS 통신 시 인증서 검증을 무력화해 통신 안정성을 확보하고, 디버깅 여부, 가상 환경, 시스템 시간 조작 여부를 확인해 실행 환경을 점검한다. 이러한 탐지 결과에 따라 프로그램이 종료된 것처럼 위장함으로써 분석을 방해한다.


먼저 악성코드는 .NET 통신 과정에서 서버 인증서 유효성을 검사하는 ServerCertificateValidationCallback에 항상 true를 반환하는 콜백 함수를 등록해, HTTPS 인증서를 무조건 신뢰하게 한다. 이를 통해 유효하지 않거나 자체 서명된 인증서도 문제없이 통과시킨다. 또한 SSL3부터 TLS 1.2까지 프로토콜을 사용하도록 설정해 공격자의 C2 서버와 안정적으로 통신할 수 있도록 조치한다. 이러한 구성을 통해 탐지 회피뿐 아니라, 인증 오류에 따른 연결 실패를 예방하기 위한 목적도 확인할 수 있다.



[그림 16] 인증서 검증 우회 로직

[그림 16] 인증서 검증 우회 로직



[그림 17] HTTP 통신 시 사용할 보안 프로토콜 설정

[그림 17] HTTP 통신 시 사용할 보안 프로토콜 설정


이후 악성코드는 다섯 가지 조건을 기준으로 실행 환경을 점검하고, 하나라도 조건에 부합할 경우 Application.Exit()을 호출해 프로그램이 종료된 것처럼 위장한다. 다만, 이 호출은 실제 종료로 이어지지 않으며, Application.Run() 등과 같은 실행 루틴과의 연결도 존재하지 않는다. 즉, 해당 코드는 분석자가 프로그램이 종료된 것으로 오인하게 만들기 위한 장치이며, Application.Exit() 호출 후에도 내부 악성 행위는 중단되지 않고 계속 진행된다. 실행 환경 점검 항목은 다음과 같다.



[그림 18] 실행 환경 점검 로직

[그림 18] 실행 환경 점검 로직


① 디버깅 환경 탐지

CheckRemoteDebuggerPresent API를 호출해 현재 프로세스에 디버거가 연결되어 있는지 확인한다. 연결 상태일 경우 분석 환경으로 간주한다.



[그림 19] 디버깅 환경 탐지 로직

[그림 19] 디버깅 환경 탐지 로직


② 호스팅 환경 탐지

외부 API "http://ip-api.com/line/?fields=hosting"을 호출하고, 응답이 "true"이면 호스팅 환경으로 간주한다.



[그림 20] 호스팅 환경 탐지 API 호출

[그림 20] 호스팅 환경 탐지 API 호출


③ 시스템 시간 조작 탐지

Thread.Sleep(10) 호출 전후로 시스템 Tick 값을 비교한다. 경과 시간이 10L²보다 짧을 경우 Sleep 함수가 후킹 되었거나 시간 조작이 일어난 것으로 판단해 분석 환경으로 간주한다.

² 10L = 1,000ns



[그림 21] 시간 조작 탐지

[그림 21] 시간 조작 탐지


④ 분석 도구 관련 DLL 탐지

다음 DLL 중 하나라도 프로세스에 로드되어 있는 경우 분석 환경으로 간주한다.

- "SbieDll.dll" (Sandboxie)

- "SxIn.dll" (360 SOFTWARE)

- "Sf2.dll" (Avast)

- "snxhk.dll" (Avast)

- "cmdvrt32.dll" (Comodo Container)


⑤ 가상 머신 탐지

WMI 쿼리를 통해 시스템 제조사 및 GPU 정보를 확인한다. 아래 조건 중 하나라도 만족하면 가상 환경으로 간주한다.

- "Win32_ComputerSystem.Manufacturer"가 "Microsoft Corporation"이고 "Win32_ComputerSystem.Model"에 "VIRTUAL"이 포함됨

- "Win32_ComputerSystem.Manufacturer" 또는 "Win32_ComputerSystem.Model"에 "vmware" 또는 "VirtualBox" 포함

- "Win32_VideoController.Name"에 "VMware"와 "VBox"가 동시에 존재 (단, 이 조건은 논리 오류 포함)


이러한 탐지 로직은 악성코드가 분석 도구나 가상 환경에 노출되는 것을 인지하고 분석을 회피하기 위한 방어 전략이다.

특히, 실행을 중단한 것처럼 보이게 위장하는 방식은 실제 악성 행위의 분석을 어렵게 만든다.


4.3.2. 시스템 정보 수집

“underbalanced”는 먼저 감염된 시스템의 고유 식별 정보를 수집한다. 가장 우선적으로 하드웨어 기반 식별자인 HWID를 생성하며, 이를 위해 다음 세 가지 값을 추출한다.

- 메인보드 일련번호: "Win32_BaseBoard.SerialNumber"

- CPU 고유 ID: "Win32_Processor.ProcessorId"

- MAC 주소: "Win32_NetworkAdapterConfiguration.MACAddress" (IPEnabled 속성이 true인 첫 번째 어댑터 기준)


악성코드는 이 값을 연결한 뒤 고유한 HWID 값을 생성하며, 이를 피해자 식별 정보로 활용할 수 있다.



[그림 22] HWID 생성을 위한 시스템 고유 식별자 수집 및 해싱 처리

[그림 22] HWID 생성을 위한 시스템 고유 식별자 수집 및 해싱 처리


이와 함께 악성코드는 다음과 같은 실행 관련 정보를 추출해 내부 변수로 저장한다.

- 현재 실행 중인 프로세스의 전체 경로

- 하드코딩된 디렉토리 및 실행 파일 경로

- 로그인된 사용자명 및 컴퓨터 이름


또한 설정값에 따라 외부 API에 요청 후 응답 결과를 추가로 수집할 수도 있다. 해당 기능이 활성화되어 있을 경우, 악성코드는 설정된 외부 API로 HTTP 요청을 전송하고, 응답 내용을 저장한다. 하지만 본 보고서에서 분석한 악성코드에서는 이 설정이 비활성화된 상태여서 실제 요청은 발생하지 않았다.


이처럼 악성코드는 다양한 식별 정보를 수집해 향후 조건부 명령 실행, 시스템 구분, 피해자 추적 등에 활용할 기반을 마련한다.



[그림 23] 실행 디렉토리 및 사용자 정보 저장 구조

[그림 23] 실행 디렉토리 및 사용자 정보 저장 구조


4.3.3. 자격 증명 수집

“underbalanced”는 감염된 시스템에서 웹 브라우저, 이메일 클라이언트, FTP 클라이언트, VPN 등 다양한 애플리케이션에 저장된 자격 증명을 수집한다. 먼저 악성코드는 로그인 정보가 저장된 브라우저 사용자 프로필 경로를 확보하기 위해 내부에 하드코딩된 경로들을 기반으로 Chromium 및 Mozilla 계열 브라우저를 등록한다. 등록 대상 브라우저는 다음과 같다.


- Chromium 계열

Opera Browser, Yandex Browser, Iridium Browser, Chromium, 7Star, Torch Browser, Cool Novo, Kometa, Amigo, Brave, CentBrowser, Chedot, Orbitum, Sputnik, Comodo Dragon, Vivaldi, Citrio, 360 Browser, Uran, Liebao Browser, Elements Browser, Epic Privacy, Coccoc, Sleipnir 6, QIP Surf, Coowon, Chrome, Edge Chromium


- Mozilla 계열

Firefox, SeaMonkey, Thunderbird, BlackHawk, CyberFox, K-Meleon, IceCat, PaleMoon, IceDragon, WaterFox, Postbox, Flock


악성코드는 이 경로들을 이후 브라우저 자격 증명 추출의 기준 경로로 활용한다.



[그림 24] 브라우저 프로필 경로 등록 로직

[그림 24] 브라우저 프로필 경로 등록 로직


이후 악성코드는 자격 증명 수집기 목록에 애플리케이션별 수집기를 등록한다. 수집 대상 애플리케이션은 다음과 같이 분류된다.


- 웹 브라우저

Chromium, Mozilla, Internet Explorer/Edge, UC Browser, QQ Browser, Safari, Falkon

- 메일 클라이언트

Outlook, Windows Mail, The Bat!, Becky!, IncrediMail, Eudora, Claws Mail, FoxMail, Opera Mail, Mailbird, eM Client, PocoMail

- FTP 클라이언트

FileZilla, WinSCP, CoreFTP, FlashFXP, FTP Navigator, SmartFTP, WS_FTP, FTP Commander, FTPGetter

- VPN 및 보안 소프트웨어

OpenVPN, NordVPN, Private Internet Access

- 기타 애플리케이션

Windows Credential Store, VNC, Discord, Trillian, Psi, MySQL Workbench, Internet Download Manager(IDM), JDownloader



[그림 25] 자격 증명 수집기 등록 및 실행 흐름

[그림 25] 자격 증명 수집기 등록 및 실행 흐름


모든 수집기를 등록한 뒤, 악성코드는 각 수집기를 순회하면서 저장된 자격 증명을 추출한다. 수집기는 애플리케이션별 설정 파일, 데이터베이스, 구성 파일 등에서 자격 증명 정보를 찾아내며, 수집한 결과를 리스트에 누적한다.



[그림 26] 등록된 수집기 순회 및 Grab() 메서드 실행

[그림 26] 등록된 수집기 순회 및 Grab() 메서드 실행


수집한 자격 증명 리스트는 HTML 형식 문자열로 변환해, SMTP 전송 방식으로 외부 서버에 전달한다.

전체 루틴에는 예외 처리가 포함되어 있어 일부 수집기에서 오류가 발생하더라도 전체 수집 과정에는 영향을 주지 않는다. 이 구조는 다양한 환경에서도 안정적인 정보 수집을 가능하게 하여, 애플리케이션에서 자격 증명 정보를 효과적으로 추출할 수 있도록 설계되어 있다.


4.3.4. SMTP 전송을 통한 정보 유출

“underbalanced”는 수집한 자격 증명과 시스템 정보를 외부 SMTP 서버로 전송한다. 먼저, 다음과 같은 시스템 정보를 수집한 뒤, 이를 HTML 형식의 문자열로 구성한다.

- 현재 시간

- 사용자 이름 및 컴퓨터 이름

- 운영체제 이름

- CPU 모델명

- 메모리 용량

- (조건부) 공용 IP 주소


이후 수집한 자격 증명 정보와 시스템 정보를 포함한 HTML 내용을 기반으로 .html 확장자의 파일을 생성하고, 이를 첨부파일로 활용한다. 파일명은 "PW_사용자명/컴퓨터명_yyyy_MM_dd_HH_mm_ss.html" 형식으로 지정하며, 이메일 본문 없이 첨부 파일만 포함한 상태로 전송한다.


SMTP 전송 설정은 내부에 하드코딩되어 있으며, 다음과 같은 고정 값이 사용된다.

- 발신자 계정: "airlet@nffplp.com" / 발신자 비밀번호: "$Nke%8XIIDtm"

- 수신자 계정: "smt.treat@yandex.com"


SMTP 전송은 587번 포트를 사용해, TLS 기반 보안 연결(STARTTLS)을 통해 이뤄진다.

이때 시스템에 저장된 인증 정보를 사용하지 않고, 코드에 하드코딩된 계정 정보를 이용해 SMTP 서버에 로그인한다.



[그림 27] SMTP 서버와의 통신 및 STARTTLS 명령을 통한 TLS 전환 흐름

[그림 27] SMTP 서버와의 통신 및 STARTTLS 명령을 통한 TLS 전환 흐름


이처럼 악성코드는 탈취한 데이터를 외부 공격자의 SMTP 서버로 전송하는 기능까지 수행한다. 전송 과정에서 사용하는 이메일 주소와 SMTP 인증 정보는 모두 하드코딩되어 있었으며, 분석 당시 실제 운영 중인 SMTP 서버와의 통신 흔적도 확인되었다.


4.3.5. 키로깅 및 주기적 정보 전송

“underbalanced”는 시스템 전역의 키 입력을 실시간으로 감시하는 키로깅 기능을 수행한다.

악성코드는 사용자의 모든 입력을 기록하며, 이를 주기적으로 외부 서버로 전송한다. 먼저 SetWindowsHookEx API를 호출해 시스템 전체의 키보드 입력을 가로채고, 콜백 함수가 사용한 키 값을 문자열로 변환해 기록한다. 입력값을 처리할 때는 키 종류에 따라 다음과 같은 규칙을 따른다.

- 일반키: “a”, “1” 등 (CapsLock, Shift 상태를 반영해 대소문자를 정확히 기록)

- 방향키: {KEYUP}, {KEYDOWN}, {KEYLEFT}, {KEYRIGHT}

- 기능키: {F1} ~ {F12}

- 제어키: {CTRL}, {ALT+TAB}, {ALT+F4}, {Win}

- 편집키: {BACK}, {TAB}, {DEL}, {Insert}

- 입력키: {ENTER}, 공백(Space)

- 기타: {ESC}, {CAPSLOCK}, {HOME}, {END}, {PageUp}, {PageDown}, {NumLock}

- 창이 전환될 경우, 현재 포커스 된 창의 제목도 함께 기록


악성코드는 30분을 주기로 키 입력 로그를 전송하며, 이 주기적 전송 과정은 다음과 같은 순서로 반복된다.


① 먼저 "%TEMP%\log.tmp" 파일의 존재 여부를 확인한다.

② 파일이 존재하지 않으면, 현재 수집된 키 입력 로그와 시스템 정보를 HTML 포맷으로 구성한 뒤, "KL_사용자명/컴퓨터명_yyyy_MM_dd_HH_mm_ss.html" 형식의 파일명으로 SMTP 전송을 시도한다.

③ 전송에 실패할 경우, 해당 키 입력 데이터를 HTML 형식으로 변환해 "log.tmp" 파일에 저장한다.

④ 반대로 "log.tmp" 파일이 존재할 경우, 먼저 그 내용을 시스템 정보와 함께 HTML 파일로 구성한 뒤 동일한 파일명으로 SMTP 전송을 수행한다.

⑤ 이때 전송이 성공하면 "log.tmp" 파일을 삭제한다.

⑥ 이어서 현재 수집된 키 입력 로그에 대해서도 동일한 제목 형식으로 SMTP 전송을 시도하며, 실패할 경우 "log.tmp"에 다시 저장한다.



[그림 28] 키로깅 정보의 SMTP 전송 흐름

[그림 28] 키로깅 정보의 SMTP 전송 흐름


클립보드 감시 기능도 포함하고 있지만, 이는 설정값에 따라 활성화된다.

해당 기능이 켜져 있을 경우, 악성코드는 클립보드 내용이 이전과 달라질 때만 값을 기록하며, HTML 해석 오류를 막기 위해 "<", ">" 등의 문자를 이스케이프 처리한다. 또한, 스크린샷 캡처 기능은 코드에 설정값만 존재하고 실제 이미지 수집 및 전송 루틴은 구현하지 않았다. 따라서 관련 기능은 비활성화 상태이며, 코드 구조상 존재하더라도 실질적인 행위는 발생하지 않는다.


반면, 키보드 입력 감시 기능은 특수키 구분, 창 전환 감지 등 세부 로직까지 포함된 정교한 구조로 구성돼 있다. 이러한 구성은 공격자가 시각적인 정보보다 사용자가 직접 입력한 정보에 집중하고 있음을 보여준다. 즉, 로그인 시 입력되는 계정 정보(ID/PW), 이메일 작성 내용, 사내 메신저 대화, URL 등 민감한 텍스트 기반 정보를 수집하는 데 목적이 있다.




5. 수집/유출 정보

구분

세부 정보

대상 프로그램/기술

웹 브라우저

- URL

- ID

- 비밀번호

# Chromium

Opera Browser,Yandex Browser,Iridium Browser,Chromium,7Star,Torch Browser,Cool Novo,Kometa,Amigo,Brave,CentBrowser,Chedot,Orbitum,Sputnik,Comodo Dragon,Vivaldi,Citrio,360 Browser,Uran,Liebao Browser,Elements Browser,Epic Privacy,Coccoc,Sleipnir 6,QIP Surf,Coowon,Chrome,Edge Chromium

# Mozilla

Firefox,SeaMonkey,Thunderbird,BlackHawk,CyberFox,K-Meleon, IceCat,PaleMoon,IceDragon,WaterFox,Postbox,Flock

# 기타

Internet Explorer Microsoft Edge, UCBrowser, QQBrowser, Safari, Falkon

메일 클라이언트

- 서버 주소

- 사용자 이메일

- 비밀번호

Outlook, WindowsMail, TheBat, Becky, IncrediMail, Eudora, ClawsMail, FoxMail, OperaMail, PocoMail, EmClient, Mailbird

FTP 클라이언트

- FTP 서버 주소 + 포트

- 사용자명

- 비밀번호

FileZilla, WinScp, CoreFtp, FlashFxp, FtpNavigator, SmartFtp, WSFtp, FtpCommander, FTPGetter

VPN

- VPN 식별자

- 사용자명

- 비밀번호

OpenVpn, NordVpn, PrivateInternetAccess

기타 프로그램

# Windows, Psi, MySqlWorkbench, IDM, JDownloader

- 대상 서비스

- 사용자계정

- 비밀번호

# Vnc

- 접속 비밀번호

- VNC 프로그램 이름

# Discord

- Discord 인증 토큰

# Trillian

- 계정 이름

- 비밀번호

Windows Credential Store, Vnc, Discord, Trillian, Psi, MysqlWorkbench, IDM, JDownloader

기본 시스템 정보

- 사용자 이름

- 컴퓨터 이름

- 현재 시간

- 운영 체제

- CPU 모델

- 시스템 메모리 용량

.

키 입력 정보

- 사용자가 입력한 키보드 값

키보드 후킹 API




6. 결론

본 보고서에서 분석한 악성코드는 AutoIt 기반 드로퍼, x86 쉘코드 로더, .NET 기반 인포스틸러로 구성된 다단계 구조를 바탕으로 정교하게 설계된 정보 탈취형 악성코드다. 실행 과정에서 실질적인 파일 생성을 최소화하고, 메모리 기반 로딩과 프로세스 할로잉을 통해 악성 페이로드를 은닉한 채 실행함으로써 탐지를 회피한다. 여기에 시작 프로그램 등록 등을 통해 실행 지속성을 확보하며, 자격 증명 수집, 키로깅 등 다양한 정보를 수집해 외부로 유출한다.


분석 결과, 해당 악성코드는 구조 구성과 동작 방식 전반에서 AgentTesla 계열 악성코드와 높은 유사성을 보인다.

구체적인 공통점은 다음과 같다.


✅ 인포스틸러 본체를 다단계 로딩 구조로 실행하며, Fileless 기법을 사용함

✅ 인포스틸러가 .NET 언어로 작성됨

✅ 웹 브라우저, 이메일 클라이언트, VPN 등 다양한 애플리케이션의 자격 증명을 수집함

✅ 수집 정보를 HTML 기반 포맷으로 정리하고, .html 파일로 구성함

✅ "PW_사용자명/컴퓨터명_yyyy_MM_dd_HH_mm_ss.html" 형식의 파일명을 사용함

✅ 하드코딩된 계정 정보를 활용해 SMTP로 외부 전송을 수행함


이러한 유사성은 단순한 기능 일치 수준을 넘어서, AgentTesla의 변형 또는 커스텀 빌드 샘플로 판단할 수 있는 근거를 제공한다. 따라서 초기 유포 방식도 AgentTesla에서 자주 활용된 피싱 이메일 기반의 공격일 가능성이 높다.


해당 악성코드는 수집한 데이터를 외부 SMTP 서버로 전송하는데, 발신 계정으로 사용된 "airlet@nffplp.com"은 태국 식품 회사 공식 도메인("nffplp.com")에 등록된 이메일 주소다. 웹사이트 접속 결과, 도메인은 현재도 정상적으로 운영 중인 상태로 확인되며, 공격자가 SMTP 인증용으로 실제 기업 이메일 계정을 탈취해 악용했을 가능성이 크다.



[그림 29] 공격자가 악용한 것으로 추정되는 정식 기업 도메인 “nffplp.com”

[그림 29] 공격자가 악용한 것으로 추정되는 정식 기업 도메인 “nffplp.com”


수신자는 “smt.treat@yandex.com”이며, 러시아 포털 Yandex 도메인에 등록된 이메일 계정이다.

Yandex는 러시아에서 가장 널리 사용되는 포털이자 검색엔진으로, 해당 메일 계정의 사용자는 러시아어 기반 환경에 익숙한 인물일 가능성이 높고, 공격자의 국적 또는 활동 권역을 추정할 수 있는 간접적인 정황으로 해석할 수 있다.



[그림 30] 수신자 이메일이 등록된 Yandex 서비스 로그인 화면

[그림 30] 수신자 이메일이 등록된 Yandex 서비스 로그인 화면


결론적으로, 본 악성코드는 단순히 정보를 탈취하는 데 그치지 않고, 탐지 회피, 실행 지속성 확보, 정식 도메인을 활용한 유출 경로 위장까지 포함하는 고도화된 인포스틸러이다. AgentTesla 계열에서 지속적으로 관찰된 전형적인 기술적 특성을 다수 갖추고 있으며, 향후 다양한 변종 형태로 재등장할 가능성도 높다.

특히 정상 기업의 이메일 서버를 유출 경로로 악용한 방식은 보안 솔루션의 탐지를 우회하려는 전략으로 해석되며, 공격자가 정보 수집부터 탈취에 이르기까지 고도화된 기법을 활용한 정황이 뚜렷하게 드러난다. 이에 따라 유사 위협에 대비하기 위해서는 SMTP 전송 이상 행위에 대한 모니터링 강화 등 선제적인 탐지 체계를 마련할 필요가 있다.


한편, 해당 악성코드는 샌즈랩 CTX 플랫폼에서도 “exe.trojan.autoit” 탐지명으로 식별되었으며, 관련된 실행 파일과 함께 다양한 IoC 정보를 확인할

수 있다. 확인된 IoC에는 악성 파일 해시, 관련 IP, 통신에 사용된 도메인 등을 포함하고 있으며, 이는 유사 샘플 탐지 및 추적에 활용될 수 있다.



[그림 31] 샌즈랩 CTX에서 "exe.trojan.autoit"으로 탐지된 악성 파일 및 관련 IoC 연관 정보

[그림 31] 샌즈랩 CTX에서 "exe.trojan.autoit"으로 탐지된 악성 파일 및 관련 IoC 연관 정보




7. IoC 정보

7.1. sha 256 해시

52AC94D05D81C00FAA5FFB989BA1B631B88790DEB41F8F982C120FBA5754F4D3

VALVES.bat / eupolyzoan.exe

2528904D8CF3D26B81573B487BFD63F8DC052CB2A9F4A1B9A643FBD9B6C4BDA5

Roca

ABC3718AD048C24D81C4C4CDFD42205C9C180EB38C193C98427AD30A5D0B736D

underbalanced

4C74DEF4B786FD0F26C3D635A0A305F301E6275064400A2153A355A8EB40F934

eupolyzoan.vbs


7.2. IP

TCP 163.44.198.71:587


7.3. 도메인

nffplp.com


7.4. SMTP

smt.treat@yandex.com

airlet@nffplp.com (PW: $Nke%8XIIDtm)


7.5. 파일 드롭 경로

C:\Users\<사용자명>\AppData\Loca\Temp\Roca

C:\Users\<사용자명>\AppData\Loca\Temp\underbalanced

C:\Users\<사용자명>\AppData\Loca\recomplaint\eupolyzoan.exe

C:\Users\<사용자명>\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\eupolyzoan.vbs