
Aufdecken von Schwachstellen in Firmware durch Concolic Analysis und Funktionsclustering.
Firmware Slap kombiniert concolische Analyse mit Funktionsclustering zur Schwachstellenerkennung und Funktionsähnlichkeit in Firmware. Firmware Slap ist als eine Reihe von Bibliotheken aufgebaut und exportiert die meisten Informationen entweder als Pickles oder JSON zur Integration mit anderen Tools.

Folien des Vortrags finden Sie hier
Firmware Slap sollte in einer virtuellen Umgebung ausgeführt werden. Es wurde mit Python3.6 getestet.
sudo apt install python3-virtualenv
virtualenv -p python3 fwslap
source fwslap/bin/activate
-- or --
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
Sie benötigen rabbitmq, docker und (radare2 oder 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 benötigt JDK 11.
sudo apt install default-jdk
java --version
Wenn Sie die Elasticsearch-Funktionen nutzen möchten, führen Sie das Skript Elasticsearch_and_kibana.sh aus
Stellen Sie sicher, dass der rabbitmq-server läuft.
# 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
Starten Sie einen Celery-Worker aus dem Projektwurzelverzeichnis:
# In a separate terminal
celery -A firmware_slap.celery_tasks worker --loglevel=info
Führen Sie in einem anderen Terminalfenster einen Schwachstellenerkennungsauftrag aus.
$ 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]:
Der obige Befehl gibt ein Objekt in der Variable result zurück. Dies ist ein Wörterbuch mit allerlei großartigen Informationen über die Schwachstelle. Es gibt drei Hauptschlüssel im Objekt: Die Funktionsargumente, den Speicher und den injizierten Ort.
In [3]: result.keys()
Out[3]: dict_keys(['args', 'file_name', 'type', 'mem', 'Injected_Location'])
Der Schlüssel args enthält Details über das wiederhergestellte Argument und welche Argumentwerte erforderlich sind, um die Schwachstelle nachzubilden. Im folgenden Beispiel wird ein Argument wiederhergestellt, und um die Befehlsinjektion auszulösen, muss dieses Argument ein char* sein, das "`reboot`" enthält, um einen Neustart auszulösen.
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'"}]