Forensic analysis - Linux Linux / Unix security 2004 ing. Petr Šik petr.sik@ebsc.cz
Plán Úvod Příprava Postup po rozpoznání průniku Kroky na živém systému Základní analýza získaných dat Úvod do pokročilejší analýzy získaných dat Závěr
Úvod - Co je forensic analysis - Cíle forensic analysis - Linux a forensic analysis
Co je forensic analysis Shromáždění a analýza dat za účelem objevení takových informací a souvislostí které jsou přijatelné jako důkazy pro soud. (pitva) Shromáždění a analýza dat za účelem objevení informací o tom, co se dělo/děje v systému.
Cíle forensic analysis What / Where / When / Who / How Co se teď děje v systému Byly napadeny i jiné systémy? Předcházení podobným případům Zabezpečení slabých míst v systému.
Linux a forensic analysis Výhody: Mnoho nástrojů opensource, free Flexibilní prostředí Mnoho podporovaných souborových systémů Nevýhody: Free nástroje složitější než komerční, chybí technická podpora Snadno lze zničit důležitá data - důkazy Flexibilní prostředí často mnoho cest, jak něco provést těžko se hledá ta nejlepší nejsou standardizované postupy
Příprava - Tým, procedury,.. - Nástroje - Hotové nástroje
Tým, procedury Sestavení Incident Response Týmu Příprava procedur příprava scénářů úrovně nebezpečnosti
Nástroje Pokud se ke kompromitovanému systému dostaneme dříve než byl vypnut, můžeme se pokusit posbírat cenné informace, které jsou jinak ztraceny např. info o přihlášených uživatelích, běžících procesech, otevřených síťových spojeních, otevřených souborech,... Někdy je to jediná možnost, jak odhalit rootkit rootkity které nemodifikují žádné soubory, existují jen v paměti LKM, přímý zápis do paměti jádra.
Nástroje Dvě nejdůležitější zásady pro práci na živém systému: 1. Věřit co nejméně systému 2. Co nejméně modifikovat stav systému Za tímto účelem potřebujeme důvěryhodné programy nepoužíváme ty z napadaného systému mohou být modifikovány. Vytvoříme kolekci užitečných programů kompilovaných a staticky linkovaných (nespoléhají na sdílené knihovny - gcc -static) na důvěryhodném systému.
Nástroje Běžné: bash, netstat, arp, last, w, ifconfig, stat, find, grep, ls, md5sum, mount, lsmod, rmmod, dd, lsof, date, dmesg, route... Speciální: pcat, grave-robber http://www.porcupine.org/forensics/tct Hunter.o http://www.phrack.org/phrack/61/p61-0x03 - Linenoise.txt nc - http://www.atstake.com/research/tools/network_utilities / nc110.tgz fls - http://www.sleuthkit.org/ chkrootkit - http://www.chkrootkit.org
Hotové nástroje F.I.R.E - http://fire.dmzs.com Penguin Sleuth Kit (Knoppix + nástroje pro forensic analysis)...
Postup po rozpoznání průniku - Kroky na živém systému - Základní analýza získaných dat - Úvod do pokročilejší analýzy získaných dat
Kroky na živém systému Byl rozpoznán průnik (alarm - IDS, firewall, antivir; analýza logů, výpadek výkonnosti, info z vnitřku/vnějšku) Předpokládáme, že systém nebyl vypnut/restartován
Postup - 1 První kontroverzní krok okamžité odpojení od aktivní sítě zabrání útočníkovi rozpoznat, že byl odhalen, a začít zametat stopy Nebezpečí - deadman switch rozpozná odpojení a provede vyčištění Alternativa - neodpojovat, začít sledovat komunikaci s analyzovaným strojem
Postup - 2 Připojíme naše připravené médium - nedůvěryhodný příkaz : # /bin/mount -n /mnt/cdrom Jaký má vliv na systém? # strace /bin/mount /mnt/cdrom Změní atime u následujících souborů: /etc/ld.so.cache, / lib/tls/libc.so.6, /usr/lib/locale/locale-archive, / etc/fstab, /dev/cdrom, /bin/mount Pokud nepoužijeme přepínač n, změní ještě atime, mtime, ctime u /etc/mtab
Postup - 2 Co jsou atime, mtime, ctime souborů? atime (čas posledního přístupu) mtime (čas poslední modifikace) ctime (čas poslední změny meta-informací) Příkaz: ls lu (atime) l (mtime) lc (ctime)
Postup - 3 Spustíme shell z našeho cd # mnt/cdrom/bash -rcfile /mnt/cdrom/etc/bashrc -noprofile -i Sbíráme dočasné informace všechna data musíme ukládat jinam, než na analyzovaný disk mohlo by dojít k přepsání cenných ( smazaných ) dat, která později obnovíme. Můžeme je ukládat například na pásku nebo posílat na vzdálený počítač k tomu lze využít utilita netcat. Na vzdáleném počítači spočítáme ke všem datům jejich md5 sumu pomocí příkazu md5sum.
Postup - 3 Použití netcat 1. Na vzdáleném poč. 192.168.1.100 spustíme jako server: (remote) # nc -l -p 5555 > xxx_comp 2. Na lokálním analyzovaném spustíme daný příkaz a jeho výstup přesměrujeme do netcat v roli klienta (compromised) # /mnt/cdrom/xxx /mnt/cdrom/nc 192.168.1.100 5555 -w 3 3. Na vzdáleném poč. spočítáme md5 sumu (remote) # md5sum xxx_comp > xxx_comp.md5 Tj. za všemi příkazy, které dále uvidíte, si představte /mnt/cdrom/nc 192.168.1.100 5555 -w 3
Postup - 3 Výstup každého příkazu posíláme výše popsaným způsobem na vzdálený stroj Aktuální čas v UTC formátu (Coordinated Universal Time) # /mnt/cdrom/date -u /mnt/cdrom/nc... Identifikujeme používané partitions # /mnt/cdrom/mount například jediná /dev/hda1 ext2 Sesbíráme meta-informace o souborech z daných partitions # /mnt/cdrom/fls f linux-ext2 r m / /dev/hda1 Jediný přístupový čas který změní je atime u /dev/hda1 Obsah různých cache tabulek krátkodobá data Tabulka MAC adres: # /mnt/cdrom/arp -an Routovací tabulka jádra: # /mnt/cdrom/route -Cn
Postup - 3 Informace o přihlášených uživatelích a o historii # /mnt/cdrom/w (změní acces time u /var/log/utmp ) # /mnt/cdrom/last (změní acces time u /var/log/wtmp a /var/log/btmp ) Informace o síťových zařízeních # /mnt/cdrom/ifconfig -a Informace o síťových spojeních a otevřených TCP/UDP portech: # /mnt/cdrom/netstat an (Změní access time u /etc/services ) (tato data můžeme získat i /proc filesystemu - /proc/net/netstat, / proc/net/tcp, /proc/net/udp) Dále je vhodné provést oscanování analyzovaného stroje ze vzdáleného počítače například nástrojem nmap (# nmap ss p 1- compromised_ip) a porovnat získaná data pokud se budou lišit, budeme vědět, že je v chodu rootkit, který skrývá tyto informace (např. informace o otevřeném portu).
Postup - 3 Obraz fyzické paměti RAM použijeme soubor /proc/kcore, ve kterém je paměť reprezentována ve formátu ELF core je možné ji debuggovat pomocí gdb. (velikost souboru je rovna velikosti RAM + 4 KB) # /mnt/cdrom/dd if=/proc/kcore /mnt/cdrom/nc... Seznam modulů nahraných v jádře # /mnt/cdrom/cat /proc/modules Některé pokročilejší moduly nemusí být takto objeveny - použijeme LKM hunter.o kontroluje řetězec modulů nahraných do jádra, vytváří soubor /proc/showmodules: # /mnt/cdrom/cat /proc/showmodules Srovnáme výstup s předcházejícím, pozor i na velikosti modulů.
Postup - 3 Zkopírujeme tabulku symbolů exportovanou jádrem dostupných modulům obsahuje např. adresu tabulky systémových volání, adresy systémových volání a mnoho dalších symbolů: # /mnt/cdrom/cat /proc/ksyms Obdobná data by měla být i v souboru / boot/system.map tvoří se při kompilaci jádra.
Postup - 3 Informace o procesech: # /mnt/cdrom/ps -aufxwww Informace o file deskriptorech otevřených procesy: # /mnt/cdrom/lsof -n -P -l Pokud je některý z procesů podezřelý, zkopírujeme ho. podezřelý proces: má divné jméno naslouchá na netypickém portu soubor, z něhož byl spuštěn, je smazán má otevřený smazaný soubor...
Postup - 3 Informace o procesu lze najít v adresáři /proc/process_pid. Pokud byl soubor, z něhož byl proces spuštěn, smazán, můžeme ho získat ze souboru exe, v adresáři fd nalezneme všechny procesem otevřené soubory (i smazané ), atd. příklad - výstup z lsof: suspicious 3333 root 20w REG 8,1 253 46934 / var/log/httpd/access_log (deleted) podíváme se do adresáře /proc/3333/fd: # /mnt/cdrom/ls -la /proc/3333/fd/ l-wx------ 1 root root 64 Aug 10 21:03 12 -> / var/log/httpd/access_log (deleted) Soubor otevřený pod deskriptorem jedna je smazán, dokud ho však proces nezavře, fyzicky stále existuje a přes deskriptor 1 se k němu dostaneme: # /mnt/cdrom/cat /proc/3333/fd/1
Postup - 3 Kompletní paměť procesu zkopírujeme pomocí utility pcat: # /mnt/cdrom/pcat process_id Pokusíme se odhalit rootkit nástrojem chkrootkit: # /mnt/cdrom/chkrootkit p /mnt/cdrom/ Nakonec posbíráme některé další užitečné informace z / proc file systému: # /mnt/cdrom/cat /proc/version (verze OS) # /mnt/cdrom/cat /proc/sys/kernel/name (Host name) # /mnt/cdrom/cat /proc/sys/kernel/domainame (Domain name) # /mnt/cdrom/cat /proc/cpuinfo (Informace o hardwaru) # /mnt/cdrom/cat /proc/swaps (swap oblasti) # mnt/cdrom/cat /proc/partitions (lokální file systémy) # /mnt/cdrom/cat /proc/self/mounts (Přimountované file systémy) # mnt/cdrom/cat /proc/uptime (uptime)
Postup - 3 Nyní můžeme analýzu na živém systému ukončit, zjistíme ještě aktuální čas: # /mnt/cdrom/date -u a poté systém vypneme uděláme to natvrdo vypínačem a ne příkazem shutdown, abychom se vyhnuli nebezpečí deadman switche. Je otázka, zda před vypnutím neudělat obraz disku většinou se však doporučuje udělat ho až po vypnutí. Většinu zde prezentovaných operací můžeme udělat pomocí nástroje grave-robber z TCT umožňuje posbírat mnoho informací (defaultně až moc) viz. man grave-robber
Postup - 4 Po restartu nabootujeme bezpečný systém z jiného disku, live distribuci z CD (např. FIRE, Penguin Sleuth Kit), apod. Je však třeba, aby automaticky nepřipojovala nalezené partitiony. Prohlédneme si tabulku rozdělení disku: # fdisk lu /dev/hda Pomocí dd provedeme zálohu partitions (obyčejná záloha pomocí tar není vyhovující potřebujeme identický obraz obsahující i smazaná data). (remote) # nc l p 5555 > /image.hda1.dd (local) # dd if=/dev/hda1 nc 192.168.1.100 5555 w 3 Je potřeba zkontrolovat md5sumy na lokálním a vzdáleném stroji: (remote) # md5sum image.hda1.dd > image.hda1.dd.md5 (local) # md5sum /dev/hda1
Postup - 4 Pokud jsou na disku data mimo partitions, měly bychom zrcadlit celý disk /dev/hda a rozdělení do oblastí provést až později. (local) # dd if=/dev/hda... Na vzdáleném stroji máme obraz celého disku image.hda.dd,prohlédneme si tabulku rozdělení: (remote) # fdisk lu image.hda.dd Disk /dev/hda: 0 heads, 0 sectors, 0 cylinders Units = sectors of 1 * 512 bytes Device Boot Start End Blocks Id System /dev/hda1 100 100099 50000 83 Linux... Rozměr partitiony hda1 je 100099-100+1=100000, začíná na offsetu 100 při velikosti bloku 512 B, opět použijeme dd: (remote) # dd if=image.hda.dd of=image.hda1.dd bs=512 skip=100 count=100000
Základní analýza získaných dat Na vzdáleném stroji máme posbíraná data z minulého kroku Originální napadený disk uschováme, veškerou další analýzu provádíme jen na kopiích Části základní analýzy Porovnání se správným stavem Kontrola logů Konfigurační soubory strings & grep
Připojíme obrazy partitions analyzovaného systému využijeme loopback zařízení: # mount -o ro,loop,noexec image.hda1.dd /mnt/hda1 Některé žurnálové filesystémy ext3, Reiser FS updatují žurnál i když jsou připojeny readonly. Porovnání se správným stavem Tripwire, porovnání s originálním systémem, s instalačním médiem NIST National Software Reference Library (http://www.nsrl.nist.gov) RPM -V -a http://www.redhat.com/mirrors.html Informace o velikosti, suma MD5, právech, typu, majiteli a skupině každého souboru sfpc (Solaris Fingerprint Database Companion)
Kontrola logů /var/log/*,.bash_history, Apache, bind, Firewally, Systémy IDS hledáme například řetězce failed login, failed password, error, access deny, can t open, core dump succeedd, session opened, accepted password Konfigurační soubory /etc/* inetd.conf nebo xinetd.conf hosts.allow/hosts.deny ftpaccess/ftphosts/ftpusers passwd/shadow rc*.d/* ssh/ hosts.equiv /users/.rhosts Iptables
strings & grep strings z daného vstupu vypisuje pouze tisknutelné znaky implicitně řetězce alespoň 4 znaků Získáme tisknutelné znaky z obrazu RAM, pomocí přepínače t d získáme dekadický offset řetězce v souboru # strings -t d kcore > kcore_strings Pokusíme se vyhledat zajímavé řetězce: # grep "root@" kcore_strings # grep "]#" kcore_strings nalezeno: 12135127 [root@victim]# 32782219 ]#]# Podíváme se do souboru na nalezené offsety: # less kcore_strings /12135127 12135127 [root@victim]# 12135253 /usr/bin/perl install_rootkit.pl...
Dále hledáme například: soubory a adresáře: # grep -e "\/proc\/" -e "\/bin\/" kcore_strings # grep -e "rm -" kcore_strings # grep -e ".tgz" kcore_strings IP adresy a doménová jména : # grep -e "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" kcore_strings # grep -e "\.victim\.com" kcore_strings Obdobně prozkoumáme obraz swap oblasti, případně obraz celého disku - image.hda.dd.strings výhoda projde se vše i smazané soubory (nealokovaná data) a slack space (prostor mezi koncem souboru a koncem posledního bloku, který zabírá)
Nástrojem strings můžeme prozkoumat i nalezené neznámé binární soubory rychlá, bezpečná a často účinná analýza: # file suspicious suspicious: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped # strings -a suspicious... connection refused (server shut down) from %s %s FTP server shut down -- please try again later. /bin/ls -la lsplain /bin/ls greeting brief %s FTP server (%s) ready. %s FTP server ready. FTP server ready. FTP LOGIN REFUSED (already logged in as %s) FROM %s, %s...
Úvod do pokročilejší analýzy získaných dat Popis ext2, ext3 file systémů Analýza file systému
Vsuvka EXT2, EXT3 - Partition
Vsuvka EXT2, EXT3 - Inode metadata vlastník, skupina, velikost, práva, MAC, delete time, počet hardlinků,..
Vsuvka EXT2, EXT3 - Adresář 4B 2B 1B 1B zaokrouhleno na násobek 4B
Vsuvka EXT2, EXT3 mazání Smazání souboru souboru délka předchozího záznamu v adresáři se zvětší o délku smazaného v bitové mapě se inode a datové bloky označí jako volné, nastaví se delete time Tj. zůstane zachováno: info o názvu a čísle inodu v adresáři obsah datových bloků, metainformace v inodu (ext3 - v inodu se maže informace o číslech datových bloků) Nemusí být vždy pravda záleží na patches bezpečné mazání
Analýza file systému Nástroj Sleuth Kit -http://www.sleuthkit.org/ soubor command line nástrojů pro analýzu file systému založen na the coroner s toolkitu umí pracovat s obrazy jednotlivých partitions, ne celého disku podporované file systémy: EXT2, EXT3, NTFS, FAT, FFS bohužel chybí podpora: Reiser FS, JFS, XFS
Sleuth Kit 4 vrstvy vrstva souborového systému - File System souhrnné informace o file systému (info ze superbloku) vrstva jmen souborů - File Name hledání souborů, výpis názvů souborů vrstva dat - Data Unit umožňuje přistupovat k obsahu (datovým blokům) souborů vrstva meta-dat (inode) - Meta Data meta informace o souborech - inody
Sleuth Kit - příkazy Prefix d Vrstva Data Unit Postfix ls Funkce Vypisuje informace o vrstvě i f Meta Data File Name cat stat find Zobrazuje obsah vrstvy Zobrazuje detaily o daném objektu ve vrstvě Mapuje jiné vrstvy na vrstvu fs File System calc Počítá něco ve vrstvě 11 základních příkazů Data Unit: dls, dcat, dstat, dcalc Meta Data: ils, icat, istat, ifind File Name: fls, ffind File System: fsstat + některé další mactime, sorter, file...
Sleuth Kit příklad použití příkazu z vrstvy souborového systému fsstat # fsstat hda1.dd FILE SYSTEM INFORMATION -------------------------------------------- File System Type: EXT2FS Volume Name: Last Mount: Thu Feb 13 02:33:02 2003... META-DATA INFORMATION -------------------------------------------- Inode Range: 1 12880...
Postup 1 Sesbíráme informace o změnách MAC časů souborů existujících i některých smazaných - příkaz fls už jsme ho provedli na začátku sběru dat na živém systému MAC časy nejsou změněny - změnil se jen Access time u zařízení /dev/hda1 pokud bychom to neudělali, posbíráme je alespoň z obrazů partitions # fls -f linux-ext2 -r -m / hda1.dd > body Sesbíráme informace o změnách MAC časů nealokovaných metadat (inodů) - příkaz ils Na konec souboru z předchozího příkazu # ils -f linux-ext2 -m hda1.dd >> body
Postup 2 Naformátujeme získaná data příkaz mactime zadáme-li cestu k souborům passwd a group z analyzovaného systému, jsou numerické hodnoty UID a GID nahrazeny jmény # mactime -b body -p mnt/hda1/etc/passwd -g mnt/hda1/etc/group 3/01/2002 > hda1.tl.03.01.2002 # cat hda1.tl.03.01.2002 Wed Mar 20 2002 16:56:12 1002..c -/-rwxrwxr-x andy dbadmin 127 /tmp/helpfile (deleted) 1002..c -rwxrwxr-x andy dbadmin 127 <linux.dd-dead-127> Fri Aug 23 2002 16:56:12 11.a. l/-rw-r--r-- root root 34689 /tmp/file1 (deleted-realloc) 11.a. -/-rw-r--r-- root root 34689 /etc/sysconfig/desktop 1259.a. -/-rwxr-xr-x root root 109834 /usr/man/.ci/scan/x/ibind.sh 4096.a. d/drwxr-xr-x root root 109831 /usr/man/.ci/scan/x (deleted) 1986.a. -/-rwxr-xr-x root root 109812 /usr/man/.ci/install-sshd (deleted) Snažíme se najít podezřelé soubory, změny v adresářích, kde by nastávat neměly, atd... Vždy je zobrazena jen POSLEDNÍ změna daného času
Postup 3 Pokud jsme objevili smazané podezřelé soubory (či jen inody), můžeme se (nejsou-li realokované) pokusit obnovit obsah: # istat -f linux-ext2 hda1.dd 109812 uid / gid: 0 / 0 mode: -rwxr-xr-x size: 1986 num of links: 0 Inode Times: Accessed: Fri Aug 23 2002 16:56:12 File Modified: Fri Aug 23 2002 11:23:05 Inode Modified: Fri Aug 23 2002 18:38:23 Deleted: Fri Aug 23 2002 18:38:23 Direct Blocks: 8961 8962... # icat -f linux-ext2 hda1.dd 109812 less... gunzip ssh-1.2.27* tar -xvf ssh-1.2.27* cd ssh* make install
Postup 3 Pokud chceme obnovit obsah smazaného adresáře, je potřeba u istat přidat přepínač b (při smazání adresáře je velikost nastavena na 0 nezobrazí se datové bloky) # istat -b 2 -f linux-ext2 hda1.dd 109831 inode: 109831... mode: drwxr-xr-x size: 0 num of links: 0... Direct Blocks: 145354 0 Obsah adresáře je v datovém bloku 145354 # dcat -f linux-ext2 hda1.dd 145354 > 109831.content
GUI pro Sleuth Kit - Autopsy
Závěr Zde popsanými technikami budete schopni vykonat poměrně účinnou analýzu Co jste se nedozvěděli: Pokročilá analýza živého systému Pokročilá analýza souborového systému Získávání informací z nealokovaných dat Síťová analýza Reverse engineering binárních souborů Popis mnoha užitečných nástrojů Metody obrany před forensic analysis...
Zdroje www.porcupine.org/forensic www.cerias.purdue.edu/homes/carrier/forensic www.sleuthkit.org www.honeynet.org www.securityfocus.com www.blackhat.com www.staff.washington.edu/dittrich/ Understanding the Linux Kernel, 2nd Edition
Děkuji za pozornost petr.sik@ebsc.cz