english version

Odzyskiwanie hasła do MikroTika

ostatnia aktualizacja: 2012-11-28

UWAGA: Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użycia tego opisu, programów na tej stronie zawartych oraz za wykorzystanie zawartych tu informacji. Niniejszy opis jak i wszystkie materiały udostępnione zostały tylko w celach edukacyjnych.
Informacje zawarte na stronie oraz program mtpass przeznaczony jest *TYLKO* dla administratorów i/lub właścicieli mikrotików, którzy chcą odzyskać hasło bez utraty konfiguracji. Użycie informacji tutaj zawartych w innych celach (np. w celu przełamania zabezpieczeń sieci) jest łamaniem prawa!
UWAGA2: Wersja angielska strony może zawierać pełniejsze/bardziej aktualne informacje.
Według informacji zawartych na wiki MikroTika, nie jest możliwe odzyskanie haseł bez utraty całej konfiguracji. Nie jest to prawdą - co postaram sie w tym tutorialu udowodnić :)

Nowości

2012-11-28: nowa wersja programu: mtpass-0.9.tar.bz2 (poprawki kompilacji dla gcc 4.7.2)
2012-01-29: nowa wersja programu: mtpass-0.8.tar.bz2 (kolejne poprawki dla nowszych RouterOS)
2011-08-15: nowa wersja programu: mtpass-0.7.tar.bz2 (poprawione działanie dla plików RouterOS 5.5)
2010-10-12: nowa wersja programu: mtpass-0.6.tar.bz2 (poprawiona kompilacja na nowszych g++)
2009-12-17: dodany obraz oraz informacje o RB411 z chipsetem ethernetu AR8012
2009-10-06: dodane informacje o RB1xx
2009-03-26: nowa wersja programu: mtpass-0.5.tar.bz2 (poprawione odzyskiwanie haseł dłuższych niż 16 znaków)
2009-03-17: nowa wersja programu: mtpass-0.4.tar.bz2 (sporo poprawek błędów, możliwość odzyskiwania haseł z plików backupu oraz pełnych zrzutów pamięci flash)
2008-12-13: dodane informacje o RB411
2008-12-08: nowa wersja programu: mtpass-0.3.tar.bz2 (zaimplementowany algorytm budowania kluczy xor)
2008-01-23: nowa wersja programu: mtpass-0.2.tar.bz2 (dekoduje hasła wszystkich użytkowników)

Potrzebny sprzęt

- komputer (w warunkach "polowych" bardzo przydaje się laptop) :)
- RouterBoard (testowałem na wersjach 532, 532A oraz 411 - opisana metoda powinna jednak działać na wszystkich wspieranych przez OpenWrt RouterBoardach, Cesco przetestował na RB133C)
- kabelek konsolowy do podlączenia szeregowo przez RS'a
- skrętka

Potrzebny soft

- Ponieważ nie uznaję "jedynego słusznego systemu operacyjnego" więc cały opis oparty będzie na linuksie, dystrybucja nie powinna mieć większego znaczenia, aczkolwiek opis dotyczy debiana
- serwer dhcp (użylem isc dhcp)
- serwer tftp (użylem tftp-hpa)
- minicom (do komunikacji szeregowej)
- netcat
- ... no i mój programik mtpass :)

No to zaczynamy...

Działania nasze sprowadzać się będą do przestawienia RouterBoarda aby uruchomił system poprzez sieć. W ten sposób ładujemy naszego linuxa, za którego pomocą wyłuskujemy z obrazu RouterOS odpowiedni plik z hasłami. A nastepnie na komputerze deszyfrujemy hasła.

1. Konfiguracja minicom-a
O ile nie ustawiliśmy inaczej to standardowo port konsolowy RouterBoarda działa z parametrami transmisji: 115200, 8N1. Trzeba więc tak ustawić minicom'a. Jeśli pierwszy raz uruchamiany jest minicom należy uruchomić go z przełącznikiem pozwalającym na ustawienia: # minicom -s Wybieramy "Serial port setup" i pojawia sie menu z parametrami. W moim wypadku ustawiłem parametry następująco:
A - Serial Device         : /dev/ttyUSB0
E - Bps/Par/Bits          : 115200  8N1
F - Hardware Flow Control : Yes
G - Software Flow Control : No
Wpisałem port /dev/ttyUSB0 dlatego ze użyłem konwertera USB<->RS232. W przypadku gdy jest to standardowy port COM1/COM2 to należy oczywiście wpisać /dev/ttyS0 lub /dev/ttyS1
Po ustawieniu zatwierdzamy naciskając enter i przechodzimy do głównego menu. Teraz pozostaje tylko zapisac ustawienia wybierając:
"Save setup as dfl" i mamy skonfigurowanego minicoma.

