상세 컨텐츠

본문 제목

[ Ransomware Petya 분석 ]

Study/Project

by bing_su 2021. 7. 4. 01:00

본문

반응형
SMALL

프로젝트를 위해 준비를 하면서 Petya라는 랜섬웨어를 분석하게 되어 정리를 해 보려고 한다. 

[ Ransomware ]

몸값을 뜻하는 Ransom과 Software(소프트웨어)가 더해진 합성어이다. 컴퓨터 시스템을 감염시켜 접근을 제한하고 일종의 몸값을 요구하는 악성 소프트웨어의 한 종류다. 컴퓨터로의 접근이 제한되어 제한을 없애기 위해 해당 악성 프로그램을 개발한 자에게 지불을 강요받는다. 

[ Petya ]

  • 2016년 처음 발견된 암호화 랜섬웨어의 일종이다.
  • 트로이 목마(Trojan Horse)로 분류된다. (아래는 트로이 목마에 대한 설명이다.)
더보기

[ 트로이 목마 ]

악성 루틴이 숨어 있는 프로그램이다. 겉보기에는 정상적인 프로그램으로 보이나 실행 시 악성코드가 실행된다. 트로이 목마가 설치되었거나 상승된 권한으로 실행 중이면, 트로이 목마는 일반적으로 제한 없는 접근이 가능하다. 이 능력을 통해 무엇을 할지는 공격자에게 달려 있다. 그중에서 랜섬웨어의 목적으로 실행되면 전자화폐 절도에 사용될 수도 있다. 

  • 마이크로소프트 윈도우 기반 시스템을 대상으로 한다.
  • 감염 방식: MBR(Master Boot Record: 마스터 부트 레코드)를 감염시켜 하드 드라이브의 파일 시스템 테이블을 암호화하고 윈도우 부팅을 차단하는 페이로드를 실행시킨다.
  • 시스템의 접근 권한을 다시 취득하려면 사용자는 비트코인을 지불해야 한다.
  • SMB 취약점을 악용해서 감염된다. 

[ NTFS(New Technology File System) ]

윈도우 NT 계열 운영체제의 파일 시스템이다. VBR(Volume Boot Record) 영역, MFT(Master File Table) 영역, Data Area 영역 순서로 구성되어 있다. 

[ VBR(Volume Boot Record) 영역 ]

NTFS 구조에서 가장 앞부분에 위치한다. Boot Sector와 추가적인 VBR 영역이 있다. Boot Sector에는 파티션에 설치된 운영체제를 로드하기 위한 코드를 가질 수 있고, 추가적인 VBR 영역에는 NT 로더를 빠르게 로드하기 위해 NT 로더의 위치를 저장한다. 

[ MFT(Master File Table) 영역 ]

파일과 디렉터리 관리를 위해 MFT Entry로 구성되며 MFT Entry 0~15번은 파일 시스템 생성과 동시에 예약된 영역이다. 12.5% 정도를 MFT 영역으로 할당한다. 

NTFS 구조

[ MBR(Master Boot Record) ]

: BR(Boot Record)을 관리하는 영역이다. BR 영역은 Boot Code가 시작되는 위치, 파일 시스템 설정 정보 등의 시스템 부팅 과정에서 필요한 정보를 저장한다. 

다중 파티션의 경우, 여러 개의 BR 영역이 존재하고 이들을 관리하는 영역이 MBR(Master Boot Record)다. MBR에는 Boot Record, 각 BR 영역의 위치 정보 등을 담고 있다. 

MBR 구조

Boot Code는 Partition Table에서 부팅 가능한 파티션의 Boot Sector를 호출하는 역할을 한다. Partition Table에는 각 파티션에 대한 정보가 있다. 마지막으로 Signature는 MBR 영역의 고유 바이트로, 0xAA55의 값이 저장된다. (윈도우 환경에서는 리틀 엔디안 방식을 사용하므로 55 AA의 꼴로 저장될 것이다.)

MBR 파티션 방식을 사용하는 시스템에서 MBR 영역의 Boot Code는 부팅에 필수적이다. 따라서 MBR 영역 데이터의 무결성을 해치는 Petya에 감염되면 사용자 PC가 부팅 가능한 파티션을 찾지 못해서 부팅 자체가 불가능해진다. 

[ 실행 ]

사용 Tool: VMWare Workstation 15.5 PRO, VirusTotal(https://www.virustotal.com/gui/)

Petya 실행 파일의 모습

두 가지 형식의 파일이 존재한다. 두 번째 exe 실행 파일로 분석을 진행했다. 

exe 파일을 VirusTotal에 올린 결과

해당 파일을 VirusTotal에 올려서 분석한 결과다. 주요 정보만 적자면 아래와 같다.

  • 파일 이름: Petya.exe
  • 파일 크기: 225.50 KB
  • MD5: af2379cc4d607a45ac44d62135fb7015
  • SHA-1: 39b6d40906c7f7f080e6befa93324dddadcbd9fa
  • SHA-256: 26b4699a7b9eeb16e76305d843d4ab05e94d43f3201436927e13b3ebafa90739

Petya 실행 파일의 탐지된 결과

Trojan.Ransom.Petya.C 등을 통해 트로이 목마 형태의 랜섬웨어라는 것을 확인할 수 있다.

Petya.exe 실행

SnapShot을 찍어준 후에 실행을 하면 아래와 사진들과 같이 bluescreen이 뜨면서 OS가 강제 종료되고, 이후에 디스크를 확인하는 과정이 있다. 이후 아무 키나 누르라고 하면서 랜섬 노트를 출력한다.

Petya.exe 실행 후 강제 재부팅됨
OS 재부팅 후 디스크를 확인하는 과정 진행. 
디스크 확인 과정 후 랜섬노트 출력.
Petya 랜섬 노트

해석하면 하드 디스크가 암호화되었으니 해제하기 위해서 키를 구매해야 한다는 것이다. Petya 랜섬웨어의 경우, 개별로 지정된 토르 브라우저를 이용해 비트코인을 요구한다. 

[ Petya 암호화 방식 분석 ]

사용 Tool: IDA Pro 7.5, OllyDbg v1.10, VirusTotal(https://www.virustotal.com/gui/)

프로그램 실행 전 코드

해당 실행 파일은 메모리에 MZ header를 가진 dll 파일을 올려서 위의 명령을 수행한다. 즉, 0x0041AE72 ~ 0x0041B358까지의 코드를 반복하면서 아래와 같이 MZ header로 시작되는 새로운 바이너리를 기록한다. 

프로그램 실행 후 MZ header로 시작하는 바이너리 기록
작성된 dll 파일의 일부분

작성된 dll 파일의 모습에서 PE 파일 헤더 형태와 기타 문자열들을 확인할 수 있다. 해당 dll 바이너리가 기록된 후에 JMP 명령어를 통해 "_ZuWQdweafdsg345312@0" 부분(export 되는 setup.dll 파일)으로 이동한다. 

setup.dll 파일 export되는 부분

새롭게 작성된 dll 파일을 추출해서 분석을 진행하자. 

추출된 dll 파일의 분석(VirusTotal)

해당 dll 파일을 VirusTotal에 넣고 돌리면 악성 파일임을 확인할 수 있다. 해당 파일은 Petya의 암호화 루틴이 있는 파일이고, 주요 정보만 적으면 아래와 같다. 

  • 파일 유형: dll
  • 파일 크기: 47.00 KB
  • MD5: 7899d6090efae964024e11f6586a69ce
  • SHA-1: 9078e741d6d66fb6b4920878f0B7cd6a0f8b1cc7
  • SHA-256: 542a38bf52afa6a4a008089a6fbf22c9d68ef5d6c634dd2c0773d859a8ae2bbf

추출한 MZ 실행 파일의 대략적인 실행 과정

추출한 MZ 실행 파일을 IDA에 올려서 정적 분석을 진행했다. DllEntryPoint에서 호출하는 함수들을 타고 가보면 위와 같은 코드를 가진 함수가 있다. 정리를 하면 CreateFileA 함수로 OS가 설치된 디스크의 Handle을 받아 온다. 만약 Handle을 얻지 못하면 해당 프로그램은 종료된다. 만약 Handle을 얻었을 경우 MBR 영역이 암호화되는 과정에 들어간다. 

첫 번째 과정

먼저 0x200(512) bytes 단위로 한 sector를 읽어서 0x37 XOR 연산을 수행 후 동일한 영역에 다시 쓴다. 이를 34(0x22) 번 수행한다. 따라서 0x200부터 0x4400까지는 원본 데이터와 0x37 XOR 연산을 한 결과 데이터가 저장된다.

첫 번째 과정에서 파일로부터 데이터를 읽어오는 함수 내부

해당 함수 첫 번째 인자로 파일 이름을 받고, 두 번째 인자로 파일에서 읽은 데이터를 저장할 버퍼를 받는다. 세 번째 인자와 네 번째 인자는 파일 포인터를 계산할 때 사용된다. 즉, 해당 함수를 호출하면 첫 번째 인자로 받은 파일 이름에 해당하는 파일을 열어서 세 번째 인자로 받은 a3에 512를 곱한 지점부터 512 bytes를 읽어서 두 번째 인자로 받은 버퍼에 저장하는 구조다. 

이 함수에서 a3의 값을 shift left 연산 9회를 수행해 setFilePointerEx 함수의 인자로 전달한다. 따라서 파일 포인터는 세 번째 인자로부터 512배에 해당하는 지점을 가리킨다. 

첫 번째 과정에서 디스크 영역에 쓰는 역할을 수행하는 함수 내부

위의 파일의 데이터를 읽어오는 함수와 logic이 비슷하다. 첫 번째 인자로 받은 파일 이름에 해당하는 파일을 열어 세 번째 인자로 파일 포인터를 계산하고, 두 번째 인자로 받은 버퍼에 있는 데이터를 512 bytes 만큼 쓰는 구조다. 

파일 포인터를 계산하는 Logic은 위의 sub_100088EE 함수와 동일하다. Petya가 디스크에서 데이터를 읽어서 쓰는 과정들은 모두 이 두 함수(sub_100088EE / sub_10008963)를 통해 진행된다. 

두 번째 과정

0x200 ~ 0x4400 부분을 암호화하고 난 후 실행되는 코드다. 0x000 ~ 0x200까지, 즉 MBR 영역을 읽고 암호화한다. 마찬가지로 0x37 XOR 연산이 쓰인다. 암호화된 MBR 영역의 코드는 v35 변수에 저장되고, 해당 변수에 저장된 값은 프로그램이 종료할 때 MBR 영역이 아닌 다른 영역에 쓰인다. 

세 번째 과정

MBR 영역이 암호화된 후, 두 변수에 악성 데이터를 쓰는 과정이다. 먼저, v39 변수에 문자 '7'(0x37)을 512 bytes를 쓴다. v38은 암호화 과정이 수행되고 출력되는 URL 텍스트 중 일부를 저장한다. 중요한 과정은 아니므로 빠르게 pass 하자. 

네 번째 과정

URL 텍스트 일부가 담긴 v38 변수가 0x6C00 주소에 쓰이고, '7'(0x37)로 이루어진 512 bytes 길이의 v39 변수는 0x6E00 주소에 저장된다. v35에 저장된 암호화된 MBR 영역의 데이터는 0x7000 주소에 쓰인다. Petya 암호화 과정을 최종적으로 정리해서 나타내면 아래와 같다. 

< Petya 암호화 과정 최종 정리 >

 

  offset Data
0x0000 ~ 0x0200 악성 MBR 데이터
0x0200 ~ 0x4400 원본 Data와 0x37 XOR된 Data
0x4400 ~ 0x6C00 랜섬 노트 && 해골 문양
0x6C00 ~ 0x6E00 URL Data
0x6E00 ~ 0x7000 0x37
0x7000 ~ 0x7200 원본 MBR과 0x37 XOR된 Data

암호화 과정 후 호출되는 함수

암호화 과정이 끝나면 해당 함수가 호출된다. GetCurrentProcess 함수를 통해 현재 프로세스의 Handle을 얻고, OpenProcessToken, LookupPrivilegeValueA, AdjustTokenPrivileges 함수를 각각 호출하면서 시스템 종료 권한을 얻음으로써 권한이 상승된다. 이후 "NTDLL.DLL"을 로드하면서 "RaiseHardError"의 주소를 얻고 이를 호출함으로써 PC가 reboot 된다. 

시스템 재부팅 되면서 CHKDSK 검사가 진행됨.

시스템이 자동으로 재부팅되면서 원본 MBR 영역이 손상되어서 위와 같이 CHKDSK 검사가 진행되고, 이후 Petya에 의해 작성된 MBR이 실행되므로 랜섬 노트를 출력하는 것이다.

[ 실제 실행 시 MBR 분석 / 복구 시도 ]

사용 Tool: VMWare Workstation 15.5 PRO, HxD, Online XOR calculator 

Petya 감염 전후의 가상머신 MBR 영역을 비교했다. 

vmdk header 부분

vmdk header 구조는 이 링크를 참고했다. (참고 문헌에도 표기) 80 3C 00 00 00 00 00 00에 해당하는 부분은 메타데이터 할당 섹터 수를 의미하고, 이를 통해 실제 저장된 데이터의 시작 위치 정보를 알 수 있다. 즉, 실제 디스크의 MBR 시작 주소를 알 수 있다는 것이다. 

일단 윈도우 환경이므로 리틀 엔디안 방식을 사용한다. 또한 1 sector 당 512(0x200) bytes 크기를 가진다. 따라서 MBR의 시작 주소는 0x3C80*0x200 = 0x790000이 되는 것이다. 

MBR이 시작되는 부분은 vmdk 파일이 아닌 실제 저장된 데이터가 시작되는 부분이고, 이는 메타데이터 할당 섹터 수인 0x3C80 만큼을 지난 15488 sector부터이다. 따라서 이 섹터 넘버를 입력해서 쉽게 MBR 영역을 찾을 수 있다. 

Petya 실행 전 MBR 영역
Petya 감염 후 디스크 내부 영역 변화

해당 그림을 통해 기존 MBR에서 0x37 XOR 연산으로 변조된 MBR은 0x7000만큼 떨어진 위치에 존재한다. 따라서 0x37 XOR 연산이 이루어져 변조된 MBR의 시작 주소는 0x797000이 된다. 

Petya 감염 후 변조된 MBR 영역

XOR 연산은 배타적인 특성을 가지므로 위의 영역을 다시 역으로 0x37 XOR 연산을 해서 원본 MBR이 되게끔 복호화를 진행해보자. vmdk의 hex 값이 암호화되는 과정과 복호화 한 데이터를 넣어 가상머신이 다시 돌아가는지 확인하는 과정이 필요해서 snapshot이 찍히지 않은 가상머신 한 대를 추가로 만들어서 진행했다. 

변조된 MBR 영역 복호화 진행

변조된 MBR 영역을 0x37 XOR 연산을 해서 복호화를 했다. 복호화된 output 값을 원래의 MBR 위치(15488 sector)에 삽입한다. HxD를 다뤄본 사람들은 알 수 있는 내용이다. ctrl+v는 data insert(삽입)의 개념이고, overwrite를 할 경우에는 ctrl+b로 값을 채워야 함에 주의하자. 

복호화 된 MBR 값 삽입
원본 Data와 0x37 XOR된 데이터 및 악성 데이터가 남아 있는 모습

15488 이후 sector에 악성 데이터가 0x37로 채워진 채로 남아 있는 것을 확인할 수 있다. 즉, 7002 bytes 만큼 악성 데이터가 채워져 있는 상태였다. 따라서 악성 데이터가 채워진 만큼 원본 MBR 영역 이후부터 값을 0으로 채우자. 

부팅 성공적으로 완료

랜섬웨어로 인해 나타나는 화면이 아니라 부팅이 되는 것을 확인할 수 있다. 

 

분석 후 간단하게 아래의 고찰을 적어봤다.

Petya의 경우, MBR 영역이 변조되어 운영체제가 작동하지 못하도록 만들었을 뿐 아니라 MBR 영역이 암호화되는 과정도 비교적 간단하게 분석할 수 있기 때문에 쉽게 복원을 할 수 있었다. 하지만, MBR 방식이 조금 더 진화한다면 부팅이 불가능한 상황에서 피해가 더 심해질 수 있다고 생각한다. 따라서 랜섬웨어의 원형에 대해 알고 있는 것이 조금 더 도움이 될 것이라고 생각한다. 

 

반응형
LIST

댓글 영역