Dopo le 3 del mattino, due sole categorie di persone sono al lavoro: le prostitute e i programmatori. [Anonimo].
Informazioni Generali
L’obbiettivo di questo post è di aggiungere una shell ssh e il demone ntpd al vostro nas, ma prima di fare ciò è bene capire un po con quale macchina abbiamo a che fare. Il nas LaCie 2Big Network preso come riferimento e su cui è stata eseguita questa procedura ha il firmware ufficiale, distribuito dalla LaCie, aggiornato alla versione 2.2.3.
# cat /proc/cpuinfo
Processor : ARM926EJ-S rev 0 (v5l)
BogoMIPS : 266.24
Features : swp half thumb fastmult edsp
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 0
Cache type : write-back
Cache clean : cp15 c7 ops
Cache lockdown : format C
Cache format : Harvard
I size : 32768
I assoc : 1
I line length : 32
I sets : 1024
D size : 32768
D assoc : 1
D line length : 32
D sets : 1024
Hardware : Feroceon
Revision : 0000
Serial : 0000000000000000
# cat /proc/version
Linux version 2.6.22.7 (root@grp-dash) (gcc version 4.2.1) #1 Thu Apr 9 16:07:45 CEST 2009
# free
|
total |
used |
free |
shared |
buffers |
Mem: |
61952 |
60184 |
1768 |
0 |
7384 |
Swap: |
128376 |
60184 |
0 |
128376 |
|
Total: |
190328 |
130144 |
|
|
|
# df -h
Filesystem |
Size |
Used |
Available |
Use% |
Mounted on |
rootfs |
648.4M |
20.2M |
595.3M |
3% |
/ |
udev |
648.4M |
20.2M |
595.3M |
3% |
/dev |
/dev/md0 |
7.5M |
5.9M |
1.2M |
83% |
/oldroot |
udev |
10.0M |
0 |
10.0M |
0% |
/oldroot/dev |
udev |
10.0M |
0 |
10.0M |
0% |
/oldroot/dev |
none |
30.3M |
0 |
30.3M |
0% |
/oldroot/dev/shm |
/dev/md1 |
167.0M |
111.3M |
47.1M |
70% |
/oldroot/var/original |
/dev/md2 |
648.4M |
20.2M |
595.3M |
3% |
/oldroot/snapshots |
unionfs |
648.4M |
20.2M |
595.3M |
3% |
/ |
/dev/md4 |
930.4G |
1.2M |
930.4G |
0% |
/home |
# cat /proc/partitions
major minor #blocks name
8 0 976762584 sda
8 1 1 sda1
8 2 975755970 sda2
8 5 128457 sda5
8 6 8001 sda6
8 7 8001 sda7
8 8 176683 sda8
8 9 674698 sda9
8 10 8001 sda10
8 16 976762584 sdb
8 17 1 sdb1
8 18 975755970 sdb2
8 21 128457 sdb5
8 22 8001 sdb6
8 23 8001 sdb7
8 24 176683 sdb8
8 25 674698 sdb9
8 26 8001 sdb10
31 0 512 mtdblock0
9 0 7936 md0
9 1 176576 md1
9 2 674624 md2
9 3 128384 md3
9 4 975755904 md4
# cat /proc/mtd
dev: size erasesize name
mtd0: 00080000 00010000 "cfi_flash_0"
Sinteticamente è un sistema operativo linux con un kernel decisamente datato (sic!) compilato per processori con architettura arm, cpu a 400mhz, 64mb di ram (i nuovi modelli hanno 128 mb di ram) e bootloader uboot. Dalle poche informazioni reperite dal sito ufficiale sembra che sia stato usato per costruire il sistema scratcbox e per avviare i servizi e i demoni hanno usato initng al posto di init.d. I problemi che nascono sono molteplici: il reperimento del software già compilato per il sistema (a meno di buttarsi a capofitto nel cross-compiling) compatibile con le versioni di libreria utilizzate dal nas e la creazione degli script di avvio per initng. Anche gli script per initng trovati in rete devono essere modificati un po per farli funzionare sul sistema, dato che gli sviluppatori non hanno rispettato pienamente le specifiche di initng, inserendo tutti gli script *.i nella cartella /etc/initng/ senza effettuare la suddivisione in sottocartelle (deamon per i demoni, net per i servizi di rete, ecc.)
Hacking
Premessa: Non mi assumo alcuna responsabilità qualora, in seguito alle modifiche effettuate, il vostro sistema smettesse di funzionare correttamente. Vi ricordo, inoltre, che ogni modifica hardware o software al sistema comporta la perdita della garanzia da parte del produttore.
L’accesso al sistema è fondamentale per poter aggiungere al nostro nas uno script bash che esegue dei comandi a nostro piacimento (webshell) o preferibilmente uno script ad hoc per avviare il servizio telnet ed avere una console di root remota.
Ci sono diversi modi per “bucare” il vostro nas, infatti a seconda dei servizi avviati sulla macchina la sicurezza di questo oggetto va decisamente a farsi benedire. Un modo molto semplice per avere accesso al sistema senza smontare fisicamente i dischi è creare una nuova condivisione con un percorso particolare. (vedi più sotto) Avrete così un accesso a tutto il sistema e con i privilegi di amministratore dato che il webserver del nas possiede i diritti di root.

