지난 주말(한국시간 5.12~)부터 랜섬웨어로 인한 혼란이 전세계를 강타했다. WannaCrypt인데 별칭 워너크라이(WannaCry)로 알려진 해당 악성코드는 마치 웜 바이러스의 속성을 띄며 Windows 운영체제의 SMB 취약점 (MS17-010)을 타고 전파되었다. 사실 해당 취약점은 Microsoft가 지난 3월에 패치를 통해 보완을 하였음에도, 아직 대응되지 않은 PC가 워낙 많았던 탓에 피해가 컸다. 

사진 출처 : http://thehackernews.com/2017/05/wannacry-ransomware-windows.html
사진 출처 : http://thehackernews.com/2017/05/wannacry-ransomware-windows.html


카스퍼스키가 공개한 자료에 따르면 피해 컴퓨터 98% 가까이는 윈도7, XP는 0.1% 미만, 2008R2 약 1%였다.  (참고 : Almost all WannaCry victims were running Windows 7



하여, 워너크라이 감염 상황을 Windows 7 에서 테스트해보았다.


VMware Windows 7 이미지 : https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/ 다운로드

다운로드 한 이미지 파일은 IE8.Win7.For.Windows.VMware이다. Windows 8 호스트 컴퓨터에서 VMware® Workstation 9.0.4 build-1945795 를 사용하여 해당 이미지를 import하였다. 

구동된 윈도우 안에 WannaCrypt 실행파일을 넣었다. 해당 파일은 https://virusshare.com/ 에서 입수하였으며, 불법소지가 있으므로 여기에는 공유하지 않겠다. 필요하신분은 VirusShare.com에 가입하시길 바란다. 해당파일은 virustotal 검색결과를 보면 명백히 악성코드이며, SHA256 해시값을 이름으로 명명한 ed01ebfbc9eb5bbea545af4d01bf5f1071661840480439c6e5babe8e080e41aa 으로 저장되어 있다. 이 파일을 가상머신 안에서 실행할 예정이다.

실행하기전에 VMware의 Snapshot 기능을 사용하여 복원지점을 만든다. 그러면 해당 폴더에 다수의 파일이 생성되는데, 그중 vmem확장자를 가진 파일은 게스트 운영체제에 대한 실질적인 가상 페이징 파일(Virtual Paging File)을 담고 있다. (출처: http://lastcard.tistory.com/72 [月光愛靑狼]) 이 파일을 별도로 복사하여 저장해두었다가 추후 메모리 포렌식에 활용하자. 현재 랜섬웨어에 감염되기 전의 상황을 before.vmem으로 저장하였다.

과감히 VMware 내부에서 워너크라이를 실행시켜보았다. 뉴스에서 많이보던(?)화면이 나온다.ㅋㅋ

폴더 안에 들어가보면 원래 존재하던 파일명 뒤에 WNCRY 확장자가 추가되어 있다. 암호화되어 사용할 수 없는 상태가 된 것이다.

그리고 @Please_Read_Me@라는 텍스트 파일에는 나름 친절하게 아래와 같은 설명을 보여준다. 당신의 파일을 암호화해버렸으니, 사용하고 싶으면 $300(한화 336,900.00 원)을 비트코인 가상화폐 계좌(12t9YDPgwueZ9NyMgw519p7AA8isjr6SMw)으로 송금하라는 것이다.  

Q:  What's wrong with my files?
A:  Ooops, your important files are encrypted. It means you will not be able to access them anymore until they are decrypted.
If you follow our instructions, we guarantee that you can decrypt all your files quickly and safely!
Let's start decrypting!

Q:  What do I do?
A:  First, you need to pay service fees for the decryption.
Please send $300 worth of bitcoin to this bitcoin address: 12t9YDPgwueZ9NyMgw519p7AA8isjr6SMw
Next, please find an application file named "@WanaDecryptor@.exe". It is the decrypt software.
Run and follow the instructions! (You may need to disable your antivirus for a while.)

Q:  How can I trust?
A:  Don't worry about decryption.
We will decrypt your files surely because nobody will trust us if we cheat users.

*   If you need our assistance, send a message by clicking <Contact Us> on the decryptor window.


이제 본격적으로 메모리 포렌식을 통한 복원 작업에 착수해보자. 참고로,  며칠전 워너크라이 랜섬웨어 복호화 툴이 개발되어 공개되었다고 한다. (참고 : https://www.clien.net/service/board/news/10766345 관련한 Github 주소는 다음과 같다. https://github.com/gentilkiwi/wanakiwi)

그러나 안타깝게도 직접 실험해본 결과,  메모리 내부에서 비밀키(private key)를 발견할 수 없다는 오류와 함께 정상작동하지 않는 것을 확인하였다. 성공확률이 좀 낮다는 말은 있었으나 연구회의 다른 분도 실험해보신 결과 단 한번도 성공하지 못했다는 의견을 주셨다. 그리하여 해당 도구에 대한 미련을 버리고, 직접 메모리 포렌식을 해보기로 했다.

랜섬웨어는 보통 빠른 작업을 위해 먼저 대칭키로 파일을 암호화하고, 그 대칭키를 감추기 위해 RSA 방식으로 하이브리드 처리를 한다. 이때 사용되는 RSA 비밀키가 핵심인데, 보통 수학이론에서 매우 큰 도 소수(prime number)의 소인수분해가 어렵다는 점에 착안하여 소수를 2개 생성한 후 각각을 비밀키와 공개키로 사용한다. 


암호화가 진행될 때 워너크라이가 저장된 폴더에 다음과 같은 파일이 생성된다 (00000000.pky) 이것이 아마 RSA 암호화시 사용되는 공개키 암호 파일일 것이다.

이것은 00000000.eky 파일인데 이 파일 자체가 RSA로 암호화된 상태인 것 같고 개인키(private key)로 복호화하면 내용이 확인 가능 할 것 같다. 그리고 그것이 바로 AES 암호화에 사용되는 대칭키인 것으로 추정된다. 

워너크라이가 비밀키로 활용하기 위해 생성한 소수를 메모리상에서 제대로 초기화를 시키지 않않을 경우, 그렇다면 그 값이 메모리에 남아있어서 복원시킬 수도 있다. 아까전에 vmem 파일을 복사했던 것 처럼 이번에는 감염 후의 상황에서 VM을 일시정지(suspend) 시킨 후 vmem 파일을 추출하여 after.vmem으로 저장하자.

Suspend 상태
Suspend 상태

vmem 파일을 볼라틸리티 및 VolUtility로 분석을 해보았다. 윈도우 탐색기(explorer.exe)의 하위 프로세스로 파일명(ed01ebfbc9eb5bbea545af4d01bf5f1071661840480439c6e5babe8e080e41aa.exe)가 실행되었음을 확인할 수 있다. 또 그 하위에는 @WanaDecryptor 라는 프로세스가 PID 564로 fork 되어있다.

VolUtility로 확인한 프로세스 계층구조 시각화
VolUtility로 확인한 프로세스 계층구조 시각화

해당 프로세스들(PID = 4064, PID = 564)을 덤프해보자.

덤프 안의 내용은 사람이 쉽사리 읽을 수가 없다. 내가 찾고 싶은것은 메모리 덤프 안에 암호화와 관련된 키워드들이 포함되어 있는지가 궁금한 것이다. yara를 써서 스캐닝을 해보자. 다행히 yara rules github에는 다양한 종류의 rule 파일들이 제공되고 있다. https://github.com/Yara-Rules/rules/blob/master/Crypto/crypto_signatures.yar 파일을 다운로드하였다. yara 명령어를 사용해서 해당 룰 파일을 적용한 후 4064와 564 프로세스의 덤프를 스캔하였다.

보면 해쉬함수로 추정되는 값, 큰 정수, RijnDael_AES 암호화 키로 추정되는 키, 난수 등이 추출된다. 이것을 잘 정리해보면.. 

대충 이런 데이터셋이 될텐데.. 이 중에서 실제로 RSA Public Key와 쌍을 이루는 Private Key가 있을지 없을지 여부가 불확실하다. 어쩌면 굳이 RSA를 안 풀어도 AES KEY로 판별된 것 중에 파일을 암호화하는데 쓰인 Secret Key가 있을지도 모르겠다. 이쯤하면 노가다로 저 키들을 다 대조해보는 방법밖에 없을듯한데.. 이 이상은 내공도 딸리고 아직 여유가 없어서 ㅠㅠㅠ 추후에 시간나면 다시 이어서 해보아야 겠다. 

CPUU님의 창작활동을 응원하고 싶으세요?