암호화폐 지갑 데이터를 훔치는 악성 PyPI 패키지
Blog/외부 Blog

암호화폐 지갑 데이터를 훔치는 악성 PyPI 패키지

1. 도둑맞은 0.025 ETH

때는 2023년 9월 18일, 한창 2023 KDFS Challenge 문제를 제작하던 중, 문제 시나리오에 사용하기 위해 Metamask ETH 주소에 입금한 0.025 ETH가 12초 만에 도난당한 사건이 발생했다. 당시 도난당한 이유를 밝히기 위해 다음과 같이 여러가지 가설을 세웠다.

  1. Metamask가 해킹당했다.
  2. 얼마 전 암호화폐 지갑 분석 주제로 발표를 했었는데 당시 Metamask 복호화 과정 소개 때 니모닉 시드가 유출됐다.
  3. 나의 부주의함으로 니모닉 시드가 유출되었다.

확인 결과 1번은 알려진 소식이 없었고, 2번은 발표 당시 사용했던 지갑과 이번에 도난당한 지갑이 달랐다. 그렇다면 나의 부주의로 인해 니모닉이 유출되었다고 밖에 볼 수 없는 상황이었다.

예전에 dApp 조사를 하면서 Metamask 지갑을 몇몇 dApp에 연결했던 적이 있었기 때문에 이것이 문제였을 것이라 생각하고 기억을 더듬어 다시 찾아봤다. 하지만 딱히 피싱 사이트에 접속했던 적이 없고 기술적으로 맞지 않는 부분이 있어 원인을 찾는데 어려움이 있었다. 어쨌거나 KDFS 문제는 새 Metamask 지갑을 생성해서 제작을 했고 잘 마무리 할 수 있었다(지갑을 새로 생성할 수 밖에 없었던 자세한 이유는 뒤에서 설명하겠다). 그리고 시간이 흘러 최근에야 ETH를 도난당한 이유를 알아내는데 성공했다.

[그림 1] 도난당한 주소 에서 발생한 관련 트랜잭션

Coinone 거래소를 통해 전송된 0.025 ETH의 수수료를 제외한 금액이 0x3BC2FaC06FdFF8D18D759544D935Ffdc2E978E23 주소로 전송된 것을 확인할 수 있다. Etherscan에서 해당 주소를 조회하면 피해를 받은 다른 사람들이 작성한 댓글을 볼 수 있다.

2. 암호화폐 탈취 원인

KDFS 문제를 제작하기 전에 우리는 연구 과제로 암호화폐 지갑 프로그램의 아티팩트 연구를 진행하고 있었다. 연구 대상으로 Windows 데스크톱 설치형 지갑 프로그램, 하드웨어 연동형 지갑 프로그램, 크롬 웹 브라우저 확장형 프로그램을 합쳐서 약 20 개의 프로그램을 분석했는데, 이 중 Metamask가 포함되어 있었다.

연구 내용으로 암호화폐 지갑 프로그램을 이용했을 때 생성,수정,삭제되는 아티팩트를 분석하는 것을 비롯해 지갑 데이터를 복호화 할 수 있는 알고리즘에 대해서도 연구했다. 이 때 자체적으로 연구한 복호화 알고리즘을 사용하면서도, 시중에 오픈되어 있었던 Metamask 복호화 파이썬 패키지를 사용해본 것이 화근이었다.

[그림 2] PyPI 패키지 - hashdecrypt 1.0.2

당시 사용했던 패키지는 hashdecrypt 1.0.2으로 여기에서 확인할 수 있다. 패키지 설치 명령어 하단의 설명을 보면 Metamask 뿐만 아니라, Brawe, Ronin, BinanceChain의 Vault Data 복호화를 지원한다.

3. hashdecrypt 패키지 분석

hashdecrypt 패키지는 암호화폐 지갑 프로그램의 암호화된 Vault Data를 복호화하는 도구로 보이지만, 실제로는 니모닉 시드를 탈취하는 Stealer 행위를 포함하고 있다.

3-1) 다운로드 통계

PyPI는 업로드된 패키지에 대한 다운로드 로그를 Google BigQuery에 공개 데이터 세트로 저장하고 있다. 다음 쿼리를 통해 5년간 다운로드 내역을 조회한 결과, 총 3,608건이 다운로드된 사실을 확인했다.

[그림 3] Google BigQuery 조회 결과

3-2) 코드 분석

# decrypt 함수

[그림 4] hashDecrypt.py - decrypt()

  • key_from_password 함수로 복호화 키를 도출한다.
  • 복호화 키를 사용해 decrypt_with_key함수로 데이터를 복호화 한다.
    • 복호화된 데이터에는 암호화폐 지갑의 니모닉 시드 정보가 포함되어 있다.
  • 그 다음으로 jsBIP39 함수가 호출되며 Stealer 행위가 시작된다.

# jsBIP39 함수

[그림 5] hashDecrypt.py - jsBIP39(), cli_keccak256()
[그림 6] 하드코딩된 문자열 디코딩 결과

  • encode_data변수에 하드 코딩된 BASE64 값이 담겨 있다.
    • 이는 공격자의 Github에서 backendapi Repository의 settings 파일에 대한 Raw 데이터 접근 주소를 가리킨다.

[그림 7] Github으로 관리되는 공격자의 C&C 주소

  • 해당 파일에는 공격자의 C&C 주소가 기록되어 있다.
    • 이는 C&C 주소를 언제든 변경하기 위한 것으로 보인다.

# cli_keccak256 함수

  • 복호화된 데이터(니모닉 시드 등)를 BASE64로 변환해 공격자의 C&C 주소로 POST Method를 통해 전송한다.

3-3) 데이터 탈취 후 증상

니모닉 시드를 획득한 공격자는 니모닉 시드로 획득할 수 있는 암호화폐 주소를 모니터링한다. 공격자는 모니터링 중인 주소를 목적지로 하는 트랜잭션이 메모리 풀에 올라오면 해당 트랜잭션이 블록에 등록되자마자 공격자 주소로 코인이 전송될 수 있도록 피해자의 키를 이용해서 추가 트랜잭션을 생성한다. 공격자가 생성하는 트랜잭션은 채굴이 빨리 될 수록 공격자에게 좋기 때문에 그림 1을 보면 공격자 주소로 ETH를 전송하는 트랜잭션의 Gas Fee가 다른 트랜잭션보다 유난히 높았던 것을 알 수 있다.

이와 같은 공격 행위를 프로그래밍해 자동화한 것을 Sweeper Bot이라고 한다. 이어질 공격자 주소 분석 내용을 읽기 전, 이해를 돕기 위해 먼저 아래 글을 보는 것을 추천한다.

 

Introduction to Sweeper Bot

Sweeper Bot을 이용한 암호화폐 탈취 방법에 대해 살펴본다.

blog.plainbit.co.kr

앞서 설명한 것과 같이 유출된 지갑의 주소로 ETH를 전송하면 수 초 내로 공격자 주소로 자금이 재전송되기 때문에 피해자는 지갑을 새로 생성해서 사용해야 한다.

4. 공격자 정보

4-1) 공격자 SNS 정보

[그림 8] 공격자의 youtube 영상

공격자의 youtube 채널을 확인한 결과 위와 같은 동영상 1개가 업로드 된 사실을 확인했다. 직접 개발한 프로그램을 사용하는 것을 볼 수 있으며, 해킹을 통해 획득한 것으로 추정되는 피해자들의 니모닉 시드, 주소, 개인키, 패스워드 등이 노출되어 있는 것을 알 수 있다.

[그림 9] 공격자 youtube 영상 소개 글

위 영상의 소개 글에서 공격자가 운영 중인 텔레그램 채널을 확인할 수 있다.

[그림 10] 공격자가 운영 중인 텔레그램 채널 대화 중 일부

텔레그램 채널에 접속하면 러시아어로 대화 중인 것을 볼 수 있으며 공격자가 작성한 파일을 공유하는 모습을 볼 수 있다.

[그림 11] 공격자 깃허브에서 삭제된 파일

공격자 깃허브에 다수의 이메일 주소가 포함되어 있던 파일이 업로드 되었다가 삭제된 사실을 확인할 수 있었다.


이어지는 내용은 회사 블로그를 참고해주세요^^