Depuración (In)Segura

Iniciado por AlbertoBSD, 3 Enero 2020, 06:56 AM

0 Miembros y 1 Visitante están viendo este tema.

AlbertoBSD

Los que ya tengan algo de tiempo programando en PHP, sabrán que la mayoría de los servidores tipo hosting están configurados para que el Server no tire los mensajes de error hacia el navegador. Esto complica un poco el tema a la hora de realizar un poco de depuración en un sitio en producción. Lo ideal seria tener un equipo para depurar el código fuera del entorno de producción, depurar y volver a subir el codigo ya corregido, esto es el deber ser cuando trabajas sobre el sitio de alguien mas.

Sin embargo en mi caso y para mi pagina personal, me da mucha flojera estar haciendo las cosas como debería de ser, lo cual he implementado un forma de depuración un tanto protegida. NOTA sigue siendo inseguro, pero dado que lo password basados en el tiempo de UNIX que duran 30 segundos son algo difíciles de adivinar y poco probable que alcances a forcebrutear las 999999 posibilidades en los 30 segundos que dura el password, confio el que el metodo es mas o menos seguro para lo que necesito.

La idea es básicamente la siguiente, incluir un archivo en el index que busque si existe la variable debug y si existe válida si el valor es igual generado mediante la función TOTP (Función que publique en este mismo subforo ) Si estas condiciones se cumplen habilita que se muestren los errores que arroje el PHP

Código (php) [Seleccionar]
<?php
if(isset($_GET["debug"]) {
$valor $_GET["debug"];
$key file_get_contents("s3cr3ct_dir/"."key.dat");
if(strncmp($valor,totp($key),6) == 0) {
ini_set('display_errors'1);
ini_set('display_startup_errors'1);
error_reporting(E_ALL);
header("debug: enabled");
}
else {
header("debug: invalid totp");
}
}
?>


Consideraciones

  • No, no tengo un directorio "s3cr3ct_dir/"
  • El archivo key.dat se genero mas o menos asi dd if=/dev/urandom of=key.dat bs=1K count=1
  • Se tiene que configurar alguna aplicación authenticator (Obvio)
  • Se puede intentar forcebrutear el valor actual del Totp (999999) posibilidades  en 30 segundos
  • Se puede intentar forcebrutear el valor actual del KEY 2^8192 posibilidades en Toda una eternidad
  • Actualmente están los headers activos así que pueden intentarlo, tengo un /dummy que no hace nada, pero los headers se mostrarían
  • Si se desactivan los headers no hay manera de saber si X sitio implementa una técnica similar
  • Se puede cambiar el nombre de la variable
  • Tiene que existir un error en la pagina para que sirva de algo

🏴

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

@XSStringManolo

999.999 peticiones se hacen con un solo equipo en 30 segundos con multihilo.
Imagínate si van por ahí explotando XSS para que todos los visitantes te prueben una.
Métele un panel de loggin a tu sitio y si no tienen permiso para ver lo que hay en /desarrollo le haces echo de cualquier otra cosa. Le metes un formulario de adorno para que se entretenga si no tiene permisos. xD

#!drvy

#2
Te abres un SSH con el servidor de Producción, usas tail -n0 sobre el log de errores de PHP y vas depurando cuanto quieras. Con esto solo añades código que añade esfuerzo a la depuración que hay que hacer.

Saludos

AlbertoBSD

Cita de: @?0!,5^34 en  3 Enero 2020, 07:51 AM
999.999 peticiones se hacen con un solo equipo en 30 segundos con multihilo.

Si lo se, voy a hacer un post hablando de como atacar una implementacion de este tipo mediante algo de estadistica.

Cita de: @?0!,5^34 en  3 Enero 2020, 07:51 AM
Imagínate si van por ahí explotando XSS para que todos los visitantes te prueben una.
Naaa, los XSS se deben de utilizar para algo mejor, mejor has que me manden sus cookies xD

Cita de: @?0!,5^34 en  3 Enero 2020, 07:51 AM
Métele un panel de loggin a tu sitio y si no tienen permiso para ver lo que hay en /desarrollo le haces echo de cualquier otra cosa. Le metes un formulario de adorno para que se entretenga si no tiene permisos. xD

Jajaja si es por trolear podria empezar a mandar codigos de errores de bases de dados o de php entre los comentarios.


Cita de: #!drvy en  3 Enero 2020, 14:53 PM
Te abres un SSH con el servidor de Producción, usas tail -n0 sobre el log de errores de PHP y vas depurando cuanto quieras. Con esto solo añades código que añade esfuerzo a la depuración que hay que hacer.

Si, esa manera es el deber ser, la forma segura claro, sin embargo, esta es otra aproximación. por si no tienes el ssh a la mano.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

MinusFour

Cita de: @?0!,5^34 en  3 Enero 2020, 07:51 AM
999.999 peticiones se hacen con un solo equipo en 30 segundos con multihilo.

Es un servidor compartido, primero truena el servidor antes que le hagas 999,999 hits.

Hay servicios de papelería para errores por si te interesa, por ejemplo papertrail:

https://www.papertrail.com/

AlbertoBSD

Cita de: MinusFour en  3 Enero 2020, 16:40 PM
Hay servicios de papelería para errores por si te interesa, por ejemplo papertrail:

https://www.papertrail.com/

Voy a echarle un ojo, acabo de ver su pagina y se ve bien, aunque si da algo de desconfianza que un tercero pueda ver tus logs, me imagino que a de estar cifrado hasta cierto punto (I want to believe).

Cita de: MinusFour en  3 Enero 2020, 16:40 PM
Es un servidor compartido, primero truena el servidor antes que le hagas 999,999 hits.

Acabo de realizar unas pruebas mediante AB y no, no se completa el millón de hits en 30 segundos.

El /dummy que no devuelve contenido mas que los headers, arrojo estos resultados con las Concurrencies; 1, 8 (Numero de Cores), 30 y 100

Concurrency Level:      1
Time taken for tests:   30.000 seconds
Complete requests:      3113
Failed requests:        0
Total transferred:      1021064 bytes
HTML transferred:       0 bytes
Requests per second:    103.77 [#/sec] (mean)
Time per request:       9.637 [ms] (mean)
Time per request:       9.637 [ms] (mean, across all concurrent requests)
Transfer rate:          33.24 [Kbytes/sec] received



Concurrency Level:      8
Time taken for tests:   30.001 seconds
Complete requests:      13335
Failed requests:        0
Total transferred:      4373880 bytes
HTML transferred:       0 bytes
Requests per second:    444.49 [#/sec] (mean)
Time per request:       17.998 [ms] (mean)
Time per request:       2.250 [ms] (mean, across all concurrent requests)
Transfer rate:          142.37 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        7   15   4.4     14      52
Processing:     1    3   2.7      2      27
Waiting:        0    3   2.6      2      26
Total:          9   18   5.3     17      56



Concurrency Level:      30
Time taken for tests:   30.005 seconds
Complete requests:      14244
Failed requests:        0
Total transferred:      4672360 bytes
HTML transferred:       0 bytes
Requests per second:    474.72 [#/sec] (mean)
Time per request:       63.196 [ms] (mean)
Time per request:       2.107 [ms] (mean, across all concurrent requests)
Transfer rate:          152.07 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        9   46  18.6     43     147
Processing:     1   17  12.1     13     105
Waiting:        0   14  12.0      9     103
Total:         13   63  22.3     60     203



Concurrency Level:      100
Time taken for tests:   30.006 seconds
Complete requests:      14160
Failed requests:        0
Total transferred:      4646120 bytes
HTML transferred:       0 bytes
Requests per second:    471.91 [#/sec] (mean)
Time per request:       211.904 [ms] (mean)
Time per request:       2.119 [ms] (mean, across all concurrent requests)
Transfer rate:          151.21 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        9  152  38.2    151     366
Processing:     5   59  28.5     52     242
Waiting:        2   36  27.8     27     231
Total:         14  211  43.6    206     470


En el mejor de los casos arrojo sobre 14 mil hits, hay que tener en cuenta que la clave del TOTP solo funciona de los segundos 0 al 29 y del 30 al 59, entonces se tendría que empezar a forcebrutear en el segundo exacto.

Otra cosa que hay que mencionar la prueba fue realizada localmente, por lo cual los hilos del AB compartían procesador con los hilos del PHP-FPM, Si se hace desde un equipo externo podría incrementar el
numero de replies, sin embargo agregaria el tiempo de ida y vuelta, lo cual quedaría mas o menos igual en cuanto a replies.

Voy a intentar desde PHP con Curl multi hilo a ver que resultado me da.

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

@XSStringManolo

#6
Cual es el AB?

Usa el DHunter 1000+ (Peticiones+Respuestas+GuardadoEnArray de la url completa) por segundo en un I7 sin OC con bruteforce. Igual puedes usar algún servicio en línea de computación para romperlo.
Sige el código un poco caos que aún estamos trabajando en él. Llama a las funciones directamente en local en vez de usar el front-end.

AlbertoBSD

#7
Voy a echarle un ojo a tu repositorio

Cita de: @?0!,5^34 en  3 Enero 2020, 21:29 PM
Cual es el AB?

https://httpd.apache.org/docs/2.4/programs/ab.html

ab is a tool for benchmarking your Apache Hypertext Transfer Protocol (HTTP) server. It is designed to give you an impression of how your current Apache installation performs. This especially shows you how many requests per second your Apache installation is capable of serving.

Según las pruebas que realice por logica el numero de Threads esta muy ligado al numero de cores. Si te fijas en mi caso no hay mucha diferencia entre 8 hilos, 30 o 100.

Si se puede mandar hasta 1000 o 10000 simultáneamente pero igual te quedaras esperando a que el server responda, y pues tambien depende del numero de cores que tiene el server.

En el peor de los casos se termina haciendo un DoS momentáneo en que que el server procesa o dropea los request.



Edito.

Ya he cambiado el nombre de la variable, ya no es debug.

Implemente un force brute con curl milti desde php, remotamente no supera las 4000 peticiones en el lapso de 30 segundos, pero localmente llega a alcanzar hasta 80 mil, si el token esta entre esos primeros 80 mil valores habilita el debug, por lo tanto no seria buena idea publicar el nombre de la variable que lo activa.

Adicional al hecho de realizarle fuerza bruta al TOTP, y lograr "por suerte" dar con el token en turno el session_start tira error por estar bloqueado el archivo de la cookie por alguno de los otros hilos.



Saludos!



Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW