해적은 금보다 더 가치가 있다: 새로운 macOS 백도어가 암호화폐 지갑을 훔친다

맬웨어 설명

 6 분. 읽기 위해

저자

  • 세르게이 푸잔

한 달 전, 우리는 불법 복제 소프트웨어 사이트에서 프록시 트로이 목마에 감염된 애플리케이션이 배포되는 것을 발견했습니다 . 그런 다음 공격자는 이미 해킹된 애플리케이션을 PKG 파일로 수집하고, 프록시 트로이 목마와 프로그램이 설치된 후 실행되어 감염을 시작한 스크립트를 추가했습니다. 최근 우리는 macOS용으로 불법 복제 소프트웨어와 함께 배포되는, 이전에 알려지지 않았던 또 다른 악성 소프트웨어 계열을 발견했습니다. 이번 위협은 무단 프록시 서버 설치보다 훨씬 더 심각했습니다.

1단계. Activator.app

우리가 찾은 샘플은 macOS 13.6 이상에서 실행됩니다. 이 단계에서는 공격자가 Intel 프로세서를 탑재한 기기와 Apple Silicon을 탑재한 기기 모두에서 새로운 운영 체제 사용자만을 표적으로 삼고 있다고 결론 내릴 수 있습니다. 손상된 디스크 이미지에는 소위 “활성화기”와 원하는 애플리케이션 자체가 포함되어 있습니다. 디스크 이미지를 실행(마운팅)한 후 사용자에게 다음 지침이 포함된 창이 표시됩니다.

설치 지침이 있는 창

지침에는 애플리케이션을 /Applications/ 폴더에 복사한 다음 “Activator”를 실행하라고 설명되어 있습니다. 겉보기에는 매우 간단해 보입니다. “PATCH” 버튼 하나만 있고, 이를 누르면 시스템에서 사용자에게 비밀번호를 묻습니다.

활성화 창 및 비밀번호 입력 양식

이 “Activator”의 “후드 아래”를 살펴보면 흥미로운 사실을 바로 알 수 있습니다. 어떤 이유에서인지 이 애플리케이션은 Python 3.9.6 설치 패키지와 tool 이라는 추가 Mach-O 파일을 Resources 폴더에 저장합니다 . GUI 라는 이름을 가진 Fat Mach-O 유형의 주 파일은 실제로 동일한 “PATСH” 버튼을 구현하며 이를 누르면 두 가지 이벤트가 발생합니다.

  • Python 설치 패키지는 임시 파일과 함께 /tmp/ 디렉토리에 복사됩니다.
  • 리소스 폴더의 실행 파일 도구는 관리자 권한으로 시작됩니다. 이를 위해 Activator는 현재는 사용되지 않는 AuthorizationExecuteWithPrivileges 함수를 사용합니다 . 이 함수는 관리자 비밀번호를 입력하기 위한 창을 호출합니다.

도구는 실행 후 먼저 시스템에 Python3가 설치되어 있는지 확인하고, 설치되어 있지 않으면 이전에 /tmp/ 에 복사한 패키지에서 Python3를 설치합니다 . 다음으로, 다운로드한 애플리케이션의 실제 “패치”가 발생합니다. 도구는 수정된 실행 파일의 처음 16바이트를 “Activator” 코드에 내장된 시퀀스와 비교하고 일치하면 제거합니다.

실행 파일의 처음 16바이트 확인

재밌는 점은 이후에 애플리케이션이 작동하게 되고, 더구나 실제로 “해킹”된 것으로 밝혀진다는 것입니다. 문제는 공격자가 이미 해킹된 버전의 애플리케이션을 사용했고, 사용자가 “Activator”를 실행하도록 강제하기 위해 실행 파일의 시작 부분에 여러 바이트를 추가하여 작동 불능으로 만들었다는 것입니다.

2단계. 부트로더