La controparte di questo hacking è che al riavvio della macchina, la condivisione creata viene cambiata dal sistema (meccanismo di protezione??) e rediretta nella vostra condivisione principale, obbligandovi a dover riapplicare la ‘patch’ ogni qualvolta sentite l’esigenza di accedere al vostro sistema linux. Anche la rimozione della nuova condivisione è da eseguire con estrema attenzione. Il mio suggerimento è di rimuovere questa condivisione una volta che si è uppato sul nas il demone telnet e il suo file di avvio (vedi sotto).
Hacking tramite la creazione di una nuova condivisione
- Create una nuova condivisione sul vostro nas di nome “Hack”. La path della condivisione non è importante ciò che importa è che abilitiate almeno la condivisione http.
- Salvare la configurazione xml del vostro nas sul disco (Sistema->Manutenzione->Salva configurazione)
- Fare una copia di backup del file appena salvato (Fatelo! Vi servirà più avanti per rimettere le cose in ordine).
- Editare il file di configurazione xml scaricato modificando la path della condivisione “Hack” come da figura:

Tenete conto le righe del codice xml del vostro file possono differire dall’immagine qui sopra riportata, in relazione al numero di condivisioni della vostra macchina, dagli utenti e dai gruppi.
- Salvare le modifiche e uppare la nuova configurazione sul nas (Sistema->Manutenzione->Carica la configurazione)
- Usate il vostro browser e accedete alle pagina di amministrazione del nas e cliccate su sfoglia per navigare sulla nuova condivisione via web.
La magia viene eseguita dalla riga ../../../../ che impone al sistema di creare una nuova condivisione partendo dalla radice.
Se provate a rimuovere la condivisione “hack” farete danni al vostro sistema, perché insieme alla condivisione rimuoverete anche i file in essa contenuti (quindi il sistema operativo del nas). Un modo indolore per effettuare la rimozione della condivisione è caricare il backup della configurazione del nas effettuato precedentemente (edconf.xml) e solo dopo rimuovere la condivisione ‘hack’ normalmente tramite l’interfaccia web.
Una volta che avete l’accesso al filesystem, per di più con i diritti di root (!), potrete uppare tutti i file che volete.
Binari compilati per architettura ARM e file di configurazione per initng e pam
Da qui in poi avrete bisogno di questo archivio:
>> LaCie_2Big_Network_[TELNET][NTP][SSH][CUPS].zip (6,79Mb),
contenete tutti i binari e le librerie, compilati per architettura arm, che vi servono per installare sul vostro nas i demoni Telnet, NTP, OpenSSH e Cups.
L’archivio contiene i seguenti file:
cups-1.3.8-r1.tbz2 (1,89Mb), contenente tutti file del servizio di stampa. è incluso nell’archivio anche la libreria libpaper (libpaper-1.1.23.tbz2) richiesta dal cups e non presente nel nas.
cups-1.3.8-r1_(driver).tbz2 (3.74Mb), contenente tutti file ppd presenti nella distribuzione 9.10 di ubuntu. Questo file ovviamente non è presente nel sito internet dove ho recuperato i binari compilati per il nas.
cups-1.3.8-r1_(language).tbz2 (419Kb), contenente la traduzione nelle maggiori lingue, italiano compreso, delle pagine html di cups. Questo file non è presente nel sito internet dove ho recuperato i binari compilati per il nas.
ntp-4.2.4_p4.tbz2 (247Kb), contenente i binari e i file di configurazione per il demone ntp
openssh-4.7_p1-r6.tbz2 (490Kb), contenente i binari e i file di configurazione per il demone ssh. L’archivio contiene inoltre le librerie tcp-wrappers (tcp-wrappers-7.6-r8.tbz2) richieste dal demone non presenti nel nas.
usbutils-0.73.tbz2 (86,2Kb). Questo file non è strettamente necessario al nas ne è obbligatorio installarlo per far funzionare cups, tuttavia può essere di aiuto poiché installa l’eseguibile lsusb.
utelnetd.tbz2 (5.7Kb), contenente il demone utelnetd e un file per eseguirlo (vedi paragrafo successivo per maggiori info)
Gli archivi originali li ho recuperati dal sito:
http://downloads.buffalo.nas-central.org/LSPro_ARM9/Distributions/Genlink/Binaries/armv5tejl-softfloat-linux-gnueabi/
dove sono presenti molti pacchetti già compilati per i nas della buffalo. Senonché questi pacchetti sono pensati per un sistema che una inet.d e non initng, quindi ho dovuto crearmi a mano gli scrip di avvio per i demoni sshd, ntpd e cups (rispettivamente /etc/initng/sshd.i, /etc/initng/ntpd.i e /etc/initng/cups.i). Vi posso assicurare che non è stato un bel vedere: la documentazione in merito è alquanto carente e il forum ufficiale del progetto initng è sommerso dallo spam. (Quanto adoro gli spammer
)
Ho voluto lasciare i pacchetti distinti, evitando di fare un unico archivio, in modo da lasciarvi la massima scelta su cosa installare. Da i file ho rimosso i man page e i docs.
Aggiungere telnet al nas
L’archivio utelnetd.tbz2 contiene due file, il demone telnet e un file per lanciarlo e configurare la bash del vostro sistema. Copiate i due file nella cartella /www/cgi-bin/public/ tramite la condivisione creata precedentemente.
EccoVi il contenuto del file telnet.cgi:
#!/bin/sh
echo "Content-type: text/plain"
echo ""
# Settings for root bash shell
HOME='/root'
PATH='/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin:.:'
TERM=linux
PS1='\u@\h:\w# '
PS2='> '
PS3='> '
PS4='+ '
export PS1 PS2 PS3 PS4 PATH HOME TERM
# Run telnet daemon
echo utelnetd -l /bin/bash
eval utelnetd -l /bin/bash
Potete lanciare il vostro demone telnet da un browser web all’indirizzo:
http://indirizzo_nas/cgi-bin/public/telnet.cgi
Aggiornamento: Se la pagina rimane bianca e in caricamento infinito non preoccupatevi, lanciate ugualmente il vostro client telnet sull’indirizzo del nas e godetevi la vostra console di root senza login. (evviva sicurezza!)
Una volta che si possiede una console a tutti gli effetti si può anche pensare di fare uno step in avanti con la sicurezza installando openssh.
Installazione di OpenSSH
Copiate l’archivio openssh-4.7_p1-r6[modificato].tbz2 nella vostra cartella condivisa del nas.
Dalla console di telnet eseguite:
OpenSSH
cd /home/share/nome_cartella_della_vostra_condivisione
tar -xvjf openssh-4.7_p1-r6.tbz2 -C /
rm openssh-4.7_p1-r6.tbz2
cd /etc/initng/runlevel/
echo sshd >> default.runlevel
touch /var/log/lastlog
Al primo avvio del nas dopo l’installazione dello ssh sarà, per una sola volta, più lento, la causa è la creazione automatica dei file:
ssh_host_dsa_key
ssh_host_dsa_key.pub
ssh_host_key
ssh_host_key.pub
ssh_host_rsa_key
ssh_host_rsa_key.pub
obbligatori per il funzionamento stesso del demone ssh stesso (cartella /etc/ssh/).
Eccovi il file di configurazione, incluso nell’archivio, per initng per il demone sshd:

