Začínáme bezpečně s FreeBSD (3)

29. 6. 2004
Doba čtení: 10 minut

Sdílet

Bezpečnost unixových systémů stojí mimo jiné hlavně na přístupových právech. Dnes tedy povinně projdeme výkladem tradičních unixových. Rovněž si nastíníme pár triků, kterých při špatně nastavených právech útočníci využívají k udržení přístupu do systému.

Základy přístupových práv

Přístupová práva jsou základem bezpečnosti. Proto jeden z prvních kroků, který by útočník na systému podnikl, jestliže by se dostal dovnitř (jako normální uživatel), by bylo zjištění přístupových práv k důležitým souborům. Tedy např. souborům v adresáři /root, konf. souborům v /etc, logům ve /var/log nebo programům /usr. V případě špatně nastavených přístupových práv může útočník změnit, smazat či pozměnit systémová nastavení, nahrát pozměněné binárky (programy; tzv. trojany či backdoory) atd.

Klasická unixová přístupová práva, která unixové systémy podporují napříč různými souborovými systémy (FreeBSD na UFS, GNU/Linux například EXT3, Reiserfs atd.) se označují UGO – UserGroupOther). Přístupová práva jsou zaznamenána v souborovém systému v tzv. i-node, něco jako hlavička. (Nebudeme zacházet do podrobností.) Tento i-node obsahuje jméno, délku, čas vzniku a modifikace souboru, přístupová práva a další. Přístupová práva se dělí na tři položky: vlastníka ( u), skupinu ( g) a ostatní ( o). Vlastník souboru je ten uživatel, který soubor vytvořil nebo kterému jej superuživatel přiřadil. Skupina je označení skupiny, ke které uživatel při vytváření příslušel nebo na kterou bylo změněno. Kategorie ostatní udává, jak se souborem mohou nakládat ostatní. Vlastnictví souboru může měnit pouze superuživatel. Vlastník souboru může změnit skupinu, do které objekt náleží, pouze na skupinu, které je sám členem. Superuživatel opět může všechno. Informace o přístupových právech jsou tedy uložena v pořadí UGO, u  – vlastník, g  – skupina, o  – ostatní.

Přístupová práva pro objekt se vypisují pomocí příkazu ls -l, kterým lze získat podrobné informace o objektech. Více  man ls.

srot# ls -l
total 12
-rw-r--r-- 2 root wheel 802 Jun 1 01:00 .cshrc
-rw------- 1 root wheel 2998 Jun 8 03:02 .history
-rw-r--r-- 1 root wheel 142 Oct 27 2003 .klogin
-rw-r--r-- 1 root wheel 297 Oct 27 2003 .login
-rw-r--r-- 2 root wheel 251 Oct 27 2003 .profile 

Výstup se skládá z těchto polí: přístupová práva, počet odkazů, UID vlastníka, GID skupiny, velikost (v bytech), datum poslední změny a jména. Pole pro přístupová práva se dále dělí na čtyři části. V případě souboru .cshrc to tedy je:

Tabulka č. 572
 – rw- r– r–
typ souboru vlastník skupina ostatní

Typem souboru může být adresář ( d), roura ( p), odkaz ( l), zařízení ( c), socket ( s), blokový soubor ( b) a samostatná pomlčka ( -) pro klasický soubor. Za typem souboru jsou již tři trojice znaků definující přístupová práva pro vlastníka, skupinu a ostatní. Řetězce pro přístupová práva se skládají ze čtení ( r  – Read), zápisu ( w  – Write) a spouštění ( x  –eXecute). Právo číst soubor znamená prohlédnout si kopii souboru, v případě adresáře (d), tzn. vypsat jeho obsah. Zápis umožňuje soubor měnit, přepsat, ale i smazat. Spouštění označuje možnost spustit soubor jako program. V případě adresáře tzn. jej spustit, tj. vstoupit do něj.

Práva, neboli file modes, jsou definována již při vzniku souboru nebo mohou být změněna pomocí příkazu chmod (change mode). Definovat modes jde jednotlivě (pro UGO) nebo lze použít zástupný symbol a (all) pro celou trojici. Práva lze měnit pomocí znaků + (přidává práva), - (odebírá práva) nebo = (nastavuje práva/odstraňuje již definovaná). Příklad na souboru test:

srot# ls -l test
-rw-r--r-- 1 root wheel 0 Jun 15 03:27 test 

Pro příklad chceme souboru odebrat všechna práva.

srot# chmod ugo-rwx test
srot# ls -l test
---------- 1 root wheel 0 Jun 15 03:27 test 

