상세 컨텐츠

본문 제목

GitLab 플렛폼을 이용한 Kimsuky 공격 사례

악성코드 분석 리포트

by 알약4 2026. 4. 3. 18:32

본문

[이미지] 생성형 AI 제작

 

 

이스트시큐리티 대응센터(ESRC)에서 운영 중인 APT TDS(Threat Detection System)에서는 최근 이력서 대북 정책 문서로 위장한 악성 LNK(바로가기) 파일의 유포 정황을 포착했습니다.  

 

TDS에서 탐지된 악성 LNK 파일은 2종으로, 각각 구직자의 자기소개서와 북한 관련 정책 문서로 위장하고 있습니다.

  • 이소연 자기소개서.pdf.lnk
  • 2df24d850d6a50410e6503bc449a61778e5e88722ea4e20e198ea61e45a6903e.lnk

 

[그림 1] APT TDS에서 탐지된 악성 LNK 파일 화면

 

[그림 2] PDF 파일로 위장한 악성 LNK 파일

 

분석 결과 해당 LNK 파일은 배후 공격그룹인 김수키(Kimsuky) 그룹의 전형적인 LNK 기반 공격방식을 따르고 있어 이번 공격 역시 해당 그룹의 소행으로 판단됩니다.

다만 C2 서버로 깃허브(GitHub) 활용하던 과거 방식과 달리 이번 공격에서는 깃랩(GitLab) 플렛폼을 사용하였습니다.

 

파일의 내부 공격 구조와 최종 페이로드는 동일하며, LNK 파일 실행 백그라운드에서 다단계 파워셸(PowerShell) 스크립트가 실행되어 시스템 정보를 수집하고 암호화하여 외부로 전송합니다.

 

 

공격 흐름

 

1. 최초 감염 벡터 - LNK 파일

사용자가 정상 문서 파일로 오인하여 LNK 파일을 실행하면 LNK 내부의 난독화 파워셸 명령이 복호화 %APPDATA% 경로에 firefox.ps1 이름으로 저장되어 실행됩니다.

 

[그림 3] LNK 파일 내부 난독화 된 파워셸 스크립트

 

2. 1 드롭퍼 (firefox.ps1) - 탐지 회피와 지속 감염 환경 구성

Firefox.ps1 파일은 공격의 초기 준비를 모두 담당하는 핵심 스크립트로서 실행 다음 가지 동작을 순차적으로 수행합니다.

 

파일명 변경 파일명  폴더 경로 행위
docx.pdf 이소연 자기소개서.pdf %TEMP% 디코이 PDF
Yahoo.rtf Yahoo.jse %AppData%\Microsoft\Windows\Templates 지속성 유지 스크립트
Yahoo.jse facebook.ps1 %AppData%\Microsoft\Windows\CloudStore 2 다운로더
Ajobcall.txt news.ps1 %AppData% 최종 페이로드(정보탈취)

[표 1] 단계별 생성 파일 목록

 

2-1) 미끼 PDF 파일 표시

GitLab 저장소에서 미끼용 docx.pdf 내려받아  %TEMP% 경로에 악성 LNK 파일에 따라 '이소연 자기소개서.pdf’ 또는 북한대외전략분석__남북관계개선방안.pdf 이름으로 저장하여 실행됩니다.
사용자에게는 정상적인 PDF 문서파일 보여주며 의심을 피합니다.

 

[그림 4] 미끼파일로 사용된 정상 PDF 파일 (1)

 

[그림 5] 미끼파일로 사용된 정상 PDF 파일 (2)

 

 

2-2) 지속성 확보 - 스케줄러 등록

GitLab 저장소에서 Yahoo.rtf 파일을 다운로드 하여%AppData%\Microsoft\Windows\Templates 경로에 Yahoo.jse 이름으로 저장한 , Yahoo.jse 악성 스크립트 파일이 반복 실행되도록 다음과 같은 이름으로 스케줄러를 등록합니다.

  • 스케줄러명: MicrosoftEdgeUpdateTaskMachineGGswr{F60293632-35R-4A2F-96A8-03C3ECD693f5}
  • 실행 주기 : 10분 지연 시작, 이후 35분 간격 반복

[그림 6] 등록된 작업 스케줄러

 

2-3) 2 다운로더 설치 - facebook.ps1 생성

Yahoo.jse 스크립트 인코딩된 문자열을 디코딩하여 메모리 내에서 2 파워셸 스크립트를 구성한 %AppData%\Microsoft\Windows\CloudStore\ 경로에 facebook.ps1 이름으로 저장합니다.

 

2-4) 최종 페이로드(news.ps1) 즉시 실행 - news.ps1 최초 실행

GitLab 저장소에서 암호화된 형태로 저장된 ajobcall.txt 파일을 내려받아 복호화한 , news.ps1이라는 이름으로 저장하고 즉시 실행합니다. 실행이 완료되면 스크립트 자신을 삭제하여 흔적을 지웁니다.

 

 

3. 2 다운로더 (facebook.ps1) - 35분마다 반복되는 정보탈취

facebook.ps1 2단계에서 등록된 예약 작업에 의해 35 주기로 반복 실행되는 2 다운로더로써 GitLab 저장소에서 암호화된 scall.txt 파일을 다운받아 복호화한 news.ps1 저장하고 실행합니다.

 

[그림 7] news.ps1 생성 코드

 

보안 솔루션의 탐지를 우회하기 위해 스크립트 내부 코드 일부를 분리된 조각으로 나눠 저장하고 실행 시점에 조립하는 방식을 사용합니다.

