1. 개요
○ 북한 위협 행위자 Kimsuky가 ‘한국기계연구원’공격에 사용한 것으로 추정되는, 기유출된 CJ Olivenetworks 인증서 악용 악성코드 분석(공격에 사용된 Phishing정보는 미확인)
•
Kimsuky 그룹이 배후로 알려진 ‘Nexaweb* 인증서를 악용한 미국 방산 기업 채용 피싱’ 캠페인과 TTP(Tactic, Technique, Procedure) 유사성이 확인됨
* Nexaweb : 기업용 모바일, 태블릿, 데스크톱 및 웹 애플리케이션의 배포를 위한 소프트웨어 제공 기업
•
타임스탬프가 존재하는 인증서는 폐기되더라도 유효한 서명으로 인정되어 보안 시스템과 사용자의 신뢰를 쉽게 얻을 수 있어 주의가 필요
○ Kimsuky 그룹은 PebbleDash* 백도어 악성코드 등을 사용해 피해자 시스템 원격 제어 및 추가 악성 행위 수행하는 것으로 알려짐
* PebbleDash : 기문서 ‘[IG-25-4006-O] 북한발 PebbleDash 백도어 악성코드 분석 공유’ 참고
[그림 1] 공격 흐름도
2. 대응방안
○ 메일 열람 시 발신자 메일주소, 첨부된 링크 및 파일 등 신중히 확인 필요
○ 악성 실행 파일은 문서로 위장한 경우가 많아 파일 실행 시 아이콘, 확장자, 유형 등 확인 필요
•
확장자 확인을 위해 “폴더 옵션 > 보기 탭 > 알려진 파일 형식의 파일 확장명 숨기기” 체크 해제 권장
3. CJ 인증서 악성코드와 Kimsuky 그룹과의 연관성
○ 이번 악성코드 배포 캠페인은 CJ Olivenetworks 인증서를 악용한 Go* 언어로 작성된 실행파일(*.EXE) Dropper와 httpSpy.dll이라는 Backdoor를 사용한 것으로 분석
* GO : 구글에서 개발한 오픈소스 프로그래밍 언어
○ 해당 TTP는 이전 Kimsuky 그룹이 수행했다고 알려진 ‘Nexaweb* 인증서를 악용한 미국 방산 기업 채용 피싱’ 캠페인과 유사한 것으로 확인. 이번 캠페인 또한 북한 Kimsuky 그룹이 배후에 있을 것으로 사료됨
No | 유사성 | 정보 |
1 | Dropper | - Go언어로 작성된 Dropper 사용
- acrobat 로고와 유사한 아이콘 이미지 사용
- 유출된 인증서 악용 |
2 | Backdoor | - httpSpy.dll이라는 이름의 Backdoor 사용 |
[표 1] 미끼 PDF 생성 및 실행 과정
[그림 2] (좌) Nexaweb 인증서 악용 Dropper / (우) CJ 인증서 악용 Dropper
[그림 3] 동일한 아이콘을 사용하는 Dropper
[그림 4] httpSpy.dll로 동일한 DLL명
4. 악성코드 상세 분석
4.1 20250428 플랜아이 작업계획서 및 작업완료서_기계연 이명화.scr (TYPE: Dropper | MD5: 7ec88818697623a0130b1de42fa31335)
1) 파일 정보
○ CJ Olivenetworks의 인증서 악용 샘플 ‘20250428 플랜아이 작업계획서 및 작업완료서_기계연 이명화.scr’는 스피어 피싱을 통해 WinRAR 압축파일(*.RAR)로 배포된 것으로 추정
[그림 5] WinRAR 압축 파일 내부
○ 파일 포맷 확인 결과, 악성코드는 Go 언어로 빌드된 64-bit 실행파일로 확인
[그림 6] Go 언어로 빌드된 실행 파일
○ 공격자는 MS Screen Saver 파일(.SCR)이 윈도우 내부적으로 실행파일(.EXE)과 동일하게 실행되는 점을 악용해 사용자에게 익숙하지 않은 확장자로 실행파일임을 은닉
○ PDF 뷰어인 Acrobat 로고와 유사한 아이콘 사용해 PDF 문서로 위장하여 사용자가 악성코드를 실행하도록 유도
※ ‘20250428 플랜아이 작업계획서 및 작업완료서_기계연 이명화.scr’ 이하 sample.exe로 칭함
[그림 7] PDF 파일로 위장한 악성코드
○ 해당 파일은 이전 Kimsuky 그룹이 수행한 피싱 캠페인에서 사용된 Go 언어로 빌드된 Dropper와 동일한 아이콘을 사용하는 것으로 확인
No | 캠페인 | MD5 |
1 | 이전 | aa8936431f7bc0fabb0b9efb6ea153f9 |
2 | 확보 | 7ec88818697623a0130b1de42fa31335 |
[표 2] Kimsuky 그룹이 이전에 사용한 Dropper 정보
[그림 7] 동일한 아이콘을 사용하는 Dropper
○ 파일 속성에서 유출된 CJ Olivenetworks의 디지털 서명이 확인되었고, 해당 서명에는 타임스탬프가 존재하여 인증서가 폐기되더라도 유효한 서명으로 인정되어 보안 시스템과 사용자의 신뢰를 쉽게 얻을 수 있어 주의가 필요
[그림 9] 유효한 CJ Olivenetworks 디지털 서명
2) 실행 흐름
○ (악성 행위 수행 방식) 악성코드는 Go언어의 파일 임베딩 기능을 사용하여 빌드 과정에서 image/icon.png(미끼 PDF)와 image/image.png(악성 DLL)를 .rdata섹션에 임베딩 후, embed.FS.ReadFile 함수로 읽어와 악성 행위를 수행하는 방식을 사용
[그림 10] 미끼 PDF 데이터 및 파싱 코드
[그림 11] 악성 DLL 데이터 및 파싱 코드
○ (미끼 PDF 생성 및 실행) 임베드된 image/icon.png는 [표 3]의 과정에 따라 처리되며, 생성된 미끼 문서는 한국기계연구원의 IP 접근 허용 요청 관련 내용으로 확인
No | 행위 |
1 | 임베드된 ‘image/icon.png’(미끼 PDF) 획득 |
2 | 현재 실행파일 경로 획득 후, 확장자를 .pdf로 변경 |
3 | 현재 경로에 미끼 PDF 생성 후 열기 |
[표 3] 미끼 PDF 생성 및 실행 과정
[그림 12] 생성된 미끼 PDF
[그림 13] 생성된 미끼 PDF 내용
[그림 14] 미끼 PDF 생성 코드
○ (자기 자신 삭제) 미끼 문서 생성 후 오픈소스 모듈을 사용하여 자기 자신을 삭제해 실행 흔적 제거
[그림 15] 사용된 자가 삭제 오픈소스 Go 모듈
○ (악성 DLL 드롭 및 실행) 임베드된 image/image.png는 [표 4]의 과정에 따라 처리되며, rundll32.exe을 사용해 %PUBLIC%에 생성된 config.dat(악성 DLL)의 Export 함수를 실행
No | 행위 |
1 | 임베드된 image/image.png(악성 DLL) 획득 |
2 | C:\Users\Public 폴더에 config.dat으로 악성 DLL 파일 생성 |
3 | rundll32.exe를 사용해 악성 DLL의 hello 함수 실행 |
[표 4] 악성 DLL 생성 및 실행 과정
[그림 16] 악성 DLL 생성 및 실행 코드
[그림 18] Dropper에 의해 실행된 악성 DLL
4.2 config.dat (TYPE: Backdoor | MD5: 580d7a5fdf78dd3e720b2ce772dc77e9)
1) 파일 정보
○ %PUBLIC% 폴더에 드롭된 config.dat은 sample.exe와 달리 서명이 없는 64-bit DLL 파일로 확인
○ Virustotal 등록 엔진 일부에서 코드 가상화 패커인 VMProtect 진단 결과가 확인되었고 내부 확인 결과 다량의 연산 명령어로 난독화되어 있는 것으로 분석
[그림 20] Virustotal 조회 시, VMProtect 진단 결과
[그림 21] 난독화가 적용된 코드
○ 내부 데이터 확인 결과, 원본 DLL명은 httpSpy.dll으로 확인되었는데, 이전 Kimsuky 그룹의 피싱 캠페인에서 사용한 Backdoor 악성코드에서도 동일한 이름이 사용된 것이 확인됨
[그림 22] 확인된 원본 DLL 명
2) 실행 흐름
○ 확보 샘플의 경우, VMProtect로 추정되는 가상화 기반 난독화로 인해 분석에 어려움이 있어 Kimsuky 그룹이 이전 캠페인에서 사용한 샘플을 확보하여 추가적인 분석 진행
No | 캠페인 | MD5 |
1 | 이전 | 537806c02659a12c5b21efa51b2322c1 |
2 | 확보 | 580d7a5fdf78dd3e720b2ce772dc77e9 |
[표 5] Kimsuky 그룹이 이전에 사용한 Backdoor 정보
○ (문자열 복호화) 내부에서 사용되는 문자열은 .rdata 섹션에 위치한 데이터과 스택 내의 데이터를 조합한 후 XOR과 덧셈 연산을 통해 복호화하는 것으로 분석
[그림 23] 문자열 복호화 루틴
○ (동적 API 주소 획득) 복호화된 함수명을 사용해 FNV-1a 해시를 계산하고 해당 값을 사용해 DLL Base로부터 Export Table에 접근하여 API 주소를 획득하는 방식을 사용
[그림 24] FNV-1a 해시 계산 코드
○ (실행 준비) SetUnhandledExceptionFilter로 모든 예외 처리 핸들을 초기화 및 SetErrorMode를 사용해 에러 처리 관련 알림을 비활성화한 후, CreateThread를 사용해 새로운 스레드를 생성하여 악성 행위를 수행
[그림 25] 실행 준비 후 스레드 생성
○ (지속성 확보) 자신의 토큰을 확인 통해 권한에 따라 2가지 방식으로 지속성을 확보
No | 유형 | 권한 | 데이터 |
1 | SERVICE | 관리자 O | MicrosoftEdgeInstaller |
2 | REG | 관리자 X | HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\MSEdgeInstaller |
[표 6] 지속성 확보
[그림 26] 지속성 확보 - 레지스트리
[그림 27] 지속성 확보 - 서비스
○ (설정 파일 생성) 악성코드는 C2 주소를 복호화하고, ADS(Alternate Data Streams)*를 사용하여 파일을 생성하면 탐색기에서는 보이지 않는다는 점을 악용하여 파일 시스템에 저장
* ADS : NTFS 파일 시스템의 기능으로, 하나의 파일에 여러 데이터 스트림을 붙일 수 있음
[그림 28] 명령어를 통해 확인한 설정 파일 내용
○ (감염 사실 전송) 내부에서 winhttp.dll 내의 API들을 사용해서 [표 7]의 주소와 통신을 시도. HTTP를 사용하여 공격자에게 악성코드 감염 사실을 공지하는 행위 확인
•
분석 당시 해당 C2 주소에 대한 DNS 쿼리 요청은 실패하여 추가 분석 진행 불가
유형 | 정보 |
C2 | hxxp[:]//gsegse.dasfesfgsegsefsede.o-r[.]kr/login.php |
[표 7] C2 주소
[그림 29] C2 통신 API 로그
[그림 30] DNS 쿼리 실패 로그
○ (명령어 실행) 이후, [표 8]의 POST 요청을 통해서 C2와 통신하며 [표 9]의 명령을 수행
유형 | 정보 |
POST | _sessionchk=ck_param_auto&_logininfo=login_unknown&_pkgparam=01AD8D96 |
[표 8] POST 요청 문자열
[그림 31] POST 요청 로그
명령어 코드 | 기능 |
0x64 | 명령 실행, 명령 실행 결과 전송 |
0x65 | 파일 다운로드 |
0x66 | 파일 업로드 |
0x67 | 프로세스 생성 |
0x69 | 파일 삭제 |
0x6a | 스크린샷, 스크린샷 파일 업로드 |
0x6b | 설정 데이터를 전송 |
0x6c | 설정 데이터 업데이트 |
0x6d | 지정된 호스트 및 포트에 연결 |
0x6e | 일정 시간 정지 |
0x6f | 파일 타임스탬프 변경 |
0x70 | 종료 및 흔적 제거 |
0x72 | 명령 실행, 기능은 명령어 0x64와 동일 |
[표 9] 명령어 정보
[그림 39] 명령어 실행 코드 일부
5. IoC 정보
NO | Type | Data | Info |
1 | MD5 | 01e349800e4c04fd58f7d20c52e12daa | 스피어피싱으로 전달된 RAR 압축파일 |
2 | MD5 | 7ec88818697623a0130b1de42fa31335 | 20250428 플랜아이 작업계획서 및 작업완료서_기계연 이명화.scr |
3 | MD5 | 580d7a5fdf78dd3e720b2ce772dc77e9 | config.dat |
4 | MD5 | c05022f6827c6c99b21f01a44c704a25 | 20250428 플랜아이 작업계획서 및 작업완료서_기계연 이명화.pdf |
4 | MD5 | aa8936431f7bc0fabb0b9efb6ea153f9 | Automation Manager JD(LM HR II).scr |
5 | MD5 | 537806c02659a12c5b21efa51b2322c1 | zt1fbtn.on5l |
6 | C2 | hxxp[:]//gsegse.dasfesfgsegsefsede.o-r[.]kr/login.php | C2 통신 |
7 | C2 | hxxp[:]//gsegse.dasfesfgsegsefsede.o-r[.]kr/login.php/_sessionchk=ck_param_auto&_logininfo=login_unknown&_pkgparam=01AD8D96 | C2 통신 |
8 | REG | HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\MSEdgeInstaller | 지속성 확보 |