Můžete si zkusit i variace výše uvedeného příkazu: chmod a-rwx, chmod a=. Dále nastavíme, aby všichni mohli číst a zapisovat.

srot# chmod ugo=rw test
srot# ls -l test
-rw-rw-rw- 1 root wheel 0 Jun 15 03:27 test 

Skupině a ostatním odebereme možnost zapisovat.

srot# ls -l test
-rw-r--r-- 1 root wheel 0 Jun 15 03:27 test 

Nebo by to mohl být skript a chtěli bychom jej pod vlastníkem spouštět.

srot# chmod u+x test
srot# ls -l test
-rwxr--r-- 1 root wheel 0 Jun 15 03:27 test 

Jednoduché, že? Práva jdou nastavit i číselně. Jedná se o tříčíselnou hodnotu v osmičkové soustavě. Jednoduššeji to snad vysvětlí následující tabulka:

Tabulka č. 573
symbolický zápis Binární Oktalový
 — 000 0
 –x 001 1
-w- 010 2
-wx 011 3
r– 100 4
r-x 101 5
rw- 110 6
rwx 111 7

V případě, že chceme, aby náš příkladový soubor test měl následující práva -rwxr-x---, tak nám tabulka napoví, že příkaz bude:

srot# chmod 750 test
srot# ls -l test
-rwxr-x--- 1 root wheel 0 Jun 15 03:27 test 

Jestliže hodláte změnit vlastníka objektu, použijte příkaz chown (change owner). Jestliže hodláte objekt přiřadit k jiné skupině, použijte chgrp (change group).

A jaká jsou defaultní práva při vytvoření nového souboru/adresáře? Pamatujete si na položku umask při konfigurování /etc/login.conf? Práva pro nově vytvořené soubory/adresáře se definují právě hodnotou umask. Hodnota umask se odečítá od přístupového práva 666 pro soubor a 777 pro adresář. Tj. jestliže je umask 022, budou přístupová práva souboru644 :) (Příkazem touch můžeme vytvářit prázdný soubor.)

srot# umask 022
srot# touch test
srot# ls -l test
-rw-r--r-- 1 root wheel 0 Jun 8 02:34 test 

Umask jsme tedy uživatelům nastavili v login.conf. Další nastavení umask může být v souborech /etc/csh.* a ~/.cshrc pro csh a tcsh shelly, nebo /etc/profile pro sh shell a bash shell, resp. ~/.profile či ~/.bashrc. Umask jde také nastavit dočasně pomocí příkazu  umask.

Dalšími atributy, které mohou být přiřazeny k souboru, jsou SUID, SGID a SBIT. Co jsou tyto SUID a SGID? Jednoduše, po spuštění SUID programu poběží jeho proces pod právy vlastníka. V případě SGID je to obdobné, proces poběží pod právy skupiny.

SUID/SGID byty se přidávají pomocí chmod +s, resp. chmod -s. Číselné nastavení:

Tabulka č. 574
Právo Binární Oktalový
StickyBit 001 1
SGIDBit 010 2
SUIDBit 100 4

Příklady modifikace SUID a SGID programů:

srot# ls -l /usr/bin/su
-r-sr-xr-x 1 root wheel 8200 Oct 27 2003 /usr/bin/su
srot# chmod u-s /usr/bin/su
srot# ls -l /usr/bin/su
-r-xr-xr-x 1 root wheel 8200 Oct 27 2003 /usr/bin/su
srot# chmod 4555 /usr/bin/su
srot# ls -l /usr/bin/su
-r-sr-xr-x 1 root wheel 8200 Oct 27 2003 /usr/bin/su 
srot# ls -l /usr/bin/cu
-r-sr-sr-x 1 uucp dialer 123160 Oct 27 2003 /usr/bin/cu
srot# chmod g-s /usr/bin/cu
srot# ls -l /usr/bin/cu
-r-sr-xr-x 1 uucp dialer 123160 Oct 27 2003 /usr/bin/cu
srot# chmod 6555 /usr/bin/cu
srot# ls -l /usr/bin/cu
-r-sr-sr-x 1 uucp dialer 123160 Oct 27 2003 /usr/bin/cu 

Lokalizovat případné SUID/SGID programy můžeme tedy následovně (Fajn stránka, která vysvětluje používání příkazu find, je zde.):

srot# find / \( -perm -04000 -o -perm -02000 \) -ls
211201 244 -r-sr-sr-x 1 uucp dialer 123160 Oct 27 2003 /usr/bin/cu
211202 172 -r-sr-xr-x 1 uucp wheel 87276 Oct 27 2003 /usr/bin/uucp
211204 72 -r-sr-xr-x 1 uucp wheel 36852 Oct 27 2003 /usr/bin/uuname
211207 188 -r-sr-sr-x 1 uucp dialer 95820 Oct 27 2003 /usr/bin/uustat
211209 172 -r-sr-xr-x 1 uucp wheel 87996 Oct 27 2003 /usr/bin/uux
211260 60 -r-sr-xr-x 1 man wheel 29752 Oct 27 2003 /usr/bin/man
211308 40 -r-sr-xr-x 4 root wheel 19616 Oct 27 2003 /usr/bin/at
211308 40 -r-sr-xr-x 4 root wheel 19616 Oct 27 2003 /usr/bin/atq
...zkráceno... 

Tyto programy patří do různých skupin. Některé potřebují běžet pod právy root, protože jsou přizpůsobeny k tomu, aby proces běžel pod jiným uživatelem ( su, crontab…). Jiné potřebují přístup např. k /etc/master.pas­swd ( passwd, chsh…). Další zas potřebují modifikovat systémová zařízení atd. V případě, že jste obzvláště paranoidní, můžete lokalizovat programy, které nehodláte používat, a pozměnit jim přístupová práva, resp. můžete všem souborům odstranit SUID bit, a pak jej znovu nastavit u těch, u kterých je to vhodné. To však vyžaduje pochopení funkce programu v systému.

SUID/SGID programy představují bezpečnostní riziko. V případě chyby takového programu by útočník mohl získat přímo shell superuživatele nebo alespoň spouštět příkaz pod jeho účtem.

Příklad zneužití chyby v SUID programu ukazuje článek na hackingexposed­.com. Článek popisuje techniku, kterak si útočník uchová možnost stále používat chybu v SUID binárce, i když ji administrátor smazal. Technika využívá hardlinku na původní SUID program. Hardlink – pevný odkaz je na existující soubor (pevný odkaz může být jen v rámci stejného filesystému). Info o hardlinku se uchovává v i-node a s každým hardlinkem se o jeden zvyšuje ( ls -l). Tudíž když bude smazán původní soubor, tak soubory, které se na něj odkazují, budou zachovány. Proto je důležité kontrolovat přítomnost SUID/SGID programů. Můžeme to dělat různými způsoby, my si ale v dalších dílech řekneme o automatických testech, které spuští FreeBSD pomocí programu  cron.

Další informací, kterou byste někdy mohli vidět, je tzv. StickyBit. Představte si situaci, že chcete mít adresář, kam mohou zapisovat i členové nějaké skupiny, resp. všichni. Toto například platí pro /tmp (ten je nastaven právě se StickyBit). Adresáře zapisovatelné pro všechny však s sebou přinášejí bezpečnostní riziko, viz příklad:

srot# ls -l /home/
total 4
drwxrwxrwx 2 root wheel 512 Jun 15 19:14 test
drwxr-xr-x 3 root wheel 512 Jun 15 19:14 users
srot# touch /home/test/test-root 

Nyní jako obyčejný uživatel vypíšeme obsah adresáře test, pokusíme se přečíst soubor a zkusíme nějaké triky.

> cd /home/test/ && ls -l
total 0
-rw-r--r-- 1 root wheel 0 Jun 15 19:19 test-root
> echo chci_te_zmenit > test-root
test-root: Permission denied.
> mv test-root test-user
> ls -l
total 0
-rw-r--r-- 1 root wheel 0 Jun 15 19:19 test-user
> rm -f test-user
> ls -l 

Z předešlého vidíme, že sice nemůžeme změnit soubor vlastněný někým jiným, ale můžeme jej přejmenovat/smazat. Ošetřit to můžeme právě pomocí StickyBit, který dovolí smazat pouze soubory, které vlastníme. Toto můžete například využít, jestliže chcete mít nějaký společný adresář, kde mohou uživatelé společně sdílet nějaká data. StickyBit se opět nastavuje pomocí chmod +t, resp. chmod -t, číslo v osmičkové soustavě je 1.

srot# ls -l /home/
total 4
drwxrwxrwx 2 root wheel 512 Jun 15 19:22 test
drwxr-xr-x 3 root wheel 512 Jun 15 19:14 users
srot# chmod 1777 /home/test
srot# ls -l /home/
total 4
drwxrwxrwt 2 root wheel 512 Jun 15 19:14 test
drwxr-xr-x 3 root wheel 512 Jun 15 19:14 users
srot# touch /home/test/test-root 
> ls -l /home/test/
total 0
-rw-r--r-- 1 root wheel 0 Jun 15 19:25 test-root
> echo chci_te_zmenit > test-root
test-root: Permission denied.
> rm -f test-root
rm: test-root: Operation not permitted 

