정상 프로젝트를 위장한 Github 저장소를 통해 SmartLoader 악성코드 유포
AhnLab SEcurity intelligence Center(ASEC) 에서는 최근 Github 저장소를 통해 SmartLoader 악성코드가 다수 유포되고 있는 정황을 확인하였다. 해당 저장소들은 정상적인 프로젝트로 위장해 정교하게 제작되었으며, 주로 게임 핵, 소프트웨어 크랙, 자동화 도구 등의 주제를 활용하여 사용자들의 관심을 끌고 있다. 저장소에는 README 파일과 압축 파일이 포함되어 있으며, 압축 파일 내부에 SmartLoader 악성코드가 존재한다.
- SmartLoader 유포 주소
hxxps://github[.]com/[공격자계정]/Maple-Story-Menu/releases/download/v3.2.0/Maple.Story.Menu.v3.2.0.zip
hxxps://github[.]com/[공격자계정]/Minecraft-Vape-Client/releases/download/v1.3.1/Minecraft.Vape.Client.v1.3.1.zip
hxxps://github[.]com/[공격자계정]/ms-rewards-automation/releases/download/v1.8.1/ms-rewards-automation.v1.8.1.zip
hxxp://github[.]com/[공격자계정]/ddos-protection/releases/download/uncork/ddos-protection-uncork.zip
hxxp://github[.]com/[공격자계정]/strongvpn/releases/download/pseudobrotherly/strongvpn_pseudobrotherly.zip
hxxp://github[.]com/[공격자계정]/VSDC-Video-Editor-Pro-Crack/releases/download/2.3.3/vsdc-video-editor-pro-crack-2.3.3.zip
hxxp://github[.]com/[공격자계정]/Instagram-Followers-Booster-v2.4.5/releases/download/v1.3.6/instagram-followers-booster-v2.4.5-v1.3.6.zip
hxxps://github[.]com/[공격자계정]/Call-of-Duty-Modern-Warfare-3-MW3-Hack-Cheat-Aimbot-Esp-Unban-Hwid-Unlocks-GunLVL/releases/download/desertless/Desertless.zip
hxxps://github[.]com/[공격자계정]/MCP-Manager-GUI/releases/download/v1.6.1/MCP.Manager.GUI.v1.6.1.zip
hxxp://github[.]com/[공격자계정]/Project-Zomboid-Hack/releases/download/scholae/project-zomboid-hack-scholae.zip
hxxps://github[.]com/[공격자계정]/portfolio/raw/refs/heads/main/Software.zip
게임 핵, 소프트웨어 크랙, 자동화 도구 등의 관련 키워드를 검색할 경우, SmartLoader 악성코드가 포함된 Github 저장소가 검색 결과 상단에 노출되고 있어 사용자가 쉽게 접근할 수 있는 것을 확인할 수 있다.

[그림 1] Google 검색 결과 SmartLoader 유포지가 상단에 노출되는 모습
정상적인 프로젝트를 위장한 Github 저장소에는 README 파일 및 프로젝트 관련 파일들이 포함되어 있다. README 파일에는 프로젝트의 개요, 목차, 주요 기능, 설치 및 사용 방법 등이 그럴듯하게 작성되어 있어 일반 사용자가 악성코드 유포지로 인식하기 어렵다. 사용자는 안내된 설치 방법을 따라 압축 파일을 다운로드하게 되며, 해당 파일에는 악성코드가 포함되어 있다.

[그림 2] 정상 프로젝트를 위장한 Github 저장소 (1)

[그림 3] 정상 프로젝트를 위장한 Github 저장소 (2)

[그림 4] 압축 파일 내부
다운로드된 압축 파일에는 총 4개의 파일이 포함되어 있으며, 각 파일의 기능은 아래와 같다.
- 파일 기능
java.exe : Lua 로더 실행 파일인 luajit.exe (정상)
Launcher.cmd : module.class 를 인자로 java.exe 를 실행하는 배치 파일 (악성)
lua51.dll : Luajit 런타임 인터프리터 (정상)
module.class : 난독화된 Lua 스크립트 (악성)
사용자가 설치를 위해 Launcher.cmd 파일을 실행할 경우 luajit.exe(Lua 로더)를 통해 난독화된 악성 Lua 스크립트가 로드되며, 최종적으로 SmartLoader 가 동작하게 된다. SmartLoader는 지속성을 확보하기 위해 luajit.exe(ODE3.exe), module.class, lua51.dll 파일을 “%AppData%\ODE3” 경로에 복사한 후, “SecurityHealthService_ODE3” 명으로 작업 스케줄러에 등록한다.

[그림 5] 스크린샷 전송 (BMP 파일)

[그림 6] 시스템 정보 전송 (인코딩된 형태)
이후 감염된 PC의 스크린샷과 시스템 정보가 C2 서버로 전송되며, 서버로부터 수신한 응답 값을 기반으로 추가 악성 행위를 수행한다. C2 서버와 주고받는 데이터는 Base64 인코딩 및 바이트 연산을 통해 암호화된 형태로 전달된다. 이때 사용되는 Key 값은 Lua 스크립트 내에 난독화된 형태로 존재하며, 동적 메모리 상에서 해당 Key 를 확보할 수 있었다.
- C2
hxxp://89.169.13[.]215/api/YTAsODYsODIsOWQsYTEsODgsOTAsOTUsNjUsN2Qs

