Analyzed date : 2022-07-29
Ahutor : github.com/miho030
Awesome-Malware-Report/Malware reports/exe/302e1152c2710ad56ef1ff5536bb6539f6ac6901caba28954c2b160f9c7ac518.pdf at main · miho0
Comprehensive repository of malware analysis reports - miho030/Awesome-Malware-Report
github.com
YARA RULE
https://github.com/miho030/Awesome-Malware-Report/blob/main/yara/njrat-generic-yara-rule.yara
Awesome-Malware-Report/yara/njrat-generic-yara-rule.yara at main · miho030/Awesome-Malware-Report
Comprehensive repository of malware analysis reports - miho030/Awesome-Malware-Report
github.com
개요
본 보고서는 JPEG 파일 내 실행 파일, "Server.exe (SHA-256: 302e1152…c518)"를 분석한 보고서이다. 분석 대상 파일은 정적 분석 결과, njRAT 0.7D Danger Edition VirTool로 컴파일된 32-bit .NET 기반 RAT 클라이언트였다. 샌드박스를 통한 동적 분석 실행 결과, 악성코드는 IP: 188.242.138.137로 역접속을 시도한다. Ghidra 및 IDA64로 정적 분석한 결과, base64 패딩 우회 기법이 적용된 인코딩되어 저장된 변수를 복호화 하였으며, 복호화된 내요은 아래와 같다.
"hakim3.ddns.net:5552"
분석 대상 악성파일을 dnSpy, ILSpy, .NET reflector를 통해 원본 소스코드로 디스어셈블링 할 수 있었고, 디스어셈블된 코드를 디버깅하며 찾은 Class Fransesco.ind 내, 감염 시스템에 대해 키로깅, 화면 캡처, 웹캠 스트리밍, 파일 업/다운로드, 백신 및 방화벽 우회, USB매체를 통한 자가복제 기능 등을 수행할 수 있음을 확인하였다.
TAG : njrat, trojan, backdoor, spyware, evasion, exe
주요 내용
단계 | 분석자가 수행한 절차 | 사용 도구 및 기술 | 핵심 관찰 결과 |
1. 샘플 확보 | Polyglot이 의심되는 JPEG 파일의 EOF 뒤 추가 데이터 분리 | JPG viewer, Hxd, 010Editor | JPEG EOF(0xFFD9) 이후 ZIP 시그니처(PK_) 검출 -> Server.exe 추출 |
2. 은닉 여부 확인 (페이로드 추출) |
PE 헤더 | de4dot, PEViewer, ExeInfo PE, Detect It Easy | 패커 없음, Anti-dnSpy/ILSpy 보호 플래그 존재, TimeStamp(2021-06-15 12:56:51) |
3. 패커/EXIF 확인 | EXIF , 컴파일 타임, 섹션 구조 파악 | PEbear, CFF explorer, Resource hacker | import hash, osversion 등 EXIF 데이터 확인 |
4. 정적 문자열 분석 | 긴 문자열, IoC 식별 후 Base64 디코딩 | Ghidra, IDA64, BinText | NTU1Mg== -> 포트 555 aGFraW0z*i5kZG5zLm5ldA!! → hakim3.ddns.net 레지스트리/반화벽/UAC 우회 커맨드 확인 |
5. .NET 역공학 및 코드 디버깅 | IL 코드 열람 및 핵심 클래스 분석 | .Net reflector, dnSpy, ILSpy | Fransesco 클래스 내 GetAV(), captureDesktop(), USB전파기능, 채팅, TTS 함수 등 RAT 기능 전부 식별 |
6. 동적 행위 검증 | 샌드박스 분석 환경에서 프로세스 및 네트워크 모니터링 | ANY.RUN, TCPView, WireShark | Server.exe가 %APPDATA%\…\Windows Update.exe 경로에 자가 복제 및 방화벽 신뢰 프로그램 등록 시도, 188.242.138.137:5552 연결 시도, 레지스트리/작업 스케줄러, USB 드라이브에 자가복제 |
7. YARA 규칙 작성 | 고유 문자열, C2, TimeStamp 기반 룰 설계 | YARA, VSCode | njrat_302E1152_generic 룰: 3 개 이상 문자열 + ddns 서명 매칭 시 탐지 |
단계별 분석 흐름 요약
- 은닉 여부 판정: JPEG 내부 구조 검사로 EoF-주입 스테가노그래피 확인
- 페이로드 추출: 확장자 변경·압축 해제로 Server.exe 확보
- 정적 식별: 패커·타임스탬프·.NET 메타데이터 분석, 문자열 디코딩으로 C2·포트 확정
- 코드 디버깅: dnSpy로 클래스·메서드 맵핑, 안티-AV·자기복제·원격제어 기능 파악
- 행위 검증: 샌드박스 실행 후 네트워크·레지스트리·파일시스템 변경 로그 수집
기술적 포인트
- Base 64 패딩 우회 : C2 도메인 문자열에 !!로 패딩(==)을 대체하여 단순 탐지를 회피
- 안티 디버깅 : .NET Anti-reflection으로 dnSpy/ILSpy 덧입기를 감지 및 종료, protectTask()를 통해 사전에 정의된 분석 도구를 통해 process를 열람하는 경우, 프로그램 종료 시도
- 지속성 확보 기능 : schtasks /create /sc minute /mo 1 /tn StUpdate /tr <복제본> 명령으로 1분마다 실행
- 다기능 RAT : 화면캡처/파일업로드 및 다운로드 기능 등 전형적인 RAT 악성코드의 기능을 하는 소스코드 발견, 채팅/소리재생 등 피해 시스템의 인지적 혼란 기능 포함
정적 및 동적 분석 과정
패킹 및 보호 기능 파악
Detect it Easy (DIE) 및 Exeinfo PE 를 통해 패커의 존재가 없음을 확인하였다. 분석 대상 파일은 .NET Anti-Reflection 기능으로 보호되어 있음을 확인하였다. 추가적으로, 실행 대상 OSVersion, VirTool 종류까지 확인할 수 있었다.
정적 문자열 분석
Ghidra, BinText, Pestudio를 통해 분석 대상 악성파일에 포함된 String 값들을 추출하여 확인하였으며, 분석 대상 파일로부터 base64로 인코딩된 문자열, 안티디버깅을 위한 프로그램 목록, 방화벽 비활성화 명령, 스케줄러 등록 명령, 레지스트리키 변경 대상의 경로 등 다양한 문자열을 탐색할 수 있었다.
추출된 String 값들을 분석한 결과, 아래와 같은 흥미로운 문자열을 발견했다. 아래 첨부된 도표는 보고서 에서 내용과 함께 자세히 확인할 수 있다.
도표에 정리한 문자열을 기반으로 악성코드의 기능에 대해 몇가지 추측을 할 수 있었다. RegKey를 편집하고, 방화벽 정책을 수정하며, 작업관리자를 비활성화 하거나 자기 자신을 1분마다 실행하도록 작업 스케줄러에 등록한다. 또한, 피해 시스템의 컴퓨터를 종료하거나 재시작 할 수 있다. 또한 자신을 분석하려는 프로그램의 시도를 방해하는 기제를 가지고 있다.
C2 서버의 도메인 정보가 base64로 인코딩되어 저장되어 있었다.
주소 000000013687에 위치한 'NTU1Mg=='의 값은 순수 베이스 64로 인코딩된 데이터이다. 이 값을 디코딩하면 '5552'의 값이 추출된다. 이는 C2 서버와의 연결을 위한 포트 번호로 추측할 수 있으며,
추출된 값 'aGFraW0z*i5kZG5zLm5ldA!!'에서 '!!!'는 베이스64 패딩을 우회하는 대체값으로 결정된다. (ex : ==). 따라서 처리된 값 'aGFraW0z*i5kZG5zLm5ldA'를 기반으로 디코딩을 시도해야한다. 추출된 값의 앞부분에 있는 'aGFraW0z' 값은 Base64에 의해 디코딩되었으며, "hakim3" 값을 가진다. 뒷부분에 있는 'i5kZG5zLm5ldA' 값은 ".ddns.net " 값을 가지기 때문에, 추출된 데이터의 최종 값은 "hakim3.ddns.net:5552 "이다.
해당 hakim3.ddns.net 도메인이 보고서를 작성하는 시점에는 비활성화 되어 있는 상태이기 때문에, whois 및 dns 서비스를 통해 추출된 DDNS 주소와 악성코드 파일이 연결을 시도할 때 사용하는 IP:188.242.138.137 간 공통되는 점을 찾지 못해 교차검증을 해야했다. 직접 해당 악성파일을 분석 환경에서 실행한뒤, TCPView를 활용하여 교차 검증 결과 분석 대상 악성 파일이 동일한 포트를 사용하여 C2 서버와 연결하는 것으로 확인하였다.
추출된 "schtasks /create /sc minute /mo 1 /tn StUpdate /tr" 문자열을 통해 악성 파일의 설치 과정 중 기능에 대해 몇가지 추측을 할 수 있다. RegKey를 변조한 후, 작업관리자를 비활성화 그리고 방화벽 정책 수정, 그 다음으로 stUpdate.exe 파일로 자기 자신을 복제하는 행위를 한다. 자가 복제 프로세스가 정상적으로 완료되면, 매 분마다 작업스케줄러를 통해 자기 자신을 실행하도록 설정한다.
디버거를 통한 코드 디컴파일링 및 분석
이 악성코드는 .NET framework을 사용하여 제작되었기 때문에 실행 파일 그 자체는 기계어로 컴파일되지 않고 클래스 이름, 메서드 이름, 변수 이름을 유지하는 중간언어(IL)로 컴파일된다. 당연히, 이를 디컴파일링 하는 것을 막기 위한 보호 기능이 존재하지만, dbnSpy, ILSpy, .NET reflector, dotPeek과 같은 도구를 사용하여 소스코드를 디컴파일하고 분석할 수 있다. 만약, anti-.NET reflection 기능 외에 추가적으로 파일이 난독화 되어 있는 경우가 있는데, 이런 경우에는 de4dot을 활용하여 복호화 할 수 있다. de4dot 설치 과정은 여기에서.
이 악성코드의 main() 진입점은 아래 지점이었다.
분석 대상 파일을 디컴파일링 하고, main() 함수를 찾는 과정에서 "Fransesco" Class 메서드를 찾았다. "Fransesco"라는 문자열은 정적 분석 과정에서도 등장했기 때문에, 지금까지 추출된 정보를 통해 구글링을 시도했다. (njrat, Fransesco) 구글링 결과, " njRAT 0.7D Danger 에디션 - BY Franesco Ctaik " 이라는 내용이 담긴 게시물을 발견하였으며, 따라서 아마도 이 Class 메서드는 해당 악성코드의 모든 기능을 선언한 Main Class일 수도 있다는 추측을 할 수 있었다.
main() 함수는 Fransesco.ko() 함수를 호출한다. 이는 전형적인 njRat의 유사한 구조를 가지고 있었다. 이 Fransesco.ko() 함수는 뮤텍스를 생성하여 인스턴스가 하나만 실행되도록 유도한다. 만약 뮤텍스 생성이 실패하거나 동일한 인스턴스가 동시에 실행 중이면 현재 인스턴스는 중지되도록 설계되어 있었다.
이후, Fransesco.ins() 함수를 호출하여 악성코드 설치 프로세스를 시작한다. 만약 njRAT VirTool에서 복사 옵션이 선택된 경우, 실행 파일의 현재 경로와 생성 시 지정된 경로를 확인한다. 만약 일치하지 않으면 실행 파일을 지정된 경로(C:\Users\...\TEMP, C:\Users\{USER}\App Data\Roaming\Windows\Startup menu\)에 복사하여 실행하고 현재 인스턴스를 종료한다.
njRAT VirTool에서 USB spread 기능이 활성화 된 경우, 아래의 함수가 추가적으로 실행된다. 이 함수는 피해 시스템에 존재하는 모든 드라이브 목록을 가져오고, USB 저장매체를 찾는다. 그 다음에 UAC 기능이 활성화되어 있는지 확인하고, 만약 UAC 기능이 활성화 되어 있다면 netsh 명령을 통해 방화벽에 존재하는 모든 허용 목록을 지운 뒤, 자기 자신과 함께 새롭게 복제된 실행 파일도 방화벽 허용 규칙에 등록한다.
방화벽 정책을 수정하는 프로세스가 끝나면 마지막으로 Fransesco.Usb1() 함수를 호출한다. 이 함수는 USB 저장매체에 옮겨진 실행 파일이 위치한 경로에 "autorun.inf" 파일을 작성하고 저장하는 역활을 수행한다. 아래 도표는 저장된 autorun.inf 파일의 내용을 보기 쉽게 정리한 것이다.
그 외에도 흥미로운 기능을 하는 함수들을 발견할 수 있었다.
피해 시스템의 방화벽 및 안티바이러스 정보를 추출하는 GetAV() 함수
이 "Fransesco" 클래스 내에서 선언된 "GetAV" 기능은 피해 시스템에서 WMI 쿼리 객체 "obj = Select * From AntiVirusProduct"를 통해 설치된 방화벽 및 안티바이러스 프로그램의 정보를 추출하고, 결과에 따라 필요한 작업을 수행한다. 이 함수는 방화벽 및 안티바이러스 탐지 우회 기능을 사용하기 전에 호출되는 함수로 보인다.
피해 시스템의 모니터 갯수를 파악하는 MonitorCount() 함수, 화면 캡처를 수행하는 captureDesktop()함수
이 기능은 단순히 모니터 화면을 캡처하는 역활을 수행한다. njRAT의 악성코드가 피해자의 시스템을 성공적으로 감염시킨 후, 공격자의 dashboard에 피해 시스템의 모니터 화면 미리보기 기능을 아래 사진과 제공하는데, 이를 위한 기능임을 추측할 수 있었다.
captureDesktop() 함수는 Fransesco.ind() 함수 내에 선언되어 있었다. 사용자의 화면을 캡처하고 이를 반환한다. 이러한 유형의 소스코드는 악성 RAT/백도어 에서 흔히 보이는 스크린샷 수집 루틴이다.
1234 라인에서는 CaptureDesktop() 함수를 static으로 선언하여 어디서든 호출할 수 있으며 Image 형태의 return 값을 가지도록 되어 있다.
1239 라인에서는 캡처 버퍼를 준비하며 피해 시스템의 주 모니터 전체 영역을 캡처 범위로 설정하고 있다.
1240~1250 라인에서는 GDI 함수를 이용하여 화면 픽셀을 비트맵에 복사한뒤, 실패시 null을 반환, 성공할 경우 Image 객체를 반환한다.
CaptureDesktop은 아래 코드라인에서 호출되었다. 이 함수는 공격자가 njRAT의 dashboard에 접근하거나 감염된 시스템 목록을 새로고침할 때 실행되는 함수이며, 이 과정에서 시스템 정보, 유저 이름 등과 같은 부수적인 정보를 스크랩하면서 피해 시스템의 화면을 캡처하여 이를 한번에 공격자에게 Send() 함수를 사용해 전송한다.
만약, njRAT virTool을 사용해 악성코드를 생성할 때, "숨김 및 시작 프로그램 등록" 옵션을 선택한 경우, 실행 파일 속성이 숨김으로 설정되며, 기본적으로 파일 탐색기에서 표시되지 않는다. 그리고 아래와 같은 경로에 악성파일이 복사된다. 동적 분석을 진행하며, 해당 파일이 지정된 경로에 저장된 것을 확인하였다.
C:\Users\{User-Name}\AppData\Roaming\Microsoft\Windows\Startup Menu\Program
또한, 동적 분석 과정에서 Task explorer, Process hacker와 같은 동적분석 도구를 통해 분석 대상 악성파일이 아래와 같은 사용자의 Temp 디렉터리에도 추가적으로 복사됨을 확인하였다.
C:\Users\{USER}\AppData\Local\Temp\server.exe
분석 대상 악성파일이 C2와 통신하는 과정을 wireshark, tcpview 를 활용하여 기록하여 분석하려고 시도하였지만 안타깝게도 C2 서버의 주소가 오랫동안 비활성 상태였기 때문에 C2서버의 FIN 패킷을 기록할 수 없었다.
더 자세한 내용은 보고서에서 확인 가능
보고서 열람
* (데스크탑 환경에서 열람하면 PDF 임베드 뷰어를 통해 보고서 확인 가능)
보고서 첨부 파일
보고서 작성 시 참조된 문서
- njRAT Malware Analysis from https://wahbakamaluddin.medium.com/njrat-malware-analysis-24ea58465552
- RUN. njRAT Malware Trends. Retrieved from https://any.run/malware-trends/njrat
- njRAT Malware Analysis — Reverse Engineering & Behavior Analysis. Retrieved from
https://piyush3131.github.io/posts/njRAT_Malware_Analysis/ - njRAT Malware Analysis — In-depth Review. Retrieved from https://www.youtube.com/watch?v=tV-TnyqXBv8&t=172s
'Security > 악성코드분석보고서' 카테고리의 다른 글
x32Dbg를 활용한 Amadey Bot 악성코드 심층 분석 - Part1_[ PE Section 언패킹 및 payload 추출 ] (0) | 2025.06.13 |
---|---|
BPFDoor 악성코드 분석 보고서 (0) | 2025.06.05 |
최근 SKT 해킹사고에 사용된 BPFDoor 악성코드 상세 분석 (0) | 2025.06.02 |
FridayBotRaid Client를 내포한 JPEG 폴리글롯 악성코드 분석 보고서 (0) | 2025.06.01 |
EXIF 메타데이터에 PHP WebShell을 은닉한 JPEG 악성코드 분석 (0) | 2025.05.29 |