리눅스에서 랜섬웨어는 무슨 차이가 있을까

malwares.com 코드분석팀 분석 자료


<부제 :  랜섬웨어 >


1. 개요 - 


2017년 2월, 리눅스를 타겟으로한 랜섬웨어가 발견되었다. 이 랜섬웨어는 2015년 우크라이나의 국가 인프라를 공격하는데 사용되었던 KillDisk의 변종인것으로 알려졌다. 랜섬웨어에 감염 될 경우 $250K(약 3억)을 요구한다. 그러나 해외 기사에 따르면 키를 서버로 전송하거나 저장하지 않으므로, 복구 비용을 지불하더라도 복구를 할 수 없고, 취약점이 존재해 복구가 가능하지만 이 또한 어렵다고 한다. 분석을 통해서 자세히 알아보자.


2. 분석 정보 


< Figure0. 감염 타겟 경로 >


리눅스의 모든 디렉토리를 crypto_lock함수의 인자로 호출해 암호화를 시도한다. 감염 후 시간이 흐른 뒤, 명령어도 암호화되어 시스템 명령을 실행할 수 없다. 



< Figure1. 암호화 코드 >


랜섬웨어는 키를 만들고, 키를 이용하여 암호화를 진행한 뒤, 서버로 키를 전송하는게 일반적이다.  분석하고 있는 샘플에서도 gen_key에서 키를 생성하여 crypt_all에서 암호화를 진행한다. 파일 크기에 따라 같은 암호화를 여러번 진행한다.



< Figure2. 암호화 키 생성 >


현재시간으로 seed값을 설정해준 뒤, 랜덤함수를 이용하여 키를 8자리씩 3번 생성한다. 키를 알고있다면, 해커의 도움 없이도 파일을 복구할 수 있게되는데 위의 코드에는 취약점이 존재해 키를 유추할 수 있다.



< Figure3. 암호화 코드 >


생성한 암호화 키 3개로 DES(ECB)로 암호화를 진행한다. 이전에 블로그에서 포스팅 했던 "Marlboro 랜섬웨어" 본문에서 ECB 모드에 대해 이렇게 밝혔다.  "암호화에는 대표적으로 ECB,CBC가 있는데 ECB는 암호문이더라도 하나의 블록이 분석이 된다면, 전체를 파악할 수 있어 큰 단위에 부적합하다."

 

malwares.com : (2017.01.12) Marlboro 랜섬웨어



< Figure4. 리눅스 랜섬웨어 감염 화면 >


암호화가 모두 완료되면 시스템이 강제적으로 재시작되며, 복구를 위해서 222BTC(한화 약 3억원)을 요구하는 화면이 나타나 다른 작업을 할 수가 없다. 그런데 서버로 키를 전송하는 루틴은 없었다. 결국에는 해커도 피해자의 키를 알 수 없으므로 해커가 요구하는 비트코인을 전송해도 복구해줄 가능성이 매우 낮다.



< Figure5. 고정된 srand 사용 >


일반적으로 랜덤한 값을 사용하고자 할 경우, SEED를 설정하고 rand를 사용한다. 하지만 SEED를 같은 값을 설정하고 rand를 호출할 경우, 같은 값을 받을 수 있다. 이렇게 되면 랜덤의 의미를 잃게되는데 분석하고 있는 랜섬웨어에서는 3번의 키생성에서 각각 현재시간으로 생성하지만 3번의 키를 생성하는동안 1초도 흐르지 않을 가능성이 매우 높다. 그러므로 3번의 키생성은 같은 키를 만드므로 취약하다.


< Figure6. 고정된 srand 사용 문제점 >


계속 실행해도 같은 결과임을 통해 고정된 SEED 사용으로 키 생성에 문제가 있음을 증명할 수 있다.


< Figure7. 동적디버깅으로 확인한 키 값 >


생성된 Key1,Key2,Key3를 값은 같았다. Key1은 다른 연산을 통해 변화가 이루어진다.


< Figure8. SEED 값 검색 >


디버깅한 결과와 같은 키값을 만들어내는 TIME값을 브루트포싱으로 찾아냈다. 감염된 날짜를 알고있다면, 몇초면 찾을 수 있을 정도로 속도가 빠르다.



< Figure9. 복구 연산  >


찾아낸 TIME값을 이용해 암호화 연산을 반대로 진행하는 코드를 작성해 복구를 시도해기로 했다.



< Figure10. 암호화 파일 >


  • 파일:12345678 [내용을 알고있다고 가정]
    ->(HEX)0358a774a3c29b790a
  • 파일:Secret
    ->(HEX)8d796e154a6f1da591a760c87deb2f306e0c91aaa82f77d0


복구를 시도해보기 위해서 랜섬웨어에 감염되기전 파일을 두개 생성했다. 하나의 파일을 8자리는 알고있다고 가정했다. 실행파일의 헤더부분이라도 8자리만 맞으면 TIME값을 예상할 수 있어, 크게 불가능한 가정은 아니다.  ECB모드이므로 평문과 암호문의 길이에 영향이 없다는점도 이용할 수 있는 취약한 벡터다. 



< Figure11. 파일 "12345678" 암호문 >


복구된 파일의 내용이 12345678이라는 내용을 담고있는 SEED값을 무차별대입해 "1489399667" 라는 값을 구했다.


< Figure12. 파일 "Secret" 암호문 >


위에서 얻은 SEED값을 가지고 Secret파일을 그대로 복구를 시도했더니  "Linux KillDisk Decrypt!" 문자열을 얻을 수 있었다. 시스템에 따라서 몇초의 시간적 오차가 있을 수 있으나,  어렵다던 해외 기사와는 다르게 감염 시점의 시간과 파일내용의 8글자만 알 수 있다면,  충분히 모두 복구가 가능했다.




3. 파일 정보 


MD5    : B9748EC5A7A0E3BC3CA139083CA875B0

SHA-1  : 8F43BDF6C2F926C160A65CBCDD4C4738A3745C0C

SHA-256: 8A04F8481F1EF57F66B974802919E936C59A32D1CD9EF83186E6911B9AE773B0

이 글을 공유하기

댓글

Designed by JB FACTORY