
개요
본 보고서는 Phrack Magazine에서 공개된 APT Down–The North Korea Files 자료를 토대로 추가 분석한 내용들을 다룬다. 공격자가 실제로 사용한 VMware VM, VPS 덤프 파일도 공개되어 공격자의 활동 내역을 심층 분석할 수 있었고, 이로 인해 공격 배후도 유추할 수 있었다.
특히 공개된 파일 중에 루트킷 소스코드가 존재하는데, 이는 당사가 2022년 금융회사 침해사고 조사 과정에서 확인한 루트킷의 소스코드인 것으로 판명되었다. 코드 로직은 물론 사용된 암호화 키까지 일치하였다. 또한 2022년 침해사고 조사 당시 확인된 루트킷의 2025년 최신 버전 소스코드가 추가로 확인되었다.
이 외에도 Ivanti 1-Day 익스플로잇, 유출된 것으로 추정되는 외교부 홈페이지 소스코드, GPKISecureWebX 소스코드 그리고 검찰, 방첩사령부 등을 대상으로 한 피싱 공격도 확인되었다. 이러한 정황은 공격자가 과거부터 현재까지 한국을 주요 표적으로 삼아 지속적으로 활발한 공격 활동을 수행해왔고, 일반적으로 외부에서 쉽게 탈취하기 어려운 자료가 유출된 점, 루트킷 및 1-Day 익스플로잇을 활용한다는 점에서 공격자는 높은 수준의 공격 역량을 보유하고 있으며, 내부망까지 침투하여 민감 자료를 탈취했음을 시사한다.
분석 파일 개요
본 장에서는 분석 내용을 설명하기에 앞서, APT Down – The North Korea Files 보고서와 함께 공개된 파일의 구성을 간략히 설명한다.

caption - .onion 사이트에 게시된 공개 파일 목록
주요 파일은 work.zip, vps.zip, file-lists_and_misc.zip으로 설명은 아래와 같다.
work.zip
공격자 VMware VM(Deepin 20.9) 덤프 파일로, 실제 사용된 워크스테이션 환경이 포함되어 있으며 악성코드 소스코드, 공격 도구, 탈취된 자료, 각종 로그 등이 존재한다.
호스트 C:\가 hgfs로 마운트된 상태로, 공격자 호스트에 존재하는 파일도 확인할 수 있다.
vps.zip
공격자 소유 VPS 덤프 파일로, 스피어 피싱 공격에 사용된 이력과 각종 로그가 존재한다.
국방방첩사령부 ,검찰 등 여러 기관을 타겟으로 한 스피어 피싱 공격을 확인할 수 있다.
file-lists_and_misc.zip
공격자 워크스테이션의 구글 타임라인, 명령어 히스토리, 전체 파일 목록 등이 존재한다.
전체 파일 목록에서 덤프 파일에는 존재하지 않는 경로나 파일을 확인할 수 있다.
1. 악성코드 및 공격 분석
This chapter covers the malware found in the attacker's VMware dump files and the spear-phishing attacks and operational aspects of the infrastructure identified in the VPS dump files. The rootkits and backdoors found in the directories tomcat20220420_rootkit
and tomcat20250414_rootkit_linux234
are particularly related to past security incidents investigated by our company concerning domestic financial institutions.
1.1. tomcat20220420_rootkit
1.1.1. 2022 syslogk rootkit
2. 탈취 자료 분석
본 장에서는 공격자 VMware VM 덤프 파일에서 확인한 자료 중, 일반적으로 확보가 불가능하거나 어려운 데이터를 “탈취 자료”로 정의하고 이를 정리한 내용을 다룬다.
2.1. 외교부 AyersRock Mail
/work/mnt/hgfs/Desktop/mofa.go.kr.7z
파일 내에는 외교부 내부에서 사용한 것으로 추정되는 AyersRock Mail 솔루션 소스코드가 존재한다. AyersRock Mail은 (주)나라비전에서 2016년 Kebi Mail을 기반으로 한 웹메일 솔루션이다.
압축 해제 후 확인한 디렉토리 구조가 kebi-batch
, kebi-cor
, kebi-web-mail
등 Kebi 계열 모듈로 구성되어 있고, 각 디렉토리 하위에 있는 app-*.xml 파일 mail 요소의 host 값에서 mofa.go.kr을 확인할 수 있다.

caption - app-*.xml mail 요소의 host 값
mofa.go.kr/kebi-web-parent/mail/document/info.txt
파일에는 내부 개발 서버, DB, 테스트 서버 등 여러 계정 정보와 메모가 작성되어 있다.

caption - info.txt 파일 내용
mofa.go.kr/kebi-web-parent/mail/document/worklist.txt
파일에는 작업 일정과 작업 목록에 대한 메모가 작성되어 있다.

caption - worklist.txt 파일 내용
Git 저장소와 관련있는 .gitignore
, .gitmodules
파일이 존재하고, 개발사에서 작성한 것으로 추정되는 info.txt, worklist.txt 파일이 존재하여 mofa.go.kr.7z
은 개발사 Git 저장소에서 탈취한 파일을 압축한 것으로 보인다. 다만 .git
폴더가 존재하지 않아 저장소 유형은 알 수 없다.
2.2. 시큐어키 APPM & iRASS
2.2.1. LG U+ APPM 서버 소스코드
/work/mnt/hgfs/Desktop/111/ROOT/ROOT
디렉토리 내에는 LGU+ 내부에서 사용한 것으로 추정되는 secureki의 통합 패스워드 관리 솔루션인 APPM 소스코드가 존재한다.
/work/mnt/hgfs/Desktop/111/ROOT/ROOT/WEB-INF/classes/language/view.properties
파일에서 “LG U+ 커스텀 테이블” 키워드를 확인할 수 있다. 이 외에도 /work/mnt/hgfs/Desktop/111/ROOT/ROOT/META-INF/maven/com.sgt/appmui_i18n_Transformation_*/pom.xml
파일에서 “LGU플러스” 키워드를 확인할 수 있다.