Altro problema sono le pam, anche qui, il file presente nell’archivio originale non funziona e ho dovuto editarlo a mano. Eccovi il suo nuovo contenuto:
#%PAM-1.0
auth required pam_unix.so
account required pam_unix.so
password required pam_unix.so
session required pam_unix.so
Modificatelo a vostra discrezione (file /etc/pam.d/sshd).
Persistenza dei privilegi dell’utente
I problemi tuttavia non finiscono qui. Ad ogni riavvio della macchina il file /etc/passwd e /etc/shadow vengono sovrascritti. In particolare ogni nuovo utente creato tramite l’interfaccia web del nas non ha il diritto di loggarsi alla console remota del nas. Es:
admin:x:500:100::/home:/bin/false
Il /bin/false è il nostro problema! Per ovviare alla situazione ho creato un servizio per initng, chiamato personal, che permette di ripristinare i privilegi di un account:

Si presuppone che l’utente sia stato creato precedentemente tramite l’interfaccia web del nas.
L’unica modifica richiesta è cambiare la stringa user="utente", inserendo al posto di utente il nome dello user che avete creato. L’esecuzione dello script comporta la modifica dei privilegi dell’utente (che diventerà un alter ego del root) e la possibilità di effettuare il login remoto nella shell ssh.
Il file non è presente in alcun archivio, ma è possibile scaricarlo qui:
Per avviare automaticamente al boot del nas lo script:
- copiare il file
personal.i nella cartella /etc/initng/, e
cd /etc/initng/runlevel/
echo personal >> default.runlevel
Una volta che lo script è stato aggiunto potete finalmente eliminare il vostro demone telnet e il suo file di avvio dalla cartella /www/cgi-bin/public/. Per scaramanzia vi consiglio di riavviare la macchina e accertarvi che tutto funzioni come si ci aspetti prima di rimuovere i due file.
Problemi con su e passwd e personalizzazione del promtp della bash
Quando gli sviluppatori della LaCie hanno compilato il sistema hanno tralasciato, penso volutamente, qualcosa…
Loggatevi come root al nas ed eseguite (ricordo che l’accesso telnet che avete è di root):
vi /etc/busybox.conf
Inserite queste linee, salvate il file e uscite dall’editor
[SUID]
passwd = ssx 0.0
su = ssx root.0
Dalla console, sempre con l’account di root, eseguite questi comandi:
# chown 0.0 /etc/busybox.conf
# chmod 600 /etc/busybox.conf
# chown 0.0 /bin/busybox
# chmod 4755 /bin/busybox
I problemi con su e passwd sono finiti.
Se volete il promt della bash esteso vi consiglio di editare il file /etc/profile.bash cambiando la riga:
PS1='[\u@\h \W]\$ ' in
PS1='[\u@\h \w]\$ '.
Installazione di NTP
Copiate l’archivio ntp-4.2.4_p4.tbz2 (247Kb) nella vostra cartella condivisa del nas.
Dalla console, con i privilegi di root attivi, eseguite:
NTPd
cd /home/share/nome_cartella_della_vostra_condivisione
tar -xvjf ntp-4.2.4_p4.tbz2 -C /
rm -r ntp-4.2.4_p4.tbz2
cd /etc/initng/runlevel/
echo ntpd >> default.runlevel
Questo qui è il file di configurazione, incluso nell’archivio, per initng per il demone ntpd:

Non dimenticatevi di configurare correttamente il vostro fuso orario. Potete farlo dalla pagina web di configurazione “system” del vostro nas. Per finire riavviate il nas.
Installazione di Cups (print server)
Copiate l’archivio cups-1.3.8-r1.tbz2 (1.89Mb) nella vostra cartella condivisa del nas.
CUPS
Dalla console, con i privilegi di root attivi, eseguite:
cd /home/share/nome_cartella_della_vostra_condivisione
tar -xvjf cups-1.3.8-r1.tbz2 -C /
rm -r cups-1.3.8-r1.tbz2
cd /etc/initng/runlevel/
echo cupsd >> default.runlevel
- Aprite l’interfaccia web del nas e cliccate su GRUPPI e poi aggiungi, e create un nuovo gruppo con il nome “lpadmin” e aggiungete al gruppo l’utente che avete creato precedentemente per accedere al nas in ssh.
vi /etc/sysconfig/modules
- Aggiungete la riga
usblp, come da figura e salvate.

L’ultimo passaggio impone al sistema di caricare automaticamente all’avvio il modulo che supporta la stampa su porta usb.
Vi ricordo che i comandi per modificare un file con l’editor vi sono “i” per inserire nuovo testo e “ESC”+”:wq” per salvare e uscire.
Eccovi il file di configurazione, incluso nell’archivio, per avviare automaticamente il demone cups tramite initng:

