今日表示しない

トップへ戻る

トップへ戻る

マルウェア関連性分析
マルウェア関連性分析

脅威インテリジェンス

脅威インテリジェンス

脅威インテリジェンス

APT調

APT調

APT調

エンキホワイトハット

エンキホワイトハット

コンテンツ

コンテンツ

コンテンツ

概要

  • 2025년 2월 20일에 소만사가 국가 배후의 공격자에 의해 침해사고를 당해 코드 서명 인증서가 유출됐다는 기사가 보도됐다.

  • 엔키화이트햇 위협연구팀은 바이러스 토탈에서 소만사의 코드 서명이 적용된 악성코드를 발견했고 분석 결과 북한 APT 그룹과의 연관성을 확인했다.

  • 분석 과정에서 확인된 C&C 서버의 최상위 도메인이 p-e[.]kr이고, 이는 북한 APT 그룹이 자주 사용하는 도메인이다.

  • 악성코드 Rich Header 연관성 분석 결과, 북한, 중국, 이란 APT 그룹이 사용한 악성코드와 동일한 product id, build id가 확인됐다. 이는 악성코드 빌드 환경간의 연관성을 시사하며, 이 중 북한 APT 그룹 악성코드와 높은 연관성이 확인됐다.

1. 概要

韓国の主要情報セキュリティ企業であるソマンサ(Somanssa)のコード署名証明書の漏洩が明らかになり、VirusTotalにおいてソマンサのコード署名証明書が適用されたマルウェアが発見されました。

分析の結果、バックドア動作を実行するマルウェアであることが確認され、使用されたC&CサーバーとRich Headerをベースに関連性を追跡した結果、北朝鮮のAPTグループとの関連性が確認されました。

本稿では、このマルウェアの分析と、北朝鮮のAPTグループとの関連性について扱います。

2. 背景

2025年2月20日、情報セキュリティ企業であるSoman-sa(ソマンサ)が国家主体の攻撃者によって侵入され、コード署名証明書が流出したという記事が報道された。

20日、情報保護産業界と韓国インターネット振興院(KISA)によると、ソマンサは最近、顧客企業に対し「国家レベル(国家背景)の外部ハッキンググループによる攻撃を受け、製品のコード署名証明書が流出した状況が発見された」と通知した。

また、「去る6日からKISAと共に、二次被害を防止するために積極的に内部システムを点検している」と付け加えた。まだ調査が進行中であるため、ハッキング組織の背景にある国家がどこであるかは明らかになっていない。

ソマンサは通知を通じて「新しい証明書でパッケージを再署名しており、顧客企業のパッケージアップデートスケジュールに合わせてアップデートを進める予定だ」と明らかにした。

-セキュリティ企業「コード署名証明書」まで奪われた…国家背景のハッキング組織による攻撃より抜粋


2.1. コード署名

コード署名は、公開鍵暗号(Public Key Cryptography)を使用してプログラムの出所と整合性を確認できるようにする技術である。

コード署名は秘密鍵(Private Key)を使用して生成し、対応する公開鍵(Public Key)で検証することができる。公開鍵を使用して秘密鍵を取得することは事実上不可能であるため、実質的にこの仕組みを使用してプログラムの出所を知ることができる。しかし、今回のように秘密鍵が流出した場合、これを使用して直接コード署名を作成することができてしまう。

Windowsオペレーティングシステムでは、コード署名を適用することで、Windows Defender SmartScreenの警告表示に影響を与えることができる。

  • コード署名がないという警告が表示されなくなる。

  • 同じコード署名が適用されたプログラム同士で評価(レピュテーション)を共有する。

  • 証明書(Certificate)に付与された評価が十分であれば、未知の開発者であるという警告が表示されなくなる。

    • OV(Organization Validated)証明書の場合、基本的には十分な評価が付与されないため、警告が表示される。

    • EV(Extended Validation)証明書の場合、基本的には十分な評価が付与されているため、信頼できない出所であるという警告は表示されない。

同一の証明書で署名されたプログラムは一般的に評価を共有するため、証明書が流出して悪用された場合、該当の証明書で署名されたすべてのプログラムの評価が低下する可能性がある。また、証明書の流出が確認されると、該当の証明書は失効(ベキ)処理されることがあり、これによって証明書を発行した機関の信頼性も低下し、新たな証明書の発行が困難になる可能性がある。

コード署名証明書が流出した場合、攻撃者は該当の証明書をマルウェアに適用して、マルウェアの出所を偽装することができる。これにより、攻撃者はコード署名に基づく信頼を悪用し、正常なコード署名証明書が適用されたマルウェアをユーザーに実行させるよう誘導することが可能になる。

3. マルウェア解析

コード署名証明書の漏洩が確認されたため、攻撃者が漏洩した証明書をマルウェアに悪用した可能性が高いと判断し、マルウェアの確保を開始した。その結果、VirusTotalにてsignature:"somansa" tag:signedクエリでマルウェアを確保することができ、当該マルウェアは2025-02-21 05:25:56(UTC+0)に大韓民国から初めてVirusTotalにアップロードされた。


악성코드분석 1
caption - 바이러스 토탈 업로드 이력
caption - 바이러스 토탈 업로드 이력
caption - 바이러스 토탈 업로드 이력

マルウェアに有効な署名が適用されていることが確認でき、証明書の有効期間と署名時間はそれぞれ以下の通りである。

  • 有効期間: 2024-03-26 00:00(UTC+0) ~ 2025-03-22 23:59(UTC+0)

  • 署名時間: 2024-09-30 04:59:00(UTC+0)


악성코드 서명
caption - 코드 서명 정보
caption - 코드 서명 정보
caption - 코드 서명 정보

マルウェアが使用するほとんどの文字列は、シンプルな単一換字式暗号で暗号化されている。復号方式は以下の通りである。

  1. 文字列を1文字ずつ分離

  2. 各文字がカスタムアルファベットに含まれているかを検査

    • カスタムアルファベット - 7Uzc5ngXl_ESWkj3t14Cw+aYLvyh0odZH8OReKiNIr-JM2GQAxpmVb=qPTuB9Ds6fF

  3. カスタムアルファベットに含まれている場合、該当するインデックスを保存

    • 例) Uの場合は1

    • 含まれていない場合は元の文字を維持し、次の文字を検査

  4. custom_alphabet[(3で保存したインデックス + 41) % カスタムアルファベットの長さ] 文字と元の文字を置換

  5. 完了するまで上記の過程を繰り返す


암호화된 문자열
caption - 문자열 복호화 루틴
caption - 문자열 복호화 루틴
caption - 문자열 복호화 루틴

暗号化された文字列は以下の通りである。

  • ライブラリ、関数名

  • 自己削除スクリプトの一部(フォーマットストリングを除く)

  • その他の文字列 - C&Cサーバー、GDI関連の文字列、自己削除スクリプト名など

Dynamic APIを利用して関数を呼び出しており、この時に使用されるコードはHackingTeamのdynamic_importコードを修正したものと見られる。修正内容は以下の通りである。

  • 文字列の復号にshiftBy1の代わりに上記で言及した復号方式を使用する。

  • ReportExitProcessを使用しない。


