Forensic/포렌식 공부

[디스크 복구] PeTya 랜섬웨어 감염 MBR 복구

Ron Weasley 2022. 8. 13. 16:29

*본 내용은 공부를 목적으로 작성하는 글임을 알려드립니다.

 

이번에 다뤄볼 내용은 2017년 한국 정보통신 학회에서 투고된 "랜섬웨어 Petya에 대한 분석과 대응방안" 이라는 논문이다. 

 

원문은 다음 링크를 타고 들어가시면 확인할 수 있다.

https://scienceon.kisti.re.kr/srch/selectPORSrchArticle.do?cn=NPAP12899226 

 

ABSTRACT

랜섬웨어는 주로 정부 기관과 금융기관, 기업 등을 대상으로 파일 또는 디스크 부팅 영역(BR)을 암호화하여 금전적인 피해뿐 아니라 개인정보 탈취 등의 보안 이슈를 초래해 왔다. 본 논문에서는 NTFS 파일 시스템 및 랜섬웨어 Petya에 대해 설명하고 포렌식 기법을 적용하여 MBR 영역 복구에 대한 방법을 다뤄본다.

 

1. 서론

최근 악성코드 관련 주제로 랜섬웨어는 절대 빠지지 않는 주제이다. 랜섬웨어는 컴퓨터 사용자가 이메일 혹은 악의적인 프로그램을 이용하였을 시 사용자의 데이터 혹은 디스크 영역을 암호화하여 금전적인 요구를 하는 악성프로그램이다.

WanaCry Ransomeware

2. NTFS

2.1 NTFS

NTFS는 사용자가 저장한 데이터를 읽거나, 쓰는 등 효율적으로 관리하기 위해 논리적인 접근 방식을 사용한다. NTFS 구조는 VBR 영역, MBR 영역 Data Area 영역 순서로 구성되어 있다.

 

2.2 VBR

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

 

2.3 MFT

MFT(Master File Table)는 파일과 디렉터리를 관리하기 위해 MFT Entry로 구성되어 있다. 일반적으로 12.5% 정도를 MFT 영역으로 할당하며, MFT Entry 0 ~ 15번은 파일 시스템 생성과 동시에 생성되는 예약된 영역이다.

 

3. 랜섬웨어 Petya

3.1 Petya

Petya 랜섬웨어는 유저가 메일을 통해 PDF파일이나 SFX(SoundFX) 파일로 위장한 실행파일을 다운로드한 후 UAC(User Account Control)를 우회하지 않고 실행된다. 강제 재부팅과 MBR영역이 변조되어 파일 접근을 할 수 없도록 한다. 그 이후 해커는 컴퓨터를 복구 시키는 값으로 비트코인을 요구한다.

 

3.2 감염 후 디스크 내부 영역 변화

Petya 랜섬웨어 감염 후 0번째 섹터에 존재하는 512Byte 만큼의 크기를 갖는 MBR 영역은 0x37로 XOR 연산되어 변조된 것을 확인할 수 있고 다른 파티션 테이블 영역은 달라지지 않는다. 하지만 다른 영역은 악성 데이터들로 값이 변경되어 있다.

Petya 랜섬웨어 감염 후 MBR 구조

위 표는 Petya 랜섬웨어 감염 후 MBR 구조를 나타낸 것이며, 나중에 복구하는 실습내용도 포함시킬 것이니 감염 후 디스크의 구조가 이렇게 되어 있다고 생각하시면 된다.

 

3.3 MBR 영역 복구

MBR 영역을 복구 하는 방법으로는 기존 데이터를 0x37의 값과 XOR 연산한 것으로 암호화가 아닌 변조가 일어났다. 그래서 변조된 MBR 영역만 추출하여 0x37로 다시 XOR 연산을 하면 기존의 MBR의 값으로 복구가 가능할 것이다.

 

4. 결론

랜섬웨어 Petya에 대한 분석과 대응방안에서 다루었다. 분석한 랜섬웨어 Petya는 단순하게 디스크의 MBR 영역을 XOR 연산을 하는거지만 변종들이 발생한다면 이보다 더 한 피해를 입을 것이고 사용자들은 자신의 중요한 데이터는 백업을 하는 것을 일상화해야한다.

 

5. 실습

