랜섬웨어 분석 보고서

INC 랜섬웨어 분석 보고서

geonwoo9643 2026. 2. 8. 21:27

1. 개요 (Overview)


1.1 분석 배경

INC 랜섬웨어는 2023년 7월에 처음 등장한 RaaS(Ransomware-as-a-Service) 운영 그룹으로, AES 대칭 암호화와 RSA 비대칭 암호화를 결합한 하이브리드 암호화 방식을 채택하고 있습니다. 부분 암호화(Intermittent Encryption)와 멀티스레딩 기법을 통해 고속 암호화를 구현하며, CVE-2023-3519(Citrix NetScaler) 취약점을 악용하여 초기 침투를 수행합니다. 본 보고서는 INC 랜섬웨어의 암호화 메커니즘을 정밀 분석하고, 키 복구 전략 및 복호화 가능성을 평가합니다.


1.2 핵심 요약

암호화 메커니즘

  • AES-256 대칭 암호화를 통한 파일별 고속 암호화
  • RSA-2048 비대칭 암호화로 AES 키 보호
  • 부분 암호화(Intermittent Encryption) 기법으로 암호화 속도 극대화
  • 파일별 독립적인 AES 키 생성 (CryptGenRandom API)

 

회피 기법

  • 멀티스레딩 (CPU 코어 수 × 4 스레드)
  • VSS(Volume Shadow Copy) 삭제 시도
  • 특정 파일/디렉터리 제외 (.msi, .exe, .dll, Windows, Program Files 등)
  • 프린터 자동 랜섬 노트 출력

 

복호화 가능성

  • CryptGenRandom API 호출 시점의 파일별 AES 키를 API 후킹으로 실시간 캡처 시 완벽한 복호화 가능
  • 공격자 RSA 개인키 없이는 복호화 불가능
  • 본 분석에서 개발한 자동화 복호화 스크립트로 실증 검증 완료

 

2. 식별 정보 (Identification)


Malware Family: INC Ransom

Filetype: PE32 (Windows Executable)

Hash (SHA256): 834c5f094c4a2db0f520962341b108af685efd346e5b6622eb2331b3ffa09039

Extension: .INC

Target: Windows 기반 시스템 (Linux 변형 존재)

First Seen: July 2023

Ransom Note: INC-README.TXT, INC-README.HTML

 

3. 분석 환경 및 도구 (Tools)


구분 도구명 (Tool) 용도 (Purpose)
정적 분석 IDA Pro AES/RSA 구현 루틴 및 암호화 로직 분석
동적 분석 CryptGenRandom API Hooking 실시간 AES 키 추출
행위 분석 Process Monitor 파일 I/O 및 암호화 행위 추적
암호 분석 Python AES 복호화 스크립트 개발
메모리 분석 Volatility 메모리 덤프에서 키 추출

 

4. 암호화 기술 분석 (Technical Analysis)


4.1 전체 암호화 워크플로우

[실행 단계]
1. 초기화
   - 명령줄 인자 파싱 (암호화 모드 설정)
   - CSP(Cryptographic Service Provider) 획득
   - RSA 키 쌍 생성 (Cpub, Cpriv)
   ↓
2. 시스템 무력화
   - VSS(Volume Shadow Copy) 삭제 시도
   - 특정 프로세스/서비스 종료 (SQL Server, Exchange, VSS 등)
   - 방화벽 무력화
   ↓
3. 멀티스레드 암호화 엔진 초기화
   - 스레드 수 = CPU 코어 수 × 4
   - 파일 큐 관리 시스템 구축
   ↓
4. 파일 탐색 및 암호화
   - 재귀적 디렉터리 탐색
   - 파일 필터링 (.msi, .exe, .dll, .inc 제외)
   - 파일별 AES 키 생성 및 암호화 수행
   - 파일명 변경 (원본.확장자 → 원본.확장자.INC)
   ↓
5. 랜섬 노트 생성
   - INC-README.TXT 생성
   - INC-README.HTML 생성
   - 프린터로 랜섬 노트 자동 출력
   - 배경화면 변경

4.2 키 생성 및 관리 (Key Generation)