.png&blockId=1f5f216a-760c-80d0-88f0-fd78fa16c32e)

.png&blockId=1f5f216a-760c-8060-a06b-d8fa985509c0)
.png&blockId=1f5f216a-760c-8045-8719-f78c873620d1)

.png&blockId=1f5f216a-760c-808d-84d6-e1792e3abbcd)

.png&blockId=1f5f216a-760c-80b2-a024-ddce2b7d5afa)
.png&blockId=1f5f216a-760c-806c-a486-f26911f2777f)
.png&blockId=1f5f216a-760c-8005-9c35-e8c25762a845)
.png&blockId=1f5f216a-760c-805f-8576-fb569423f525)
.png&blockId=1f5f216a-760c-8084-a970-cf0888f2874c)

.png&blockId=1f5f216a-760c-8013-929e-e7d8de9a33e8)
.png&blockId=1f5f216a-760c-80b6-940e-f29e22672801)
.png&blockId=1f5f216a-760c-806c-8a13-ee6fbbe0ceba)
.png&blockId=1f5f216a-760c-804f-88bf-e3d41f0f1275)
.png&blockId=1f5f216a-760c-800b-803f-ddd9b6c421d1)
.png&blockId=1f5f216a-760c-808a-8007-fb3d1609a1bb)
.png&blockId=1f5f216a-760c-80a6-8f32-ddf6f8b68717)

.png&blockId=1f5f216a-760c-8068-860e-f3feca5a7e2f)
.png&blockId=1f5f216a-760c-8044-81b5-cfbeaa2a46a1)
.png&blockId=1f5f216a-760c-809d-8dac-d9f04baabc87)
.png&blockId=1f5f216a-760c-801f-b0eb-fa3541373a3e)
.png&blockId=1f5f216a-760c-80c7-9481-f71bc37f42dc)
.png&blockId=1f5f216a-760c-808c-91cc-cfb9d83177f2)
.png&blockId=1f5f216a-760c-80da-8c38-dfaf7d502cd7)
.png&blockId=1f5f216a-760c-8095-b0df-f2cd9e66b66e)

.png&blockId=1f5f216a-760c-80dc-83f2-eec5ce5a3096)
.png&blockId=1f5f216a-760c-8007-8303-d1c2fc9e50f1)
.png&blockId=1f5f216a-760c-8042-b8ff-fab1b00ca9ba)

.png&blockId=1f5f216a-760c-8001-8a44-d34b6b487725)

.png&blockId=1f5f216a-760c-80c0-a710-d5407e6bb2d0)