악성코드 분석 2
caption - 글에서 분석한 악성코드 Dynamic API 루틴
caption - 글에서 분석한 악성코드 Dynamic API 루틴
caption - 글에서 분석한 악성코드 Dynamic API 루틴
엔키화이트햇 악성코드 분석 3
caption - HackingTeam dynamaic_import 코드 Dynamic API 루틴
caption - HackingTeam dynamaic_import 코드 Dynamic API 루틴
caption - HackingTeam dynamaic_import 코드 Dynamic API 루틴

idapythonを利用して作成した文字列復号スクリプトは以下の通りである。

from idaapi import *
from idautils import *
from idc import *
from ida_segment import get_segm_by_name

def get_ins(ea):
   return [print_insn_mnem(ea), print_operand(ea, 0), print_operand(ea, 1)]

def get_name(ea):
    result = ""
    i = 0
    while True:
        if get_byte(ea + i) == 0:
            return result
        else:
            result += chr(get_byte(ea + i))
        i += 1

def check_ea(ea):
    func = get_func(0x1400011F0)
    for xref in XrefsTo(ea):
        if func.start_ea < xref.frm < func.end_ea:
            return True
    return False

def search_en_data(ea):
    while True:
        ins = get_ins(ea)
        if ins[0] == "lea" and ins[1] == "rcx":
            addr = get_name_ea_simple(ins[2])
            return get_name(addr)
        ea = prev_head(ea)

def decrypt(en_data):
    custom_alphabet = "7Uzc5ngXl_ESWkj3t14Cw+aYLvyh0odZH8OReKiNIr-JM2GQAxpmVb=qPTuB9Ds6fF"
    result = list(en_data)
    for i, data in enumerate(result):
        if data in custom_alphabet:
            j = custom_alphabet.index(data)
            result[i] = custom_alphabet[(j + 41) % 0x42]
            
    return "".join(result)

segm = get_segm_by_name(".text")
ea = segm.start_ea
end_ea = segm.end_ea

while True:
    if ea >= end_ea:
        break
    else:
        if check_ea(ea):
            ea = next_head(ea)
            continue
        elif "sub_1400013E0" in GetDisasm(ea):
            print (hex(ea), decrypt(search_en_data(ea)))
            set_cmt(ea, decrypt(search_en_data(ea)), 0)
        elif "sub_140001350" in GetDisasm(ea):
            print (hex(ea), decrypt(search_en_data(ea)))
            set_cmt(ea, decrypt(search_en_data(ea)), 0)
                
    ea = next_head(ea)
from idaapi import *
from idautils import *
from idc import *
from ida_segment import get_segm_by_name

def get_ins(ea):
   return [print_insn_mnem(ea), print_operand(ea, 0), print_operand(ea, 1)]

def get_name(ea):
    result = ""
    i = 0
    while True:
        if get_byte(ea + i) == 0:
            return result
        else:
            result += chr(get_byte(ea + i))
        i += 1

def check_ea(ea):
    func = get_func(0x1400011F0)
    for xref in XrefsTo(ea):
        if func.start_ea < xref.frm < func.end_ea:
            return True
    return False

def search_en_data(ea):
    while True:
        ins = get_ins(ea)
        if ins[0] == "lea" and ins[1] == "rcx":
            addr = get_name_ea_simple(ins[2])
            return get_name(addr)
        ea = prev_head(ea)

def decrypt(en_data):
    custom_alphabet = "7Uzc5ngXl_ESWkj3t14Cw+aYLvyh0odZH8OReKiNIr-JM2GQAxpmVb=qPTuB9Ds6fF"
    result = list(en_data)
    for i, data in enumerate(result):
        if data in custom_alphabet:
            j = custom_alphabet.index(data)
            result[i] = custom_alphabet[(j + 41) % 0x42]
            
    return "".join(result)

segm = get_segm_by_name(".text")
ea = segm.start_ea
end_ea = segm.end_ea

while True:
    if ea >= end_ea:
        break
    else:
        if check_ea(ea):
            ea = next_head(ea)
            continue
        elif "sub_1400013E0" in GetDisasm(ea):
            print (hex(ea), decrypt(search_en_data(ea)))
            set_cmt(ea, decrypt(search_en_data(ea)), 0)
        elif "sub_140001350" in GetDisasm(ea):
            print (hex(ea), decrypt(search_en_data(ea)))
            set_cmt(ea, decrypt(search_en_data(ea)), 0)
                
    ea = next_head(ea)
from idaapi import *
from idautils import *
from idc import *
from ida_segment import get_segm_by_name

def get_ins(ea):
   return [print_insn_mnem(ea), print_operand(ea, 0), print_operand(ea, 1)]

def get_name(ea):
    result = ""
    i = 0
    while True:
        if get_byte(ea + i) == 0:
            return result
        else:
            result += chr(get_byte(ea + i))
        i += 1

def check_ea(ea):
    func = get_func(0x1400011F0)
    for xref in XrefsTo(ea):
        if func.start_ea < xref.frm < func.end_ea:
            return True
    return False

def search_en_data(ea):
    while True:
        ins = get_ins(ea)
        if ins[0] == "lea" and ins[1] == "rcx":
            addr = get_name_ea_simple(ins[2])
            return get_name(addr)
        ea = prev_head(ea)

def decrypt(en_data):
    custom_alphabet = "7Uzc5ngXl_ESWkj3t14Cw+aYLvyh0odZH8OReKiNIr-JM2GQAxpmVb=qPTuB9Ds6fF"
    result = list(en_data)
    for i, data in enumerate(result):
        if data in custom_alphabet:
            j = custom_alphabet.index(data)
            result[i] = custom_alphabet[(j + 41) % 0x42]
            
    return "".join(result)

segm = get_segm_by_name(".text")
ea = segm.start_ea
end_ea = segm.end_ea

while True:
    if ea >= end_ea:
        break
    else:
        if check_ea(ea):
            ea = next_head(ea)
            continue
        elif "sub_1400013E0" in GetDisasm(ea):
            print (hex(ea), decrypt(search_en_data(ea)))
            set_cmt(ea, decrypt(search_en_data(ea)), 0)
        elif "sub_140001350" in GetDisasm(ea):
            print (hex(ea), decrypt(search_en_data(ea)))
            set_cmt(ea, decrypt(search_en_data(ea)), 0)
                
    ea = next_head(ea)

マルウェアはまず、CPUタイミングジッターに基づいて40ビット長のuidを生成する。このためにclock関数の戻り値が変化するまでにかかる時間を測定し、その時間のパリティを2回計算する。2つのパリティ値が異なる場合、最初のパリティ値をエントロピーとして使用し、このプロセスを40回繰り返してuidを生成する。

UCRT(Unified C Runtime)のclock関数は、C標準とは異なり、プロセス実行時間基準ではなくCRT初期化時点を基準とした経過時間を返す。したがって、生成される値はCPUの状態やシステム負荷などの環境によって変化する可能性がある。

一般的ではない方法でRNG(乱数生成器)を実装している点が特徴と言える。


엔키화이트햇 악성코드 분석 3
caption - uid 생성 루틴
caption - uid 생성 루틴
caption - uid 생성 루틴

C&Cサーバーはtcp://daumnet.p-e[.]kr:9980で、通信する際の送受信データはTLV(Type Length Value)構造である。


송수신 데이터 구조
caption - 송수신 데이터 구조
caption - 송수신 데이터 구조
caption - 송수신 데이터 구조