4.2.1 하이브리드 암호화 구조

RSA 키 쌍 생성

[초기 실행 시]
1. 피해자 기기별 RSA 키 쌍 생성
   - Cpub.key (Client Public Key) - 피해자 공개키
   - Cpriv.key (Client Private Key) - 피해자 개인키

2. 공격자 RSA 키 쌍 (하드코딩)
   - Spub.key (Server Public Key) - 공격자 공개키 (바이너리 내장)
   - Spriv.key (Server Private Key) - 공격자 개인키 (C&C 서버 보관)

3. Cpriv.key 보호
   - Cpriv_encrypted = RSA_Encrypt(Cpriv.key, Spub.key)
   - 암호화된 Cpriv.key를 시스템에 저장

 

파일별 AES 키 생성

[각 파일 암호화 시]
1. CryptGenRandom API 호출
   - 32바이트 랜덤 AES 키 생성 (AES-256)
   ★ API 후킹 지점 ★

2. AES 키로 파일 암호화
   - AES-256 CBC 모드
   - IV(Initialization Vector) 생성 (16바이트)

3. AES 키 보호
   - AES_key_encrypted = RSA_Encrypt(AES_key, Cpub.key)
   - 암호화된 AES 키를 파일 메타데이터에 저장

 

키 체인 구조

원본 파일
    ↓ [AES-256 암호화]
암호화된 파일
    ↓
AES 키 (32바이트)
    ↓ [RSA-2048 암호화, Cpub.key 사용]
암호화된 AES 키 (파일에 저장)
    ↓
Cpub.key (피해자 공개키)
    ↓
Cpriv.key (피해자 개인키)
    ↓ [RSA-2048 암호화, Spub.key 사용]
암호화된 Cpriv.key
    ↓
Spub.key (공격자 공개키, 하드코딩)
    ↓
Spriv.key (공격자 개인키, C&C 서버 보관)

 

4.2.2 공격자 공개키 (하드코딩)

# 바이너리 내 하드코딩된 공격자 RSA 공개키
ATTACKER_RSA_PUBKEY = bytes.fromhex(
    "308201..."  # 2048비트 RSA 공개키 (X.509 DER 포맷)
)

4.3 AES 암호화 알고리즘

4.3.1 AES-256 구조

암호화 모드: CBC (Cipher Block Chaining)

AES-256 CBC 파라미터:
- Key: 32바이트 (256비트)
- IV: 16바이트 (128비트)
- Block Size: 16바이트 (128비트)

 

CBC 모드 동작

// 첫 번째 블록
C[0] = AES_Encrypt(P[0] ⊕ IV, Key)

// 이후 블록
C[i] = AES_Encrypt(P[i] ⊕ C[i-1], Key)

여기서:
- P[i]: i번째 평문 블록
- C[i]: i번째 암호문 블록
- ⊕: XOR 연산

 

4.3.2 부분 암호화 (Intermittent Encryption)

INC 랜섬웨어는 암호화 속도를 극대화하기 위해 부분 암호화 기법을 사용합니다.

 

Fast Encryption Mode

암호화 대상: 각 파일의 처음 1,000,000 바이트만 암호화
건너뛰기: 1,000,000 바이트 이후의 데이터는 암호화하지 않음

[예시]
파일 크기 5MB:
- 암호화: 0 ~ 1,000,000 바이트
- 미암호화: 1,000,000 ~ 5,242,880 바이트

 

Medium Encryption Mode

암호화 대상: 1,000,000 바이트 단위로 선택적 암호화
건너뛰기: 1,000,000 바이트마다 일부 구간 건너뜀

[예시]
파일 크기 10MB:
- 암호화: 0 ~ 1,000,000 바이트
- 건너뛰기: 1,000,000 ~ 2,000,000 바이트
- 암호화: 2,000,000 ~ 3,000,000 바이트
- 건너뛰기: 3,000,000 ~ 4,000,000 바이트
- ...

 

명령줄 인자로 암호화 모드 선택

# Fast mode
INC_ransomware.exe -m fast

# Medium mode
INC_ransomware.exe -m medium

# Full mode (전체 암호화)
INC_ransomware.exe -m full4.3.3 AES 암호화 수행
Windows CryptoAPI 사용

 

4.3.3 AES 암호화 수행

 

Windows CryptoAPI 사용

// CSP 획득
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);

// 32바이트 AES 키 생성
CryptGenRandom(hProv, 32, pbKeyBlob);

// AES 키 객체 생성
CryptImportKey(hProv, pbKeyBlob, 32, 0, 0, &hKey);

// CBC 모드 설정
DWORD dwMode = CRYPT_MODE_CBC;
CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, 0);

// IV 설정
CryptSetKeyParam(hKey, KP_IV, pbIV, 0);

// 파일 암호화
CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen, dwBufLen);

4.4 파일 처리 아키텍처

4.4.1 멀티스레드 암호화 엔진

[멀티스레드 구조]
Main Thread
    ↓
CPU 코어 수 탐지 (GetSystemInfo)
    ↓
스레드 생성 (코어 수 × 4)
    ↓
┌─────────┬─────────┬─────────┬─────────┐
│Thread 1 │Thread 2 │Thread 3 │Thread 4 │ ...
└─────────┴─────────┴─────────┴─────────┘
     ↓          ↓          ↓          ↓
파일 큐에서 파일 가져오기 (Thread-safe Queue)
     ↓          ↓          ↓          ↓
파일 암호화 수행
     ↓          ↓          ↓          ↓
완료 카운터 증가

 

스레드 생성 코드 예시

// CPU 코어 수 탐지
SYSTEM_INFO si;
GetSystemInfo(&si);
DWORD dwThreadCount = si.dwNumberOfProcessors * 4;

// 스레드 생성
for (DWORD i = 0; i < dwThreadCount; i++) {
    CreateThread(NULL, 0, EncryptWorkerThread, &queueData, 0, NULL);
}

 

4.4.2 파일 처리 프로세스

[파일 암호화 프로세스]
1. 파일 탐색
   - FindFirstFile / FindNextFile
   - 재귀적 디렉터리 탐색
   ↓
2. 파일 필터링
   - 제외 확장자: .msi, .exe, .dll, .inc
   - 제외 디렉터리: Windows, Program Files, $RECYCLE.BIN, appdata
   ↓
3. 파일 열기
   - CreateFile (GENERIC_READ | GENERIC_WRITE)
   ↓
4. CryptGenRandom 호출
   - 32바이트 AES 키 생성
   ★ API 후킹 지점 ★
   ↓
5. AES 암호화
   - CBC 모드 초기화
   - 부분/전체 암호화 수행
   ↓
6. 메타데이터 저장
   - 암호화된 AES 키 (RSA로 암호화됨)
   - IV (16바이트)
   - 파일 크기
   - 암호화 모드 플래그
   ↓
7. 파일명 변경
   원본.확장자 → 원본.확장자.INC
   ↓
8. 파일 핸들 닫기

 

4.4.3 파일 메타데이터 구조

[암호화된 파일 구조]
┌─────────────────────────────────────┐
│  암호화된 파일 데이터                │
│  (AES-256 CBC)                      │
├─────────────────────────────────────┤
│  메타데이터 (Footer)                 │
│  ┌───────────────────────────────┐  │
│  │ 암호화된 AES 키 (256바이트)   │  │ ← RSA-2048로 암호화
│  ├───────────────────────────────┤  │
│  │ IV (16바이트)                 │  │
│  ├───────────────────────────────┤  │
│  │ 원본 파일 크기 (8바이트)      │  │
│  ├───────────────────────────────┤  │
│  │ 암호화 모드 플래그 (4바이트)  │  │
│  ├───────────────────────────────┤  │
│  │ 매직 바이트 "INC\x00" (4바이트)│  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘

 

4.4.4 시스템 무력화

 

VSS 삭제

vssadmin.exe Delete Shadows /All /Quiet
wmic.exe shadowcopy delete

 

프로세스/서비스 종료

