Cuckoo 2.0. Cобираем лучшую опенсорсную платформу динамического анализа вредоносных файлов
Приветствую Хабр!
4 года назад я публиковал инструкцию по сборке платформы динамического анализа вредоносных файлов Cuckoo Sandbox 1.2. За это время проект успел обрасти внушительным функционалом и огромным комьюнити, недавно обновившись до версии 2.0, которая больше полутора лет висела в стадии Release Candidate.
Я наконец-то подготовил для вас полнейший мануал по сборке Cuckoo Sandbox 2.0.5 со всеми плюшками, какие есть в проекте на данный момент, с упаковкой Cuckoo в venv и без использования root, добавив более 12-ти security утилит в песочницу! По совокупности собранного материала, не побоюсь сказать: «Это самый полный и выверенный шаг в шаг гайд из всех опубликованных в интернете на данный момент». Тем кто, осилит статью до конца — дам маленький совет, что делать, когда песочница собрана и как получить максимальный профит с автоматизации процессов ИБ своими сиилами с помощью опенсорса. Всем гикам, вирусным аналитикам, безопасникам, ребятам из SOC, CERT, CSIRT и просто любителям потыкать кнопки в терминале — добро пожаловать под кат!
За последние несколько лет в проекте Cuckoo произошло немало, добавились новые инструменты, появилась поддержка дополнительного ПО, количество сигнатур увеличилось в разы, появилась система рейтинга вредоносности проверяемого файла, был переписан весь UI и теперь можно настроить приятную глазу тёмную тему.
Позитивные изменения в проекте очевидны — песочница начала обновляться микро релизами, которые оперативно закрывают выявленные и подтверждённые баги. Обо всех небольших изменениях разработчики начали писать в блог, там можно найти и roadmap проекта. К сожалению, изменений произошло настолько много, что сводную таблицу «до» и «после» проблематично составить, сейчас это 2 платформы разных эпох, лучше сами посмотрите блог, вам понравится!
Советую почаще заглядывать в блог, разработчики уже который релиз обещают включить в маcтер ветку драйвер антидетекта ВМ zer0mon, однако теперь сроки сдвинудись до релиза 2.1.0, следите за новостями, вещь реально нужная!
Сам же код Cuckoo перебрался в пакетный менеджер PIP и обновляется буквально в одну команду.
Позитивной стала и новость о запуске коммерческой поддержки, для клиентов, которым необходима стабильность в работе, поскольку стабильность — главный недостаток Cuckoo с первых релизов. Очень надеюсь, что привлечённые в проект деньги помогут разработчикам добиться качественной работы приложения.
Однако проблема с установкой не изменилась с начала проекта — Cuckoo Sandbox документирован хорошо, а с модулями, в которых всегда происходят баги — беда. Некоторые приложения не документированы вовсе и чтобы понять как и что работает — нужно смотреть код, некоторые почти не обновляются и не поддерживаются, как HoneyD. Потратив немалое количество времени, я смог собрать кукушку со всеми рекомендациями разработчиков — обернуть кукушку в Venv и настроить всё с нуля не используя root пользователя для работы Cuckoo! Каждый этап выверен шаг в шаг многократным откатом бекапов в тестовой среде, пока инструкция не стала полностью рабочей.
Особенности сборки
Согласно рекомендациям разработчиков, Cuckoo Sandbox 2.0.5 собрана на ОС Ubuntu 16.04.03 установленной в ESXi кластере. В качестве гипервизора Cuckoo будет использован VirtualBox 5.2. Установка ВМ будет производиться через скрипт автоустановки VMcloak. С VMcloak больше не нужно искать уязвимое стаоре ПО для гостевой ОС, не надо настраивать сеть и Python, в одну команду терминала VMcloak установит всё необходимое, в том числе Cuckoo Agent и настроит. С VMcloak клонировать, администрировать и донастраивать ВМ теперь одно удовольствие. В качестве ОС виртуальной среды я использую Windows 7 SP1×64, хотя Cuckoo Sandbox поддерживает все версии Windows, начиная с XP.
Пол года назад разработчики Cuckoo включили возможность проксировать трафик с ВМ через VPN или Tor. В данной настройке я остановился на простом методе — давать доступ в интернет напрямую или через Tor.
Дополнительно к Cuckoo Sandbox будут установлены следующее ПО:
- Suricata — IDS.
- Snort — IDS.
- HoneyD — Honeypot.
- InetSim — Эмулятор сети.
- Tor — onion маршрутизация трафика гостевой ВМ.
- Teserract — Распознавание текста на скриншотах.
- MitMproxy — Анализ SSL трафика через «man-in-the-middle».
- Moloch — IDS (очень удобная и крутая утилита для анализа трафика).
- SSDeep — Fuzzy-Hashing.
- Volatility — Фреймворк для исследования RAM.
- Distorm3 — Дизассемблер.
- Yara — Утилита, для распознавания и классификации вредоносного ПО.
Тринадцатым пунктом должна была стать программа потокового антивирусного анализа файлов IRMA, однако при включении IRMA в Cuckoo, выгрузка отчёта в Elastic ломалась, разработчики так и не дали ответ по этой баге, а анализировать Index эластика не было времени. Поэтому в данной инструкции будет пункт про сборку IRMA, но интеграция с Cuckoo включена не будет. Возможно найдётся гуру ELK стека, готовый доблестно побороть баг и дополнить мою статью. Найти IRMA и воспользоваться ею можно будет на порте 8080.
В качестве недостатка могу отметить некорректные ссылки на Moloch в веб интерфейсе песочницы, поправить, наверное, можно, но для меня это не критично, сам сервис Moloch будет висеть на порту 8005 и этого достаточно.
Cuckoo будет хранить данные скаинрований в БД MongoDB, системные данные в Postgresql и индексы в Elasticsearch для быстрого поиска и выборки, экспортировать в Json, HTML и PDF, работать через веб сервер Nginx с настроенным по всем канонам SSL (не считая self-signed cert) и в связке с UWSGI.
Данная сборка настроена только на анализ в Windows песочнице. Android, OS X и Linux не настроены. Если будут вопросы по этой части — пишите в ЛС, теоретически я знаю, как это сделать, но этот функционал выходит за области моих интересов и моей работы в данный момент.
Особенности мануала
В текущей статье, не будет предоставлен скрипт автоустановки. Мне, конечно не лень его написать, но в нём нет смысла, чтобы песочница работала корректно — лучше собирать вручную и внимательно смотреть что и как собирается, анализировать каждую ошибку. Вы всё-таки собираете приложение, которое взаимодействует с десятком внешних программ, которые постоянно обновляются. Баги — неизбежны, поэтому лучше найти их самому, чем потом разобраться что в скрипте пошло не так.
В эту статью я не стал выносить все зависимости устанавливаемых программ в самое начало одной строчкой, как в прошлой статье. К каждому конкретному ПО, подключаемому к Cuckoo зависимости указаны в разделе установки данного ПО.
4 года анализа вредоносного ПО с использованием Cuckoo показали мне вполне очевидную линейную зависимость — чем больше ты подключишь к песочнице сервисов, тем хуже она работает. Поэтому нет смысла ставить все зависимости сразу, ведь айтишники постарше и поопытней могут отказаться в проде от тех компонентов, которые работают нестабильно, а информация от них будет избыточна. Лучшее — враг хорошего, как говорится.
В данной статье не задействован REST API, сделать это достаточно просто, но мне он на текущем этапе не нужен.
Описывать каждую утилиту подробно не стану, помечу только важное, тем более существенная часть утилит описана в моей прошлой статье, там же есть и инфа по включению REST API.
И самое главное — статья выходит в свет на несколько месяцев после инструкции по сборке, что-то уже может поменяться, что-то не работать. Если встретили баг — напишите в ЛС.
А теперь ответим на самый популярный вопрос и приступим к установке!
А что если я не силён в этих ваших Linux, а песочница очень нужна
Ответ на этот вопрос прост — используй онлайн песочницы или возись с Windows Sysinternals.
- Сервис номер 1, «Эстонская Cuckoo». Очень грамотно собранный Cuckoo Sandbox последней версии от Эстонского CERT (Computer Emergency Response Team). Лучшая реализация песочницы из тех, что я находил в сети. Пользуясь сервисом помним, что загруженные данные могут быть разобраны на индикаторы компетенции (IoC) и с помощью ПО типа MISP переданы в другие национальные CERT в соответствии с установленными правилами передачи TLP. Поэтому внимательно подумайте, заливать вам или нет туда конфиденциальную софтину.
- Сервис номер 2, «Hybrid Analysis». Популярная в узких кругах (или уже не в узких) онлайн песочница, стабильность и качество которой на высоте, из минусов — функционал немного ограничен, семплы вредоносов выгружать нельзя.
- Сервис номер 3, «Вечно мёртвый Malwr» — самая популярная песочница, поддержкой которой занимаются авторы Cuckoo Sandbox, нынче снова пала под нагрузкой и пол года как лежит. Единственный сайт, откуда можно было грузить семплы вирусного ПО на анализ бесплатно, не считая этой подборки. Надеюсь на оживление, но прогноз пока не утешительный.
- Вариант 4, «Поищу самостоятельно» — для тех кто знаком с принципами OSINT и языком поисковых запросов. Берём кусок статического текста с платформы:
И гуглим в кавычках, находя все попавшие в индекс песочницы исключая github:
Сборка
Итак, теоретическая часть позади, приступаем к практике!
Обновление ОС
Обновляем системные пакеты.
sudo apt update
sudo apt upgrade -y
Зависимости Cuckoo
Устанавливаем зависимости Cuckoo.
sudo apt install python python-pip python-dev libffi-dev libssl-dev libfuzzy-dev -y
sudo apt install python-virtualenv python-setuptools -y
sudo apt install libjpeg-dev zlib1g-dev swig -y
sudo -H pip install -U pip
Virtualbox
Устанавливаем Virtualbox вместе с extpack.
cd /opt
sudo sh -c 'echo "deb http://download.virtualbox.org/virtualbox/debian xenial contrib" >> /etc/apt/sources.list.d/virtualbox.list'
sudo wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
sudo apt update && sudo apt install virtualbox-5.2 -y
VBOX_LATEST_VERSION=$(curl http://download.virtualbox.org/virtualbox/LATEST.TXT)
sudo wget http://download.virtualbox.org/virtualbox/${VBOX_LATEST_VERSION}/Oracle_VM_VirtualBox_Extension_Pack-${VBOX_LATEST_VERSION}.vbox-extpack
sudo vboxmanage extpack install Oracle_VM_VirtualBox_Extension_Pack-${VBOX_LATEST_VERSION}.vbox-extpack
Cuckoo Sandbox
Устанавливаем Venv, активируем и ставим Cuckoo через PIP.
sudo adduser cuckoo
sudo usermod -a -G vboxusers cuckoo
cd /home/cuckoo
su cuckoo
virtualenv cuckoo
. /home/cuckoo/cuckoo/bin/activate
pip install -U pip setuptools psycopg2 yara-python weasyprint pycrypto pydeep
easy_install distribute
pip install -U cuckoo
pip install weasyprint==0.36
pip install m2crypto==0.24.0
cuckoo
cuckoo community
deactivate
sudo apt install python-m2crypto
exit
Java для Elasticsearch
Elastic написан на Java, поэтому нам нужно установить Java.
sudo add-apt-repository ppa:webupd8team/java
sudo apt update && sudo apt install oracle-java8-installer -y
sudo bash -c "echo 'JAVA_HOME=\"/usr/lib/jvm/java-8-openjdk-amd64\"' >> /etc/environment"
source /etc/environment
БД
Тут устанавливаем и настраиваем все БД, обратите внимание, переменная «db_passwd» генерирует рандомный пароль к базе Postgres, если хотите задать свой — не забудьте установить его.
Cuckoo использует морально устаревший Elastic 2-й версии, обратите на это внимание и не установите случайно 5.x+ версию.
sudo apt install mongodb -y
sudo apt install postgresql libpq-dev -y
sudo pip install psycopg2
db_passwd=$(date +%s | sha256sum | base64 | head -c 32 ; echo)
echo "CREATE USER cuckoo WITH PASSWORD '$db_passwd';" | sudo -u postgres psql
echo "CREATE DATABASE cuckoo;" | sudo -u postgres psql
echo "GRANT ALL PRIVILEGES ON DATABASE cuckoo to cuckoo;" | sudo -u postgres psql
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
sudo apt update && sudo apt install elasticsearch -y
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo service elasticsearch stop
cd /home/cuckoo/
sudo mkdir /home/cuckoo/ESData
sudo chown root:elasticsearch ESData
sudo chmod 777 /home/cuckoo/ESData
sudo usermod -a -G elasticsearch cuckoo
sudo bash -c "cat >> /etc/elasticsearch/elasticsearch.yml <
Yara + rules
Установим последнюю версию Yara и добавим правила Yara в Cuckoo.
cd /opt
sudo apt install dh-autoreconf flex bison libjansson-dev libmagic-dev -y
sudo wget https://github.com/VirusTotal/yara/archive/v3.7.1.tar.gz
sudo tar -zxf v3.7.1.tar.gz
cd yara-3.6.3/
sudo ./bootstrap.sh
sudo ./configure --with-crypto --enable-cuckoo --enable-magic
sudo make
sudo make install
sudo -H pip install -U yara-python
cd /home/cuckoo/.cuckoo/yara/
su cuckoo
sudo git clone https://github.com/lehuff/cuckoo-yara-rules.git
sudo cp cuckoo-yara-rules/cuckoo-yara-rules.py .
sudo rm -rf cuckoo-yara-rules
sudo python cuckoo-yara-rules.py
sudo chown -R cuckoo:cuckoo /home/cuckoo/.cuckoo/
SSDeep
Устанавливаем SSDeep.
cd /opt
sudo -H pip install -U ssdeep
sudo git clone https://github.com/bunzen/pySSDeep.git
cd pySSDeep
sudo python setup.py build
sudo python setup.py install
cd -
Volatility
Установить Volatility просто, но заставить Cuckoo из venv его увидеть — не очень, ставить — же в venv вместе с Cuckoo — тоже не вариант, он зависимостями меняет версии библиотек Cuckoo. С третей строчки костыль, решающий эту проблему, если у кого есть идея, как это подружить более верным способом — напишите.
sudo apt install pcregrep libpcre++-dev -y
sudo -H pip install -U git+https://github.com/kbandla/pydeep.git
sudo apt install volatility -y
cp -r /usr/lib/python2.7/dist-packages/volatility* /home/cuckoo/cuckoo/lib/python2.7/site-packages
sudo chown cuckoo:cuckoo /home/cuckoo/cuckoo/lib/python2.7/site-packages/*
mv /home/cuckoo/.cuckoo/signatures/windows/volatility_sig.py /home/cuckoo/.cuckoo/signatures/windows/volatility_sig.py.deactivate
TCPDump
Дошли до TCP dump.
sudo apt install tcpdump apparmor-utils -y
sudo aa-disable /usr/sbin/tcpdump
sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
sudo chmod +s /usr/sbin/tcpdump
Teserract
Ставится просто, подключается тоже, однако прелести в работе OCR я не заметил.
sudo apt install tesseract-ocr -y
Fonts for PDF
Без этой магии PDF отчёты генерироваться не будут.
sudo -H pip install -U cairocffi
sudo apt install wkhtmltopdf xvfb xfonts-100dpi -y
MitMproxy
Очень полезная библиотека, позволяющая подглядывать в SSL трафик. Обратите внимание, Cuckoo понимает только пакет версии 0.18.2.
sudo apt install libarchive13 libxml2-dev libxslt1-dev -y
sudo -H pip install -U mitmproxy==0.18.2
su cuckoo
cd ~
mitmproxy + ctrl-c
sudo cp ~/.mitmproxy/mitmproxy-ca-cert.p12 /home/cuckoo/.cuckoo/analyzer/windows/bin/cert.p12
sudo chown cuckoo:cuckoo /home/cuckoo/.cuckoo/analyzer/windows/bin/cert.p12
exit
Tor
Тут всё достаточно просто.
sudo apt install tor -y
sudo sh -c 'echo TransPort 192.168.56.1:9040 >> /etc/tor/torrc'
sudo sh -c 'echo DNSPort 192.168.56.1:5353 >> /etc/tor/torrc'
Suricata
Изначально я хотел написать что и где в конфиге надо править, но к моменту, когда я смог побороть Suricata и убрать все огрехи работы, правок в конфиг было внесено немало, а задокументировано — 0, поэтому публикую конфиг целиком. Тем более оригинальный файл с правилами останется нетронутым.
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update && sudo apt install suricata -y
echo "alert http any any -> any any (msg:\"FILE store all\"; filestore; noalert; sid:15; rev:1;)" | sudo tee /etc/suricata/rules/cuckoo.rules
sudo touch /etc/suricata/suricata-cuckoo.yaml
%YAML 1.1
---
vars:
address-groups:
HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"
EXTERNAL_NET: "any"
HTTP_SERVERS: "$HOME_NET"
SMTP_SERVERS: "$HOME_NET"
SQL_SERVERS: "$HOME_NET"
DNS_SERVERS: "$HOME_NET"
TELNET_SERVERS: "$HOME_NET"
AIM_SERVERS: "$EXTERNAL_NET"
DNP3_SERVER: "$HOME_NET"
DNP3_CLIENT: "$HOME_NET"
MODBUS_CLIENT: "$HOME_NET"
MODBUS_SERVER: "$HOME_NET"
ENIP_CLIENT: "$HOME_NET"
ENIP_SERVER: "$HOME_NET"
port-groups:
HTTP_PORTS: "80"
SHELLCODE_PORTS: "!80"
ORACLE_PORTS: 1521
SSH_PORTS: 22
DNP3_PORTS: 20000
MODBUS_PORTS: 502
FILE_DATA_PORTS: "[$HTTP_PORTS,110,143]"
FTP_PORTS: 21
default-rule-path: /etc/suricata/rules
rule-files:
- botcc.rules
- ciarmy.rules
- compromised.rules
- drop.rules
- dshield.rules
- emerging-attack_response.rules
- emerging-chat.rules
- emerging-current_events.rules
- emerging-dns.rules
- emerging-dos.rules
- emerging-exploit.rules
- emerging-ftp.rules
- emerging-imap.rules
- emerging-malware.rules
- emerging-misc.rules
- emerging-mobile_malware.rules
- emerging-netbios.rules
- emerging-p2p.rules
- emerging-policy.rules
- emerging-pop3.rules
- emerging-rpc.rules
- emerging-scan.rules
- emerging-smtp.rules
- emerging-snmp.rules
- emerging-sql.rules
- emerging-telnet.rules
- emerging-tftp.rules
- emerging-trojan.rules
- emerging-user_agents.rules
- emerging-voip.rules
- emerging-web_client.rules
- emerging-web_server.rules
- emerging-worm.rules
- tor.rules
- http-events.rules
- smtp-events.rules
- dns-events.rules
- tls-events.rules
classification-file: /etc/suricata/classification.config
reference-config-file: /etc/suricata/reference.config
default-log-dir: /var/log/suricata/
stats:
enabled: yes
interval: 8
outputs:
- fast:
enabled: no
filename: fast.log
append: yes
- eve-log:
enabled: yes
filetype: regular
filename: eve.json
types:
- alert:
metadata: yes
tagged-packets: yes
xff:
enabled: no
mode: extra-data
deployment: reverse
header: X-Forwarded-For
- http:
extended: yes
- dns:
query: yes
answer: yes
- tls:
extended: yes
- files:
force-magic: no
- smtp:
- ssh
- stats:
totals: yes
threads: no
deltas: no=
- flow
- unified2-alert:
enabled: no
filename: unified2.alert
xff:
enabled: no
mode: extra-data
deployment: reverse
header: X-Forwarded-For
- http-log:
enabled: no
filename: http.log
append: yes
- tls-log:
enabled: no
filename: tls.log
append: yes
- tls-store:
enabled: no
- dns-log:
enabled: no
filename: dns.log
append: yes
- pcap-log:
enabled: no
filename: log.pcap
limit: 1000mb
max-files: 2000
mode: normal
use-stream-depth: no
honor-pass-rules: no
- alert-debug:
enabled: no
filename: alert-debug.log
append: yes
- alert-prelude:
enabled: no
profile: suricata
log-packet-content: no
log-packet-header: yes
- stats:
enabled: yes
filename: stats.log
totals: yes
threads: no
- syslog:
enabled: no
facility: local5
- drop:
enabled: yes
filename: drop.log
append: yes
- file-store:
enabled: yes
log-dir: files
force-magic: no
force-filestore: no
- file-log:
enabled: yes
filename: files-json.log
append: yes
force-magic: no
- tcp-data:
enabled: no
type: file
filename: tcp-data.log
- http-body-data:
enabled: no
type: file
filename: http-data.log
- lua:
enabled: no
scripts:
logging:
default-log-level: notice
default-output-filter:
outputs:
- console:
enabled: yes
- file:
enabled: yes
level: info
filename: /var/log/suricata/suricata.log
- syslog:
enabled: no
facility: local5
format: "[%i] <%d> -- "
af-packet:
- interface: eth0
cluster-id: 99
cluster-type: cluster_flow
defrag: yes
- interface: default
pcap:
- interface: eth0
- interface: default
pcap-file:
checksum-checks: auto
app-layer:
protocols:
tls:
enabled: yes
detection-ports:
dp: 443
dcerpc:
enabled: yes
ftp:
enabled: yes
ssh:
enabled: yes
smtp:
enabled: yes
mime:
decode-mime: yes
decode-base64: yes
decode-quoted-printable: yes
header-value-depth: 2000
extract-urls: yes
body-md5: no
inspected-tracker:
content-limit: 100000
content-inspect-min-size: 32768
content-inspect-window: 4096
imap:
enabled: detection-only
msn:
enabled: detection-only
smb:
enabled: yes
detection-ports:
dp: 139, 445
nfs:
enabled: no
dns:
tcp:
enabled: yes
detection-ports:
dp: 53
udp:
enabled: yes
detection-ports:
dp: 53
http:
enabled: yes
request-body-limit: 0
response-body-limit: 0
libhtp:
default-config:
personality: IDS
request-body-limit: 100kb
response-body-limit: 100kb
request-body-minimal-inspect-size: 32kb
request-body-inspect-window: 4kb
response-body-minimal-inspect-size: 40kb
response-body-inspect-window: 16kb
response-body-decompress-layer-limit: 2
http-body-inline: auto
double-decode-path: no
double-decode-query: no
server-config:
modbus:
enabled: no
detection-ports:
dp: 502
stream-depth: 0
dnp3:
enabled: no
detection-ports:
dp: 20000
enip:
enabled: no
detection-ports:
dp: 44818
sp: 44818
ntp:
enabled: no
asn1-max-frames: 256
coredump:
max-dump: unlimited
host-mode: auto
unix-command:
enabled: yes
filename: custom.socket
legacy:
uricontent: enabled
engine-analysis:
rules-fast-pattern: yes
rules: yes
pcre:
match-limit: 3500
match-limit-recursion: 1500
host-os-policy:
windows: [0.0.0.0/0]
bsd: []
bsd-right: []
old-linux: []
linux: []
old-solaris: []
solaris: []
hpux10: []
hpux11: []
irix: []
macos: []
vista: []
windows2k3: []
defrag:
memcap: 32mb
hash-size: 65536
trackers: 65535
max-frags: 65535
prealloc: yes
timeout: 60
flow:
memcap: 128mb
hash-size: 65536
prealloc: 10000
emergency-recovery: 30
vlan:
use-for-tracking: true
flow-timeouts:
default:
new: 30
established: 300
closed: 0
bypassed: 100
emergency-new: 10
emergency-established: 100
emergency-closed: 0
emergency-bypassed: 50
tcp:
new: 60
established: 600
closed: 60
bypassed: 100
emergency-new: 5
emergency-established: 100
emergency-closed: 10
emergency-bypassed: 50
udp:
new: 30
established: 300
bypassed: 100
emergency-new: 10
emergency-established: 100
emergency-bypassed: 50
icmp:
new: 30
established: 300
bypassed: 100
emergency-new: 10
emergency-established: 100
emergency-bypassed: 50
stream:
memcap: 64mb
checksum-validation: yes
inline: auto
reassembly:
memcap: 256mb
depth: 0
toserver-chunk-size: 2560
toclient-chunk-size: 2560
randomize-chunk-size: yes
host:
hash-size: 4096
prealloc: 1000
memcap: 32mb
decoder:
teredo:
enabled: true
detect:
profile: medium
custom-values:
toclient-groups: 3
toserver-groups: 25
sgh-mpm-context: auto
inspection-recursion-limit: 3000
prefilter:
default: mpm
grouping:
profiling:
grouping:
dump-to-disk: false
include-rules: false
include-mpm-stats: false
mpm-algo: auto
spm-algo: auto
threading:
set-cpu-affinity: no
cpu-affinity:
- management-cpu-set:
cpu: [ 0 ]
- receive-cpu-set:
cpu: [ 0 ]
- worker-cpu-set:
cpu: [ "all" ]
mode: "exclusive"
prio:
low: [ 0 ]
medium: [ "1-2" ]
high: [ 3 ]
default: "medium"
detect-thread-ratio: 1.0
luajit:
states: 128
profiling:
rules:
enabled: yes
filename: rule_perf.log
append: yes
limit: 10
json: yes
keywords:
enabled: yes
filename: keyword_perf.log
append: yes
rulegroups:
enabled: yes
filename: rule_group_perf.log
append: yes
packets:
enabled: yes
filename: packet_stats.log
append: yes
csv:
enabled: no
filename: packet_stats.csv
locks:
enabled: no
filename: lock_stats.log
append: yes
pcap-log:
enabled: no
filename: pcaplog_stats.log
append: yes
nfq:
nflog:
- group: 2
buffer-size: 18432
- group: default
qthreshold: 1
qtimeout: 100
max-size: 20000
capture:
netmap:
- interface: eth2
- interface: default
pfring:
- interface: eth0
threads: 1
cluster-id: 99
cluster-type: cluster_flow
- interface: default
ipfw:
napatech:
hba: -1
use-all-streams: yes
streams: ["0-3"]
mpipe:
load-balance: dynamic
iqueue-packets: 2048
inputs:
- interface: xgbe2
- interface: xgbe3
- interface: xgbe4
stack:
size128: 0
size256: 9
size512: 0
size1024: 0
size1664: 7
size4096: 0
size10386: 0
size16384: 0
cuda:
mpm:
data-buffer-size-min-limit: 0
data-buffer-size-max-limit: 1500
cudabuffer-buffer-size: 500mb
gpu-transfer-size: 50mb
batching-timeout: 2000
device-id: 0
cuda-streams: 2
И напоследок, поправим права.
sudo mkdir /var/run/suricata
sudo chown cuckoo:cuckoo /var/run/suricata
sudo chown -R cuckoo:cuckoo /etc/suricata
sudo chown -R cuckoo:cuckoo /var/log/suricata
sudo touch /etc/suricata/threshold.config
ETupdate
Настраиваем автообновление Community сигнатур Suricata.
cd /opt
sudo git clone https://github.com/seanthegeek/etupdate.git
sudo cp etupdate/etupdate /usr/sbin
sudo /usr/sbin/etupdate -V
sudo crontab -e
0 0 * * * /usr/sbin/etupdate -V
Snort
Добавлять правила в него не стал, так как больше доверяю Suricata.
sudo apt install snort -y
При конфигурации указываем дефолтный интерфейс и подсеть 192.168.0.0/16.
sudo chown -R cuckoo:cuckoo /etc/snort/
sudo chown -R cuckoo:cuckoo /var/log/snort/
VMcloak и Windows 7 SP1×64
Удобнейшая программа для автоматического развёртывания ВМ Cuckoo. Существенно сокрашает время, однако автор переписывал её логику работы и конечно-же не обновил документацию. Советую посмотреть либо код утилиты на GitHub, либо почитать старую документацию, чтобы понять все прелести работы с VMcloak и разобраться с тем, что мы будем делать дальше.
Самый внимательный хабражитель заметит, что официальный репозиторий проекта https://github.com/jbremer/vmcloak отличается от того, что использован ниже в скрипте https://github.com/tweemeterjop/vmcloak. По отношению к форку, оригинал не умел включать vRDE — реализацию RDP протокола в настраиваемой гостевой ВМ.
Наверное правильным будет вариант — взять оригинальный код и допилить в него vRDE, однако если форк не так далеко поменялся от отригинала — можно использовать форк, как делаю я ниже. На момент настройки репозиторий и его форк практически не имели отличий.
По опыту своему скажу — vRDE нужен, бывают use cases, когда документ целевой атаки защищён паролем Word и пароль надо ввести, чтобы вирус отработал в песочнице, либо вирус склеен с установщиком, который надо проинсталлить. Без vRDE это сделать проблематично. Да и для дальнейшей настройки ОС vRDE нам тоже понадобится.
cd /opt
sudo apt install libyaml-dev libpython2.7-dev genisoimage -y
sudo git clone -b vrde https://github.com/tweemeterjop/vmcloak.git
cd vmcloak/
sudo cp /home/cuckoo/.cuckoo/agent/agent.py vmcloak/data/bootstrap/
sudo -H pip install -r requirements.txt
sudo python setup.py install
cd ..
sudo mkdir -p /mnt/win7
sudo mount -o loop,ro ~/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso /mnt/win7/
sudo vmcloak-vboxnet0
sudo vmcloak-iptables 192.168.56.0/24 ens160
cd /home/cuckoo
su cuckoo
vmcloak init --vrde --resolution 1280x1024 --ramsize 4096 --win7_x64 --product professional --cpus 2 win7x64
vmcloak install --vrde win7_x64 python27 pillow adobepdf chrome cuteftp dotnet40 flash java silverlight vcredist wic
vmcloak modify --vrde win7_x64
Настройка Windows 7
После
vmcloak modify --vrde win7_x64
запустится ВМ, подключиться к ней можно по RDP. Если вы работаете с Win10 — не используйте плиточное приложение удалённого рабочего стола, оно впадает в ступор и транс, когда подключение идёт к ВМ без логина и пароля, используйте классическое приложение, там всё ОК.
Следующие пункты моего списка не обязательны, однако, чтобы сократить количество ложных срабатываний и упростить работу вредоносному ПО — рекомендуется отключить (или включить) всё ниже перечисленное. Не лишним будет и установка в гостевую ВМ софта, который используется на работе всеми сотрудниками.
Пример лишних данных в отчёте:
Замечу! Всё нижеперечисленное нужно проделать только для Windows 7 SP1×64, на других ОС действия, возможно, будут другими.
Спустя некоторое время работы с новой песочницей, мой список стал включать следующие пункты:
Отключаем Windows Messenger broadcasts on UDP port 1900
HKEY_LOCAL_MACHINE\Software\Microsoft\DirectPlayNATHelp\DPNHUPnP ключ Name: UPnPMode Type: REG_DWORD Value: 2
Отключаем проверку драйверов x64, чтобы Cuckoo нормально работала с x64
cmd — bcdedit.exe /set nointegritychecks ON
отключить NCSI
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet ключ EnableActiveProbing Type: REG_DWORD Value: 0
отключить teredo.ipv6.microsoft.com
cmd — netsh interface teredo set state disabled
отключаем IPv6
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\ добавлыяем ключ DWORDDisabled DisabledComponents 8
- Отключаем в сетевых адаптерах Tredo
- Отключаем автозагрузку Adobe Reader, Flash player, MS Office
- Отключаем аптдейт Chrome
- В chrome://plugins разрешить запуск уязвимого флеша
- В настройках Chrome разрешить всё в content settings
- В ветке HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google удаляем Update
- Отключаем сервисы FP, UPnP, SSDP
- Устанавливаем хром браузером по умолчанию
- Устанавливаем пустую стартовую страницу хрома
- Отключаем настройки приватности Chrome
- Устанавливаем FileZilla
- Отключаем синхронизацию с NTP
- Отключаем защищенный просмотр office (Data execution prevention mode)
- Разрешаем автозапуск макросов во всех приложениях в офисе
Последовательность составления собственной инструкции под собственную ОС:
- Проверяем легитимный исполняемый файл в песочнице;
- Смотрим, где и в каких вкладках появилась лишняя инфа, например, обращение к time.microsoft.com;
- Открываем Google и смотрим, как нам это отключать;
- Записываем, отключаем.
Добавление VM в Cuckoo
Создаём снапшот свежесконфигурированной гостевой ОС и добавляем в Cuckoo заодно удалив предустановленную ВМ cuckoo1 из конфига.
vmcloak snapshot win7_x64 win7_x64node1 192.168.56.101
. /home/cuckoo/cuckoo/bin/activate
cuckoo machine --add win7x64node1 192.168.56.101 --platform windows --snapshot vmcloak
cuckoo machine --delete cuckoo1
deactivate
Moloch
Наикрутейший инструмент для работы с сетевым трафиком. В отличии от других сетевых анализаторов — ставка в Moloch сделана на инструментарий для аналитика с кучей возможностей, временными шкалами, графами и прочим. Очень сожалею, что узнал о нём так недавно и пользовался до этого менее удобным MalCom. Одно из ключевых преимуществ Moloch — возможность объединить и проанализировать одним разом все сетевые пакеты всех сканирований из Cuckoo. Ну, а работа в связке с Elasticsearch позволяет Moloch обрабатывать огромное количество данных.
Вот так выглядит эта красота (скрин из официального репозитория):
Ну и его тоже проинсталлим.
sudo apt install libjson-perl -y
cd /opt
sudo wget https://files.molo.ch/builds/ubuntu-16.04/moloch_0.20.2-2_amd64.deb
sudo dpkg -i moloch_0.20.2-2_amd64.deb
sudo /data/moloch/bin/Configure
Далее необходимо указать интерфейс vboxnet0, логин и пароль Moloch, IP адрес Elasticsearch.
sudo /data/moloch/db/db.pl http://localhost:9200 init
sudo /data/moloch/bin/moloch_add_user.sh cuckoo cuckoo cuckoosandbox --admin
InetSim
Устанавливаем виртуальную локальную сеть, чтобы вирусу не было одиноко в песочнице. Настройки эмулируемых сервисов оставил дефолтные, 18 эмулированных служб получилось, не считая веба.
sudo su
echo "deb http://www.inetsim.org/debian/ binary/" > /etc/apt/sources.list.d/inetsim.list
wget -O - http://www.inetsim.org/inetsim-archive-signing-key.asc | apt-key add -
apt update
apt install inetsim
exit
В конфиге /etc/inetsim/inetsim.conf нужно закомментировать сервисы веба HTTP и HHTPS, чтобы не конфликтовали с Cuckoo:
#start_service http
#start_service https
IRMA
C песочницей IRMA не интегрирована из-за проблемы выгрузки отчётов в Elasticsearch. Но это не мешает нам развернуть и протестировать утилиту. IRMA собрана в Vagrant и деплоится автоматически через Ansible строго версии 2.2.1.0.
sudo apt install vagrant -y
cd /opt
sudo wget https://releases.hashicorp.com/vagrant/2.0.2/vagrant_2.0.2_x86_64.deb
sudo dpkg -i vagrant_2.0.2_x86_64.deb
sudo -H pip install -U ansible==2.2.1.0
Загрузим IRMA:
sudo git clone https://github.com/quarkslab/irma
cd irma/ansible
Добавим переадресацию из VM на порт 8080 добавив в файл /opt/irma/ansible/Vagrantfile
строчку 19:
config.vm.network "forwarded_port", guest: 80, host: 8080
И установим IRMA:
sudo vagrant up
HoneyD
HoneyD — старейший и крайне функциональный ханипот. Минус его только в одном — он перестал обновляться несколько лет назад. Навыки поиска годных форков были применены успешно, после чего был найден относительно свежий вариант установки HoneyD через Ansible, которым я и поспешил воспользоваться. В ханипоте я настрил всего один хост, можете сконфигурировать хоть целую подсеть, воспользовавшись официальным мануалом.
cd /opt/
sudo git clone https://github.com/Bifrozt/honeyd-ansible.git
cd honeyd-ansible/
sudo ansible-playbook honeyd.yml
sudo touch /usr/share/honeyd/config.conf
Сохраняем конфиг.
create default
set default default tcp action filtered
set default default udp action filtered
set default default icmp action filtered
create windows
set windows personality "Microsoft Windows XP Professional SP3"
set windows uptime 1728650
set windows maxfds 35
set windows default tcp action reset
add windows tcp port 135 open
add windows tcp port 139 open
add windows tcp port 445 open
set windows ethernet "08:00:27:81:1d:0c"
bind 192.168.56.103 windows
Веб сервер
Установим Nginx, сгенерируем сертификат и даже включим поддержку http2.
sudo add-apt-repository ppa:nginx/development
sudo apt update
sudo apt install nginx -y
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
sudo mkdir /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
sudo -H pip install -U uwsgi
cd /home/cuckoo/
sudo mkdir /var/log/uwsgi/
sudo mkdir /etc/uwsgi
sudo chown cuckoo:cuckoo /var/log/uwsgi/
sudo chown cuckoo:cuckoo /etc/uwsgi/
su cuckoo
Далее добавим конфиг UWSGI.
[uwsgi]
plugins = python
socket = /tmp/uwsgi.sock
chmod-socket = 664
master = true
processes = 4
virtualenv = /home/cuckoo/cuckoo
module = cuckoo.web.web.wsgi
uid = cuckoo
gid = cuckoo
static-map = /static=/home/cuckoo/cuckoo/local/lib/python2.7/site-packages/cuckoo/web/static
env = CUCKOO_APP=web
env = CUCKOO_CWD=/home/cuckoo/.cuckoo
И конфиг nginx, поменяв IP и название сайта:
upstream _uwsgi_cuckoo_web {
server unix:/tmp/uwsgi.sock;
}
server {
listen 80;
listen [::]:80;
server_name cuckoo.test.ru;
return 301 https://10.0.0.3$request_uri;
server_tokens off;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name cuckoo.test.ru;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=15768000";
ssl_stapling on;
ssl_stapling_verify on;
server_tokens off;
location / {
client_max_body_size 1G;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
uwsgi_pass _uwsgi_cuckoo_web;
include uwsgi_params;
}
}
Теперь добавим пользователя www-data в группу cuckoo и симлинком включим наш конфиг.
sudo adduser www-data cuckoo
sudo ln -s /etc/nginx/sites-available/cuckoo-web /etc/nginx/sites-enabled/
sudo systemctl reload nginx
Конфиги cuckoo
И, наконец, самое главное — объединяем всё собранное в песочницу. Объяснять что тут к чему долго, бессмысленно и 85% параметров интуитивно понятны, предлагаю воспользоваться официальной документацией начиная с 96 страницы, если есть сложности с пониманием некоторых параметров. Либо основное подглядеть в моей прошлой статье. Не самым плохим будет и вариант скопировать и использовать мои файлы приведённые ниже, но на свой страх и риск.
[sniffer]
enabled = yes
tcpdump = /usr/sbin/tcpdump
bpf =
[mitm]
enabled = yes
mitmdump = /usr/local/bin/mitmdump
port_base = 50000
script = mitm.py
certificate = bin/cert.p12
[services]
enabled = yes
services = honeyd
timeout = 0
[reboot]
enabled = yes
[cuckoo]
version_check = yes
delete_original = no
delete_bin_copy = no
machinery = virtualbox
memory_dump = yes
terminate_processes = no
reschedule = no
process_results = yes
max_analysis_count = 0
max_machines_count = 0
max_vmstartup_count = 10
freespace = 1024
tmppath =
rooter = /tmp/cuckoo-rooter
[feedback]
enabled = no
name =
company =
email =
[resultserver]
ip = 192.168.56.1
port = 2042
force_port = no
upload_max_size = 134217728
[processing]
analysis_size_limit = 134217728
resolve_dns = yes
sort_pcap = yes
[database]
connection = postgresql://cuckoo:Supersecretpassword4habr@localhost:5432/cuckoo
timeout = 60
[timeouts]
default = 120
critical = 60
vm_state = 60
[basic]
guest_profile = Win7SP1x64
delete_memdump = yes
[malfind]
enabled = yes
filter = yes
[apihooks]
enabled = no
filter = yes
[pslist]
enabled = yes
filter = no
[psxview]
enabled = yes
filter = no
[callbacks]
enabled = yes
filter = no
[idt]
enabled = yes
filter = no
[timers]
enabled = yes
filter = no
[messagehooks]
enabled = no
filter = no
[getsids]
enabled = yes
filter = no
[privs]
enabled = yes
filter = no
[dlllist]
enabled = yes
filter = yes
[handles]
enabled = yes
filter = yes
[ldrmodules]
enabled = yes
filter = yes
[mutantscan]
enabled = yes
filter = yes
[devicetree]
enabled = yes
filter = yes
[svcscan]
enabled = yes
filter = yes
[modscan]
enabled = yes
filter = yes
[yarascan]
enabled = yes
filter = yes
[ssdt]
enabled = yes
filter = yes
[gdt]
enabled = yes
filter = yes
[sockscan]
enabled = yes
filter = no
[netscan]
enabled = no
filter = no
[mask]
enabled = no
pid_generic =
[analysisinfo]
enabled = yes
[apkinfo]
enabled = no
decompilation_threshold = 5000000
[baseline]
enabled = no
[behavior]
enabled = yes
[buffer]
enabled = yes
[debug]
enabled = yes
[droidmon]
enabled = no
[dropped]
enabled = yes
[dumptls]
enabled = yes
[extracted]
enabled = yes
[googleplay]
enabled = no
android_id =
google_login =
google_password =
[memory]
enabled = yes
[misp]
enabled = no
url =
apikey =
maxioc = 100
[network]
enabled = yes
whitelist_dns = no
allowed_dns =
[procmemory]
enabled = yes
idapro = no
extract_img = no
extract_dll = no
dump_delete = no
[procmon]
enabled = yes
[screenshots]
enabled = yes
tesseract = /usr/bin/tesseract
[snort]
enabled = yes
snort = /usr/sbin/snort
conf = /etc/snort/snort.conf
[static]
enabled = yes
pdf_timeout = 60
[strings]
enabled = yes
[suricata]
enabled = yes
suricata = /usr/bin/suricata
conf = /etc/suricata/suricata-cuckoo.yaml
eve_log = eve.json
files_log = files-json.log
files_dir = files
socket =
[targetinfo]
enabled = yes
[virustotal]
enabled = yes
timeout = 60
scan = yes
key = тут ключ virustotal
[irma]
enabled = no
timeout = 300
scan = yes
force = yes
url = http://172.16.1.30
[feedback]
enabled = no
[jsondump]
enabled = yes
indent = 4
calls = yes
[singlefile]
enabled = yes
html = no
pdf = yes
[misp]
enabled = no
url =
apikey =
mode = maldoc ipaddr hashes url
[mongodb]
enabled = yes
host = 127.0.0.1
port = 27017
db = cuckoo
store_memdump = yes
paginate = 100
username =
password =
[elasticsearch]
enabled = yes
hosts = 127.0.0.1
timeout = 300
calls = no
index = cuckoo
index_time_pattern = yearly
cuckoo_node =
[moloch]
enabled = yes
host = 10.0.0.3:8005
insecure = no
moloch_capture = /data/moloch/bin/moloch-capture
conf = /data/moloch/etc/config.ini
instance = cuckoo
[notification]
enabled = no
url =
identifier =
[mattermost]
enabled = no
url =
myurl =
username = cuckoo
show_virustotal = no
show_signatures = no
show_urls = no
hash_filename = no
hash_url = no
[routing]
route = none
internet = ens160
rt_table = main
auto_rt = yes
drop = no
[inetsim]
enabled = yes
server = 192.168.56.1
[tor]
enabled = yes
dnsport = 5353
proxyport = 9040
[vpn]
enabled = no
vpns = vpn0
[vpn0]
name = vpn0
description = Spain, Europe
interface = tun0
rt_table = tun0
[virtualbox]
mode = headless
path = /usr/bin/VBoxManage
interface = vboxnet0
machines = win7_x64node1
[win7_x64node1]
label = win7_x64node1
platform = windows
ip = 192.168.56.101
snapshot = vmcloak
interface =
resultserver_ip = 192.168.56.1
resultserver_port = 2042
tags =
options =
osprofile = Win7SP1x64
[honeyd]
label = honeyd
platform = linux
ip = 192.168.56.103
tags = service, honeyd
options = nictrace noagent
Автозагрузка Cuckoo и сервисов
Теперь сделаем так, чтобы наш сервис после каждого перебоя в питании вставал самостоятельно и без лишней помощи.
Установим supervisor и добавим в него конфигурацию автозапуска Cuckoo.
sudo apt install supervisor -y
sudo systemctl stop supervisor
Cоздаём файлы supervisor:
[program:vmcloak-vboxnet0]
command=vmcloak-vboxnet0
directory=/usr/local/bin/
[program:vmcloak-ifconfig]
command=vmcloak-iptables 192.168.56.0/24 ens160
directory=/usr/local/bin/
[group:vmcloak-internet]
programs = vmcloak-vboxnet0, vmcloak-ifconfig
[program:cuckoo-rooter]
command = /home/cuckoo/cuckoo/bin/cuckoo rooter --sudo
autorestart = true
[program:cuckoo-daemon]
command = /home/cuckoo/cuckoo/bin/cuckoo -d -m 10000
user = cuckoo
startsecs = 30
autorestart = true
[program:cuckoo-process]
command = /home/cuckoo/cuckoo/bin/cuckoo process p%(process_num)d
process_name = cuckoo-process_%(process_num)d
numprocs = 4
user = cuckoo
autorestart = true
[group