Deep Analysis of Raccoon Stealer

S2W
S2W BLOG
Published in
17 min readMay 24, 2021

Author: Seunghoe Kim @ Talon

Executive Summary

Raccoon Stealer는 감염 PC내 정보를 탈취하는 악성코드이다. CIS 국가 출신 해커(그룹) 이 판매하는 스틸러 악성코드로, 활발히 유포되어 각종 계정 정보를 지속적으로 탈취하고 있다. 탈취된 정보는 Credential Stuffing 등의 기법으로 기업 내 침투 또는 추가적인 개인 정보 탈취에 이용되고 있다.

이번 분석에 사용한 샘플의 경우 Vidar Stealer에도 적용된 바 있는 DerpLoader로 패킹되어 있다.

CIS: Commonwealth of Independent States 의 약자로 1991년 소련(소비에트 연방)의 해체로 독립한 국가들의 국제기구. 러시아, 몰도바, 벨라루스, 아르메니아, 아제르바이잔, 우즈베키스탄, 카자흐스탄, 키르기스스탄, 타지키스탄이 공식 회원국으로 참여하고 있으며 투르크메니스탄, 몽골, 아프가니스탄은 비공식 참관국으로 참여하고 있음

본 보고서에서 분석한 Raccoon Stealer 샘플의 특징은 다음과 같다.

  1. 특정 텔레그램 프로필을 통해 C2 서버 지정
  2. 기본 수집 항목
    - 브라우저에 저장된 계정 정보, 쿠키, 자동완성 데이터, 신용카드 정보
    - 메일 어플리케이션에 저장된 계정 정보
    - 패스워드 관리 프로그램의 데이터베이스
    - 암호화폐 지갑
    - 상세한 시스템 정보
    - 스크린캡쳐
  3. C2에 감염 성공한 봇 ID 등록 시 응답으로 전송되는 설정 내용에 따라 추가 행위 수행 가능
    - 브라우저 히스토리 수집
    - 지정한 경로에서 조건에 맞는 파일들을 수집
    - 스크린샷 촬영
    - 지정된 URL의 파일 다운로드 후 실행 (Dropper 기능)
    - 자가삭제
  4. Raccoon Stealer 가 이용하는 설정파일 내 러시아어가 다수 포함되어 있는걸로 보아 러시아를 기반으로 하는 그룹에 의해 제작된 것으로 추정됨

5. Raccoon Stealer 의 정보 탈취 대상 어플리케이션 목록은 아래와 같음

Related Article

W1 Feb| EN | Story of the week: Stealers on the Darkweb

Sample Info

MD5: ff8789097f9b226cecc127d0a301f676
SHA1: 912bb98de73078c71fdd79185d0e4455b8a953c2
SHA256: 3c5120a6e894b64924dc44f3cdc0da65f277b32870f73019cefeacf492663c0e

Rich Header

주의 ! 아래부터는 상세 분석 내용으로 매우 어렵게 작성되어 있으니, 간략한 정보만 원하는 구독자분께서는 여기까지만 보시길 권장합니다.

Detailed Analysis

Stage 1 — TEA decryption (Obfuscated)

  1. 분석을 방해하기 위한 목적의 더미 코드가 다량 배치되어 있다.

2. Busy Wait 루프 활용

1) 0부터 n까지 루프 카운터를 1씩 증가시키다가, 특정 값에 도달하는 등의 조건을 달성하면 필요한 코드가 실행된다.
2) 인자 없이 호출 가능하거나, 0(NULL)을 인자로 주어 호출하더라도 실행 흐름에 영향을 주지 않는 윈도우 API들(GetAncestor, GetLastError 등)을 Busy wait 루프 내에서 호출한다. 윈도우 API 호출을 기록하는 종류의 샌드박스를 통한 동적 분석을 방해하고자 하는 의도로 추측한다.
3) 이러한 루프 속에 더미 코드가 함께 들어 있는데, 실제로는 실행되지 않는 함수들이 많다. 절대로 충족될 수 없는 조건을 설정한 조건문을 이용하여 실행되지 않는 더미 코드를 삽입한다. 공통적으로 함수의 인자에 대부분 0을 채워서 프로토타입과 일치하도록 모양만 갖추고 있다.

3. TEA 알고리즘을 이용하여 암호화 된 payload를 복호화하며, 복호화 된 payload를 함수처럼 호출한다.

Stage 2 — XOR decryption & unpacking

  1. Stage 1의 최종 payload는 shellcode 형태이며, 간단한 알고리즘으로 생성된 키 스트림과 데이터를 XOR하여 복호화하며 필요한 경우 압축된 데이터를 언패킹한다.
  2. 간단한 해싱을 통해 현재 프로세스 모듈에서 kernel32.dll 모듈을 찾고, LoadLibraryA와 GetProcAddress의 주소를 획득한다.