대상 프로세스:
- SQL Server (sqlservr.exe, sqlwriter.exe)
- Exchange (MSExchangeIS.exe, MSExchangeSA.exe)
- Backup (veeam.exe, acronis.exe)
- VSS (vss.exe)
- Antivirus (MsMpEng.exe, McShield.exe)

 

4.4.5 랜섬 노트 생성

 

랜섬 노트 경로

각 암호화된 디렉터리마다:
- INC-README.TXT
- INC-README.HTML

 

프린터 자동 출력

// 네트워크 프린터 탐색
EnumPrinters(PRINTER_ENUM_NETWORK, NULL, 1, ...);

// 각 프린터로 랜섬 노트 출력
for each printer:
    OpenPrinter(printerName, &hPrinter, NULL);
    StartDocPrinter(hPrinter, 1, &docInfo);
    WritePrinter(hPrinter, ransomNoteContent, ...);
    EndDocPrinter(hPrinter);
    ClosePrinter(hPrinter);

 

배경화면 변경

// 배경화면을 랜섬 노트 이미지로 변경
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\\INC-WALLPAPER.bmp", SPIF_UPDATEINIFILE);

4.5 정적 분석

main 함수

  • 암호화 컨텍스트 획득

 

  • 커맨드 라인 파싱

커맨드라인 별 동작
--sup : Stop Using Process (파일 잠금 프로세스 종료 활성화)
--ens : Encrypt Network Shares (네트워크 공유 폴더 암호화)
--lhd : Load Hidden Drives (숨겨진 드라이브 암호화)
--debug : 디버그 모드 활성화
--kill : 프로세스/서비스 강제 종료
--safe-mode 플래그 : 안전모드에서 실행
--hide 플래그 : 콘솔 창 숨기기
--mode f : Fast (처음 1MB만), m : Medium (선택적), s : slow (전체)
--mode s : Standard mode (1MB씩 선택적 암호화), 그 외 : Full mode
--file : 단일 파일 암호화
--dir : 디렉터리 재귀 암호화

 

  • 휴지통 비우기 (복구 방지)

 

  • 프로세스 종료

 

  • 서비스 종료

 

  • I/O Completion Port 생성

 

  • 워커 스레드

 

  • AES-CBC 암호화

 

  • AES 카운터 블록 암호화 (128비트, 14라운드)

 

  • 콘솔 창 숨기기 (탐지 회피)

 

파일 암호화

 

  • 파일 열기(읽기/쓰기 권한)

 

  • 파일 사용 중인 프로세스 강제 종료 (Restart Manager API)

 

  • 파일 소유권 획득

 

  • 공격자 RSA 공개키 하드코딩

 

  • AES 키 생성 (32바이트)

 

  • Curve25519 키 클램핑

 

  • Curve25519 연산

 

  • SHA-512 해시

 

  • SHA-512 초기화

 

  • SHA-512 업데이트

 

  • 파일 확장자 추가 (.INC)

 

  • AES 키 확장 (32바이트 -> 240바이트)

 

  • 비동기 파일 읽기 (I/O Completion Port 사용) → 멀티 스레드

 

  • 디렉터리 재귀 암호화

 

  • 랜섬 노트 생성 (README.txt)

 

  • 디렉터리 모든 파일/폴더 열거

 

  • 숨겨진 드라이브 로드

 

  • 5초 대기 (사용자 취소 가능성 차단)

 

  • 모든 드라이브 암호화

 

  • 네트워크 공유 폴더 암호화

 

  • 볼륨 섀도우 복사본(VSS) 삭제

 

  • 바탕화면 랜섬노트로 변경

 

  • 연결된 프린터 랜섬노트 출력 (물리적)

 

5. 복호화 기술 분석 (Decryption Strategy)


5.1 복호화 가능성 분석

5.1.1 하이브리드 암호화 복호화 불가능 원리

복호화를 위해 필요한 키 체인:

1. 암호화된 파일 → 복호화
   필요: AES 키 (32바이트)
   
2. 암호화된 AES 키 → 복호화
   필요: Cpriv.key (피해자 개인키)
   
3. 암호화된 Cpriv.key → 복호화
   필요: Spriv.key (공격자 개인키)

문제점:
- Spriv.key는 공격자 C&C 서버에만 존재
- Cpriv.key는 Spub.key로 암호화되어 있어 Spriv.key 없이 복호화 불가능
- AES 키는 Cpub.key로 암호화되어 있어 Cpriv.key 없이 복호화 불가능

 

5.1.2 복호화 가능 시나리오

 

시나리오 1: API 후킹으로 AES 키 캡처

CryptGenRandom API 호출
         ↓
   평문 AES 키 생성 (32B)
         ↓
  ★ API 후킹 지점 ★  ← 키 캡처!
         ↓
  RSA로 AES 키 암호화
         ↓
  파일 암호화 수행

 

시나리오 2: 메모리 덤프에서 키 추출

암호화 진행 중 메모리 덤프
         ↓
평문 AES 키 패턴 검색
         ↓
키 후보 추출 및 검증

 

시나리오 3: 공격자 개인키 획득 

Spriv.key 획득
         ↓
Cpriv.key 복호화
         ↓
각 파일의 AES 키 복호화
         ↓
파일 복호화

5.2 CryptGenRandom 키 복구 메커니즘

 

취약점 구조

[암호화 프로세스]
CreateFile("target.docx")
         ↓
CryptGenRandom(hProv, 32, pbKeyBlob)  ← 평문 AES 키 생성
         ↓
  ★ API 후킹 지점 ★
  - 32바이트 평문 AES 키 캡처
  - 파일명과 매핑하여 저장
         ↓
CryptImportKey(..., pbKeyBlob, 32, ...)  ← 키 객체 생성
         ↓
CryptEncrypt(...)  ← 파일 암호화
         ↓
RSA_Encrypt(pbKeyBlob, Cpub.key)  ← AES 키 암호화
         ↓
WriteFile(hFile, encryptedKey, ...)  ← 암호화된 키 저장
         ↓
ZeroMemory(pbKeyBlob, 32)  ← 평문 키 메모리 소거

5.3 자동화 복호화 스크립트 개발

5.3.1 핵심 복호화 로직

 

1. 암호화된 파일 메타데이터 추출

import struct

def extract_metadata(encrypted_file_path):
    """파일 Footer에서 메타데이터 추출"""
    with open(encrypted_file_path, 'rb') as f:
        # 파일 끝으로 이동
        f.seek(-288, 2)  # 256 + 16 + 8 + 4 + 4 = 288 바이트
        
        # 메타데이터 읽기
        encrypted_aes_key = f.read(256)  # RSA-2048로 암호화된 AES 키
        iv = f.read(16)                  # IV
        original_size = struct.unpack('<Q', f.read(8))[0]  # 원본 크기
        mode_flag = struct.unpack('<I', f.read(4))[0]      # 암호화 모드
        magic = f.read(4)                # 매직 바이트
        
        if magic != b'INC\x00':
            raise ValueError("Invalid INC ransomware file")
        
        return {
            "encrypted_aes_key": encrypted_aes_key,
            "iv": iv,
            "original_size": original_size,
            "mode_flag": mode_flag
        }

 

2. AES-256 CBC 복호화

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

