Go + Shell + C + Сборка

Поскольку SkilStak уделяет больше внимания основным навыкам наступательной безопасности (красная группа), а также защитной кибербезопасности (синяя группа), мне нравится перспектива корпоративного разработчика, ответственного за написание кода для десятков тысяч серверов и рабочих столов, работающих на каждой операционной системе. системы, и обеспечение их безопасности за счет автоматизации аудита соответствия. Опыт «синей команды» на самом деле влияет на принятие решений о выборе хорошего набора инструментов «красной команды», в частности языков разработки вредоносных программ.

Кстати, меня интересуют не столько текущие тенденции, сколько надежные подходы, проверенные на местах и ​​на опыте. Вот почему я думаю, что эта комбинация языков будет доминировать в области аудита вредоносных программ и систем в течение следующих пяти лет.

Подборка кросс-систем, мечта SecOps

Я поражен тем, сколько знающих технологов не понимают, что можно писать и компилировать код Go на машине Linux, которая будет работать на Windows или Mac. Правильно, статическая компоновка позволяет Go компилировать исполняемые файлы (exes), которые даже не запускаются на компьютере, который их скомпилировал.

Это основная причина того, что Go является доминирующим языком для разработки системных инструментов, таких как то, что Duke energy сейчас активно нанимает. По этой причине Go был выбран в качестве исходного языка как для Docker, так и для Kubernetes, двух самых значительных творений в области системных операций за последние 10 лет. Я считаю, что по этим причинам Go станет доминирующим вредоносным ПО и языком аудита из-за него.

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

Раньше Perl2Exe использовался не зря.

Когда я спроектировал решение IBM для автоматизированного аудита серверов, мы выбрали Perl, потому что Perl2Exe был вещью, это был кладж, но он был лучше, чем все остальное. В каждый «скомпилированный» аудитор был встроен интерпретатор Perl. Это действительно позволило создать единственный исполняемый файл (хотя и не полностью скомпилированный двоичный файл) для любой операционной системы в мире, которая могла бы запускать Perl без необходимости установки Perl. Каждый исполняемый файл был большим, и его можно было технически подделать, но он был лучше, чем альтернативы для быстрой разработки и сопровождения правил аудита.

Никакая Java не может этого сделать.

Java должна поставлять всю JRE для каждого целевого устройства. Это создавало массу проблем, в основном из-за того, что не было простого способа отправить его с каждым исполняемым файлом, что позволяло бы легко вмешаться в него кем угодно в любой проверяемой системе. Это нарушило доверие, требуемое от архитектуры.

C требовал компиляции на подобной системе.

C теоретически сработал бы. Но это означало бы иметь лабораторию компиляции, содержащую каждую отдельную целевую систему, подлежащую аудиту, и поддерживать там настройку компиляции C и запускать ее для любых минимальных изменений. Конечно нет.

У Python и Ruby была та же проблема, что и у Java.

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

Оболочка POSIX и VBScript также работали, но с ограничениями

Оболочка всегда работает с чем угодно с поддержкой оболочки POSIX, которая устраняет весь мир Windows. VBScript использовался для Windows.

Компиляция, быстро и быстрее

Тот факт, что Go компилируется автоматически, затрудняет анализ криминалистам. Конечно, его можно декомпилировать, как любой другой код C, но для этого требуется более высокий набор навыков, чем просто смотреть на код Perl / Python / Ruby / Shell, чтобы увидеть, что он делает. Кроме того, он выполняется намного быстрее как во время запуска, так и во время выполнения.

Меньше полезной нагрузки

Go компилируется в статически связанные исполняемые файлы, которые не являются такими сложными, что позволяет целиком содержаться в одном исполняемом файле, который можно динамически перемещать в системе, чтобы избежать обнаружения, подобного отключению. Также меньше сетевого трафика.

Использование оболочки целевой системы уже существует и не требует загрузки.

Go имеет богатую, глубокую, библиотечную экосистему

Я был потрясен, обнаружив, что библиотеки OpenPGP и OpenSSL являются частью встроенного набора библиотек для Go. На сегодняшний день, например, в Node их нет. Perl не имел их в течение десятилетий и до сих пор в значительной степени не зависит от поставки чего-то вроде GPG с кодом. Go также имеет встроенную сетецентричность со стандартными серверными и клиентскими библиотеками. Это упрощает создание сетевых вредоносных программ и аудита.

Удаление Python

Многие по-прежнему хвалят Python за такие сценарии и за склейку языков, но правда в том, что он намного хуже, чем Go для тяжелых вещей (которые часто зависят от сторонних библиотек) и не лучше, чем оболочка POSIX, perl, PowerShell, DOS или VBScript для функции склеивания, потому что вам нужно отправить интерпретатор Python, чтобы действительно что-либо делать.

Это оставляет Python в мертвом пространстве, в котором нет ничего особенно ценного. Фактически, единственное, что у Python есть в этой области, - это читаемый синтаксис, который на самом деле ПЛОХО для вредоносных программ.

Фактически, я осмелюсь предположить, что единственные программисты в сфере безопасности, привлеченные преимуществом Python, - это в конечном итоге скрипачи и языковые фанатики. Python, возможно, имеет встроенную поддержку SQLite, но нам это действительно не нужно для большинства вещей, и если бы мы это сделали, у Go есть много законных, лучших альтернатив от сообщества, которое явно на голову (в совокупности) выше других языковых сообществ, включая Python.