送受信データはXOR演算で暗号化および復号され、送信プロセスは以下の通りである。

  1. まず、typeとsizeの合計6バイトをXORキーで暗号化して送信する。

    • XORキー: 0x3b, 0xa0, 0x28, 0xcc, 0x41, 0x0f, 0xd6, 0x5e, 0xb7, 0x83, 0x92, 0xcf, 0xe4, 0x4a, 0xb8, 0x77

  2. データをXORキーで暗号化して送信する。

受信プロセスも送信プロセスと同様の順序で行われる。

C&Cサーバーのハンドシェイクプロセスは以下の通りである。

  1. まず、type = 0x3e9, size = 3 data = {0x1a, 0x3c, 0x5e}を送信する。

  2. 受信データが1で送信したデータと同一であれば、type = 0x3eb, size = 5, data = uidを送信する。


엔키화이트햇 악성코드분석
caption - 핸드셰이크 루틴
caption - 핸드셰이크 루틴
caption - 핸드셰이크 루틴

ハンドシェイクが完了すると、感染システム情報を収集した後にtype = 0x3e8, size = 収集したデータサイズ, data = 収集データとしてC&Cサーバーに送信する。データの形式は%d|%s|%s|%s|%s|%xであり、収集する情報は以下の通りである。

  • 管理者グループへの所属の有無

  • IPv4アドレス一覧

  • コンピューター名

  • ユーザー名

  • 実行ファイルパス

  • マルウェアのPID

その後、C&Cサーバーと継続的に通信し、受信データが存在しない場合は60秒後に再試行する方式で通信する。C&Cサーバーと通信し、typeに応じて実行する行為は下表の通りである。

| type | 행위 | 상세 내용 |
| --- | --- | --- |
| 0x3ed | 통신 악성코드 실행 종료 | N/A |
| 0x3ee | %Temp%\1.bat 자가 삭제 스크립트 실행, 악성코드 실행 종료 | N/A |
| 0x7d1 | 리버스셸 스레드 생성 | cmd.exe는 별도의 프로세스 그룹으로 실행되며 종료 하위 프로세스를 함께 종료하는 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 속성이 적용된 Job 객체에 포함된다.-n입출력은 파이프를 통해 연결되고, 출력은 10ms마다 폴링된다. 출력이 존재하면 C&C 서버에 전송한다. 전송 type은 0x7d3이다.  |
| 0x7d2 | 리버스셸 데이터 입력 | 리버스셸 입력 파이프에 수신 데이터 입력 |
| 0x7d4 | 리버스셸 스레드 종료 | N/A |
| 0xbb9 | 드라이브 정보 수집 | 감염 시스템에 존재하는 모든 드라이브의 전체 공간, 사용 가능 공간을 C&C 서버에 전송한다.-n전송 type은 0xbba이다. |
| 0xbbb | 파일 디렉토리 정보 수집 | 파일인 경우-n- 파일 이름, 생성 시간, 수정 시간, 파일 크기 전송, type은 0xbbd이다.-n디렉토리인 경우-n- 디렉토리 이름, 생성 시간, 수정 시간 type = 0xbbd-n에러 발생 type = 0xbbd 전송 |
| 0xce4 | 파일 삭제 스레드 생성 | 1. 파일 크기만큼 4KB 데이터를 반복해서 덮어쓴다. 덮어쓰여지는 데이터는 0x5f 1바이트와 나머지 null 데이터로 이루어져 있다.-n2. 파일 이름을 무작위 [a-z]{파일 이름 길이}문자들로 변경-n3. 파일 삭제 |
| 0xce5 | 파일 삭제 | N/A |
| 0xc1c | 파일 열기 | 지정된 파일을 열고, 파일 핸들을 전역 변수에 저장한다.-n성공 type = 0xc20 전송-n실패 type = 0xc1f 전송 |
| 0xc1d | 파일에 데이터 작성 | 0xc1c에서 저장된 파일 핸들을 이용하여, 수신 데이터를 파일에 작성한다.-n에러 발생 type = 0xc21 전송 |
| 0xc1e | 파일 핸들 닫기 | 에러 발생 type = 0xc21 전송 |
| 0xc80 | 파일 업로드 스레드 생성 | 1. 에러 발생 type = 0xc86 데이터를 전송한 종료한다.-n2. 파일 경로, 이름, 크기를 전송한다. 전송 type은 0xc81이다.-n3. 파일 데이터를 0x100000만큼 나눠서 전송한다. 전송 type은 0xc82이다. -n4. 파일 데이터 전송 완료 type = 0xc84전송한다. -n5. 에러 중단 없이 파일 전송이 완료되면 type = 0x0c85전송한다.-n디렉토리인 경우 해당 디렉토리에 존재하는 모든 파일을 업로드한다. |
| 0xc83 | 파일 업로드 중단 | 파일 업로드할 확인하는 전역 변수 값을 0으로 설정해서 중단시킨다. |
| 0xfa0 | 화면 캡처 스레드 생성 | 전송 주기와 전송 여부는 전역 변수에 의해 설정된다. 최소 전송 주기는 0.1초이다.-n커서 위치 정보와 JPEG로 인코딩된 스크린샷을 포함한 데이터를 전송한다.-n전송 type은 0xfa1이다.-n에러 발생 type = 0xfa3전송한다. |
| 0xfa2 | 화면 캡처 중단 | 화면 캡처할 확인하는 전역 변수 값을 0으로 설정해서 중단시킨다. |
| 0x1392 | 소켓 통신 시도 | 지정된 주소로 연결을 시도하며, 연결 시도에 1초의 타임아웃이 적용된다.-n연결 성공 C&C 서버로 type = 0x1393 전송, 실패 type = 0x1394 전송 |
| 0x13f6 | 사용자 권한으로 명령어 실행 | 사용자 권한으로 명령어를 실행한다.-n성공 type = 0x13f7 전송, 실패 type = 0x13f8 전송 |
| 0x145a | 파일 수정 시간 조작 | 지정된 파일의 수정 시간을 다른 파일에 적용한다.-n성공 type = 0x145b 전송, 실패 type = 0x145c 전송