[그림 7] C2 응답 값
응답 값은 JSON 형식으로 전달되며, loader 와 tasks 두 가지 데이터가 포함되어 있다. loader는 악성코드의 동작을 제어하는 설정 값이며, tasks는 추가 페이로드를 다운로드하고 실행하기 위한 작업 목록이다. 확보한 Key 를 이용하여 해당 데이터를 디코딩한 결과는 아래와 같다.
| 항목 | 디코딩된 데이터 |
|---|---|
| loader | {“bypass_defender”: 0, “autorun”: 0, “relaunch”: {“time”: 3600, “status”: false}, “tablet”: {“text”: “An error occurred”, “status”: false}, “hide”: 0, “persistence”: 1} |
| tasks | [{“id”: 814, “link”: “hxxps://github[.]com/kishoq123/Netrunner-Os-Abiy/releases/download/nasosubnasal/log.txt”, “file_path”: “AppData”, “file_name”: “Adobe\\adobe.lua“, “start”: 1, “autorun”: 0, “relaunch”: 0, “hide”: 0, “pump”: {“size”: 100, “status”: false}, “dll_loader”: {“func”: null, “type”: “LoadLibrary”}, “delivery”: “new”}, {“id”: 819, “link”: “hxxps://github[.]com/ngochoan1991/host/raw/ed0b087203fbe99717f2be9e93abc0cf9a4200c9/64.log”, “file_path”: “Temp”, “file_name”: “_x64.bin“, “start”: 1, “autorun”: 0, “relaunch”: 0, “hide”: 0, “pump”: {“size”: -1, “status”: false}, “dll_loader”: {“func”: null, “type”: “LoadLibrary”}, “delivery”: “new”}, {“id”: 820, “link”: “hxxps://github[.]com/ngochoan1991/host/raw/ed0b087203fbe99717f2be9e93abc0cf9a4200c9/86.log”, “file_path”: “Temp”, “file_name”: “_x86.bin“, “start”: 1, “autorun”: 0, “relaunch”: 0, “hide”: 0, “pump”: {“size”: -1, “status”: false}, “dll_loader”: {“func”: null, “type”: “LoadLibrary”}, “delivery”: “new”}] |
[표 1] 디코딩된 loader, tasks 데이터
분석 당시, 응답 받은 tasks 항목에는 총 3개의 페이로드가 포함되어 있었으며, 각 페이로드가 실행된 후에는 수행된 작업 ID와 감염된 PC의 국가 코드가 C2 서버로 전송된다. 다운로드되는 파일들은 앞서 설명한 방식과 동일하게 인코딩된 형태이며, 메모리 상에서 디코딩되어 실행된다. 각 파일에 대한 기능은 아래와 같다.
- C2
hxxp://89.169.13[.]215/tasks/YTAsODYsODIsOWQsYTEsODgsOTAsOTUsNjUsN2Qs
1. adobe.lua

[그림 8] 디코딩된 adobe.lua
해당 파일은 난독화된 악성 Lua 스크립트로, module.class 와 동일한 기능을 수행한다. 지속성을 확보하기 위해 “WindowsErrorRecovery_ODE4” 명으로 작업 스케줄러에 등록되며, 감염된 PC의 스크린샷과 시스템 정보를 C2 서버로 전송한 후, 서버로부터 수신한 응답 값을 기반으로 추가 악성 행위를 수행한다. 분석 당시에는 tasks 항목이 비어 있어, 추가 악성 행위는 확인되지 않았다.
- C2
hxxp://95.164.53[.]26/api/YTAsODYsODIsOWQsYTEsODgsOTAsOTUsNjUsN2Qs

[그림 9] C2 응답 값
2. _x64.bin

[그림 10] 디코딩된 _x64.bin
해당 파일은 64비트 환경에서 동작하는 ShellCode로, 정보 탈취형(Infostealer) 악성코드인 Rhadamanthys 로 확인되었다. Rhadamanthys는 Windows 시스템의 정상 프로세스에 인젝션을 수행한 후, 최종적으로 이메일, FTP, 온라인 뱅킹 서비스 등과 관련된 민감 정보를 탈취하여 공격자 서버로 전송한다.
- 인젝션 대상 프로세스
%Systemroot%\system32\openwith.exe
%Systemroot%\system32\dialer.exe
%Systemroot%\system32\dllhost.exe
%Systemroot%\system32\rundll32.exe
3. _x86.bin

[그림 11] 디코딩된 _x86.bin
해당 파일은 32비트 환경에서 동작하는 ShellCode로, _x64.bin 파일과 동일한 기능을 수행하는 Rhadamanthys 악성코드이다.
SmartLoader는 주로, 정보 탈취형(InfoStealer) 악성코드를 다운로드하며, Rhadamanthys 외에도 Redline, Lumma Stealer 등의 악성코드를 실행하는 사례가 다수 확인되고 있다. 게임 핵, 크랙, 자동화 도구 등 불법 또는 비공식적인 키워드로 검색된 경로는 악성코드 유포 가능성이 높으므로, 반드시 공식 출처에서 소프트웨어를 다운로드해야 한다. 또한, README 파일이 정교하게 작성되어 있어도 악성 저장소일 가능성이 있으므로, 저장소의 출처, 작성자 신뢰도, 커밋 및 활동 기록 등을 확인해야 한다.