caption - view.properties 파일 내용
2.2.2. APPM & iRASS 서버 관리 프로그램
/work/mnt/hgfs/Desktop/111/home/home
경로에 appm, irass 디렉토리가 존재하는데, 각각 APPM, iRASS 서버 관리가 목적으로 추정되는 프로그램이 존재한다.
APPM
/work/mnt/hgfs/Desktop/111/home/home/appm
디렉토리 내에는 appm_master 바이너리와 암호화 관련 모듈이 있는 crypto 디렉토리가 존재한다. appm_master는 실행 과정에서 여러 바이너리와 설정 파일 존재를 확인하는데, 공개된 자료에서는 다수의 파일이 존재하지 않는다. 주요 설정 파일로는 클라우드 설정 파일, 복호화된 appmkey 파일이 있으나 존재하지 않는다.

caption - 공개된 파일 목록
iRASS
/work/mnt/hgfs/Desktop/111/home/home/irass/bin
디렉토리 내에는 irass_master 바이너리를 포함해 irass_db, irass_admin, irass_rdp 등 여러 바이너리가 존재한다. 모두 iRASS 관련 바이너리이다. 특히 history.txt에 “KB국민은행” 키워드가 존재하고, 개발사에서 작성한 이슈 및 패치 메모 파일로 추정된다.

caption - history.txt 파일 내용
2.2.3. LG U+ ACCOUNT 테이블 덤프
/work/mnt/hgfs/Desktop/111/account/account.txt
, /work/mnt/hgfs/Desktop/111/account (2).txt
두 파일에는 LG U+ ACCOUNT 테이블 데이터가 작성되어 있다.

caption - account.txt 파일 내용
/work/mnt/hgfs/Desktop/111/ROOT/ROOT/WEB-INF/classes/ibatis/sql/sql-account.xml
파일에서 확인한 ACCOUNT 테이블 관련 쿼리와 account.txt에서 확인한 스키마를 비교한 결과 LG U+ ACCOUNT 테이블 데이터인 것을 알 수 있다.
2.2.4. LG U+ APPM_TRANS 테이블 덤프
/mnt/hgfs/Desktop/111/oneway_info/APPM_TRANS.txt
파일에는 LG U+ APPM_TRANS 테이블 데이터가 작성되어 있다.

caption - account.txt 파일 내용
/work/mnt/hgfs/Desktop/111/ROOT/ROOT/WEB-INF/classes/ibatis/sql/sql-account.xml
파일에서 확인한 APPM_TRANS 테이블 관련 쿼리와 APPM_TRANS.txt에서 확인한 스키마를 비교한 결과 LG U+ APPM_TRANS 테이블 데이터인 것을 알 수 있다.
2.3. 행정안전부 GPKISecureWebX
2.3.1. GPKISecureWebX 소스코드
/work/mnt/hgfs/Desktop/111/GPKISecureWebX
디렉토리 내에는 드림시큐리티에서 개발한 공인인증서 관련 보안 프로그램인 GPKISecureWebX의 소스코드가 존재한다.
Visual Studio Build Log 파일인 /work/mnt/hgfs/Desktop/111/GPKISecureWebX/GPKISecureWebX.plg
에서 “01_행자부 웹보안API”를 확인할 수 있고, 행자부는 현재 행정안전부로 불리며 이는 행정안전부 GPKISecureWebX와 관련있는 것을 알 수 있다.

caption - GPKISecureWebX.plg 파일 내용
추가로 /work/mnt/hgfs/Desktop/111/GPKISecureWebX
디렉토리를 압축한 /work/mnt/hgfs/Desktop/111/1.rar
파일이 존재한다.
2.3.2. GPKISecureWeb 패키지
/work/mnt/hgfs/Desktop/111/gpki.7z
파일 내에 GPKI API, GPKISecureWebX, setup 디렉토리가 존재한다. GPKI 표준 API에 대한 메뉴얼과 여러 키, 인증서 파일이 존재한다.
특히 gpki/gpkisecureweb/log
디렉토리에 2017년 12월부터 2020년 4월까지의 인증서 검증 로그 파일이 존재한다.

caption - 로그 파일 일부 데이터
2.3.3. GPKISecureWeb 문서 및 모듈 소스코드
/work/mnt/hgfs/Desktop/111/2/01_행자부 웹보안API(ORG) - 권유미 인수
디렉토리 내에는 인수인계를 위한 GPKISecureWeb 관련 문서 파일과 GPKIInstaller, GPKICertManager 등 전체 모듈에 대한 소스코드가 존재한다.
확인된 문서 파일은 아래와 같다.
/work/mnt/hgfs/Desktop/111/2/01_행자부 웹보안API(ORG) - 권유미 인수/웹용 표준보안API_매뉴얼(유선).chm
/work/mnt/hgfs/Desktop/111/2/01_행자부 웹보안API(ORG) - 권유미 인수/설계문서/SSA_AO_AD_WT_002_웹보안 프로토콜설계서_Ver1.0_.doc
/work/mnt/hgfs/Desktop/111/2/01_행자부 웹보안API(ORG) - 권유미 인수/행자부 웹보안API 인수인계.doc
문서 파일의 속성을 확인하면 오래 전에 제작된 것을 알 수 있다.

caption - doc 파일 문서 속성
/work/mnt/hgfs/Desktop/111/2/01_행자부 웹보안API(ORG) - 권유미 인수/02_src/ReadMe.txt
에 전체 모듈에 대한 설명이 존재한다.

