720 lines
67 KiB
Markdown
720 lines
67 KiB
Markdown
+++
|
||
Title = "Транскрипция доклада"
|
||
hidden = true
|
||
+++
|
||
|
||
|
||
|
||
# Введение
|
||
|
||
Знаете ли вы что около 70% хакеров не делятся со всеми своими личными программами и скриптами
|
||
(скрин со стендофф чата)
|
||
А представьте, какой был бы замечательный мир, если эти 70%, делились ими! На github'e сейчас находится 571,000 результатов по ключевому слову 'hack'. Делим эту цифру на 30 процентов, умножаем на 70% получаем прирост на 1,300,000 репозиториев! Заодно, так мы бы заставили Microsoft купить для Github ещё парочку дисков в хранилку.
|
||
( (571000 / 30) × 70 ≈ 1,332,333 )
|
||
(скриншот с github)
|
||
|
||
<!-- 35s -->
|
||
|
||
## Whoami
|
||
|
||
Привет, я Casual
|
||
Независимый иследователь, и я находился в топ-50 хакеров на Standoff365
|
||
(независимый иследователь = безработный :) )
|
||
Подробней обо мне вы можете посмотреть в моём блоге
|
||
<!-- TODO может изменить статью в блоге -->
|
||
|
||
|
||
|
||
(QR и ссылка на about me в блоге)
|
||
|
||
|
||
(Алексей - Casual)
|
||
|
||
<!-- 10s -->
|
||
|
||
## Для кого, о чём и зачем этот доклад?
|
||
|
||
(
|
||
1. Научить писать hack tools
|
||
2. Заставить их выкладывать
|
||
)
|
||
|
||
Я сделал этот доклад для начинающих хакеров, которые хотят упростить себе жизнь и написать свой первый хакерский инструмент, который поможет вам легче и быстрее взламывать самые непростые штуки. А также замотивировать более опытных, распространить свои скрипты и программы в публичных git репозиториях.
|
||
|
||
То есть моя цель в том, чтоб заманить вас в движение OpenSource, а если у вас и схожая идеология, то и в движение Free Software, но об этом позже
|
||
|
||
|
||
У этого доклада есть лицензия, смотря этот доклад вы принимаете её. Подробнее вы можете узнать по QR коду.
|
||
(Casual BY-SA 4.0 - QR код на лицензию в блоге)
|
||
|
||
<!-- 40s -->
|
||
|
||
<!-- интерактив -->
|
||
Кстати, поднимите руки те, кто уже выкладывал любые свои программы и скрипты на Github или ему подобные!
|
||
А теперь, пожалуйста, скажите пару слов о них! (2-3 человека)
|
||
|
||
<!-- +3 минуты? (вне счёта)-->
|
||
# Что такое OpenSource и Free Software?
|
||
|
||
И так, что такое OpenSource и Free Software?
|
||
|
||
Открытое программное обеспечение (OpenSource Software) — программы с открытым исходным кодом.
|
||
|
||
То есть это те программы, исходный код которых вы можете посмотреть, изменить, и распространять для любых целей.
|
||
|
||
|
||
Свободное программное обеспечение (Free Software) - программы, которые делают то же самое, но уважают "важнейшие" свободы пользователя, кстати вот эти 4 свободы:
|
||
(
|
||
0. Свобода запускать программу для любых целей.
|
||
1. Свобода изучать и изменять программу для ваших целей.
|
||
2. Свобода распространять копии.
|
||
3. Свобода распространять модифицированные версии.
|
||
)
|
||
Ничего не напоминает?
|
||
|
||
Так это получается ( OpenSource = Free Software )?
|
||
Не совсем. Разница кроется в идеологии программистов.
|
||
|
||
( OpenSource != Free Software )
|
||
|
||
<!-- нужен пример? -->
|
||
<!-- К примеру MetaSploit -->
|
||
|
||
<!-- 50s -->
|
||
|
||
## Идеология
|
||
|
||
Тут кстати нужно упоминуть о двух сообществах.
|
||
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, на их флагман просто нет кастомной прошивки.
|
||
|
||
|
||
|
||
|
||
|
||
<!-- Кстати распространяются программы на таких сервисах как GitHub, GitLab, SourceForge и куче других Git сервисов. Т.е. вы можете взять, найти понравившуюся вам программу на github, скачать, изменить её исходный код и выложить в открытый доступ. Кстати, этот процесс называется "Fork" (на экране вилка) -->
|
||
|
||
|
||
|
||
|
||
<!-- (мем со Столлманом и Линусом) (БЛЯЯЯ, Я ЗАБЫЛ ЧТО ЗА МЕМ) -->
|
||
|
||
|
||
<!-- 3.30m -->
|
||
|
||
Но вернёмся к OpenSource.
|
||
|
||
## Лицензии
|
||
|
||
|
||
Тут нужно кратенько рассказать про лицензии
|
||
|
||
Грубо говоря, для OpenSource у вас есть выбор использовать, либо Permissive, либо Copyleft лицензию.
|
||
|
||
Лицензия нужна для защиты разработчика и его продукта.
|
||
|
||
Permissive обеспечивает соблюдение свобод - исходный код можно посмотреть, изменить, и распространять для любых целей. Это к примеру MIT License.
|
||
|
||
Permissive и Copyleft лицензии очень похожи. Однако ключевое отличие - Permissive не запрещает приватизировать код. Т.е. корпорация может воспользоваться кодом из вашей программы, изменить её, и это уже будет её код.
|
||
|
||
(ah finally copyleft)
|
||
|
||
В случае же CopyLeft лицензии, компании нужно будет выложить любую модификацию вашей программы в открытый доступ под этой же лицензией. Т.е. просто взять и построить коммерческий продукт с такой лицензией не выйдет.
|
||
|
||
Пример CopyLeft лицензии - GNU GPLv3
|
||
|
||
<!-- 1m -->
|
||
|
||
## плюсы/минусы для разработчика
|
||
|
||
А теперь поговорим как изменится ваша жизнь, если вы выложите вашу программу или скрипт в OpenSource
|
||
|
||
Минусы:
|
||
- Недопонимания - как и в любой совместной разработке, это общение с людьми, нужно быть готовым к разнице в восприятии и подходов
|
||
|
||
Плюсы:
|
||
- Мотивация - Выложив программу в открытый доступ, Вы делаете мир лучше, это отлично мотивирует продолжать разработку. - Ричард Столлман, разрабатывал набор утилит GNU, чтоб все могли ими пользоваться. Его команда собрали то, какой мы видем GNU/Linux сейчас.
|
||
<!-- Компании по всему миру используют OpenSource продукты. Один из самых популярных, я бы назвал GNU/Linux. Они чуть ли не основа таких больших корпораций, как Google. -->
|
||
- Репутация - Вы становитесь более узнаваемым в комьюнити, вас могут приглашать на эвенты и предлагать работу. - К примеру H.D. Мур, создатель Metasploit благодаря своему инструменту попал на множество мероприятий и на пост главного исследователя в Rapid7.
|
||
- Портфолио - Если вы будете устраиваться на работу, это будет плюсом, если у вас будут OpenSource проекты. - Для примера далеко ходить не нужно, в моём прошлом собеседовании меня попросили скинуть профиль на github.
|
||
- Рост - Делая OpenSource проект, он будет получать изменения от других программистов, которые помогут вам вырости как специалисту и поднять уровень ваших навыкови кода. - Возвращаясь к Муру, он сильно прокачался в написании эксплоитов при работе над Metasploit.
|
||
- Качество кода - вы будете писать код будет качественно, если будете знать, что его может увидеть абсолютно любой, чем если бы написали на коленке для себя. - в психологии это называется Эффект Хоторна.
|
||
|
||
<!-- 2m -->
|
||
|
||
## плюсы/минусы для пользователя
|
||
|
||
А теперь про плюсы и минусы для пользователя
|
||
|
||
Минусы:
|
||
- Поддержка - её может и не быть, а разработка проекта может закончиться через месяц. - Я так одному ютуберу, который выложил свой скрипт вкинул несколько улучшений, но он забросил проект.
|
||
- Безопасность - нет гарантии, что программа безопасна, скачивание OpenSource утилит не отличается от скачивания крякнутых программ, если вы конечно не прочитаете исходный код. - Недавний нашумевший пример - это библеотека XZ, которая почти поставила на все обновлённые системы бэкдор.
|
||
- Гарантии - если программа поведёт себя как-то не так и приведёт к потере данных, никто не будет нести за это ответственность, кроме самого пользователя
|
||
- Документация - Наличие, актуальность и точность документации также не гарантировано. - Помнится я нашёл одну очень специфичную библиотеку на Python, которая решала мою проблему, но как ей пользоваться, я узнал изучая её исходный код.
|
||
|
||
Плюсы:
|
||
- Цена - бери и качай. Все OpenSource программы бесплатны для использования.
|
||
- Платформы - OSS зачастую поддерживает больше платформ, чем проприетарный софт. К примеру, Adobe намеренно не разрабатывает Linux версию Photoshop, хотя у них есть версия под MacOS. А условная Krita, есть на всех платформах, да и вроде даже на Android.
|
||
- Владение - то, что вы скачали, будет работать на любой другой схожей системе, эта программа принадлежит вам (в рамках лицензии) и у вас её не могут отнять. К примеру, у одного музыканта была прога по типу FL Studio, которую он купил в 10 лет назад. После этого вышло несколько новых версий которые сильно отличались от этой. Севрис онлайн активации отключили, а его комп поломался. И из-за этого он не смог активировать старую версию программы, а техподдержка отказалась помогать ему, не смотря, что лицензия продукта позволяла продолжать использовать старую версию. А ему нужна именно эта версия для его работы. В итоге у него отняли то, что он купил.
|
||
- Безопасность - Пользователь может сам удостовериться, что программа безопасна и соответствует заявлениям разработчиков или вашим нуждам - вспоминая пример про XZ - иследователь нашёл бэкдор, а в проприетарном софте, к примеру Windows, он бы и остался необноруженным какое-то время.
|
||
- Кастомизация - Пользователь может доработать программу, чтоб она соответсвовала его нуждам. - Не нравится цвет окошка? Подправьте его и пользуйтесь программой. Или вам не нравится какое-то навязчивое окошечко или настройки по умолчанию. Вы можете всё это изменить.
|
||
- Community - любой пользователь может помочь разработчику с проектом. И речь не только о написании кода, это также помощь с обсуждением и предложением новых функций, написанием документации, поддержкой пользователей, созданием отчётов о багах или тестах программы. Каждый может помочь в разработке, внезависимости от умений, и получить от этого новые навыки. - К примеру разработчики сервера виртуализации Proxmox, получает больше фидбека от пользователей, чем от компаний. А некоторые пользователи сами им скидывают как исправить их программу, и это не просто костыль, а прям кусок кода, который основательно фиксит проблему.
|
||
|
||
|
||
<!-- 1.50 + 1.15 = 3.10m -->
|
||
<!-- =11.20 -->
|
||
<!-- skip -->
|
||
# Особенности написания хакерских утилит
|
||
|
||
А теперь я расскажу про пример, какого это писать крутой хакерский инструмент
|
||
|
||
## 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/)
|
||
|
||
<!-- 4m +5m на вопрос -->
|
||
|
||
# Как писать программы, если вы не программист?
|
||
|
||
На этом этапе я надеюсь, что убедил вас, что OpenSource это круто. Но теперь нужно узнать, как влиться в OpenSource в качестве разработчика.
|
||
Мы сейчас быстренько пройдёмся по курсу молодого бойца, чтоб выйдя с этого доклада вы уже были готовы начать писать свою программу.
|
||
|
||
<!-- 20s -->
|
||
|
||
## Язык программирования
|
||
|
||
Про то, на чём писать вашу прогу.
|
||
|
||
Тут можно начать очередной холивар за язык программирования, но я скажу, что самый крутой язык будет - англисйкий! Он невероятно поможет в изучении практически чего угодно.
|
||
|
||
<!-- Хоть и речь идёт про язык программирования, я скажу то, что невероятно сильным плюсом для вас будет знание английского языка, не только в программирование, но и в пентесте. -->
|
||
|
||
А относительно языка программирования, если вы не знаете какой выбрать для написания пентестерских инструментов или у вас нет опыта, то выбирайте GoLang, или просто Go.
|
||
Только не показывайте друзьям их маскот
|
||
|
||
<!-- 30s -->
|
||
|
||
### Как ему научиться
|
||
|
||
И как научиться Go?
|
||
|
||
Мне не нравится сидеть и монотонно изучать язык по книге, по этому я считаю, чтоб научиться писать, нужно просто
|
||
(just do it)
|
||
начать пробывать писать свой код и читать чужой, а в процессе вы изучите язык.
|
||
|
||
Однако, если вы всё-же хотите посидеть и почитать, особенно, если вы до этого в жизни не видели программный код, то я советую:
|
||
1. оффициальный туториал о том как запустить Go на вашем компьютере,
|
||
2. затем интерактивную экскурсию по языку,
|
||
3. и в заключении перейти к туториалу на основе примеров.
|
||
Так вы получите отличную базу.
|
||
(стрелочки от ссылке к ссылке)
|
||
https://go.dev/doc/tutorial/getting-started
|
||
https://go.dev/tour
|
||
https://gobyexample.com/
|
||
|
||
<!-- 40s -->
|
||
|
||
## Как ~~программировать~~ гуглить
|
||
|
||
Если вы думаете, что крутые программисты, сидят и просто пишут код, то вы не правы, программисты пишут код примерно так:
|
||
|
||
(Мем как пишут успешные программисты код - google)
|
||
|
||
Хоть это и звучит смешно, но первым делом, нужно научиться гуглить самостоятельно. Я говорю это, потому что я встречал много людей которые не могут это делать.
|
||
|
||
|
||
1. Гуглите на английском. Так куда больше шансов найти что ответ.
|
||
2. Конструкция запроса, примерно такая "язык программирования, что вы хотите"
|
||
<!-- pro tip: в случае с go, используйте "golang что-то", так его обозначают, чтоб не путать с английским словом Go -->
|
||
<!-- ({Go = идти {Go = GoLang, но GoLang != идти) -->
|
||
3. Иногда вы не получите ответ, в таком случае вам нужно перефразировать вопрос, в крайнем случае вы можете обратиться к ChatGPT чтоб перефразировал для вас или. Но не используйте ChatGPT для получения самого ответа на ваш вопрос
|
||
4. Не просите помощи на форумах и у знакомых, пока не потратили хотя бы 25 минут на поиск решения, вы должны научиться сами справлять с такими проблемами
|
||
<!-- 1m -->
|
||
|
||
## ОС
|
||
|
||
|
||
И пару слов об вашей операционке. Я настаятельно рекомендую установить и начать осваиваться GNU/Linux. Также и в ней программировать.
|
||
|
||
<!-- И пару слов об вашей операционке. Я настаятельно рекомендую установить Linux. -->
|
||
<!-- -->
|
||
<!-- В идеале вместо вашей винды, -->
|
||
<!-- но я рекомендую начать с установки рядом с вашей виндой, т.е. при включении компьютера, вы сможете выбрать, что запускать, винду или линукс. -->
|
||
<!-- Но для тех, кому пока ещё сложно с компьютерами то установите линукс на виртуальную машину. -->
|
||
<!-- -->
|
||
<!-- (логотипы) -->
|
||
<!-- А в качестве ОС, это Kubuntu, или если вы хотите приключения и сложности для более быстрого прокачивания навков, то Arch Linux (btw) -->
|
||
<!-- -->
|
||
<!-- Гайдов очень много на каждый из вариантов установок, главное будьте осторожны. -->
|
||
|
||
<!-- 15s -->
|
||
|
||
## Git и все-все-все
|
||
|
||
А теперь про Git
|
||
|
||
Git - это система контроля версий. Это программа позвоялет откатывать изменения в файлах до предыдущего их сохранения.
|
||
Также она помогает работать нескольким людям над проектом. Т.е. она умеет совмещать изменения сделаные несколькими разработчиками.
|
||
|
||
Есть сервисы, которые предоставляют доступ к git репозиториям, самый популярный - GitHub. На него мы и будем загружать наш проект
|
||
|
||
<!-- А по этой ссылке вы увидете решения типичных проблем с git - https://ohshitgit.com/ru -->
|
||
<!-- (qr) -->
|
||
|
||
<!-- 35s -->
|
||
|
||
## Guidelines по созданию OpenSource проекта
|
||
|
||
|
||
|
||
Так как же сделать свой OpenSource проект?
|
||
|
||
(сделать скрины к каждому элоементу)
|
||
0. Зарегестрируйтесь на Github
|
||
1. Создайте Git репозиторий
|
||
2. Выберете лицензию
|
||
- MIT, если не знаете что выбрать
|
||
- GNU GPLv3, если вы хотите, чтоб ваш проект был свободным ПО
|
||
3. Склонируйте репозиторий `git clone REPO_LINK`
|
||
Однако если мы склонируем по SSH ссылке, мы получим ошибку. Т.к. сам github говорит, что мы не добавили SSH ключ в наш аккаунт.
|
||
Нажимаем по ссылке, а пока идём в терминал и генерируем SSH ключ с помощью `ssh-keygen`, нажимаем 3 раза enter. Выводим публичный SSH ключ с помощью `cat` и копируем его.
|
||
Далее вставляем в наши SSH ключи на Github. После этого мы сможем скачивать репозитории по SSH и загружать изменения, что предотвратит проблемы в будущем.
|
||
4. Составьте план разработки
|
||
Вам нужно:
|
||
- Запишисать какие функции должна выполнять программа
|
||
- Запишисать какие входные данные нужны для неё
|
||
- Разбейить эти функции на мельчайшие компоненты, шаги, который должны выполнить программа
|
||
- поставьте для них приоритеты:
|
||
- базовые/необходимые функции
|
||
- дополнительные функции
|
||
- улучшения
|
||
К примеру, изначальная идея:
|
||
"Я хочу написать программу, которая будет помогать определить работает ли 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'ы
|
||
- режим мониторинга
|
||
5. Начните разрабатывать вашу программу начиная с базовых функций
|
||
Просто садитесь и старайтесь сделать тот элемент, которую вы хотите. Гугл вам в помощь. Если гугл не даёт вам нужных результатов, значит нужно разбить функцию на ещё более маленькие элементы.
|
||
и как привнесёте нужные изменения, проверьте, что прграмма функционирует как вы хотит. Затем загрузите изменеия в репозиторий с помощью комманд `git add . && git commit -am 'новая фича' && git push`.
|
||
Однако вы наверняка столкнётесь с тем, что git не знает кто вы, по этому он попросит вас добавить ваш email и имя командами `git config`.
|
||
А, `git add .` - добавляет новые файлы в репозиторий
|
||
`git commit -am 'новая фича'` - фиксирует сохранение измений, к которым можно потом вернуться
|
||
`git push` - загружает их на GitHub. Для этого нужно будет добавит SSH ключ вашего ПК в Github аккаунт, но мы уже это сделали.
|
||
После этого наши локальные изменения отобразятся на github.
|
||
6. Напишите README
|
||
README, это простой текстовый файл, который описывает ваш проект, и это первое, что увидет потенциальный пользователь в вашем инструменте.
|
||
README должен ответить на вопросы
|
||
- Что делает проект?
|
||
- Почему он будет полезен, то есть какой usecase?
|
||
- Как мне установить и попробывать его?
|
||
- Какие есть функции и как ими пользоваться? То есть небольшная документация
|
||
|
||
|
||
|
||
И сейчас я расскажу свой опыт разработки
|
||
|
||
|
||
<!-- 5.30m (но я торопился, так что 6.30m) -->
|
||
|
||
## пример - owncloud_bruteforcer
|
||
|
||
|
||
Во время пентеста, я нашёл owncloud сервис. Owncloud - это OpenSource облачное хранилище, которое можно развернуть на своём сервере. И сделав несколько попыток авторизации, я заметил, что сервис их не блокирует. Я решил, что можно перебирать пароли для пользователей, сделать отчёт и получить за него вознаграждение.
|
||
|
||
Вот только возникла проблема, я не нашёл программу, которая могла выполнить все требования owncloud для авторизации. Видите ли, owncloud нужно для авторизации:
|
||
- валидный CSRF токен, который можно получить в теле страницы логина
|
||
(показать как на owncloud оно в исходниках)
|
||
- cookie, которые можно получить в header'ах ответа
|
||
(показать как на owncloud оно в header'ах сервера)
|
||
- а также определённые Header'ы в запросе, по типу "accept", которое приложение ожидает от клиента
|
||
(показать как на запросах он идёт)
|
||
|
||
|
||
Я хочу написать bruteforcer, т.е. программу, которая пытается найти нужный пароль для пользователя, пытаясь авторизорваться с помощью wordlist'a, т.е. файла с паролями. Более того, я хочу иметь возможность атаковать сразу нескольких пользователей одной командой, предоставляя вместо имени пользователя, файл с пользователями. А в случае с owncloud, перед каждой попыткой авторизоваться, программа должна перейти на страницу логина, чтоб получить CSRF токен и cookie.
|
||
|
||
<!-- 1.30m -->
|
||
|
||
### Идея
|
||
|
||
( визуализировать то о чём я говорю, т.е. каждый элемент)
|
||
|
||
И так, идея была проста, нам нужно:
|
||
- получить входные данные через флаги запуска программы
|
||
- с возможностью атаковать либо одного юзера, либо сразу множество из файла
|
||
- получить CSRF токен с cookie
|
||
- то есть сделать GET запрос на страницу логина
|
||
- с помощью регулярных выражений вычленить от туда токен
|
||
- с помощью регулярных выражений вычленить cookie из Header'ов
|
||
- и вставить их в переменные
|
||
- использовать файлом с паролями, для перебора
|
||
- попытаться авторизоваться
|
||
<!-- (только сейчас клик) -->
|
||
- в цикле запускается несколько воркеров, паралельных операций, которые будут пытаться авторизоваться
|
||
- каждый воркер, получает новый CSRF токен, а заодно и cookie
|
||
- каждый из воркеров берёт следующий пароль из wordlist'a и пытается авторизоваться, т.е. делает POST запрос подставляя username и пароль в тело запроса
|
||
- происходит проверка успешности авторизации через то, что ответит сервер на запрос
|
||
|
||
<!-- 2.50m (слишком торопился) -->
|
||
|
||
### Разработка
|
||
|
||
|
||
|
||
Во время разработки, я понял, что очень неудобно дебажить работает ли попытка авторизация, выводя весь пакет в терминале, по этому нужно добавить поддержку http proxy, чтоб я мог смотреть его в burp и иметь возможность проверить, что мы успешно авторизуемся
|
||
(скрин бурпа)
|
||
(сделать, чтоб по нажатии он добавлялся в презенташку в список идей)
|
||
|
||
Во время разработки были баги, много багов. Помимо скучных и не совсем понятных багов, был и неожиданный:
|
||
Суть в том, что я изначально использовал channel, Channel в Go используется для передачи данных между разными частями программы, которые работают параллельно. Вы можете представить себе channel как трубку, через которую данные могут быть переданы из одной части программы в другую. И в эту трубку можно ложить какое-то количество переменных,где они выстраиваются в очередь,
|
||
После извлечения переменной из канала, она пропадает. Это решение отлично подходило в моём случае, потому что, у меня несколько воркеров, каждому из которых нужен следующий по списку, неиспользованный пароль.
|
||
Так в чём заключалается проблема в этом псевдокоде?
|
||
<!-- 1.30m -->
|
||
(псевдокод, упрощён для понимания)
|
||
```go
|
||
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 минуты, можете поднимать руку и высказывать предположения. Дам подсказку, этот баг в итоге сожрёт всю оперативу, почему именно это происходит?
|
||
|
||
|
||
|
||
Дам ещё подсказку, вот так можно на скорую руку, починить проблему
|
||
```go
|
||
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МБ памяти, что как минимум, не то, что я от неё ожидаю. Так что финальное решение стало:
|
||
<!-- 1м -->
|
||
```go
|
||
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 коду, а вот так работает программа
|
||
(Демка)
|
||
|
||
<!-- 4м -->
|
||
|
||
# Выводы
|
||
|
||
|
||
И так, резумируем доклад. Вы сегодня узнали:
|
||
- Узнали про OpenSource, виды лицензий и Free Software
|
||
- Узнали что будет если написать революционный хакерский инструмент (metasploit)
|
||
- узнали как сделать свой первый OpenSource проект, а это:
|
||
- сделать Git репозиторий,
|
||
- составить план разработки,
|
||
- выставить приоритеты для функций программы,
|
||
- разделить их на самые малые шаги,
|
||
- и начать писать
|
||
|
||
|
||
<!-- 30s -->
|
||
|
||
## Community track блиц
|
||
|
||
А теперь небольшой Community track блиц:
|
||
|
||
1) Чего не хватает в современных профессиональных сообществах?
|
||
Я считаю, что не хватает открытости, к примеру крайне мало пентестеров пишут о том как ищут уязвимости, какая у них методология и в каком случае она подходит. Особенно если в краткой форме. Мне лично очень этого не хватает, так что я пишу такие методологии для себя и буду делиться ими в своём блоге.
|
||
|
||
2) Представь, что проекты, которые ты описал в докладе не были созданы. Как бы ты решал исходную задачу?
|
||
Я говорил про metasploit, Git, GoLang, а также про owncloud_bruteforcer
|
||
- Как по мне, Metasploit сделал ИБ сообщество таким, которое оно есть сейчас. Но если бы оно никак не повлияло на ход истории, то я бы просто пользовался exploit-db, т.к. там уже есть эксплоиты из metasploit.
|
||
- Если бы у нас не было git, то программисты делились бы кодом, в zip архивах и это было бы коллабарационный ад. Разработка затягивалась бы в десятки раз. А я сам бы пользовался контролем версий в Nextcloud, а также снапшотами BTRFS.
|
||
- Не будь у нас Go, я бы наверное писал на C++ или python, но потихоньку переходил бы на rust.
|
||
- Если бы я не написал owncloud_bruteforcer - я бы сделал скриптец, который через curl'ы имитировал бы мою программу. Но разработка бы затянулась, чтоб сделать процесс мультипоточным.
|
||
|
||
3) Какой open source проект тебе хотелось бы создать если будет больше времени/ресурсов?
|
||
Я уже начал разработку такого проекта, но из-за доклада он на паузе. Это Ruina - моя автоматизация Recon'а для пентеста. Как допишу до первой стабильной версии - выложу в opensource и сообщу в своём блоге.
|
||
|
||
<!-- Если получится интегрировать в канву доклада, то хорошо) Можно просто перед последним слайдом "Спасибо". Сделать слайд "Community track блиц" с этими вопросами и кратко ответить) -->
|
||
<!-- Основная идея в том, чтобы узнать ваше мнение и побудить слушателей глубже задуматься об открытых проектах и сообществах. -->
|
||
<!-- Ответы не должны быть длинные, чтобы не отнимать время вашего доклада. Буквально по минуте рассуждений в свободной форме. -->
|
||
|
||
|
||
Вы можете оставить фидбек для меня, а также найти транскрипцию доклада, и материалы к ней по QR коду далее
|
||
(TODO транскрипция доклада, и материалы по QR коду)
|
||
(qr код на фидбек)
|
||
|
||
<!-- 2.30m -->
|
||
|
||
## Final
|
||
|
||
<!-- (плот твист с закрытой лицензией доклада) -->
|
||
И раз уж вы все досмотрели этото доклад до конца, вы обязаны выполнять условия лицензии, я зачитаю несколько из секции 7.
|
||
- Будьте этичными хакерами
|
||
- Делитесь исходным кодом своих программ
|
||
- Позвоните маме и сделайте комплимент.
|
||
(qr код на лицензию + фотка интересной части)
|
||
|
||
<!-- И вот вам FunFact - Эта призентация была на столько большая, что изначально она была на полтора часа -->
|
||
|
||
Источники.
|
||
|
||
Спасибо за внимание!
|
||
|
||
<!-- 25s -->
|
||
|
||
---
|
||
|
||
# источники
|
||
|
||
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.theverge.com/2023/12/5/23989290/playstation-digital-ownership-sucks -->
|
||
<!-- https://www.reddit.com/r/playstation/comments/pso78i/sony_has_permanently_banned_my_ps5_reported/ -->
|
||
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
|
||
|
||
http://color.aurlien.net/#212121
|