| type | 행위 | 상세 내용 |
| --- | --- | --- |
| 0x3ed | 통신 악성코드 실행 종료 | N/A |
| 0x3ee | %Temp%\1.bat 자가 삭제 스크립트 실행, 악성코드 실행 종료 | N/A |
| 0x7d1 | 리버스셸 스레드 생성 | cmd.exe는 별도의 프로세스 그룹으로 실행되며 종료 하위 프로세스를 함께 종료하는 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 속성이 적용된 Job 객체에 포함된다.-n입출력은 파이프를 통해 연결되고, 출력은 10ms마다 폴링된다. 출력이 존재하면 C&C 서버에 전송한다. 전송 type은 0x7d3이다.  |
| 0x7d2 | 리버스셸 데이터 입력 | 리버스셸 입력 파이프에 수신 데이터 입력 |
| 0x7d4 | 리버스셸 스레드 종료 | N/A |
| 0xbb9 | 드라이브 정보 수집 | 감염 시스템에 존재하는 모든 드라이브의 전체 공간, 사용 가능 공간을 C&C 서버에 전송한다.-n전송 type은 0xbba이다. |
| 0xbbb | 파일 디렉토리 정보 수집 | 파일인 경우-n- 파일 이름, 생성 시간, 수정 시간, 파일 크기 전송, type은 0xbbd이다.-n디렉토리인 경우-n- 디렉토리 이름, 생성 시간, 수정 시간 type = 0xbbd-n에러 발생 type = 0xbbd 전송 |
| 0xce4 | 파일 삭제 스레드 생성 | 1. 파일 크기만큼 4KB 데이터를 반복해서 덮어쓴다. 덮어쓰여지는 데이터는 0x5f 1바이트와 나머지 null 데이터로 이루어져 있다.-n2. 파일 이름을 무작위 [a-z]{파일 이름 길이}문자들로 변경-n3. 파일 삭제 |
| 0xce5 | 파일 삭제 | N/A |
| 0xc1c | 파일 열기 | 지정된 파일을 열고, 파일 핸들을 전역 변수에 저장한다.-n성공 type = 0xc20 전송-n실패 type = 0xc1f 전송 |
| 0xc1d | 파일에 데이터 작성 | 0xc1c에서 저장된 파일 핸들을 이용하여, 수신 데이터를 파일에 작성한다.-n에러 발생 type = 0xc21 전송 |
| 0xc1e | 파일 핸들 닫기 | 에러 발생 type = 0xc21 전송 |
| 0xc80 | 파일 업로드 스레드 생성 | 1. 에러 발생 type = 0xc86 데이터를 전송한 종료한다.-n2. 파일 경로, 이름, 크기를 전송한다. 전송 type은 0xc81이다.-n3. 파일 데이터를 0x100000만큼 나눠서 전송한다. 전송 type은 0xc82이다. -n4. 파일 데이터 전송 완료 type = 0xc84전송한다. -n5. 에러 중단 없이 파일 전송이 완료되면 type = 0x0c85전송한다.-n디렉토리인 경우 해당 디렉토리에 존재하는 모든 파일을 업로드한다. |
| 0xc83 | 파일 업로드 중단 | 파일 업로드할 확인하는 전역 변수 값을 0으로 설정해서 중단시킨다. |
| 0xfa0 | 화면 캡처 스레드 생성 | 전송 주기와 전송 여부는 전역 변수에 의해 설정된다. 최소 전송 주기는 0.1초이다.-n커서 위치 정보와 JPEG로 인코딩된 스크린샷을 포함한 데이터를 전송한다.-n전송 type은 0xfa1이다.-n에러 발생 type = 0xfa3전송한다. |
| 0xfa2 | 화면 캡처 중단 | 화면 캡처할 확인하는 전역 변수 값을 0으로 설정해서 중단시킨다. |
| 0x1392 | 소켓 통신 시도 | 지정된 주소로 연결을 시도하며, 연결 시도에 1초의 타임아웃이 적용된다.-n연결 성공 C&C 서버로 type = 0x1393 전송, 실패 type = 0x1394 전송 |
| 0x13f6 | 사용자 권한으로 명령어 실행 | 사용자 권한으로 명령어를 실행한다.-n성공 type = 0x13f7 전송, 실패 type = 0x13f8 전송 |
| 0x145a | 파일 수정 시간 조작 | 지정된 파일의 수정 시간을 다른 파일에 적용한다.-n성공 type = 0x145b 전송, 실패 type = 0x145c 전송

| type | 행위 | 상세 내용 |
| --- | --- | --- |
| 0x3ed | 통신 악성코드 실행 종료 | N/A |
| 0x3ee | %Temp%\1.bat 자가 삭제 스크립트 실행, 악성코드 실행 종료 | N/A |
| 0x7d1 | 리버스셸 스레드 생성 | cmd.exe는 별도의 프로세스 그룹으로 실행되며 종료 하위 프로세스를 함께 종료하는 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 속성이 적용된 Job 객체에 포함된다.-n입출력은 파이프를 통해 연결되고, 출력은 10ms마다 폴링된다. 출력이 존재하면 C&C 서버에 전송한다. 전송 type은 0x7d3이다.  |
| 0x7d2 | 리버스셸 데이터 입력 | 리버스셸 입력 파이프에 수신 데이터 입력 |
| 0x7d4 | 리버스셸 스레드 종료 | N/A |
| 0xbb9 | 드라이브 정보 수집 | 감염 시스템에 존재하는 모든 드라이브의 전체 공간, 사용 가능 공간을 C&C 서버에 전송한다.-n전송 type은 0xbba이다. |
| 0xbbb | 파일 디렉토리 정보 수집 | 파일인 경우-n- 파일 이름, 생성 시간, 수정 시간, 파일 크기 전송, type은 0xbbd이다.-n디렉토리인 경우-n- 디렉토리 이름, 생성 시간, 수정 시간 type = 0xbbd-n에러 발생 type = 0xbbd 전송 |
| 0xce4 | 파일 삭제 스레드 생성 | 1. 파일 크기만큼 4KB 데이터를 반복해서 덮어쓴다. 덮어쓰여지는 데이터는 0x5f 1바이트와 나머지 null 데이터로 이루어져 있다.-n2. 파일 이름을 무작위 [a-z]{파일 이름 길이}문자들로 변경-n3. 파일 삭제 |
| 0xce5 | 파일 삭제 | N/A |
| 0xc1c | 파일 열기 | 지정된 파일을 열고, 파일 핸들을 전역 변수에 저장한다.-n성공 type = 0xc20 전송-n실패 type = 0xc1f 전송 |
| 0xc1d | 파일에 데이터 작성 | 0xc1c에서 저장된 파일 핸들을 이용하여, 수신 데이터를 파일에 작성한다.-n에러 발생 type = 0xc21 전송 |
| 0xc1e | 파일 핸들 닫기 | 에러 발생 type = 0xc21 전송 |
| 0xc80 | 파일 업로드 스레드 생성 | 1. 에러 발생 type = 0xc86 데이터를 전송한 종료한다.-n2. 파일 경로, 이름, 크기를 전송한다. 전송 type은 0xc81이다.-n3. 파일 데이터를 0x100000만큼 나눠서 전송한다. 전송 type은 0xc82이다. -n4. 파일 데이터 전송 완료 type = 0xc84전송한다. -n5. 에러 중단 없이 파일 전송이 완료되면 type = 0x0c85전송한다.-n디렉토리인 경우 해당 디렉토리에 존재하는 모든 파일을 업로드한다. |
| 0xc83 | 파일 업로드 중단 | 파일 업로드할 확인하는 전역 변수 값을 0으로 설정해서 중단시킨다. |
| 0xfa0 | 화면 캡처 스레드 생성 | 전송 주기와 전송 여부는 전역 변수에 의해 설정된다. 최소 전송 주기는 0.1초이다.-n커서 위치 정보와 JPEG로 인코딩된 스크린샷을 포함한 데이터를 전송한다.-n전송 type은 0xfa1이다.-n에러 발생 type = 0xfa3전송한다. |
| 0xfa2 | 화면 캡처 중단 | 화면 캡처할 확인하는 전역 변수 값을 0으로 설정해서 중단시킨다. |
| 0x1392 | 소켓 통신 시도 | 지정된 주소로 연결을 시도하며, 연결 시도에 1초의 타임아웃이 적용된다.-n연결 성공 C&C 서버로 type = 0x1393 전송, 실패 type = 0x1394 전송 |
| 0x13f6 | 사용자 권한으로 명령어 실행 | 사용자 권한으로 명령어를 실행한다.-n성공 type = 0x13f7 전송, 실패 type = 0x13f8 전송 |
| 0x145a | 파일 수정 시간 조작 | 지정된 파일의 수정 시간을 다른 파일에 적용한다.-n성공 type = 0x145b 전송, 실패 type = 0x145c 전송

