Před nějakým půl rokem jsem předváděl, jak se dá ukrást administrátorský účet na Windows 7 a 2008 R2. Na *nixech je také možnost udělat něco podobného. Opět je k tomu samozřejmě potřeba fyzický přístup ke stroji, tentokrát ale není třeba instalační médium. (I když jednou z variant je nakopnutí live distribuce a editace /etc/passwd a /etc/shadow souborů. Téhle variantě se ale věnovat nebudu).
Běh na úrovni
Celý vtip spočívá v nastartování systému v runlevelu 1 neboli single-user módu. A to je možno provést jedině v zavaděči. Vyžaduje-li to systém, je možno zde zadat i cestu k binárce, která se má po startu spustit. V našem případě by se hodil shell. Při správně zvolených parametrech pak budete vrženi rovnou do konzole s rootovskými právy, kde pomocí starého známého passwd příkazu změníte rootovské heslo k obrazu svému. Některé systémy ještě vyžadují nějaké úpravy kolem, např. remount filesystému pro zápis a tak. V dalších odstavcích popíšu vykradení roota na Red Hatu/CentOSu (GRUB) a Debianu/Ubuntu (GRUB2).
Rudý klobouk
Bootnete-li Red Hat nebo, jako v mém případě, CentOS, GRUB na vás vyskočí s něčím takovým
GNU GRUB version 0.97 (637K lower / 1046400K upper memory)
┌───────────────────────────────────────────────────────────────────────┐
│CentOS (2.6.32-220.13.1.el6.x86_64) │
│CentOS (2.6.32-220.el6.x86_64) │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└───────────────────────────────────────────────────────────────────────┘
Use the ↑ and ↓ keys to select which entry is highlighted.
Press enter to boot the selected OS, 'e' to edit the
commands before booting, 'a' to modify the kernel arguments
before booting, or 'c' for a commnd-line.
Našipkujte si váš oblíbený kernel a stiskněte klávesu e, tím zobrazíte podrobnosti vybrané volby a uvidíte který kernel a initrd/initramfs bude zaváděn a s jakými parametry.
GNU GRUB version 0.97 (637K lower / 1046400K upper memory)
┌───────────────────────────────────────────────────────────────────────┐
│root (hd0,0) │
│kernel /vmlinuz-2.6.32-220.13.1.el6.x86_64 ro root=/dev/mapper/vg_fir→ │
│initrd /initramfs-2.6.32-220.13.1.el6.x86_64.img │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└───────────────────────────────────────────────────────────────────────┘
Use the ↑ and ↓ keys to select which entry is highlighted.
Press 'b' to boot, 'e' to edit the selected command in the
boot sequence, 'c' for a command-line, 'o' to open a new line
after ('O' for before) the selected line, 'd' to remove the
selected line, or escape to go back to the main menu.
Vyberte řádek začínající slovem „kernel“ a klávesou e přejděte do módu editace. Řádek samotný je dlouhý jak týden před výplatou, ale jeho obsah vás naštěstí nezajímá. Jen na jeho konec prostě a jednoduše dopište slůvko „single“ (bez uvozovek).
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ESC at any time cancels. ENTER
at any time accepts your changes.]
<E=us rd_NO_DM single
Enterem potvrďte změnu a pak klepněte klávesu b. Systém nastartuje v single-user módu a strčí vás do konzole s oprávněním roota. V té už si můžete dělat, co budete chtít. Třeba
passwd
sync
reboot
Debiani
Na Deb-based systémech je postup podobný, ale vzhledem k tomu, že se ve výchozím stavu nechají nakopávat GRUBem 2, je startovacích řádků trochu více. Ono se taky není čemu divit, GRUB2 je strašný moloch a je jen otázkou času, kdy do něj někdo doprogramuje modul pro hraní Dooma. Debiani také standardně nabízejí rescue mode rovnou v boot menu, ale tenhle výchozí rescue po vás nakonec stejně bude chtít rootovské heslo, takže to není to pravé, co bychom si přáli. Opět je tedy potřeba se „doéčkovat“ do podrobností a zde na konec řádku (resp. dvojřádku) začínající slovem „linux“ dopsat „single init=/bin/sh“ (opět bez uvozovek).
GNU GRUB version 1.99-21ubuntu3
┌──────────────────────────────────────────────────────────────────────┐
│setparams 'Ubuntu, with Linux 3.2.0-24-generic' │
│ │
│recordfail │
│gfxmode $linux_gfx_mode │
│insmod gzio │
│insmod part_msdos │
│insmod ext2 │
│set root='(hd0,msdos1)' │
│search --no-floppy --fs-uuid --set=root 12345678-abcd-abcd-abcd-1234\ │
│5678abcd │ │
│linux /boot/vmlinuz-3.2.0-24-generic root=UUID=12345678-abcd-abcd-ab\ │
│cd-12345678abcd ro single init=/bin/sh │
│initrd /boot/initrd.img-3.2.0-24-generic │
│ │
│ │
└──────────────────────────────────────────────────────────────────────┘
Minimum Emacs-like screen editing is supported. TAB lists
completions. Press Ctrl-x or F10 to boot, Ctrl-C or F2 for
a command-line or ESC to discard edits and return to the GRUB
menu.
Stiskem Ctrl+X pak vaši upravenou verzi nastartujete. Oproti Red Hatu je u Debianů potřeba udělat pár věcí jinak. Po získání konzole je potřeba remountnout kořenový adresář, jinak si passwd bude stěžovat
# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: Authentication token manipulation error
passwd: password unchanged
A protože máme momentálně systém tak trochu rozbitý, je potřeba znásilnit i reboot. Postup obnovy hesla pro Deb-based mašinky je tedy
mount -o remount,rw /
passwd
sync
reboot -f
LILO
Používáte-li LILO, postup je obdobný jako u Red Hatů, postačí tedy kouzelné slůvko „single“
Boot: linux single
Mimochodem, znalost téhle kulišárny byla vyžadována při zkouškách na Red Hat Certified System Admina, Engineera a Security Specialistu. Tam vás totiž posadí před zaheslovanou virtuálku a vaším prvním úkolem je se do ní vůbec dostat.