3. 사용된 hash 함수를 python으로 표현하면 다음과 같다.

def hash(s):
h = 0
for c in s:
t = ord(c) | 0x60
h = 2 * (t + h)
return h

4. 이후에는 해싱을 활용하지 않고, 방금 획득한 LoadLibraryA와 GetProcAddress를 이용하여 kernel32.dll의 핸들을 얻은 후 GetProcAddress에 필요한 함수 이름을 직접 넣어 주소를 획득한다.

5. 현재 프로세스의 모듈 스냅샷을 성공적으로 획득할 경우 데이터 복호화를 시작한다.

6. 정해진 규칙에 따라 XOR 키를 생성하여 복호화를 수행하고, 데이터가 압축되어 있는 경우 언패킹한다.

7. 복호화 및 언패킹이 끝난 코드로 점프하여 Stage 3으로 진입한다.

XOR 복호화 방식 관련 추가 내용

  1. XOR Key 생성 함수
    XOR Key 생성 함수 실행 결과의 LOBYTE 부분을 키로 사용하여 1Byte를 복호화하고, 중간값을 저장해 두었다가 다음 1Byte를 위한 key를 생성할 때 그 값을 재사용한다.
  2. Unpacking
    Payload 정보를 담고 있는 부분에 데이터 압축 여부가 boolean 값으로 저장되어 있으며, 해당 값이 참인 경우 실제 데이터의 크기만큼 메모리 할당 후 언패킹을 수행한다.

Stage 3 — Unpacking & Process hollowing

  1. Stage 1의 최종 payload와 마찬가지로 Stage 2의 최종 payload도 shellcode 형태이며, 필요한 경우 언패킹을 수행하고 최종적으로 Process hollowing을 통해 Raccoon stealer를 실행한다.
  2. PEB에서 이미지 베이스 주소를 얻은 후, 그 값을 이용해 수동으로 kernel32.dll의 핸들과 GetProcAddress의 주소를 획득하고, 두 값을 이용하여 LoadLibraryA의 주소도 획득한다.
  3. 이후 GetProcAddress를 이용해 필요한 함수들의 주소를 획득한다.
  4. 데이터 압축 여부에 따라 지정된 주소에 저장되어 있는 데이터의 언패킹을 수행하거나, 임시로 할당한 버퍼에 복사한다.
    – 만약 압축이 되어 있어 언패킹을 수행할 경우, 이용되는 알고리즘은 Stage 2와 동일하다.
    – 본 샘플의 경우 데이터가 압축되어 있지 않아, 곧바로 복사가 이루어진다.
  5. 위 단계에서 복사하거나 언패킹한 PE 파일을 현재 실행중인 프로세스에 매핑하기 위해 Process hollowing을 수행한다.
    – ImageBaseAddress부터 실제 매핑에 필요한 용량만큼 페이지 보호 설정을 PAGE_EXECUTE_READWRITE로 변경한 뒤 memset을 이용해 해당 영역을 0으로 초기화한다.
    – 복사해 둔 PE 파일을 헤더 정보에 따라 초기화 된 영역에 매핑한다.
    – 모든 과정이 완료되면 패커에서 설정한 오프셋으로 점프하여 매핑 된 바이너리의 함수를 호출한다.

Stage 4 — Final payload

Raccoon stealer의 본체

MD5: ec2e3d86a8ef4c3bf56a02bac36775a2
SHA1: 2b9b94c5ca0b741b1b08bfd02f6aea335014b065
SHA256: 93e42ca54963eceb81845cda8e38c5880eec9acd4372aa1d40fc6f250293fdc2
Rich Header

String decode

Raccoon stealer 내부에서 사용하는 string은 1바이트 XOR key로 encode되어 있으며, 다음 중 하나의 방법을 이용하여 문자열 사용 전 decode를 수행한다.

Type 1: Key = ~encoded_data[0]
Type 2: Key = encoded_data[0]

상세 분석 결과

최초 실행 시 중복 실행 방지를 위한 Mutex와 실행 권한, 기본 언어 설정을 확인한다.

Mutex: “uiabfqwfu” + username

Local System 권한으로 실행 중인 경우 explorer.exe 프로세스를 찾아 토큰 복제 후 해당 토큰을 이용해 explorer.exe 프로세스를 추가 생성함

기본 언어 설정을 확인하여 러시아를 포함한 CIS 국가들의 언어로 설정된 경우 프로그램을 종료한다.

  • 확인 언어: 러시아, 우크라이나, 벨라루스, 카자흐스탄, 키르기스탄, 아르메니아, 타지크스탄, 우즈베키스탄
  • CIS 국가에서 생산된 악성코드가 가지는 대표적인 특징이며, Raccoon stealer를 CIS 국가 출신 해커/그룹이 제작했을 가능성이 매우 높다.

