구글 광고를 통한 MetaMask 피싱
- 피싱의 징후 어떻게 식별하고 무엇을 주의해야 하나?
By: Athul Harilal, Eric Chin, Jack Chong, Ilinca Alexiuc, Nobel Tan
1. Introduction
한 사이버 보안위협 단체가 2020년 11월부터 구글의 광고 프로그램인 Google Ads를 통해 MetaMask 지갑 이용자들의 가상자산을 탈취하고 있는 사실이 밝혀졌다¹. 실제 MetaMask 사이트가 아닌 사칭 사이트를 Google Ads를 통해 퍼뜨리고, MetaMask의 이용자들을 해당 사칭 사이트로 유인해 해당 이용자들의 가상자산을 탈취하는 피싱공격을 했다는 것이다.
Uppsala Security는 조사를 통해 해당 사이버 보안위협 단체가 Ledger와 Coinomi 지갑의 이용자도 타겟으로 노리고 있었다는 것을 알게 되었다.
해당 단체가 취급한 가상자산의 거래는 FixedFloat이라는 거래소와 중국을 근거지로 한 알려지지 않은 DEX와 연관이 있다는 사실도 밝혀졌다.
Uppsala Security는 본고를 통해, 해당 단체를 밝혀내게 된 상세 경위를 설명하고 관련 보안 침해 지표(IOCs) 들을 공개하고자 한다.
2. Modus Operandi
2020년 11월 해당 단체의 공격 작업이 시작된 이래, 해당 단체는 4번에 걸쳐 MetaMask 사칭 사이트의 주요 개선작업을 치밀히 진행하였고 우리는 이 과정에서 웹파일의 코드 기반의 변화와 인프라의 변화를 감지 할 수 있었다.
아래 표1은 이러한 사칭사이트 개선하기 위한 각 버전들의 대한 내용을 보여준다.
Version 1
이들의 초기 버전(1.0, 1.1)은 피싱 도메인들로부터 반환된 html 및 javascript 파일 측면에서 동일한 코드베이스를 가지고 있었다. 단지 다른 점은 호스팅 제공자만 다를 뿐이었다. 버전 1.0에서 도메인은 Choopa LLC²에서 호스팅 됐지만, 버전 1.1에서는 CloudFlare Inc³로 옮겨졌을 뿐 도메인 등록 대행 업자는 그대로 Namecheap⁴을 사용했다.
HTTP 응답 순서의 차이점 비교
그림 1을 통해, 사용자가 실제 MetaMask 사이트(MetaMask[.])를 통해 지갑을 가져올 때와 피싱 사이트를 통해 지갑을 가져올 때의 기록된 http 응답 순서를 각각 비교해 보여 주고 있다.
실제 MetaMask 사이트의 경우, 사용자는 MetaMask 지갑 생성을 위해 main page를 통해 download.html로 연결된다. 이후 크롬 웹브라우저의 MetaMask 익스텐션(확장 프로그램) 사이트로 옮겨지게 되는데, 여기서 우리는 악의적 피싱 공격 형태인 공격대상자 유인에 주로 사용되는 웹브라우저 익스텐션의 동작 방식을 파악하기 위해 MetaMask의 익스텐션 작동원리를 관찰했다.
마지막 3단계에서 크롬 확장 프로그램은 home.html 페이지를 반환하여 지갑을 제공하는 절차를 마무리하게 된다.
반면, 피싱사이트의 http 흐름을 보면, MetaMask의 설치과정을 위한 표시가 전혀 표시 되어 있지 않다는 것을 알게 되었다.
오히려, 악의적 공격자는 지갑을 제공하는 단계에서 필요한 응답들을 피싱 도메인 내의 수 많은 html 페이지들을 호스팅해서 제공하게 되는데 이것이 첫번째 눈에 띄는 차이점이었다.
Comparison of Landing Pages
그림 2.a와 2.b는 각각 실제 MetaMask 사이트와 피싱 사이트에서 쿼리가 발생 할 때 반환되는 http 응답을 보여준다. 두 페이지는 시각적으로 비슷해 보이며, 피싱 사이트가 그림 3.a 및 그림 3.b와 같이 실제 사이트와 비교해 유사한 수의 http 호출을 하는 것으로 관찰되었다. 따라서 피싱 사이트의 초기 버전은 실제 사이트 자체의 리소스를 복제에 직접 사용한것으로 사료된다.
하지만, 피싱 사이트와 실제 사이트 간의 미세한 텍스트 차이도 관찰되는데, 예를 들어 그림 2.a 및 2.b에 표시된 것처럼 피싱 사이트에서는 “다운로드” 및 “지금 다운로드” 단추가 “설치” 및 “지금 설치”로 바뀌게 된다.
실제 MetaMask 사이트의 경우, 다운로드 버튼을 클릭하게 되면 그림 4.a와 같이 download.html을 통한 MetaMask 다운로드 링크를 가져오지만, 피싱사이트의 경우 그림 4.b 처럼 home.html로 리다이렉트 하게 된다.
이 home.html은 그림 1의 실제 MetaMask 익스텐션이 요청한 home.html과 같은데, 다만 피싱 사이트의 경우 익스텐션 설치 과정이 없다는걸 눈여겨 봐야 한다.
Comparison of home.html pages
그림 5.a와 5.b는 실제 사이트를 통해 MetaMask 크롬 익스텐션이 설치된 home.html과 피싱사이트를 통해 MetaMask 익스텐션이 설치된 home.html을 각각 보여주고 있다.
랜딩 페이지와 유사하게, 두 페이지는 일부 글자들만 다를 뿐 거의 유사한 화면을 보여주지만, ‘스타트’ 버튼을 클릭했을 때 발생하는 동작 방식은 아래의 설명처럼 두 사이트가 서로 다르게 동작한다는 것을 알 수 있다.
그림 6에서 보는 바와 같이, 실제 MetaMask 익스텐션은 messages.json 파일로 부터 이용자의 행위나 관련 텍스트 목록을 가져오는 걸 알 수 있는데, 우리가 눈여겨 보는 이용자의 행위는 그림 5.a의 ‘Get Started’와 관련된 부분이다. ‘Get Started’를 클릭하게 되면 그림 6의 자바스크립트 파일 내에 하이라이트된 부분이 처리되고 다음 단계로 넘어가게 되고, “Get Started” 버튼과 마찬가지로 사용자가 지갑 가져오기를 완료하기 위해 수행하는 후속 작업 순서도 동일한 javascript 기능으로 처리된다. 그러나, 위협 행위자들은 지갑 정보를 가져오고 훔치는 단계를 복제하기 위해 훨씬 더 간단한 기술에 의존했다.
예를 들어, 피싱 페이지의 home.html 내의 시작 버튼은 그림 7에 나온 것처럼 change.html이라는 파일을 가리키기만 하면 되고, 이 파일의 응답은 실제 MetaMask 익스텐션에 의해 제공된 응답과 유사하도록 만들어 졌다.
Change.html
피싱 사이트의 Change.html 페이지는 사용자를 속여 지갑의 비밀 문구(mnemonic)를 탈취하는데 사용되는데, 이 비밀 문구를 위협 행위자들이 이용자의 지갑을 복제하는 데 사용할 수 있다. 이 뿐만이 아니라, 이용자를 속여 실제 MetaMask 익스텐션에 의해 반환되는 응답을 복제해 새 지갑을 만들도록 유도하고 있다.
Change.html 소스 코드를 검사한 결과, 이용자가 자신의 지갑을 가져오도록 하면 피싱 사이트에서 Change1.html 페이지를 요청하게 하고, 새 지갑을 생성을 요청하게 되면 Change2.html 페이지를 요청하게 하여, 이용자가 실제 MetaMask 사이트로 리디렉션되도록 하였다. 따라서 피싱사이트의 초기 버전에서 위협 행위자들은 이런 식으로 MetaMask에서 이용자들이 새로운 지갑을 만들 수 있도록 하였다.
Change1.html
실제 MetaMask 사이트에서 개인정보 관련 GDPR⁵ 동의서를 받고 있기 때문에, 피싱사이트에서도 유사한 페이지를 보여주는데, Change1.html의 html 소스 코드를 보면 그림 11과 같이 이용자 정보 수집에 동의하든 하지 않든 이와 관계없이 이용자를 import.html 페이지로 이동시킨다.
Import.html
이 양식은 공격 대상자에게 새 암호와 함께 12개의 키 구문 입력을 유도하는 메시지가 담긴 마지막 단계이다.
그림 13은 동일한 피싱 도메인의 check.php로 전송된 해당 양식 안의 세부정보를 보여주는데, 이용자의 시드 구문은 아이디가 ‘passwo1212rd’인 input html에 의해 수신되고 “Show seed phrase” 체크박스가 트리거되면 laks () 함수가 실행되는 형태이다.
마찬가지로, 양식의 끝 부분에 이용 약관 준수와 관련된 또 다른 체크박스가 포함되어 있는데, 그림 14는 이 체크박스가 가진 “first-time-flow__checkbox2”라는 클래스가 트리거되며 laks2 () 함수가 실행되게 된다. 또한 가져오기 버튼은 기본적으로 비활성화되어 있으며 ID는 bdbdb인것을 알 수 있다.
laks2() 함수에 대한 심층 조사 결과, 해당 양식의 기능에 관한 중요한 정보가 있음이 밝혀졌다. 그림 15에서 우리는 위협 행위자들이 otkr 클래스를 기반으로 한 이용 약관과 사용자 상호 작용을 계속 확인 했음을 알게 됐다.
체크박스를 선택하면 체크박스 요소에 otkr이 추가되고 체크되지 않으면 otkr이 제거된다. 이 논리를 기반으로 체크박스가 선택 취소되면 첫 번째 코드 블록이 실행되는데, otkr이 제거되고 ID bdbdb를 통해 참조되는 가져 오기 버튼은 비활성화된다.
단, 체크 박스를 체크하면 otkr을 추가하고 새로 입력 한 비밀번호와 동일한 지 확인하게 되고, 다음 코드 블록은 사용자가 입력 한 시드 구문을 추출하여 getAmountOfWords2 () 함수로 보내게 된다.
그림 16과 같이 getAmountOfWords2 ()는 입력 한 시드 문구의 길이가 12인지 확인하고 가져 오기 버튼의 disabled 속성을 제거하여 피해자가 입력 된 세부 정보를 보도록 하다. 이것으로 버전 1에서 피해자의 비밀 문구를 훔치는 과정을 완성되게 되는 것이다.
Version 2
이 버전에서 공격자들은 Arq Group Limited DBA Melbourne IT⁶을 도메인 등록 기관으로 사용하고 호주의 AWS⁷서버에서 웹 파일을 호스팅했다.
그들은 주로 자바 스크립트 함수의 수를 줄임으로써 호스팅되는 웹 파일의 크기를 줄였다. 하지만 가장 흥미로운 사실은 Ledger⁸ 및 Coinomi⁹ 지갑과 관련된 피싱 사이트의 발견이었다. 이 사실은 2020 년 6 월 Ledger 지갑의 데이터 유출¹⁰을 통해 악의적 인 공격자가 27 만 고객의 개인 정보가 탈취된 사건과 관계가 있어 보이고, 해당 유출된 정보가 RaidForum¹¹에서 암거래 되고 있다는 사실도 버전2에서 위협 행위자가 사이버 공격 범위를 확대했다고 볼 수 있는 근거로 사료된다.
Analysis of Landing Pages
버전 2에서 발견 된 주요 도메인에 대한 HTTP 쿼리는 MetaMask, Ledger 또는 Coinomi와 전혀 관련이 없는 3 가지 또 다른 유형의 웹사이트를 보여주는데, 그림 17에서 볼 수 있듯이 프랑스 요리 배우기, 세차 회사 및 건축 회사와 관련된 웹사이트들이었다.
html 응답 분석 결과, 그 안에 여러 라틴어 문장이 포함되어있는 것으로 나타났는데, 우리는 이 문구들이 여러 웹 사이트에서 가져온 여러 개의 Lorem Ipsum(의미 없는 가상의 텍스트) 문장 이었음을 알게 되었다.
아마도 콘텐츠가 있는 사이트로 위장하기 위해 위협 행위자는 예를 들어, “Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat.” 와 같은 문구들을 Wikipedia 페이지¹² 등에서 불러온 것으로 보인다.
또한 nicepagek¹³라는 웹 사이트 빌더 플랫폼과 freepik¹⁴이라는 대규모 이미지 저장소가 포함된 웹 사이트로 연결되는 여러 링크를 발견됐지만, 지갑 제공자의 사칭과 관련된 의미 있는 링크는 찾지 못했다.
위의 정보에서 우리는 3 가지 유형의 html 응답이 nicepage¹⁵에서 제공하는 웹 사이트 템플릿을 사용할 준비를 했었으리라 추론했다.
Identification of Hidden Paths
앞서 언급한대로, 우리는 랜딩 페이지에서 의미 있는 링크를 찾지 못했기에, 추가적인 조사를 통해 사칭 사이트를 호스팅할 수 있는 숨겨진 경로를 확인 해 보았다.
그림 18에서 볼 수 있듯이 MetaMask 및 Ledger의 사칭과 관련해 여러 도메인 내에서 숨겨진 경로를 발견했는데, 분석 과정에서 각각의 숨겨진 경로는 단일 도메인에만 해당 되는 것으로 밝혀졌다.
이 얘긴 즉, 위협 행위자가 이러한 경로를 다른 사이트의 리디렉션으로 사용하거나 이메일과 같은 수단을 통해 피해자를 대상으로 삼을 수 있다는 사실을 암시한다.
MetaMask 버전2 사칭 사이트의 숨겨진 웹페이지의 응답들도 버전 1의 응답들과 유사했다. 그림 19에서 볼 수 있듯이, 위협 행위자들은 이러한 숨겨진 페이지들에 지갑을 가져오기 위한 옵션을 포함시켰을 뿐, 버전1처럼 새로운 지갑을 생성하기 위한 옵션을 포함시키진 않았다. 마찬가지로 시드 문구와 비밀번호를 입력하는 페이지도 이용 약관 체크 박스 자동 확인하는 것을 제외하고 버전 1과 유사했다.
이것은 버전1에 있는 laks2()와 같은 자바 스크립트 함수의 필요성을 제거하는 역할을 한다.
Brief Summary of Ledger Impersonation sites
위협 행위자들은 Ledger 사칭 사이트 또한, MetaMask 사칭 도메인에서 관찰 된 것과 유사한 기술을 구현하여 피해자의 시드 문구를 훔쳤다.
그림 21은 피해자가 시드 문구를 입력하는 양식의 세부 사항을 보여주는데, 우린 피해자가 입력 한 키를 수신하는 리스너 함수인 CheckParams ()를 관찰하게 되었다. MetaMask의 경우와 유사하게 이 함수는 그림 20의 “Continue” 버튼을 통해 입력 된 구문의 길이를 확인하여 양식을 훔치는 과정을 완료하게 된다.
MetaMask 사칭 사이트와 약간의 차이도 보이는데, 한 가지 주요 차이점은 그림 22와 같이 숨겨진 페이지의 http 응답의 사이즈가 4MB 정도의 큰 사이즈라는 것이다.
검사 결과, 이는 그림 23에서 볼 수 있듯이 실제 Ledger 사이트 내에서 사용되는 이미지들의 인라인 참조(Inline-Referencing)을 위한 것이고, 이러한 이미지가 base64 포맷으로 참조되어 사이즈가 커지는 것으로 밝혀졌다.
Version 3
이 버전에서는 버전 1과 유사한 MetaMask 피싱 사이트 만 발견됐다.
또한 그림 1과 같이 시드 문구를 훔치기 위한 유사한 http 흐름도 그대로 유지된 것을 알게 되었다. 다만, 위협 행위자들은 http 응답의 크기를 더욱 줄였고 무작위 도메인 등록기관인 PDR Ltd. d / b / a PublicDomainRegistry.com¹⁶ 및 NetEarth One Inc. dba NetEarth¹⁷ 등을 활용하기 시작했다.
Cryptocurrency Transactions of the Threat Actor
그림 24는 위협 행위자의 지갑(0xF032752d9198D9c0b34Cd9b622de04f7CF2DE840)에서 송금된 트랜잭션들을 CATV (Crypto Analysis Transaction Visualization)¹⁸ 도구를 통해 확인한 결과이다. 이 지갑을 살펴보면 2020 년 10 월 12 일부터 활성화 되었으며 이 기사를 쓰는 시점에서 22.8 ETH를 거래 한 것으로 나타났다.
약 0.76 ETH에 해당하는 초기 송금 거래는 FixedFloat 거래소¹⁹로 전송되었으나, 대부분의 가상자산(21.9 ETH)은 알려지지 않은(Unknown) 지갑(0x24BA1542F8a0a20e8251d096213384Cfb0eE3dbC)으로 보내어졌다.
면밀히 조사한 결과, 이러한 지갑들은 4 개월 동안 약 22,000 건의 거래를 했고, Bloxyi²⁰ 에서 가져온 그림 25에서 볼 수 있듯이 Huobi²¹ 및 Binance²²와 같은 주요 거래소와 거래된 것을 발견하게 되었다.
또한 USDT Tether (0xdac17f958d2ee523a2206206994597c13d831ec7), DAI (0x6b175474e89094c44da98b954eedeac495271d0f)및 ChainLinkToken (0x514910771af9ca656af840dff83e8264ecf986ca)와 같은 스마트 컨트랙트에서도 다수 호출된 것으로 보여지고 DEX지갑과도 연계성이 보였다.
우리는 또한 위협 행위자의 이 암호 화폐 거래에서, 14 개의 이상의 퍼블릭 블록체인 지갑들과 관계가 있고 4000개 이상의 Dapp들을 호스팅하는 플랫폼인 Dappbirds²³를 사용하기 위한 알려지지 않은(Unknown) 지갑도 발견했다. 그림 26은 금융 서비스 (Aave 프로토콜) 및 중국 게임 (TKH)을 주로 포함하는 7 개의 Dapp과 상호 작용하는 알려지지 않은 지갑의 프로필을 보여준다. 이것은 알려지지 않은 지갑들이 중국을 발원지로 한다는 약간의 직관을 제공한다 할 수 있다.
따라서, 위협 행위자는 이 DEX 유형의 지갑을 악용하여 ETH를 USDT 토큰과 같은 스테이블 코인으로 주로 변환해 거래하고 있다고 유추 해 볼수 있지 않을까?
Attribution
위협 행위자들은 자신들의 웹 파일 및 인프라 내부의 정보를 외부에서 어떠한 낌새도 채지 못하도록 정보 유출에 주의를 기울였지만, 한편, 버전2의 경우처럼 Loreum Ipsum Latin 문구를 불러들여 의미 없는 텍스트를 웹사이트에 개제하는 실수도 범했다. 그리고, 대부분의 도메인들이 등록기간을 통해 1개의 dns resolution을 가질 수 있기 때문에 피싱 도메인들의 DNS resoultion을 기반으로 한 정보를 유추해 낼 수 없었다.
그러나 초기 MetaMask 피싱 도메인 (installmetamask [.] com) 중 하나가 최근 새로 생성 된 영화 웹 사이트 (hopeisasadthing [.] xyz)로 리디렉션되었고, 그림 27에서이 도메인은 초기 피싱 도메인과 거의 같은 시기에 생성되었음을 알 수 있었다. 도메인 이름도 영화 웹 사이트와 일치하지 않으며 이것은 악의적인 의도를 내포하고 있다는 것을 암시한다. WHOIS를 통해 확인한 도메인 등록자가 중국 내몽골을 뜻하는 “Nei Meng Gu Zi Zhi qu”출신임을 보여준다. 이것은 위협 행위자와 중국의 연결에 대한 우리의 직감을 더욱 강화하게 하는 부분이다.
How to Identify Signs of Phishing
지갑과 관련된 시드 문구 또는 니모닉 문구는 이전 기기가 손상되었을 때 사용자의 지갑을 다른 기기로 가져오는 목적으로 사용되므로 기밀로 유지해야 한다. 따라서 지갑 제공 업체는이 정보를 사용자 기기 자체에 암호화 된 방식으로 저장하고 자신들의 인프라 ²⁴에 저장하지 않는다. 또한 사용자가 지갑을 다른 장치로 가져올 때 일련의 수학적 함수를 사용하여 시드 문구에서 사용자의 지갑 개인 키를 추출한다.
따라서 피싱 징후의 강력한 신호는 누군가가 시드 문구를 요청하고 사용자 기기가 아닌 원격지에서 다른 인프라로 전송을 유도 할 때이다.
일반적으로 합법적인 지갑 공급자는 지갑 초기화 할 때만 시드 문구를 요청한다. 또한, 지갑 초기화 이후의 업데이트 시에도 지갑 제공자가 시드 문구를 요청하지 않는다. 그러나 최근 가짜 Ledger 소프트웨어는 기존 사용자에게 악의적으로 시드 문구를 다시 입력하도록 요청하는데 이는 악의적 행위로 유의해야 한다. 마지막으로, 이러한 징후를 감지했을 때는 이미 심각한 자산의 피해를 입은 상태일 수 있다.
악의적인 공격자가 개인 키를 탈취하더라도 피해를 최소화 하는 사전 대응 방법은 자산을 분산해 서로 다른 지갑 제공자의 지갑에 보관하는 것이라 할 수 있겠다.
앞서의 사례에서 처럼 동일 지갑 제공자의 지갑을 계속 사용할 경우 나도 모르게 사칭 지갑 제공자 사이트를 통해 시드키 입력을 유도하거나 새로운 지갑을 생성하게 유도하여 피해를 입힐 수 있기 때문이다.
[1] “MetaMask phishing steals cryptocurrency wallets via Google ads.” 5 Dec. 2020, https://www.bleepingcomputer.com/news/security/metamask-phishing-steals-cryptocurrency-wallets-via-google-ads/. Accessed 28 Dec. 2020.
[2] ”Choopa, LLC.” https://www.choopa.com/. Accessed 29 Dec. 2020.
[3] “Cloudflare.” https://www.cloudflare.com/. Accessed 29 Dec. 2020.
[4] “Namecheap.” https://www.namecheap.com/. Accessed 29 Dec. 2020.
[5] “General Data Protection Regulation — Wikipedia.” https://en.wikipedia.org/wiki/General_Data_Protection_Regulation. Accessed 29 Dec. 2020.
[6] “About Us | Domain Industry Pioneer | Melbourne IT.” https://www.melbourneit.com.au/about-melbourne-it/. Accessed 30 Dec. 2020.
[7] “Amazon AWS — Amazon.com.” https://aws.amazon.com/. Accessed 30 Dec. 2020.
[8] “Ledger.” https://www.ledger.com/. Accessed 30 Dec. 2020.
[9] “Coinomi: The blockchain wallet trusted by millions..” https://www.coinomi.com/en/. Accessed 30 Dec. 2020.
[10] “Ledger data leak: A ‘simple mistake’ exposed 270K crypto ….” 25 Dec. 2020, https://cointelegraph.com/news/ledger-data-leak-a-simple-mistake-exposed-270k-crypto-wallet-buyers. Accessed 30 Dec. 2020.
[11] “RaidForums.” https://raidforums.com/index.php. Accessed 30 Dec. 2020.
[12] “Lorem ipsum — Wikipedia.” https://en.wikipedia.org/wiki/Lorem_ipsum. Accessed 30 Dec. 2020.
[13] “Nicepage.” https://nicepage.com/. Accessed 30 Dec. 2020.
[14] “Freepik.” https://www.freepik.com/. Accessed 30 Dec. 2020.
[15] “Construction company Web Design — Nicepage.” https://nicepage.com/d/125559/construction-company-web-design. Accessed 30 Dec. 2020.
[16] “Public Domain Registry.” https://publicdomainregistry.com/. Accessed 4 Jan. 2021.
[17] “NetEarth One Inc. d/b/a NetEarth | Registrar Breakdown.” https://ntldstats.com/registrar/1005-NetEarth-One-Inc-dba-NetEarth. Accessed 4 Jan. 2021.
[18] “CATV — Uppsala Security.” https://www.uppsalasecurity.com/catv. Accessed 4 Jan. 2021.
[19] “Instant cryptocurrency exchange — FixedFloat.” https://fixedfloat.com/en/. Accessed 4 Jan. 2021.
[20] “Bloxy.info.” https://bloxy.info/. Accessed 4 Jan. 2021.
[21] “Huobi.” https://www.huobi.com/. Accessed 4 Jan. 2021.
[22] “Binance: Bitcoin Exchange | Cryptocurrency Exchange.” https://www.binance.com/en. Accessed 4 Jan. 2021.
[23] “DappBirds.” https://dappbirds.com/. Accessed 5 Jan. 2021.
[24] “Everything you need to know about your Secret Recovery ….” https://support.exodus.io/article/925-everything-you-need-to-know-about-the-secret-recovery-phrase. Accessed 8 Jan. 2021.