콘텐츠로 이동하기
위협 인텔리전스

수십만 달러 규모의 솔라나 암호화폐 도난 사건의 배후 - 악성 코드와 스마트 계약을 이용한 CLINKSINK Drainer 캠페인

2024년 1월 16일
Mandiant

사이버 보안 전문가 상담

글로벌 수준의 위협 인텔리전스와 클라우드 보안 전문가가 귀사의 비즈니스에 최적화된 보안 전략을 제안해 드립니다.

전문가에게 문의하기

* 해당 블로그의 원문은 2024년 1월 10일 Google Cloud 블로그(영문)에 게재되었습니다.


작성자: Zach Riddle, Joe Dobson, Lukasz Lamparski, Stephen Eckels


2024년 1월 3일, 맨디언트의 X 소셜 미디어(구 트위터) 계정이 해킹되어 악의적인 링크가 게시되었습니다. 이 링크는 암호화폐를 탈취하는 Drainer 악성 코드로 유도하는 피싱 페이지로 연결합니다. 맨디언트는 X사와 협력해 계정 해킹 문제를 해결한 후 며칠 간의 조사를 수행하였습니다. 이 과정에서 맨디언트나 구글 클라우드 시스템에서 발생한 악의적인 활동이나 침해가 이번 계정 해킹과 관련 있다는 증거는 없었습니다. 본 블로그 게시물은 이번 캠페인에서 위협 행위자 집단이 사용한 CLINKSINK라고 이름 붙인 Drainer 악성 코드 분석 내용을 소개합니다. ​

2023년 12월부터 다양한 위협 행위자들이 CLINKSINK Drainer를 사용해 솔라나(Solana, SOL) 암호화폐 사용자들의 자금과 토큰을 탈취하는 캠페인을 진행하였습니다. Drainer는 악성 스크립트와 스마트 계약으로 구성되어 있으며, 이를 통해 위협 행위자는 피해자가 거래를 승인하도록 속여 그들의 암호화폐 지갑에서 자금이나 토큰 같은 자산을 빼돌립니다.

​최근 확인한 캠페인에서 최소 35개의 제휴 ID가 포함되어 있는데, 이들은 CLINKSINK라는 DaaS(Drainer-as-a-Service)를 사용합니다. DaaS 운영자들은 도난당한 자금의 약 20%를 받는 조건으로 암호화폐를 훔치는 데 참여하고자 하는 개인이나 조직에 Drainer 스크립트를 제공합니다. 맨디언트는 이번 캠페인에 참여한 개인 또는 조직이 탈취한 자산 규모가 90억 달러에 이를 것으로 추정합니다.

CLINKSINK Drainer 캠페인 개요

최근에 발견한 몇몇 캠페인에서 위협 행위자들은 소셜 미디어와 채팅 애플리케이션을 활용해 암호화폐 관련 피싱 페이지로 피해자들을 유도했습니다. 이들은 X 및 디스코드 같은 플랫폼을 악용해 피해자를 유혹하는 전략을 사용했습니다. 이번 캠페인은 토큰 에어드롭을 가장해 피해자를 속였습니다. 참고로 에어드롭은 새로운 토큰이나 코인 홍보를 위해 무료로 사용자들에게 나누어주는 것을 말합니다. 관찰한 CLINKSINK 피싱 도메인과 페이지들은 Phantom, DappRadar, BONK 등 합법적인 암호화폐 자원으로 위장한 토큰 에어드롭 유인책을 광범위하게 활용했습니다. 이 피싱 페이지들은 피해자의 지갑에서 자금을 빼돌리기 위해 악성 CLINKSINK 자바스크립트 Drainer 코드를 로드했습니다.

피해자가 특정 웹 사이트로 접속하면, 토큰 에어드롭 이벤트로 피해자를 속여 암호화폐 지갑을 웹 사이트에 연결하도록 유도합니다. 지갑을 연결한 후 사용자가 암호화폐를 빼돌리는 거래에 동의하도록 Drainer 서비스에 거래 승인을 요청합니다. 이 과정을 통해 Drainer는 피해자의 자금을 들키지 않고 빼돌립니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/solana-cryptocurrency-theft-fig1b_jszk.max-2000x2000.png

그림 1. $PHNTM 에어드롭 피싱 페이지 예

https://storage.googleapis.com/gweb-cloudblog-publish/images/solana-cryptocurrency-theft-fig2_ffwn.max-1400x1400.png

그림 2. DappRadar 피싱 페이지 예

