Bash для ИБ-специалиста - главный инструмент для автоматизации или ещё один тяжёлый камень в жизни?
В мире ИБ есть вещи, которые нельзя игнорировать. Пожарные тесты, аудит логов, мониторинг инфраструктуры - каждое из этих действий по сути невидимо, но критически важно. Как из этого сделать не просто ежедневную работу, а эффективный процесс, который не тормозит тебя и не выжимает все силы?Вот тут и появляется Bash. Да, все говорят про Python, его библиотеки и удобство для разработки более серьёзных решений, но в реальной жизни чаще всего именно Bash оказывается под рукой, когда нужно быстро запустить что-то маленькое и полезное. Здесь и скорость, и минимальная зависимость от сторонних инструментов. Не нужно ждать, пока распакуется виртуальная машина с Python, чтобы проанализировать пару строк из лога или сканировать порты.
Это не означает, что Bash - это панацея. Конечно, Python и другие высокоуровневые инструменты тоже полезны, но всё-таки для большинства ежедневных задач, связанных с безопасностью, именно Bash - тот самый ключ к быстрой автоматизации и продуктивной работе. Парсинг логов, запуск сканеров, автоматическое отслеживание изменений - всё это можно сделать за несколько строчек кода. И иногда эти строки могут сэкономить тебе часы работы, которые ты мог бы потратить на решение других задач.
Мы разберемся, как Bash может стать твоим лучшим другом в работе. Как с его помощью можно автоматизировать рутинные процессы, не теряя в качестве. И что важнее - почему, несмотря на всё это великолепие Python и других решений, именно Bash остаётся по-настоящему быстрым и надёжным инструментом для работы в сфере ИБ.
Когда Bash, а когда Python?
Есть ли место Bash среди других инструментов, таких как Python, в ИБ? Тут важно понимать одну простую вещь. У Python масса плюсов, он универсален и может делать почти всё, что угодно. Но вот скорость? Особенно если речь идёт о рутинных задачах, быстрых проверках или сканированиях - тут Bash будет на высоте.Представь, что тебе нужно быстро обработать пару логов, найти среди них какие-то аномалии или выявить специфическую активность. Пара команд в Bash - и без лишних настроек и сложных зависимостей ты получишь желанное. В Python для того же самого тебе понадобятся библиотеки, больше строк кода и, возможно, время на установку этих зависимостей. Вот тебе и разница.
Bash выигрывает в тех ситуациях, когда:
- Нужна быстрая автоматизация без настройки среды.
- Нужно обработать небольшие объёмы данных или выполнить одноразовые задачи.
- Важен контроль за системой и процессы, которые можно автоматизировать через оболочку.
Основы работы с 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
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
Параллельное выполнение (xargs, parallel)
Когда нужно ускорить выполнение скриптов, параллельность - это то, что спасает. В случае с реконом, особенно когда работаешь с большим количеством субдоменов или IP-адресов, xargs и parallel могут значительно ускорить процесс.Вот пример того, как можно ускорить предыдущий процесс с помощью xargs:
Bash:
cat subdomains.txt | xargs -I % -P 10 bash -c "host %.$TARGET &> /dev/null && echo %.$TARGET found"
Если же ты предпочитаешь более гибкие инструменты для параллельности, можешь использовать parallel, который даёт ещё больше возможностей для управления процессами.
Bash:
cat subdomains.txt | parallel -j 10 "host {}.$TARGET &> /dev/null && echo {}.$TARGET found"
Когда работаешь с логами и пайпами, иногда базовые трюки командной строки ускоряют всё до нечеловеческих скоростей. Руководство с полезными приёмами для 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
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
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
Плюс такого подхода - в его универсальности. Ты можешь подключить любой 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
- Скрипт использует arp-scan для сканирования сети, записывая результат в новый файл.
- Далее, если существует старый список, он сравнивает текущий и старый файлы, выводя новые устройства, которых не было ранее.
- После этого обновляется старый файл новым результатом.
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
- Мы запускаем nmap, чтобы проверить все порты на целевом хосте.
- Сравниваем старые данные с новыми, и если что-то изменилось, выводим информацию о новых или изменённых портах.
- Обновляем старый файл текущими результатами для следующего запуска.
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 > $OUTPUT_DIR/nmap_report.html<br>
Что происходит в этом скрипте:
- Сначала запускаем nmap, выполняем сканирование всех портов на целевом хосте и сохраняем результаты в формате XML.
- Затем с помощью xsltproc преобразуем XML в более удобный 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 > $OUTPUT_DIR/nmap_report.md<br>
Здесь тоже:
- Мы запускаем nmap и сохраняем результаты в XML.
- Затем с помощью 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
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 или Slack, ты точно не пропустишь важный инцидент.
Послесловие
В нашей стезе важно действовать быстро и чётко. Рутинные задачи... всё это можно и нужно автоматизировать. Простой Bash-скрипт может сэкономить часы работы, минимизировать ошибки и обеспечить своевременную реакцию на потенциальные угрозы.Настроив автоматические проверки и уведомления, ты избавляешься от необходимости каждый раз выполнять однотипную работу вручную и освободишь время для более важных задач.
Последнее редактирование: