로키(Locky) 랜섬웨어는 오늘날 가장 널리 퍼진 스팸 맬웨어다. 로키 맬웨어의 활동은 2015년부터 개시됐으나 본격적인 전파는 20161월 이후였으며 그 이후로 사그러들지 않고 있다. 로키 랜섬웨어 이메일은 대체로 zip 압축파일이 첨부되며 이 파일의 압축을 풀면 문서나 자바스크립트가 나오게 된다. ThreatTrack 측에서 수집한 로키 랜섬웨어는 실행파일을 다운로드 및 실행할 수 있는 자바스크립트를 포함하고 있었다. 여기에서는 이 실행파일을 중심으로 로키 랜섬웨어를 분석하고 최신 버전을 살펴보고자 한다.


맬웨어제작자가 전송한 스팸메일

 

기본 감염과정 및 파일해시

1582A0B6A04854C39F8392B061C52A7A zip 첨부물

59D2E5827F0EFFE7569B2DAE633AFD1F zip에서 추출된 자바스크립트

F79C950FA3EFC3BB29A4F15AE05448F2 자바스크립트로 다운받은 로키 실행파일

 



기본 감염과정 및 파일해시

 

감염징후

 

어떤 기기가 로키에 감염됐는지의 여부는 어렵지 않게 발견할 수 있다. 아래 그림은 로키에 감염된 윈도XP 기기의 데스크탑 바탕화면을 나타낸다.

 

로키에 감염된 컴퓨터의 바탕화면

 

로키에 감염된 파일은 .locky라는 확장자가 들어가게 되며 감염된 사용자의 개인ID가 파일명 앞에 붙게 된다. 본 실험에서는 MD5 해시값인 8B74B4AA40D51F4A가 붙는다. 또한 _HELP_instructions.txt라는 텍스트파일에는 위 바탕화면에 표시된 내용과 동일한 메시지가 들어 있다.

 

로키 암호화파일

 

로키는 HKCU\Software에 암호화된 사용자고유 레지스트리키를 생성한다. 레지스트리값에 대한 상세내용은 아래에 설명한다. 본 실험에서 생성된 키는

8W21gQe9WZ3tc.

 

암호화된 사용자 개인키

 

합의금지급 안내

 

사용자는 TOR 브라우저를 설치하여 아래 합의금지급 웹페이지에 접속하라는 안내를 받게 된다. 이 때 비트코인 지갑이 있어야 하며 지정된 비트코인 주소로 1.5비트코인을 전송해야 한다.

 

로키 랜섬웨어 합의금지급 페이지

 

자바스크립트 59D2E5827F0EFFE7569B2DAE633AFD1F 소개

 

본 자바스크립트를 텍스트편집프로그램으로 열면 아래와 같이 표시된다.

 

자바스크립트

 

본 자바스크립트는 GET을 통해 http://goldish[dot]dk/o2pds로부터 명령을 다운받고 이를 %Temp%에서 실행시킨다. 이 실행파일은 %Temp% 폴더에 들어 있지 않으면 정상 작동하지 않는다.

 

실행파일 F79C950FA3EFC3BB29A4F15AE05448F2 상세분석

 

Upatre, Dridex, Crypto와 마찬가지로 로키 실행파일 역시 지표(시그내쳐) 탐지를 회피하기 위해 어느 정도 암호화돼 있다.

 

복호화 최종단계에서는 RTLDecompressBuffer API를 통해 실행파일의 압축을 풀게 된다. 이 방식은 Upatre 그리고 Necurs 룻킷 다운로더에서도 사용된 바 있다.

 

RTLDecompressBuffer API


압축이 풀린 로키 실행파일의 MD5 해시값은 F35D01F835FC637E0D9E66CD7E571C06이다.

 

실행파일은 우선 아래와 같은 CnC 서버 IP주소를 복호화한다.

 

중앙통제(CnC) 서버 IP주소

 

실행파일은 API GetWindowsDirectoryA를 통해 윈도 디렉토리를 받는다. 이는 API GetVolumeNameForVolumeMountPointA의 기준으로 사용된다. 이 함수는 감염대상 기기의 윈도폴더에 연관된 volume GUID 경로를 받게 된다.

 

윈도 디렉토리

 

GUID는 로키 랜섬웨어가 사용자의 고유ID를 확보하기 위한 기반 역할을 한다.

 

