상세 컨텐츠

본문 제목

랜섬웨어로 암호화 된 파일을 어떻게 복구하는가?

전문가 기고

by 알약(Alyac) 2015. 8. 7. 17:14

본문

랜섬웨어로 암호화 된 파일을 어떻게 복구하는가?

How We Foiled Ransomware and Got the Files Back


RSA 컨퍼런스 블로그에 랜섬웨어 파일 복구 방법이 소개되어 내용을 간략히 정리하여 공유합니다.


2013년 초, 한 조직이 그들의 서버가 ACCDFISA 랜섬웨어에 감염되어 서버에 있는 모든 파일들이 암호화 되었다며 복구팀에게 복구를 요청해 왔습니다. 


이 랜섬웨어는 각 파일들을 WinRAR self-extractor를 이용하여 암호화된 자동실행압축 파일로 변경하였고 파일명은 암호를 풀 수 있는 단서(예를 들어 압축을 풀기 위해서는 ~@~로 이메일을 보내시오)로 변경하였습니다. 해당 랜섬웨어는 256bit의 랜덤키를 사용하는 AES-256암호화 기법을 사용하였고, 암호화 되지 않은 원본 파일들은 모두 삭제하였습니다. 또한 복구를 방해하기 위하여 파일에 패스워드를 걸었다고 주장하였습니다.  



패스워드 생성기 찾기


감염된 서버 드라이브 복사본을 조사결과 몇몇 이상한 문서들이 발견되었고, 악성프로세스와 몇몇 이상한 문서들과는 어떠한 상관관계가 있을 것이라고 추측하였습니다. 그 중 영구적으로 파일을 삭제하는 MS Sysinternal의 “NoSafeMode”라이브러리, self-extractor을 만드는 RAR 유틸리티도 발견되었습니다.  


랜섬웨어를 리버스 엔지니어링 하기로 하였고, 그 시작점은 RAR 유틸리티로 잡았습니다. 이 유틸리키는 암호화 키 패스워드를 커맨드라인 함수로 받아들였기 때문에, 이 유틸리티를 실행하는 랜섬웨어 코드를 역추적 한다면 패스워드 생성기를 찾을 수 있을 것이라고 추측하였기 때문입니다.




테스트 시스템에서 랜섬웨어를 실행시켰고, RAR 유틸리티를 실행하는 CreateProcess 함수 호출을 가로채기 위해 디버거를 연결하였습니다. 이후 CreateProcess 를 호출하는 svchost.exe로 위장한 랜섬웨어를 찾을 수 있었습니다. 이 방법을 통하여, 랜섬웨어가 실행한 각각의 커맨드 및 파일을 암호화하는데 사용 된 패스워드를 확인할 수 있었습니다. 


인터셉트한 패스워드는 aesT322B2XgM(mC0...로 총 57개의 문자열로 구성되어 있었으며, 대문자,소문자, 숫자, 점 들이 랜덤으로 배열되어 있었습니다. 패스워드가 aes로 시작한 것은 우연이거나 혹은 prefix로 의도된 것이라고 추측하였습니다. 만약 prefix라면, 이 문자열을 랜섬웨어 코드 어딘가에서 찾을 수 있을 것이며, 랜섬웨어 디스어셈블을 통하여 aes라는 문자열 뿐만 아니라, aesT322문자열도 발견하였습니다. 이를 통하여 비밀번호는 aesT322로 시작하며, 이 후의 50글자는 랜섬 문자열일 것이라는 것을 추측할 수 있습니다.



우리는 리버스 엔지니어링을 통하여 랜섬웨어 실행 과정에서 글로벌 변수에 어떤 값이 할당되는지 확인하였으며, aesT322 prefox 문자열을 가리키는 글로벌 변수, 50자의 랜덤 문자를 받는 글로벌 변수 및 57자의 패스워드 전체를 받는 글로벌 변수를 찾아낼 수 있었습니다. 



생성기 동작방식 알아내기



이 프로그램의 변수 3개의 모든 경우를 추적한 끝에, 소문자 26자, 대문자 26자, 숫자 10자, 구두점 기호 10개의 총 78개 문자에서 랜덤한 문자 50자가 선택되는 사실을 확인하였습니다. 컴퓨터는 랜덤한 숫자 역시 일정한 알고리즘을 기반으로 만들어 내며, 이 암호화 알고리즘을 깨기 위하여 난수생성기 (pseudo-random number generator(PRNG)를 공격하기로 하였습니다. 


PRNG가 이 코드를 실행할 때 사용하는 쓰레드의 식별자 및 시스템의 작동시간에 대한 수치를 밀리세컨드(1000분의 1초)로 환산한 데서 얻은 32비트의 숫자로 초기화 되거나 시드(seed)로 삼는다는 것을 발견하였습니다. 이는 예측 가능한 값으로, 32비트 시드를 통하여 78글자로 만들 수 있는조합은 총 40억개라는 것을 알 수 있었습니다.컴퓨터는 난수를 만들어 낼 때에도 일정한 규칙에 따라 동작하기 때문에, PRNG는 동일한 시드값이 주어졌을 때에는 언제나 동일한 값을 동일한 배열로 생산해 내기 때문입니다.



패스워드 추측


40억개의 패스워드 리스트는 결코 적은 것이 아닙니다. 하지만 우리는 시드가 4의 배수이며, 보통 10,000보다 적은 쓰레드 ID를 갖고 있으며 시스템 작동시간을 기반으로 한다는 사실을 알고 있었습니다. 최대한 난수의 범위를 좁히기 위하여, 감염 전 서버가 얼마나 오랫동안 가동되었는지 시간을 알아야 했지만, 시스템을 검사하던 도중 그보다 더 좋은 정보를 발견하였습니다.



감염 시스템을 검사하던 중 ProgramData 디렉토리 아래의 stppthmainfv.dll이라는 파일을 발견했는데, 해당 파일 안에는 총 21줄의 8자리 랜덤 문자들이 있었습니다. 우리는 모든 가능한 시드값을 부루트포싱(BruteForce)하여 PRNG가 어떤값을 이용하여 이 21줄의 문자를 생성했는지 알아보기로 하였습니다. 왜냐하면, 이 문자들은 32비트 밖에 되지 않았기 때문에, 이를 검색해 내는 데에는 단 몇 시간 밖에 소요되지 않기 때문입니다. 


싱글 CPU 코어에서 4초안에 31,956,209개의 리스트를 검사하였으며, stppthmainfv.dll의 패스워드들과 동일한 순서로 생성한 시드 값을 31,956,208개 찾아내었습니다. 우리는 시드 값을 테스트 하기 위해 대략 12MB의 패스워드 리스트를 생성하였습니다. 이 리스트를 가지고 RAR 유틸리티에 각각의 패스워드를 테스트하는 배치 프로세스를 밤새 돌려놓았습니다. 


아침에 확인해 보니, 해당 프로세스는 이미 완료되어 있었으며, 매칭되는 하나의 패스워드가 스크린에 떠 있었습니다. 즉, 성공적으로 랜섬웨어 악성코드로 암호화 된 파일을 복호화 한 것입니다. 





참고 :

http://www.rsaconference.com/blogs/how-we-foiled-ransomware-and-got-the-files-back






관련글 더보기

댓글 영역