Rilasciato una nuova versione del firmware modificato (v0.8)
Sul mio repository GitHub (
https://github.com/digiampietro/adbtools2), come avevo accennato in un post precedente, si trova un po' di documentazione su come diventare root sul router e su come modificare il firmware originale utilizzando il "Firmware Modification Kit" in ambiente Linux e disponibile sempre nello stesso repository (directory mod-kit).
Utilizzando questi tool ho generato una versione di firmware modificato che, rispetto a quello originale, ha le seguenti modifiche:
- Permette, in modalità normale, l'utilizzo del comando "system shell" per avere una normale shell busybox. Nel firmware originale questa possibilita' esiste solo in modalita' "factory mode"
- Elimina l'asterisco nel campo della password dell'utente root in /etc/passwd.orig per permettere, nella shell busybox, un "su" a root con password di default "no.wordpass" (nella versione v0.8, in quella precedente la password non era necessaria). Da notare che root non puo' comunque fare il login con telnet o ssh e tale accesso non e' comunque disponibile da Internet. Volendo, utilizzando il "mod-kit", e' possibile generare un proprio firmware in cui mettere una propria password all'utente root.
- Ha gli script di upgrade modificati in modo da permettere, in futuro, l'upgrade con un firmware non firmato senza dover ricorrere all'hack descritto sotto e necessario per la prima installazione di un firmware non originale.
- Permette l'installazione di entware (https://github.com/Entware/Entware) su una chiavetta USB pre-formattata con la prima o unica partizione con un file system linux ext2, ext3 o ext4. Entware e' un progetto che mette a disposizione migliaia di pacchetti pre-compilati, pronti da installare su dispositivi embedded, come i router, attraverso un package manager (opkg), simile a quello usato da OpenWRT, e che gestisce automaticamente le dipendenze. Entware cerca di dare "meno fastidio" possibile al firmware originale, si installa in /opt (dove e' stata montata la chiavetta USB) e installa sotto /opt anche le librerie che servono ai vari eseguibili, interferendo quindi pochissimo con il software gia' presente nel firmware. L'elenco dei pacchetti disponibili che vengono scaricati automaticamente da opkg per l'architettura armv7 Cortex-A9 (quella del nostro router DVA-5592) sono consultabili qui: http://bin.entware.net/armv7sf-k3.2/Packages.html
Per procedere alla installazione del firmware ed all'utilizzo di entware sono necessari i seguenti pre-requisiti:
- procurarsi una chiavetta USB, creare una partizione (anche piu' di una volendo) con un file system linux ext2, ext3 o, preferibilmente, ext4. Nel caso di piu' partizioni, la prima e' quella che verra' utilizzata da entware e che dovra' essere formattata in questo modo. La cosa piu' facile e' effettuare questa formattazione in ambiente Linux con tools come gparted o analoghi; in ambiente Windows probabilmente esistono tools per fare la stessa cosa, ma io non li conosco.
- per cercare di evitare violazioni del copyright e della proprieta' intellettuale di ADB, D-Link o Wind non e' opportuno mettere a disposizione l'intero file del firmware modificato in un sito web. Come alternativa sara' necessario scaricare:
- il firmware originale su cui si basa il firmware modificato, scaricabile dal sito ufficiale D-Link: ftp://ftp.dlink.eu/Products/dva/dva-...I_20180405.zip ovviamente va utilizzato il file "unzippato"
- il file contenente le differenze rispetto al file originale (1,6Mb contro 24Mb) generato utilizzando xdelta3 (http://xdelta.org/) e disponibile su un mio sito alla url: http://va.ler.io/myfiles/dva/DVA-559...0.8.sig.xdelta
- il software xdelta3; in ambiente Linux e' solitamente disponibile nel software repository standard e, ad esempio, su Ubuntu si installa con:
Codice:
$ sudo apt-get install xdelta3
in ambiente windows si puo' scaricare da https://www.romhacking.net/utilities/598/
- generare il firmware modificato sotto linux con un comando simile al seguente:
Codice:
$ xdelta3 -d -s DVA-5592_A1_WI_20180405.sig DVA-5592_A1_WI_20180405-mod-v0.8.sig.xdelta DVA-5592_A1_WI_20180405-mod-v0.8.sig
- sotto windows il comando e' analgo, dopo aver scaricato xdelta3:
Codice:
C:\> xdelta -d -s DVA-5592_A1_WI_20180405.sig DVA-5592_A1_WI_20180405-mod-v0.8.sig.xdelta DVA-5592_A1_WI_20180405-mod-v0.8.sig
- scaricare lo script hack-script.sh dal repository adbtools2, lo si puo' fare cliccando su https://raw.githubusercontent.com/di...hack-script.sh e salvando il relativo file di testo. Questo script servira' per fare il copia/incolla, quando si e' in telnet sul router, per creare lo script che permette di "hackerare" il router.
Una volta che si ha a disposizione il file del firmware modificato (DVA-5592_A1_WI_20180405-mod-v0.8.sig) e' necessario procedere ad "hackerare" il router per permettere l'installazione di un firmware non originale e non firmato digitalmente dal costruttore.
Nell'ambito di questa procedura la configurazione del router viene azzerata e riportata alla configurazione di fabbrica, e' bene, pertanto, prima di procedere salvare la configurazione esistente in modo da poterla ricaricare alla fine della procedura.
Inoltre durante la durata della procedura la funzionalita' normale de router viene meno, non funzionera' ne' l'accesso WiFi ne' l'accesso ad Internet fino al completamento della procedura che, di solito, richiede 15-30 minuti.
Da tenere presente le solite avvertenze del caso: si sta per effettuare una operazione che non solo non e' supportata da chi ci ha fornito il router, ma che aggira le protezioni che il costruttore del router ha messo in atto per impedirci proprio di effettuare questa operazione. Essendo una operazione che modifica il firmware del router l'utente che la effettua lo fa a proprio rischio e pericolo, nessuna responsabilita' potra' essere attribuita all'autore di questa procedura, neanche qualora la procedura di modifica, o il firmware modificato dovessero procurare danneggiamenti al router e/o persino all'ambiente circostante.
Io posso solo dire che, nel mio personalissimo caso, ho installato il firmware modificato senza inconvenienti e che, volendo, posso sempre ritornare ad installare il firmware originale.
Per modificare il firmware occorre eseguire i seguenti passi:
- collegarsi con telnet al router ed entrare in modalita' "factory mode" per avere accesso, da utente non privilegiato, ad una shell Linux sul router. Da notare che il comando "factory-mode" e' nascosto, non viene auto-completato premendo tab
Codice:
valerio@ubuntu-hp:~$ telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
Login: admin
Password:
********************************************
* D-Link *
* *
* WARNING: Authorised Access Only *
********************************************
Welcome
DLINK# factory
DLINK(factory)# factory-mode
DLINK(factory)#
DLINK(factory)# Connection closed by foreign host.
valerio@ubuntu-hp:~$
- il router fa il reboot ed entra in "factory mode", in questa modalita' la funzionalita' di accesso ad Internet viene persa, non ci sono piu' le reti WiFi che avevamo impostato, non e' attivo il DHCP server per cui dovremo impostare a mano l'indirizzo IP sul PC per connetterci al router che ha il suo indirizzo di default 192.168.1.1. Anche eventuali altre configurazioni vengono perse
- fare il login sul router, entrare nella shell con il comando "system shell" ed "hackerare" il router con hack-script.sh
Codice:
valerio@ubuntu-hp:~$ telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
Login: admin
Password:
********************************************
* D-Link *
* *
* WARNING: Authorised Access Only *
********************************************
Welcome
DLINK# system shell
BusyBox v1.17.3 (2018-04-11 12:29:54 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
/root $ cat > /tmp/hack-script.sh
fare un copia incolla dello script sul terminale
dare un CTRL-D per terminare la copia
/root $ chmod a+x /tmp/hack-script.sh
/root $ /tmp/hack-script.sh
- a questo punto si e' "hackerato" il router: si puo' dare il comando "su -" e diventare root (cosa che non ci serve adesso) ed inoltre, fintanto che non si riavvia il router, e' possibile caricare dalla normale interfaccia web, il firmware modificato. Questo e' reso possibile dal fatto che:
- si e' copiato il file /usr/sbin/upgrade.sh in /tmp/upgrade.sh
- si e' modificato /tmp/upgrade.sh in modo che continui la procedura di upgrade anche quando il risultato del controllo della firma del file del firmware e' negativo
- si e' "virtualmente" sostituito /usr/sbin/upgrade.sh con /tmp/upgrade.sh tramite il comando, eseguito da root:
Codice:
mount --bind /tmp/upgrade.sh /usr/sbin/upgrade.sh
- procedere, tramite interfaccia web, a caricare il firmware modificato DVA-5592_A1_WI_20180405-mod-v0.8.sig. L'interfaccia web in "factory mode" e' leggermente diversa ed occorre selezionare la modalita' avanzata per avere il menu' che permette l'aggiornamento del firmware.
- se tutto procede come previsto il firmware modificato viene installato con successo sul router ed il router fa il reboot con il nuovo firmware rimanendo sempre in "factory mode"
- a questo punto e' necessario uscire dal "factory mode" con il comando "restore default-setting"
Codice:
valerio@ubuntu-hp:~$ telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
Login: admin
Password:
********************************************
* D-Link *
* *
* WARNING: Authorised Access Only *
********************************************
Welcome
DLINK# restore default-setting
- dopo qualche minuto il router fa il reboot e rientra in modalita' normale, se si vuole ripristinare la normale operativita' a questo punto e' possibile ricaricare la configurazione che era stata salvata in precedenza
- e' possibile verificare che il nuovo firmware e' realmente installato facendo un telnet al router e dando il comando "system shell" e poi "su -", password di default "no.wordpass", verificando cosi' che si e' in grado di diventare root:
Codice:
valerio@ubuntu-hp:~$ telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
Login: admin
Password:
********************************************
* D-Link *
* *
* WARNING: Authorised Access Only *
********************************************
Welcome
DLINK# system shell
BusyBox v1.17.3 (2018-04-11 12:29:54 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
/root $ su -
BusyBox v1.17.3 (2018-04-11 12:29:54 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
___ ___ ___ ___
|\__\ /\ \ /\ \ /\ \
|:| | /::\ \ /::\ \ /::\ \
|:| | /:/\:\ \ /:/\:\ \ /:/\:\ \
|:|__|__ /::\~\:\ \ /::\~\:\ \ _\:\~\:\ \
/::::\__\ /:/\:\ \:\__\ /:/\:\ \:\__\ /\ \:\ \:\__\
/:/~~/~ \/__\:\/:/ / \/__\:\/:/ / \:\ \:\ \/__/
/:/ / \::/ / \::/ / \:\ \:\__\
\/__/ /:/ / \/__/ \:\/:/ /
/:/ / \::/ /
\/__/ \/__/ r41358.07b1b3a7
..................................................................
yet another purposeful solution by Advanced Digital Broadcast SA
..................................................................
root@dlinkrouter:~#
- a questo punto e' possibile inserire la chiavetta USB formattata con il file system Linux ext2, ext3 o ext4 e procedere alla installazione di entware con il comando seguente (viene mostrato anche l'output nel caso che tutto vada a buon fine):
Codice:
root@dlinkrouter:~# /etc/init.d/entware.sh install alternative
entware.sh: fstype: ext3
entware.sh: module ext2 already loaded
entware.sh: module mbcache already loaded
entware.sh: module jbd already loaded
entware.sh: module jbd2 already loaded
entware.sh: module ext3 already loaded
entware.sh: module ext4 already loaded
entware.sh: /opt/etc/init.d/rc.unslung not found
entware.sh: entware software not found on /opt
entware.sh: Entware Installation
entware.sh: downloading http://bin.entware.net/armv7sf-k3.2/installer/alternative.sh
Connecting to bin.entware.net (81.4.123.217:80)
alternative.sh 100% |***************************************************************************************************************************| 2031 0:00:00 ETA
entware.sh: installing entware, executing /tmp/alternative.sh
Info: Checking for prerequisites and creating folders...
Warning: Folder /opt exists!
Info: Opkg package manager deployment...
Connecting to bin.entware.net (81.4.123.217:80)
opkg 100% |***************************************************************************************************************************| 131k 0:00:00 ETA
Connecting to bin.entware.net (81.4.123.217:80)
opkg.conf 100% |***************************************************************************************************************************| 190 0:00:00 ETA
Connecting to bin.entware.net (81.4.123.217:80)
ld-2.27.so 100% |***************************************************************************************************************************| 135k 0:00:00 ETA
Connecting to bin.entware.net (81.4.123.217:80)
libc-2.27.so 100% |***************************************************************************************************************************| 1218k 0:00:00 ETA
Connecting to bin.entware.net (81.4.123.217:80)
libgcc_s.so.1 100% |***************************************************************************************************************************| 50840 0:00:00 ETA
Connecting to bin.entware.net (81.4.123.217:80)
libpthread-2.27.so 100% |***************************************************************************************************************************| 92648 0:00:00 ETA
Info: Basic packages installation...
Downloading http://bin.entware.net/armv7sf-k3.2/Packages.gz
Updated list of available packages in /opt/var/opkg-lists/entware
Installing busybox (1.28.3-2) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/busybox_1.28.3-2_armv7-3.2.ipk
Installing libc (2.27-8) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libc_2.27-8_armv7-3.2.ipk
Installing libgcc (7.3.0-8) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libgcc_7.3.0-8_armv7-3.2.ipk
Installing libssp (7.3.0-8) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libssp_7.3.0-8_armv7-3.2.ipk
Installing librt (2.27-8) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/librt_2.27-8_armv7-3.2.ipk
Installing libpthread (2.27-8) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libpthread_2.27-8_armv7-3.2.ipk
Configuring libgcc.
Configuring libc.
Configuring libpthread.
Configuring libssp.
Configuring librt.
Configuring busybox.
Installing entware-opt (227000-3) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/entware-opt_227000-3_all.ipk
Installing libstdcpp (7.3.0-8) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libstdcpp_7.3.0-8_armv7-3.2.ipk
Installing entware-release (1.0-2) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/entware-release_1.0-2_all.ipk
Installing zoneinfo-asia (2018e-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/zoneinfo-asia_2018e-1_armv7-3.2.ipk
Installing zoneinfo-europe (2018e-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/zoneinfo-europe_2018e-1_armv7-3.2.ipk
Installing findutils (4.6.0-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/findutils_4.6.0-1_armv7-3.2.ipk
Installing terminfo (6.1-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/terminfo_6.1-1_armv7-3.2.ipk
Installing locales (2.27-8) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/locales_2.27-8_armv7-3.2.ipk
Installing grep (2.26-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/grep_2.26-1_armv7-3.2.ipk
Installing libpcre (8.41-2) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/libpcre_8.41-2_armv7-3.2.ipk
Installing opkg (2011-04-08-9c97d5ec-17b) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/opkg_2011-04-08-9c97d5ec-17b_armv7-3.2.ipk
Installing entware-upgrade (1.0-1) to root...
Downloading http://bin.entware.net/armv7sf-k3.2/entware-upgrade_1.0-1_all.ipk
Configuring terminfo.
Configuring libpcre.
Configuring grep.
Configuring locales.
Entware uses separate locale-archive file independent from main system
Creating locale archive - /opt/usr/lib/locale/locale-archive
Adding en_EN.UTF-8
Adding ru_RU.UTF-8
You can download locale sources from http://pkg.entware.net/sources/i18n_glib227.tar.gz
You can add new locales to Entware using /opt/bin/localedef.new
Configuring entware-upgrade.
Upgrade operations are not required
Configuring opkg.
Configuring zoneinfo-europe.
Configuring zoneinfo-asia.
Configuring libstdcpp.
Configuring entware-release.
Configuring findutils.
Configuring entware-opt.
Info: Congratulations!
Info: If there are no errors above then Entware was successfully initialized.
Info: Add /opt/bin & /opt/sbin to your PATH variable
Info: Add '/opt/etc/init.d/rc.unslung start' to firmware startup script for Entware services to start
This is an alternative Entware installation. We recomend to install and setup Entware version of ssh server
and use it instead of a firmware supplied one. You can install dropbear or openssh as an ssh server
root@dlinkrouter:~#
- riguardo ad entware gli eseguibili vengono installati in /opt/bin e /opt/sbin pertanto queste due directory e' opportune aggiungerle al PATH quando si fa il login, la cosa si puo' fare anche facendo il "source" di /opt/etc/profile come, ad esempio:
Codice:
root@dlinkrouter:~# . /opt/etc/profile
solo che in questo caso /opt/bin e /opt/sbin sono le prime due directory del PATH ed hanno la precedenza nel caso di comandi con lo stesso nome di comandi presenti nel firmware. Talvolta questo puo' non essere quello che ci si aspetta.
- una volta messo tali directory nel path e' possibile avere la lista del software dipsonibile con "opkg list"
Codice:
root@dlinkrouter:~# opkg list
25volt - 1.0.5-1 - 25volt - A lightweight tool for monitoring APC Smart-UPS and Powercom WOW UPSs
3proxy - 0.8.12-1 - 3proxy is universal proxy server. It can be used to provide internal users
with fully controllable access to external resources or to provide external
users with access to internal resources.
Note: SSL plugin requires libopenssl to be installed.
6relayd - 2013-12-10.1-0381cf15e9721054f902354e9c3b9fb0201bab7f - 6relayd is a daemon for serving and relaying IPv6 management protocols to
configure clients and downstream routers.
6relayd provides server services for RA, stateless DHCPv6, DHCPv6-PD and can
be used to relay RA, DHCPv6 and NDP between routed (non-bridged) interfaces
in case no delegated prefixes are provided by the upstream router.
accel-ppp - 1.11.2-1 - The ACCEL-PPP is high performance PPTP/L2TP/PPPoE server for Linux. Userspace
daemon has its own PPP implementation, so it does not uses pppd and one process
(multi-threaded) manages all connections.
acl - 20180121-1 - Access control list support
This package provides ACL manipulation utilities
- chacl
- getfacl
- setfacl
adb - android.5.0.2_r1-1 - Android Debug Bridge (adb) is a versatile command line tool that lets you communicate with an emulator instance or connected Android-powered device.
......
- maggiori informazioni su opkg si possono avere con "opkg" senza argomenti:
Codice:
root@dlinkrouter:~# opkg
opkg must have one sub-command argument
usage: opkg [options...] sub-command [arguments...]
where sub-command is one of:
Package Manipulation:
update Update list of available packages
upgrade Upgrade installed packages
install <pkgs> Install package(s)
configure <pkgs> Configure unpacked package(s)
remove <pkgs|regexp> Remove package(s)
flag <flag> <pkgs> Flag package(s)
<flag>=hold|noprune|user|ok|installed|unpacked (one per invocation)
Informational Commands:
list List available packages
list-installed List installed packages
list-upgradable List installed and upgradable packages
list-changed-conffiles List user modified configuration files
files <pkg> List files belonging to <pkg>
search <file|regexp> List package providing <file>
find <regexp> List packages whose name or description matches <regexp>
info [pkg|regexp] Display all info for <pkg>
status [pkg|regexp] Display all status for <pkg>
download <pkg> Download <pkg> to current directory
compare-versions <v1> <op> <v2>
compare versions using <= < > >= = << >>
print-architecture List installable package architectures
depends [-A] [pkgname|pat]+
whatdepends [-A] [pkgname|pat]+
whatdependsrec [-A] [pkgname|pat]+
whatrecommends[-A] [pkgname|pat]+
whatsuggests[-A] [pkgname|pat]+
whatprovides [-A] [pkgname|pat]+
whatconflicts [-A] [pkgname|pat]+
whatreplaces [-A] [pkgname|pat]+
Options:
-A Query all packages not just those installed
-V[<level>] Set verbosity level to <level>.
--verbosity[=<level>] Verbosity levels:
0 errors only
1 normal messages (default)
2 informative messages
3 debug
4 debug level 2
-f <conf_file> Use <conf_file> as the opkg configuration file
--conf <conf_file>
--cache <directory> Use a package cache
-d <dest_name> Use <dest_name> as the the root directory for
--dest <dest_name> package installation, removal, upgrading.
<dest_name> should be a defined dest name from
the configuration file, (but can also be a
directory name in a pinch).
-o <dir> Use <dir> as the root directory for
--offline-root <dir> offline installation of packages.
--add-arch <arch>:<prio> Register architecture with given priority
--add-dest <name>:<path> Register destination with given path
Force Options:
--force-depends Install/remove despite failed dependencies
--force-maintainer Overwrite preexisting config files
--force-reinstall Reinstall package(s)
--force-overwrite Overwrite files from other package(s)
--force-downgrade Allow opkg to downgrade packages
--force-space Disable free space checks
--force-postinstall Run postinstall scripts even in offline mode
--force-remove Remove package even if prerm script fails
--force-checksum Don't fail on checksum mismatches
--noaction No action -- test only
--download-only No action -- download only
--nodeps Do not follow dependencies
--nocase Perform case insensitive pattern matching
--size Print package size when listing available packages
--force-removal-of-dependent-packages
Remove package and all dependencies
--autoremove Remove packages that were installed
automatically to satisfy dependencies
-t Specify tmp-dir.
--tmp-dir Specify tmp-dir.
-l Specify lists-dir.
--lists-dir Specify lists-dir.
regexp could be something like 'pkgname*' '*file*' or similar
e.g. opkg info 'libstd*' or opkg search '*libop*' or opkg remove 'libncur*'
Da notare che da root non e' opportuno modificare il file system di root formattato in jffs2, ho notato che il firmware originale, sebbene monti tale file system in modalita' read/write, in realta' non lo modifica mai e lo tratta come se fosse di sola lettura. Andando a modificare tale file system ho notato che iniziano ad apparire dei messaggi di "jffs2 checksum error" sulla console del router (la console seriale collegandosi alle piazzole etichettate IN, OUT, GND, VCC, sulla motherboard), tali messaggi sono disponibili anche con il comando "dmesg" che recupera gli ultimi messaggi di log da un buffer circolare tenuto in memoria.
E' bene disabilitare l'aggiornamento automatico del firmware, altrimenti tutto quello che si e' ottenuto con il firmware non ufficiale viene rimosso dal firmware ufficiale che potrebbe anche aver corretto le vulnerabilita' e non essere piu' "hackerabile" con il metodo utilizzato qui.