랜섬웨어 분석 보고서

Babuk 랜섬웨어 분석 보고서

geonwoo9643 2025. 12. 26. 05:45

1. 개요 (Overview)


1.1 분석 배경

2021년 초 처음 식별된 Babuk(Babuk Locker) 랜섬웨어는 C++ 기반의 멀티 플랫폼 위협으로, 엔터프라이즈 환경의 윈도우 워크스테이션 및 ESXi 가상화 서버를 주요 타겟으로 설계되었다. 본 보고서에서 다루는 샘플은 2021-01-03(UTC)에 최초 관측된 초기 변종이다. 해당 변종은 고도화된 시스템 침투 기법을 보유하고 있으나, 암호화 구현 과정에서 치명적인 논리적 결함이 존재한다. 이에 본 분석에서는 Babuk의 초기 공격 메커니즘을 규명하고, 식별된 취약점을 이용한 데이터 복구 방안을 제시하고자 한다.


1.2 핵심 요약

  • 복합 하이브리드 암호 체계: 고성능 스트림 암호인 ChaCha20을 기반으로 SHA-256 해시 및 NIST K-571(ECDH) 타원곡선 암호를 결합하여 파일 암호화를 수행한다.
  • 공격 범위 극대화 및 탐지 회피: 오프라인 암호화 기능을 지원하며, 복구/시스템 예약 파티션 및 EFI 파티션을 강제로 마운트하여 암호화 범위를 확장한다. 또한, 하드코딩된 대규모 프로세스 및 서비스 종료 목록을 기반으로 백업 솔루션 무력화와 파일 점유 해제를 시도한다.
  • 치명적 설계 결함 식별: 암호화 세션 동안 생성된 고정 키(Key)와 논스(Nonce)를 모든 파일에 동일하게 재사용하며, 블록 카운터가 항상 0x14(20)에서 시작하는 설계상 취약점이 발견되었다.
  • 데이터 복구 가용성 입증: 위 취약점을 이용해 침해 시스템의 메모리 덤프에서 암호화 매개변수를 역추적할 수 있음을 확인하였다. 이를 통해 암호화된 데이터의 100% 자동 복구가 가능함을 입증하고 전용 복구 PoC(Proof of Concept) 도구를 개발하였다.

 

  •  

2. 식별 정보 (Identification)


  • Malware Family: Babuk Ransomware (v1 초기 변종)
  • First Seen: 2021-01-03 (UTC)
  • Filetype: PE32 (Windows Executable)
  • Hash (MD5): e10713a4a5f635767dcd54d609bed977
  • Hash (SHA256): 8203c2f00ecd3ae960cb3247a7d7bfb35e55c38939607c85dbdb5c92f0495fa9
  • Extension: .NIST_K571
  • Ransom Note: How To Restore Your Files.txt
  • Target: Windows 시스템 및 네트워크 공유 리소스

 

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


구분 도구명 (Tool) 용도 (Purpose)
정적 분석 IDA Pro 바이너리 디스어셈블리, ECDH/ChaCha20 알고리즘 및 주요 함수 식별
동적 분석 x64dbg 런타임 디버깅, 전역 메모리 내 고정 키 및 논스 추출
행위 분석 System Explorer 파일 생성/변경 및 프로세스 스냅샷 모니터링
검증 도구 Python 메모리 덤프 기반 키 추출 및 자동 복호화 PoC 구현

 

 

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


4.1 초기화 및 시스템 침투

본 랜섬웨어는 실행 직후 시스템 제어권을 확보하고 사후 분석 및 복구를 방해하기 위해 다음과 같은 전처리 과정을 수행한다.

 

1. 실행 제어 및 명령줄 인수 분석

  • 동적 범위 설정: 실행 시 전달되는 인자(lanfirst, lansecond, nolan)를 분석하여 로컬 드라이브와 네트워크 공유 폴더에 대한 암호화 우선순위 및 범위를 결정한다.

 