caption - ReadMe.txt 파일 내용
2.4. GPKI 인증서 및 개인키 파일
/work/home/user/Downloads/cert/extracted-key-20200512
디렉토리 내에는 인증서와 개인키 파일이 2475개 존재한다. Subject에서 법제처, 정부산하기관및위원회 등 다양한 정보를 확인할 수 있었지만, 공격자가 이를 어떻게 수집했는지는 알 수 없다.

caption - /work/home/user/Downloads/cert/extracted-key-20200512 디렉토리 파일 목록
2.5. 온나라 로그인 자동화 스크립트
/work/mnt/hgfs/Desktop/111/onnara_auto
디렉토리 내에는 대한민국 정부에서 사용하는 공무원용 서비스인 온나라 로그인 자동화 스크립트가 존재한다. client_main.py에 온나라 서비스의 계정 id, 조직 id, 서브 도메인이 하드코딩되어 있다.

caption - client_main.py main 함수
로그인 방식은 입력한 정보를 토대로 /work/mnt/hgfs/Desktop/111/onnara_auto/script
에 존재하는 onnaraSSO.jar 파일을 실행해 SSO 토큰 값을 생성한다.

caption - onnara_sso.py generate_L1 함수
onnaraSSO.jar는 입력 옵션에 따라 ARIA 또는 DES 알고리즘으로 문자열을 암·복호화한다. 실행 형식은 아래와 같다.
onnaraSSO.jar <문자열> <0:DES | 1:ARIA> <0:암호화 | 1:복호화>
아울러 ARIA와 DES에 사용되는 키는 모두 하드코딩되어 있다.
Host와 VMware 간 옮긴 파일 흔적에서 공격자가 onnara_sso_test.py 파일에 출력 결과를 주석으로 남긴 것을 확인할 수 있다.

caption - /work/home/user/.cache/vmware/drag_and_drop/Z3INst/onnara/onnara_auto/onnara_sso_test.py 파일 데이터
/work/home/user/.cache/vmware/drag_and_drop/Z3INst/onnara
디렉토리 내에는 onnara9-onnara4-SSO-login.saz 파일이 존재하는데, 압축을 해제하면 실제 HTTP 요청과 응답을 확인할 수 있다.

caption - onnara9-onnara4-SSO-login.saz/raw/001_c.txt 파일 데이터
3. 공격자 및 시스템 정보
본 장에서는 공개된 자료 중 공격자와 시스템 환경에 대하여 분석한 내용을 다룬다.
3.1. 시스템 정보
3.1.1. deepin
VMware workstation에는 deepin이 설치되어 있었다. deepin은 중국 외 국가에서 인기 있는 배포판이 아니고, 중국 기업 주도로 개발되어 중국 시장에 중심으로 배포·지원되는 배포판이다.
독립적으로 검증 가능한 사용자 수나 분포에 대한 데이터는 알려지지 않았지만, deepin은 2022-12에 사용자가 3M 이상이라 보고했고, 2024-09에 "5.4M 이상의 사용자 중 거의 3M이 중국 외 사용자"라고 보고했다. 그러나 외부 검증이 없어 수치의 현실성에는 의문이 있다.
리눅스 사용자들의 특성 상 telemetry, survey 등 데이터 수집에 대한 거부감이 크고, Desktop에서는 상용 소프트웨어에 대한 수요와 시장이 작기 때문에 시장 조사도 활발하지 않다. 따라서 리눅스 배포판 사용자 수에 대한 통계 자료는 얻기 어렵다. 하지만 공개된 자료로 여러 배포판의 대략적인 인기를 알 수 있다. 이 중 각 배포판의 검색 수, Stack Overflow Developer Survey, 그리고 각 배포판의 통계 자료를 정리했다.
위 지표를 종합할 때, deepin의 중국 외 사용자 수가 약 300만 명에 이르지 않는 것으로 보인다. 독립적 검증 부재를 고려하면 수천 명 수준에 그칠 가능성이 상대적으로 높다. 또한 중국 외 지역에서 이 평판은 전반적으로 부정적이다. 또한 아래와 같은 내용들도 알려져있다.
정책, 규제: EULA 및 개인정보 처리방침에 정보 수집 권한과 중화인민공화국 법률 준거가 명시되어 있다.
데이터 수집 논란 이력: 과거 App Store에 CNZZ Analytics를 사용해 논란이 있었고, Deepin은 Google Analytics와 유사하다고 해명 후 수집 중단을 공지하였으나, 이후 Umeng+ Analytics를 다시 추가했다.
보안: deepin desktop environment는 반복된 보안 이슈와 보안 검증을 우회하려는 방식이 지적되었고, 2025-05에 OpenSUSE에서 제거되었다.
종합하면 중국 외 지역에서 deepin을 선택하거나 사용할 확률은 매우 낮은 것으로 판단된다.
3.1.2. IME
VMware workstation에는 여러 중국어용 IME가 설치, 설정된 흔적이 확인되었다. deepin 특성상 중국 시장에 맞춘 기본 구성이 포함되며, 기본 패키지로 fcitx-pinyin
, fcitx-sunpinyin
, fcitx-table-wubi
가 설치되어 있다. 설치 언어가 영어인 경우 기본 IME는 비활성화되고, 중국어인 경우 wubi
, shuangpin
,pinyin
, sunpinyin
이 활성화되는 것으로 확인되었다.

caption - 기본 설치된 fcitx 패키지 목록
추가 설치 내역은 아래와 같다.
fcitx
플러그인:huayupy
,wbpy
,rime
,iflyime
추가로 설치 흔적이 확인되었고, 활성화된 입력기는wbpy
,pinyin
이다.ibus
플러그인:rime
추가 설치 및 사용 흔적이 확인되었다.SogouPY
추가 설정 흔적이 존재한다.