이제 Petya 랜섬웨어 대응 방안에 대해서 배웠으니 직접 실습을 해보도록 하겠습니다.

먼저, 랜섬웨어에 감염된 가상환경을 실행시켜 봤습니다.

보시면 부팅이 되지 않고 해골 모양이 출력이 되다가 키를 하나 누르니 키를 입력하는 창으로 이동됩니다.

 

복구하는 과정은 다음과 같다.

1단계 : XOR 암호화된 MBR을 XOR 복호화하여 MBR 획득
2단계 : 악성 데이터가 덮어 쓰인 영역을 모두 0으로 채움

XOR로 암호화된 MBR을 복호화 하기 위해서는 VMDK 구조를 제외하고 분석하기 위해서 아까 디스크 상태를 보여준 표를 보면서 따라 가보면 0x7000에 위치하는 곳이 "0x37 연산된 원본 MBR" 이기 때문에 한번 보겠습니다.

일단 0x37로 XOR 연산이 된 것을 확인할 수 있습니다.

지금 보여준 0x7000 오프셋에 존재하는 데이터들이 다 0x37로 XOR 연산이 되어있으며, 하단 파티션 구조를 보시면 다 37로 되어 있음을 보여줍니다. 원본 MBR을 복사하여 hxd에 저장을 해줍니다. 범위는 0x7000 ~ 0x71FF 까지 입니다.

 

이제 0x37로 XOR된 원본 MBR을 XOR 역산을 진행하여 원본 MBR을 구해보도록 하자.

MBR_infection = [0x04,0xF7,0xB9,0xE7,0x8B,0x37,0x4B,0xB9,0xF7,0xB9,0xEF,0x89,0x37,0x4B,0x88,0x37,0x31,0x8E,0x37,0x35,0xCB,0xC4,0x93,0x67,0x5F,0x2B,0x31,0xFC,0xCC,0x8E,0x33,0x37,0x8A,0x89,0x30,0xB7,0x49,0x37,0x37,0x4B,0x3C,0x38,0xB2,0x39,0x36,0xB4,0xF2,0x27,0xD5,0xC6,0xFA,0x2F,0xBF,0x61,0x37,0x62,0xF1,0x71,0x26,0x32,0xF1,0x71,0x27,0x37,0x83,0x76,0x8C,0x9D,0x62,0xFA,0x24,0x6A,0x45,0x38,0xB6,0xCC,0x62,0x9D,0x42,0x3E,0xC0,0xF6,0x36,0x37,0x43,0x34,0xC9,0x71,0x27,0x51,0x57,0xB7,0x49,0x27,0x37,0x43,0x11,0x51,0x5F,0x37,0x37,0x37,0x37,0x51,0xC8,0x41,0x3F,0x5F,0x37,0x37,0x5F,0x37,0x4B,0x5F,0x36,0x37,0x5F,0x27,0x37,0x83,0x75,0xBD,0x61,0x37,0xBC,0xC3,0xFA,0x24,0xA8,0xB4,0xF3,0x27,0xA9,0xDC,0x23,0x8F,0x36,0x35,0x8C,0x37,0x4B,0xBD,0x61,0x37,0xBD,0x41,0x36,0xBD,0x79,0x35,0xBD,0x59,0x34,0xFA,0x24,0x51,0x56,0x44,0x2B,0xC9,0x79,0x26,0x42,0x3B,0xB7,0x49,0x37,0xB7,0x38,0xB3,0xBD,0x37,0x85,0xB7,0xDC,0xB3,0x62,0x05,0xD3,0xBD,0x61,0x37,0xFA,0x24,0x6A,0xDC,0xA9,0xB6,0x09,0xC9,0x4A,0x62,0x9D,0x42,0x59,0xC8,0x41,0x37,0xDF,0xBA,0x37,0x42,0x20,0xCD,0x87,0xE6,0xD1,0x53,0xDF,0xB4,0x37,0x87,0xE8,0xD1,0x57,0xDF,0x4B,0x37,0x87,0xC8,0xD1,0x53,0xDF,0x42,0x37,0xCC,0x8F,0x37,0x8C,0xFA,0x2D,0x51,0x14,0xF7,0x42,0x0C,0x51,0xB6,0xCC,0x63,0x74,0x67,0x76,0x42,0x05,0xB6,0xCE,0x35,0x36,0x45,0x1B,0x51,0x5F,0x30,0x8C,0x37,0x37,0x51,0x5F,0x37,0x35,0x37,0x37,0x51,0x5F,0x3F,0x37,0x37,0x37,0x51,0x64,0x51,0x64,0x51,0x62,0x51,0x5F,0x37,0x37,0x37,0x37,0x51,0x5F,0x37,0x4B,0x37,0x37,0x51,0x56,0x5F,0x37,0x37,0x30,0xFA,0x2D,0x6D,0x05,0xC1,0xDD,0x37,0x4B,0x37,0x37,0xFA,0x2F,0x97,0x80,0x30,0xDC,0x3F,0x97,0x81,0x30,0xDC,0x34,0x97,0x82,0x30,0x05,0xD3,0x32,0x37,0x30,0xBC,0xC7,0x9B,0x0B,0x37,0x43,0x3E,0x8C,0x30,0x37,0x83,0x39,0xFA,0x27,0xDC,0xC5,0xC3,0xDC,0xCA,0x1C,0xFE,0xD3,0x53,0xDC,0x37,0x13,0x35,0xD7,0xCF,0x13,0x35,0xF4,0x7E,0x59,0x41,0x56,0x5B,0x5E,0x53,0x17,0x47,0x56,0x45,0x43,0x5E,0x43,0x5E,0x58,0x59,0x17,0x43,0x56,0x55,0x5B,0x52,0x37,0x72,0x45,0x45,0x58,0x45,0x17,0x5B,0x58,0x56,0x53,0x5E,0x59,0x50,0x17,0x58,0x47,0x52,0x45,0x56,0x43,0x5E,0x59,0x50,0x17,0x44,0x4E,0x44,0x43,0x52,0x5A,0x37,0x7A,0x5E,0x44,0x44,0x5E,0x59,0x50,0x17,0x58,0x47,0x52,0x45,0x56,0x43,0x5E,0x59,0x50,0x17,0x44,0x4E,0x44,0x43,0x52,0x5A,0x37,0x37,0x37,0x54,0x4C,0xAD,0x2D,0x13,0x18,0x81,0x37,0x37,0xB7,0x17,0x16,0x37,0x30,0xC9,0xC8,0xC8,0x37,0x3F,0x37,0x37,0x37,0xC7,0x48,0x30,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x62,0x9D]

