Disassembler

Artificial intelligence is no match for natural stupidity.
12květen2012

Linux: Rootem bez znalosti hesla


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.