원본
EXECUTIVE SUMMARY
지난 일년동안 탈로스는 소중한 시간을 랜섬웨어의 작동원리와 다른 멀웨어와의 관계 그리고 경제적인 충격에 대해 이해하기위해 노력했습니 다. 이번 연구는 우리가 지원하는 제품들에 더 나은 탐지 방법을 개발하고 공격자들의 행위를 방해하기 떄문에 탈로스에게 더욱 값진 것이란것을 증명했습니다. CrytoWall은 랜섬웨어의 한 종류로서 작년 한해동안 CryptoWall 2와 Cryptowall 3를 거쳐 점차 진화해왔습니다. 크립토월의 배포를 막으려는 전세계의 노력에도 불구하고 적들은 계속 진화하고 기능을 업그레이드하며 크립토월4를 배포했습니다. 탈로스가 가장 효과적인 탐지를 할수 있단 걸 보여주기 위해 탈로스 크립토월4의 실행방식과 행위를 이해하고, 예전버전의 deltas(뭐지), 연 구와 조사결과를 커뮤니티에 공유하기 위해 크립토월4를 리버싱 했습니다.
익숙치 않은 독자들을 위하여 설명하자면 랜섬웨어는 피해자의 파일(사진, 문서, 음악)을 담보로 컨텐츠를 암호화하여 피해자들에게 복호화 를 위해 돈을 내게 유도하는 멀웨어 입니다. 일반적으로 피해자들은 이메일 피싱과 익스플로잇 킷에 의해 랜섬웨어에 노출되어 있습니다. 크립토월4의 핵심 기능은 피해자들의 파일을 암호화하고 몸값으로 돈을 요구하는 것입니다. 그러나 탈로스는 크립토월4가 예전버전으로 부터 바뀐 점 몇가지에 대해 관찰하였습니다. 예를 들어 피해자의 파일을 암호화하고 몸값 요구를 위해 몇가지 암호화 알고리즘을 사용하고있다는 점 또한 크립토월4는 외부의 백업파일이 없다면 거의 복구가 불가능하게 윈도우의 모든 자동백업 기능을 종료시키거나 삭제시키는 기능을 포함하고 있습니다. 마지막으로 크립토월4는 호스트의 로컬 언어 세팅을 찾아주는, 예전에는 사용되지 않던 문서화되지 않은 API를 사용하고 있습니다. 이것들은 탈로스가 찾아낸 몇가지 조사결과로서 앞으로 포스팅에서 자세히 다룰것입니다.
기술적으로 이해하고 있는 유저들을 위해 우리는 계속 이글을 읽기를 독려합니다. 늘 그랬듯이 우린 사용자들과 단체들에게 보안연습(security practices)을 따르거나 리스크 감소를 위해 여러 계층에서 탐지를 도입하길 추천합니다. 최신 크립토월4의 깊이 있는 분석은 사용자들의 정보를 보호할수 있는 더 좋은 기회와 더 나은 탐지 메소드를 증명 할 수 있게 해주었습니 다. 마지막으로 최근 FBI는 대안이 없다면 몸값(여기서는 랜섬웨어 해제를 위해 결제)을 지불하라고 공지했지만 탈로스는 여러분이 몸값을 지불하는 것은 악성코드가 더 활동적으로 움직이는 것을 도와주는 것입니다. .
크립토월4의 뒤에 숨은 적은 피싱과 drive-by-download 캠페인을 이용해 피해자들에게 멀웨어를 배포시켰습니다. CryptoWall 4가 성공적으로 실행될겨우, dropper는 RSA 공개암호화 키를 명령 및 지휘서버(command and control (C2))로부터 다운 받습니다. 모든 파일을 임시AES암호화 키로 암호화 됩니다. 그후에 다운받은 RSA 공개키로 암호화를 한후 암호화된 파일안에 보관합니다. 그리곤 3가지 포맷으로 메시지를 보여줍니다. 첫번째는 텍스트 파일입니다. 두번째는 이미지(.png format) 그리고 세번째는 HTML문서입니다. 모든 것은 사진 A.1처 피해자의 데스크탑에 자동으로 보여줍니다. Figure A.2 to A.5는 HTML문서 입니다. .
![]() |
Figure A.1 |
![]() |
Figure A.2 |
![]() |
Figure A.3 |
![]() |
Figure A.4 |
![]() |
Figure A.5 |
CryptoWall 4의 흥미로운 점은 RSA암호화 키를 C2서버로부터 다운받지 못할 경우 공개키를 다운받을려는 루프를 계속 시도한다는 점입니다. 키를 얻지못하는 이상 CryptoWall 4는 피해자의 컴퓨터를 공격하지 않을것입니다. 탈로스는 또한 이 샘플은 부가적인 안전검사를 한다는 것을 알아냈습니다. 예를 들어 언어지원을 하지 않는 컴퓨터의 경우 감염 프로세스를 중지시킨다는 점입니다. 다음은 지원되지 않는 언어의 리스트입니다.
Russian, Kazakh, Ukrainian, Uzbek, Belarusian, Azeri, Armenian, Kyrgyz, Georgian.
이것은 적들이 특정지역을 감염에서 제외키려 한다는 것을 분명히 알 수 있습니다. .
기술적인 감염 프로세스는 FigureB에 있습니다.
![]() |
Figure B |
모든 기능은 위 다이어그램의 CryptoWall 4의 코드가 svchost프로세스에 삽입된후 쉐도우 복사본삭제쉐도우 복사본 삭제 - 역자 첨부를 하면서 시작됩니다. 만약 사용자가 관리자 계정이라면 프로세스에 악성코드를 삽입하여 해당 장치에 대한 접근권한을 상승시킵니다. 이것은 사용자의 허가없이 모든 쉐도우 복사본을 삭제시키는것을 가능케 합니다.
네트워크 통신은 사진 FigureC에 있습니다. 네트워크 통신은 HTTP를 이용하여 이루어지지만 암호화된 payload로 통신합니다. 사진 Figure D 와 Figure E를 보십시오.
![]() |
Figure C |
![]() |
Figure D |
![]() |
Figure E |
CryptoWall 4는 암호화된 파일에 새로운 파일 네이밍 알고리을 사용하는데 다음과 같습니다.
- 제외된 디렉토리는 건너뛰고 하드드라이브에서 디렉토리를 스캔합니다
- 제외된 파일명과 확장자를 제외하고 원본파일을 얻습니다.
- 5~10길이의 랜덤 문자열을 생성하여 파일이름으로 저장합니다.
- Build a filename string with the length of this random size out of the character set 'a-z'
(Get random value between 0-1000, do a MOD 26 and convert it to an ASCII character) - NULL문자는 파일이름의 끝을 알립니다
- 파일이름과 파일이름 길이중에서 랜덤 숫자를 얻습니다.
- 1부터 6단계에서 얻은 숫자에서 랜덤 숫자를 얻습니다(이 숫자는 다음 단계에서 얼마나 많은 랜덤숫자가 삽입되었는지 알기위한 값으로 사용됩니다.)
- 0~9까지의 아스키 값 에서 랜덤 값를 추출하여 문자열의 랜덤위치에 삽입합니다.
- 8단계의 결과가 7단계에 있는 값에 있을때가지 계속 반복합니다.
- 확장자를 생성하는 알고리즘도 똑같지만 최소 2글자 부터 최대 5글자 입니다.
- 확장자를 파일명에 추가합니다.
CryptoWall 4는 몇몇 확장자와, 디렉토리, 파일이름을 제외시키기 위해 CRC32 체크섬을 사용합니다.
다음은 암호화에서 제외된 리스트 입니다.
Extensions:
exe, dll, pif, scr, sys, msi, msp, com, hta, cpl, msc, bat, cmd, scf
Directories:
windows, temp, cache, sample pictures, default pictures, Sample Music, program files, program files (x86), games, sample videos, user account pictures, packages
Files:
help_your_files.txt, help_your_files.html, help_your_files.png, thumbs.db
완벽한 제외 리스트는 Appendix A에서 보실수 있습니다..
우리는 이 디렐토리, 파일, 확장자들이 OS의 안정성을 지키기 위해 있다고 생각하고 있습니다. 이것은 타협하려는 유저들이 몸값을 지불할수 있도록 하기 위해서 입니다. 모든 감염된 유저들은 기억해야 합니다. 버티는것이 성공입니다. 암호화 함수는 감염된 이상 유저가 어떤 파일을 생성하더라도 다음 리부팅 때 다시 한번 작동합니다.
파일들에 새로운 이름을 생성하고 나서 Figure F에 나온것처럼 암호화 알고리즘이 시작됩니다. 또한 이것은 CryptoWall 4가 파일을 암호화 한후에는 임시 AES암호화 키를 복호화할 개인키를 갖고 있지 않는 이상 되돌릴 방법이 없다는 것을 알 수 있습니다. 피해자들에게는 불행히도 이 키는 공격자에게 만 있고 피해자에게 절대 보내주지 않습니다. 다르게 말하면 몸값을 지불하거나 그들의 인프라에 대한 법적 집행같은 방법으로 공격자에게서 개인키를 얻지 않는이상 복구는 불가능하다는 뜻입니다.사용자들은 중요한 파일들에 대한 백업을 갖고있으면 이러한 타입의 공격에도 몸값을 지불하지 않고 충분히 복구 할수 있다는 사실에 희망을 가져야합니다(존나 부정적이네)
windows, temp, cache, sample pictures, default pictures, Sample Music, program files, program files (x86), games, sample videos, user account pictures, packages
Files:
help_your_files.txt, help_your_files.html, help_your_files.png, thumbs.db
완벽한 제외 리스트는 Appendix A에서 보실수 있습니다..
우리는 이 디렐토리, 파일, 확장자들이 OS의 안정성을 지키기 위해 있다고 생각하고 있습니다. 이것은 타협하려는 유저들이 몸값을 지불할수 있도록 하기 위해서 입니다. 모든 감염된 유저들은 기억해야 합니다. 버티는것이 성공입니다. 암호화 함수는 감염된 이상 유저가 어떤 파일을 생성하더라도 다음 리부팅 때 다시 한번 작동합니다.
파일들에 새로운 이름을 생성하고 나서 Figure F에 나온것처럼 암호화 알고리즘이 시작됩니다. 또한 이것은 CryptoWall 4가 파일을 암호화 한후에는 임시 AES암호화 키를 복호화할 개인키를 갖고 있지 않는 이상 되돌릴 방법이 없다는 것을 알 수 있습니다. 피해자들에게는 불행히도 이 키는 공격자에게 만 있고 피해자에게 절대 보내주지 않습니다. 다르게 말하면 몸값을 지불하거나 그들의 인프라에 대한 법적 집행같은 방법으로 공격자에게서 개인키를 얻지 않는이상 복구는 불가능하다는 뜻입니다.사용자들은 중요한 파일들에 대한 백업을 갖고있으면 이러한 타입의 공격에도 몸값을 지불하지 않고 충분히 복구 할수 있다는 사실에 희망을 가져야합니다(존나 부정적이네)
TECHNICAL DETAILS
THE DROPPER
dropper는 커스터마이징 패커로 압축되거나 암호화 되어있습니다. 쓸모없는 코드로 가득차 있거나 API를 호출하거나, 이상한 파라미터로 랜덤 API를 부르는 AV anti-emulation 트릭을 통해 에뮬레이션 엔진을 혼잡하게 합니다.
![]() |
Figure G |
두번째 단계는 다음과 같은 가진 스파게티 코드 형태를 가지고 있습니다.
INSTRUCTION 1
INSTRUCTION 2
JNO nextStep
이 메인 코드는 구버전 CryptoWall과 비슷합니다. 악성코드는 Import Address Table (IAT)를 만듭니다., 필요한 모든 시스템 정보를 획득하 고 프로세스 동기화를 위해 메인 이벤트 객체를 생성합니다.(이름은 워크스테이션 정보의 MD5값에서 생성합니다.) 이 이벤트는 2목표를 이룹니다. 첫번째로 CryptoWall 4의 감염이 시작되면서 실행되거나 동기화되는 동안 다른 연관된 모든 프로세스를 막습니다.
INSTRUCTION 1
INSTRUCTION 2
JNO nextStep
THE DECOMPRESSED CODE
이 메인 코드는 구버전 CryptoWall과 비슷합니다. 악성코드는 Import Address Table (IAT)를 만듭니다., 필요한 모든 시스템 정보를 획득하 고 프로세스 동기화를 위해 메인 이벤트 객체를 생성합니다.(이름은 워크스테이션 정보의 MD5값에서 생성합니다.) 이 이벤트는 2목표를 이룹니다. 첫번째로 CryptoWall 4의 감염이 시작되면서 실행되거나 동기화되는 동안 다른 연관된 모든 프로세스를 막습니다.
이 코드는 새로 생성된 explorer.exe 프로세스에 삽입됩니다. 실제로 이코드는 목표 프로세스에 삽입되는데 두개중 하나는 다른 기술이 사용됩니다. (The code is injected in a newly spawned “explorer.exe” process. The actual code is written in the target process using one of two different techniques)
- ZwCreateSection and ZwMapViewOfSection native APIs
- ZwAllocateVirtualMemory, ZwWriteVirtualMemory and ZwProtectVirtualMemory native APIs
- ZwQueueApcThread internal API used to queue an APC in the target process
- The classical CreateRemoteThread method
코드는explorer.exe 란 이름으로 생성된 프로세스에 존재하며 최후에는 CryptoWall4를 실행하여 시스템을 감염시키고 PC에 남아있습니다. dropper는 %APPDATA% 폴더안에 복사되고 레지스트리 값은 로컬 사용자 레지스트리 루트 경로 의 표준 "실행" 키 내부에 생성됩니다.
코드는explorer.exe 란 이름으로 생성된 프로세스에 존재하며 최후에는 CryptoWall4를 실햏ㅇ핳여 시스템을 감염시키고 PC에 남아있습니다. dropper는 %APPDATA% 폴더안에 복사되고 레지스트리 값은 로컬 사용자 레지스트리 루트 경로 의 표준 "실행" 키 내부에 생성됩니다. dropper는 지금까지 본 적 없었던 메소드인 SRRemoveRestorePoing API라는 것을 사용하는데 이것이 ERROR_INVALID_DATA라는 에러를 반환할떄 까지 index 0부터 1000까지 호출하여 윈도우의 쉐도우 복사본을 복원 할 수 없게 합니다. 이것은 “HKLM\Software\Microsoft\Windows Nt\SystemRestore”라는 레지스트리 키에 DisableSR(1로 세팅)이라는 이름의 값을 생성하는데 윈도우 시스템의 시스템 복구를 완전 무효화시킨다. 마지막으로 볼륜의 쉐도우 복사본을 삭제시키는 표준 명령어를 실행시킨다.:
vssadmin.exe Delete Shadows /All /Quiet
실행은 "svchost.exe" 프로세스에서 계속 되는데 코드는 IAT를 재 빌드하여 다른 이벤트 오브젝트("svchost.exe"만을 위한 인스턴스)를 생성 시키고 configuration file을 생성시키고 파일을 연다. configuration file에 대해서는 나중에 더 기술하겠다. 이 때는 configure 파일이 없기 때문에 루틴은 실패한다. dropper는 자신 안에 있는(LZ알고리즘으로 압축된) C&C URL 리스트를 압축을 풀고 마지막으로 C&C서버에 신호패킷을 보낸다.
당신이 dropper를 분석한다면 C&C서버 리스트는 IOC 섹션에서 찾을 수 있다.
CryptoWall 4 네트워크 패킷은 다음과 같은 구조로 이루어져 있다.:
|<request Id>|crypt7|<workstation MD5>[|subRequest Id 1|subRequest 1 Data| … ]
이글을 쓸때쯤에 우리는 5종류의 네트워크 패킷 타입을 분리시켰다.
1, 3 - 신호패킷- 새로운 피해자를 감염시키면 C&C서버와 통신한다.
7 - Multi purpose packets. The first sub-request ID differentiates packets:
1 - 다목적 패킷 - 첫번째 sub-request ID는 패킷마다 다르다 공개키 request - 모든 파일을 암호화 하기위해 C&C서버에 공개키(그리고 언어별 PNG 바탕화면)를 요청한다.
2 - 신호종료 패킷 - 감염이 끝난단걸 알리기 위해 사용한다. 또 다른 sub-request ID가 감염이 끝난다는걸 확실하게 정의한다.(뭔 개소리지)
1 - 성공
2, 3 - U지원안하는 OS 언어 패킷 - 종료br>
네트워크 패킷은 HTTP POST request를 이용하여 통신하지만 직전에 암호화 된다. 암호화 알고리즘은 custome된 알고리즘으로 랜덤 문자열을 키로 사용하고 다음 형식과 같은 문자열을 만든다
|<Letter>|=|<encryption Key in Hex>|<encrypted stream>|
e.g. s=6975376e7a9b0fd24886fbd0c0de32d3ab4dd97174462ca3b06af16a1c840ae893eddacafbd93e56847c23a41352d4f45fc75468e4408
감염이 끝났다고 신호를 보내고 나면 공개키를 얻기 위해 C&C 서버와 통신한다. 여기서 CryptoWall 4의 약점이 있다 만약 걍력한 방화벽이나 IPS가 CryptoWall 4 의 패킷을 잡을 수 있다면 감염은 진행되지 않는다. RSA-2048 공개키는 패킷 ID가 7로된 패킷으로부터 회수된다. C&C 서버는 다음과 같은 순서로 대답한다.
- URL 리스트(토르 URl과 일반 URL)
- base64로 인코딩으로 분류된 RSA-2048 공개키
- PNG 사진의 언어에 따라 base64로 인코딩된다.
- Figure H.1 부터 Figure H.3까지를 보세요. 영어, 이탈리아어, 독일어 아니면 다른언어도 있습니다. 감염자의 언어세팅에 맞춰 보내집니 다.)
![]() |
Figure H.1 |
![]() |
Figure H.2 |
![]() |
Figure H.3 |
공개키는 CryptStringToBinary API를 이용하여 디코딩 됩니다. 디코딩된 버퍼는 전역변수로 저장됩니다. HTML과 텍스트파일(LZ알고리즘으로 압축된)은 dropper로 부터 추출됩니다. 마지막으로 설정파일이 생성된 후 암호화 되면 다음 위치에 저장 됩니다.:
C:\Users\<Username>\AppData\Roaming\<Random 8 digits>
CryptoWall4 설정파일은 멀웨어가 성공적으로 실행되는데 필요한 정보를 담고 있습니다. 또한 암호화 프로세스가 멈춰도 파일이 계속 암호화 되도록 합니다. 예를 들어 pc가 꺼지기 상황 말이죠 파일은 블록의 크기를 특정할 수 있는 4바이트 값이 앞에 있는 연속된 블록에 바이러스를 담고 있습니다.
CryptoWall 4 는 설정파일에 다음과 같은 정보를 저장합니다.
- 전달받은 공개키의 바이너리 데이터
- 피해자에게 보여 줄 언어 세팅에 맞는 HTML 페이지
- 피해자에게 보여 줄 언어 세팅에 맞는 텍스트 파일
- 마지막으로 피해자에게 보여줄 PNG 사진
마지막 3개 파일은 피해자의 워크스테이션이 암호화 과정이 끝난후에 각 폴더에 저장됩니다.
설정파일은 마지막으로 LZ알고리즘(RtlCompressBuffer API와 index 2 - COMPRESSION_FORMAT_LZNT1을 사용합니다.)으로 압축되어 디스크에 저장됩니다..
모든일이 끝나면 메인 스레드가 실행되고 원본은 종료됩니다.( RtlExitUserThread API를 사용함)
THE MAIN THREAD
메인 스레드는 공개키를 import 합니다. 이것은 적절한 데이터 구조로 인코딩 된 공개 키 바이너리 데이터는 Windows Crypto API가 사용할수 있다는 뜻입니다. CryptoWall4 는 CryptDecodeObjectEx API란 프로세스를 사용합니다. 이 방법은 바이너리 데이터는 CERT_PUBLIC_KEY_INFO 구조로 변환 될수 있다는 것을 의미합니다. 마지막으로 새로운 데이터 구조는 CryptImportPublicKeyInfo함수를 사용하는 CryptoAPI로 부터 import 되어 값을 반환합니다. 그리고 공개키의 MD5값을 계산합니다. 이것은 매우 중요한 단계입니다. 왜냐하면 피해자의 파일이 이미 암호화 되었는지 확인할때 사용되기 때문입니다.
이떄 실제 암호화 프로세스가 일을 합니다. 각 논리적 드라이브를 찾아 피해자의 시스템이 작동하는지 확인 합니다. :
LPWSTR pngFilePath = new TCHAR[MAX_PATH]; // This produces something like "C:\HELP_YOUR_FILES.PNG" ComposePngPath(driveName, "HELP_YOUR_FILES.PNG", pngFilePath, MAX_PATH); if (!FileExists(pngFilePath) == TRUE) { // Proceed with the encryption // … … … }
만약 root 경로에서 "HELP_YOUR_FILES.PNG”라는 파일을 갖고있는 파일을 찾는다면 넘어갑니다. 우리도 이것이 버그인지 아니면 의도된 행위인지 알지 못합니다. 각 드라이브가 테스트를 통과할 때마다 새로운 암호화 프로세스가 생성됩니다. (스레드의 argument는 공개키를 와 드라이브의 이름을 담은 작은 데이터 구조 입니다.)
메인 스레드는 암호화 스레드가 끝날때까지 기다립니다. 그리고 복호화를 위한 3가지 파일을 두개의 디렉토리에 저장하는데 하나는 시작 메뉴이고 하나는 피해자의 바탕화면입니다.
마지막으로 C2서버에 끝났다는 신호패킷을 보내고 설정 파일은 삭제되고 프로세스는 ZwTerminateProcess native API 를 이용해 종료됩니다.
![]() |
Figure I |
THE ENCRYPTION THREAD
모든 암호화 스레드는 두가지 일을 합니다. 첫번째는 모든 파일을 암호화를 하기 위해 DoFilesEncryption루틴을 부릅니다. 마지막으로 HELP_YOUR_FILES.PNG 배경화면을 root path에 저장합니다..
"DoFilesEncryption" 루틴은 지정된 드라이브에서 파일과 폴더를 돌아다닙니
각 하위 디렉토리와 마주칠때마다 CRC32로 필터링 목록에 걸리는지 체크합니다.(여기서 windows, system32, temp 파일등은 무시됩니다.) 그리고 HELP_YOUR_FILES.PNG파일이 있는지 체크하고 만약 없다면 새로운 폴더 경로를 argument로 자기 자신을 호출합니다.
각 파일 이름들은 이름과 확장자로 두번씩 필터링 됩니다. 만약 필터링 루틴이 허가한 이름이라면 EncryptFile 루틴이 호출됩니다.
EncryptFile은 이름 그대로 목표파일을 암호화 하는 루틴입니다. 원본 파일을 열어 속성을 열어봅니다. IsFileAlreadyEncrypted 함수가 처음 16바이트를 읽어들여 MD5 해쉬와 공개키를 비교하여 파일이 암호화 되었는지 확인합니다.
랜덤한 파일이름과 확장자는 이 때 멀웨어로부터 생성됩니다. 알고리즘은 RtlRandomEx API를 이용하여 읽을수 있는 문자열로 생성됩니다. .
여기 알고리즘이 있습니다. :
새로운 파일이 만들어지면 CryptGenKey 와 CryptoExportKey라는 Windows Crypto API를 사용해 AES-CBC 256키를 생성합니다. 이 32bit 키는 전체 파일을 암호화 하는데 사용됩니다.
이 부분에서 CryptoWall 4 는 영리한 짓을 합니다. C&C서버(CryptEncrypt API를 사용한다)로 부터 받은 RSA-2048 공개키(256bytes)를 이용하 여 생성된 AES키를 암호화 합니다. 이것은 암호화된 256-bit 문자열이 나쁜 새끼들만 복호화 할 수 있게 합니다. (개새끼들이야 아주)
RSA-2048 공개키의 MD5해쉬 값은 암호화된 파일의 첫 16 bytes 에 저장하고 CryptoWall 4 는 256-bit로 암호화 된 문자열을 그 다음에 저장 합니다. 원본 파일의 속성과 사이즈는 다음 8바이트에 저장됩니다. 원본 파일의 이름은 AES key로 암호화되어 새로운 파일 안에 저장됩니다.
이 때 실제 암호화된 파일 콘텐츠가 자리 잡습니다. 원본 파일은 512 KByte짜리 블록에서 읽습니다. 각 블록은 생성된 AES-CBC 254 키로 암호화 되어 있고 새로운 파일에 직접 쓰여집니다.(블록사이즈와 함께 첫번째 4 Byte에 저장됨)
CryptoWall 4 의 모든 단계가 끝나면 모든 원본 파일은 흥미로운 방법으로 삭제됩니다. :
// Generate a random value DWORD GenerateRandValue(int min, int max) { if (min == max) return max; // Get the random value DWORD dwRandValue = RtlRandomEx(&g_qwStartTime.LowPart); DWORD dwDelta = max - min + 1; dwRandValue = (dwRandValue % dwDelta) + min; return dwRandValue; } // Generate a Random unicode string LPWSTR GenerateRandomUString(int minSize, int maxSize) { DWORD dwStringSize = 0; // Generated string size DWORD dwNumOfDigits = 0; // Number of number letters inside the string LPWSTR lpRandString = NULL; // Random unicode string // Generate the string size, and alloc buffer dwStringSize = GenerateRandValue(minSize, maxSize); lpRandString = new TCHAR[dwStringSize+1]; for (int i = 0; i < (int)dwStringSize; i++) { DWORD dwLetter = 0; // Generated letter dwLetter = GenerateRandValue(0, 1000); dwLetter = (dwLetter % 26) + (DWORD)'a'; lpRandString[i] = (TCHAR)dwLetter; } // NULL-terminate the string lpRandString[dwStringSize] = 0; // Now insert the digits inside the string DWORD dwUpperHalf = GenerateRandValue(dwStringSize / 2, dwStringSize); dwNumOfDigits = GenerateRandValue(1, dwUpperHalf); for (int i = 0; i < (int)dwNumOfDigits; i++) { DWORD dwValue = 0, dwPos = 0; // Generated value and position dwValue = GenerateRandValue(0, 9) + (DWORD)'0'; dwPos = GenerateRandValue(0, dwStringSize-1); lpRandString[dwPos] = (TCHAR)dwValue; } return lpRandString; } // Generate a random file name starting from a file full path BOOLEAN GenerateRandomFileName(LPWSTR lpFileFullPath, LPWSTR * lppNewFileFullPath, LPWSTR * lppOrgFileName) { LPWSTR lpRandFileName = NULL; // New random file name (without extension) LPWSTR lpRandExt = NULL; // New random file extension LPWSTR lpNewFileName = NULL; // The new file full name DWORD dwSize = 0; // size of the new filename // Check the arguments if (!lpFileFullPath || !lppNewFileFullPath || !lppOrgFileName) return FALSE; // Generate the new file name (without extension) lpRandFileName = GenerateRandomUString(5, 10); // Generate the random file extension lpRandExt = GenerateRandomUString(2,5); // Combine the new file name and extension and generate the final new file path // .... dwSize = wcslen(lpRandFileName) + wcslen(lpRandExt) + 1; lpNewFileName = new TCHAR[dwSize+1]; swprintf_s(lpNewFileName, dwSize+1, L"%s.%s", lpRandFileName, lpRandExt); // .... }
새로운 파일이 만들어지면 CryptGenKey 와 CryptoExportKey라는 Windows Crypto API를 사용해 AES-CBC 256키를 생성합니다. 이 32bit 키는 전체 파일을 암호화 하는데 사용됩니다.
이 부분에서 CryptoWall 4 는 영리한 짓을 합니다. C&C서버(CryptEncrypt API를 사용한다)로 부터 받은 RSA-2048 공개키(256bytes)를 이용하 여 생성된 AES키를 암호화 합니다. 이것은 암호화된 256-bit 문자열이 나쁜 새끼들만 복호화 할 수 있게 합니다. (개새끼들이야 아주)
RSA-2048 공개키의 MD5해쉬 값은 암호화된 파일의 첫 16 bytes 에 저장하고 CryptoWall 4 는 256-bit로 암호화 된 문자열을 그 다음에 저장 합니다. 원본 파일의 속성과 사이즈는 다음 8바이트에 저장됩니다. 원본 파일의 이름은 AES key로 암호화되어 새로운 파일 안에 저장됩니다.
이 때 실제 암호화된 파일 콘텐츠가 자리 잡습니다. 원본 파일은 512 KByte짜리 블록에서 읽습니다. 각 블록은 생성된 AES-CBC 254 키로 암호화 되어 있고 새로운 파일에 직접 쓰여집니다.(블록사이즈와 함께 첫번째 4 Byte에 저장됨)
CryptoWall 4 의 모든 단계가 끝나면 모든 원본 파일은 흥미로운 방법으로 삭제됩니다. :
// Move the new encrypted file name in the old original position, replacing the old one bRetVal = MoveFileEx(newEncFileName, lpOrgFileName, MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING); if (!bRetVal) // Delete the old file in the standard manner: DeleteFile(lpOrgFileName); else { // Rename the original replaced file in the new random file name bRetVal = MoveFileEx(lpOrgFileName, newEncFileName, MOVEFILE_REPLACE_EXISTING); }
만약 당신이 위쪽의 슈도 코드를 볼 줄 안다면 원본파일이 있는 하드디스크 섹터를 덮어써서 모든 데이터 복구 프로세스가 어려워지게 만듭니다. 이것은 멀웨어 제작자가 사용한 흥미롭고 새로운 방법으로서 몸값을 지불하는 확률을 높이고 잃어버린 파일을 복구하는 가능성을 줄임으로써 그들의 비즈니스 모델에 도움을 준다. :
![]() |
Figure J |
CONCLUSION
이번 통해 우리는 CryptoWall 4를 자세하게 분석했다. dropper는 혁신적인 변화는 없었으나 여전히 몇몇 영리한 방법을 사용하고 있다. 감염 프로세스의 약점은 C2서버와의 통신에 깊게 의지하고 있다는 점이다 만약 방화벽이나 IPS가 통신 패킷을 감지하고 차단할 수 있다면 피해자의 파일을 암호화할 공개키가 없기 때문에 감염 프로세스는 작동하지 않을 것이다. 그렇지만 Crypto Wall 4가 피해자의 파일을 암호화 한다면 몸값을 지불하지 않고 개인키를 복구하여 복호화 할 수 있는 알려진 해결법은 없 다. 개인키는 오직 공격자들에게만 있다.
분석 결과가 보여주듯이 CryptoWall 뒤의 공격자들은 혁신하고 진화하여 저항하는 피해자들로 부터 살아남고 있다.(어색하다..) 전체적인 위협을 보면 조직적으로 뭉칠 필요가 있다. 랜섬웨어는 계속해서 진화하기 때문이다.(다시 번역) 다중 레이어 방어정책을 사용한다면 조직으로 하여금 Crypto Wall 4같은 위협을 탐지하고 차단할 수 있을 것이다. Talos 는 CryptoWall이 진화하는것을 식별하는 더 좋은 탐지 방법을 개발하고, 우리의 고객을 지키기고 더 좋은 방어법을 개발하기 위해 계 속해서 CryptoWall을 모니터링 할 것이다. 우리는 사용자들과 기업들에게 보안 규칙을 준수하길 바란다 예를 들어 보안 패치를 꾸준히 하고 알 수없는 메시지를 받는것에 대해 주의하 거나 튼튼한 백업 솔루션을 사용하는 것이다. 이런 연습들은 리스크를 줄이고 이러한 공격으로 부터 복구 하기 쉽게 도와줄 것이다.
PROTECTING USERS
Advanced Malware Protection (AMP) 는 이러한 행위를 하는 멀웨어의 실행을 막는데 최적화 되어 있다.
IOC DETAILS
You can find a downloadable copy of these IOCs here.Sample Analysed
3a73bb154506d8a9a3f4f658bac9a8b38d7590d296496e843503323d5f9b7801
Similar Samples Found
2d04d2a43e1d5a6920a806d8086da9c47f90e1cd25aa99b95af182ee9e1960b3
bf352825a70685039401abde5daf1712fd968d6eee233ea72393cbc6faffe5a2
299b298b433d1cc130f699e2b5c2d1cb3c7e5eb6dd8a5c494a8c5022eafa9223
ThreatGrid Report (Licensed user only)
https://panacea.threatgrid.com/samples/d25f94dc4f2ac59e0428f54d685ead38
C2 URL list
abelindia.com/1LaXd8.php
purposenowacademy.com/5_YQDI.php
mycampusjuice.com/z9r0qh.php
theGinGod.com/HS0ILJ.php
yahoosupportaustralia.com/8gX7hN.php
successafter60.com/iCqjno.php
alltimefacts.com/EiFSId.php
csscott.com/YuF59b.php
smfinternational.com/eRs70a.php
lexscheep.com/OIsSCj.php
successafter60.com/r_kfhH.php
posrednik-china.com/etdhIk.php
ks0407.com/VoZQ_j.php
stwholesaleinc.com/yL54uH.php
ainahanaudoula.com/GH09Dp.php
httthanglong.com/yzoLR7.php
myshop.lk/6872VF.php
parsimaj.com/60wEBT.php
kingalter.com/uVRfPv.php
shrisaisales.in/ZUQce4.php
cjforudesigns.com/E8B2gt.php
mabawamathare.org/WEAbCT.php
manisidhu.in/zJE0fD.php
adcconsulting.net/XEGeuI.php
frc-pr.com/dA91lI.php
localburialinsuranceinfo.com/zDJRc8.phpsmfinternational.com/AYNILr.php
APPENDIX A
8E87F076h = help_your_files.txt
0A73B295Ch = help_your_files.html
11A8ACA3h = help_your_files.png
88068F93h
775DBED4h
60479578h
7BD40679h = iconcache.db
48F43013h = thumbs.db
95ED794Ah
884F3F52h
7DAC63A1h
4208466h
0BA069E4Ch
0EC619E8Dh
9B0FD8B3h
Excluded extensions CRC32 Checksums
6B63B6F0h = exe
3DD3B336h = dll
0BB5EA5C1h = pif
592D276Fh = scr
9E07ED22h = sys
8F3272A8h = msi
0A45BDDC1h = no three letter ext
0B65F578Ah = no three letter ext
0EB59DA68h = msp
64B6C6E6h = com
0C863AEB6h = hta
0DEEBF8EEh = cpl
6FE79BB6h = msc
9F9C299Fh = bat
2F5C1CC0h = cmd
43F7F312h = scf
Excluded directories CRC32 Checksums
0E3E7859Bh = windows
0B5385CAh = temp
0ED4E242h
9608161Ch
41476BE7h = cache
0F5832EB4h
0D8601609h
1DF021B7h
0B91A5F78h = sample pictures
0A622138Ah = default pictures
3FF79651h = sample Music
62288CBBh = program files
224CD3A8h = program files (x86)
72D480B3h
0FF232B31h = games
0A33D086Ah = sample videos
78B7E09h = user account pictures
9BB5C0A7h = packages
24FA8EBDh