이를 통해 공격자는 GitLab 저장소의 scall.txt 파일만 교체하면, 피해자 시스템에서 실행되는 악성코드를 언제든지 원격으로 업데이트할 있습니다.

 

 

4. 최종 페이로드(news.ps1) - 정보탈취형 악성코드

2단계(firefox.ps1) 3단계(facebook.ps1) 파워셸 스크립트는 모두 최종적으로 동일한 정보탈취 악성코드인 news.ps1 실행합니다.

해당 파워셸 스크립트는 정보수집암호화유출흔적 삭제 순서로 동작하며, 실행 어떠한 흔적도 남기지 않도록 설계되었습니다.

 

4-1) 감염 시스템 식별 정보 수집

Windows 내장된 시스템 관리 기능인 WMI(Windows Management Instrumentation)  이용해 감염 시스템에서 다음과 같은 정보를 수집합니다.

  • 활성화된 로컬 IP 주소 수집
  • 시스템 마지막 부팅 시간 수집

수집된 정보는 다음과 같은 규칙으로 파일명이 생성되어 %AppData% 경로에 저장됩니다.

  • 규칙: <IP Address>-<MMdd_HHmm>-XXX-kkk.txt

[그림 8] 수집된 정보 파일 저장 코드

 

4-2) 수집 데이터 암호화

수집된 정보는 외부로 전송하기 전에 AES-256 방식으로 암호화합니다. 수집된 데이터를 암호화하여 전송하기 때문에, 네트워크 보안 장비가 트래픽 내용을 확인해도 악성 행위임을 판별하기 어렵습니다.

 

4-3) GitLab API 통한 데이터 유출

암호화된 파일을 Base64 인코딩한 공격자가 미리 설정해 GitLab API 토큰을 이용해 공격자 저장소로 전송합니다.

  • 업로드 경로: report/<IP주소>-<날짜시간>-XXX-kkk.txt.enc

[그림 9] GitLab 저장소 업로드 경로

 

4-4) 흔적 삭제
전송이 완료되면 수집된 원본 파일, 암호화된 업로드 파일, 실행된 스크립트 자신까지 모두 강제 삭제합니다. 이는 감염 시스템에 남는 흔적을 최소화하여 사용자가 감염 사실을 인지하기 어렵게 만들고, 사후 추적을 방해하기 위한 목적으로 볼 수 있습니다.

 

 

공격 특징 

이번 공격에서 확인된 주요 공격 특징을 정리하면 다음과 같습니다.

 

  • 이중 확장자와 미끼 파일을 활용한 위장 공격
    .pdf.lnk 같은 이중 확장자 형태로 파일명을 구성하여 사용자가 정상적 문서 파일로 오인 하도록 유도했으며, 미끼 파일을 활용해 감염 사실을 인지하기 어렵게 만듭니다.

  • 합법적 서비스(GitLab) 악용
    별도의 악성 서버 없이 GitLab C2 활용함으로써 네트워크 탐지 시스템을 효과적으로 우회합니다. 443 포트 HTTPS 트래픽이고 도메인 자체가 신뢰 대상이기 때문에, 방화벽과 IPS 기반 차단이 어려우며, C2 저장소 삭제만으로 증거가 즉시 소멸될 있어 추적을 피하기 쉽습니다.

  • 다단계 구조를 통한 탐지 우회
    LNK 파일 → 1 스크립트 → 2 스크립트정보탈취 스크립트로 이어지는 다단계 구조를 사용하여 단계에서 보안 솔루션의 탐지 가능성을 분산시킵니다.
    악성 코드 자체도 암호화된 형태로 배포되기 때문에 파일 기반 정적 탐지를 우회합니다.

  • 예약 작업 위장을 통한 지속성 확보
    Microsoft Edge 업데이트 작업명으로 위장한 예약 작업을 통해 시스템 재부팅 이후에도 35 주기로 악성 스크립트가 반복 실행됩니다. 공격자는 구조를 이용해 GitLab 저장소의 파일만 교체하면 피해자 시스템에서 실행되는 악성코드를 원격으로 업데이트할 있습니다.

  • 증거 인멸을 위한 흔적 삭제
    정보 전송 완료 수집 파일, 암호화 파일, 스크립트 자신까지 모두 강제 삭제하여 감염 시스템에 흔적을 최소화합니다.

 

이번 공격은 .pdf.lnk 같은 이중 확장자로 정상 문서처럼 위장하고, 클릭 실제 정상 문서 파일을 함께 보여주는 미끼 파일 기법을 활용하여 사용자가 감염 사실을 인지하기 어렵게 만듭니다.

또한 합법적인 플랫폼인 깃랩을 C2 서버로 악용해 정상 트래픽으로 위장함으로써 네트워크 보안 장비의 탐지까지 우회하는 정교한 공격입니다.

 

이러 공격을 예방하기 위해서는 출처가 불분명한 파일의 실행을 자제해 주시고, 특히 윈도우 탐색기의 '파일 확장명 표시' 옵션을 상시 활성화하여, 이중 확장자로 위장한 파일은 실행하지 않도록 각별히 주의하시기 바랍니다.

 

 

IoC

Indicator Type Description Detection Name
5577fffb5b5acd3771ef9dc696498f1e MD5 LNK 파일 Trojan.Agent.LNK.Gen
302725413076d1aeaee2d7f2b3692646 MD5 LNK 파일 Trojan.Agent.LNK.Gen
hxxps[://]gitlab[.]com/arkiler-group/at gitlab 저장소    
hxxps[://]gitlab[.]com/kevin-group5101713/ri/hifer gitlab 저장소    

 

 

 

관련글 더보기

댓글 영역