우선 로키 실행파일이 API CryptHashData에 대해 GUID를 활용한다.


API CryptHashData

 

로키 실행파일은 기기에 대한 고유ID(8B74B4AA40D51F4A)를 확보하기 위해 API CryptGetHashParam를 활용하여 GUID 관련 고유ID를 얻게 된다. hex 덤프를 보면 첫 8바이트를 확인할 수 있다.

 

API CryptGetHashParam

 

이렇게 확보된 고유ID는 본 실험에서 사용된 로키 버전의 신규 레지스트리키와 관련된다. 이제 ID는 체크섬을 통해

로키 실행파일이 설치한 스트링루틴으로 변환되어 레지스트리키로 사용될 스트링을 확보하게 된다. 본 실험에서 신규 레지스트리값이 이전 버전에서 쓰였던 Locky가 아닌 8W21gQe9WZ3tc인 이유가 바로 여기에 있다.

 

신규 레지스트리키

 

CnC 통신

로키 실행파일은 http://<IP/Domain>/submit.phpPOST 요청을 전송하며 이 때 쓰이는 명령과 파라미터는 다음과 같다.

 

Commands --- Parameters (Remove the <>)

&act=getkey&affid= --- id=<>,&lang=<>,&corp=<>,&serv=<>,&os=<>,&sp=<>,&x64=<>

&act=gettext&lang= --- id=<>

&act=stats&path= --- id=<>,&encrypted=<>,&failed=<>,&length=<>

 

&act=getkey&affid= 명령에 대한 파라미터 예시(암호화 생략)

id=8B74B4AA40D51F4A&act=getkey&affid=1&lang=en&corp=0&serv=0&os=Windows+XP&sp=3&x64=0

 

이들 명령은 API HttpSendRequestA를 통해 암호화된 상태로 CnC 서버에 전송된다. 실행파일은 또한 API InternetReadFile을 통해 암호화된 응답을 수신한다.

 

CnC 서버 명령창


로키 실행파일은 CnCgetkey 명령을 보내고 나서 공개 RSA키를 통해 암호화된 메시지와 getkey 명령을 복호화하게 된다. 아래 그림을 통해 암호화 과정 일부를 볼 수 있다. 공개 RSA키는 ASC에 들어간다.

 

복호화과정

 

사용자기기에 공개키 저장

 

로키 실행파일은 RSA 공개키를 암호화하고 해당 체크섬은 스트링으로 변환되며 이는 레지스트리키가 생성된 과정과 동일하다. 이는 HKCU\Software에 있는 레지스트리키에 바이너리값으로 저장된다. 값의 이름은 270CwQa9XuPIc7이다.

 

RSA 공개키 암호화

 

사용자에 대한 메시지

 

그리고 CnC&act=gettext&lang= 명령이 전송된다. 로키 랜섬웨어는 이를 통해 데스크탑 배경화면 그림과 동일한 내용의 메시지를 받게 된다.

 

로키 랜섬웨어 메시지

 

드라이브, 네트워크리소스, 암호화대상 파일 수집

 

네트워크 공유 및 리소스

로키 실행파일은

WNetOpenEnumW, WNetEnumResourcesW, WNetAddConnection2,

WNetCloseEnum API를 통해 아래와 같은 3종의 리소스를 파싱했다.

#define RESOURCE_CONNECTED 1

#define RESOURCE_GLOBALNET 2

#define RESOURCE_REMEMBERED 3

 

각종 리소스유형에 대한 NetResource 파싱과정의 용도는 아래와 같다.

 

NetResource 파싱 과정


아래 그림은 분석대상 기기에서 공유폴더기능을 켤 때 실행파일이 해당 공유폴더에 접속하여 나중에 공유폴더에 있는 파일까지 암호화할 수 있도록 준비하는 모습을 보여준다.

 

공유폴더 파일 암호화

 

실행파일은 다음으로 GetLogicalDrives 그리고 GetDriveTypeW API를 통해 암호화대상 드라이브를 수집한다. 본 실험에서는 C:\ 드라이브가 수집됐다.

 

C드라이브 암호화

 

마지막으로 위에서 수집한 드라이브와 리소스를 토대로 폴더별로 파일을 암호화할 쓰레드가 생성된다.

 