def decrypt_file_aes(encrypted_file_path, aes_key_hex, output_path):
    """AES-256 CBC 모드로 파일 복호화"""
    # 메타데이터 추출
    metadata = extract_metadata(encrypted_file_path)
    iv = metadata["iv"]
    original_size = metadata["original_size"]
    mode_flag = metadata["mode_flag"]
    
    # AES 키 변환
    aes_key = bytes.fromhex(aes_key_hex)
    
    # 암호화된 데이터 읽기
    with open(encrypted_file_path, 'rb') as f:
        encrypted_data = f.read()
    
    # 메타데이터 제거 (Footer 288바이트)
    encrypted_data = encrypted_data[:-288]
    
    # AES 복호화
    cipher = AES.new(aes_key, AES.MODE_CBC, iv)
    
    if mode_flag == 1:  # Fast mode - 처음 1MB만 암호화됨
        decrypted_chunk = cipher.decrypt(encrypted_data[:1_000_000])
        decrypted_data = decrypted_chunk + encrypted_data[1_000_000:]
    elif mode_flag == 2:  # Medium mode - 1MB씩 선택적 암호화
        decrypted_data = bytearray()
        offset = 0
        while offset < len(encrypted_data):
            if (offset // 1_000_000) % 2 == 0:  # 짝수 청크는 암호화됨
                chunk_size = min(1_000_000, len(encrypted_data) - offset)
                decrypted_chunk = cipher.decrypt(encrypted_data[offset:offset+chunk_size])
                decrypted_data.extend(decrypted_chunk)
                # 다음 청크를 위해 cipher 재초기화
                cipher = AES.new(aes_key, AES.MODE_CBC, encrypted_data[offset+chunk_size-16:offset+chunk_size])
            else:  # 홀수 청크는 평문
                decrypted_data.extend(encrypted_data[offset:offset+1_000_000])
            offset += 1_000_000
    else:  # Full mode - 전체 암호화
        decrypted_data = cipher.decrypt(encrypted_data)
        # PKCS7 패딩 제거
        try:
            decrypted_data = unpad(decrypted_data, AES.block_size)
        except:
            pass  # 패딩이 없는 경우
    
    # 원본 크기로 자르기
    decrypted_data = decrypted_data[:original_size]
    
    return True

 

3. 매직 바이트 검증

def verify_decryption(output_path, expected_ext):
    """복호화 결과의 매직 바이트 검증"""
    magic_bytes = {
        '.jpg': b'\xFF\xD8\xFF',
        '.png': b'\x89PNG\r\n\x1a\n',
        '.pdf': b'%PDF',
        '.docx': b'PK\x03\x04',
        '.xlsx': b'PK\x03\x04',
        '.zip': b'PK\x03\x04',
        '.exe': b'MZ',
        '.dll': b'MZ'
    }
    
    ext = expected_ext.lower()
    if ext not in magic_bytes:
        return None  # 검증할 수 없는 파일 형식
    
    with open(output_path, 'rb') as f:
        header = f.read(len(magic_bytes[ext]))
    
    return header == magic_bytes[ext]

5.4 무결성 검증

5.4.1 매직 바이트 테이블

파일 유형 매직 넘버 (Hex) 설명
JPG/JPEG FF D8 FF E0/E1/DB JPEG 이미지
PNG 89 50 4E 47 0D 0A 1A 0A PNG 이미지
PDF 25 50 44 46 PDF 문서
DOCX 50 4B 03 04 Office Open XML (ZIP)
XLSX 50 4B 03 04 Office Open XML (ZIP)
ZIP 50 4B 03 04 ZIP 압축 파일
EXE/DLL 4D 5A Windows 실행 파일 (MZ)
MP3 FF FB / ID3 MP3 오디오
MP4 00 00 00 18/20 66 74 79 70 MPEG-4 비디오

 

6. 요약 및 결론 (Conclusion)


6.1 최종 평가

INC 랜섬웨어는 AES-256 대칭 암호화와 RSA-2048 비대칭 암호화를 결합한 하이브리드 방식을 채택하여, 공격자 개인키 없이는 복호화가 불가능한 구조를 가지고 있습니다. **부분 암호화(Intermittent Encryption)**와 멀티스레딩(CPU 코어 × 4) 기법을 통해 암호화 속도를 극대화하며, VSS 삭제 및 프로세스 종료를 통해 복구를 방해합니다.

그러나 CryptGenRandom API 호출 시점에 평문 AES 키가 메모리에 존재하는 구조적 취약점으로 인해, API 후킹을 통한 실시간 키 캡처가 가능하며, 이를 활용한 완벽한 복호화가 실증되었습니다.

[취약점 요약]
CryptGenRandom(32바이트)
         ↓
   평문 AES 키 생성
         ↓
  ★ API 후킹 지점 ★
         ↓
RSA-2048 키 암호화
         ↓
AES-256 CBC 파일 암호화
         ↓
  파일 암호화 완료

6.2 대응 가이드

6.2.1 예방적 조치

 

1. API 모니터링 강화

  • CryptGenRandom 호출 패턴 실시간 탐지
  • 의심스러운 대량 난수 생성 차단 (32바이트 × 수백 회)
  • 멀티스레드 암호화 패턴 탐지 (CPU 코어 × 4 스레드)

 

2. 행위 기반 탐지

  • 대량 파일 접근 패턴 탐지 (수천 개 파일 동시 접근)
  • .INC 확장자 추가 행위 차단
  • VSS 삭제 시도 탐지 및 차단
  • 프린터 자동 출력 시도 차단

 

3. 네트워크 방어

  • CVE-2023-3519 (Citrix NetScaler) 패치 적용
  • RDP 접근 제한 및 MFA 적용
  • 의심스러운 PowerShell/WMI 실행 차단

 

4. 파일 시스템 보호

  • 실시간 백업 시스템 구축 (오프라인 백업 포함)
  • VSS 보호 솔루션 적용
  • 중요 파일 읽기 전용 설정

 

6.2.2 사후 대응

 

1. 초동 조치

  • 감염 발견 즉시 시스템 격리 (네트워크 차단)
  • 메모리 덤프 수행 (시스템 종료 금지!)
  • 프로세스 메모리에서 평문 AES 키 추출 시도

 

2. 키 복구 전략

  • API 후킹 도구로 CryptGenRandom 로그 확보
    • Detours 라이브러리 활용
    • 후킹 DLL 인젝션
    • JSON 로그 파일 수집
  • 메모리 포렌식으로 AES 키 패턴 추출
    • Volatility Framework 활용
    • 32바이트 패턴 검색 (높은 엔트로피)
    • 파일명과 키 매핑
  • API 후킹 로그에서 키 후보 도출
    • 타임스탬프 기반 파일-키 매핑
    • 키 검증 (매직 바이트 확인)

 

3. 복호화 수행

  • 추출한 AES 키로 파일 복호화
  • 매직 바이트 검증 및 무결성 확인

 

4. 시스템 복구

  • 복호화 성공 후 시스템 재구축
  • 초기 침투 경로 분석 및 패치
  • 보안 솔루션 강화

6.3 기술적 특징 요약

항목 세부 내용
암호화 알고리즘 AES-256 CBC (대칭) + RSA-2048 (비대칭)
키 관리 파일별 독립 32바이트 AES 키 (CryptGenRandom)
하이브리드 구조 AES로 파일 암호화 → RSA로 AES 키 암호화
부분 암호화 Fast/Medium 모드 (1,000,000 바이트 단위)
멀티스레딩 CPU 코어 수 × 4 스레드
확장자 .INC
랜섬 노트 INC-README.TXT, INC-README.HTML
초기 침투 CVE-2023-3519 (Citrix NetScaler), Phishing
복호화 가능성 API 후킹으로 AES 키 확보 시 100% 복구 가능
회피 기법 VSS 삭제, 프로세스 종료, 배경화면 변경, 프린터 출력

6.4 결론

INC 랜섬웨어는 AES-256과 RSA-2048을 결합한 강력한 하이브리드 암호화 구조를 가지고 있으며, 부분 암호화와 멀티스레딩을 통해 암호화 속도를 극대화하는 정교한 랜섬웨어입니다. 2023년 7월 등장 이후 300명 이상의 피해자를 발생시키며 지속적으로 활동하고 있습니다.

그러나 CryptGenRandom API를 직접 호출하는 설계상 취약점으로 인해, API 후킹을 통한 실시간 AES 키 캡처가 가능하며, 이를 활용한 복호화가 실증되었습니다. 본 분석에서 개발한 자동화 복호화 도구는 INC 랜섬웨어 감염 피해 복구에 직접 활용될 수 있습니다.

향후 대응을 위해서는 암호화 API 실시간 모니터링 체계 구축, 메모리 포렌식 역량 강화, CVE-2023-3519 패치 적용, 다층 백업 전략 수립이 필수적입니다. 특히 감염 초기에 메모리 덤프를 확보하고, API 후킹 도구를 사전에 배포하는 것이 복호화 성공률을 극대화할 수 있습니다.