caption - typeに応じて実行する行為

4. 関連性分析

4.1. C&C 関連性

マルウェアが使用する C&C サーバーは daumnet.p-e[.]kr であり、同ドメインは北朝鮮の APT グループである Kimsuky との関連性が確認されている。p-e[.]kr ドメインの Whois AC は cfa4a551515dc742s@gmail.com であり、Whois AC が同一のドメインの一部は以下の通りである。

  • n-e[.]kr

  • r-e[.]kr

  • o-r[.]kr

  • kro[.]kr

AhnLab の「Phishing Attacks Impersonating Famous Korean Banking Apps」レポートによると、Kimsuky 関連の攻撃で頻繁に使用される最上位ドメインが特定されており、それらのドメインの Whois AC はすべて cfa4a551515dc742s@gmail.com で同一である。

  • n-e[.]kr

  • p-e[.]kr

  • r-e[.]kr

  • o-r[.]kr

  • kro[.]kr

さらに Genians の「위협 행위자 김수키의 이메일 피싱 캠페인 분석」レポートによると、MYBOXセキュリティ注意の内容を含むフィッシングメールにおいて、メールのパスワードを窃取するためのフィッシングサイトに p-e[.]kr ドメインが使用されていることが確認された。


4.2. コードの関連性

AhnLab の「North Korea-related Hangul Word Processor (HWP) File Being Distributed」レポートに言及されたマルウェアのうち、a7077d9a2c98ec2d0b3b1c12f23b2a79 は本稿で分析したマルウェアと同一の方法で Dynamic API を実行する。


코드 연관성 위협인텔리전스
caption - a7077d9a2c98ec2d0b3b1c12f23b2a79 Dynamic API 루틴
caption - a7077d9a2c98ec2d0b3b1c12f23b2a79 Dynamic API 루틴
caption - a7077d9a2c98ec2d0b3b1c12f23b2a79 Dynamic API 루틴
코드 연관성 위협인텔리전스 2
caption - 글에서 분석한 악성코드 Dyanamic API 루틴
caption - 글에서 분석한 악성코드 Dyanamic API 루틴
caption - 글에서 분석한 악성코드 Dyanamic API 루틴

文字列の復号プロセスも同様だが、カスタムアルファベットとキーが異なる。

  • カスタムアルファベット:zcgXlSWkj314CwaYLvyh0U_odZH8OReKiNIr-JM2G7QAxpnmEVbqP5TuB9Ds6fFt

  • キー: -22


문자열 복호화 루틴
caption - a7077d9a2c98ec2d0b3b1c12f23b2a79 문자열 복호화 루틴
caption - a7077d9a2c98ec2d0b3b1c12f23b2a79 문자열 복호화 루틴
caption - a7077d9a2c98ec2d0b3b1c12f23b2a79 문자열 복호화 루틴
악성코드 문자열 복호화 루틴
caption - 글에서 분석한 악성코드 문자열 복호화 루틴
caption - 글에서 분석한 악성코드 문자열 복호화 루틴
caption - 글에서 분석한 악성코드 문자열 복호화 루틴

Palo Alto Networks の「Unraveling Sparkling Pisces’s Tool Set: KLogEXE and FPSpy」レポートで言及されている Kimsuky マルウェアのうち、KLogExe、FPSpy の Dynamic API 方式は、HackingTeam の dynamic_import コードの文字列復号方式まで同一である。さらに、r-e[.]kr ドメインが使用された履歴が存在する。


안랩 복호화 방식
caption - 9760f489a390665b5e7854429b550c83 Dynamic API 루틴
caption - 9760f489a390665b5e7854429b550c83 Dynamic API 루틴
caption - 9760f489a390665b5e7854429b550c83 Dynamic API 루틴

AhnLab の「SmallTiger Malware Used in Attacks Against South Korean Businesses (Kimsuky and Andariel)」レポートで言及されている Andariel の SmallTiger は、カスタムアルファベットとキーが本稿で分析したマルウェアとは異なるものの、同一の復号方式を使用している。


c&c 서버
caption - 2766fcf5fa81a2877864a07ef306cde4 문자열 복호화 루틴
caption - 2766fcf5fa81a2877864a07ef306cde4 문자열 복호화 루틴
caption - 2766fcf5fa81a2877864a07ef306cde4 문자열 복호화 루틴

さらに、以下のドメインが C&C サーバーとして使用されていた。

  • kro[.]kr

  • n-e[.]kr

  • n-b[.]kr

  • o-r[.]kr

  • p-e[.]kr


c&c 서버
caption - SmallTiger Malware Used in Attacks Against South Korean Businesses (Kimsuky and Andariel) IOC
caption - SmallTiger Malware Used in Attacks Against South Korean Businesses (Kimsuky and Andariel) IOC
caption - SmallTiger Malware Used in Attacks Against South Korean Businesses (Kimsuky and Andariel) IOC


4.3. マルウェアビルド環境の関連性

本稿で分析したマルウェアの Rich Header 情報をベースに、過去に APT 攻撃グループによって使用されたマルウェアとの関連性を確認することができ、これはそれらが同一の環境で制作されたことを示唆している。

Rich Header には、ビルドプロセスで使用されたツール情報と使用回数に関する情報が格納される。Rich Header に存在するツールの情報と組み合わせが一般的でない場合、ビルド環境に対する関連性を確認でき、マルウェアとマルウェア製作者との関連性を確認するためにも使用できる。

本稿で分析したマルウェアの Rich Header の内容は以下の通りである。

