본문 바로가기
블록체인/블록체인

Sweeper bot(스위퍼봇) 에 대하여 알아보자 (feat. 거래소 지갑관리, 지갑해킹)

by 일등박사 2024. 3. 30.
728x90

 

안녕하세요~!!

 

오늘은 sweeper bot 스위퍼봇에 대하여 알아보겠습니다!!


1. 가상자산 거래소의 지갑관리

알아보기 앞서!!! 

우리가 익숙한 업비트 지갑체계에 대하여 생각해봅시다!

 

 

타 거래소 혹은 메타마스크 등에서 업비트로 입금하려할때 이렇게 입금주소를 알려주는데요,

이 주소로 입금을 하면 어떻게될까요?

업비트에서는 사용자 각각의 모든 지갑을 만들어두고,, 모든 자산을 분산하여 관리할까요???

 

NONONO!!! 업비트 고객수는 약 120만명!!

이 120만명의 지갑에 각각의 자산을 따로 관리하기는 너무 복잡하겠지요~!

그래서!! 업비트는 각각의 지갑에 받은 가상자산을 업비트의 종합지갑에 모아두게됩니다

외부지갑 > 내 지갑 > 업비트 종합지갑

 

 

정말일까요?

아래 block scan 사이트를 봅시다!!

https://polygonscan.com/address/0xaf8b61e350d904e5954ceb54900a1f6b11d9a42c

 

Address 0xaf8b61e350d904e5954ceb54900a1f6b11d9a42c | PolygonScan

The Address 0xaf8b61e350d904e5954ceb54900a1f6b11d9a42c page allows users to view transactions, balances, token holdings and transfers of ERC-20, ERC-721 and ERC-1155 (NFT) tokens, and analytics.

polygonscan.com

 

 

1번과 같이 제 업비트 MATIC 지갑주소(0xaf8b61e350d904e5954ceb54900a1f6b11d9a42c)에

           79.74788189개 MATIC이 입금을 하면, 바로 몇불록 이후에 

2번과 같이 같은 수량의 MATIC이 "0xab3cd5e47b75f6abd57e95e6540ecbf001487d31" 지갑으로 넘어가게됩니다!!

 

그래서 그 이동한 지갑을 본다면,

https://polygonscan.com/address/0xab3cd5e47b75f6abd57e95e6540ecbf001487d31

 

현재 싯가로 약 10억에 달하는 772,161 개정도의 폴리곤 토큰이 들어있음을 확인할 수 있습니다!!

 

그래서, 내 자산을 출금할때에도 내 거래소 지갑이 아니라, 거래소의 종합지갑에서 출금이 발생하게됩니다!!

 

이해가 되셨나요!??

 

이때!! 내 지갑의 자산을  바로 다른지갑으로 보내는역할을 하는것이

바로 오늘의 주제 sweeper bot, 스위퍼 봇입니다!

 

 

 

스위퍼봇에 대하여 알아보겠습니다!!


2. Sweeper bot의 원리 (코드 분석)

이제. 이 sweeper bot의 코드를 분석해봅다!!!

우선 필요한 준비물은 4가지입니다.

각각은 아래의 변수로 지정했습니다

 

1. 코인이 빠져나갈 지갑 주소 (my_wallet)

2. 코인이 빠져나갈 지갑의 private 키 (my_password)

3. 코인을 받을 목적지 지갑주소 (second_wallet)

4. 지갑에 일정 값 이상의 ETH가 있을때 보내는  threshold : ETH_MIN_SWEEP

 

그리고 코드는 python3 의 web3 방식으로 알아봅시다

 

from web3 import Web3
import requests
import json
from decimal import Decimal
import time

## 필요 변수들
my_wallet      = {실제 지갑주소를 입력합니다} 
my_password   = {지갑주소의 pricate key를 입력합니다!! 보안중요!!}
second_wallet = {실제 지갑주소를 입력합니다}
ETH_MIN_SWEEP = 1


## TESTNET  : 실제 사용할 값을 입력
ETHTEST_ADR = "https://rpc2.sepolia.org/"
ETHTESTchain_id = 11155111


### 기존 계정조회하기 USING Web3
w3 = Web3(Web3.HTTPProvider(ETHTEST_ADR))