https://storage.googleapis.com/gweb-cloudblog-publish/images/solana-cryptocurrency-theft-fig3_0_eful.max-1400x1400.png

그림 3. BONK 피싱 페이지 예

초기 분석

분석한 CLINKSINK 파일(8650e83da50bd726f77311b729905c0d의 MD5 해시 값)은 아직 밝혀지지 않은 자바스크립트 난독화 방법을 사용해 읽기 어렵게 만들어졌습니다. 웹 사이트가 열리면, 이 파일은 피해자의 컴퓨터에 Phantom 데스크톱 지갑이 설치되어 있는지 확인합니다. 이 파일의 다른 버전들은 여러 종류의 암호화폐 지갑을 대상으로 하지만, 특정 버전은 오직 Phantom 지갑만 목표로 삼습니다. 이 검사가 완료되면 ontopothers[.]com 웹 사이트 주소로 데이터를 보내는데, 이 데이터에는 암호화폐를 훔치는 데 참여한 개인 또는 조직인 제휴사(affiliate)를 식별하는 암호화된 코드가 들어 있습니다. 이 코드에 부적절한 용어가 포함되어 있어 그림 5에서 일부 부분을 삭제했습니다.

<REDACTED>: null696969
그림 4. Post 요청 컨텐츠
3i4gthiwkeoqgjnhkiq3owrjgowejrgkomjwekiorfgmjikoewqrjmgij3ritgjfhi3qwrenjgikerdfg
그림 5. 고정된 키

서버는 텔레그램 채팅 그룹 ID와 설정 정보를 AES 방식으로 암호화해 보냅니다. 맨디언트가 분석했을 때, 이 복호화된 응답에는 'cool'이라는 변수로 표현한 텔레그램 채팅 그룹 ID와 두 번째 변수에 해당하는 설정 정보가 포함되어 있어 그림 6에서는 일부를 삭제하였습니다. 설정 정보에는 제휴사와 운영자의 솔라나 지갑 주소, 훔친 자금의 분배 비율, 그리고 악성 코드 동작 방식 제어에 필요한 세부 정보가 들어 있습니다.

cool: -1002032238930
<REDACTED>: {"receiver":"B4y9s5E8rb79RH4BoQRTqQBPKxpEFxdkL1y3E5A9XYCK","min_value_assets":10,"min_v
alue_connect":10,"button":{"connect":"Sign Up / Sign In with 
Phantom.","desktop_required":"Desktop required","connecting":"Connecting...","connected":"Claim 
Now","claiming":"Claiming...","no_funds":"Wallet has no funds to pay the transaction 
Fees","error":"Something wen't wrong...","rejected":"Claim failed! Try 
again?","change_button":false},"alerts":{"enabled":true,"no_funds":"The wallet you've connected is 
not eligible. Please try again with another wallet."},"split":0.2,"show_full_url":true,"instant_popup_if_installed":false,"redirect_if_not_installed"
:true,"solana_price":100.9,"split_address":"B8Y1dERnVNoUUXeXA4NaCHiB9htcukMSkfHrFsTMHA7h"}
그림 6. 구성이 포함된 응답

피해자는 자신의 솔라나 지갑을 연결하라는 요청을 받습니다. 솔라나 지갑을 연결하면, 악성 프로그램은 ontopothers[.]com 도메인의 또 다른 URL에 연결된 지갑 주소를 포함한 요청을 보내고, 서버는 이 지갑을 검사해 현재 잔액 등 상세 정보를 제공합니다. 서버는 제출된 지갑을 기록하고 있으며, 만약 같은 지갑이 두 번 연결되면 "null" 메시지를 반환합니다.

서버가 지갑의 정확한 정보를 전달하면, 악성 프로그램은 추가 지갑 정보와 CLINKSINK 제휴 웹 사이트를 포함하여 ontopothers[.]com 도메인의 세 번째 URL로 요청을 보냅니다. 이후 피해자에게 사기 거래에 동의하라고 요청합니다. 만약 피해자가 이 거래를 거부하면, 암호화폐 탈취 시도는 실패합니다.

솔라나 암호화폐 도난 및 수익 배분

맨디언트는 최근 CLINKSINK 캠페인에서 35개 이상의 제휴 ID와 42개의 솔라나 지갑 주소가 사용된 것을 확인했습니다(표 1). 캠페인들이 공통으로 사용하는 인프라와 솔라나 주소가 중복되는 것을 고려할 때 위협 행위자들은 같은 DaaS와 연결되어 있을 가능성이 있습니다.

도난당한 자금은 제휴사와 운영자가 사전에 정한 비율에 따라 수익이 배분됩니다. 이 비율은 제휴사의 ID를 사용해 Drainer 서비스에서 확인할 수 있습니다. 이번 캠페인에서는 일부 자금이 B8Y1dERnVNoUUXeXA4NaCHiB9htcukMSkfHrFsTMHA7h라는 솔라나 주소로 옮겨진 것이 확인되었는데, 이 주소는 DaaS 운영자와 관련이 있는 것으로 보입니다. 또한, 같은 DaaS와 연결된 다른 캠페인에서는 MszS2N8CT1MV9byX8FKFnrUpkmASSeR5Fmji19ushw1라는 또 다른 운영자의 것으로 의심되는 주소로 자금이 이체되었습니다. 초기 분석에 따르면 도난당한 자금의 약 80%는 제휴사에 가고, 나머지 20%가 운영자의 몫인 것으로 나타났습니다. 때에 따라 운영자의 몫이 최소 5%에서 최대 25%까지 달라지기도 했는데, 이는 특별한 파트너십 관계이거나 성과가 높은 제휴사의 경우 수수료 할인 혜택을 제공하는 등 여러 요인으로 인한 것으로 추정합니다.

2023년 12월 31일 이후 당시 시가로 약 18만 달러(USD)에 달하는 최소 1,491개의 솔라나 코인과 다양한 기본 토큰들이 B8Y1d... 주소로 이동했습니다. 운영자가 피해 총액의 20%를 받는다고 가정했을 때, 최근 캠페인을 통해 위협 행위자 집단은 약 90만 달러 상당의 디지털 자산을 피해자들의 지갑에서 훔친 것으로 추정할 수 있습니다. 참고로 운영자의 지갑으로 들어간 자금 중 일부는 운영자들이 자체적으로 진행한 Drainer 캠페인에 따른 것일 수 있습니다.

제휴사 ID

채팅 ID

제휴사 솔라나 주소

aa1731a

-4030258954

3RH44Pfx9GtN8ZWoSdWHoxH7HqXAC7V3YcqkX3kDf8J4

analosdev

-4028862671

AVvCiPrjR3es4NHnA4HrUXVsYFbyeasDBzWhywH7pCtC

anxiety

-4054962814

GmCYGAzMHhsNgoSK8JKHNRpdXC4xsbmFy9fknMioAmEK

asdasdgasdgf

-4073970957

EHPGHGnFVYMZhc9xHF597yHC19odPHP6Kn2nmvkkWCWk

biggynow

-4051835630

7tCSWUZYKRvx1obdFB6hwFJRN7gFEadE3dFX4fsJ1nPz

cheetah

-4020925688

218JtpiEn5ZUvMoLwPmZtXf7ZM6PvMXvrmYuw6ZaoeB1

cheetah2

-4027040769

8qezdtS9eP3GvSuFdYd11cLB84pD8siwjBvTqyBxfxKk

 

-4046400426

4qzye6MmnyFkLKGq2yM64QpUgv3TyefwwR9zHrS6LThb

example29020208

-4057427992

Fxm4yyVLSuWGhKNyJtr93VA6feJkjTjirTca78vpUVFe

exeFill

-4070048107

5C9EHpAdSNBFWboWs9HHGy2kZ4CJCkxCHW8fFRhVcZLx

fatyyban

-4011012791

3Xoki5GPu2t4h7b2x2jAARARwcFLZ1CCxyPv43ePm3nS

 

GvKQzXo9RDcZowAXvAxxB9XHWo9EAXYUY6af5NoFms1r

gangster

-4065676267

D9HYCccL2TcmiWhyoXqTHgbFtWvfQG8a5ZfHYieAWyLa

 

HFgFGQS9NmvFzG7dSH8sMRTEeKi793uB8fzgmaoDxBei

GateDev

-4027583711

FJLztLtZfjYAtwJYjg3ZNsqMHAJwtHc1xYS5AZwLu9PN

gostxast

-4044368928

HpTvuyVxwy7nK8AXCZqMHV1wiup3yvvsjpB5L2AHTGMc

hahahahahahahaha

-4009406471

FF1iEduHrvJChE7anZbxDn7gSKefT46xBaBcuuiqMxo9

kndawd

-4083710813

DYFKcauBDmbj29x9jucNsAYxmWv423GjCN4ZbjvDWX9e

lgbtq_monkey

-4016357572

bkfS3Mo8surQ3RKSm55GHjouHyqGPgFZebQJASDdFWf

lick

-4025906156

