해결책
부활절에 장인을 방문했을 때, leo-stone은 Petya 랜섬웨어로 곤경에 빠진 한 가정을 발견했다. 누군가 구직 중이어서 집주인이 이력서를 꼭 읽어야 했기에 관리자 비밀번호를 입력했는데, 파일 대신 Petya의 붉은 해골이 나타났다. 이는 디스크의 마스터 파일 테이블이 암호화되었다는 표시였다. 제시된 탈출구는 키를 사는 것이었다. 작성자는 대안을 명확히 표현했다. "몸값을 지불하는 건 그렇게 큰 도전이 아니다"; 도전은 돈을 내지 않고 잠금을 깨는 것이었다.
leo-stone은 암호를 정면으로 공격하는 대신, Petya 자체가 입력된 키를 검사하는 방식을 겨냥했다. 그는 검증 해시를 재구현하고 핵심을 공개했다. 32비트가 아닌 16비트 워드에 대한 Salsa이며, 20라운드(Salsa20)가 아닌 10라운드(Salsa10)를 실행한다. 테스트 데이터는 피해자의 디스크에 남아 있다. 섹터 54의 8바이트 논스와 섹터 55의 512바이트 암호화된 검증 섹터다. 그의 Go 프로그램은 그 512바이트를 읽고, 해당 워드들을 0x37로 XOR하여 해시의 목표 출력을 복구하고, 논스를 읽은 뒤, 문제에 유전 알고리즘 솔버를 투입한다.
솔버는 몇 초 만에 키를 찾았다. 그의 경우 10~30초였으며, 그는 이를 간단한 지침과 함께 오픈소스 hack-petya 저장소로 공개했다. 암호화된 디스크에서 논스와 검증 섹터를 추출하여 nonce.txt와 src.txt로 저장하고, 프로그램을 실행하고, 기다린 뒤, 키를 사용하되 이상적으로는 VM의 디스크 이미지에서 사용하라는 것이다. 그는 지저분한 코드에 대해 사과했고("좀 급했거든요"), Go 1.6에서 동시 맵 읽기로 패닉이 발생한 후 유전 라이브러리를 패치했다. 이 공개는 2016년 4월 11일 Hacker News에서 451점과 79개의 댓글을 받았다. 저장소는 612개의 별과 80개의 포크를 보여준다.
달성한 것
Petya의 키 검사를 재구현한 뒤 유전 알고리즘 솔버가 키를 찾게 하라 — 몸값은 지불하지 않는다
그는 암호가 아닌 키 검사를 공격했다. 검증 섹터가 피해자 자신의 디스크에 있어, Petya의 설계가 누구나 재구현할 수 있는 테스트 가능한 오라클이 되었다
유전 알고리즘 솔버가 탐색을 빠르게 했다. 후보 키들이 재구현된 해시에 대해 진화하여 올바른 키가 10~30초 만에 나왔고, 무차별 대입처럼 기다릴 필요가 없었다
수정 도구는 정확한 복구 단계와 함께 무료로 배포되어, 다른 피해자들이 돈을 내지 않고 디스크를 어디로도 보내지 않고 복호화할 수 있었다
GitHub와 Hacker News에 공개한 것이 도구의 도달 범위를 넓혔다. 공개 당시 451점과 79개의 댓글을 받았고, 저장소는 여전히 612개의 별과 80개의 포크를 보여준다
자신의 키를 검증해야 하는 잠금장치는 피해자 측에 오라클을 남긴다. 돈을 내는 대신 검사를 재구현하고 그것에 대해 탐색하라. 그런 다음 도구를 무료로 배포하여 수정이 퍼지게 하라.
그 후
leo-stone은 자신의 키를 10~30초 만에 복구하고 도구를 공개적으로 배포했다. 2016년 4월 11일 Hacker News 공개는 451점과 79개의 댓글을 받았고, 보관된 저장소는 612개의 별, 80개의 포크, 34명의 워처를 보여준다. 이 페이지는 이후 Petya 변종에 대한 어떤 주장도 기록하지 않는다. 남은 것은 재사용 가능한 패턴이다. 디스크상의 검증 데이터를 추출하고, 검사를 재구현하고, 탐색이 키를 찾게 하라.
근거 확인하기
출처
- leo-stone/hack-petya — search key to restore petya encrypted mft GitHub · github.com
- Hack-petya mission accomplished — Petya ransomware decryptor (Hacker News discussion) Hacker News · news.ycombinator.com ·