패치가 완료되면 주요 페이로드가 실행됩니다. 즉, 샘플은 C2에 연락하여 암호화된 스크립트를 다운로드합니다. 서버 주소를 얻기 위해 프로그램은 코드에 하드코딩된 두 개의 단어 목록에서 URL을 조립하고, 5글자 랜덤 시퀀스를 3차 도메인으로 추가합니다. 주소를 수신하면 샘플은 해당 도메인의 TXT 레코드를 얻기 위해 DNS 서버에 쿼리를 보냅니다. 이는 명령 센터와 통신하고 트래픽에서 활동을 숨기는 다소 흥미롭고 특이한 방법으로, 메시지가 DNS 서버에서 반환되므로 악성 페이로드가 로드될 것이 거의 확실합니다. TXT 레코드에는 애플리케이션에 필요한 도메인에 대한 다양한 정보가 포함될 수 있으므로 이러한 레코드에 대한 요청 자체는 완전히 정상적으로 보입니다.

코드에 포함된 단어의 가능한 조합을 살펴본 결과(연구된 모든 샘플에서 조합은 동일함) 모든 2차 도메인 중 imohub[.]net 하나만 작동한다는 것을 발견했습니다. 이 경우 어떤 3차 도메인을 사용하는지는 중요하지 않습니다. 중요한 것은 해당 도메인이 요청에 포함되어 있다는 것입니다. DNS 서버로부터 수신한 응답에는 세 개의 TXT 레코드가 포함되어 있으며, 프로그램은 이후 이를 처리하여 완전한 메시지로 조립합니다. 각 항목은 암호문의 Base64로 인코딩된 부분으로, 첫 번째 바이트에는 어셈블리 중에 제거되는 시퀀스 번호가 들어 있습니다. 결과 암호문은 CBC 모드 에서 AES 알고리즘을 사용하여 암호화됩니다 . 복호화된 메시지는 다음과 같은 Python 스크립트입니다.

복호화된 스크립트

도구 를 실행하기 전에 다음 작업을 수행합니다.

  • 스크립트의 해시를 계산하고 이전에 실행되었는지 확인합니다. 이를 위해 환경 변수에서 lastExecutedScriptHash 키를 찾고 , 있으면 결과 해시를 이 키 아래에 저장된 데이터와 비교합니다. 해시가 일치하면 스크립트가 실행되지 않습니다. 두 값이 다르면 도구는 스크립트를 실행하고 변수의 해시를 대체합니다. 키가 환경 변수에 없으면 도구는 키를 생성하고 현재 스크립트의 해시를 저장합니다.
  • 스크립트 코드의 링크에 있는 “_g_”를 해시 합과 비슷한 무작위 64자 시퀀스로 바꿉니다.
  • 시스템의 알림을 담당하는 모든 NotificationCenter 프로세스를 초당 10회 종료하는 스크립트를 /var/root/Library/Caches/<uuid>.py 경로에 작성합니다 .NotificationCenter 프로세스 종료
  • 시스템 재시작 후 스크립트를 자동으로 시작하는 역할을 하는 두 개의 에이전트를 /Library/LaunchAgents/launched.<uuid>.plist 경로에 작성합니다 .자동 실행 에이전트 코드

복호화된 스크립트의 코드에서 볼 수 있듯이, 이 스크립트는 30초마다 apple-health[.]org 주소에 접근하여 다음 스크립트를 다운로드하고 실행하려고 시도합니다. 완료하는 데 14,400초가 걸리며, 그 후에 프로세스가 완료되고 스크립트의 새 버전이 로드됩니다.

3단계. 백도어

처음에는 apple-health[.]org C2 서버가 우리의 요청에 응답하지 않았기 때문에 다운로드한 Python 스크립트가 오래되었다고 생각했습니다 . 하지만 얼마 후에도 우리는 또 다른 Python 스크립트 형태로 악성 페이로드를 받는 데 성공했습니다. 마침내 공격자가 추구하는 목표가 드러납니다. 주 목적은 서버로부터 수신한 임의의 명령을 실행하는 것입니다. 명령 처리를 담당하는 코드를 보면, 이 역시 Base64로 인코딩된 Python 스크립트일 것입니다.

수신된 명령을 실행하는 코드 섹션

스크립트는 명령을 실행하는 것 외에도 다음 정보를 수집하여 서버로 전송합니다.

  • 운영 체제 버전
  • /Users/ 의 디렉토리 목록
  • 비어 있는 av 필드는 아마도 향후 버전에서 바이러스 백신 소프트웨어의 존재에 대한 정보로 채워질 것입니다.
  • 설치된 애플리케이션 목록
  • 프로세서 유형
  • 장치의 외부 IP 주소
  • 빈 ver 필드는 페이로드 버전에 대한 정보를 전송하는 데 사용될 것으로 예상됩니다.

연구 당시 서버는 아무 명령도 반환하지 않았고, 얼마 후에는 전혀 응답하지 않았다는 점이 주목할 만합니다. 그래서 3단계 Python 스크립트를 다시 다운로드했고, 새로운 버전에 변경 사항이 있음을 발견했습니다. 특히, 프로그램 시작 부분에 저장되어 C2 서버의 IP 주소와 도메인, GUID, 프로그램 버전 등을 나타내는 소위 메타데이터가 변경되었습니다. 이 데이터는 서버의 IP 주소가 변경되는 즉시(대략 10~20분마다) 스크립트에서 자동으로 업데이트됩니다. 그러나 인간의 개입 없이는 발생할 수 없는 코드의 기능적 부분에 직접적인 변경 사항도 있었습니다. 예를 들어 다음과 같습니다.

세 가지 버전의 스크립트 비교(왼쪽에서 오른쪽으로: 첫 번째 버전 18c564a5cc4b7414df8345a8bdce7418, 다음 두 버전: f4282d7e32c7e8ab4e075c572ac43803, 352f0d288e612e4f66c50aaf9214a81d)

이는 악성 소프트웨어 캠페인이 아직 개발 단계에 있음을 시사합니다. 공격자가 명령을 작성할 시간이 없었기 때문에 우리가 서버로부터 명령을 받지 못했을 수도 있습니다.

4단계. 오래된 암호화폐 도둑

위의 기능 외에도 스크립트 코드에는 check_exodus_and_hash() 와 check_btccore_and_hash()라는 두 가지 흥미로운 함수가 포함되어 있습니다.

감염된 Exodus 지갑을 로드하는 데 책임이 있는 코드 섹션

두 기능 모두 추가 다운로드를 위한 호스트 역할을 하는 apple-analyser[.]com 도메인을 사용합니다. 이 기능은 비슷한 목적을 가지고 있습니다. 기기에 해당 암호화폐 지갑 앱이 있는지 확인하고, 있다면 apple-analyser[.]com 에서 다운로드한 앱으로 바꿔줍니다 . 앱 자체 외에도 Exodus의 “새로운” 버전을 실행하기 위한 Electron 프레임워크의 클린 버전과 위 스크린샷의 코드에서 언급된 Exodus.scpt 도 저장합니다. Exodus.app 이 시작될 때 다음 Shell 명령을 실행 하는 데만 필요한 컴파일된 AppleScript 스크립트입니다 .

12do shell script “~/electron/Electron.app/Contents/MacOS/Electron ~/exodus”quit

공격자들은 정말로 도덕적 피해에 대한 “보상”으로 피해자들의 지갑 애플리케이션을 최신 버전으로 업데이트하도록 돕기로 결정했을 만큼 신경을 쓰고 있을까요? 아쉽게도 최선의 희망은 허무하게 끝났습니다. 두 지갑 모두 악성으로 판명났습니다.

Exodus 애플리케이션 에서 공격자는 애플리케이션이 시작될 때 가장 먼저 실행되는 main/index.js 파일 에 바로 창의성을 삽입했습니다 .

악성 애드온이 포함된 main/index.js 파일의 일부

