Ik heb de firmware voor een ander type ingebed apparaat al een tijdje ontleed en dacht dat ik zou kijken of ik iets zou kunnen vinden. Na een paar uur kwam ik erachter! Er is een moeilijke manier en een gemakkelijke manier die ik pas vond nadat ik op de harde manier had gegraven. Dit is een lang bericht, maar ik hoop dat het anderen in vergelijkbare ondernemingen zal helpen.
Een beetje Googelen en ik vond http://wiki.qnap.com/wiki/Firmware_Recovery met een beschrijving van de volledige methoden voor het herstellen van de firmware en een andere pagina op dezelfde wiki voor "Handmatig bijwerken van firmware" met voorbeelden van opdrachtregels. Een paar dingen vielen op ...
-
Het NAS OS heeft een script voor het verwerken van een firmware-update-image:
# / etc / init .d / update.sh /mnt/HDA_ROOT/update/TS-209_2.1.2_build1031.img
Er is een checksum ingebed in het binaire bestand en DAN daar is deze regel in de uitvoer:
"Met 120-bits codering - (QNAPNASVERSION4)"
Ik ging ten onder 2 paden: de moeilijke manier, en de zeer gemakkelijke manier ...
The Hard Way (maar met handige tips)
Ik heb de TS-569 volledige systeemherstelimage gedownload van de Firmware Recovery-pagina die bijna 2 uur duurde voor 500 MB. Nu moest ik uitzoeken waar ik mee werkte:
# file F_TS-569_20120628-1.2.2.imgF_TS-569_20120628-1.2.2.img: x86 opstartsector; GRand Unified Bootloader, ...
Een volledige schijfkopie die er als volgt uitziet:
$ fdisk -l F_TS-569_20120628-1.2.2.img Apparaat Start Start Eindblokken Id SystemF_TS-569_20120628-1.2.2.img1 32 4351 2160 83 LinuxF_TS-569_20120628-1.2.2.img2 * 4352 488959 242304 83 LinuxF_TS-569_20120628-1.2.2.img3 488960 9735_67 242304 83 LinuxF_TS-67 242304 83- 1.2.2.img4 973568 1007615 17024 5 ExtendedF_TS-569_20120628-1.2.2.img5 973600 990207 8304 83 Linux
F_TS-569_20120628-1.2.2.img6 990240 1007615 8688 83 Linux
Scheid de partities (of je zou de afbeelding naar een reserveschijf kunnen schrijven):
# dd if = F_TS-569_20120628-1.2.2.img bs = 512 of = part1 skip = 32 count = 2160w # dd if = F_TS-569_20120628-1.2.2.img bs = 512 of = part2 skip = 4352 count = 242304w # dd if = F_TS-569_20120628-1.2.2.img bs = 512 of = part3 skip = 488960 count = 242304w # dd if = F_TS-569_20120628-1.2.2.img bs = 512 of = part5 skip = 973600 count = 8304w # dd if = F_TS-569_20120628-1.2.2.img bs = 512 of = part6 skip = 990240 count = 8688w ... wat -rw-r - r-- 1 root root 2211840 2013-08-30 15:41 part1-rw-r - r-- 1 root root 248119296 2013-08-30 15:42 part2-rw-r - r-- 1 root root 248119296 2013-08-30 15:42 part3-rw -r - r-- 1 root root 8503296 2013-08-30 15:42 part5-rw-r - r-- 1 root root 8896512 2013-08-30 15:42 part6
Partitie 3 is een spiegel van partitie 2, geverifieerd via md5sum. Partities 5 en 6 zijn leeg, waarschijnlijk vanwege krasruimte. Partitie 1 is / boot / grub en bevat modules en dergelijke voor het opstarten en hardwareconfiguratie. Laten we dus kijken naar partitie 2, de opstartpartitie.
# mkdir / mnt / ts2 # mount -r part2 / mnt / ts2 -o loop # ls -la / mnt / ts2 / boot- rw-r - r-- 1 root root 3982976 27-06-2012 22:17 bzImage-rw-r - r-- 1 root root 81 2012-06-27 22:17 bzImage.cksum-rw-r- -r-- 1 root root 8890727 2012-06-27 22:17 initrd.boot-rw-r - r-- 1 root root 85 2012-06-27 22:17 initrd.boot.cksum-rw-r- -r-- 1 root root 73175040 2012-06-27 22:17 qpkg.tar-rw-r - r-- 1 root root 83 2012-06-27 22:17 qpkg.tar.cksum-rw-r- -r-- 1 root root 33593992 2012-06-27 22:17 rootfs2.bz-rw-r - r-- 1 root root 85 2012-06-27 22:17 rootfs2.bz.cksum-rw-r- -r-- 1 root root 31160679 2012-06-27 22:17 rootfs_ext.tgz-rw-r - r-- 1 root root 87 2012-06-27 22:17 rootfs_ext.tgz.cksum # bestand -z / mnt / ts2 / boot / initrd.boot
/mnt/ts2/boot/initrd.boot: Linux rev 1.0 ext2 bestandssysteemgegevens, UUID = 770ce31c-d03f-484e-81e8-6911340bdcbf (gzip gecomprimeerde gegevens, van Unix, laatst gewijzigd: wo 27 juni 22:16:58 2012, max compressie)
- bzImage is de gecomprimeerde kernelimage
- initrd is het initiële ramdisk rootbestandssysteem dat het besturingssysteem laat draaien
- qpkg .tar bevat verschillende softwarepakketten voor de NAS
- rootfs2.bz is een gecomprimeerde tarball van enkele / home-, / lib- en / usr-bestanden
- rootfs_ext.tgz is een gecomprimeerde tarball van een ander ext2-bestandssysteem van / opt / source voor apache, php5, mysql en wat een back-up lijkt te zijn van de NVRAM-instellingen.
Alle magie zit in het initrd-bestandssysteemimage. Als we daarin turen, krijgen we:
# gunzip -c /mnt/ts2/boot/initrd.boot > / tmp / initrd.boot.img # mkdir / mnt / tsinitrd # mount -r / tmp / initrd.boot.img / mnt / tsinitrd -o loop # ls -la / mnt / tsinitrddrwxr-xr-x 2 root root 2048 2012-06-27 22:05 bindrwxr-xr-x 5 root root 13312 2012-06 -27 22:11 devdrwxr-xr-x 22 root root 2048 2012-06-27 22:15 etcdrwxr-xr-x 3 root root 3072 2012-06-27 22:05 libdrwxr-xr-x 2 root root 1024 2010- 11-03 04:53 lib64lrwxrwxrwx 1 root root 11 2012-06-27 22:16 linuxrc -> bin / busyboxdrwx ------ 2 root root 12288 2012-06-27 22:16 verloren + gevondendrwxr-xr-x 4 root root 1024 2012-06-27 22:04 mntdrwxr-sr-x 2 root root 1024 2012-06-27 22:16 optlrwxrwxrwx 1 root root 19 2012-06-27 22:16 php.ini -> / etc / config / php.inidrwxr-sr-x 2 root root 1024 1999-11-02 18:54 proclrwxrwxrwx 1 root root 18 2012-06-27 22:16 Qmultimedia -> / share / Qmultimediadrwxr-xr-x 3 root root 1024 2007 -07-18 05:24 rootdrwxr-xr-x 2 root root 5120 2012-06-27 22:15 sbindrwxrwxr-x 29 root root 1024 2006-02-28 00:57 sharedrwxrwxrwx 4 root root 1024 2006-02-28 00:57 tmpdrwxrwxrwx 8 root root 1024 2012-06-27 22:15 var
Herinner je je de 2 dingen die opvielen op de pagina Firmwareherstel? Het updatescript en de versleutelingsreferentie:
# more /mnt/tsinitrd/etc/init.d/update.sh ...... regel 223 / sbin / PC1 d QNAPNASVERSION4 $ path_name $ {_ tgz}; ...
Er is een verwijzing naar wat de coderingssleutel lijkt te zijn en misschien de decrypter! Aangezien dit NAS-firmwarebeeld gebaseerd is op x86, zit ik in een x86 VM, kan het net zo goed proberen:
# / mnt / tsinitrd / sbin / PC1 Gebruik: pc1 e | d "key" bronbestand <targetfile> waar: e - versleutelen, d - ontsleutelen & "sleutel" is de coderingssleutel. De lengte van de sleutel bepaalt de sterkte van de codering. Als er geen doelbestand is, is de naam van het uitvoerbestand gelijk aan de naam van het bronbestand: 5 tekens is 40-bits codering.
En tot slot:
# / mnt / tsinitrd / sbin / PC1 d QNAPNASVERSION4 TS-569_20130726-4.0.2.img TS-569_20130726-4.0.2.tgz 120-bits codering gebruiken - (QNAPNASVERSION4) len = 1048576 modelnaam = TS-569version = 4.0.2 # tar -tvf TS-569_20130726-4.0.2.tgz -rw-r - r-- root / root 106 2013-0 7-25 20:49 bios_layoutdrwxr-xr-x root / root 0 2013-07-25 20:49 boot / -rw-r - r-- root / root 4557984 2013-07-25 20:49 bzImage-rw- r - r-- root / root 69 2013-07-25 20:49 bzImage.cksumdrwxr-xr-x root / root 0 2013-07-25 20:49 config / -rwxr-xr-x root / root 48408 2013 -07-25 20:49 dmidecode-rwxr-xr-x root / root 356714 2013-07-25 20:49 flashrom-rw-r - r-- root / root 2097152 2013-07-25 20:49 flashrom. img-rw-r - r-- root / root 33 2013-07-25 20:49 fw_info-rw-r - r-- root / root 8480290 2013-07-25 20:49 initrd.boot-rw- r - r-- root / root 73 2013-07-25 20:49 initrd.boot.cksum-rwxr-xr-x root / root 1606508 2013-07-25 20:49 libcrypto.so.1.0.0-rwxr -xr-x root / root 372708 2013-07-25 20:49 libssl.so.1.0.0-rw-r - r-- root / root 81090560 2013-07-25 20:49 qpkg.tar-rw- r - r-- root / root 72 2013-07-25 20:49 qpkg.tar.cksum-rw-r - r-- root / root 41185897 2013-07-25 20:49 rootfs2.bz
-rw-r - r-- root / root 74 2013-07-25 20:49 rootfs2.bz.cksum-rw-r - r-- root / root 47500086 2013-07-25 20:49 rootfs_ext.tgz -rw-r - r-- root / root 78 2013-07-25 20:49 rootfs_ext.tgz.cksumdrwxr-xr-x root / root 0 2013-07-25 20:49 update / -rw-r-- r-- root / root 105 2013-07-25 20:49 update_bios.conf-rwxr-xr-x root / root 3188 2013-07-25 20:49 update_bios.sh-rwxr-xr-x root / root 6088 2013 -07-25 20:49 update_check-rwxr-xr-x root / root 22041 2013-07-25 20:49 update_img.sh
Dit alles om naar een uitvoerbaar bestand te gaan dat decodeert de firmware-afbeelding voor ons, een script dat ons de decoderingssleutel in platte tekst geeft, en een manier om alles weer samen te verpakken als we iets wilden wijzigen.
... en nu voor iets heel anders
De zeer gemakkelijke manier
Toen ik eenmaal aan het einde van de "moeilijke weg" kwam, besloot ik om te googelen voor de coderingssleutel "QNAPNASVERSION4". Het eerste resultaat was voor het PC1 enc / dec-algoritme in C dat iemand al zo vriendelijk heeft aangepast om de specifieke firmwareformaten voor ons af te handelen: http://www.r00ted.com/downloads/pc1.c
Update: link is als gebroken gemeld, hier is een dump: http://pastebin.com/KHbX85nG
# gcc -o pc1 pc1.c # pc1 d QNAPNASVERSION4 TS-569_20130726-4.0.2.img TS-569_20130726-4.0.2.tgz # tar -tvf TS-569_20130726-4.0.2.tgz-rw-r-- r-- root / root 106 2013-07-25 20:49 bios_layoutdrwxr-xr-x root / root 0 2013-07-25 20:49 boot / -rw-r - r-- root / root 4557984 2013-07 -25 20:49 bzImage ... hetzelfde resultaat als op de moeilijke manier
Nu heb je een hulpprogramma dat je firmwarebestand ontsleutelt vanuit het comfort van je eigen besturingssysteem zonder fysieke toegang tot het NAS.