이후, XOR encode된 RC4 Key를 decode한다.

RC4 Key: 245a32736074656e5c40624539767a52 (HEX)

Base64 encode된 RC4 Ciphertext를 상기의 키로 복호화하여 URL을 획득한다.

추출된 URL => https://telete[.]in/bpa1010100102

브라우저로 해당 URL 접속 시 다음과 같은 화면을 볼 수 있다.

해당 URL로 GET 요청을 보낸 후, 응답을 받아 적절한 형태로 가공한다.

  • 텔레그램 프로필의 Bio 부분을 얻은 후 앞에서부터 5바이트, 뒤에서부터 6바이트를 제거한다.
  • 결과물을 Base64 Decode 후 바이너리 내에 평문 상태로 하드코딩 된 RC4 Key를 이용하여 복호화한다.
RC4 Key: “4292d8c9b241f3ea28116d4762c9b76c” (String)
  • 복호화 결과, C2 주소는 아래와 같다.
http://34.89.59[.]109/
  • Response Header를 통해 nginx로 운영됨을 확인할 수 있었다.
  • 따라서, 해당 스틸러와 연결된 텔레그램 계정 프로필의 Bio 메시지를 수정하여 동적으로 C2 주소를 변경 가능함을 알 수 있다.
  • HKLM 키의 값을 읽어 대문자로 바꾸고, 현재 사용자 이름 및 바이너리 내에 Base64 encoding & RC4 encryption의 조합으로 저장된 토큰 값과 합쳐 최종적으로 C2에 POST 요청으로 보낼 데이터를 생성한다.
Example아래와 같은 시스템이 있다고 가정해 본다.
MachineGuid = “f2c01c55–365c-4752-a423-a869227e643a”
username = “user”
C2에 보낼 데이터는 아래와 같다.
b=F2C01C55–365C-4752-A423-A869227E643A_user&c=e3de2e9c9bdeac0c27582c1340ec7fc75cb896be&f=json
C2 전송 데이터 생성 코드
  • 생성된 데이터를 RC4로 암호화 & Base64 encode 후 C2로 전송한다.
Example(위 예시와 동일한 시스템)RC4 Key: 245a32736074656e5c40624539767a52 (HEX)
C2 전송용 최종 데이터
o2xvQ4i1NQYOtL2IzpgwpJkCVuWGaJf7mN4n6RnDELYOKE1Ng1J3flpUrInASPL45vM87sQgDH/ZWVWmkMQ9pdR00ISE72dMbHgO/u5i7v1XZQMKHomGD76XnAPB
  • C2 서버에서 json 형태의 config(설정값)을 반환한다. 해당 설정값에는 현재 접속한 PC의 IP와 위치정보 및 어느 경로에서 어떤 기준으로 파일을 훔쳐올 지 설정하는 내용이 포함되어 있다.
  • 다양한 암호화폐 지갑 및 패스워드 저장 프로그램의 데이터를 수집한다. 수집 대상은 아래와 같다.
