Статья Bash для автоматизации ИБ: скрипты для повседневных задач

1772324919192.webp
Bash для ИБ-специалиста - главный инструмент для автоматизации или ещё один тяжёлый камень в жизни?​

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

Вот тут и появляется Bash. Да, все говорят про Python, его библиотеки и удобство для разработки более серьёзных решений, но в реальной жизни чаще всего именно Bash оказывается под рукой, когда нужно быстро запустить что-то маленькое и полезное. Здесь и скорость, и минимальная зависимость от сторонних инструментов. Не нужно ждать, пока распакуется виртуальная машина с Python, чтобы проанализировать пару строк из лога или сканировать порты.

Это не означает, что Bash - это панацея. Конечно, Python и другие высокоуровневые инструменты тоже полезны, но всё-таки для большинства ежедневных задач, связанных с безопасностью, именно Bash - тот самый ключ к быстрой автоматизации и продуктивной работе. Парсинг логов, запуск сканеров, автоматическое отслеживание изменений - всё это можно сделать за несколько строчек кода. И иногда эти строки могут сэкономить тебе часы работы, которые ты мог бы потратить на решение других задач.

Мы разберемся, как Bash может стать твоим лучшим другом в работе. Как с его помощью можно автоматизировать рутинные процессы, не теряя в качестве. И что важнее - почему, несмотря на всё это великолепие Python и других решений, именно Bash остаётся по-настоящему быстрым и надёжным инструментом для работы в сфере ИБ.

Когда Bash, а когда Python?

Есть ли место Bash среди других инструментов, таких как Python, в ИБ? Тут важно понимать одну простую вещь. У Python масса плюсов, он универсален и может делать почти всё, что угодно. Но вот скорость? Особенно если речь идёт о рутинных задачах, быстрых проверках или сканированиях - тут Bash будет на высоте.

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

Bash выигрывает в тех ситуациях, когда:
  1. Нужна быстрая автоматизация без настройки среды.
  2. Нужно обработать небольшие объёмы данных или выполнить одноразовые задачи.
  3. Важен контроль за системой и процессы, которые можно автоматизировать через оболочку.
Однако, если ты планируешь заниматься чем-то более масштабным, где нужна гибкость в коде, много обработки данных, то Python в этом плане лучше.

Основы работы с Bash для ИБ: как начать?

Чтобы эффективно использовать Bash в ИБ, важно понимать основы работы с командной строкой и умение связывать простые команды в пайпы. Команды вроде grep, awk, sed - это твоё всё. Эти инструменты дают тебе возможность фильтровать данные, искать в логах, обрабатывать и выводить информацию без лишних затрат времени. Например, обычный grep позволяет быстро искать нужные строки в файле.

Начнём с малого. Вот простой пример команды, которая ищет все строки в логах, содержащие слово «failed»:

Bash:
grep "failed" /var/log/auth.log

Эта команда отфильтровывает все неудачные попытки входа в систему в файле auth.log. Для вас это одна из самых простых и полезных команд . Всё, что тебе нужно - это знать ключевое слово, которое ищешь, и файл, в котором надо искать.

Впрочем, это только начало. Если ты хочешь делать больше, чем просто искать строки, нужно комбинировать команды. А вот тут начинается по-настоящему интересная часть работы с Bash.

Recon автоматизация - ускоряем разведку с помощью Bash

Когда дело доходит до разведки, время - это всё. Чем быстрее ты соберешь информацию, тем быстрее сможешь среагировать на возможные угрозы или оформить свой отчет. Это именно тот случай, когда автоматизация через Bash даёт тебе преимущество: парсинг субдоменов, сканирование портов и даже работа с экранами сервисов - всё это можно легко выстроить в одном пайпе и сделать быстрее.

Subdomain enumeration wrapper​

Одной из самых частых задач в recon является поиск субдоменов. Конечно, для этого существуют разные инструменты, но зачем усложнять, если можно сделать это просто с помощью Bash?

Мы можем автоматизировать процесс поиска субдоменов для целевого домена. Для этого мы используем обычный host или nslookup в связке с собственным списком субдоменов.

Вот пример простого скрипта, который будет перебирать список субдоменов и проверять их существование:

Bash:
#!/bin/bash
DOMAIN=$1
WORDLIST=$2

cat $WORDLIST | while read subdomain; do
    host "$subdomain.$DOMAIN" &> /dev/null && echo "Found: $subdomain.$DOMAIN"