5NM4zTiCqHCtF88qxUw4CSTUEb1yA5P4Q1icStXyXdoX

 

HVR8U9zaPES2Zb7hFGVsqt2HLpxFc2jpZxnk3d1km4kY

 

-4013615549

T3KNsTzkiyW2gxfbqkbHxfGr7ciFzBpDTkV2UAJgd3x

milahRyuk

-4095448132

Aidf4FyS42q6TeMtSmJmB3goGLmNuVrhgr4LCyb8HceM

mistake

-4047899971

Bw1ktx1MjzQjWEEinJGQ1kHK8CjCZ2ZLnS3hYmfN5yBE

mr_jord

-4069120494

8nnMe1cGJpr2wUaVH4LbAut6Zka7vewZs9oQkc5H4JN7
5G6VsUNdMcMJZit2y2p9kAaVXf43PUu96uNJkoWDWPXr

nftkhufu2

-4012397060

Fte4wZgKApNbsbzbKpyJyjnautjrr6diovgzVHwX2PFE

 

EjfTahgtoRxzeaPsWuMwouZbqAw3tZAXyQeyGwUVN9hw

null_fed

-4044764748

FDLuQRg6yYENo4Q75HJ4RdF6wZhNeSW9HjUGD1eoDGG1

null696969

-1002032238930

B4y9s5E8rb79RH4BoQRTqQBPKxpEFxdkL1y3E5A9XYCK

orgifox

-4002904582

CuWXwbstHKkhFLbGDAWpF7rbiRvfQpPSo4uFMnYyhDSx

outsmart

-4053485172

8Vc4R5gHEZs6PxA3uRmYVyqFRZgSmRV866UTvfeyc4VA

pitbull

-4075714106

HVHAGvL8HCByevnep9jgSYdr5Eq1wFFBwbq2jFVqoxNh

pitbull_idk

-4038907100

7XAgCsWMwfuzi1LLvXmpFMaXLQSoc4D6QJ5YyKhCUaSu

randomized9992342324

-4015596192

13XC9hfTu2f2e7wzrfVugbCqnWcG27XJwyhrBFff3GAr

shudsidj

-4075817071

5pKrMXARbv6iNbtp2uEsZhyyTpR85jRrEny5fSCydvbW

sleepzzz35

-4016460137

EhunAZL5v7r14Di9DGjW55dHLKzKJjHutpWKHZ9yDNbs

stuntin1121

-4090537428

BYQsPKfFznw1kyTysBX9GAYCUpsStFiwQbCBS2AMeJd7

 

5ubbRtLvoVmbN6LVthcmMGTB8nxShE5dRZtuZTgFVLNs

suki6969

-4071634475

4gRHwBUz9VKGgRWL9UAjFEAdR63D5GHA3z6A9ny2ww8V

willetproject

-4010977735

CgvT6j6pmQJYk2EKuWMbGmpu2f5pjaysrDUR6fgWBuxj

표 1: 제휴사 정보 (불쾌한 용어가 포함되어 있어 일부 내용은 삭제하였습니다.)

여러 DaaS가 CLINKSINK 사용

맨디언트는 CLINKSINK Drainer 및 이와 유사한 기능을 하는 여러 DaaS를 발견했습니다. 이 중 'Chick Drainer'라는 서비스가 있는데, 이 서비스는 현재 'Rainbow Drainer'라는 이름으로 운영되고 있을 가능성이 있습니다. 서비스 소식과 최신 업데이트를 제공하는 텔레그램 채널이 생성된 시기로 미루어 볼 때 'Rainbow Drainer'는 2021년 12월부터 시작된 것으로 보입니다. 참고로 CLINKSINK 소스 코드는 여러 그룹에 공개되었습니다. 따라서 여러 서비스가 같은 그룹에 의해 관리되고 있을 수도 있고, 서로 관련이 없는 그룹들이 독자적으로 DaaS 사업을 할 수도 있습니다.

  • CLINKSINK 샘플과 pastebin.pl에 업로드된 자바스크립트 코드 간에 중복이 있습니다. 이 코드에는 "@ChickDrainer"에 대한 참조가 포함되어 있습니다. 이를 볼 때 CLINKSINK가 Chick Drainer 변형임을 알 수 있습니다.

  • 2023년 12월 23일 @chickdrainer 텔레그램 채널에 @Rainbow로 채널을 옮긴다는 메시지가 게시되었습니다(그림 7).

  • 맨디언트는 2023년 12월 23일에 생성한 "@ChickDrainerLeaked"라는 텔레그램 채널을 확인했습니다. 이 채널에는 Chick Drainer 소스 코드가 유출되었으며, 코드를 원하면 연락하라는 글이 포함되어 있습니다(그림 8). 이 게시물에는 여러 기술적 지표와 CLINKSINK와 일치하는 기능에 대한 참조가 포함되어 있습니다.

  • @ChickDrainerLeaked 채널에는 @RainbowDrainer 채널에서 전달한 여러 메시지도 포함되어 있습니다. 이를 볼 때 같은 위협 행위자가 운영하는 것으로 추정할 수 있습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/solana-cryptocurrency-theft-fig7-2.max-900x900.png

