
Обнаружение уязвимостей в прошивке с помощью конколического анализа и кластеризации функций.
Firmware Slap объединяет конколический анализ с кластеризацией функций для обнаружения уязвимостей и поиска схожих функций в прошивках. Firmware Slap построен в виде набора библиотек и экспортирует большую часть информации в формате pickle или JSON для интеграции с другими инструментами.

Слайды с доклада можно найти здесь
Firmware Slap следует запускать в виртуальном окружении. Протестировано на Python3.6.
sudo apt install python3-virtualenv
virtualenv -p python3 fwslap
source fwslap/bin/activate
-- или --
cd ~
mkdir .virtualenvs
pip install virtualenv
which virtualenv #note path warnings
pip install virtualenvwrapper
echo "export PATH=$PATH:~/.local/bin" >> ~/.bashrc
echo "export WORKON_HOME=~/.virtualenvs" >> ~/.bashrc
echo "source ~/.local/bin/virtualenvwrapper.sh" >> ~/.bashrc
#usually best here to open new terminal
mkvirtualenv fwslap -p /usr/bin/python3
workon fwslap
python setup.py install
Вам потребуются rabbitmq, docker и (radare2 или Ghidra)
# Ubuntu
sudo apt install rabbitmq-server docker.io
# OSX
brew install rabbitmq
# Radare2
git clone https://github.com/radare/radare2.git
sudo ./radare2/sys/install.sh
# Ghidra
wget https://ghidra-sre.org/ghidra_9.0.4_PUBLIC_20190516.zip
unzip ghidra_9.0.4_PUBLIC_20190516.zip -d ghidra
echo "export PATH=\$PATH:$PWD/ghidra/ghidra_9.0.4/support" >> ~/.bashrc
Ghidra требует JDK 11.
sudo apt install default-jdk
java --version
Если вы хотите использовать Elasticsearch, запустите сценарий Elasticsearch_and_kibana.sh
Убедитесь, что rabbitmq-server запущен.
# In a Separate terminal, run this in the top level "Firmware_Slap" directory
celery -A firmware_slap.celery_tasks worker --loglevel=info
# Basic buffer overflow
Discover_And_Dump.py examples/iwconfig -D iwconfig_results
Load_And_View_Results.py iwconfig_results.all.pickle
# Click management on the left pane
# Click Saved Objects
# Click Import
# Select 'elastic_export.json' under the elastic directory in firmware slap
# Navigate to dashboards on left pane and select 'Overview Dashboard'
Load_And_View_Results.py iwconfig_results.all.pickle -s
# Command injection
tar -xvf examples/Almond_libs.tar.gz
Vuln_Discover_Celery.py examples/upload.cgi -L Almond_Root/lib/
# Get the firmware used for examples
wget https://firmware.securifi.com/AL3_64MB/AL3-R024-64MB
binwalk -Mre AL3-R024-64MB
Запустите celery worker из корневого каталога проекта:
# In a separate terminal
celery -A firmware_slap.celery_tasks worker --loglevel=info
В другом окне терминала запустите задачу поиска уязвимостей.
$ Vuln_Discover_Celery.py Almond_Root/etc_ro/lighttpd/www/cgi-bin/upload_bootloader.cgi -L Almond_Root/lib/
[+] Getting argument functions
[+] Analyzing 1 functions
0%| | 0/1 [00:01<?, ?it/s]
{ 'Injected_Location': { 'base': '0x7ffefde8',
........................ SNIP ......................
'type': 'Command Injection'}
Python 3.5.2 (default, Nov 12 2018, 13:43:14)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.3.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]:
Указанная выше команда вернет объект в переменной result. Это словарь, содержащий массу полезной информации об уязвимости. В объекте есть три основных ключа: аргументы функции, память и место инъекции.
In [3]: result.keys()
Out[3]: dict_keys(['args', 'file_name', 'type', 'mem', 'Injected_Location'])
Ключ args содержит информацию о восстановленном аргументе и о том, какими должны быть значения аргумента для воспроизведения уязвимости. В приведенном ниже примере восстанавливается один аргумент, и для запуска инъекции команд этот аргумент должен быть char*, содержащим "`reboot`", чтобы инициировать перезагрузку.
In [1]: result['args']
Out[1]:
[{'base': 'a1',
'type': 'int',
'value': "0x0 -> b'`reboot`\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x00'"}]