done
Этот скрипт делает простую вещь: берёт список субдоменов (например, из какого-нибудь wordlist'а), поочередно проверяет их с помощью команды host, и если субдомен существует, выводит сообщение об этом. И всё это за пару секунд. Конечно, можно добавить больше инструментов и улучшить его, например, использовать subfinder, но принцип остаётся тот же: автоматизация и быстрота.

Port scan + screenshot pipeline​

Теперь перейдём к портам. Порт-сканирование - одно из важнейших действий при разведке. Если ты хочешь узнать, какие порты открыты на сервере, сканирование с помощью nmap - идеальный вариант. Но вот вопрос: что делать, если ты хочешь не только сканировать порты, но и увидеть, что за сервисы работают на этих портах?

Здесь мы подключаем инструменты для снятия скриншотов, такие как gowitness или aquatone. Порт-сканирование и снятие скриншотов можно объединить в одну команду, которая не только будет проверять открытые порты, но и захватывать сервисы для дальнейшего анализа.

Вот пример скрипта:

Bash:
#!/bin/bash
TARGET=$1
OUTPUT_DIR="output"
mkdir -p $OUTPUT_DIR
nmap -p 1-65535 --open -T4 -oN "$OUTPUT_DIR/nmap_scan.txt" $TARGET
grep "open" "$OUTPUT_DIR/nmap_scan.txt" | cut -d "/" -f 1 | while read port; do
    gowitness single --url http://$TARGET:$port --output "$OUTPUT_DIR/screenshot_$port.png"
done
Здесь сначала происходит сканирование портов с помощью nmap. Все открытые порты записываются в файл. Далее, для каждого открытого порта с помощью gowitness делается снимок экрана веб-сервиса.

Параллельное выполнение (xargs, parallel)​

Когда нужно ускорить выполнение скриптов, параллельность - это то, что спасает. В случае с реконом, особенно когда работаешь с большим количеством субдоменов или IP-адресов, xargs и parallel могут значительно ускорить процесс.

Вот пример того, как можно ускорить предыдущий процесс с помощью xargs:
Bash:
cat subdomains.txt | xargs -I % -P 10 bash -c "host %.$TARGET &> /dev/null && echo %.$TARGET found"
Здесь мы используем xargs для того, чтобы параллельно выполнять запросы для нескольких субдоменов. Ключ -P 10 означает, что одновременно будут запускаться 10 процессов. Это позволит сократить время на выполнение задачи, особенно если в твоём списке несколько тысяч субдоменов.

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

Bash:
cat subdomains.txt | parallel -j 10 "host {}.$TARGET &> /dev/null && echo {}.$TARGET found"
Здесь -j 10 аналогичен -P 10 в xargs, но с дополнительными возможностями, например, контроль за выходом процессов или разделение вывода.

Когда работаешь с логами и пайпами, иногда базовые трюки командной строки ускоряют всё до нечеловеческих скоростей. Руководство с полезными приёмами для grep, awk и других инструментов поможет повысить эффективность твоих Bash‑скриптов при анализе и фильтрации данных. Читайте в статье: "Лайфхаки командной строки для пентестера"

Log Analysis - анализируем логи без лишних телодвижений

Вот ты сидишь, мониторишь систему, а тут - бах, логи заполняются, их количество всё растёт и растёт, и нужно что-то с этим делать. Да, можно вручную ковыряться, но зачем, если всё это можно автоматизировать и за пару команд найти, что тебя интересует? Логи - это не просто текст, это подробное руководство по всем действиям, которые происходят в твоей системе. Но разбираться в них вручную - это ад. Вариант - или ты сидишь и всё вычищаешь вручную, или ты автоматизируешь, и эти дни с логами становятся гораздо проще.

Не нужно быть гением, чтобы понять, что анализировать их - это всегда важно, но когда на каждую мелочь тратить кучу времени - это уже не моё. Наша задача - научиться с помощью Bash быстро вытаскивать из этих толстенных файлов только то, что нужно. Без лишних действий. Без сложных библиотек. Прямо тут и сейчас.

auth.log: failed logins, brute-force​

Базовая задача, с которой сталкивается каждый ИБшник - поиск неудачных попыток входа. Поймать злоумышленника на попытках ломать пароль можно, но только если за этим процессом следить. И тут нам на помощь приходит auth.log, который как раз и хранит все попытки входа. Ты же не будешь сидеть и смотреть на каждую неудачную попытку вручную? Нет. А вот скрипт, который выведет все неудачные попытки, - это то, что тебе поможет.

Вот такой вот скрипт:

Bash:
#!/bin/bash
grep "Failed password" /var/log/auth.log | awk '{print $1, $2, $3, $11}' | sort | uniq -c | sort -nr
Здесь мы ищем все неудачные попытки с grep, потом с помощью awk вытаскиваем дату, время и IP-адрес, с которого пытались войти. После этого отсортировываем всё по числу попыток и выводим в порядке убывания. Чем больше попыток - тем выше этот IP в выводе. Всё чётко, всё понятно, и никакой лишней работы.

access.log: anomaly detection​

Лог доступа - ещё один источник для поиска аномалий. Что тут важно? Часто злоумышленники пробуют подгрузить административные страницы или обращаются по несуществующим путям. Это будет видно в access.log, а задача - оперативно эти аномалии поймать.

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

Bash:
#!/bin/bash
grep -i "admin" /var/log/nginx/access.log | awk '{print $1, $7, $9}' | sort | uniq -c | sort -nr
Тут ничего сложного: просто ищем все обращения с «admin» в пути, выводим IP-адреса, путь и статус ответа. Много таких запросов - может быть, кто-то пытается добраться до панели администратора. Или проверяет систему на уязвимости. Всё это помогает быстро распознать проблему, не тратя лишнее время.

Pipe chains: grep | awk | sort | uniq -c​

Теперь самое интересное - как комбинировать команды. Например, ты можешь взять тот же grep, awk и добавить пару команд для сортировки и подсчёта, чтобы получить более точную картину.

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

Bash:
#!/bin/bash
cat /var/log/auth.log | grep "Failed" | awk '{print $1, $2, $3, $11}' | sort | uniq -c | sort -nr
Что мы здесь делаем:
  • grep "Failed" - ищем все неудачные попытки.
  • awk '{print $1, $2, $3, $11}' - вытаскиваем дату, время и IP.
  • sort- сортируем по порядку.
  • uniq -c - считаем, сколько раз встретился каждый IP.
  • sort -nr - сортируем по количеству попыток.
И вот тебе готовая картинка - кто пытается взломать систему. Всё за пару секунд. И нет, это не сложный процесс, это стандартный пайп.

IOC Hunting - ищем компрометацию быстро и эффективно

Поиск индикаторов компрометации (IOC) - это ключ к быстрому реагированию на инциденты. Если ты не знаешь, что искать, то никакие инструменты не спасут. Поэтому задача проста: нужно настроить процессы так, чтобы сразу видеть угрозы, а не тратить недели на поиски через кучу данных.

Часто для этого нужно отслеживать определённые параметры, такие как IP-адреса, хеши файлов или домены, которые ты можешь получить из threat feeds. И вот здесь в игру вступает Bash. С его помощью можно легко автоматизировать поиск этих IOC в логах, как бы запуская поисковую машину для конкретных индикаторов, которые могут указывать на вторжение или на что-то подозрительное.

Поиск IP из threat feeds​

Первый и, наверное, один из самых важных шагов в hunt'е - это найти подозрительные IP-адреса в логах. Всякие фиды угроз или даже общедоступные списки плохих IP, которые активно используются для атак, можно сравнивать с логами. И это проще, чем кажется.

Вот как это можно автоматизировать через простой Bash-скрипт:

Bash:
#!/bin/bash
grep -f threat_feeds.txt /var/log/* | awk '{print $1}' | sort | uniq -c
Что тут происходит? Всё просто: мы берём файл с IP-адресами из threat feeds (в формате текстового списка), и через grep -f ищем совпадения в логах. Каждый раз, когда этот IP встречается в логе, скрипт выводит его с количеством вхождений. Это удобно, чтобы сразу понять, встречался ли этот IP в системе.

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

Hash matching в filesystem​

Дальше - хеши файлов. Это тоже важный индикатор компрометации. Злоумышленники часто используют малозаметные методы, такие как замена файлов на сервере, а ты, как специалист, должен это быстро заметить. С хешами работать легче, чем с содержимым файлов. Просто генерируешь хеши и проверяешь их на совпадение с плохими хешами из threat feeds.

Вот пример, как это можно сделать в Bash:

Bash:
#!/bin/bash
find /home/user/ -type f -exec sha256sum {} + | grep -f malicious_hashes.txt
Здесь мы:
  • Используем find, чтобы искать все файлы в папке /home/user/.
  • Для каждого файла генерируем его sha256sum.
  • С помощью grep -f ищем совпадения с хешами из файла malicious_hashes.txt, который содержит список известных вредоносных хешей.
Реализуем автоматический контроль файлов на наличие вредоносных объектов, и никаких трудозатрат на проверку вручную.

Domain IOC в DNS логах​

Немного меньше внимания уделяется доменам, но они тоже важны. Очень часто злоумышленники используют скомпрометированные или подозрительные домены для связи с C2-серверами. Поэтому умение находить такие домены в DNS-логах - это ещё одна важная задача, которую стоит автоматизировать.

Посмотри, как это может быть реализовано:

Bash:
#!/bin/bash
grep -f suspicious_domains.txt /var/log/dns.log | awk '{print $1, $5}' | sort | uniq -c | sort -nr
Что происходит:
  • grep -f suspicious_domains.txt ищет все домены из списка в DNS логах.
  • Далее с помощью awk мы вытаскиваем дату и сам домен.
  • Всё сортируется и выводится с подсчётом количества обращений. Это помогает увидеть, сколько раз были запросы на подозрительные домены.

Network Monitoring - как держать руку на пульсе с Bash

Мониторинг сети - это еще одна вещь, на что можно тратить вечность, если делать всё вручную. Порой нужно просто контролировать, что происходит в сети, без каких-то глобальных замедлений и задержек. Если ты хочешь быстро отслеживать изменения в сети, будь то новые устройства, порты или другие аномалии, нужно настроить правильные инструменты, чтобы не сидеть с каждым изменением по полдня.

Когда ты начинаешь с этим работать, хочется быть уверенным, что все изменения в твоей инфраструктуре ты видишь моментально. Что бы ни происходило - ты сразу увидишь, если к сети подключилось новое устройство или появился неожиданный порт. Всё это можно автоматизировать. Bash тут поможет, если нужно оперативно получать информацию без лишних шагов.

Обнаружение новых хостов (arp-scan diff)​

Система, в которой можно легко забыть про появление нового устройства, - это не система. Если появляется новый хост, нужно сразу зафиксировать его и понять, что это за устройство. Для этого существует arp-scan. Но чтобы не делать это вручную по несколько раз в день, скрипт с Bash полностью решит этот вопрос. Он будет регулярно сканировать сеть и подсказывать, если что-то появилось новенькое.

Пример скрипта для отслеживания новых хостов:

Bash:
#!/bin/bash
OUTPUT_OLD="network_old.txt"
OUTPUT_NEW="network_new.txt"

sudo arp-scan --interface=eth0 --localnet > $OUTPUT_NEW

if [ -f $OUTPUT_OLD ]; then
    diff $OUTPUT_OLD $OUTPUT_NEW | grep ">" | awk '{print $2}'
fi

mv $OUTPUT_NEW $OUTPUT_OLD
Что тут происходит:
  1. Скрипт использует arp-scan для сканирования сети, записывая результат в новый файл.
  2. Далее, если существует старый список, он сравнивает текущий и старый файлы, выводя новые устройства, которых не было ранее.
  3. После этого обновляется старый файл новым результатом.
Процесс полностью автоматизируется, и тебе не нужно тратить время на это вручную. Ты всегда будешь в курсе, что в твою сеть кто-то подключил новое устройство.

Port Change Detection​

Открытие новых портов - это сигнал. Будь то стандартные или какие-то необычные порты, на которые ты не рассчитывал, важно вовремя их заметить. Если новый порт появился на хосте, это может быть признаком того, что кто-то попытался установить несанкционированный сервис или проломить систему. С nmap можно быстро это отследить.

Вот как можно настроить мониторинг изменений в портах:

Bash:
#!/bin/bash
TARGET=$1
OUTPUT_OLD="ports_old.txt"
OUTPUT_NEW="ports_new.txt"

nmap -p 1-65535 --open $TARGET > $OUTPUT_NEW

if [ -f $OUTPUT_OLD ]; then
    diff $OUTPUT_OLD $OUTPUT_NEW | grep ">" | awk '{print $2}'
fi

mv $OUTPUT_NEW $OUTPUT_OLD
Здесь:
  1. Мы запускаем nmap, чтобы проверить все порты на целевом хосте.
  2. Сравниваем старые данные с новыми, и если что-то изменилось, выводим информацию о новых или изменённых портах.
  3. Обновляем старый файл текущими результатами для следующего запуска.
Если открылись новые порты или произошли какие-то изменения, ты сразу это увидишь.

Report Generation - как автоматизировать отчёты с помощью Bash

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

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

nmap/nuclei → HTML отчёт​

Ты же не хочешь тратить время на то, чтобы вручную собирать все результаты из Nmap или Nuclei, правда? К счастью, Bash здесь тоже может выручить. Если у тебя есть результаты сканирования с Nmap или Nuclei, можно настроить автоматическое создание HTML отчётов прямо из этих данных. И никакого парсинга руками.

Вот как это может работать:

#!/bin/bash<br># Генерация HTML отчёта из nmap/nuclei<br>TARGET=$1<br>OUTPUT_DIR="reports"<br><br># Запуск nmap и сохранение результатов<br>nmap -p 1-65535 --open $TARGET -oX $OUTPUT_DIR/nmap_scan.xml<br><br># Преобразуем XML в HTML<br>xsltproc /usr/share/nmap/nmap.xsl $OUTPUT_DIR/nmap_scan.xml &gt; $OUTPUT_DIR/nmap_report.html<br>
Что происходит в этом скрипте:
  1. Сначала запускаем nmap, выполняем сканирование всех портов на целевом хосте и сохраняем результаты в формате XML.
  2. Затем с помощью xsltproc преобразуем XML в более удобный HTML отчёт. Получается, что вся информация теперь в формате, который можно легко отправить заказчику или коллегам, и читать её удобно.
Для Nuclei ситуация такая же. У него есть возможность генерировать отчёты в формате JSON, и эти данные тоже можно конвертировать в HTML. Этот процесс можно полностью автоматизировать.

Markdown генерация​

Возможно, тебе нужен не HTML отчёт, а простой Markdown файл. Это отличный вариант, если нужно создать лёгкий отчёт, который потом можно будет загрузить в систему или документацию. Всё то же самое - скрипт собирает данные и выводит их в нужном формате. Вот как это можно сделать для Nmap:

#!/bin/bash<br># Генерация Markdown отчёта из nmap<br>TARGET=$1<br>OUTPUT_DIR="reports"<br><br># Запуск nmap и сохранение результатов<br>nmap -p 1-65535 --open $TARGET -oX $OUTPUT_DIR/nmap_scan.xml<br><br># Преобразуем XML в Markdown<br>xsltproc /usr/share/nmap/nmap_to_markdown.xsl $OUTPUT_DIR/nmap_scan.xml &gt; $OUTPUT_DIR/nmap_report.md<br>
Здесь тоже:
  1. Мы запускаем nmap и сохраняем результаты в XML.
  2. Затем с помощью xsltproc используем специальный XSL-шаблон для преобразования в Markdown.

Scheduling и Alerting - как настроить автоматические проверки и уведомления с помощью Bash

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

Cron jobs: best practices​

Если говорить о cron, то тут всё достаточно просто. Запускаем регулярные задачи, такие как проверка логов, мониторинг хостов, сканирование портов или просто сбор статистики, чтобы позже проанализировать. Время - это деньги, а значит, задача должна быть выполнена вовремя, без задержек. Вот пример скрипта, который выполняет задачу по расписанию:

Bash:
#!/bin/bash
TARGET=$1
OUTPUT_DIR="reports"

nmap -p 1-65535 --open $TARGET > $OUTPUT_DIR/nmap_report.txt

mail -s "Еженедельный отчёт по сканированию" admin@domain.com < $OUTPUT_DIR/nmap_report.txt
Этот скрипт запускает сканирование портов на хосте по расписанию. Важно, чтобы это не зависело от того, подключён ли ты к серверу или нет. Используя cron, можно запланировать его выполнение, например, каждую неделю, чтобы регулярно получать обновления по состоянию системы. Это даёт тебе гарантии, что всё будет проверено, даже если ты забыл или не успел.

Telegram/Slack alerting​

Но автоматические проверки - это не всё. Если случается что-то важное, тебе нужно об этом знать. И чем быстрее - тем лучше. Технически, ты можешь настроить уведомления, чтобы сразу получать сообщения на Telegram или Slack о любых аномалиях. Например, если что-то не так с портами, с хостами или с другими параметрами, ты получишь сообщение мгновенно, и можно будет быстро реагировать.

Для этого нужно подключить API Telegram или Slack и отправлять туда сообщения. Вот как это можно настроить с Bash для уведомлений в Telegram:

Bash:
#!/bin/bash
TOKEN="your_telegram_bot_token"
CHAT_ID="your_chat_id"
MESSAGE="Сканирование завершено успешно. Порты открыты."

curl -s -X POST https://api.telegram.org/bot$TOKEN/sendMessage -d chat_id=$CHAT_ID -d text="$MESSAGE"
В этом примере мы используем Telegram Bot API, чтобы отправить сообщение в чат. Сообщение можно настроить на любое событие, которое ты хочешь отслеживать. Например, отправка отчёта, запуск тестов или уведомление о том, что порт был открыт. Так ты всегда будешь в курсе, даже если не сидишь у компьютера.

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


Послесловие​

В нашей стезе важно действовать быстро и чётко. Рутинные задачи... всё это можно и нужно автоматизировать. Простой Bash-скрипт может сэкономить часы работы, минимизировать ошибки и обеспечить своевременную реакцию на потенциальные угрозы.

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab