CyberOK

+6
с 2022

Кибербез, открытый код, исследования www.cyberok.ru

7 подписчиков
0 подписок
Как бы я взломал Рунет?

В сегодняшней статье мы поделимся результатами более чем годового проекта СайберОК, посвященного анализу защищенности периметра Рунета.

1
ФСТЭК опубликовал информацию о патчах в Netcat CMS: устранены 13 уязвимостей, выявленных исследователем Сайбер ОК

17 апреля Федеральная служба по техническому и экспортному контролю (ФСТЭК) опубликовала информацию о важном обновлении в системе управления контентом Netcat CMS и порекомендовала срочно установить патчи для обеспечения безопасности системы.

Новые взломы сайтов. Битрикс не виноват

На форуме разработчиков Битрикс была опубликована запись о злоумышленниках, которые добавляют скрипты на страницы сайтов. При загрузке сайта периодически появляется "капча", после которой пишет, что браузер устарел и требует скачать какой-то exeшник. Естественно, вредоносный.

Таинственные EASM и где они обитают. Часть третья. Где ты?

В заключительной части исследования эксперты СайберОК сравнивают предоставление информации ASM-системами с точки зрения пользователя. Прочитать первую часть можно тут, а вторую тут.

Таинственные EASM и где они обитают. Часть вторая. Как ты?

Полный текст исследования опубликован здесь.

Таинственные EASM и где они обитают. Часть первая. Кто ты?

Мы, эксперты Сайбер ОК, приглашаем вас в турне по сравнению систем класса External Attack Surface Management. Проверим точность как базовых функций таких систем (определение открытых портов и продуктов на конечных устройствах, нахождение связанных с ними доменов) , так и определения уязвимостей. В путь!

Авторы: Даниил Садырин, Андрей Сикорский, CyberOK

В сегодняшней статье эксперты Сайбер ОК проведут вас за руку по лабиринту хакерских уловок и на пальцах объяснят, что такое "бестелесные" веб-шеллы и как с ними бороться.

В этой заметке расскажем о самых опасных уязвимостях сетевого периметра, которые мы в CyberOK отслеживали в сентябре 2023 года.

Обновись сейчас! ТОП-5 самых опасных уязвимостей сентября
1

Автор: Андрей Погребной, CyberOK

Мы в СайберОК проводим пентесты каждый день и, естественно, ищем способы как автоматизировать этот процесс. Мы перепробовали самые разные инструменты – коммерческие, открытые, да всякие. В итоге пришли к тому, что фраза «хочешь сделать хорошо – сделай это сам» очень нам откликается и запилили свой симво…

1

Автор публикации: Лукьянов Артур, младший исследователь, CyberOK

Мы в СайберОК в ходе пентестов очень любим “взламывать” разнообразные инновационные и необычные вещи. Смарт-контракты на блокчейне давно появились на наших радарах, так как они не только предлагают прозрачность, надежность и автоматизацию, но и легко могут стать объектом…

1

Автор публикации: Лукьянов Артур, младший исследователь, CyberOK

Привет! Меня зовут Артур, я являюсь стажёром в компании СайберОК и занимаюсь анализом защищенности. В этой статье я поделюсь с вами тем, как я искал жертву, а нашел хакера, и почему не все уязвимости стоит эксплуатировать.

3
\n","lang":""}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"e21f31b4-ed34-50fb-9be6-a2d9cfc28d2c","width":418,"height":170,"size":9284,"type":"jpg","color":"4a4a4c","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAEBAQEBAQEBAQEBAQECAgMCAgICAgQDAwIDBQQFBQUEBAQFBgcGBQUHBgQEBgkGBwgICAgIBQYJCgkICgcICAj/2wBDAQEBAQICAgQCAgQIBQQFCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAj/wAARCAAKAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABQcK/8QAIxAAAQMDAgcAAAAAAAAAAAAAAgEEBQADBhEhByIxQVJhwf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwDcy14L4gLyLlClc1knDUyuWjcTjm6JKpIXMinoW6d/adFWq/R0RtGtNPD7SNB//9k="}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Остаётся подключить кнопки к контракту. Например, так (для Metamask):

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"const testnetServerAddress = 'https://your-testnet-rpc-url'; // Replace with your testnet server address\n\n// Function to connect MetaMask\nasync function connectMetaMask() {\n // Check if MetaMask is installed\n if (typeof window.ethereum !== 'undefined') {\n try {\n // Request MetaMask to connect\n await window.ethereum.request({ method: 'eth_requestAccounts' });\n console.log('Connected to MetaMask');\n } catch (error) {\n console.error(error);\n alert('Failed to connect to MetaMask');\n }\n } else {\n alert('MetaMask is not installed');\n }\n}\n\n// Function to invoke getSecret() function\nasync function invokeGetSecret() {\n // Check if MetaMask is connected\n if (typeof window.ethereum !== 'undefined') {\n try {\n // Get the current selected account\n const accounts = await window.ethereum.request({ method: 'eth_accounts' });\n\n // Get the contract instance\n const contract = new window.ethereum.Contract(contractAbi, contractAddress);\n\n // Call the getSecret() function\n const secret = await contract.methods.getSecret().call({ from: accounts[0] });\n console.log('Secret:', secret);\n } catch (error) {\n console.error(error);\n alert('Failed to invoke getSecret()');\n }\n } else {\n alert('Please connect to MetaMask');\n }\n}\n\n// Function to invoke changeOwner() function\nasync function invokeChangeOwner() {\n // Check if MetaMask is connected\n if (typeof window.ethereum !== 'undefined') {\n try {\n // Get the current selected account\n const accounts = await window.ethereum.request({ method: 'eth_accounts' });\n\n // Get the contract instance\n const contract = new window.ethereum.Contract(contractAbi, contractAddress);\n\n // Call the changeOwner() function\n await contract.methods.changeOwner().send({ from: accounts[0] });\n console.log('Owner changed successfully');\n } catch (error) {\n console.error(error);\n alert('Failed to invoke changeOwner()');\n }\n } else {\n alert('Please connect to MetaMask');\n }\n}\n\n// Event listener for the 'Get Secret' button\ndocument.querySelector('#button-getsecret').addEventListener('click', invokeGetSecret);\n\n// Event listener for the 'Change Owner' button\ndocument.querySelector('#button-changeowner').addEventListener('click', invokeChangeOwner);","lang":""}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Игровой процесс"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Task-based часть Blockchain CTF предлагает интересный игровой процесс для участников. Они получают задачу, которая представляет собой уязвимый смарт-контракт, и их задача состоит в том, чтобы найти и эксплуатировать уязвимость для получения доступа к защищенным ресурсам или выполнения определенного действия. Лучше подготовить несколько разных “испытаний” — так участники смогут проверить свои навыки в разных областях. Такой игровой процесс стимулирует участников к активному обучению и исследованию, а также позволяет им применить свои навыки на практике — “гугление” во время CTF не только развивает чуйку и эрудицию, но и совершенствует навыки.

"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Подсчет баллов и объявление победителей"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

После завершения Blockchain CTF процесса необходимо подсчитать баллы участников и объявить победителей. В зависимости от сложности и успешности выполнения задачи участники получают определенное количество баллов. Интересный вариант подсчёта баллов — выдача участнику монет на тестнете за выполнение заданий. Тогда побеждает самый “богатый” на конец соревнования участник.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Так, когда мы проводили CTF на Standoff 10, победителями соревнования стали: Сачивко Никита, Вячеслав Дмитриев, Греков Илья и Левчук Павел.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В следующей части статьи мы рассмотрим “Атаку на реальный смарт-контракт”, где мы расскажем, как использовали реальный контракт для CTF — реставрацию состояния смартконтракта и подготовку контракта для участников.

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":2,"reposts":0,"views":660,"hits":405,"reads":null,"online":0},"dateFavorite":0,"hitsCount":405,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/id1279951/774832-sozdanie-blockchain-ctf-issledovanie-uyazvimostei-smart-kontraktov-chast-1","author":{"id":1279951,"name":"CyberOK","nickname":null,"description":"Кибербез, открытый код, исследования www.cyberok.ru","uri":"","avatar":{"type":"image","data":{"uuid":"50913896-1580-5565-b8b9-37dfed719dd6","width":2380,"height":2380,"size":101197,"type":"png","color":"040404","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIAJQAlAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/wAALCAAKAAoBAREA/8QAFQABAQAAAAAAAAAAAAAAAAAABwL/xAAkEAABAwMEAQUAAAAAAAAAAAACAQMEBRESAAYHFAgTISQycf/aAAgBAQAAPwAfp/i34au7Nos5/l8PmwG3++W4oMVZzyt5GOLwF1sSuOKpdMbLdSRdBO7OI+AaVuqs0uh8qdymw6hIjw5Hejn6zAOELZ5CNluKIt09lvoCF54AJsHTEC+woSoi/qanX//Z"}},"cover":{"cover":{"type":"image","data":{"uuid":"cb0844b8-4593-5af4-bdbf-364df48f28ea","width":1280,"height":720,"size":20837,"type":"jpg","color":"040404","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/wAALCAAKAAoBAREA/8QAFgABAQEAAAAAAAAAAAAAAAAACAAJ/8QAJRAAAQIEBAcAAAAAAAAAAAAAAQMEAAIFEgYRITEIExYYM1hh/9oACAEBAAA/AMPqPgXADtyyDvHr1smupa4IoKkxby3Ki7yZHSVI6bc072HNDdo3Cd7RVEfOinZygdRR/9k="}},"cover_y":46},"achievements":[{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 25 августа 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":5607533,"userId":1279951,"count":0,"shareImage":"https://api.vc.ru/achievements/share/5607533"},{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4168742,"userId":1279951,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4168742"}],"lastModificationDate":1764916632,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1279951,"name":"CyberOK","nickname":null,"description":"Кибербез, открытый код, исследования www.cyberok.ru","uri":"","avatar":{"type":"image","data":{"uuid":"50913896-1580-5565-b8b9-37dfed719dd6","width":2380,"height":2380,"size":101197,"type":"png","color":"040404","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIAJQAlAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/wAALCAAKAAoBAREA/8QAFQABAQAAAAAAAAAAAAAAAAAABwL/xAAkEAABAwMEAQUAAAAAAAAAAAACAQMEBRESAAYHFAgTISQycf/aAAgBAQAAPwAfp/i34au7Nos5/l8PmwG3++W4oMVZzyt5GOLwF1sSuOKpdMbLdSRdBO7OI+AaVuqs0uh8qdymw6hIjw5Hejn6zAOELZ5CNluKIt09lvoCF54AJsHTEC+woSoi/qanX//Z"}},"cover":{"cover":{"type":"image","data":{"uuid":"cb0844b8-4593-5af4-bdbf-364df48f28ea","width":1280,"height":720,"size":20837,"type":"jpg","color":"040404","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/wAALCAAKAAoBAREA/8QAFgABAQEAAAAAAAAAAAAAAAAACAAJ/8QAJRAAAQIEBAcAAAAAAAAAAAAAAQMEAAIFEgYRITEIExYYM1hh/9oACAEBAAA/AMPqPgXADtyyDvHr1smupa4IoKkxby3Ki7yZHSVI6bc072HNDdo3Cd7RVEfOinZygdRR/9k="}},"cover_y":46},"achievements":[{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 25 августа 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":5607533,"userId":1279951,"count":0,"shareImage":"https://api.vc.ru/achievements/share/5607533"},{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4168742,"userId":1279951,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4168742"}],"lastModificationDate":1764916632,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"reactions":{"counters":[{"id":1,"count":1}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}},{"type":"entry","data":{"id":503508,"customUri":null,"subsiteId":1279951,"title":"Обманчивые смартконтракты","date":1663359512,"dateModified":1663359512,"blocks":[{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Автор публикации: Лукьянов Артур, младший исследователь, CyberOK

"}},{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"

Привет! Меня зовут Артур, я являюсь стажёром в компании СайберОК и занимаюсь анализом защищенности. В этой статье я поделюсь с вами тем, как я искал жертву, а нашел хакера, и почему не все уязвимости стоит эксплуатировать.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Блокчейн в сети Ethereum полностью публичен, и каждый может посмотреть, какие контракты запущены в сети, каким образом они взаимодествуют, сколько денег перетекает с контракта на контракт. Но сеть довольно большая и постоянно расширяется. Каждые 14 секунд создается новый блок, возникают новые сущности, иногда с интересными свойствами и уязвимостями. Чтобы не отстать, нужна автоматизация, поэтому на стажировке я начал писать тулу для сбора Threat Intelligence информации из сети Ethereum.

"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Атака контрактов"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Первая цель, которую мы поставили перед собой, это поиск контрактов, которые атакуют другие контракты, то есть пытаются перевести ETH с контракта жертвы.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Технически это несложно, например, можно отслеживать вызовы между контрактами через эмуляцию транзакции. Конечно, нам нужны не все вызовы, но те, которые характерны для конкретных атак и приводят к переводу средств. Сферические Гонки в Эфире мало кому интересны.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Реализовав данную стратегию для reentrancy attack, мы сразу обнаружили интересный контракт.

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"134ee452-2765-5d4b-b3b3-3f19a6a09c87","width":1356,"height":133,"size":11450,"type":"png","color":"141414","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Рассмотрим транзакцию подробнее:

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"072fe7b7-19c1-5a3a-99e9-23928e3e3df7","width":1916,"height":335,"size":33503,"type":"png","color":"141414","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Это выглядит как неудачная попытка эксплуатации reentrancy — выполнение транзакции закончилось через revert, а деньги не были пересланы на атакующий контракт.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Интересно, почему атака не прошла? Мы быстро сделали PoC и запустили его в testnet. Но что-то пошло не так, и вместо ожидаемых эфиров мы увидели скучный revert. При дебаге транзакции, изучив вызываемые функции я заметил кое-что подозрительное. Эксплойт работает — контракты вызывают друг друга в этой рекурсии. Однако при выходе из рекурсии начинает происходить что-то странное — вызывается совсем другой адрес, от которого и происходит revert.

"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Разбор найденных смарт-контрактов"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Рассмотрим смарт-контракт «жертву\". Сразу бросается в глаза строчка »msg. sender. call. value(_am) ()\" с классической уязвимостью, приводящей к reentrancy. При этом, даже перечитав контракт в шесть глаз, мы не нашли в исходном коде контракта people_BANK и Log ничего, что могло бы помешать проведению атаки.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"...\npragma solidity ^0.4.25;\n\ncontract PEOPLE_BANK\n{\n function Collect(uint _am) public payable\n {\n... \n if(msg.sender.call.value(_am)())\n {\n... LogFile.AddMessage(msg.sender,_am,\"Collect\");\n }\n... \nfunction PEOPLE_BANK(address log) public{\n LogFile = Log(log);\n }\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Но факт остается фактом, эксплуатация контракта приводила к отмене транзакции — revert. Возможно стоит заглянуть глубже, в байткод контрактов.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Декомпилируем байт-код на etherscan и обнаруживаем странное… Части кода вообще нет в исходнике!

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"83662eb3-5b98-576e-ba52-6b212d9bee65","width":1136,"height":640,"size":28853,"type":"png","color":"34342c","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Если мы выводим деньги с контракта (операция начинается с 'C' — то есть 'Collect'), то требуется чтобы количество выводимых средств было меньше, либо равно нулю. Есть исключение — адрес, который находится на storage slot 6 — \"0x0a494fec232c75df8ba0a781015c2382fef5abc8\". Это и мешает проэксплуатировать такую простую уязвимость.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Так же важно отметить, что solidity 0.4.25 имеет интересную особенность. При неудачной эксплуатации будет вызываться revert, который отменяет все вызовы через call, а криптовалюта, посланная на этот контракт, остается на нем. Учитывая, что для попытки эксплуатации требуется перевести 1 ETH, взлом уже не выглядит таким заманчивым для атакующего. Ведь по сути, при попытке эксплуатации он фактически подарит владельцу «контракта-жертвы» один маленький Эфир. Очень похоже на горшочек с медом, который уж очень странный предмет, да-да-да!

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Немного погуглив, я понял что мы далеко не первые обнаружили эту ловушку. Тема ханипотов не нова, и неоднократно поднималась различными исследователями с 2018 года. На нашем гитхабе есть подробная подборка статей на эту тему.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Однако, мы решили пойти дальше и понять поведение не только контрактов, но и злоумышленников.

"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Расследование"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В «горшочке» находилось 20 ETH (~1.900.000 рублей на момент написания статьи). Отследив их путь, можно заметить что PEOPLE_BANK переехал на новый адрес: https://etherscan. io/address/0xe07e724a96866daae308870d1a5eb41258436b53

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"fa5e2990-db6d-5b82-b41b-e3a958a6ecb9","width":1403,"height":664,"size":36218,"type":"png","color":"142845","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Взглянем на цепочку транзакций, которая привела ETH на адрес этого контракта, используя утилиту CyberOK для Threat Intelligence в блокчейне (да, именно с нее все и началось).

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"2c7cdebe-4207-56c3-8f27-8241451afb82","width":1029,"height":726,"size":50151,"type":"png","color":"2c2c34","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Из графа можно сделать следующие выводы:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Наша тула обнаружила в сети большое количество ханипотов которые связаны друг с другом.","Часть средств поступила через биржи (выглядят как большое скопление адресов) .","Существовало две цепочки, которые соединились некоторое время назад.
"],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Попробуем раскрутить эту цепочку. Первый интересный факт — смартконтракт всё время \"переезжает\" на новые адреса. Вероятнее всего, это было сделано, чтобы код контракта отображался в выдаче от etherscan (500 последних verified контрактов) и привлекал новых любителей \"багбаунти\". Код контракта не меняется, но его имя образуется как `<случайное слово>_BANK`.

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"47743013-d579-5d32-9d20-014eaed53fc9","width":592,"height":722,"size":46417,"type":"png","color":"f4f4fb","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Кроме того, существует ещё один контракт, связанный с BANK (1), находящийся на параллельной цепочке, Game (2). Его код отличается от BANK и не имеет явных уязвимостей, но схожее поведение (именование, «переезды») и пересечение цепочек транзакций на некоторых адресах, не оставляет сомнений что эти два контракта принадлежат одному владельцу.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Глубже в цепочке можно обнаружить и другие honeypot-ы:

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"a2696a13-581c-5a5f-a06c-f6584cb975c4","width":733,"height":324,"size":31645,"type":"png","color":"f4f4fb","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Gift_for_you_1: https://etherscan. io/address/0x8bbf2d91e3c601df2c71c4ee98e87351922f8aa7#code

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Время от времени на эти ханипоты попадается по несколько человек:

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Попытки вывести криптовалюту с Game: https://etherscan. io/address/0xe37b75941d9b8e3139e16a774faa2d9fb1fc9f28

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"2afac444-6e2b-556b-b041-577c95821e5c","width":1458,"height":489,"size":44155,"type":"png","color":"142645","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

BANK: https://etherscan. io/address/0x93d3395b08bbd0d9998ec9ed00ca9d329328964e#internaltx

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"2c247dac-ea34-5e36-bc6b-5bfde910bd12","width":1423,"height":344,"size":37726,"type":"png","color":"142745","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Ещё имена контрактов-ханипотов:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["?_BANK","PreSaleFund","try_to_Play","?_GAME","For_Test","GO_GO_GO","Loan","Distributor","Multiplicator","Conductor","Gift_?","enigma","experimental_ETH_auction","AddressLotteryV2"],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Пример контракта Game: https://etherscan. io/address/0xe37b75941d9b8e3139e16a774faa2d9fb1fc9f28#code

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Первый контракт («SiriusFund\") был создан 1 сентября 2017 года и с небольшими изменениями (изменённые названия контрактов, имена некоторых переменных) существует и по сей день. За это время в \"горшочек» 252 исследователи уязвимостей сложили 177 эфиров, которые владелец разделял между различными аккаунтами. Он старается не держать на контракте больше 30 эфиров и обычно переезжает на новый адрес раз в 4 дня.

"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Заключение"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Ловушки в смарт-контрактах достаточно интересная тема и о них надо знать каждому, кто занимается безопасностью крипты. Некоторые схемы удивительно живучи, например данный контракт живет уже более 3 лет.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Резюмируя:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Всегда следует проверять байткод контракта и зависимостей, вне зависимости от того, что написано в исходниках.","Эксплойты надо обязательно проверять на тестнете, даже если уязвимость кажется банальной.","Контракты, которые требуют от вас ввода крипты, требуют особой осторожности при анализе.","Хакер, не дай себя хакнуть!"],"type":"UL"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":8,"favorites":3,"reposts":0,"views":77,"hits":1252,"reads":null,"online":0},"dateFavorite":0,"hitsCount":1252,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/id1279951/503508-obmanchivye-smartkontrakty","author":{"id":1279951,"name":"CyberOK","nickname":null,"description":"Кибербез, открытый код, исследования www.cyberok.ru","uri":"","avatar":{"type":"image","data":{"uuid":"50913896-1580-5565-b8b9-37dfed719dd6","width":2380,"height":2380,"size":101197,"type":"png","color":"040404","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIAJQAlAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/wAALCAAKAAoBAREA/8QAFQABAQAAAAAAAAAAAAAAAAAABwL/xAAkEAABAwMEAQUAAAAAAAAAAAACAQMEBRESAAYHFAgTISQycf/aAAgBAQAAPwAfp/i34au7Nos5/l8PmwG3++W4oMVZzyt5GOLwF1sSuOKpdMbLdSRdBO7OI+AaVuqs0uh8qdymw6hIjw5Hejn6zAOELZ5CNluKIt09lvoCF54AJsHTEC+woSoi/qanX//Z"}},"cover":{"cover":{"type":"image","data":{"uuid":"cb0844b8-4593-5af4-bdbf-364df48f28ea","width":1280,"height":720,"size":20837,"type":"jpg","color":"040404","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/wAALCAAKAAoBAREA/8QAFgABAQEAAAAAAAAAAAAAAAAACAAJ/8QAJRAAAQIEBAcAAAAAAAAAAAAAAQMEAAIFEgYRITEIExYYM1hh/9oACAEBAAA/AMPqPgXADtyyDvHr1smupa4IoKkxby3Ki7yZHSVI6bc072HNDdo3Cd7RVEfOinZygdRR/9k="}},"cover_y":46},"achievements":[{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 25 августа 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":5607533,"userId":1279951,"count":0,"shareImage":"https://api.vc.ru/achievements/share/5607533"},{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4168742,"userId":1279951,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4168742"}],"lastModificationDate":1764916632,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1279951,"name":"CyberOK","nickname":null,"description":"Кибербез, открытый код, исследования www.cyberok.ru","uri":"","avatar":{"type":"image","data":{"uuid":"50913896-1580-5565-b8b9-37dfed719dd6","width":2380,"height":2380,"size":101197,"type":"png","color":"040404","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIAJQAlAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/wAALCAAKAAoBAREA/8QAFQABAQAAAAAAAAAAAAAAAAAABwL/xAAkEAABAwMEAQUAAAAAAAAAAAACAQMEBRESAAYHFAgTISQycf/aAAgBAQAAPwAfp/i34au7Nos5/l8PmwG3++W4oMVZzyt5GOLwF1sSuOKpdMbLdSRdBO7OI+AaVuqs0uh8qdymw6hIjw5Hejn6zAOELZ5CNluKIt09lvoCF54AJsHTEC+woSoi/qanX//Z"}},"cover":{"cover":{"type":"image","data":{"uuid":"cb0844b8-4593-5af4-bdbf-364df48f28ea","width":1280,"height":720,"size":20837,"type":"jpg","color":"040404","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/wAALCAAKAAoBAREA/8QAFgABAQEAAAAAAAAAAAAAAAAACAAJ/8QAJRAAAQIEBAcAAAAAAAAAAAAAAQMEAAIFEgYRITEIExYYM1hh/9oACAEBAAA/AMPqPgXADtyyDvHr1smupa4IoKkxby3Ki7yZHSVI6bc072HNDdo3Cd7RVEfOinZygdRR/9k="}},"cover_y":46},"achievements":[{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 25 августа 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":5607533,"userId":1279951,"count":0,"shareImage":"https://api.vc.ru/achievements/share/5607533"},{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4168742,"userId":1279951,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4168742"}],"lastModificationDate":1764916632,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"reactions":{"counters":[{"id":1,"count":3}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}}],"cursor":"PuR2GsZKFTvhhG9RBovi4NrVS6IzQAa09I6wtbz/zlbeaPDONLWoxE5e629Fl24=","isAnonymized":true}};