상세 컨텐츠

본문 제목

Darkside 랜섬웨어: 미국 파이프라인 마비 시킨 악성코드 Part 1

악성코드 Malware/랜섬웨어

by 0xmh 2022. 11. 1. 13:42

본문

728x90

2021년 5 월조쯤에 Colonial Pipeline이라는 기업이 랜섬웨어 악성코드 공격의 피해자 되었는데, 이 기업은 미국의 East Coast 연료 공급 50%를 담당합니다. 상황이 심각해지며 미국 18개의 주에서 비상상태 선포되었습니다.

 

과연 이 랜섬웨어가 무엇을 하는 악성코드인지, 무슨 기능을 갖고 있는 것인지에 대해 알아보겠습니다! 지금까지 이 블로그에서 분석해왔던 악성코드들 중에 가장 어려운 것이라서 두 파트로 나누겠습니다! 

 

샘플은 MalwareBazaar에서 다운로드 가능합니다.

https://bazaar.abuse.ch/sample/151fbd6c299e734f7853497bd083abfa29f8c186a9db31dbe330ace2d35660d5/

 

 

PE Studio를 확인하자마자 유용한 스트링이 별로 없고, 암호화되어 있는 스트링밖에 보이지 않습니다. 그러나 위에 "GetProcAddress"가 나오는 것을 보니 다크사이드도 다른 악성코드처럼 API 함수들을 dynamic한 방식으로 가져오고, 암호화되어 있는 스트링들도 dynamic으로 해독하고 메모리 안에 어딘가 저장해둘 것 같습니다.

1. PE Studio Strings

악성코드가 실행되자마자 버퍼가 생성되는데 이 버퍼를 활용하면서 위와 말했던 바와 같이 API 함수와 스트링들을 decrpyt 할 것입니다.

총 4개의 dword를 버퍼에 넣고, 모든 dword에서 0x10101010를 뺍니다.

2. Buffer 생성

버프를 생성하고 나서 다크사이드가 쓰는 encryption 그렇게 복잡하지는 않고 간단한 XOR입니다. XOR를 실행시키기 전에 byte swapping이 있다는 것도 보입니다.

3. XOR

다음 사진은 왼쪽에 암호화되어 있는 데이터가 보이고 오른쪽은 해독될 DLL들입니다. LoadLibrary라는 API 함수 도움으로 DLL들이 로딩되고 메모리에 잠깐 저장되고 sub_D13DA 함수는 저장된 스트링들을 메모리에서 다시 삭제합니다.

일반 파이썬 혹은 아이다 파이썬 스크립트를 써서 decryption과정을 automation이 가능한데 저는 x64dbg를 쓰면서 동적 분석 방법을 선택했습니다.

4. Example Decryption

보다시피 해독된 API 함수를 esi에 저장되어 있고 GetProcAddress이라는 API로 필요한 함수를 불러올 수 있습니다.

5. API Import

위의 x64dbg 아이다로 보자면 다음과 같이 생겼습니다

6. API Import IDA

x64dbg로 4번 사진의 코드 하나씩 실행시키고 Scylla로 import된 DLL와 그것의 API들을 확인해 보려면...

7. Sycalla DLL API

위에 분석했던 decryption을 또 쓰는데 APlib decompression 알고리즘도 활용됩니다. 이 부분도 역시 파이썬으로 decrypt할 수 있지만 이번에도 x64db로...

Darkside의 config에 랜섬웨어 노트만 저장되어 있는 것이 아니라 아래 보면 다크사이드에게 있는 다른 기능에 대해서도 알 수 있습니다.

8. Config

맨 앞에 피해자의 아이디가 보이고 그 뒤에는 랜섬웨어가 암호화시키지 않을(!) 다이랙토리가 보입니다. 그중에 하나는 tor browser가 하나인데 만약에 tor까지 암호화시키면 협상 과정이 불가능해지기 때문에 아래와 같은 다이랙토리들 다 무시합니다.

9. Avoid Encrpytion

다이랙토리만 넘어가는 것이 아니고 다크사이드는 아래의 파일도 넘어갑니다.

10. File Avoid

악성코드가 넘어갈 파일 익스텐션까지

11. Extension Avoid

다크사이드는 프로세스를 죽일 수 있는 기회도 가지고 있는데 아래 프로세스들은 종료시키지 않습니다.

12. Process Avoid

악성코드가 종료시킬 프로세스들

13. KIll Process

악성코드가 종료 시킬 서비스들

14. Kill Service

이 샘플의 C2 서버:

securebestapp20[.]com, temisleyes[.]com

15. C2

랜섬웨어 첫 번째 노트

16. Ransomware String 1