caption - work/home/user/.config/fcitx/profileEnabledIMList diff 결과
3.1.3. etc
설치 및 로케일 정보
work/home/user/.config
하위 설정의 로케일이 영어로 표기되어 있어 영문 환경에서 설치된 것으로 보인다. work/home/user/.config/locale.conf
파일 내용은 아래와 같다.

caption - work/home/user/.config/locale.conf 파일 내용
그러나 work/var/log/{access.log*,vmware-network.*.log}
파일의 데이터는 한글로 기록되어 있다.

caption - work/var/log/vmware-network.1.log 파일 내용
deepin 설정 변경 및 흔적
work/home/user/.config/deepin/dde-desktop/dde-desktop.conf
파일에 ProtonVPN OpenVPN 프로파일로 보이는 파일이 존재하지만, 덤프에는 포함되어 있지 않다.

caption - work/home/user/.config/deepin/dde-desktop/dde-desktop.conf 파일 내용
work/home/user/.config/deepin/dde-file-manager/dde-file-manager.obtusely.json
파일에 개인 정보를 포함한 파일명과 원격, 공용 경로 접근 이력이 존재한다. 예시는 아래와 같다.
standard://downloads/cert/gpki_cert/*
file:///mnt/hgfs/share_data/GitHack/www.caa.org.tw/*
ftp:host=192.168.50.1:21212
work/home/user/.config/deepin/dcc-weather-plugin.conf
파일에서 Location
이 Waterloo로 설정되어 있다.

caption - work/home/user/.config/deepin/dcc-weather-plugin.conf 파일 내용
이 외에 기타 애플리케이션에서 확인한 흔적은 아래와 같다.
work/home/user/.config/filezilla/recentservers.xml
: ftp.fu-berlin.deFileZilla를 사용해 공개 FTP 미러에 접속
work/home/user/.config/Foxit Software/Foxit Reader.conf
: tmp/kclee/hiaei84@gmail.com.pst_pst_*.msg파일 경로에서 확인한 이메일
3.2. 브라우저 정보
work/home/user
하위 여러 브라우저 프로필을 모두 분석하였고, 주 사용 프로필은 work/home/user/.config/google-chrome/Default
로 확인되었다. 전체 브라우저 프로필과 확인된 타임 스탬프 최소, 최대는 아래 표와 같다.
work/home/user/.config/google-chrome/Default
프로필 최초 기록은 2020-12-02 01:56:37.844이고, 이후 2025-03-18 04:04:20.873부터 2025-05-28 07:11:01.791까지의 방문 기록이 존재한다. 나머지 프로필은 생성만 되었거나 단기간 사용 흔적에 그쳤다.
3.2.1. language
work/home/user/.config/google-chrome/Default/Preferences
의 기록이 work/home/user/.config/google-chrome/Default/.com.google.Chrome.*
에 남아 있었다. 아래 표 참고 바란다.
변경 타임라인은 아래와 같다.
2020-04-23T10:28:01.605486 이전: intl.*_languages에 영어+중국어 설정, 중국어 번역 차단(translate_blocked_languages).
2021-04-08T03:15:41.989060 이전: 한국어 추가, 한국어 번역 차단.
2025-04-10T16:13:27.859136 이전: 영어 번역 차단 추가.
번역 수락은 영어와 한국어에 주로 발생하였고, 중국어는 수락 이력이 없다. 번역 결과 언어는 중국어로 기록하였다.
주로 방문한 페이지는 영어, 중국어 페이지이고 2021-04-08까지 한글 사이트에 방문하였다. 2025-04-10 이후에는 한글 사이트 방문이 거의 없다.
3.2.2. history
work/home/user/.config/google-chrome/Default
프로필은 업무와 업무 외 용도로 사용되었다. 취약점, 악성코드 등 업무와 관련된 기록 외에도 포럼 등을 이용한 기록이 존재한다.
Cobalt Strike 관련 방문 기록은 아래 표와 같다.
rootkit 관련 방문 기록은 아래 표와 같다.
translate.google.*
방문 기록에서 주로 영어, 한글 문서, docs, LLM 응답 등을 중국어로 번역했다. 번역 내용 중 일부는 아래와 같다.