2. Serwer dhcp + tftp
Serwer dhcp należy tak ustawić aby przydzielił MikroTikowi adres oraz po zażądaniu obrazu podał mu odpowiednią ścieżkę do obrazu systemu. Jak się konfiguruje serwer dhcp do bootowania przez sieć to temat na całkiem inny opis - więc ja ograniczę się tylko do niezbędnego minimum :)
użyty przeze mnie plik dhcpd.conf:
default-lease-time 21600;
max-lease-time 43200;
option domain-name-servers 10.0.0.1;
option netbios-name-servers 10.0.0.1;
option netbios-node-type 8;
option www-server 10.0.0.1;
authoritative;
allow booting;
allow bootp;

subnet 10.0.0.0 netmask 255.255.255.0
{
  option routers 10.0.0.1;
  option subnet-mask 255.255.255.0;
  option broadcast-address 10.0.0.255;
  filename "/tftpboot/linuxrc";
    range 10.0.0.10 10.0.0.100;
}
Do katalogu /tftpboot/ należy wrzucić plik linuxrc. Jest to firmware OpenWrt (kamikaze). Został on skompilowany z opcją bootowania z ramdysku - co jest koniecznością ze względu na to że nie chcemy naruszyć istniejącego w pamięci NAND systemu RouterOS. Firmware ma na stałe wkompilowane ustawianie interfejsu eth0 z adresem 10.0.0.10.
Dla zainteresowanych własnym kompilowaniem OpenWrt udostępniam plik konfiguracyjny (dla wersji kamikaze 7.09): .config

RB411: do wersji RB411 potrzebny jest inny kernel (który należy wstawić w miejsce /tftpboot/linuxrc):
http://wifi.ozo.com/airo/openwrt/firmware/kamikaze/2.6/ar71xx/12846/openwrt-ar71xx-vmlinux-initramfs.elf

RB411 z chipsetem ethernetu AR8012: Dzięki Mirkowi dowiedziałem się że istnieją wersję RB411 ze zmienionym chipsetem od ethernetu (AR8012 zamiast KSZ8041NL)
więcej informacji na ten temat: https://forum.openwrt.org/viewtopic.php?id=22776
Mirek przetestował odzyskiwanie hasła na skompilowanym przez siebie obrazie OpenWRT: openwrt-ar71xx-vmlinux-initramfs.elf

RB1xx: Cesco skompilował kamikaze 8.09 dla procesora Infineon ADM5120 (jądro powinno działać na każdym RB1xx) - należy wówczas ściągnąć i wstawić w miejsce /tftpboot/linuxrc poniższy plik:
openwrt-adm5120-vmlinux.elf

Uwaga: Czasami (jeśli serwer tftp robi chroot'a do katalogu /tftpboot/ - jak np. w przypadku pakietu tftp-server z Fedory) należy ustawić ścieżkę do pliku relatywnie do chroot-owanego katalogu - więc w tym wypadku wpis wygląda tak:
  filename "/linuxrc";
3. No to do dzieła :)
Poniższy opis oparty jest na RouterBoard 532 (jednak testowałem tę metodę także na wersji 532A oraz 411).
Łączymy kablem konsolowym mikrotika z komputerem, tak samo postępujemy ze skrętką - z tym że należy ją podłączyć do głównego portu w mikrotiku - często przyklejona jest na nim naklejka PoE. Jeśli jeszcze tego nie zrobiliśmy, to na komputerze przypisujemy adres karcie sieciowej i uruchamiamy serwer dhcp:
# ifconfig eth0 10.0.0.1 up
# invoke-rc.d dhcp start
odpalamy minicoma bez inicjalizacji modemu (to nam akurat nie jest potrzebne):
# minicom -o
no i jeśli aktualnie na routerboardzie jest juz odpalony system to należy go zrestartowac; jeśli nie - podłączamy mu zasilanie - tuż po tym na konsoli powinien się zgłosić BIOS RouterBoard'a:
RouterBOOT booter 1.5

RouterBoard 532

CPU frequency: 264 MHz
  Memory size:  32 MB

Press any key within 1 seconds to enter setup
W tym momencie mamy jedną sekundę żeby nacisnąć dowolny klawisz (można ten czas później zwiększyć)
W wypadku sekundy trzeba to zrobić dość szybko a jeśli się zdąży to pojawia się główne menu:
RouterBOOT-1.5
What do you want to configure?
   d - boot delay
   k - boot key
   s - serial console
   o - boot device
   u - cpu mode
   f - try cpu frequency
   c - keep cpu frequency
   r - reset configuration
   g - upgrade firmware
   i - board info
   p - boot protocol
   t - do memory testing
   x - exit setup
your choice:
naciskamy o:
your choice: o - boot device

Select boot device:
   e - boot over Ethernet
 * n - boot from NAND
   c - boot from CF
   1 - boot Ethernet once, then NAND
   2 - boot Ethernet once, then CF
   b - boot chosen device
your choice:
Jeśli standardowo bootujemy z pamięci NAND to wybieramy:
boot Ethernet once, then NAND - czyli 1
jeśli natomiast bootujemy z CF (gwiazdka będzie przy c) to wybieramy 2.
W moim wypadku wybrałem 1 powracając do głównego menu.
Następnie wybrałem opcję wyboru protokołu (p):
RouterBOOT-1.5
What do you want to configure?
   d - boot delay
   k - boot key
   s - serial console
   o - boot device
   u - cpu mode
   f - try cpu frequency
   c - keep cpu frequency
   r - reset configuration
   g - upgrade firmware
   i - board info
   p - boot protocol
   t - do memory testing
   x - exit setup
your choice: p - boot protocol
a następnie wybralem protokół dhcp (2):
Choose which boot protocol to use:
   1 - bootp protocol
 * 2 - dhcp protocol
your choice: 2 - dhcp protocol
Po ponownym powrocie do głównego menu wybieramy x, czyli zapis ustawień i reboot naszego jądra:
RouterBOOT-1.5
What do you want to configure?
   d - boot delay
   k - boot key
   s - serial console
   o - boot device
   u - cpu mode
   f - try cpu frequency
   c - keep cpu frequency
   r - reset configuration
   g - upgrade firmware
   i - board info
   p - boot protocol
   t - do memory testing
   x - exit setup
your choice: x - exit setup


writing settings to flash... OK


RouterBOOT booter 1.5

RouterBoard 532

CPU frequency: 264 MHz
  Memory size:  32 MB

Press any key within 1 seconds to enter setup.
writing settings to flash... OK
trying dhcp protocol... OK
resolved mac address 00:1B:FC:41:BE:43
Gateway: 10.0.0.1
*transfer started ................................ transfer ok, time=1.8s
setting up elf image... OK
jumping to kernel code

[ ... tutaj mamy dużo informacji od jądra ... ]

init started:  BusyBox v1.4.2 (2008-01-15 11:43:12 CET) multi-call binary

Please press Enter to activate this console. PPP generic driver version 2.4.2
Po naciśnięciu enter mamy uruchomionego własnego linuxa na mikrotiku:
BusyBox v1.4.2 (2008-01-15 11:43:12 CET) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 KAMIKAZE (7.09) -----------------------------------
  * 10 oz Vodka       Shake well with ice and strain
  * 10 oz Triple sec  mixture into 10 shot glasses.
  * 10 oz lime juice  Salute!
 ---------------------------------------------------
root@OpenWrt:/#
4. Montowanie
Teraz należy już tylko podmontować pamięć NAND i przesłać sobie plik z hasłami. Dla pewności sprawdzamy czy jądro wykryło pamięć NAND:
# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00400000 00020000 "RouterBoard NAND Boot"
mtd1: 07c00000 00020000 "RouterBoard NAND Main"
U mnie przy 128MB pamieci NAND wyglada to właśnie tak jak wyżej - nie wiem jak będzie w przypadku innych pojemności. W tym momencie należy się jednak ważna uwaga - nie wiem ile w tym prawdy, w każdym razie "obiło mi się o uszy", że przy montowaniu pamieci NAND może sie przytrafić utrata danych (nawet przy montowaniu w trybie tylko do odczytu). Mi się do tego doprowadzić nie udało, jednak nie oznacza to, że nie może się to przytrafić Tobie!
Nadszedł czas na montowanie pamieci NAND (w trybie tylko-do-odczytu): # mount -t yaffs2 -o ro /dev/mtdblock1 /mnt Uwaga: w przypadku RB411 uklad partycji wykryty przez jadro wygladal tak: Creating 3 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00040000 : "booter"
0x00040000-0x00400000 : "kernel"
0x00400000-0x04000000 : "rootfs"
... więc zamiast /dev/mtdblock1 musiałem zamontować /dev/mtdblock2

System plików powinien być już podmontowany. W pliku /mnt/nova/store/user.dat (w nowszych wersjach RouterOS scieżka do pliku to: /mnt/rw/store/user.dat) są interesujące nas dane - czyli zaszyfrowane hasło :)
Aby go przesłać użyłem bardzo prostego sposobu - mianowicie z mikrotika za pomocą netcat'a wysyłam go na komputer (który ma uruchomionego netcata w trybie odbioru).

Na komputerze trzeba więc najpierw odpalić netcata nasłuchującego na porcie 7878: /bin/netcat -l -p 7878 > user.dat ... a z mikrotika wysyłamy sobie plik: cat /mnt/nova/store/user.dat|nc 10.0.0.1 7878 W ten prosty sposób mamy na komputerze plik który nas interesuje. Kolejny restart mikrotika powinien być już standardowy - z tego medium, które ustawiliśmy.
Możemy spokojnie odpiąć kable do mikrotika :)

5. 283i4jfkai3389 - czyli o co chodzi :)
Czas na deser - hasła w środku przesłanego pliku są zaszyfrowane - na szczęście nie taki diabeł straszny - po mojej analizie okazało się że hasła szyfrowane są metodą XOR. Do deszyfrowania haseł dla poszczególnych kont użytkowników trzeba użyć różnych kluczy deszyfrujących.
Napisałem więc programik który jako parametr przyjmuje nazwę pliku (w naszym wypadku: user.dat) a wynikiem jego działania jest pokazanie haseł. Programik przetestowałem na trzech różnych Mikrotikach i wyniki są w porządku - nie gwarantuję jednak że w przyszłości nie zmieni się sposób szyfrowania - nie testowałem też czy działa na wszystkich wersjach RouterOS. Jeśli u Ciebie nie działa to proszę o kontakt.
Niestety na chwilę obecną nie jest mi znany algorytm kluczy deszyfrujących - więc mój programik opiera sie na bazie zebranych przeze mnie do tej pory kluczy - jeśli masz szczęście to twoje hasła zostaną prawidłowo rozszyfrowane - w przeciwnym razie zobaczysz krzaki zamiast hasła :(.
Aktualizacja 2008-12-08: w końcu znalazłem trochę czasu ... no i udało mi się rozpracować algorytm :) Działa on tak: do nazwy użytkownika doklejany jest stały ciąg znaków "283i4jfkai3389" a z całości tego "zlepka" jest liczona suma md5. Obliczona suma to własnie klucz do dekodowania hasła :)
proste - no nie? :) - algorytm zaimplementowałem począwszy od wersji 0.3 mojego programu.

Źródła programu można pobrać stąd: mtpass-latest.tar.bz2, a następnie rozpakować, skompilować i uruchomić.
Uruchamiamy program:
# ./mtpass user.dat
mtpass v0.3 - MikroTik RouterOS password recovery tool, (c) 2008 by manio

Reading file user.dat, 166 bytes long

Rec# | Username        | Password           | Disable flag   | User comment                       
--------------------------------------------------------------------------------------------
1    | admin           | secretpass         |                | system default user                
No i mamy to czego szukaliśmy :)
Mam nadzieję że tutorialek sie przydał i że nikomu NANDy nie padły :)
Pozdrawiam! A na deser trochę linków...

Odzyskiwanie haseł z backup-ów:

Może się zdarzyć że zapomniałeś/zgubiłeś hasło do swojego mikrotika ale masz gdzieś zapisany plik backup-u. Pliki backupu są tworzone przez RouterOS i zapisywane w formacie:
MikroTik-DDMMYYYY-HHMM.backup
Od wersji 0.4 mtpass potrafi także z tych plików odzyskiwać hasła. Wystarczy po prostu uchomić mtpass z parametrem o nazwie pliku backup-u, np:
# ./mtpass MikroTik-02082008-1346.backup
To samo dotyczy sytuacji gdy masz zrobiony backup całej pamięci flash - czyli np. całego urządzenia /dev/mtdblock (patrz wyżej punkt 4). Także wówczas powinno dać się odzyskać hasła.

Linki:

- MikroTik Router Security Analysis: Insecure Network Protocol
- MikroTik Router Security Analysis: Uncovering a hidden kernel module in a binary
- MikroTik Router Security Analysis: Weak password storage / encryption
- OpenWrt
- RouterBOARD 500
- RB500 Linux SDK
- Installation of Debian Sarge on Rouberboard 532


© 2008 by manio