2. 보안 솔루션 무력화 및 가용성 확보

  • 서비스 제어: BackupExecVSSProvider, VeeamTransportSvc, Sophos 등 백업 및 엔드포인트 보안 솔루션 관련 서비스를 식별하여 강제 중지시킨다.
  • 프로세스 킬링: sql.exe, oracle.exe 등 주요 데이터베이스 프로세스를 종료하여 데이터 파일에 대한 핸들 점유를 해제, 암호화 성공률을 극대화한다.
  • 볼륨 섀도 복사본 삭제: vssadmin.exe delete shadows /all /quiet 명령을 통해 시스템 복원 지점을 제거함으로써 윈도우 표준 기능을 이용한 데이터 복구를 원천 차단한다.

 

3. 암호화 대상 확장 및 흔적 제거

  • 강제 파티션 마운트: 숨겨진 복구 파티션이나 EFI 시스템 파티션을 각각 M:, N: 드라이브로 강제 마운트하여 시스템 깊숙한 곳까지 암호화 범위를 확장한다.
  • 안티 포렌식: 암호화 완료 후 SHEmptyRecycleBinA API를 호출, 사용자 확인 없이 휴지통을 비움으로써 삭제된 원본 파일의 복구 가능성을 최소화한다.

4.2 키 관리 체계 및 설계 결함

암호화의 핵심이 되는 키 생성 과정에서 보안 알고리즘을 사용함에도 불구하고, 구현상의 치명적인 설계 결함이 존재한다.

 

1. ECDH 기반 세션 키 파생

  • 난수 생성: RtlGenRandom API를 사용하여 88바이트의 암호학적 난수를 시드로 생성한다.
  • 개인키 유도: 생성된 시드를 ChaCha20 PRNG에 입력하여 72바이트 크기의 ECDH 개인키를 도출한다.
  • 공유 비밀(Shared Secret) 생성: NIST K-571(Koblitz Curve) 곡선을 기반으로 공격자의 공개키와 감염 시스템의 개인키를 이용하여 ECDH 키 교환을 수행한다.

 

2. 고정 키 재사용 결함

  • 최종 키 파생: 도출된 공유 비밀을 SHA-256으로 해싱하여 파일 암호화용 Key1(32B), Key2(32B), Nonce(12B)를 생성한다.
  • 취약점: 파생된 키 세트가 전역 메모리 영역에 고정적으로 상주하며, 감염된 시스템 내의 모든 파일을 동일한 키와 논스로 암호화한다. 이는 현대 암호 프로토콜에서 엄격히 금지하는 '논스 재사용(Nonce Reuse)'에 해당하며, 메모리 덤프를 통한 복구의 결정적인 단서가 된다.

4.3 암호화 메커니즘

 

1. ChaCha20 상세 사양

  • 알고리즘: ChaCha20 스트림 암호 (20 Rounds)
  • 구조: 512비트(64바이트) 상태 배열을 기반으로 하며, "expand 32-byte k" 상수를 시그니처로 사용한다.

 

2. 파일 처리 최적화 로직

  • 소형 파일 (40MB 미만): MapViewOfFile을 통해 파일 전체를 메모리에 매핑하여 신속하게 전체 암호화를 수행한다.
  • 대형 파일 (40MB 이상): 시스템 부하를 방지하고 속도를 높이기 위해 10MB 단위의 청크(Chunk)로 분할하여 순차적으로 암호화를 진행한다.

 

3. 이중 XOR 기반 암호 구조 (Double Encryption)

  • 본 랜섬웨어는 보안 강화를 위해 두 개의 독립적인 키스트림을 연쇄적으로 적용하는 이중 암호화 방식을 채택하고 있다.

  • 카운터 특이사항: 각 파일 암호화 시 ChaCha20의 블록 카운터는 항상 0x14(20)에서 시작하여 1씩 증가한다. 이 고정된 시작 카운터 값은 복호화 도구 제작 시 반드시 반영되어야 하는 핵심 요소이다.