스크린샷에 표시된 코드에서 우리는 애플리케이션 어딘가에 데이터가 334b4425988b47a5b67c92518f9815c6 이라는 채널로 전송되어야 하며, 이 채널은 22[.]imohub[.]workers[.]dev 로 전송되어야 한다는 것을 알 수 있습니다. 글쎄요, 우리가 해야 할 일은 데이터가 이 채널로 전송되는 위치를 찾는 것뿐입니다. 바로 wallet/index.js 파일입니다. 파일 코드에는 줄 바꿈이나 들여쓰기가 없으므로 이를 일반 형식으로 변환한 다음 그 안에서 무슨 일이 일어나는지 살펴보겠습니다.

wallet/index.js 파일의 내용

지갑 잠금 해제를 담당하는 핸들러에서 공격자는 입력된 시드 문구를 채널로 전송하는 간단한 함수 호출을 추가했으며, 채널에서 해당 시드 문구가 C2 서버로 전송됩니다. 더 이상의 혁신은 없다.

Bitcoin-Qt 는 더 이상 JavaScript 파일이 아니라, 본격적인 Mach-O입니다. Exodus 애플리케이션 의 C2 서버 코드를 검색한 후 , 우리는 Bitcoin-Qt 의 원리가 비슷하다는 결론에 빠르게 도달했습니다 . 이 애플리케이션은 지갑을 잠금 해제하는 데 사용되는 비밀번호를 훔치고, 동시에 지갑 자체, 이름 및 잔액을 훔칩니다.

C2로 데이터를 전송하는 역할을 하는 코드 조각

따라서 제어 서버로부터 명령을 받지 않더라도 프로그램은 여전히 ​​사용자의 암호화폐 지갑을 훔쳐 사용자에게 심각한 피해를 입힐 수 있습니다.

결론

공격자에게 있어서 해킹된 버전의 애플리케이션은 피해자의 컴퓨터에 침입하는 가장 쉬운 방법 중 하나입니다. 권한을 높이려면 비밀번호만 요청하면 되는데, 이는 일반적으로 프로그램을 설치할 때 사용자에게 의심을 불러일으키지 않습니다. 그러나 설명된 악성 캠페인의 작성자는 특히 DNS 서버의 도메인에 대한 TXT 레코드에 Python 스크립트를 삽입함으로써 뛰어난 독창성을 보였다는 점에 주목할 가치가 있습니다. 그런 다음 이 스크립트는 자동 실행 에이전트 목록에 추가되고 무한 루프로 다음 단계 페이로드를 다운로드하여 실행하여 공격자가 감염된 장치에 업데이트를 제공할 수 있도록 합니다. 마지막 페이로드는 관리자 권한으로 모든 스크립트를 실행할 수 있고, 장치에 설치된 Exodus 및 Bitcoin 암호화폐 지갑 애플리케이션을 감염된 버전으로 바꿔 지갑 잠금이 해제될 때 입력된 비밀 문구를 훔칠 수 있는 백도어입니다.

손상의 지표

MD5

