악성코드분석🍳/Windows

Raccoon Stealer v2(2.0) 악성코드 분석(2)

壓倒 2022. 12. 27. 10:26

○ 컴퓨터 상세 정보 탈취

sstmnfo_문자열의 존재 유무를 확인한 후 다음과 같은 정보를 탈취한다.

컴퓨터 기본 정보 탈취
No.대상 정보사용한 API 및 레지스트리 키
1Locale 정보GetUserDefaultLCIE()
2표준 시간대 정보GetTimeZoneInformation()
3운영체제 정보HKLM\\Current Version 하위 키
4아키텍쳐 정보GetSystemWow64Directory()
5CPU 정보GetSystemInfo()
6RAM 정보GlobalMemoryStatusEx()
7DisPlay 크기 정보GetSystemMetircs()
8모니터 이름 정보EnumDisplayDevicedsW()
9설치된 프로그램 목록SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall

탈취한 정보(computer_info)를 Internet_funI()의 인자로 하여 서버로 내보낸다.

Internet_fun()

Internet_fun()의 내부는 다음과 같다.

우선 연결하고자 하는 주소가 http로 시작하는지 확인한 후 http로 시작하지 않는다면 해당 함수를 종료한다.

http 문자열 검사

http일 경우 80포트 https일 경우 443포트를 활용하도록 지정하고 Post 요청을 보낸다. Post 요청을 보낸 후에는 add_data(computer_info) 를 인자로 하고 HttpSendRequest()를 실행하여 서버로의 정보 탈취를 수행한다.

서버로의 정보 탈취(컴퓨터 상세 정보)

○ sqlite3.dll 로드 및 크롬 관련 정보 탈취

sqlite3.dll을 로드하고 로드에 성공하였다면 사용자 관련 크롬 데이터를 탈취하기 위한 google_data_search() 함수를 실행한다.

사용자 관련 구글 데이터 탈취

○ google_data_search - (1)

공유 폴더 경로를 획득한 후 실제 사용자 관련 Chrome 정보를 탈취하는 함수로 진입한다.

chrome_info_steal()

공유 폴더의 하위 경로들을 탐색하며 경로에 User Data가 존재하는지 확인한다. 해당 경로의 존재 유무를 검사하는 원인은 C:\\Users\\사용자명\\AppData\\Local\\Google\\Chrome\\User Data 에 사용자 관련 Chrome 정보가 존재하기 때문이다.

경로 내 User Data 존재 유무 확인 코드

User Data 하위 디렉토리에 Local State 파일에 접근한다.

Local State 핸들 획득

Local State 파일을 읽고 데이터를 복호화 할 encrypted_key와 크롬 버전 정보인 stats_version를 파싱한다.

encrypted_key, stats_version 정보 파싱

User Data 하위 경로에 Login Data 문자열을 결합하여 C:\\Users\\사용자명\\AppData\\Local\\Google\\Chrome\\User Data\\Login Data 경로를 완성한다.

Login Data 경로 완성

C:\\Users\\사용자명\\AppData\\LocalLow 하위 경로에 Login Data 데이터를 복사할 랜덤파일을 생성한다.

공유 폴더 경로 하위에 랜덤 파일 생성
random_string_fun 내부

생성한 랜덤 파일에 Login Data를 복사하여 정보를 탈취한다.

정보 탈취 루틴(1)

sqlite3_open을 통해 데이터 베이스를 오픈하고 다음과 같은 SQL 명령오로 정보를 탈취한다.

데이터 베이스 관련 부분 중 일부
SELECT origin_url, username_value, password_value FROM logins

데이터 베이스에 정보를 저장한 후 생성한 랜덤 파일을 삭제한다.

랜덤 파일 삭제

크롬과 관련된 모든 정보의 정보 탈취는 동일한 방식으로 이루어지며 탈취 정보 목록은 다음과 같다.

💡
탈취 정보 목록(1)
No.정보사용되는 쿼리문
1Login DataSELECT origin_url, username_value, password_value FROM logins
2Network\\CookiesSELECT host_key, path, is_secure , expires_utc, name, encrypted_value FROM cookies
3CookiesSELECT host_key, path, is_secure , expires_utc, name, encrypted_value FROM cookies
4Web DataSELECT name, value FROM autofill
5Credit Card DataSELECT name_on_card, card_number_encrypted, expiration_month, expiration_year FROM credit_cards

○ nss3.dll 로드 및 FireFox 관련 정보 탈취

LoadLibraryW() 함수를 통해 nss3.dll을 로드하고 nss3.dll이 성공적으로 로드됐을 경우 API를 로드한다.

nss3.dll 로드 및 API 로드

API 로드 과정이 정상적으로 이루어졌다면 FireFox 관련 정보를 탈취하는 함수(Roaming_data())로 진입한다.

FireFox 관련 정보 탈취 함수로 진입

Roaming_data() 함수의 내부는 다음과 같다.

이전에 획득한 공유폴더(Roaming)에 와일드카드 문자열을 추가한 후 하위 디렉토리를 탐색한다.

하위 디렉토리 탐색

이후 디렉토리일 경우 해당 디렉토리가 Profiles 인지 검사한 후 Profiles일 경우 하위 디렉토리로 진입한다. Profiles 문자열을 검사하는 이유는 FireFox 정보가 FireFox\\Profiles 경로에 존재하기 때문이다.

Profile 문자열 검사

탐색 대상 경로에 Profiles 문자열이 존재하지 않거나 Profiles 폴더에 접근했을 경우 탈취 대상 정보를 획득하는 함수로 진입한다.

get_firefox_info()

탈취 대상 파일을 기존 경로에 결합한 후 랜덤 파일을 생성한다.

랜덤 파일 생성 및 탈취 대상 경로 결합

탈취 대상 파일을 생성한 랜덤 파일에 복사하고 SQL 쿼리문을 사용하여 탈취 대상 정보를 획득한다.

탈취 대상 정보 획득

추가로 탈취되는 정보도 동일한 방법을 사용하며 탈취 대상 목록은 다음과 같다.

탈취 대상 목록(2)
No.정보SQL 쿼리문
1cookiesSELECT host, path, isSecure, expiry, name, value FROM moz_cookies
2formhistorySELECT fieldname, value FROM moz_formhistory

해당 과정 사이에 wlts_, grbr, tlgrm_, scrnht문자열을 검사하는 루틴이 존재하였으나 C&C 서버가 다운되어 정확한 분석은 하지 못하였다. 하지만, 문자열로 추측을 할 때 텔레그램 관련 정보 탈취, 지갑 주소 관련 정보 탈취와 같은 행위를 한다고 추측할 수 있다.

텔레그램 문자열 검사(tlgrm_)
텔레그램 관련 데이터 복사
복사한 텔레그램 데이터 서버로 전송

○ 암호 화폐 지갑의 자격 증명 정보 탈취

Roaming 디렉토리 내부에 wallet.dat 파일이 존재하는지 검사한다.

wallet.dat 파일 존재 여부 검사

wallet.dat 파일이 존재할 경우 LocalLow 디렉토리 내 랜덤한 파일명을 가지는 파일을 생성한다. 이후 wallet.dat 파일의 데이터를 랜덤 파일에 복사한다.

wallet.dat 파일 데이터 복사

논리드라이브 또한 wallet.dat 파일이 존재하는지 검사한 후 존재할 경우 wallet.dat 파일의 데이터를 복사(wallet_data_steal)한다.

논리드라이브 내 wallet.dat 데이터 복사

wallet.dat 파일의 데이터가 존재하는 랜덤 파일의 데이터를 읽는다.

랜덤 파일의 데이터 읽기

랜덤 파일의 데이터를 서버로 전송하여 wallet.dat 데이터를 탈취한다

wallet.dat 데이터 탈취

○ 현재 화면 이미지 정보 탈취

비트맵 정보를 사용하여 현재 사용자가 사용하고 있는 화면 스크린샷을 탈취하기 위해 메모리 DC 객체를 생성하고 크기 및 해상도 정보를 수집한다.

DC 객체 생성 및 화면 정보 수집

이후 윈도우 화면 크기와 동일한 비트맵을 만들고 SelectObject() 를 사용하여 ho와 CompatibleBitamap_1 을 연결한다. 이후 비트맵을 복사한다.

비트맵 연결 및 복사

비트맵 이미지를 저장할 랜덤 파일을 생성하고 랜덤 파일에 스크린샷 이미지를 탈취한다.

랜덤파일 생성 및 스크린샷 이미지 탈취 코드
screen_save() 내부

실제 랜덤 파일을 열어보았을 때 사용중이던 화면과 동일한 이미지가 탈취된 것을 확인할 수 있다.

생성된 랜덤 파일
복사된 캡처본

○ 악성행위에 사용한 .dll 파일 자가 삭제

악성행위를 하기 위해 사용한 nss3.dll, sqlite3.dll 파일을 삭제한다. 이는 흔적을 최소화하기 위한 행동으로 추측된다.

.dll 파일 자가 삭제

MITRE ATT&CK Mapping

MITRE ATT&CK
ExecuteDefencse EvasionCredential AccessDiscoveryCollectionCommand and ControlExfiltration
Native APIDeobfuscate/Decode Files or InformationSteal Web Session CookieFile and Directory DiscoveryAutomated CollectionApplication Layer ProtocolExfiltration Over C2 Channel
  Obfuscated Files or InformationCredentialsfrom Password StoresProcess DiscoveryData from Local SystemIngress Tool Transfer  
  Process InjectionDynamic-link Library Injection   Query RegistryScreen Capture    
      Software Discovery      
      System Information Discovery      
      System TimeDiscovery      

오류, 잘못된 점 또는 궁금한 점이 있으시다면 댓글 남겨주세요❗


Uploaded by N2T