Smůla, nejde změnit/smazat soubor vlastněný někým jiným při neomezených právech akce do adresáře.

Nastavení důležitých souborů

Letmo jsme si řekli něco o právech souborů, jaké soubory v systému teda zkontrolovat, případně pozměnit? Pravděpodobně prvním krokem bude adresář /root.

Špatně nastavená práva adresáře /root s sebou nesou velké riziko. Například kdyby útočník mohl zapisovat do /root, mohl by přidat svůj veřejný klíč do .ssh/authorized_keys, a tak by se při SSH relaci autentizované pomocí veřejného klíče mohl dostat k účtu root, aniž by znal heslo. Mohl by i pozměnit konfigurační shellové soubory a upravit cesty ( PATH) ke svým zákeřným programům. Útok přes SSH klíče může být praktikován samozřejmě i na ostatní uživatele.

srot# chmod 700 /root
srot# chmod 700 /home/users/* 

HACK! Adresářová práva nastavená pro čtení ( r  – Read) definují, že může být objekt prohlédnut/listován pomocí ls; adresářová práva pro spouštění ( x  – eXecute) definují, že může být objekt spouštěn/procházen pomocí cd. Jestliže tedy máte adresář o=x a znáte-li přesný název souboru (a tento soubor je povolen pro čtení), můžete jej přečíst. Tohoto se využívá např. pro adresáře s www stránkami jako ochrana proti web robotům.

Mezi další kroky by mělo patřit zkontrolování/nas­tavení práv ke konfiguračním souborům v /etc. Normální uživatelé nemají důvod, aby měli právo číst/spouštět rc skripty, které se využívají při startu systému. Soubor /etc/master.pas­swd (stejně jako jeho databázová verze), který uchovává zašifrovaná hesla uživatelů, by měl být ke čtení/zápisu pouze pro uživatele root. Rovněž uživatelé nemají žádný důvod, aby věděli, které úlohy jsou cron startovány, ani nemusí nic vědět a o položkách v souboru /etc/sysctl.conf pro nastavení jádra. (Proč bychom jim měli prozrazovat více o našem systému?) Dobře si /etc projděte.

srot# chmod o-r /etc/rc* /etc/defaults/rc.conf
srot# chmod 600 /etc/master.passwd
srot# chmod 600 /etc/crontab
srot# chmod 600 /etc/sysctl.conf
srot# chmod o-r /var/log/* 

Dalším cílem útočníka by určitě byla modifikace logů v adresáři /var/log. Když si prohlédnete tento adresář, uvidíte, že pár „méně důležitých“ logů mohou číst i uživatele mimo skupinu wheel. Například kdyby měly některé logy špatná práva, tak by v případě, že by se nějaký uživatel při přihlašování překlepl a místo username napsal heslo, útočník mohl získat toto heslo z logů.

bitcoin školení listopad 24

Pro jistotu ještě prohlédneme systém, zda někde nezůstaly soubory/adresáře zapisovatelné kýmkoli, a pečlivě se podíváme, zdali mezi vypsanými soubory/adresáři nefigurují některé, co by měly být tajné.

srot# find / -type f -o -type d -perm -2 -ls
2 4 drwxrwxrwt 3 root wheel 512 Jun 16 03:01 /tmp
3 4 drwxrwxrwt 2 root wheel 512 Jun 16 01:51 /tmp/.X11-unix
19102 4 drwxrwxrwx 2 uucp uucp 512 Oct 27 2003 /var/spool/uucppublic
21 4 drwxrwxrwt 3 root wheel 512 Jun 14 02:53 /var/tmp
22 4 drwxrwxrwt 2 root wheel 512 Jun 14 01:16 /var/tmp/vi.recover 

Závěr

Bylo to hutný, co se dá dělat. Mezi další informace, co vás mohou zajímat, patří časy posledního přístupu k souboru, změny i-node atd. Doporučuji man ls a man find. Existuje ještě pokročilá možnost přiřazování práv pomocí ACL, viz zde. Sice jsem sliboval příznaky souborů už dnes, ale z důvodu rozsahu jsem je musel přesunout do dalšího dílu. V tom si ještě povíme o volbách pro připojování souborových systémů a zmíněných automatických kontrolách FreeBSD.