Wer nach einem Einbruch den Arbeitsspeicher eines Rechners untersuchen muss, darf sich der tatkräftigen Unterstützung des Python-Framework Volatility erfreuen. In diesem Post geht es noch um Volatility 2 mittlerweile gibt es die dreier Version. Hier hat sich einiges verändert, so ist zum Beispiel das Erstellen von Profilen nicht mehr notwendig.
Vorerst muss jedoch der Arbeitsspeicher des betroffenen Systems gespeichert werden.
Um den Arbeitsspeicher zu untersuchen, brauchen wir erst einmal ein Abbild des aktuellen Arbeitsspeichers. Hier gib es verschiedene Tools unter Linux z.B.: LiMe oder Img. Diese Tools brauchen Root bzw. Administratorrechte um zu funktionieren. Bedenke auch, dass RAM heutzutage groß sein kann, hier muss natürlich genügend Speicherplatz zur Verfügung stehen. Bei Desktop Systemen sind 16 GB keine Seltenheit mehr und bei Servern kommen wir schnell an die ein bis mehrere Terabyte ran.
Auch wichtig zu beachten ist, dass wir kein Hash vom RAM machen können, da dieser sich kontinuierlich ändert (sollte logisch sein, nur so zur Info). Nach dem Erstellen eines Abbildes, ist es möglich eine Checksumme über dieses zu bilden.
Eine Methode die vielleicht nicht unerwähnt bleiben solle, ist die des DMA. Hierbei werden Schwachstellen der Hardware ausgenutzt, um an den Inhalt des Arbeitsspeicher zu gelangen, in der Vergangenheit häufig bei Thunderbold3, PCIe und USB-C.
Guter Vortrag von Ulf Frisk auf dem 34C3:
Die deutsche Übersetzung stockt ein wenig, wer des Englischen mächtig ist, sollte lieber diese gucken.
Das Tool muss selbst kompiliert werden, das kann den Zustand des Arbeitsspeichers, des zu testenden System verändern, darum sollte es extern kompiliert werden (Sofern möglich).
Herunterladen des Tools:
cd /opt
sudo git clone https://github.com/504ensicsLabs/LiME.git
Kompilieren des Tools:
cd LiMe/src
sudo make
Der Output sollte dann so ähnlich aussehen:
sudo make
make -C /lib/modules/4.15.0-88-generic/build M="/opt/LiME/src" modules
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-88-generic'
CC [M] /opt/LiME/src/tcp.o
CC [M] /opt/LiME/src/disk.o
CC [M] /opt/LiME/src/main.o
CC [M] /opt/LiME/src/hash.o
CC [M] /opt/LiME/src/deflate.o
LD [M] /opt/LiME/src/lime.o
Building modules, stage 2.
MODPOST 1 modules
CC /opt/LiME/src/lime.mod.o
LD [M] /opt/LiME/src/lime.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-88-generic'
strip --strip-unneeded lime.ko
mv lime.ko lime-4.15.0-88-generic.ko
Für das Nutzen von LiMe wird also ein Kernel Modul erstellt. Dies Modul richtet sich nach dem aktuellen Kernel der Maschine, auf dem es gebaut wurde. Das Modul läuft also nicht unter anderen Kernel Versionen.
Format ist hier raw:
sudo insmod lime-4.15.0-88-generic.ko 'path=../Linux64.mem format=raw'
Besser ist das Format lime
dies kann auch von Volatility interpretiert werden:
sudo insmod lime-4.15.0-88-generic.ko 'path=../Linux64.mem format=lime'
Das path
gibt an wo das Memory Abbild hin soll.
Ich habe das Tool noch nicht getestet, doch es soll recht gut sein.
Ein einfaches Command Line Tool unter Windows nennt sich DumpIt, mit ihm lässt sich auch der gesammte Arbeitsspeicher eines Systems abbilden.
Volatility kann als Stand-Alone Version und als Git-Version installiert werden. Unter Linux ist es zu empfehlen, die Git Version zu nehmen (Macht das Erstellen von Profilen einfacher).
Stand-Alone Versin auf der Webseite
Einfach das Git Repository klonen:
cd /opt
sudo git clone https://github.com/volatilityfoundation/volatility.git>
Hinweis, es wird distorm3 benötigt, einfach mit pip Installieren: pip2 install distorm3
Um zu verstehen, was all die Daten bedeuten, braucht Volatility einige Informationen über das System von dem das Memory Abbild stammt. Diese nennen sich dann Profile. Unter Linux müssen diese Profile selbst erstellt werden.Link zum Volatility Wiki
Unter Debian und Ubuntu wird dwarfdump
benötigt:sudo apt install dwarfdump
Erstmal den aktuellen Kernel auslesen mit: uname -r
Erstellen der modules
Datei. (Wichtig: Command im Ordner /volatility/tools/linux
ausführen)
sudo make -C /lib/modules/<Kernel Vesion>/build/ CONFIG_DEBUG_INFO=y M=$PWD modules
Es kommt ein ähnlicher Output:
make: Entering directory '/usr/src/linux-headers-4.15.0-88-generic'
CC [M] /home/sebastian/Documents/volatility/tools/linux/module.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: modpost: missing MODULE_LICENSE() in /home/sebastian/Documents/volatility/tools/linux/module.o
see include/linux/module.h for more information
CC /home/sebastian/Documents/volatility/tools/linux/module.mod.o
LD [M] /home/sebastian/Documents/volatility/tools/linux/module.ko
make: Leaving directory '/usr/src/linux-headers-4.15.0-88-generic'
Nochmal gucken, ob die module.o
Datei da ist und dann die module.dwarf
Datei erstellen.
dwarfdump -di ./module.o > module.dwarf
Zusammenfassen der module.dwarf und er /boot/System.map....
zu einer .zip Datei
sudo zip Test-Rechner.zip module.dwarf /boot/System.map-<Kernel Version>
adding: module.dwarf (deflated 91%)
adding: boot/System.map-4.15.0-88-generic (deflated 79%)
Die erstellte .zip Datei dann in das Verzeichnis: /volatility/plugins/overlays/linux
Gucken, ob das Profil von volatility erkannt wurde:
python vol.py --info | grep Linux
Volatility Foundation Volatility Framework 2.6.1
LinuxMint-Sebastian-x250x64 - A Profile for Linux Mint-Sebastian-x250 x64
LinuxAMD64PagedMemory - Linux-specific AMD 64-bit address space.
linux_aslr_shift - Automatically detect the Linux ASLR shift
linux_banner - Prints the Linux banner information
linux_yarascan - A shell in the Linux memory image
Mit dem python vol.py --info
lassen sich alle Befehle anzeigen, die
volatility kennt.
Plugins
-------
amcache - Print AmCache information
apihooks - Detect API hooks in process and kernel memory
apihooksdeep - Detect API hooks in process and kernel memory, with ssdeep for whitelisting
atoms - Print session and window station atom tables
atomscan - Pool scanner for atom tables
auditpol - Prints out the Audit Policies from HKLM\SECURITY\Policy\PolAdtEv
bigpools - Dump the big page pools using BigPagePoolScanner
bioskbd - Reads the keyboard buffer from Real Mode memory
cachedump - Dumps cached domain hashes from memory
callbacks - Print system-wide notification routines
chromecookies - Scans for and parses potential Chrome cookie data
chromedownloadchains - Scans for and parses potential Chrome download chain records
chromedownloads - Scans for and parses potential Chrome download records
chromehistory - Scans for and parses potential Chrome url history
chromesearchterms - Scans for and parses potential Chrome keyword search terms
chromevisits - Scans for and parses potential Chrome url visits data -- VERY SLOW, see -Q option
clipboard - Extract the contents of the windows clipboard
cmdline - Display process command-line arguments
cmdscan - Extract command history by scanning for _COMMAND_HISTORY
connections - Print list of open connections [Windows XP and 2003 Only]
connscan - Pool scanner for tcp connections
consoles - Extract command history by scanning for _CONSOLE_INFORMATION
crashinfo - Dump crash-dump information
Bei volatility gibt es Befehle, die sind speziell auf Linux oder Mac
Memory Abbilder spezialisiert.
Diese lassen sich mit: python vol.py --info | grep -i linux
anzeigen.
linux_apihooks - Checks for userland apihooks
linux_arp - Print the ARP table
linux_aslr_shift - Automatically detect the Linux ASLR shift
linux_banner - Prints the Linux banner information
linux_bash - Recover bash history from bash process memory
linux_bash_env - Recover a process' dynamic environment variables
linux_bash_hash - Recover bash hash table from bash process memory
linux_check_afinfo - Verifies the operation function pointers of network protocols
linux_check_creds - Checks if any processes are sharing credential structures
linux_check_evt_arm - Checks the Exception Vector Table to look for syscall table hooking
linux_check_fop - Check file operation structures for rootkit modifications
linux_check_idt - Checks if the IDT has been altered
linux_check_inline_kernel - Check for inline kernel hooks
linux_check_modules - Compares module list to sysfs info, if available
linux_check_syscall - Checks if the system call table has been altered
linux_check_syscall_arm - Checks if the system call table has been altered
linux_check_tty - Checks tty devices for hooks
linux_cpuinfo - Prints info about each active processor
linux_dentry_cache - Gather files from the dentry cache
linux_dmesg - Gather dmesg buffer
linux_dump_map - Writes selected memory mappings to disk
linux_dynamic_env - Recover a process' dynamic environment variables
linux_elfs - Find ELF binaries in process mappings
linux_enumerate_files - Lists files referenced by the filesystem cache
linux_find_file - Lists and recovers files from memory
linux_getcwd - Lists current working directory of each process
linux_hidden_modules - Carves memory to find hidden kernel modules
linux_ifconfig - Gathers active interfaces
python vol.py --file=/opt/LiME/Linux64.mem --profile=Test-Rechnerx64 linux_psaux
Mit --file
wird das Memory Abbild angegeben.
Mit --profile
wird das Profil des Rechners angegeben für Linux und Mac müssen diese erstellt werden.
Für Windows bringt volatility viele Profile mit.
Das letzte ist der Befehl, der ausgeführt werden soll. Wichtig ist, dass die Reihenfolge der Parameter eine Rolle spielt.
Grundsätzlich kann man sagen das nutzen des Tools ist nicht schwer, nur die Auswertung, der zu bekommenden Ergebnisse ist schwer.
Mit diesem Command versucht volatility zu erkennen, um was für ein Profil es sich handelt.
sudo python vol.py --file=/opt/volatility/test_memory/windows/sample001.bin imageinfo
Der Output von diesem sieht dann in etwa so aus:
Volatility Foundation Volatility Framework 2.6.1
INFO : volatility.debug : Determining profile based on KDBG search...
Suggested Profile(s) : WinXPSP2x86, WinXPSP3x86 (Instantiated with WinXPSP2x86)
AS Layer1 : IA32PagedMemory (Kernel AS)
AS Layer2 : FileAddressSpace (/opt/volatility/test_memory/windows/sample001.bin)
PAE type : No PAE
DTB : 0x39000L
KDBG : 0x8054cde0L
Number of Processors : 1
Image Type (Service Pack) : 3
KPCR for CPU 0 : 0xffdff000L
KUSER_SHARED_DATA : 0xffdf0000L
Image date and time : 2012-11-27 01:57:28 UTC+0000
Image local date and time : 2012-11-26 19:57:28 -0600
Damit können wir annehmen, dass es sich hier um ein WinXPSP2x86 handelt. Sprich ein Windows XP Service pack 2 auf einer x86 Prozessorarchitektur.
Bei volatility handelt es sich um ein Framework, dass heißt das Tool lässt sich einfach erweitern. Es müssen nur .py Dateien in
/volatility/plugins
kopiert werden.
Beispiel von volatility-plugins
Link zu Github volatility-plugins
Hier handelt es sich um eine kleine Sammlung von Plugins. Diese funktionieren leider nur unter Windows Profilen und unterstützen keine Linux Profile.
Es gibt noch viele weitere Plugins, es ist jedoch ein wenig schwer, diese zu finden. Eine gute Anlaufstelle ist des weiteren der Volatility Contest, bei dem werden plugins der letzten Zeit ausgezeichnet wurden.
Website zum Volatility Contest
Ein Überblick zu verschaffen, ob der Rechner mit einem Rootkit infiziert
ist, kann Volatility manchmal ganz hilfreich sein. Auch hierfür bietet Volatility
einige Möglichkeiten, dies zu erkennen. Der Command linux_check_idt
.
Es zeigt die Interrupt-Descriptor-Tabelle, wenn hier ein Eintrag umgeleitet (Hooked) ist, spricht einiges für ein manipuliertes System.
Test System ist ein Ubuntu 14.04 in der Server Version mit einem 4.4.0-142-generic Linux Kernel.
Auf diesem wurde dieses Rootkit installiert: Test Rootkit von Github
Danach wurde ein Memory Abbild mit LiMe erstellt sowie das entsprechende Profil.
Mit linux_hidden_modules
können wir jetzt nach versteckten Kernel Modulen suchen:
vol -f test_memory/linux_rootkit.mem --profile=Linuxubuntu14x64 linux_hidden_modules
In diesem Fall fällt das rootkit natürlich sehr schnell auf:
Volatility Foundation Volatility Framework 2.6.1
Offset (V) Name
------------------ ----
0xffffffffc00ad040 rootkit
Das Erkennen von Windows Maleware ist nochmal ein wenig aufwendiger, da man sich sehr gut, mit der Internen Struktur von Windows auskennen muss.
Stuxnet ist ein Computerwurm, der mutmaßlich von der NSA in Zusammenarbeit mit Israel geschaffen wurde, um das Iranisches Atomprogramm zu schwächen. Dieser benutze mehrere Schwachstellen in Windows und er ist auf das Befallen von Steuerungssysteme von Industrieanlagen der Firmen Siemens und Simatic S7 ausgelegt. Eine tiefgehende Analyse würde hier jedoch zu weit führen, hier nur kurz gezeigt, wie dieser erkannt werden kann.
Um raus zu kriegen, um welches OS, es sich handelt, benutzen wir
imageinfo
: vol -f test_memory/stuxnet.vmem imageinfo
Wir wissen jetzt, dass es sich um Windows XP Service Pack 2 auf einem x86 Prozessor handelt, dies wird in der späteren Analyse noch wichtig sein.
Mit dem Befehl pstree
lassen wir uns alle laufenden Prozesse anzeigen.
In diesem Fall sieht der auszuführende Command so aus:
vol -f test_memory/stuxnet.vmem --profile=WinXPSP2x86 pstree
Der Output sieht dann so aus:
Volatility Foundation Volatility Framework 2.6.1
Name Pid PPid Thds Hnds Time
-------------------------------------------------- ------ ------ ------ ------ ----
0x823c8830:System 4 0 59 403 1970-01-01 00:00:00 UTC+0000
. 0x820df020:smss.exe 376 4 3 19 2010-10-29 17:08:53 UTC+0000
.. 0x821a2da0:csrss.exe 600 376 11 395 2010-10-29 17:08:54 UTC+0000
.. 0x81da5650:winlogon.exe 624 376 19 570 2010-10-29 17:08:54 UTC+0000
... 0x82073020:services.exe 668 624 21 431 2010-10-29 17:08:54 UTC+0000
.... 0x81fe52d0:vmtoolsd.exe 1664 668 5 284 2010-10-29 17:09:05 UTC+0000
..... 0x81c0cda0:cmd.exe 968 1664 0 ------ 2011-06-03 04:31:35 UTC+0000
...... 0x81f14938:ipconfig.exe 304 968 0 ------ 2011-06-03 04:31:35 UTC+0000
.... 0x822843e8:svchost.exe 1032 668 61 1169 2010-10-29 17:08:55 UTC+0000
..... 0x822b9a10:wuauclt.exe 976 1032 3 133 2010-10-29 17:12:03 UTC+0000
..... 0x820ecc10:wscntfy.exe 2040 1032 1 28 2010-10-29 17:11:49 UTC+0000
.... 0x81e61da0:svchost.exe 940 668 13 312 2010-10-29 17:08:55 UTC+0000
.... 0x81db8da0:svchost.exe 856 668 17 193 2010-10-29 17:08:55 UTC+0000
..... 0x81fa5390:wmiprvse.exe 1872 856 5 134 2011-06-03 04:25:58 UTC+0000
.... 0x821a0568:VMUpgradeHelper 1816 668 3 96 2010-10-29 17:09:08 UTC+0000
.... 0x81fee8b0:spoolsv.exe 1412 668 10 118 2010-10-29 17:08:56 UTC+0000
.... 0x81ff7020:svchost.exe 1200 668 14 197 2010-10-29 17:08:55 UTC+0000
.... 0x81c47c00:lsass.exe 1928 668 4 65 2011-06-03 04:26:55 UTC+0000
.... 0x81e18b28:svchost.exe 1080 668 5 80 2010-10-29 17:08:55 UTC+0000
.... 0x8205ada0:alg.exe 188 668 6 107 2010-10-29 17:09:09 UTC+0000
.... 0x823315d8:vmacthlp.exe 844 668 1 25 2010-10-29 17:08:55 UTC+0000
.... 0x81e0eda0:jqs.exe 1580 668 5 148 2010-10-29 17:09:05 UTC+0000
.... 0x81c498c8:lsass.exe 868 668 2 23 2011-06-03 04:26:55 UTC+0000
.... 0x82279998:imapi.exe 756 668 4 116 2010-10-29 17:11:54 UTC+0000
... 0x81e70020:lsass.exe 680 624 19 342 2010-10-29 17:08:54 UTC+0000
0x820ec7e8:explorer.exe 1196 1728 16 582 2010-10-29 17:11:49 UTC+0000
. 0x81c543a0:Procmon.exe 660 1196 13 189 2011-06-03 04:25:56 UTC+0000
. 0x81e86978:TSVNCache.exe 324 1196 7 54 2010-10-29 17:11:49 UTC+0000
. 0x81e6b660:VMwareUser.exe 1356 1196 9 251 2010-10-29 17:11:50 UTC+0000
. 0x8210d478:jusched.exe 1712 1196 1 26 2010-10-29 17:11:50 UTC+0000
. 0x81fc5da0:VMwareTray.exe 1912 1196 1 50 2010-10-29 17:11:50 UTC+0000
Es fällt auf, dass die lsass.exe
dreimal vorhanden ist, mit den Pids 680, 868 und 1928. Das lsass
steht für Local Security Authority
Subsystem Service diese Prozess ist für Authentifizierung von Nutzern in Windows zuständig. Er sorgt dafür, die Gültigkeit des Benutzeraccounts
an dem Windows zu prüfen. Er darf nur einmal ausgeführt werden. Daran merken wir, dass hier was nicht stimmt. Nicht selten versuchen Schadcode
Hersteller, sich hinter interne Prozesse zu verstecken. Das macht das
Erkennen selbst für erfahrene Nutzer schwer und kann gleichzeitig für
Verunsicherungen bei unerfahrenen Nutzern sorgen.
Wichtig ist es jetzt, zu wissen, dass lass
ein parent process (dt.
Elternprozess) mit dem Namen winlogon
hat, dies gilt für Windows XP.
Ab Windows Vista und folgende heißt dieser Prozess wininit
.
Zur Übersicht sind die betroffenen Prozesse nochmal dargestellt:
System(4)
↳smss(376)
↳winlogon(624)
↳lass(680)
↳services(668)
↳lsass(868)
↳lsass(1928)
Der lass
Prozess mit der Pid 680 ist, wie erwartet ein Kindprozess von winlogon
, dies sieht so aus, als wäre es ein normaler Prozess vom
Windows aus. Die anderen beide Prozesse mit den Pids 868 und 1928 sind keine Kindprozesse von winlogon
sondern von services
, hier ist also was faul.
Cooles Feature von Volatility ist das Executables von Prozessen
exportiert werden kann, dies geht mit procdump
.
vol -f test_memory/stuxnet.vmem --profile=WinXPSP2x86 procdump -p 668,1928 --dump-dir=test_memory/program/
Diese Dateien können dann auch noch mal auf VirusTotal hochgeladen werden. VirusTotal ist ein Dienst bei dem Files hoch geladen werden können und diese dann durch mehrer Anti-Viren scanns durchläuft.