67 KiB
+++ Title = "Транскрипция доклада" hidden = true +++
Введение
Знаете ли вы что около 70% хакеров не делятся со всеми своими личными программами и скриптами (скрин со стендофф чата) А представьте, какой был бы замечательный мир, если эти 70%, делились ими! На github'e сейчас находится 571,000 результатов по ключевому слову 'hack'. Делим эту цифру на 30 процентов, умножаем на 70% получаем прирост на 1,300,000 репозиториев! Заодно, так мы бы заставили Microsoft купить для Github ещё парочку дисков в хранилку. ( (571000 / 30) × 70 ≈ 1,332,333 ) (скриншот с github)
Whoami
Привет, я Casual Независимый иследователь, и я находился в топ-50 хакеров на Standoff365 (независимый иследователь = безработный :) ) Подробней обо мне вы можете посмотреть в моём блоге
(QR и ссылка на about me в блоге)
(Алексей - Casual)
Для кого, о чём и зачем этот доклад?
( 1. Научить писать hack tools 2. Заставить их выкладывать )
Я сделал этот доклад для начинающих хакеров, которые хотят упростить себе жизнь и написать свой первый хакерский инструмент, который поможет вам легче и быстрее взламывать самые непростые штуки. А также замотивировать более опытных, распространить свои скрипты и программы в публичных git репозиториях.
То есть моя цель в том, чтоб заманить вас в движение OpenSource, а если у вас и схожая идеология, то и в движение Free Software, но об этом позже
У этого доклада есть лицензия, смотря этот доклад вы принимаете её. Подробнее вы можете узнать по QR коду. (Casual BY-SA 4.0 - QR код на лицензию в блоге)
Кстати, поднимите руки те, кто уже выкладывал любые свои программы и скрипты на Github или ему подобные! А теперь, пожалуйста, скажите пару слов о них! (2-3 человека)
Что такое OpenSource и Free Software?
И так, что такое OpenSource и Free Software?
Открытое программное обеспечение (OpenSource Software) — программы с открытым исходным кодом.
То есть это те программы, исходный код которых вы можете посмотреть, изменить, и распространять для любых целей.
Свободное программное обеспечение (Free Software) - программы, которые делают то же самое, но уважают "важнейшие" свободы пользователя, кстати вот эти 4 свободы: ( 0. Свобода запускать программу для любых целей.
- Свобода изучать и изменять программу для ваших целей.
- Свобода распространять копии.
- Свобода распространять модифицированные версии. ) Ничего не напоминает?
Так это получается ( OpenSource = Free Software )?
Не совсем. Разница кроется в идеологии программистов.
( OpenSource != Free Software )
Идеология
Тут кстати нужно упоминуть о двух сообществах. Open Source Initiative (OSI) - сообщество продвигающее OpenSource Software (OSS). А также - Free Software Foundation (FSF) - (Free, в переводе не "бесплатно", а "свободная") сообщество продвигающее Свободное ПО(Free software)
А теперь о разнице OpenSource и Free. Помните те 4 свободы, которые о которых я сказал раньше? Что исходный код можно посмотреть, изменить, и распространять для любых целей.
хоть и технически соблюдаются лицензией в OpenSource проектах, но соблюдение которых, может и не быть приоритетом самих программистов.
Приоритет у OpenSource разработчиков, это сделать надёжный и эффективный инструмент, который, в какой-то мере, может заменить коммерческие аналоги. А приоритет у "Свободных" программистов, это предоставить пользователю упомянутые свободы, в процессе создания надёжного и эффективного инструмента.
Всё ещё не совсем ясно в чём конкретно разница, но сейчас объясню.
К примеру, калькулятор на Android от Google. Для него используется лицензия Apache 2.0. Она соблюдает свободы. Однако калькулятор на вашем телефоне - это не свободная программа. Даже если у вас AOSP версия андроида, то есть собраная из исходников, и ваш каклькулятор полностью неизменённая версия того самого калькулятора, (мем - вы не можете просто так взять и установить калькулятор) вы не можете просто так взять, изменить его код и обновить его на вашем телефоне. Вам буквально запрещено установить свою версию калькулятора поверх предустановленного. Да, это решается прошивкой телефона или получением root прав. Но. Тех, у кого AOSP версия андроида, или скажем LinageOS можно пересчитать по пальцам в этом зале. (Кстати, Поднимите руки те, у кого кастомные прошивки на телефоне (шутка - эй, ты, ты 11-ый, пожалуйста опусти руку, ты нарушаешь правила этого доклада :) ) А там, где вендор правит маскарадом, ситуация куда хуже. Он вам может ставить тот же калькулятор, но модифицированный, и из-за изменений в коде и вы не получите исходники этого уже проприетарного калькулятора. А вот кстати так выглядит инструкция по получение Root на флагмане Xiaomi, кстати для этого вам нужно подождать месяц (Скрин xiaomi) Если бы калькулятор использовал GNU GPLv3 лицензию, то его можно было бы обновить на свою версию.
Очевидное решение - поставить ваш кастомный калькулятор не вместо стокового, а как обычное приложение. Но мне оно не нравится, по причине того, что я не люблю когда установлены лишние приложении, но что больше я не люблю, так это факт того, что я не знаю что, установлено на моём телефоне. Не новы случае, когда бэкдор уже предустановлен на телефон. А в случае Google, то везде где есть их сервисы, они по сути владеют Вашим телефоном. (google don't be evil) Они отправляют все ваши фотографии нейронке для провреки на запрещённый контент. У них доступ ко всем паролям от ваших сайтов. К вашим СМСкам и уведомлениям. Они могут обнулить или залочить ваш телефон в любой момент. В общем (literally 1984) А возвращаясь к Xiaomi, на их флагман просто нет кастомной прошивки.
Но вернёмся к OpenSource.
Лицензии
Тут нужно кратенько рассказать про лицензии
Грубо говоря, для OpenSource у вас есть выбор использовать, либо Permissive, либо Copyleft лицензию.
Лицензия нужна для защиты разработчика и его продукта.
Permissive обеспечивает соблюдение свобод - исходный код можно посмотреть, изменить, и распространять для любых целей. Это к примеру MIT License.
Permissive и Copyleft лицензии очень похожи. Однако ключевое отличие - Permissive не запрещает приватизировать код. Т.е. корпорация может воспользоваться кодом из вашей программы, изменить её, и это уже будет её код.
(ah finally copyleft)
В случае же CopyLeft лицензии, компании нужно будет выложить любую модификацию вашей программы в открытый доступ под этой же лицензией. Т.е. просто взять и построить коммерческий продукт с такой лицензией не выйдет.
Пример CopyLeft лицензии - GNU GPLv3
плюсы/минусы для разработчика
А теперь поговорим как изменится ваша жизнь, если вы выложите вашу программу или скрипт в OpenSource
Минусы:
- Недопонимания - как и в любой совместной разработке, это общение с людьми, нужно быть готовым к разнице в восприятии и подходов
Плюсы:
- Мотивация - Выложив программу в открытый доступ, Вы делаете мир лучше, это отлично мотивирует продолжать разработку. - Ричард Столлман, разрабатывал набор утилит GNU, чтоб все могли ими пользоваться. Его команда собрали то, какой мы видем GNU/Linux сейчас.
- Репутация - Вы становитесь более узнаваемым в комьюнити, вас могут приглашать на эвенты и предлагать работу. - К примеру H.D. Мур, создатель Metasploit благодаря своему инструменту попал на множество мероприятий и на пост главного исследователя в Rapid7.
- Портфолио - Если вы будете устраиваться на работу, это будет плюсом, если у вас будут OpenSource проекты. - Для примера далеко ходить не нужно, в моём прошлом собеседовании меня попросили скинуть профиль на github.
- Рост - Делая OpenSource проект, он будет получать изменения от других программистов, которые помогут вам вырости как специалисту и поднять уровень ваших навыкови кода. - Возвращаясь к Муру, он сильно прокачался в написании эксплоитов при работе над Metasploit.
- Качество кода - вы будете писать код будет качественно, если будете знать, что его может увидеть абсолютно любой, чем если бы написали на коленке для себя. - в психологии это называется Эффект Хоторна.
плюсы/минусы для пользователя
А теперь про плюсы и минусы для пользователя
Минусы:
- Поддержка - её может и не быть, а разработка проекта может закончиться через месяц. - Я так одному ютуберу, который выложил свой скрипт вкинул несколько улучшений, но он забросил проект.
- Безопасность - нет гарантии, что программа безопасна, скачивание OpenSource утилит не отличается от скачивания крякнутых программ, если вы конечно не прочитаете исходный код. - Недавний нашумевший пример - это библеотека XZ, которая почти поставила на все обновлённые системы бэкдор.
- Гарантии - если программа поведёт себя как-то не так и приведёт к потере данных, никто не будет нести за это ответственность, кроме самого пользователя
- Документация - Наличие, актуальность и точность документации также не гарантировано. - Помнится я нашёл одну очень специфичную библиотеку на Python, которая решала мою проблему, но как ей пользоваться, я узнал изучая её исходный код.
Плюсы:
- Цена - бери и качай. Все OpenSource программы бесплатны для использования.
- Платформы - OSS зачастую поддерживает больше платформ, чем проприетарный софт. К примеру, Adobe намеренно не разрабатывает Linux версию Photoshop, хотя у них есть версия под MacOS. А условная Krita, есть на всех платформах, да и вроде даже на Android.
- Владение - то, что вы скачали, будет работать на любой другой схожей системе, эта программа принадлежит вам (в рамках лицензии) и у вас её не могут отнять. К примеру, у одного музыканта была прога по типу FL Studio, которую он купил в 10 лет назад. После этого вышло несколько новых версий которые сильно отличались от этой. Севрис онлайн активации отключили, а его комп поломался. И из-за этого он не смог активировать старую версию программы, а техподдержка отказалась помогать ему, не смотря, что лицензия продукта позволяла продолжать использовать старую версию. А ему нужна именно эта версия для его работы. В итоге у него отняли то, что он купил.
- Безопасность - Пользователь может сам удостовериться, что программа безопасна и соответствует заявлениям разработчиков или вашим нуждам - вспоминая пример про XZ - иследователь нашёл бэкдор, а в проприетарном софте, к примеру Windows, он бы и остался необноруженным какое-то время.
- Кастомизация - Пользователь может доработать программу, чтоб она соответсвовала его нуждам. - Не нравится цвет окошка? Подправьте его и пользуйтесь программой. Или вам не нравится какое-то навязчивое окошечко или настройки по умолчанию. Вы можете всё это изменить.
- Community - любой пользователь может помочь разработчику с проектом. И речь не только о написании кода, это также помощь с обсуждением и предложением новых функций, написанием документации, поддержкой пользователей, созданием отчётов о багах или тестах программы. Каждый может помочь в разработке, внезависимости от умений, и получить от этого новые навыки. - К примеру разработчики сервера виртуализации Proxmox, получает больше фидбека от пользователей, чем от компаний. А некоторые пользователи сами им скидывают как исправить их программу, и это не просто костыль, а прям кусок кода, который основательно фиксит проблему.
Особенности написания хакерских утилит
А теперь я расскажу про пример, какого это писать крутой хакерский инструмент
OpenSource = суматоха в жизни
И наш герой H.D. Мур, создатель и разработчик, легендарного хакерского инструмента - Metasploit
пример - Metasploit
В 90-ых Муру было 18 лет, ему в этом возрасте предложили первую работу в ИБ, в частности пентестером. Но в то время было сложно получить эксплоиты, это сейчас мы просто берём и пишим в гугле, программу, её версию и "exploit". А тогда их так просто было не получить, нужно было искать людей в IRC чатах (IRC скрин) , у которых могли бы быть эти эксплоиты. И когда комп Мура был хаотично забит разными эксплоитами без организации и разными вариантами запуска, он решил объеденить все доступные ему эксплоиты в одну программу которую назвал Metasploit. Запустив её, вы можете выбрать эксплоит, ввести входные данные и запустить его. (вопрос к аудитории - А теперь вопрос к аудитории - представьте, вы босс компании по информационной безопасности, и ваш сотрудник показывает вам свою программу, которая может дать любому возможность взломать любую компанию. Как бы вы поступили?) В правильных руках - это инструмент, который поможет защитить множество компаний от взломов, а в неправильных руках, это самое настоящие кибер-оружие. И когда Мур показал это своему нанимателю, он не особо поддерживал его инструмент, точнее, он боялся его. Компания не хотела быть связана с Metasploit и со всем, что делал Мур, но и в то же время они не могли от него избавиться, так как Мур выполнял большинство активных пентестов.
И вот, в 2003 год, он начал распространять Metasploit бесплатно, более того, Open-Source, на сайте metasploit.com. И это сразу же вызвало серьёзное народное волнение, причём казалось, что никто не остался в стороне:
- компания на которую работал Мур,
- клиенты,
- black hat хакеры,
- хакеры с даркнета, которые пишут эксплоиты,
- другие пентестеры, потому что они считали, что Мур крадёт их работу, выпуская такой мощный и простой для использования инструмент. И много недовольных захотели положить его сайт. Попытки взлома, DDoS'ы, , всё дошло до того, что 1 хакер, у которого не получалось взломать сайт, взломал провайдера Мура. Под атаку попал не только сайт, но и сам Мур, у него пытались украсть личность, оклеветать его в сети, всё что можете представить. Успешно атаковать на Мура не выходило, вот и кто-то решил атаковать работодателя Мура.
Боссу Мура приходили письма с требованием уволить Мура, за то, что он делал в нерабочее время, так как считали, что то, что он выкладывает эксплоиты, это безответственно. Но это лишь сподвигло Мура работать усерднее над своим инструментом. Но естевственно не только хакеры и покупатели былли недовольны, также были недовольны и вендоры, разработчики программ, для которых Мур выкладывал эксплоиты. И чтоб компания Мура могла работала с вендорами, они хотели, чтоб не было эксплоитов для их продуктов в Metasploit.
Муру нарвилось всё это, ему нравилось быть как и быть в пентесте атакующим, так и целью атаки одновременно.
Позже Мур добавил инструмент Meterpreter, который делал Metasploit практически вирусом И помимо хакеров, его инструмент не нравился правительству. Всё это время у него были в запасе деньги, на которые он нанял бы адвоката, если бы его ночью арестовали. Но ничего такого не произошло.
Постепенно команда работающая над Metasploit - начала составлять 200 разработчиков И в 2009 году, когда у Мура были долги, стартап, который не приносил денег и беременная жена, компания Rapid7 предложила у него купить Metasploit. И в итоге мы имеем OpenSource версию Metasploit и проприетарную Pro версию. А Мур получил высокооплачиваюмую работу, а также компанию, которая вступилась за него и его проект.
Теперь Metasploit не просто инструмент для пентестеров, а этому учат даже в школах! Программа Мура прошла сквозь ненависть всего мира к общепринятому стандарту.
Сейчас Мур уволился из Rapid7 и у него своя компания.
(Source https://darknetdiaries.com/episode/114/)
Как писать программы, если вы не программист?
На этом этапе я надеюсь, что убедил вас, что OpenSource это круто. Но теперь нужно узнать, как влиться в OpenSource в качестве разработчика. Мы сейчас быстренько пройдёмся по курсу молодого бойца, чтоб выйдя с этого доклада вы уже были готовы начать писать свою программу.
Язык программирования
Про то, на чём писать вашу прогу.
Тут можно начать очередной холивар за язык программирования, но я скажу, что самый крутой язык будет - англисйкий! Он невероятно поможет в изучении практически чего угодно.
А относительно языка программирования, если вы не знаете какой выбрать для написания пентестерских инструментов или у вас нет опыта, то выбирайте GoLang, или просто Go. Только не показывайте друзьям их маскот
Как ему научиться
И как научиться Go?
Мне не нравится сидеть и монотонно изучать язык по книге, по этому я считаю, чтоб научиться писать, нужно просто (just do it) начать пробывать писать свой код и читать чужой, а в процессе вы изучите язык.
Однако, если вы всё-же хотите посидеть и почитать, особенно, если вы до этого в жизни не видели программный код, то я советую:
- оффициальный туториал о том как запустить Go на вашем компьютере,
- затем интерактивную экскурсию по языку,
- и в заключении перейти к туториалу на основе примеров. Так вы получите отличную базу. (стрелочки от ссылке к ссылке) https://go.dev/doc/tutorial/getting-started https://go.dev/tour https://gobyexample.com/
Как программировать гуглить
Если вы думаете, что крутые программисты, сидят и просто пишут код, то вы не правы, программисты пишут код примерно так:
(Мем как пишут успешные программисты код - google)
Хоть это и звучит смешно, но первым делом, нужно научиться гуглить самостоятельно. Я говорю это, потому что я встречал много людей которые не могут это делать.
- Гуглите на английском. Так куда больше шансов найти что ответ.
- Конструкция запроса, примерно такая "язык программирования, что вы хотите"
- Иногда вы не получите ответ, в таком случае вам нужно перефразировать вопрос, в крайнем случае вы можете обратиться к ChatGPT чтоб перефразировал для вас или. Но не используйте ChatGPT для получения самого ответа на ваш вопрос
- Не просите помощи на форумах и у знакомых, пока не потратили хотя бы 25 минут на поиск решения, вы должны научиться сами справлять с такими проблемами
ОС
И пару слов об вашей операционке. Я настаятельно рекомендую установить и начать осваиваться GNU/Linux. Также и в ней программировать.
Git и все-все-все
А теперь про Git
Git - это система контроля версий. Это программа позвоялет откатывать изменения в файлах до предыдущего их сохранения. Также она помогает работать нескольким людям над проектом. Т.е. она умеет совмещать изменения сделаные несколькими разработчиками.
Есть сервисы, которые предоставляют доступ к git репозиториям, самый популярный - GitHub. На него мы и будем загружать наш проект
Guidelines по созданию OpenSource проекта
Так как же сделать свой OpenSource проект?
(сделать скрины к каждому элоементу) 0. Зарегестрируйтесь на Github
-
Создайте Git репозиторий
-
Выберете лицензию
- MIT, если не знаете что выбрать
- GNU GPLv3, если вы хотите, чтоб ваш проект был свободным ПО
-
Склонируйте репозиторий
git clone REPO_LINK
Однако если мы склонируем по SSH ссылке, мы получим ошибку. Т.к. сам github говорит, что мы не добавили SSH ключ в наш аккаунт. Нажимаем по ссылке, а пока идём в терминал и генерируем SSH ключ с помощьюssh-keygen
, нажимаем 3 раза enter. Выводим публичный SSH ключ с помощьюcat
и копируем его. Далее вставляем в наши SSH ключи на Github. После этого мы сможем скачивать репозитории по SSH и загружать изменения, что предотвратит проблемы в будущем. -
Составьте план разработки Вам нужно:
- Запишисать какие функции должна выполнять программа
- Запишисать какие входные данные нужны для неё
- Разбейить эти функции на мельчайшие компоненты, шаги, который должны выполнить программа
- поставьте для них приоритеты:
- базовые/необходимые функции
- дополнительные функции
- улучшения К примеру, изначальная идея: "Я хочу написать программу, которая будет помогать определить работает ли DOS на сайт, то есть сравнить скорость ответа от веб сервера до того как я начну атаку и после (назовём это DOS Checker), а также было бы круто, если бы она делала это в реальном времени и с красивым интерфейсом. Также нужна возможность вставлять кастомные Header'ы и делать POST запросы, если мы ломаем что-то на бэкэнде. А также хочется иметь возможность проверить, правильно ли происходят запросы, так что нужна поддержка http proxy для перехвата запросов. И для точности измерений, пусть она делает несколько запросов и вычесляет среднее время ответа."
В качестве входных данных нам нужны: опрашиваемая URL страница, тип запроса GET/POST (по умолчанию GET), тело запроса (для POST), ссылка на http proxy и запускать ли в режиме мониторинга.
Теперь нужно разбить эти функции на мельчайшие шаги:
- DOS Checker:
- получить ссылку из терминала
- Записать её в переменную
- с помощью библеотеки, сделать GET запрос к ссылке
- получить из библеотеки время ответа
- записать в переменную
- дать пользователю запустить атаку, то есть будем ждать нажатия любой кнопки
- повторить процедуру
- сравнить перемынные, если время ответа увеличилось в 2 раза или больше, значит атака успешна
- http proxy
- получить переменную из флага терминала
- если переменная не пуста, значит устанавливаем её в качестве прокси в библеотеке во всех функциях
- POST запросы + тело запроса
- Сделать отдельную функцию, которая будет делать POST запросы, на вход принимать тело запроса
- если POST флаг присутсвует, то вместо функции GET запроса, отправляем POST запрос с переменной из фалга тела запроса
- кастомные header'ы
- если флаг не пустой, то добавить его в header'ы всех функций, которые делают запросы
- Режим мониторинга
- найти библеотеку для красивого отображения терминального интерфейса
- представить как оно должно выглядеть
- ... А теперь приоритеты: Необходимые функции:
- DOS Checker
- http proxy Дополнительные функции:
- среднее время ответа
- POST запросы Улучшения
- кастомные header'ы
- режим мониторинга
-
Начните разрабатывать вашу программу начиная с базовых функций Просто садитесь и старайтесь сделать тот элемент, которую вы хотите. Гугл вам в помощь. Если гугл не даёт вам нужных результатов, значит нужно разбить функцию на ещё более маленькие элементы. и как привнесёте нужные изменения, проверьте, что прграмма функционирует как вы хотит. Затем загрузите изменеия в репозиторий с помощью комманд
git add . && git commit -am 'новая фича' && git push
. Однако вы наверняка столкнётесь с тем, что git не знает кто вы, по этому он попросит вас добавить ваш email и имя командамиgit config
. А,git add .
- добавляет новые файлы в репозиторийgit commit -am 'новая фича'
- фиксирует сохранение измений, к которым можно потом вернутьсяgit push
- загружает их на GitHub. Для этого нужно будет добавит SSH ключ вашего ПК в Github аккаунт, но мы уже это сделали. После этого наши локальные изменения отобразятся на github. -
Напишите README README, это простой текстовый файл, который описывает ваш проект, и это первое, что увидет потенциальный пользователь в вашем инструменте. README должен ответить на вопросы
- Что делает проект?
- Почему он будет полезен, то есть какой usecase?
- Как мне установить и попробывать его?
- Какие есть функции и как ими пользоваться? То есть небольшная документация
И сейчас я расскажу свой опыт разработки
пример - owncloud_bruteforcer
Во время пентеста, я нашёл owncloud сервис. Owncloud - это OpenSource облачное хранилище, которое можно развернуть на своём сервере. И сделав несколько попыток авторизации, я заметил, что сервис их не блокирует. Я решил, что можно перебирать пароли для пользователей, сделать отчёт и получить за него вознаграждение.
Вот только возникла проблема, я не нашёл программу, которая могла выполнить все требования owncloud для авторизации. Видите ли, owncloud нужно для авторизации:
- валидный CSRF токен, который можно получить в теле страницы логина (показать как на owncloud оно в исходниках)
- cookie, которые можно получить в header'ах ответа (показать как на owncloud оно в header'ах сервера)
- а также определённые Header'ы в запросе, по типу "accept", которое приложение ожидает от клиента (показать как на запросах он идёт)
Я хочу написать bruteforcer, т.е. программу, которая пытается найти нужный пароль для пользователя, пытаясь авторизорваться с помощью wordlist'a, т.е. файла с паролями. Более того, я хочу иметь возможность атаковать сразу нескольких пользователей одной командой, предоставляя вместо имени пользователя, файл с пользователями. А в случае с owncloud, перед каждой попыткой авторизоваться, программа должна перейти на страницу логина, чтоб получить CSRF токен и cookie.
Идея
( визуализировать то о чём я говорю, т.е. каждый элемент)
И так, идея была проста, нам нужно:
- получить входные данные через флаги запуска программы
- с возможностью атаковать либо одного юзера, либо сразу множество из файла
- получить CSRF токен с cookie
- то есть сделать GET запрос на страницу логина
- с помощью регулярных выражений вычленить от туда токен
- с помощью регулярных выражений вычленить cookie из Header'ов
- и вставить их в переменные
- использовать файлом с паролями, для перебора
- попытаться авторизоваться
- в цикле запускается несколько воркеров, паралельных операций, которые будут пытаться авторизоваться
- каждый воркер, получает новый CSRF токен, а заодно и cookie
- каждый из воркеров берёт следующий пароль из wordlist'a и пытается авторизоваться, т.е. делает POST запрос подставляя username и пароль в тело запроса
- происходит проверка успешности авторизации через то, что ответит сервер на запрос
Разработка
Во время разработки, я понял, что очень неудобно дебажить работает ли попытка авторизация, выводя весь пакет в терминале, по этому нужно добавить поддержку http proxy, чтоб я мог смотреть его в burp и иметь возможность проверить, что мы успешно авторизуемся (скрин бурпа) (сделать, чтоб по нажатии он добавлялся в презенташку в список идей)
Во время разработки были баги, много багов. Помимо скучных и не совсем понятных багов, был и неожиданный: Суть в том, что я изначально использовал channel, Channel в Go используется для передачи данных между разными частями программы, которые работают параллельно. Вы можете представить себе channel как трубку, через которую данные могут быть переданы из одной части программы в другую. И в эту трубку можно ложить какое-то количество переменных,где они выстраиваются в очередь, После извлечения переменной из канала, она пропадает. Это решение отлично подходило в моём случае, потому что, у меня несколько воркеров, каждому из которых нужен следующий по списку, неиспользованный пароль. Так в чём заключалается проблема в этом псевдокоде?
(псевдокод, упрощён для понимания)
func main() {
// делаем что-то
for _,user := range users { // Цикл, для каждого пользователя выполнится код ниже.
// а также получаем переменную user, из массива users
pass := make(chan string, 15000001) // Создаём канал pass, с буффером в 15млн переменных.
// rockyou - 14,344,391
for passwords.Scan() { // Для каждого пароля из всех паролей из файла
pass <- string(passwords.Text()) // добавим пароль в канал pass
}
close(pass) // закрываем канал, чтоб функция bruteforce
// не ждала новых переменных в канале
for i:=0; i<10; i++ { // выполняем цикл 10 раз,
go bruteforce(user,pass) // go - запустить паралельно функцию.
// В следствии чего запускаем 10 функций bruteforce,
// которые в цикле читают пароли из канала
}
}
}
(3 минуты таймаут)У вас 3 минуты, можете поднимать руку и высказывать предположения. Дам подсказку, этот баг в итоге сожрёт всю оперативу, почему именно это происходит?
Дам ещё подсказку, вот так можно на скорую руку, починить проблему
func main() {
// делаем что-то
for _,user := range users {
pass := make(chan string, 15000001)
for passwords.Scan() {
pass <- string(passwords.Text())
}
close(pass)
for i:=0; i<10; i++ {
go bruteforce(user,pass)
}
runtime.GC() // Чистим память от неиспользуемых переменных
}
}
В общем проблема заключается в том, что чистильщик памяти (garbage collector) в Go, не успевает чистить память от уже неиспользуеммых каналов которые создаются в цикле. Но при этом варианте, программа всё ещё занимает под 250МБ памяти, что как минимум, не то, что я от неё ожидаю. Так что финальное решение стало:
func main() {
// делаем что-то
for _,user := range users {
pass := make(chan string, 1000) // Меняем буфер на 1000 элементов
// т.е. мы ожидаем, что одновременно
// будет работать меньше 1000 потоков
go func(){ // запускаем добавление паролей в фоне
for passwords.Scan() {
pass <- string(passwords.Text())
}
close(pass)
}()
for i:=0; i<10; i++ {
go bruteforce(user,pass)
}
}
}
То есть программа запускает фоновый процесс, который добавляет пароли пока не заполнится буфер в 1000 элементов, а как место освободится, он добавляет новые пароли. В то же время дальше паралельно запускаются воркеры, которые уже брутфорсят пароль юзера
и не отходя далеко от темы багов можно поговорить за медленное программирование и cult of done, потому что у финального решения есть недостаток - мы для каждого пользователя по новой читаем файл с паролями, а если у нас пароли на медленном и умирающем жёстком диске, то это как минимум замедлит брутфорс. Тем не менее, это решение работает в рамках того какие баги я могу допустить. Т.е. к багам, лично для меня есть 2 варианта подхода: Медленное программирование и Следовать манифесту Cult of Done
Что такое медленное программирование? - Это когда вы программируете, не для того, чтоб выполнить задачу, а чтобы заниматься творчеством и получать удовольствие от этого. То есть вы медленно, спокойно, пытаетесь решить проблему, элемент кода, самым эффективным решением. И много людей получают от этого кайф.
И второй вариант это следовать манифесту Cult of Done, он не про программирование, но он про то как быстрее делать задачи. А ещё он короткий и мне нравится, вот часть манифеста:
2.Смиритесь: всё, что вы делаете – это "черновой вариант". Так проще завершить работу. - Ожидайте, что ваш проект никогда не будет законченным, он не будет иметь всех функций, иметь самый оптимизированный код, или полнуй документацию. 3.Этапа "редактирования" не существует. - Если вы считаете, что вот вы напишите сейчас основные функции программы, а потом начнёте их оптимизировать, то знайте, этого либо не будет, либо займёт непомерно много времени. По этому нужно писать хорошее решение сразу. 7.Сделав что-то, можно про это забыть. - написали программу? Забудьте про её поддержку. У вас и так достаточно проектов над которыми вам нужно работать. 8.Смейтесь над совершенством. Оно скучно и мешает вам завершить результат. - хоть я и перфекционист, но вы никогда не закончите проект, если будете делать его идеальным 10.Поражение тоже считается завершённостью. Совершайте ошибки. - если у вас не вышло написать программу, то вы всё ещё в выйгрыше, вы узнали что-то новое и в следующий раз сделаете лучше.
Какой подход лучше - решать исключительно вам.
Но что для меня оказалось более неожиданным, так это то как реагирует owncloud на мою прогрмму. Оказывается, помимо программы по брутфорсу паролей, я написал программу по DoS-у. Когда я тестил программу в своей лабе, я заметил, owncloud грузит процессор на 100%. (скрин)
Я вам расказываю про баги, для того, чтоб вы понимали, что ошибки в процессе - это совершенно нормально, без ошибок, ваша программа, и особенно вы, не станете лучше. Совершайте ошибки.
Изучить финальную программу можно по qr коду, а вот так работает программа (Демка)
Выводы
И так, резумируем доклад. Вы сегодня узнали:
- Узнали про OpenSource, виды лицензий и Free Software
- Узнали что будет если написать революционный хакерский инструмент (metasploit)
- узнали как сделать свой первый OpenSource проект, а это:
- сделать Git репозиторий,
- составить план разработки,
- выставить приоритеты для функций программы,
- разделить их на самые малые шаги,
- и начать писать
Community track блиц
А теперь небольшой Community track блиц:
-
Чего не хватает в современных профессиональных сообществах?
Я считаю, что не хватает открытости, к примеру крайне мало пентестеров пишут о том как ищут уязвимости, какая у них методология и в каком случае она подходит. Особенно если в краткой форме. Мне лично очень этого не хватает, так что я пишу такие методологии для себя и буду делиться ими в своём блоге. -
Представь, что проекты, которые ты описал в докладе не были созданы. Как бы ты решал исходную задачу? Я говорил про metasploit, Git, GoLang, а также про owncloud_bruteforcer
- Как по мне, Metasploit сделал ИБ сообщество таким, которое оно есть сейчас. Но если бы оно никак не повлияло на ход истории, то я бы просто пользовался exploit-db, т.к. там уже есть эксплоиты из metasploit.
- Если бы у нас не было git, то программисты делились бы кодом, в zip архивах и это было бы коллабарационный ад. Разработка затягивалась бы в десятки раз. А я сам бы пользовался контролем версий в Nextcloud, а также снапшотами BTRFS.
- Не будь у нас Go, я бы наверное писал на C++ или python, но потихоньку переходил бы на rust.
- Если бы я не написал owncloud_bruteforcer - я бы сделал скриптец, который через curl'ы имитировал бы мою программу. Но разработка бы затянулась, чтоб сделать процесс мультипоточным.
- Какой open source проект тебе хотелось бы создать если будет больше времени/ресурсов? Я уже начал разработку такого проекта, но из-за доклада он на паузе. Это Ruina - моя автоматизация Recon'а для пентеста. Как допишу до первой стабильной версии - выложу в opensource и сообщу в своём блоге.
Вы можете оставить фидбек для меня, а также найти транскрипцию доклада, и материалы к ней по QR коду далее (TODO транскрипция доклада, и материалы по QR коду) (qr код на фидбек)
Final
И раз уж вы все досмотрели этото доклад до конца, вы обязаны выполнять условия лицензии, я зачитаю несколько из секции 7.
- Будьте этичными хакерами
- Делитесь исходным кодом своих программ
- Позвоните маме и сделайте комплимент. (qr код на лицензию + фотка интересной части)
Источники.
Спасибо за внимание!
источники
https://choosealicense.com/ https://www.youtube.com/watch?v=B5GF3ror7WI https://ru.wikipedia.org/wiki/%D0%9E%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 https://stackoverflow.com/questions/3902754/mit-vs-gpl-license https://www.gnu.org/philosophy/open-source-misses-the-point.html https://dev.to/opensauced/open-source-101-a-beginners-guide-to-getting-started-37fb https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%BF%D1%80%D0%B8%D0%B5%D1%82%D0%B0%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5
https://www.gnu.org/proprietary/proprietary.html https://www.gnu.org/philosophy/open-source-misses-the-point.html https://www.gnu.org/philosophy/free-sw.html https://www.quora.com/What-are-examples-of-open-source-software-that-are-not-free-software https://opensource.guide/starting-a-project/ https://www.makeareadme.com/ https://gist.github.com/PurpleBooth/109311bb0361f32d87a2 https://darknetdiaries.com/transcript/111/ https://www.infosecinstitute.com/resources/malware-analysis/malware-as-a-service/ https://habr.com/ru/articles/727464/ https://www.labirint.ru/books/495586/ чатик standoff365 https://cleverics.ru/digital/2012/05/cult-of-done/ https://www.youtube.com/watch?v=bJQj1uKtnus https://kata.academy/article/kak-pravilno-guglit-programmistu https://en.wikipedia.org/wiki/Permissive_software_license https://en.wikipedia.org/wiki/MIT_License https://en.wikipedia.org/wiki/Apache_License lurk https://securelist.ru/the-hunt-for-lurk/29220/ https://securelist.ru/bankovskij-troyanec-lurk-specialno-dlya-rossii/28708/ https://www.interfax.ru/russia/821938 https://www.kommersant.ru/doc/5216634 https://unit42.paloaltonetworks.com/unit42-understanding-angler-exploit-kit-part-1-exploit-kit-fundamentals/ https://i.redd.it/oy3zh5xhyra91.png https://vc.ru/legal/130439-polzovatelskoe-soglashenie-pyat-sovetov-ot-yurista https://yandex.ru/legal/rules/ https://kata.academy/article/kak-pravilno-guglit-programmistu https://exploringyourmind.com/the-hawthorne-effect-we-change-when-people-watch-us/ https://www.gnu.org/philosophy/free-sw.ru.html https://opensource.org/osd
медиа https://cdn.business2community.com/wp-content/uploads/2015/06/Open-Source-Logo-517x500.png.png https://pngimg.com/uploads/hacker/hacker_PNG23.png https://img2.joyreactor.cc/pics/post/geek-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA-6555426.png https://www.pngegg.com/en/png-twwdz https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fwiki.installgentoo.com%2Fimages%2Fthumb%2Fb%2Fba%2FSaintstallman.png%2F240px-Saintstallman.png&f=1&nofb=1&ipt=17158a05b6e2ede086b09fd610edd9d2c3ce82f70b251c657131e3c4e7816ada&ipo=images https://www.meme-arsenal.com/create/meme/12552572 https://programmerhumor.io/wp-content/uploads/2021/07/programmerhumor-io-programming-memes-7bab27ca853c90a-768x516.jpg https://dazeinfo.com/wp-content/uploads/2012/04/Google-dont-be-evil1.jpg https://programmerhumor.io/wp-content/uploads/2021/07/programmerhumor-io-programming-memes-7bab27ca853c90a-768x516.jpg https://logos-world.net/wp-content/uploads/2020/09/Google-Logo.png https://pplware.sapo.pt/wp-content/uploads/2011/06/metasploit_logo.png https://atomrace.com/blog/wp-content/uploads/2017/10/metasploit-logo-300x300.png https://upload.wikimedia.org/wikipedia/commons/c/c9/Hdm2018.png https://www.inforte.com/wp-content/uploads/2020/12/rapid-logo-mup.jpg https://ashitani.jp/golangtips/gopher.png https://gowithcode.com/wp-content/uploads/2021/04/top-programming-languages.jpg https://avatanplus.com/files/resources/original/570a76716c3a215400deab23.png https://www.freeiconspng.com/img/44299 https://www.dirjournal.com/info/wp-content/uploads/2012/02/UK-Flag-1.jpg https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.meme-arsenal.com%2Fcreate%2Ftemplate%2F8677148&psig=AOvVaw3TWd4xa5Hr6ALcJMMO9TDs&ust=1715354545860000&source=images&cd=vfe&opi=89978449&ved=0CBAQjRxqFwoTCJC4oOXvgIYDFQAAAAAdAAAAABAE https://www.google.com/imgres?q=just%20do%20it%20meme&imgurl=https%3A%2F%2Fi.giphy.com%2Fmedia%2Fb7f0X8Okk1uyk%2Fsource.gif&imgrefurl=https%3A%2F%2Fdev.to%2Fspences10%2Fcomment%2Fhge&docid=eUXoB89XLopxnM&tbnid=Kl1WOHnH41Hn8M&vet=12ahUKEwjk6fKu8ICGAxWzKhAIHTdRA5QQM3oECGsQAA..i&w=1280&h=720&hcb=2&ved=2ahUKEwjk6fKu8ICGAxWzKhAIHTdRA5QQM3oECGsQAA https://computergeek.nl/wp-content/uploads/2015/01/linux-tux_00378819-1024x768.jpg https://carbon.now.sh https://github.com/charmbracelet/vhs https://www.youtube.com/watch?v=sqBvq0_UF6M https://doc.owncloud.com/webui/next/classic_ui/webinterface.html
https://stackoverflow.com/questions/28958192/no-output-from-goroutine https://go.dev/play/p/584-MAYeMUL https://gobyexample.com/command-line-flags https://gobyexample.com/channels