caption - History에서 확인한 Google Translate
방문 기록 중에 특히 중국 포럼인 "acfun.cn/v/list63/index.htm"를 자주 방문하였다. acfun.cn 첫 기록은 2021-05-19 03:08:57.000이고, 방문 기록이 존재하는 2025-03-18 08:00:42.949~2025-05-28 07:11:01.791 사이에 232번, 전체 acfun.cn 방문 기록은 1,440번이다.
검색 엔진 사용 빈도는 아래 표와 같다. google, duckduckgo 다음으로 baidu를 가장 많이 사용한 것을 알 수 있다.
3.2.3. geolocation
work/home/user/.config/google-chrome/Local State
의 기록이 work/home/user/.config/google-chrome/.com.google.Chrome.*
에 남아 있었다. 이 기록들에 따르면 Chrome VariationsService
가 위치를 tw
, hk
, jk
, sg
순서로 바뀌었다. 자세한 정보는 아래 표 참고 바라며, variations_permanent_consistency_country
, variations_country
는 소스코드를 분석해 기능을 확인하였다.
variations_permanent_consistency_country
: https://source.chromium.org/chromium/chromium/src/+/main:components/variations/pref_names.cc;l=59variations_country
: https://source.chromium.org/chromium/chromium/src/+/main:components/variations/pref_names.cc;l=22
work/home/user/.mozilla/firefox/06yb5px0.default-release/saved-telemetry-pings/
아래의 event ping들의 검색 엔진 지역 설정은 모두 HK
이다.
work/home/user/.thunderbird/*/.default-default/saved-telemetry-pings
디렉토리 내에 존재하는 파일에서 payload.info.timezoneOffset
를 확인할 수 있다.
work/home/user/.thunderbird/*/.default-default/saved-telemetry-pings
디렉토리 내 times.json
, prefs.js
파일에서 각각 firstUse와 calendar.timezone.local을 확인하였다.
브라우저 방문 기록에서 Google의 지역 탐지 결과들이 위 데이터를 뒷받침한다.
2020-12-21T16:07:17.035527에 google.com title이 Google 搜尋이다.
work/home/user/.mozilla/firefox/06yb5px0.default-release
2021-05-18 07:15:25.120에 google.com title이 Google 検索이다.
work/home/user/.config/BraveSoftware/Brave-Browser/Default
2021-05-18 07:15:30.999에 google.com에서 "translate"를 검색한 뒤, 검색 결과를 통해 translate.google.co.jp로 접속했다.
work/home/user/.config/BraveSoftware/Brave-Browser/Default
2025-03-19 01:15:18.988에 google.com title이 Google 搜索이다.
work/home/user/.config/google-chrome/Default
2025-03-27 04:52:26.132에 google.com에서 "translate"를 검색한 뒤, 검색 결과를 통해 translate.google.com.sg에 접속했다.
work/home/user/.config/google-chrome/Default
2025-05-13 05:08:47.578에 google.com에서 "google search"를 검색한 뒤, 검색 결과를 통해 google.com.sg에 접속했다.
work/home/user/.config/google-chrome/Default
또한 github.com title도 중국어로 localize된 경우가 많았다.
3.2.4. etc
work/home/user/.config/baidunetdisk
경로에 BaiduNetdisk 클라이언트 설정 파일들이 존재한다. BaiduNetdisk는 바이두 클라우드(중국계 클라우드) 스토리지/동기화 클라이언트이다.

caption - baidunetdisk 디렉토리
work/home/user/.thunderbird/8inzqqf5.default-release/encrypted-openpgp-passphrase.txt
파일이 존재하는 것을 보아 공격자는 해당 프로필에서 openpgp를 사용하였다.
work/home/user/.config/google-chrome/Default/Local Storage
에 amiunique.org
정보가 저장된 것을 알 수 있는데, amiunique.org
은 browser fingerprint의 통계적 빈도를 확인할 수 있는 사이트이다. 이 정보를 확인할 때 확인된 정보가 저장된다.
work/home/user/.thunderbird/8inzqqf5.default-release/session.json
에 열려 있는 windows, tabs 정보가 기록되어 있다. 파일 경로들을 해석한 결과는 아래와 같다.
tos安装文件
:tos installation file
이메일 파일 이름 형식은 maildir mailbox format으로 보이고,
S=
는 파일의 크기를 나타낸다.
모든 정보를 종합하면 다음과 같다.
공격자는 일반적으로 중국 외 지역에서 사용하지 않는 deepin을 사용한다.
IME 설치 흔적에서 여러 중국어용 IME만 설치된 것을 확인하였다.
브라우저 방문 기록에서 중국 포럼을 자주 방문한 것을 확인하였다.
번역 기록에서 한국어 -> 중국어, 영어 -> 중국어로 번역한 것을 확인하였다. 중국어에서 다른 나라 언어로 번역한 것은 존재하지 않는다.
시스템 정보에서 일부 한국어가 확인되었지만 한국인으로 보이지 않고, 공격자는 중국어에 능숙하며 중국 생태계(서비스·소프트웨어)에 익숙한 것으로 보인다.
4. 과거 국내 침해사고 연관성
4.1. 침해사고 개요
당사는 2022년 국내 금융회사 침해사고 조사를 수행하였다. 사건은 대출 신청 과정에서 고객 정보 입력 후 며칠 내로 타 금융사에서 영업성 연락이 왔고, 이를 이상 징후로 인지한 고객사는 당사에 침해사고 조사를 의뢰하였다.
초기 서버 포렌식 과정에서 악성코드 실행 파일은 확인되지 않았으나, 네트워크 패킷 덤프에서 SMTP(25/tcp) 세션의 페이로드에서, HTTP 헤더·바디 데이터와 암호화된 데이터가 함께 포함된 패킷이 확인되었다. 패턴 기반 키 추정을 통해 암호화 키를 알아내어 복호화에 성공하였고 그 결과 악성코드 실행 명령어를 확인할 수 있었다. 실제로 복호화된 데이터는 아래와 같다.
/etc/[악성코드 경로]/[인포스틸러 로더] -jar /etc/[악성코드 경로]/[인포스틸러] -url [DB 정보] -u [계정 아이디] -p [계정 비밀번호] -q[날짜 및 시간 데이터] -qSTA MBDE -d "0:0, 1:1, 2:1, 5:0" -de "0"
exit
악성코드 경로에서 인포스틸러와 백도어를 확인하였으며, 이후 디스크 이미지 분석으로 루트킷 존재를 확인하였다.
4.2. 악성코드 연관성
공격에 사용된 인포스틸러는 공격자가 원하는 정보 탈취에 맞춰 맞춤 제작되었으며, 백도어와 루트킷은 구성 및 동작 방식이 공격자 VMware 덤프 파일 내 tomcat20220420_rootkit
디렉토리에서 확인된 백도어, 루트킷과 일치하다.

caption - 좌) master.c(백도어) main 함수 소스코드, 우) 침해사고 당시 확보한 백도어 main 함수 의사코드