while True:
    balance = w3.from_wei(w3.eth.get_balance(my_wallet), 'ether')
    if balance > ETH_MIN_SWEEP:
        send_amount  = w3.eth.get_balance(my_wallet)
        nonce = w3.eth.get_transaction_count(my_wallet)
        tx = {
            'nonce': nonce,
            'to': my_wallet,
            'value':  send_amount,
            'gas': 2000000,
            'gasPrice': w3.to_wei('50', 'gwei')
        }
        signed_tx = w3.eth.account.sign_transaction(tx,my_password)
        tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
    else:
        ## 잔고가 MIN_SWEEP보다 부족할경우 10초 대기
        time.sleep(10)

 

위 코드를 한 서버에 저장시켜두고 프로세스를 띄운다면!!

my_wallet의 스위퍼봇이 완성된것입니다!!!

아주 간단하죠!?

 

javascript 코드로는 아래와 같습니다

const ethers = require('ethers');
const Web3 = require("web3");
const ETH_MIN_SWEEP = '0.002'; // ETH MIN SWEEP (string)
const WALLET_SWEEP_KEY = '3ff61cb8f6370f010475abdd3776da2c13c1053e9948a5422cf7506dd5944bf2';
function printProgress(progress){
    process.stdout.clearLine();
    process.stdout.cursorTo(0);
    process.stdout.write(progress);
}
function sleep(millis) {
  return new Promise(resolve => setTimeout(resolve, millis * 1000 * 60));
}
async function main() {
	global.web3 = new Web3('https://us-ethereum1.twnodes.com/'); // Trust Wallet Node :)
	const WALLET_SWEEP = web3.utils.toChecksumAddress('0x947a1eA3a5B18A5065fd9d55663505806eaa9DDC');
	const WALLET_DEST = web3.utils.toChecksumAddress('0x1ae97b609C30134b8A3b992581b29096Deb28dBb');
	const ETH_GAS_GWEI = await web3.utils.toWei('105', 'gwei'); // 0,000000105 ETH !
	//const ETH_GAS_GWEI = await web3.utils.toWei('25', 'gwei');
	const ETH_MIN = await web3.utils.toWei(ETH_MIN_SWEEP, 'ether');
	
	var counter = 0;
	var done = 0;
	var errors = 0;

	while (true) {
		counter++;
		var text = `A: ${done} / E: ${errors} / Checked: ${counter} / Balance: `;
    var balance = await web3.eth.getBalance(WALLET_SWEEP)

    if (Number(balance) > Number(ETH_MIN)) {
    	try {
	      let nonce = await web3.eth.getTransactionCount(WALLET_SWEEP);
	      let transfer_amount = Number(balance) - ETH_GAS_GWEI * 21000;
	      let tx_price = { 'chainId':1, 'nonce':Number(nonce) + 1, 'to':WALLET_DEST, 'value': transfer_amount, 'gas':21000, 'gasPrice':Number(ETH_GAS_GWEI) };
	      let signed_tx = await web3.eth.accounts.signTransaction(tx_price, WALLET_SWEEP_KEY); // eth private key
	      let tx_hash = await web3.eth.sendSignedTransaction(signed_tx.rawTransaction);
	      let amount_sent_eth = await web3.utils.fromWei(String(transfer_amount), 'ether');
	      done++;
	      await sleep(60);
	    } catch (e) {
	    	await sleep(10);
	    	console.log(e);
	    	errors++;
	    }
    } else {
    	let view = await web3.utils.fromWei(String(balance), 'ether');
    	text += `${view} ETH`;
    }
    printProgress(text);
	}
}
main();

 


3. Sweeper bot 해킹..

방금전, python의 간단한 코드로 지갑의 잔액을 다른지갑으로 자동을 뺴도록 하는 로직을 알아보았습니다.

결국 이것의 핵심은 지갑주소와 그 private  key인데요,,

어떤 지갑이던 그 비밀키만 안다면 잔액을 조회하여 실시간으로 다른곳으로 빼돌릴수가 있습니다!!

 

이에,, private key 가 노출된다면 어느 누군가에 의해 내 지갑의 잔액을 모두 해킹당할 위험이있습니다.

이에 여러분들은 꼭 지갑의 private key를 소중히 보관하여야합니다!!

 

 

 

 

 

ㅁ 참고 : https://github.com/japancode/ETH-Sweeper-Bot/blob/main/index.js

ㅁ참고2 : https://support.metamask.io/hc/en-us/articles/5716855323675-Fighting-back-against-sweeper-bots

 

728x90

댓글