4.4 정적 분석

  • 파일 열기 및 해당 파일 사용 중인 프로세스 강제 종료

 

  • 파일 크기에 따른 암호화

 

  • 디렉터리를 재귀적으로 탐색 및 암호화 후 확장자 추가

 

  • 랜섬노트 생성

 

  • 명령줄 옵션에 따른 암호화 처리

 

  • 휴지통 영구 삭제

 

  • 암호화 전체 과정

 

  • 안전한 난수 생성 (88바이트, ChaCha20 시드용)

 

  • ChaCha20 스트림 암호화

 

  • ECDH 공개키 생성

 

  • ECDH 공유 비밀키 생성

 

  • 공유 비밀키의 SHA-256 해시 값 계산

 

  • 공유 비밀키의 12바이트 최종 암호화 키 사용

 

  • 공개키 파일 저장

 

  • ChaCha20 스트림 암호화

 

  • ChaCha20 라운드 함수 (20라운드)

 

  • ChaCha20 상태 배열 초기화

 

  • 32비트 좌측 순환 시프트 (ROL)

 

  • SHA-256 해시 함수

 

  • SHA-256 초기화

 

  • SHA-256 업데이트

 

  • SHA-256 패딩 추가

 

  • SHA-256 변환

 

  • SHA-256 압축

 

  • 타원곡선 스칼라 곱셈

 

  • 확장 유클리드 알고리즘

 

  • 네트워크 공유 폴더 열거 및 암호화 (재귀)

 

  • WoW64 리디렉션 비활성화

 

  • VSS(Volume Shadow Service) 삭제

 

  • 파일 잠금 해제 및 백업/보안 무력화

 

  • 숨겨진 볼륨 마운트

 

  • 크리티컬 섹션 초기화

 

  • Anti-Debugging (프로세스 강제 종료)

 

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


본 분석에서는 Babuk의 키 재사용 결함 및 메모리 내 상태 블록 잔존 특성을 이용하여, 메모리 덤프에서 암호화 매개변수를 확보하고 파일을 복구하는 방안을 수립하였다.

5.1 복구 키 확보 방안 (Memory Forensics)

ChaCha20 알고리즘은 64바이트의 상태 배열(State)을 초기화하여 사용하며, 여기에는 고정 상수, 키(Key), 카운터(Counter), 논스(Nonce)가 포함된다. Babuk 프로세스 메모리 내에 이 구조가 평문으로 상주하므로, 고정 상수를 시그니처로 활용해 추출이 가능하다.

# ChaCha20 상수 "expand 32-byte k"를 시그니처로 검색
chacha_constants = bytes.fromhex("657870616E642033322D62797465206B")

def extract_keys(dump_data):
    offset = 0
    while True:
        pos = dump_data.find(chacha_constants, offset)
        if pos == -1: break
        
        # 구조: 상수(16B) + 키(32B) + 카운터(4B) + 논스(12B) = 총 64B
        key = dump_data[pos + 16 : pos + 48]
        counter = dump_data[pos + 48 : pos + 52]
        nonce = dump_data[pos + 52 : pos + 64]
        
        print(f"Found Key: {key.hex()}, Nonce: {nonce.hex()} at 0x{pos:X}")
        offset = pos + 1

[코드 1] 메모리 덤프 내 ChaCha20 매개변수 추출 로직


5.2 복호화 알고리즘 (Decryption Logic)

Babuk은 두 개의 독립적인 ChaCha20 키스트림을 생성하여 평문과 연쇄적으로 XOR 하는 이중 암호화(Double XOR) 방식을 사용한다. 하지만 XOR 연산의 교환법칙과 가역성에 의해, 확보된 두 개의 키스트림을 암호문에 적용하면 원본 데이터 복구가 가능하다.

(여기서 P는 평문, C는 암호문, KS는 각 키에 의해 생성된 키스트림 블록)