for i in range(0, 512): 
     xor1 = MBR_infection[i] ^ 0x37 
     xor2 = hex(xor1)
     print(xor2, end=" ")

코드는 다음과 같이, 손상된 MBR 데이터를 리스트에 넣고 XOR 연산만 해주면 됩니다.

그럼 실행 결과는 다음과 같다.

이 값을 원본 MBR로 저장을 하고 vmdk 파일에서 MBR의 위치를 찾아야 합니다.

(단, 0x0 ~0xF는 1자리 수 이기 때문에 0을 추가 시켜줘야하는 번거로움이 있으므로 다음과 같은 사이트에서 해결하자!!)

http://tomeko.net/online_tools/xor.php?lang=en 

원본 MBR을 구했으니 VMDK 파일에서 MBR 위치를 구해야 합니다. FTK Imager로 열고 바로 나오는 데이터가 원본 데이터입니다. 

hex로 복사를 한 후 vmdk를 hxd로 열어서 검색을 해봅시다.

15,488섹터가 MBR의 위치입니다. 아까 복원된 MBR을 집어 넣어줍시다. 그리고 0x7000만큼 악성데이터로 씌워져있기 때문에 0x00으로 값을 집어 넣어줘야 합니다.

보시면 15,489 섹터부터는 또 xor 연산이 되어 있기 때문입니다.

Length를 7002로 해주시면, 한번에 영역이 잡히고 [Fill Selection] 의 기능을 사용하시면 바로 00으로 바꿀 수 있습니다.

이제 저장을 했으면, 가상머신을 실행시켜 볼까요??

정상 작동합니다~ 이렇게 Petya 랜섬웨어에 감염된 시스템을 복원을 시켜봤는데요. 최대한 잘 설명하려고 했으나 미흡한 부분이 있을 것 같아 궁금하신점이 있으시다면 댓글 남겨주시길 바랍니다!!!