RichEntry(product_id = 0x0102, build_id = 0x59f2, count = 0x00000001), # VS2015 Linker 14.00.23026
RichEntry(product_id = 0x00ff, build_id = 0x59f2, count = 0x00000001), # VS2015 CVTRES 14.00.23026
RichEntry(product_id = 0x0109, build_id = 0x59f2, count = 0x00000003), # VS2015 Universal Tuple Compiler(LTCG/C++) 19.00.23026
RichEntry(product_id = 0x0001, build_id = 0x0000, count = 0x00000067), # Import
RichEntry(product_id = 0x00cb, build_id = 0xffdd, count = 0x00000009), # VS2012 Import 11.00.65501
RichEntry(product_id = 0x0104, build_id = 0x59e5, count = 0x00000014), # VS2015+ Universal Tuple Compiler(C) 19.00.23013
RichEntry(product_id = 0x0105, build_id = 0x59e5, count = 0x00000021), # VS2015+ Universal Tuple Compiler(C++) 19.00.23013
RichEntry(product_id = 0x0103, build_id = 0x59e5, count = 0x00000008), # VS2015+ MASM 14.00.23013
RichEntry(product_id = 0x00f2, build_id = 0x9cb4, count = 0x0000000d), # VS2013 Universal Tuple Compiler(C) 18.10.40116
RichEntry(product_id = 0x00f3, build_id = 0x9cb4, count = 0x00000087), # VS2013 Universal Tuple Compiler(C++) 18.10.40116
RichEntry(product_id = 0x00f1, build_id = 0x9cb4, count = 0x00000005)  # VS2013 MASM 12.10.40116
RichEntry(product_id = 0x0102, build_id = 0x59f2, count = 0x00000001), # VS2015 Linker 14.00.23026
RichEntry(product_id = 0x00ff, build_id = 0x59f2, count = 0x00000001), # VS2015 CVTRES 14.00.23026
RichEntry(product_id = 0x0109, build_id = 0x59f2, count = 0x00000003), # VS2015 Universal Tuple Compiler(LTCG/C++) 19.00.23026
RichEntry(product_id = 0x0001, build_id = 0x0000, count = 0x00000067), # Import
RichEntry(product_id = 0x00cb, build_id = 0xffdd, count = 0x00000009), # VS2012 Import 11.00.65501
RichEntry(product_id = 0x0104, build_id = 0x59e5, count = 0x00000014), # VS2015+ Universal Tuple Compiler(C) 19.00.23013
RichEntry(product_id = 0x0105, build_id = 0x59e5, count = 0x00000021), # VS2015+ Universal Tuple Compiler(C++) 19.00.23013
RichEntry(product_id = 0x0103, build_id = 0x59e5, count = 0x00000008), # VS2015+ MASM 14.00.23013
RichEntry(product_id = 0x00f2, build_id = 0x9cb4, count = 0x0000000d), # VS2013 Universal Tuple Compiler(C) 18.10.40116
RichEntry(product_id = 0x00f3, build_id = 0x9cb4, count = 0x00000087), # VS2013 Universal Tuple Compiler(C++) 18.10.40116
RichEntry(product_id = 0x00f1, build_id = 0x9cb4, count = 0x00000005)  # VS2013 MASM 12.10.40116
RichEntry(product_id = 0x0102, build_id = 0x59f2, count = 0x00000001), # VS2015 Linker 14.00.23026
RichEntry(product_id = 0x00ff, build_id = 0x59f2, count = 0x00000001), # VS2015 CVTRES 14.00.23026
RichEntry(product_id = 0x0109, build_id = 0x59f2, count = 0x00000003), # VS2015 Universal Tuple Compiler(LTCG/C++) 19.00.23026
RichEntry(product_id = 0x0001, build_id = 0x0000, count = 0x00000067), # Import
RichEntry(product_id = 0x00cb, build_id = 0xffdd, count = 0x00000009), # VS2012 Import 11.00.65501
RichEntry(product_id = 0x0104, build_id = 0x59e5, count = 0x00000014), # VS2015+ Universal Tuple Compiler(C) 19.00.23013
RichEntry(product_id = 0x0105, build_id = 0x59e5, count = 0x00000021), # VS2015+ Universal Tuple Compiler(C++) 19.00.23013
RichEntry(product_id = 0x0103, build_id = 0x59e5, count = 0x00000008), # VS2015+ MASM 14.00.23013
RichEntry(product_id = 0x00f2, build_id = 0x9cb4, count = 0x0000000d), # VS2013 Universal Tuple Compiler(C) 18.10.40116
RichEntry(product_id = 0x00f3, build_id = 0x9cb4, count = 0x00000087), # VS2013 Universal Tuple Compiler(C++) 18.10.40116
RichEntry(product_id = 0x00f1, build_id = 0x9cb4, count = 0x00000005)  # VS2013 MASM 12.10.40116

このうち、バージョン情報を確認できるツールは以下の通りである。

  • VS2015 Linker 14.00.23026

  • VS2015 CVTRES 14.00.23026

  • VS2015 Universal Tuple Compiler(LTCG/C++) 19.00.23026

  • VS2012 Import 11.00.65501

  • VS2013 Universal Tuple Compiler(C) 18.10.40116

  • VS2013 Universal Tuple Compiler(C++) 18.10.40116

  • VS2013 MASM 12.10.40116

この他に、VS2015+ で始まるツールは、バージョン情報データが公開されておらず、正確なバージョン情報を確認できなかった。

まず、VirusTotal を利用してサンプルの確保と分類作業を進めた。VirusTotal からツール情報に基づいて完全に一致するサンプルを検索することはできなかったが、一部のツール情報が含まれているかについては条件付き検索が可能であった。このような検索は、すべてのツール情報が一致する場合と比較して相対的に緩い条件であり、完全に同一のサンプルではなくても、関連性のある可能性のあるサンプルの集合を抽出するのに活用できる。手順は以下の通りである。

  1. VirusTotal で PE ファイルを検索した結果、233.0M 個のサンプルが確認された。

  2. 分析したマルウェアで確認されたツール情報を条件にして検索した。結果は 27.9K 個のサンプルが確認された。検索に使用された条件は以下の通りである。

    • entity:file type:pe detectiteasy:"Linker: Microsoft Linker(14.00.23026)" detectiteasy:"Compiler: Microsoft Visual C/C++(19.00.23026)[LTCG/C++]" detectiteasy:"Tool: Visual Studio(2015)”

  3. 最小検知数が8個以上のもので分類した結果、9.2K 個のマルウェアが確認された。

  4. 上記で分類された 9.2K 個のマルウェアを確保した後、正確な分析のために各マルウェアに同一バージョンのツール情報が含まれているか、または一致するかを確認した。その結果、含まれているマルウェアは 1,412 個、一致したマルウェアは 278 個であることが確認された。

したがって、本稿で分析したマルウェアの Rich Header に存在するツール情報と完全に一致したマルウェアが 278 個確認され、各段階別に四捨五入してパーセントで表すと、0.012%、0.004%、含まれているマルウェア 0.0006%、一致したマルウェア 0.0002% となり、一般的には見られないツール情報と組み合わせであることが確認できる。

さらに、vx-underground から APT グループに関連するマルウェアを年代別に整理したアーカイブをダウンロードし、重複を除いた計 22,197 個のマルウェアから PE ファイル 14,950 個を確保し、上記と同様に分類作業を行った。

その結果、同一バージョンのツールでビルドされたマルウェアは計 28 個で、本稿で分析したマルウェアの Rich Header に存在するツールが含まれているマルウェアは 20 個、一致したマルウェアは 8 個であり、すべてのマルウェアがそれぞれ北朝鮮、中国、イランの APT グループと関連があることが確認された。詳細情報は以下の通りであり、ハッシュ情報は IOC に整理した。

  • Lazarus, APT37(RokRAT, BLUELIGHT, GOLDBACKDOOR): 17個

  • APT34, Ferocious Kitten: 7個

  • Chimera, ShadowPad(Malware): 4個

それぞれの情報源は以下の通りである。

北朝鮮の APT グループ
  • AhnLab の「Analysis Report on Lazarus Threat Group’s Volgmer and Scout Malwares」レポートに言及された 2 つの Volgmer ドロッパーが、本稿で分析したマルウェアの Rich Header ツール情報と一致し、4 つの Volgmer バックドアにはツール情報が含まれていることを確認した。

  • Kaspersky の「Lazarus Trojanized DeFi app for delivering malware」レポートに言及されたバックドアと類似したタイプとして IOC に整理された 3 つのマルウェアが、本稿で分析したマルウェアの Rich Header ツール情報と一致することを確認した。

  • Malwarebytes の「Retrohunting APT37: North Korean APT used VBA self decode technique to inject RokRat」レポートに言及された 4 つの RokRAT マルウェアに、本稿で分析したマルウェアの Rich Header ツール情報が含まれていることを確認した。

  • TALOS の「Korea In The Crosshairs」レポートに言及された 1 個の RokRAT マルウェアに、本稿で分析したマルウェアの Rich Header ツール情報が含まれていることを確認した。

  • stairwell の「The ink-stained trail of GOLDBACKDOOR」レポートに言及された 1 個の GOLDBACKDOOR マルウェアに、本稿で分析したマルウェアの Rich Header ツール情報が含まれていることを確認した。

  • VOLEXITY の「North Korean APT InkySquid Infects Victims Using Browser Exploits」レポートに言及された 2 つの BLUELIGHT マルウェアに、本稿で分析したマルウェアの Rich Header ツール情報が含まれていることを確認した。