Dovete, inoltre, modificare il file /etc/cups/cupsd.conf per permettere l’amministrazione remota del cups, altrimenti inattiva. Come aiuto vi riporto il mio file di configurazione. Per un ulteriore aiuto su come configurare il cups vi rimando al sito internet ufficiale www.cups.org.
Anche per il cups ho dovuto editare a mano il file pam. Eccovi il suo nuovo contenuto:
#%PAM-1.0
auth required pam_unix.so
account required pam_unix.so
Modificatelo a vostra discrezione (file /etc/pam.d/cups).
Una volta riavviata la macchina, il cups sarà in esecuzione e raggiungibile all’indirizzo del vostro nas alla porta 631:
https://indirizzo_nas:631
I file cups-1.3.8-r1_(driver).tbz2 e cups-1.3.8-r1_(launguage).tbz2, sono opzionali e contengono i driver e la traduzione dell’interfaccia web, installarli o meno è una vostra scelta. Potete anche installare solo la lingua italiana rimuovendo dall’archivio cups-1.3.8-r1_(launguage).tbz2 le cartelle delle lingue che non desiderate, lo stesso dicasi per il file con i driver.
Per poter stampare in formato raw (output pre formattato) dovete togliere il commento alla linea seguente dal file /etc/cups/mime.convs:
application/octet-stream application/vnd.cups-raw 0 -
Assicuratevi che non sia commentata anche la linea seguente del file /etc/cups/mime.types:
application/octet-stream
In linux la stampante sarà rintracciabile all’indirizzo (fate attenzione alle volte non c’è bisogno di indicare il numero di porta):
ipp://indirizzo_nas:631/printers/nome_stampante
Es:
ipp://192.168.1.100:631/printers/ML-3050
In windows xp cliccate su “Aggiungi stampante” e per aggiungere una nuova stampante di rete e selezionate “Stampante in Internet o della rete domestica o aziendale” e usate l’URL:
http://indirizzo_nas:631/printers/nome_stampante
Selezionate, infine, il driver per la vostra stampante.
Una piccola precisazione, il samba del nas non è stato compilato con il supporto per il cups. (libcups.so.2)
Ripristino
È possibile ripristinare il filesystem del nas allo stato precedente le modifiche effettuando l’aggiornamento del firmware, anche con la stessa versione installata sul nas, nel mio caso 2.2.3, usando l’utility messa a disposizione dalla LaCie stessa. Tuttavia non è possibile effettuare tale operazione se il nas risulta non essere più visibile in rete, infatti l’utility non esegue il processo di aggiornamento se non vede precedentemente il nas.
Link Utili
Speculazioni
Un idea molto interessante che mi è venuta in mente è di modificare il raid del nas. In particolare, usare gli hard disk esterni, agganciabili alle porte del usb, come parte integrante del raid usando il raid 5 o aggiungere un hd esterno da usare come spare in caso di guasto. Non ho compiuto alcuna prova in merito, principalmente per mancanza di hd, ma se qualcuno ha avuto la stessa mia idea e ci sta provando mi faccia sapere qualcosa.
Aggiornamento del kernel (?!?)
Ringraziamenti
Ringrazio gli utenti del forum “General NAS-Central Forums”, che con i loro utili post hanno permesso la stesura di questo articolo e soprattutto di bucare il mio nas.
http://hostname:631/printers/RawPrinterQueueName