또 김수키? 이번엔 수산 식자재 구매 요청서로 위장

또 김수키? 이번엔 수산 식자재 구매 요청서로 위장

수산 식자재 구매를 검토해 달라는 요청서가 도착했다. 파일을 열면 정상 HWP 문서가 나타나지만, 사용자가 내용을 확인하는 사이 뒤에서는 악성 스크립트가 실행되고 예약 작업까지 등록된다. 이후 시스템 정보를 외부로 빼내고 추가 명령을 내려받아 실행하며 흔적까지 지운다. 정상 업무 문서를 앞세워 공격을 감춘 김수키(Kimsuky) 연관 악성 LNK의 수법을 살펴보자.

수산 식자재 구매 요청서로 위장한 악성 LNK

안랩은 최근 국내 사용자를 대상으로 수산 식자재 구매 검토 요청서로 위장한 악성 LNK 파일이 유포되는 정황을 확인했다. 확인된 파일명은 [로얄호텔서울] 수산 식자재 구매 검토 요청서.LNK로, 실제 업무에서 받을 법한 문서처럼 꾸며 사용자의 실행을 유도한다.

사용자가 LNK 파일을 실행하면 PowerShell을 이용해 내부 데이터를 추출한다. 이 과정에서 원본 LNK와 같은 경로에 정상 HWP 문서가 생성돼 사용자에게 보여진다. 동시에 XOR 방식으로 암호화된 ZIP 데이터를 C:\ProgramData\systmp\sunshine 경로에 저장한다.

ZIP 파일에는 PowerShell 스크립트인 termsvc.ps1과 JavaScript 파일인 poc.js가 포함돼 있다. 압축을 해제한 뒤에는 관련 파일을 C:\ProgramData\video 경로에 생성하고, poc.js를 C:\ProgramData\systmp\ping\_<UUID 앞 4자리>.js 형태로 별도 저장한다.

즉 화면에는 정상적인 HWP 문서가 나타나지만, 그 뒤에서는 후속 공격에 필요한 스크립트와 파일이 동시에 준비되는 구조다.

[그림 1] 정상 디코이 문서

 

14분마다 되풀이되는 악성 스크립트

공격자는 생성된 JavaScript가 지속적으로 실행되도록 예약 작업도 등록한다. 작업 이름은 MicrosoftOffice2016\_<UUID 앞 4자리> 형태이며, wscript.exe를 통해 약 14분 간격으로 ping\_<UUID 앞 4자리>.js가 실행되도록 설정한다.

해당 JavaScript는 난독화돼 있으며, C:\ProgramData\video\termsvc.ps1 파일이 존재하는지 확인한 뒤 PowerShell 실행 정책을 우회해 해당 스크립트를 숨김 상태로 실행한다. termsvc.ps1은 이후 감염 시스템의 정보를 수집해 외부로 전송하고, 추가 명령을 내려받아 실행하는 역할을 한다.

[그림 2] ping\_<UUID 앞 4자리>.js 파일

 

공격 과정에서는 관련 경로를 은닉하고, 초기 유포에 사용된 LNK 파일과 중간 단계에서 생성된 sunshine 파일을 삭제하는 동작도 확인됐다. 실행에 필요한 구성 요소를 남기는 동시에 일부 흔적은 제거하는 방식이다.

[그림 3] termsvc.ps1 파일

감염 시스템 정보 수집 및 외부 전송

실행된 termsvc.ps1은 감염 시스템의 다양한 정보를 수집한다. 확인된 항목은 다음과 같다.

  • 운영체제 이름 및 아키텍처
  • 시스템 시간대
  • 공인 IP 주소
  • 사용자 이름 및 도메인
  • 실행 중인 프로세스 목록
  • 컴퓨터 이름

 

공인 IP 주소는 api.ipify.org를 조회해 확인하고, 실행 중인 프로세스 목록은 tasklist 명령을 이용해 수집한다.

이후 스크립트는 Backblaze B2 API에 인증해 버킷 정보를 가져온다. BIOS 일련번호를 기반으로 감염 시스템을 구분하는 경로를 만든 뒤, 수집한 정보를 UTF-8 형식의 텍스트 데이터로 변환해 해당 경로에 업로드한다.