로키 랜섬웨어 프로세스 최종단계

 

데이터복구 차단 위한 숨은 사본 삭제

 

로키 실행파일은 다음으로 아래 명령을 실행하여 모든 숨은 사본을 삭제한다.

vssadmin.exe Delete Shadows /All /Quiet

 

Crypto 등 다른 랜섬웨어 또한 동일한 명령을 사용했다.

 

파일암호화 프로세스 - 쓰레드 생성

 

본 과정의 첫 단계는 기기의 파일 및 디렉토리를 파싱하는 것이다. 로키 실행파일은 암호화대상 파일에 대한 참고로서 메모리공간을 할당한다.

 

허용목록 확인

로키는 감염대상 기기의 디렉토리를 파싱하면서 각 파일의 파일명을 이하의 허용목록 스트링과 대조하게 된다. 아래와 같은 스트링을 포함한 파일이름은 암호화되지 않게 된다.

@_HELP_instructions.bmp, _HELP_instructions.txt, _Locky_recover_instructions.bmp, _Locky_recover_instructions.txt, tmp, winnt, Application Data, AppData, Program Files (x86), Program Files, temp, thumbs.db, $Recycle.Bin, System Volume Information, Boot, Windows

 

차단목록 확인

로키 실행파일은 또한 암호홛상 파일의 확장자를 확인한다. 아래와 같은 확장자를 가진 파일은 암호화된다.

.001, .002, .003, .004, .005, .006, .007, .008, .009, .010, .011, .123, .3dm, .3ds, .3g2, .3gp, .602, .7z, .ARC, .CSV, .DOC, .DOT, .MYD, .MYI, .NEF, .PAQ, .PPT, .RTF, .SQLITE3, .SQLITEDB, .XLS, .aes, .asc, .asf, .asm, .asp, .avi, .bak, .bat, .bmp, .brd, .cgm, .class, .cmd, .cpp, .crt, .cs, .csr, .db, .dbf, .dch, .dif, .dip, .djv, .djvu, .docb, .docm, .docx, .dotm, .dotx, .fla, .flv, .frm, .gif, .gpg, .gz, .hwp, .ibd, .jar, .java, .jpeg, .jpg, .js, .key, .lay, .lay6, .ldf, .m3u, .m4u, .max, .mdb, .mdf, .mid, .mkv, .mml, .mov, .mp3, .mp4, .mpeg, .mpg, .ms11, .ms11 (Security copy), .n64, .odb, .odg, .odp, .ods, .odt, .onetoc2, .otg, .otp, .ots, .ott, .p12, .pas, .pdf, .pem, .php, .pl, .png, .pot, .potm, .potx, .ppam, .pps, .ppsm, .ppsx, .pptm, .pptx, .psd, .pst, .qcow2, .rar, .raw, .rb, .sch, .sh, .sldm, .sldx, .slk, .sql, .stc, .std, .sti, .stw, .svg, .swf, .sxc, .sxd, .sxi, .sxm, .sxw, .tar, .tar.bz2, .tbk, .tgz, .tif, .tiff, .txt, .uop, .uot, .vb, .vbs, .vdi, .vmdk, .vmx, .vob, .wav, .wb2, .wk1, .wks, .wma, .wmv, .xlc, .xlm, .xlsb, .xlsm, .xlsx, .xlt, .xltm, .xltx, .xlw, .xml, .zip, wallet.dat (filename specific)

 

파일암호화 프로세스 API 및 함수 수준 개관

 

로키 랜섬웨어가 AES RSA 암호화를 사용한다는 자체 주장은 일단 맞다. 암호화과정에서 CryptGenRandom 그리고 CryptEncrypt Crypto API가 사용된다. 또한 이 프로세스에서 aesenc 그리고 aeskeygenassisst를 사용하는 함수가 발견되기도 했다.

 

API 개관

 

암호화된 로크 파일의 최종 0x344바이트 해부

 

 

아래 그림을 보면 최종 0x344바이특 파일 말단에 쓰여진다. 4바이트는 실행파일에 의해 하드코딩된다. 본 실험에서는 이 부분이 로키 랜섬웨어 제작자가 사용자파일을 암호화한 실행파일의 버전을 확인하는 일종의 식별부호라고 추측했다.

 

하드코딩된 0x8956FE93

 

파일 위에 쓰기

 

다음 0x10바이트는 물론 사용자의 고유ID. 다음 0x100바이트는 CryptEncrypt API의 결과물이다. 마지막 0x230바이트는 위에서 언급한 AESENC 함수로부터 생성됐다.

 

감염 최종단계

로키 실행파일은 파일을 암호화한 모든 폴더 위치에 _HELP_instructions.txt 파일을 생성하게 된다. 또한 합의금지급 안내를 담은 비트맵 이미지파일을 생성하고 저장하여 이를 사용자 바탕화면으로 지정시킨다. 아울러 stats라는 액션을 CnC 서버로 전송하며 그 내용은 다음과 같다.

 

id=8B74B4AA40D51F4A&act=stats&path=c%3A&encrypted=1&failed=0&length=5912

Path = the infected Drive “C:\”

Encrypted = True

Failed = false

Length = number of files

 

마지막으로 최종 암호화 레지스트리값이 생성된다. 이는 과거 버전 로키의 Completed=Yes와 같다. 이를 통해 암호화된 레지스트리값에 대한 상세정보 3건이 완성된다.

 

암호화 최종단계

 

본 실험의 실행파일은 또한 도메인생성 알고리즘도 가지고 있었는데 이는 로키 랜섬웨어가 발견된 이래 계속 있었다고 알려져 있다. 실팽파일은 최초에 복호화된 IP 주소로부터 응답을 받지 못할 경우 이 알고리즘을 사용하게 된다.

 

대처방안

 

ThreatSecure 제품을 사용하면 로키 랜섬웨어 실행파일의 다운로드를 차단할 수 있다. 아래 이미지는 ThreatSecure NetworkGET 과정을 통해 악성코드 다운로드를 탐지하는 장면을 보여준다.

 

ThreatSecure 구동

 

사용자는 이메일 첨부물을 열기에 앞서 ThratTrack의 동적 맬웨어분석 샌드박스솔루션인 ThreatAnalyzer를 사용하여 해당 파일의 악성여부를 조사할 수 있다. ThreatAnalyzeranalysis.xml이라는 이름의 파일에 조사결과를 기록한다. 이 결과를 통해 ThreatAnalyzer가 해당 실행파일이 랜섬웨어의 행동양상을 보였음을 알 수 있다.

 

.locky에 보관 및 암호화된 파일

 

ThreatAnalyzer 샌드박스를 통해 파일이 암호화됐음을 탐지할 수 있으며 Help Instructions 텍스트파일 또한 생성됐음을 확인할 수 있다.


도움말 텍스트파일

 

CnC 서버 IP주소로의 POST 명령 통신에 대한 네트워크 캡쳐

 

로키 실행파일이 외부로 나가는 접속을 개시했음을 확인할 수 있다.

 

CnC 서버 통신 네트워크 캡쳐

 

백업을 모두 삭제하는 Vssadmin.exe 실행프로세스 캡쳐

 

Vssadmin.exe 실행프로세스 캡쳐

 

HKCU\software에서 암호화 레지스트리값을 4Y0743Ngl로 설정

 

로키는 파일 암호화에 앞서 기기의 네트워크리소스를 측정하며 이 역시 암호화된다. ThreatAnalyzer는 이 행동 역시 포착했다.

 

로키 네트워크리소스 계산

 

이상을 통해 본 실험에서 쓰인 것과 같은 지능형 위협방지 솔루션이 랜섬웨어 감염 방지에 도움이 될 수 있다. 지능형솔루션을 통해 신종위협이 실제로 위해를 가하기 전에 이를 차단할 수 있다. 특히 ThreatAnalyzer의 샌드박스 기능은 사용자가 실수로 첨부물을 열였을 경우에 침입 및 잠재적 악성행동에 대한 징후를 기록할 수 있으며 이를 통해 나날이 증가하는 주요 랜섬웨어공격에 대한 방어를 한층 강화할 수 있다.

 

<참고: ThreatTrack 보안솔루션>




ThreatTrack Security Labs, Understanding the Latest Version of Locky Ransomware, 5. 18. 2016.

https://blog.threattrack.com/understanding-latest-version-locky-ransomware/

 

번역: madfox




참고링크 


<유료안티바이러스 제품소개>

COMMENT : 0 TRACKBACK : 0

날짜

2016. 6. 1. 13:53

위로가기