1. Wallet: Bither, Atomic, Electrum, Electrum-LTC, Electroncash, Ethereum, Exodus, Jaxx, Monero, MyMonero, Guarda 및 Roaming이나 LocalLow 하위 폴더에 wallet.dat이라는 이름의 파일로 지갑 정보를 저장하는 기타 지갑들2. 관련 비밀번호는 1Password 와 Bitwarden 이라는 패스워드 관리 도구로부터 탈취를 시도함3. 브라우저 정보 수집
  • 브라우저 정보 수집은 아래와 같은 방법을 이용한다.
  1. 딕셔너리 형태의 config에서 “au” 키의 값을 읽어 C2 주소와 합친 경로에서 sqlite3.dll 파일을 %USERPROFILE%\AppData\LocalLow\sqlite3.dll 에 다운로드한다.
  2. C2로부터 다운받은 sqlite3 라이브러리를 활용하여 브라우저 데이터를 수집한다. 기본적으로 Login Data, Cookies, User data, Web Data를 수집한다. 최종적으로는 ID, 비밀번호, 쿠키, 자동완성 데이터, 신용카드 정보 등을 탈취한다. 브라우저 확장 프로그램 형태의 암호화폐 지갑도 수집하며 수집 대상은 Brave wallet, MetaMask wallet 등이다.
  3. config의 is_history_enabled 키 값이 1인 경우 Browser History도 함께 수집한다.
  4. Internet Explorer의 자동완성 및 저장된 계정 정보 및 Windows Vault에 저장된 계정 정보를 수집한다.
  5. 딕셔너리 형태의 config에서 “ls” 키의 값을 읽어 C2 주소와 합친 경로에서 zip으로 압축된 파일을 %USERPROFILE%\AppData\LocalLow\gC9tT2iQ3s\pY4zE3fX7h.zip 에 다운로드 후 압축을 해제한다. 압축 해제 결과, DigiCert에서 발행된 Mozilla Corporation의 인증서로 서명이 된 DLL 파일들이 들어 있음을 확인할 수 있었다.
  6. 압축 해제 후 생성된 파일의 생성 및 수정 시간을 인위적으로 변경한다. (2019년 3월 14일 오후 3시 20분 52초)
  7. 압축을 해제하여 얻은 Mozilla DLL을 활용하여 Mozilla 제품 및 파생 제품에서 데이터를 수집한다. 수집 대상은 Firefox, Waterfox, SeaMonkey, Pale Moon, Thunderbird 등이다.
  8. Email Application 관련 계정 정보를 수집한다. 수집 대상은 Thunderbird, Outlook, Foxmail 등이다. Foxmail 의 경우 수집 경로가 고정 되어 있어, 특정 경로에 설치된 경우에만 계정 정보 수집이 가능하다. 수집 가능 경로는 다음과 같다. D:\Program Files\Foxmail 7.2\Storage, D:\Program Files (x86)\Foxmail 7.2\Storage, D:\Foxmail 7.2\Storage, C:\Program Files\Foxmail 7.2\Storage, C:\Program Files (x86)\Foxmail 7.2\Storage, C:\Foxmail 7.2\Storage
  9. 피해자 정보를 취합한다. C2 서버에 피해 시스템 등록 시 응답으로 주어진 config 내에 포함된 정보를 일부 활용한다. 취합되는 피해자 정보는 아래와 같다.
    1) IP, Location (Country, State, City, Zip, Latitude, Longitude)
    2) %USERPROFILE%\AppData\LocalLow\iK0eK1lK3k 디렉터리를 생성한 후, config[“c”][“m”] 내의 조건에 맞는 파일을 지정된 경로 및 하위 디렉터리에서 찾아 복사한다. 또한, machineinfo.txt 에 아래와 같은 시스템 정보를 기록한다.
1) Raccoon 버전 및 빌드 날짜 — 본 샘플의 경우 1.7.3 | Sat Feb 27 21:25:06 2021
2) Raccoon 실행 시간
3) Bot ID ({MACHINEGUID}_{username})
4) Platform (Battery 존재 여부로 laptop/desktop 구분)
5) 수집한 쿠키, 패스워드, 파일 수
6) 시스템 정보
- 시스템 언어, Timezone, IP, Location, 컴퓨터 이름, Username, Windows version, Product name, System arch (x64 or x32), CPU 정보, RAM 용량 및 현재 사용량, 화면 해상도, 디스플레이 장치

10. 최종적으로 수집된 데이터를 압축 및 전송한다.

11. config[“is_screen_enabled”] 값이 1인 경우, 현재 시스템의 스크린샷을 압축파일에 추가한 후, C2 서버로 압축 파일을 전송한다.

12. config 을 통해 Dropper 기능이 설정된 경우, 지정된 URL에서 파일을 받아 ShellExecuteA 함수로 실행한다.

config[“lu”] == [{“t”: Drop file type (1이면 DLL, 1이 아니면 EXE), “u”: Drop file URL, “f”: function name for DLL}, …]Drop file URL에서 다운로드한 파일을 %TEMP% 경로에 랜덤 생성한 이름으로 저장한다.
DLL은 rundll32.exe를 이용해 실행하고, EXE는 그냥 실행한다.
함수 이름이 주어진 경우 rundll32.exe drop_file_name,function_name 과 같이 특정 함수를 지정하여 실행한다.

13. 자가삭제 기능이 설정된 경우 cmd 명령을 이용해 스스로를 삭제한다.

cmd.exe /C timeout /T 10 /NOBREAK > Nul & Del /f /q “%s”

결론 및 대응방안

현재 활발히 유포되고 있는 Stealer 악성코드는 Raccoon 외에도 Vidar, Azorult, Taurus, Redline, Ficker 등 다양하다. 해당 악성코드들의 행위적 특성과 유포 방식 등에 대한 정보를 꾸준히 습득하는 것이 필요하며, 관련 정보는 본 미디엄에 꾸준히 업데이트 될 예정이다.

Stealer 악성코드에 의해 탈취된 계정은 다크웹 내에서 꾸준히 거래되고 있으며 당사는 해당 정보를 지속해서 탐지하고 있다.

S2W LAB에서 탐지한 정보는 당사 CTI 솔루션인 Xarvis Enterprise 를 통해 확인 가능하며, 고객 및 임직원 보호를 위한 조치를 수행할 수 있다.

Credential Leak Monitoring Dashboard, Xarvis Enterprise

--

--

S2W
S2W BLOG

S2W is specializing in cybersecurity data analysis for cyber threat intelligence.