中国の APT グループ
イランの APT グループ

Rich Header はマルウェア作成者が修正可能なデータであり、実際に Kaspersky の「The devil’s in the Rich header」レポートには、他のマルウェアの Rich Header をコピーして使用した事例が存在する。当該事例では、product id、build id、count 値まですべて同一であるが、本稿で分析したマルウェアの Rich Header 情報を基にした関連性分析の結果、product id、build id は過去に APT グループが使用したマルウェアと同一であるものの、count 値は異なっており、Rich Header がコピーされたわけではないと判断できる。

このような分析結果に基づいて、本稿で分析したマルウェアと北朝鮮の APT グループとの関連性が存在するものと考えられる。Rich Header ツール情報が一致、または含まれていた 28 個のマルウェアのうち 17 個が北朝鮮の APT グループに関連するマルウェアであることが確認された。一般的ではないツールの組み合わせを持つ Rich Header、かつ、その過半数以上が北朝鮮の APT グループに関連しているという点から、本稿で分析したマルウェアは北朝鮮の APT グループとの関連性が高いと判断される。

5. 対応策

コード署名証明書を管理する機関は、証明書の流出を防ぐために極めて徹底したセキュリティ対策を講じる必要がある。証明書は外部から任意にアクセスできないように暗号化して安全に保管する必要があり、コード署名を適用するシステムは、他のシステムから徹底的に分離された環境で運用されなければならない。

証明書の徹底した管理と同時に、コード署名に関するポリシーも強化されなければならない。コード署名は署名の検証を行わないか、または無視してコードを実行できるため、検証するだけでなく、強制適用してこそ最も効果的である。さらに、Windowsオペレーティングシステムのデフォルト設定は非常に脆弱である。

Windowsでは、コード署名を無視してプログラムを実行することができる。また、デフォルトで失効した証明書で署名されたコード署名を信頼できるようになっている。これを防ぐためにはセキュリティ設定を変更する必要があるが、使用できる方法が多く、非常に複雑である。

最も簡単な方法は、WindowsのSmart App Controlを有効にすることである。Smart App Controlは、コード署名が有効であるか、またはMicrosoftによって信頼できると判断されたコードのみを実行できるように制限する。しかし、この場合でもコード署名が無効なプログラムを実行できる可能性があり、Microsoftが安全と判断しても実際には悪意のあるコード(マルウェア)である場合があるため、注意が必要である。

複雑ではあるが、より安全な方法は、App Controlポリシーを直接構成して適用することである。Smart App ControlはApp Controlポリシーに基づいて実装されており、Smart App Controlポリシーを活用してカスタムポリシーを作成することができる。この際、Enabled:Intelligent Security Graph Authorization項目を無効にし、Enabled:Revoked Expired As Unsigned項目を有効にすると、コード署名は無効だがMicrosoftによって安全と判断されたコードの実行をブロックすることができ、失効または有効期限切れの証明書で署名されたコードも信頼しないようになる。

このほかにも、AppLockerなどのセキュリティ機能によってコード署名ポリシーを強化することができる。

6. おわりに

去る2月20日にコード署名証明書が流出したという記事が報じられ、韓国時間基準で1日後の2月21日午後2時25分に、VirusTotalにSomanSA(ソマンサ)の有効な証明書で署名されたマルウェアがアップロードされた。

該当のマルウェアがどのような攻撃に活用されたかは不明であったが、C&Cサーバー、コードパターン、Rich Headerの分析を通じて、北朝鮮のAPTグループとの関連性を確認することができた。さらに、攻撃者が単なる侵入を超えてコード署名証明書を奪取し、これをマルウェアに悪用している点から、技術的な能力が優れていることが伺える。

北朝鮮APTグループの攻撃はますます精巧になっており、継続的に行われている。また、攻撃を成功させるために、長期にわたって同一の対象に対して複数回、様々なテーマで攻撃を行うこともある。本稿で作成した事例以外に、未だ特定されていないか、過去から現在まで検知されていない脅威が内部に存在する可能性も排除できず、このような脅威に対応するためには、組織と個人の双方がセキュリティに対する警戒心を持ち、細心の注意を払う必要がある。

7. 付録

付録 A. MITRE ATT&CK

| Tactics | Techniques |
| --- | --- |
| Reconnaissance | T1592: Gather Victim Host Information-nT1590.005: Gather Victim Network Information: IP Addresses |
| Execution | T1059.003: Command and Scripting Interpreter: Windows Command Shell-nT1106: Native API |
| Privilege Escalation | T1134.001: Access Token Manipulation: Token Impersonation/Theft-nT1134.002: Access Token Manipulation: Create Process with Token |
| Defense Evasion | T1140: Deobfuscate/Decode Files or Information-nT1070.004: Indicator Removal: File Deletion-nT1070.006: Indicator Removal: Timestomp-nT1027.007: Obfuscated Files or Information: Dynamic API Resolution-nT1027.008: Obfuscated Files or Information: Stripped Payloads -nT1553.002: Subvert Trust Controls: Code Signing |
| Discovery | T1083: File and Directory Discovery-nT1046: Network Service Discovery-nT1069.001: Permission Groups Discovery: Local Groups -nT1057: Process Discovery -nT1082: System Information Discovery-nT1033: System Owner/User Discovery |
| Collection | T1113: Screen Capture |
| Command and Control | T1132.002: Data Encoding: Non-Standard Encoding-nT1573.001: Encrypted Channel: Symmetric Cryptography |
| Exfiltration | T1030: Data Transfer Size Limits-nT1041: Exfiltration Over C2 Channel |
| Impact | T1485: Data Destruction -nT1565.001: Data Manipulation: Stored Data Manipulation

| Tactics | Techniques |
| --- | --- |
| Reconnaissance | T1592: Gather Victim Host Information-nT1590.005: Gather Victim Network Information: IP Addresses |
| Execution | T1059.003: Command and Scripting Interpreter: Windows Command Shell-nT1106: Native API |
| Privilege Escalation | T1134.001: Access Token Manipulation: Token Impersonation/Theft-nT1134.002: Access Token Manipulation: Create Process with Token |
| Defense Evasion | T1140: Deobfuscate/Decode Files or Information-nT1070.004: Indicator Removal: File Deletion-nT1070.006: Indicator Removal: Timestomp-nT1027.007: Obfuscated Files or Information: Dynamic API Resolution-nT1027.008: Obfuscated Files or Information: Stripped Payloads -nT1553.002: Subvert Trust Controls: Code Signing |
| Discovery | T1083: File and Directory Discovery-nT1046: Network Service Discovery-nT1069.001: Permission Groups Discovery: Local Groups -nT1057: Process Discovery -nT1082: System Information Discovery-nT1033: System Owner/User Discovery |
| Collection | T1113: Screen Capture |
| Command and Control | T1132.002: Data Encoding: Non-Standard Encoding-nT1573.001: Encrypted Channel: Symmetric Cryptography |
| Exfiltration | T1030: Data Transfer Size Limits-nT1041: Exfiltration Over C2 Channel |
| Impact | T1485: Data Destruction -nT1565.001: Data Manipulation: Stored Data Manipulation

