Forensic analysis - Linux Linux / Unix security 2004 ing. Petr Šik
[email protected]
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 1compromised_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)
(Domain # /mnt/cdrom/cat /proc/sys/kernel/domainame name) (Informace o hardwaru) # /mnt/cdrom/cat /proc/cpuinfo # /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 /dev/hda1
Start 100
End 100099
Blocks
Id
System
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í souboru Smazání 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
Vrstva
Postfix Funkce
d
Data Unit
ls
Vypisuje informace o vrstvě
cat
Zobrazuje obsah vrstvy
stat
Zobrazuje detaily o daném objektu ve vrstvě
find
Mapuje jiné vrstvy na vrstvu
calc
Počítá „něco“ ve vrstvě
i
Meta Data
f
File Name
fs
File System
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
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 [email protected]