MD5유형제목/설명
c88c28149387ccf52ca3869442533fd9뚱뚱한 마하-오그래픽 사용자 인터페이스(GUI)
a5924fff42d60a732853da167a743182뚱뚱한 마하-오그래픽 사용자 인터페이스(GUI)
9c0e8d45cbf5cae428bef90b5824e5b1뚱뚱한 마하-오그래픽 사용자 인터페이스(GUI)
a9231044dd45a85a0bf45e01584bf213뚱뚱한 마하-오그래픽 사용자 인터페이스(GUI)
2ed32d3df8b4a2ef891b44a6397cf6ea뚱뚱한 마하-오그래픽 사용자 인터페이스(GUI)
7fd9a401fd0d7901cf4494333d1896cb뚱뚱한 마하-오그래픽 사용자 인터페이스(GUI)
e12566cd9d72a9b56d5e53f00b7d2d53뚱뚱한 마하-오그래픽 사용자 인터페이스(GUI)
4c2ec35d13c5f44000caf658e40e444c뚱뚱한 마하-오그래픽 사용자 인터페이스(GUI)
4886a687ada61fc7f53b41f6020e76cc뚱뚱한 마하-오그래픽 사용자 인터페이스(GUI)
c7178d08c13f3e49a6ebefe23d1fedff뚱뚱한 마하-오그래픽 사용자 인터페이스(GUI)
캐드3081fc6174ca4a4c18b8f73b3fe59뚱뚱한 마하-오그래픽 사용자 인터페이스(GUI)
3a89719527d51e7c60854704e9f49a32뚱뚱한 마하-오도구
5밥5바8씨509아9바아5db246d932아099에프뚱뚱한 마하-오도구
948c1bdc9edf3e57758b677a0a449f34뚱뚱한 마하-오도구
e64773b03ad1eae52180c2b58907f1f6뚱뚱한 마하-오도구
3f89644dfc394e888a741f6c09638d98뚱뚱한 마하-오도구
29a35e0e65bba727a97747acdf921c09뚱뚱한 마하-오도구
3b357b8d65537d40e87599c5329d2a3d뚱뚱한 마하-오도구
아데데572ad9599e331592103f9eea2a2뚱뚱한 마하-오도구
a386380e03097055c24b0f35263d5492뚱뚱한 마하-오도구
67e1f194c37968bb2edaf469bf40b837마하-오비트코인-Qt
005fb6dee90eeefa89d6400f7a06d058자바스크립트메인/index.js
바41c9f6d89671b729eafbe6d5f1c85e자바스크립트지갑/index.js
95c86de53ad9ca116f8c6eb2e6a152f5디엠지Aiseesoft 블루레이 플레이어 6.6.38.dmg
be7e6e625d15d30ff47e34ebb1ee4511디엠지자전거 1.18.0.dmg
2ebfe93a39ce3fcecca883b5f182029e디엠지최종 초안 12.0.10.dmg
e5f12e92b1fa956d02d35d6224abdbc8디엠지Keep It 2.3.7.dmg
3af3d6ba3c80b7bf5d67deddb2971c61디엠지옴니리더 프로 2.6.8.dmg
29b1ba90407a93400e062fb65dc9b667디엠지심플마인드 프로 2.3.0.dmg
a33b6c5905cefced329fa89f5eebb481디엠지SyncBird Pro 4.0.8.dmg
71eefe83f836ebceadc9f68ff0e37d3b디엠지xScope 4.7.0.dmg
d1177ed07dddb09415c175a205143eb6디엠지스윈시안 3.0.dmg
b2d519d13125c29832b132e927fd141b디엠지인퓨즈 프로 7.6.6.dmg
609596d15e684f4a8ea80b7ee4b8c6a8디엠지내 iPhone 2.4.9.dmg를 수정하세요
bbe4c19f3b675705073ba3e8a560b768디엠지옴니 툴박스 1.5.1.dmg
9124843fdbf27e7b31d2f883042021a9파이썬 스크립트두 번째 단계
ff608ab027db4d1e076c1d8098e8dc8a파이썬 스크립트두 번째 단계(알림 비활성화 도구)
f4282d7e32c7e8ab4e075c572ac43803파이썬 스크립트세 번째 단계
09ab22fcf21385cc5702ec52ac4eca02파이썬 스크립트세 번째 단계
352f0d288e612e4f66c50aaf9214a81d파이썬 스크립트세 번째 단계
948a90b43ade9dbc559fd27be404f9f0파이썬 스크립트세 번째 단계
18c564a5cc4b7414df8345a8bdce7418파이썬 스크립트세 번째 단계
3422f0cefa0c4612d18643bbf07a4a98지퍼비트코인-Qt
fb050f4c29a166480ff2f5a1fa8b9800지퍼비트코인-QtIntel
5abe156cb33b18a46c7279d9c52b1c64지퍼앱.zip
38e4ef0d9221b25510cc50bcc8f4b4e8AppleScript 스크립트엑소더스.scpt

주소 C2

imohub[.]net
22[.]imohub[.]workers[.]dev
apple-analyser[.]com
apple-health[.]org

해적은 금보다 더 가치가 있다: 새로운 macOS 백도어가 암호화폐 지갑을 훔친다

От