caption - 좌) main.c(루트킷) init 함수 소스코드, 우) 침해사고 당시 확보한 루트킷 init_module 함수 의사코드
빌드할 때 config.sh 파일에 따라 결정되는 매직 패킷, 루트킷 이름, 백도어 이름 등은 상이하지만 통신 데이터 xor key, AES key, iv 등 다양한 변수 값이 동일하다.
4.3. 공격 배후 근거
당시에는 백도어와 루트킷에 대하여 공개된 정보가 없었고, 루트킷이 adore-ng를 참고하여 제작되었다는 점 외에는 특정되지 않았다. 또한 코드 유사도, 공격 방식만으로 특정 행위자 귀속에는 한계가 있었다. 그러나 “목적·전술(TTP)”를 토대로 북한 APT 그룹은 아닌 것으로 결론을 내렸다. 주요 근거는 아래와 같다.
북한 APT 그룹은 주로 정보 수집이나 자산 탈취 성향이 강한 반면, 본 사건은 외부 서버에서 내부 서버까지 침투하여 DB 서버의 고객 정보를 탈취하고 보이스피싱에 활용된 정황이 중심이었다.
최초 침투 역시 스피어 피싱이나 사회 공학적 공격 기법이 아닌, 웹 서비스 취약점을 이용하였다. 이는 북한 APT 그룹이 주로 사용하는 초기 침투 방식과 다르다. 또한 웹 서비스 취약점을 이용하여 점거하더라도, C&C 서버로 활용하며 내부 침투까지 하는 경우는 드물다.
공개된 정보 중, 리눅스 시스템 대상으로 북한 APT 그룹이 루트킷과 백도어를 공격에 활용한 이력은 존재하지 않는다.
이후 2022년 6월, 루트킷을 avast에서 syslogk로 명명하여 보고서를 공개하였지만 야생에서 확인된 것으로 밝혔으며 여전히 공격 배후에 대한 근거가 부족하였다.
그러나 이번에 공개된 공격자 VMware 덤프에서 백도어와 루트킷의 원본 소스코드가 확인되었으며, 이는 공격 배후를 추정할 수 있는 유력한 근거로 판단된다. 또한 디렉토리 명도 침해사고 발생 시점과 유사하다.
따라서 APT Down - The North Korea Files 보고서에서 언급된 공격자가 2022년 국내 금융회사 침해사고 공격 배후로 유력하다고 판단된다.
마지막으로 백도어와 루트킷은 2025년 버전이 존재하는 것을 보아, 해당 악성코드들은 2022년부터 공격자가 지속적으로 사용하였고 2022년 국내 금융회사 공격 사례 외에도 공격자는 추가 공격을 수행해왔을 가능성이 높다고 생각된다. 이에 따라 감염 여부 점검 방법을 "7. syslogk rootkit 감염 여부 점검 방법
"에서 설명한다.
5. 공격 배후 추정 및 근거
APT Down - The North Korea Files 보고서의 공격 배후는 중국 UNC5221 그룹과 연관있을 것으로 추정된다. 판단 근거는 아래에서 자세히 설명한다.
5.1. Kimsuky
5.1.1. Operation Covert Stalker
APT Down - The North Korea Files 보고서에 Operation Covert Stalker와 연관된 웹 서버 설정(SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
)이 특정 파일에서 확인되었다는 언급이 존재한다. 다만 내용이 축약되어 확실한 정보는 없었고, 안랩 Operation Covert Stalker 보고서에서 동일 지표를 확인할 수 없어 근거가 미약하다고 판단하였다.
5.1.2. GPKI Stolen Certificates
공격자 VMware 덤프 파일에서 GPKI 인증서가 다수 확인되었다. Kimsuky의 Troll Stealer가 GPKI 인증서 탈취 기능이 존재하는 것은 알려져 있으나, 공격자가 GPKI 인증서를 어떻게 탈취하였는지 확인되지 않았고 Troll Stealer와 연관된 파일이 발견되지 않았다. 따라서 Kimsuky와 연관성을 판단하기에는 근거가 미약한 것으로 판단된다.
5.1.3. Similar Targets
공격자 VMware 덤프 파일 중 네이버 피싱과 관련있는 파일(/work/mnt/hgfs/Desktop/New folder/htdocs/generator.php
)에서 nid[.]navermails[.]com 도메인이 확인되었다. 해당 도메인은 안랩에서 작성한 보고서에서 네이버 피싱 도메인으로 언급되지만 Kimsuky에 대한 내용은 찾을 수 없다. 따라서 근거가 미약하다고 판단하였다.
5.2. APT41 & UNC3886
5.2.1. reptile rootkit 연관성
reptile rootkit은 APT41과 UNC3886 그룹이 공격에 사용한 이력이 보고되었다.
공격자 VMware 덤프 파일에서 확인된 syslogk(tomcat*_rootkit)과 reptile rootkit의 공통점은 다음과 같다.
함수 후킹을 위해 사용하는 라이브러리가 동일하다.
일부 함수가 유사한 코드를 가진다.
port knocking 방식으로 백도어를 실행한다.
syslogk와 reptile rootkit의 연관성이 존재하지만, reptile rootkit은 오픈소스이고 해당 지표만으로 특정 APT와의 연관성을 판단하기에는 무리가 있다고 판단하였다. 실제로 syslogk는 reptile rootkit 외에 KoviD rootkit 소스코드가 그대로 사용되는 등 다양한 오픈소스를 참고한 흔적이 존재한다. 따라서 APT41과 Unc3886으로 귀속하기에는 근거가 미약한 것으로 판단된다.
5.2.3. TinyShell 연관성
UNC3886 그룹이 공격에 자주 사용하는 것으로 알려진 TinyShell 소스코드가 /work/mnt/hgfs/share_data/backdoor/20220812/SSS
디렉토리에 존재한다. 그러나 구글에서 보고된 UNC3886의 TinyShell기반의 백도어는 AES, HMAC 또는 RC4로 암호화된 통신을 하는데, 확인된 TinyShell 소스코드는 AES와 SHA1으로 암호화된 통신을 한다. 통신 방법에 차이가 있어 근거가 미약한 것으로 판단하였다.
5.3. UNC5221
5.3.1. CVE-2025-0282, BrushFire
CVE-2025-0282는 Ivanti Connect Secure의 RCE 취약점으로, UNC5221이 악용하여 악성코드를 유포한 정황이 보고되었다. 공격자 파일 중 해당 취약점을 악용해 악성코드를 배포하는 Python 스크립트 6개가 확인되었으며, 스크립트에서 유포되는 악성코드는 UNC5221 공격에서 확인된 BrushFire로 식별되었다.
동일한 취약점 악용과 동일 악성코드 유포 정황을 근거로 UNC5221과 연관성이 높다고 판단하였다.
5.3.2. SPAWN Family
SPAWN Family는 UNC5221이 자주 사용하는 악성코드로, /work/mnt/hgfs/Desktop/New folder/203.234.192.200_client.zip
파일 내에서 SPAWN Family와의 관련 지표가 확인되었다. 연관성이 확인된 SPAWN Family는 SPAWNMOLE, SPAWNSNAIL, SPAWNCHIMERA이다.
client.py에 정의된 client_hello 값은 이후 코드에서 자동 변경되는데, 초기 값은 UNC5221 공격에서 사용된SPAWNMOLE의 매직 패킷과 일치한다. 변경된 client_hello 값은 JPCERT 블로그에서 보고된 SpawnChimera 매직 패킷 설명과 유사한 것으로 확인되었다. SPAWNCHIMERA 악성코드는 SPAWNMOLE과 마찬가지로 UNC5221의 공격에 사용된 악성코드로, 앞서 언급된 CVE-2025-0282 취약점을 통해 유포된 악성코드이다.
controller.py는 client.py가 구동한 SOCKS5 프록시를 통해 SSH 서버에 접속하는 클라이언트 스크립트로, SPAWNSNAIL 혹은 SPAWNCHIMERA의 클라이언트 프로그램으로 추정된다.
따라서 SPAWN Family 계열 악성코드가 다수 확인되었고, client_hello 초기 값과 변경 값이 각각 SPAWNMOLE, SPAWNCHIMERA 매직 패킷 특성과 일치하고 유사한 점, SPAWN Family 계열 악성코드가 UNC5221의 대표적인 악성코드인 점을 근거로 UNC5221과 연관성이 높다고 판단하였다.
5.3.3. ROOTROT
ROOTROT은 UNC5221의 공격에서 확인된 웹쉘이다. Perl로 작성되어 있으며, 쿠키의 특정 값을 base64로 디코딩하여 eval로 실행한다. 실행 결과는 HTML 주석 형태로 HTTP 응답 맨 뒤에 삽입되어 사용자에게 전송된다. 공격자 파일 중 ROOTROT의 클라이언트로 추정되는 스크립트 /work/mnt/hgfs/Desktop/ivanti_control/main.py
가 확인되었다. 해당 스크립트는 주어진 명령어를 실행하도록 작성된 Perl 스크립트를 base64로 인코딩한 뒤 DSPSALPREF 쿠키 값으로 설정하여 HTTP GET 요청을 전송한다. 이는 쿠키 값을 디코딩해 Perl로 실행하는 ROOTROT의 클라이언트 동작과 정확히 일치한다.
또한 main.py는 GET 응답의 마지막 주석을 base64로 디코딩해 사용자에게 표시하는데, 이는 웹쉘 실행 결과를 사용자에게 전달하기 위한 ROOTROT 클라이언트의 표준 동작과 일치한다. 이러한 정보를 근거로 UNC5221과 연관성이 높다고 판단하였다.
그러나 UNC5221 관련 악성코드를 공격자가 공유 받아 사용한 가능성도 있다.
악성코드 및 공격 가이드
네이버 중간자 공격과 관련있는 디렉토리에서 중국어로 공격 환경 구축에 대해 작성된 readme.txt 파일이 확인되었다.
work/mnt/hgfs/share_data/backdoor
디렉토리 하위에도 중국어로 작성된 readme.txt 파일과 1.ko 图文编译 .doc(1.ko 그림과 텍스트 편집 .doc), 技术说明书 - 22.docx(기술 설명서 - 22.docx) 파일이 존재한다.그러나 미완성인 Cobalt Strike Beacon, 공격자가 과거부터 사용한 것으로 보이는 syslogk root은 기능 테스트와 디버그를 위한 로직은 존재하지만 사용 방법이 어디에도 작성되어 있지 않다.
"contact" 키워드가 언급된 악성코드
CVE-2025-0282 exploit 관련 악성코드의 detect_version에서
This version may exist vul, Please contact us to check.
문자열을 출력하는 것을 알 수 있고, exp1_admin.py에서도 이를 알 수 있다. 이는 공격자가 CVE-2025-0282 exploit 관련 파일을 다른 공격자나, 조직 내 누군가에게 공유받았을 가능성을 암시한다.
최종적으로 공개된 자료를 분석하였을 때, 공격자는 중국어에 익숙하고 중국 소프트웨어, 커뮤니티, 서비스 등을 이용한다. 공격자가 사용하는 OS 또한 중국에서 개발하고, 중국인 외에는 잘 사용하지 않는 것으로 알려진 deepin OS인 것을 근거로 공격자는 중국인으로 추정된다. 또한 UNC5221 공격과 관련있는 악성코드가 다수 확인된 점에서 UNC5221 그룹과 연관있는 것으로 보인다.
6. 마치며
본 보고서는 APT Down - The North Korea Files 보고서와 공개된 자료를 기반으로 상세 분석한 내용을 정리하였다.
특히 공개된 자료는 일반적으로 확보가 어려운 공격자 실제 환경(VMware VM, VPS) 덤프 파일로 공격자의 활동을 구체적으로 들여다볼 수 있어 큰 도움이 되었다.
공개된 자료에는 국내를 표적으로 삼은 공격 흔적과 탈취된 것으로 보이는 국내 기업, 기관과 관련된 자료가 다수 존재한다. 특히 공격자 VM과 호스트에서 확인된 tomcat*_rootkit
디렉토리의 루트킷, 백도어 소스코드는 2022년 국내 금융회사 침해사고에서 채증된 악성코드의 소스코드인 것을 확인하였다.
루트킷과 백도어는 2022년 버전 외에 2025년 버전도 존재하는데, 이는 공격자가 지속적으로 업그레이드하면서 장기간 사용해 왔음을 시사한다. 2022년에 루트킷과 백도어를 사용한 실제 공격 사례가 확인되었으나, 해당 악성코드들은 탐지가 어렵고 감염 징후를 쉽게 알 수 없어 적어도 2022년부터 2025년까지 식별되지 않은 추가 공격 사례가 존재할 것으로 보인다. 이에 따라 감염 점검 절차를 "7. syslogk rootkit 감염 여부 점검 방법"에 정리하였다.
공격자는 북한 공격 그룹 Kimsuy가 아닌 UNC5221 그룹과 연관있는 중국인으로 판단하였다. 공격 배후를 확신할 수 있는 근거는 확인되지 않았지만, 다수의 악성코드 관련 파일에서 중국어가 확인되었고 중국 소프트웨어, 커뮤니티, 서비스를 이용하며 한국어나 영어를 중국어로 번역해 확인한 흔적이 존재한다. 그리고 Ivanti Connect Secure 관련 악성코드들은 UNC5221 그룹이 공격에 사용한 악성코드와 일치하는 부분이 다수 확인되었다.
종합적으로 공격자는 과거부터 현재까지 국내를 지속적으로 표적으로 삼아 공격해왔고, 공개 자료에서 루트킷, 1-Day 익스플로잇 악용과 국내 기업·기관 자료도 다수 확인되었다. 이 정황을 종합할 때 공격자는 고도화된 공격 역량과 악성코드 개발 능력을 보유하였고, 실제로 공격에 성공하여 자료 탈취까지 이른 정황이 확인되었다.
7. syslogk rootkit 감염 여부 점검 방법
2022년 침해사고 조사 당시 syslogk 루트킷은 /etc/init.d
에 존재하는 스크립트에 의해 부팅될 때 자동으로 로드되었다. 공개된 자료를 통해 syslogk 루트킷을 빌드할 때 설치 스크립트(install.sh)와 제거 스크립트(del.sh) 그리고 로더 스크립트(shservice)가 생성되는 것을 확인할 수 있었다. 이때 생성되는 파일 중 로더 스크립트(shservice)는 2022년 침해사고 조사 당시 확인한 스크립트와 동일하다.