| Tactics | Techniques |
| --- | --- |
| Reconnaissance | T1592: Gather Victim Host Information-nT1590.005: Gather Victim Network Information: IP Addresses |
| Execution | T1059.003: Command and Scripting Interpreter: Windows Command Shell-nT1106: Native API |
| Privilege Escalation | T1134.001: Access Token Manipulation: Token Impersonation/Theft-nT1134.002: Access Token Manipulation: Create Process with Token |
| Defense Evasion | T1140: Deobfuscate/Decode Files or Information-nT1070.004: Indicator Removal: File Deletion-nT1070.006: Indicator Removal: Timestomp-nT1027.007: Obfuscated Files or Information: Dynamic API Resolution-nT1027.008: Obfuscated Files or Information: Stripped Payloads -nT1553.002: Subvert Trust Controls: Code Signing |
| Discovery | T1083: File and Directory Discovery-nT1046: Network Service Discovery-nT1069.001: Permission Groups Discovery: Local Groups -nT1057: Process Discovery -nT1082: System Information Discovery-nT1033: System Owner/User Discovery |
| Collection | T1113: Screen Capture |
| Command and Control | T1132.002: Data Encoding: Non-Standard Encoding-nT1573.001: Encrypted Channel: Symmetric Cryptography |
| Exfiltration | T1030: Data Transfer Size Limits-nT1041: Exfiltration Over C2 Channel |
| Impact | T1485: Data Destruction -nT1565.001: Data Manipulation: Stored Data Manipulation

付録 B. IOC

マルウェア

  • 983b16c505a0b52a65dd31c7f50f8e9bfa2d7160d14e8eefbdf29b5c4a2c6e68

C&C

  • daumnet.p-e[.]kr:9980

Rich Header 関連マルウェア
北朝鮮 APT グループ

Analysis Report on Lazarus Threat Group’s Volgmer and Scout Malwares

  • 0d133ea8098e3802bf74202e4d25d6e151fbbd1b787ed08e063bd678166da8c1

  • 568465424dfff48605ee683409dc31f74dd612ffc182971c549fd4801fb6cf18

  • 0e0e0736f98e1819f50b6f05fa59b19296ea7a61042be94c46eb03012b42ea49

  • 80f31bf4e0b4ba1d3c963cf37dd7cefb5517b6454f7809fe3a1703e8b5941b41

  • b4f8177d87df58e31afab30302a9d9ba609cd975341b5532f75808da342381db

  • f563f8abf56ae9819462e21635fbd4c790b2f7d69ae8c02d042a3510209694a9

Lazarus Trojanized DeFi app for delivering malware

  • 202cfbe37bcde2f5700fa43e5a4e08e6b2df6322d9cdfa958d95ab598b47b6b3

  • 4281854f27a755ab51e71d951016ad10ff30a03cd612ba1b14c4d89d9b4be212

  • d178cced92bbce22d2214dbdd3db0491f1c352d21634fda9abd08d720faca84d

Retrohunting APT37: North Korean APT used VBA self decode technique to inject RokRat

  • 2a253c2aa1db3f809c86f410e4bd21f680b7235d951567f24d614d8e4d041576

  • a42844fc9cb7f80ca49726b3589700fa47bdacf787202d0461c753e7c73cfd2a

Korea In The Crosshairs

  • b3de3f9309b2f320738772353eb724a0782a1fc2c912483c036c303389307e2e

The ink-stained trail of GOLDBACKDOOR

  • 485246b411ef5ea9e903397a5490d106946a8323aaf79e6041bdf94763a0c028

North Korean APT InkySquid Infects Victims Using Browser Exploits

  • 7c40019c1d4cef2ffdd1dd8f388aaba537440b1bffee41789c900122d075a86d

  • 94b71ee0861cc7cfbbae53ad2e411a76f296fd5684edf6b25ebe79bf6a2a600a

中国 APT グループ

Abusing cloud services to fly under the radar

  • 9124266b87b16c02b94125fadfffdd15bc1a5ea714f0dec4962733693a655395

  • da56716727f513365b2308a0b145028fcd905aca2b9450f7632b4b10c209547d

ShadowPad | A Masterpiece of Privately Sold Malware in Chinese Espionage

  • f0854ec2496f9b4c634040bfac7381d6bc9926e9e89dc097b4684f73e1f6d9b3

  • c0d2aaf266866900552c681ce63bfd4a3b09442a7742d7f20dcdbdd3ec9763aa

イラン APT グループ

Ferocious Kitten: 6 years of covert surveillance in Iran

  • 3c94eba2e2b73b2d2230a62e4513f457933d4668221992c71c847b79ba12f352

  • d723b7c150427a83d8a08dc613f68675690fa0f5b10287b078f7e8d50d1a363f

OilRig Targets Middle Eastern Telecommunications Organization and Adds Novel C2 Channel with Steganography to Its Inventory

  • 4ea6da6b35c4cdc6043c3b93bd6b61ea225fd5e1ec072330cb746104d0b0a4ec

  • 55282007716b2b987a84a790eb1c9867e23ed8b5b89ef1a836cbedaf32982358

  • 7b5042d3f0e9f077ef2b1a55b5fffab9f07cc856622bf79d56fc752e4dc04b28

  • acb50b02ab0ca846025e7ad6c795a80dc6f61c4426704d0f1dd7e195143f5323

  • ba380e589261781898b1a54c2889f3360db09c61b9155607d7b4d11fcd85bd9d

付録 C. 復号キー情報

Custom Alphabet

  • 7Uzc5ngXl_ESWkj3t14Cw+aYLvyh0odZH8OReKiNIr-JM2GQAxpmVb=qPTuB9Ds6fF

xor key

  • 0x3b, 0xa0, 0x28, 0xcc, 0x41, 0x0f, 0xd6, 0x5e, 0xb7, 0x83, 0x92, 0xcf, 0xe4, 0x4a, 0xb8, 0x77

エンキホワイトハット

エンキホワイトハット

ENKI ホワイトハット
ENKI ホワイトハット

オフェンシブセキュリティの専門企業として、攻撃者の視点から次元の異なるセキュリティを提示します。

オフェンシブセキュリティの専門企業として、攻撃者の視点から次元の異なるセキュリティを提示します。

隙のないセキュリティ設計の始まり、NO.1ホワイトハッカーのノウハウから

インシデント発生前、
今すぐ備えましょう

隙のないセキュリティ設計の始まり、
No.1ホワイトハッカーのノウハウから

インシデント発生前、
今すぐ備えましょう

隙のないセキュリティ設計の始まり、
No.1ホワイトハッカーのノウハウから

インシデント発生前、
今すぐ備えましょう

購読する

コンテンツが役に立ったら?
エンキーレターを購読しましょう!

Copyright © 2025. ENKI WhiteHat Co., Ltd. All rights reserved.

Copyright © 2025. ENKI WhiteHat Co., Ltd. All rights reserved.

Copyright © 2025. ENKI WhiteHat Co., Ltd. All rights reserved.