이번 공격에서 Backblaze B2는 단순한 파일 저장 공간이 아니라 감염 PC의 정보를 외부로 빼내고 후속 명령을 전달하는 C2 인프라로 활용됐다.

 

정보 탈취 후 추가 명령까지 실행

공격은 시스템 정보를 전송하는 데서 끝나지 않는다. 정보 유출이 끝나면 termsvc.ps1은 동일한 Backblaze B2의 시스템별 경로에서 aaa라는 이름의 추가 명령 파일을 내려받는다.

다운로드한 데이터는 %TEMP% 경로에 임의의 이름을 가진 .cmd 파일로 저장되고, cmd.exe /c 방식으로 숨김 실행된다. 이를 통해 공격자는 감염 시스템에 필요한 추가 명령을 전달하고 실행할 수 있다.

명령 실행 이후에는 약 120초 동안 대기한 뒤 로컬에 저장했던 .cmd 파일을 삭제한다. 외부에서 명령을 받아 실행한 뒤 관련 파일을 제거해 흔적을 줄이는 것이다.

 

과거 김수키 공격과의 연관성 확인

이번 공격에서는 과거 김수키 연관 악성 LNK 공격에서 확인된 것과 유사한 코드와 동작 방식이 다수 발견됐다.

PowerShell 실행 구문뿐만 아니라 파일 크기를 기준으로 원본 LNK를 식별하는 방식, 고정 오프셋을 이용해 LNK 내부 데이터를 추출하는 구조, 작업 스케줄러를 등록해 악성 스크립트를 반복 실행하는 방식 등이 기존 사례와 유사했다.

안랩은 이러한 코드와 동작상의 유사성을 바탕으로 이번 악성 LNK 역시 김수키 그룹과 연관된 것으로 판단했다.
 

수산 식자재 구매 요청서를 실행했다면 확인할 것들

이번 공격과 유사한 감염이 의심된다면 다음 항목을 중심으로 점검할 필요가 있다.

1. 악성 LNK 수신 및 실행 여부 확인
[로얄호텔서울] 수산 식자재 구매 검토 요청서.LNK와 동일하거나 유사한 이름의 LNK 파일을 수신하거나 저장·실행한 이력이 있는지 확인한다.

2. 비정상 예약 작업 점검
MicrosoftOffice2016\_ 형태의 예약 작업이 등록돼 있는지 확인한다. 특히 wscript.exe를 이용해 약 14분 간격으로 JavaScript 파일이 반복 실행되는 항목이 있는지 살펴본다.

3. 관련 파일과 경로 확인
다음과 같은 경로와 파일의 존재 여부를 점검한다.

  • C:\ProgramData\systmp\sunshine
  • C:\ProgramData\systmp\ping\_.js
  • C:\ProgramData\video\termsvc.ps1
  • C:\ProgramData\video\poc.js

초기 LNK와 일부 파일은 공격 과정에서 삭제되므로 해당 경로의 파일 생성·삭제 흔적도 함께 확인해야 한다.

4. 추가 명령 실행 흔적 확인
%TEMP% 경로에서 임의 이름의 .cmd 파일이 생성되거나 cmd.exe /c 형태로 실행된 이력이 있는지 확인한다. 이후 해당 파일이 삭제된 흔적도 함께 점검한다.

5. 정보 수집과 외부 통신 여부 확인

Backblaze B2 관련 통신과 인증 흔적을 살펴보고, api.ipify.org를 통한 공인 IP 조회와 tasklist 실행 여부도 확인한다. 운영체제 정보와 사용자·도메인 정보, 컴퓨터 이름, 실행 중인 프로세스 목록 등이 수집된 흔적도 점검할 필요가 있다.

업무 문서처럼 보이는 파일이라도 LNK 형식이거나 출처가 불분명하다면 실행에 주의해야 한다. 특히 정상 HWP 문서가 열렸다는 사실만으로 파일이 안전하다고 판단해서는 안 된다. 파일 형식과 실행 경로를 확인하고, LNK와 PowerShell, wscript.exe, cmd.exe, 외부 클라우드 서비스 통신이 연계되는 비정상 행위를 지속적으로 모니터링해야 한다.

AhnLab TIP를 구독하시면 연관 IOC 및 상세 분석 정보를 추가적으로 확인하실 수 있습니다. 자세한 내용은 아래 배너를 클릭하여 확인해보세요.