그림 7. @chickdrainer 텔레그램 채널이 @Rainbow로 채널로 이동한다는 발표

https://storage.googleapis.com/gweb-cloudblog-publish/images/solana-cryptocurrency-theft-fig8_zgfu.max-900x900.png

그림 8. @ChickDrainerLeaked 텔레그램 채널

전망

지난 한 해 동안 맨디언트는 여러 위협 행위자들이 지하 시장에서 Drainer를 판매하고 DaaS를 광고하는 것을 관찰했습니다. 이는 암호화폐 탈취와 관련해 Drainer가 인기를 끌고 있음을 보여줍니다. 특히 이번 CLINKSINK 활동이 눈에 띄는데, 이것은 솔라나 암호화폐의 가치 상승과 맞물려 있습니다. 솔라나는 최근 몇 달 사이에 다른 암호화폐보다 빠르게 가치가 상승했습니다. 더욱이 CLINKSINK 소스 코드가 유출된 것 같아 다른 위협 행위자들이 독립적으로 자금 탈취 작업을 진행하거나 다른 이들이 사용할 수 있는 새로운 DaaS를 만들 수 있는 여지가 생겼습니다.

맨디언트는 최근 몇 년간 암호화폐 사용자와 서비스를 겨냥한 위협 행위자들을 지속해서 관찰했습니다. 암호화폐 가치 상승을 고려할 때 앞으로 더 큰 관심으로 이런 유형의 위협 행위자들을 살펴볼 것입니다. 현재 다양한 Drainer들이 널리 사용되고 있는데, 이들의 저렴한 비용과 높은 수익성은 많은 재정적 동기를 가진 위협 행위자들에게 매력으로 다가옵니다. 이처럼 암호화폐의 가치가 높아지고 Drainer를 이용한 공격의 진입 장벽이 낮아지면서 초보자부터 전문가까지 많은 위협 행위자들이 재정적 이득을 위할 목적으로 Drainer를 사용한 공격을 이어갈 것으로 보입니다.

YARA 룰

다음 CLINKSINK Drainer 관련 YARA 룰은 프로덕션 환경에서 탐지나 차단 룰로 적용하기 위한 것이 아닙니다. 이 룰은 조직 내부에서 테스트하여 정확성을 확인한 다음 사용해야 합니다. 이 룰은 CLINKSINK Drainer 활동을 찾아내기 위한 첫 단계로 사용할 수 있으며, 시간이 지나면서 위협 행위가 바뀌면 적절히 조정해야 합니다.

rule M_Utility_CLINKSINK_1
{
    strings:
        $crypto1 = "solanaWeb3.Connection"
        $crypto2 = "solanaWeb3.LAMPORTS_PER_SOL"
        $crypto3 = "solanaWeb3.PublicKey.findProgramAddress"
        $crypto4 = "solanaWeb3.SystemProgram.transfer"
        $crypto5 = "solanaWeb3.Transaction"
        $func1 = "async function info("
        $func2 = "async function updateConnectText("
        $func3 = "async function updateMintText("
        $func4 = "async function start("
        $func5 = "async function connect("
        $func6 = "async function waitForWalletConnection("
        $func7 = "async function connectSolana("
        $func8 = "async function getTokenBalance("
        $func9 = "async function createTxs("
        $func10 = "async function createPrizeTxs("
        $func11 = "async function claim("
        $func12 = "async function createTokenTxs("
        $func13 = "async function claimSolana("
        $phantom1 = ".phantom"
        $phantom2 = ".isphantom" nocase
        $phantom3 = "phantom.app"
        $transaction1 = ".AccountLayout."
        $transaction2 = ".TOKEN_PROGRAM_ID."
        $transaction3 = ".Token.createAssociatedTokenAccountInstruction("
        $transaction4 = ".Token.createTransferInstruction("
    condition:
        5 of ($func*) or (3 of ($crypto*) and any of ($phantom*) and 3 of ($transaction*))
}
게시 위치