caption - shservice 파일 내용
따라서 config.sh로 생성된 스크립트와 악성코드를 기반으로 감염 여부를 점검한다.
모든 스크립트는 관리자 계정 또는 권한으로 실행해야 하고 2022, 2025 루트킷 백도어 모두 탐지 가능하다.
7.1. /etc/init.d 은닉 파일 점검
/etc/init.d
에 루트킷을 부팅될 때마다 로드하는 스크립트가 존재하는지 확인한다. 스크립트 파일명은 루트킷에서 은닉하는 문자열이어서 일반적으로 탐지가 불가하다.
따라서 /etc/init.d 디렉토리가 차지하는 디스크 용량과 디렉토리 내에서 확인 가능한 모든 파일이 차지하는 디스크 용량의 총 합을 비교하여 숨겨진 파일이 존재하는지 확인하는 스크립트를 제작하였다. 스크립트는 부록 A. check-initd.sh
로 별첨하였다.
7.2. syslogk rootkit 점검
로더 스크립트에 작성된 문자열을 기반으로 syslogk 루트킷 경로를 추출한다. dump를 사용하여 /etc/init.d
디렉토리 덤프 파일을 생성하기 dump가 설치되어야 한다.
sudo apt install dump
덤프 파일에서 일치하는 문자열을 찾으면 루트킷 경로를 추출하고, 모듈 언로드를 위해 은닉을 해제할 데이터를 찾는다. 데이터를 찾으면 루트킷에 작성하여 은닉을 해제하고 언로드한다.
스크립트는 부록 B. find-syslogk.py
, 부록 C. find-syslogk.sh
로 별첨하였다.
부록 B. find-syslogk.py
는 python 버전 3.7 이상을 사용한다.
dump는 일부 시스템에서 동작하지 않을 수 있어서, 부록 A. check-initd.sh
로 은닉된 파일 존재 유무를 확인한 경우 디스크 이미지를 덤프하거나 분석 도구에 마운트하여 점검하기 바란다.
7.3. Backdoor 실행 여부 점검
백도어 프로세스는 /proc/*/cmdline
경로에 대한 글로브 열거 결과를 토대로 직접 접근할 때의 결과를 비교하여 탐지한다. 실행중인 프로세스의 최대 pid를 기준으로 스캔하여 실행중인 프로세스가 많은 시스템에서는 부하가 증가할 수 있다.
스크립트는 부록 D. check-backdoor.py
, 부록 E. check-backdoor.sh
로 별첨하였다.
부록 D. check-backdoor.py
는 python 버전 3.0 이상을 사용한다.
8. 부록
부록 A. check-initd.sh
부록 B. find-syslogk.py
부록 C. find-syslogk.sh
부록 D. check-backdoor.py
부록 E. check-backdoor.sh
Popular Articles