def decrypt_babuk(encrypted_data, key1, key2, nonce, start_counter=20):
    decrypted_data = bytearray()
    num_blocks = (len(encrypted_data) + 63) // 64
    
    for i in range(num_blocks):
        # 1. 블록별 카운터(기본값 0x14) 업데이트 및 키스트림 생성
        curr_counter = (start_counter + i).to_bytes(4, 'little')
        ks1 = generate_babuk_keystream(key1, curr_counter, nonce)
        ks2 = generate_babuk_keystream(key2, curr_counter, nonce)
        
        # 2. 해당 블록 내 바이트 단위 이중 XOR 역산 수행
        for j in range(64):
            idx = i * 64 + j
            if idx >= len(encrypted_data): break
            
            # Ciphertext ^ KS1 ^ KS2 연산으로 평문 복구
            val = encrypted_data[idx] ^ ks1[j] ^ ks2[j]
            decrypted_data.append(val)
            
    return decrypted_data

[코드 2] 이중 XOR 기반 복호화 및 키스트림 생성 로직

 

6. 요약 및 결론 (Conclusion)


6.1 암호화 워크플로우 (Encryption Workflow)

Babuk 랜섬웨어의 전체 공격 프로세스는 다음과 같이 요약된다.

  1. 사전 준비 단계: 명령줄 인수 분석을 통한 타겟팅 설정, VSS(볼륨 섀도 복사본) 삭제, 백업 관련 서비스 및 데이터베이스 프로세스 강제 종료, 시스템 예약 파티션 마운트 수행.
  2. 키 생성 단계: RtlGenRandom 기반 시드 생성 및 ECDH 연산을 통해 세션 전체에 적용될 전역 고정 키 세트(Key1, Key2, Nonce) 파생.
  3. 암호화 실행 단계: 모든 대상 파일에 대해 파생된 고정 키를 재사용하여 이중 ChaCha20 XOR 암호화 수행. 이때 블록 카운터는 항상 0x14에서 시작.
  4. 최종화 단계: 암호화된 파일의 확장자를 .__NIST_K571__로 변경하고, 공격자의 공개키 정보가 담긴 ecdh_pub_k.bin 저장 및 랜섬노트 생성.


6.2 최종 평가

Babuk 초기 변종은 NIST K-571 타원곡선 암호 등 현대적인 알고리즘을 도입하여 보안성을 높이려 시도했으나, '고정 키 및 논스 재사용'이라는 치명적인 암호학적 설계 결함을 노출했다. 이는 스트림 암호의 가역성을 이용한 공격에 매우 취약하며, 침해 사고 발생 시 시스템 전원을 유지한 상태에서 메모리 덤프를 확보할 경우 유효한 키스트림을 역산하여 데이터의 100% 복구가 가능함을 시사한다.

 

7. 대응 및 예방 가이드 (Mitigation)


  • 휘발성 데이터 보존 (최우선): 감염 인지 시 시스템을 재부팅하거나 종료하지 말고 즉시 메모리 덤프를 생성해야 한다. 암호화 매개변수가 전역 변수 형태로 메모리에 상주하므로, 전원을 끄는 순간 복구 기회가 상실된다.
  • VSS 및 시스템 프로세스 모니터링: vssadmin을 이용한 백업 삭제 행위 및 taskkill을 통한 보안 서비스 중지 시도를 실시간 탐지하고 차단하는 EDR 정책을 수립한다.
  • 주요 증거 파일 보호: 복구 도구 실행 및 암호화 매개변수 식별의 지표가 되는 ecdh_pub_k.bin 파일이 삭제되지 않도록 보존한다.

 

부록: 침해 지표 (Appendix: IOC)

구분 유형 (Type) 값 (Value / Indicator)
파일 해시 MD5 e10713a4a5f635767dcd54d609bed977
파일 해시 SHA-256 8203c2f00ecd3ae960cb3247a7d7bfb35e55c38939607c85dbdb5c92f0495fa9
생성 파일 Key File %AppData%\Roaming\ecdh_pub_k.bin
생성 파일 Ransom Note How To Restore Your Files.txt
확장자 Encrypted Ext .NIST_K571