랜섬웨어 두 번째 노트

17. Ransomware String 2

DLL, strings, config 등 이제 다 분석했으니 드디어 악성코드의 기능을 더 정확하게 분석할 수 있습니다.

fs:30h로 instruction으로 Process Environment Block를 불러오고 현재 작동 중인 윈도우 버전을 확인합니다.

18. Windows Version

DarkSide는 IsUserAnAdmin를 불러오는 것으로 악성코드를 실행시킨 유저가 Admin인지를 확인하고 Admin이 아닌 경우에는 권한상승을 시도합니다.

19. Admin Check

권한상승에 들어가기 전에 위에서 분석했던 버퍼하고 스트링 해독의 중요성을 잠깐 보여드리도록 하겠습니다.

API 함수가 하나도 보이지 않고 다 dword로 나오네요. 3번 사진에서 해독된 API들을 다 dword에 저장되어 있고 필요할 때 악성코드가 이 dword들을 불러올 것입니다. 아래의 사진을 좀 정리하면 그 결과는...

20. PrivEsc before

결과는 다음과 같습니다. 이번에도 x64dbg를 사용하면서 IDA의 dword들을 천천히 주석을 달고, ApplyCalleType이라는 plugin으로 본함수를 복구했습니다.

OpenProcessToken이라는 API로 악성코드가 현재 실행 중인 프로세스의 토켄을 열고 GetTokenInformation으로 그 토켄에 대한 정보를 불러오려고 합니다.

악성코드가 프로세스의 SID에 대한 정보를 가져오려고 하는데 유저는 Admin이 아닌 경우에는 그 유저의 Token에게 "BUILTIN\ADMINISTRATORS"하고 "SECURITY_BUILTIN_DOMAIN_RID"가 있는지를 확인합니다.

21. PrivEsc After

CoInitialize로 악성코드는 COM object를 초기화하고, mw_CoGetOBject_0이라는 함수 안에서 UAC bypass를 시도합니다.

22. Relaunch with Sys Priv

v4하고 v2에 저장되어 있는 "Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}" parameter로 CoGetObject를 불러오고 UAC bypass를 시도합니다. 다양한 UAC bypass가 있기는 있는데 위의 parameter를 검색해보니 이 UAC bypass는 ICMLuaUtil를 활용하나 봐요. (COM Object에 대해 잘 모르는데 아시는 분이 계시면 설명 부탁드립니다)

https://gist.github.com/api0cradle/d4aaef39db0d845627d819b2b6b30512

23. CoGetObject

그나저나 COM Object의 도움으로 악성코드는 자기 자신을 재실행하는 것 같습니다

24. CoGetObject Relaunch

21번 사진하고 비슷하게 여기서도 프로세스를 열어 GetTokenInformation으로 토켄 정보를 불러오는데 여기서는 토켄의 SE_PRIVILEGE_ENABLED으로 프로세스의 권한을 바꾸려고 합니다.

25. SE_PRIVILEG_ENABLED

권한상승 시도가 하나 더 있네요. 또다시 GetTokenInformation을 쓰는데 이번에는 다른 API가 보이는데 그 함수는 LookupAccountSidW입니다. GetTokenInformation으로 유저의 SID를 불러오고 LookupAccountSidW로는 유저가 SYSTEM (권한 가장 높은) 유저인지를 확인합니다. 그것을 확인하기 위하여 NT Authority (영어), AUTORITE NT (불어), NT Autoritaet (독일어)라는 스트링들을 해독합니다.

26. LookupAccountSID

유저에게 NT AUTHORITY 토켄이 있으면 WTSGetActiveConsoleSessionId하고 WTSQueryUserToken으로 그 토켄을 저장해놓고 나중에 피해자의 파일들을 암호화시킬 때 토켄을 다시 씁니다.

27. Get Token

Registry의 Software\Microsoft\Cryptography key를 열어 MachineGUID (globally unique identifier)를 불러오는데 CRC32 checksum도 씁니다.

28. GUID

그리고 역시 :) 피해자의 시스템의 언어가 러시어라면 악성코드가 작동하지 않나봐요.

29. Russian Language

Log 파일하고 readme파일이 생성되는데, Readme 파일은 위에서 x64dbg로 dump했던 랜섬웨어 노트가 들어갈 것 같습니다.

30. Log,Readme.txt
31. CreateFile

분석의 첫 번째 파트는 여기까지 하겠습니다.

다크사이드의 String, DLL, API decryption에 대해 알아봤고, 다크사이드가 자기 권한을 어떻게 상승시키는지에 대해도 알아봤습니다.

 

다음 파트는 다크사이드의 Encryption에 대해 알아보도록 하겠습니다.

관련글 더보기