안녕하세요~!!
오늘은 sweeper bot 스위퍼봇에 대하여 알아보겠습니다!!
1. 가상자산 거래소의 지갑관리
알아보기 앞서!!!
우리가 익숙한 업비트 지갑체계에 대하여 생각해봅시다!
타 거래소 혹은 메타마스크 등에서 업비트로 입금하려할때 이렇게 입금주소를 알려주는데요,
이 주소로 입금을 하면 어떻게될까요?
업비트에서는 사용자 각각의 모든 지갑을 만들어두고,, 모든 자산을 분산하여 관리할까요???
NONONO!!! 업비트 고객수는 약 120만명!!
이 120만명의 지갑에 각각의 자산을 따로 관리하기는 너무 복잡하겠지요~!
그래서!! 업비트는 각각의 지갑에 받은 가상자산을 업비트의 종합지갑에 모아두게됩니다
정말일까요?
아래 block scan 사이트를 봅시다!!
https://polygonscan.com/address/0xaf8b61e350d904e5954ceb54900a1f6b11d9a42c
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
'블록체인 > 블록체인' 카테고리의 다른 글
[web3] ImportError: cannot import name 'getargspec' from 'inspect' 에러해결!! (0) | 2024.03.29 |
---|---|
GoDaddy의 Ethereum Name Service (ENS) 설정해보기 (0) | 2024.02.22 |
이더리움 지갑 주소를 ~~~.eth로 만들기!! (feat ENS) (0) | 2024.02.19 |
블록체인간의 코인 이동!! 브릿지 (Bridge) or 중앙화거래소로! (1) | 2024.01.30 |
2024월 기준 DEX 순위!! (탈중앙화 거래소. Dapp) (2) | 2024.01.30 |
댓글