martes, 30 de abril de 2013

Escaneo de servidores web con Nikto


Nikto es un escaner de servidores web que realiza tests de multiples instancias, incluyendo más de 6500 archivos potencialmente peligrosos como CGIs.

También checa versiones antiguas de servidores y comprueba problema tipicos de al rededor de 150 servidores web, y detecta versiones especificas de 270 servidores. 

Comprueba la configuración de los servidores web, así como comprobar múltiples archivos index. 


En general un excelente escaner de servidores web.
aquí un ejemplo de un escaneo con Nikto: 


villatux# nikto -host www.ejemplo.com
- Nikto v2.1.4
---------------------------------------------------------------------------
+ Target IP: 66.7.197.XX
+ Target Hostname: www.ejemplo.com
+ Target Port: 80
+ Start Time: 2013-04-31 08:59:08
---------------------------------------------------------------------------
+ Server: nginx admin
+ robots.txt contains 1 entry which should be manually viewed.
+ OSVDB-637: Enumeration of users is possible by requesting ~username (responds with 'Forbidden' for users, 'not found' for non-existent users).
+ DEBUG HTTP verb may show server debugging information. See http://msdn.microsoft.com/en-us/library/e8z01xdh%28VS.80%29.aspx for details.
+ /cgi-sys/formmail.pl: Many versions of FormMail have remote vulnerabilities, including file access, information disclosure and email abuse. FormMail access should be restricted as much as possible or a more secure solution found.
+ /cgi-sys/guestbook.cgi: May allow attackers to execute commands as the web daemon.
+ /cgi-sys/Count.cgi: This may allow attackers to execute arbitrary commands on the server
+ OSVDB-3233: /mailman/listinfo: Mailman was found on the server.
+ OSVDB-3092: /cgi-sys/entropysearch.cgi?query=asdfasdf&user=root&basehref=%2F%2Fwww.yourdomain.com/: CPanel's Entropy Search allows username enumeration via the user parameter.
+ OSVDB-3092: /cgi-sys/FormMail-clone.cgi: Default CGI, often with a hosting manager. No known problems, but host managers allow sys admin via web
+ OSVDB-3092: /cgi-sys/scgiwrap: Default CGI, often with a hosting manager. No known problems, but host managers allow sys admin via web
+ OSVDB-3268: /img/: Directory indexing found.
+ OSVDB-3092: /img/: This might be interesting...
+ OSVDB-3092: /img-sys/: Default image directory should not allow directory listing.
+ OSVDB-3092: /java-sys/: Default Java directory should not allow directory listing.
+ Server banner has changed from nginx admin to lighttpd/1.4.29, this may suggest a WAF or load balancer is in place
+ 6448 items checked: 80 error(s) and 14 item(s) reported on remote host
+ End Time: 2013-04-31 09:40:17 (2469 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

jueves, 18 de abril de 2013

Analisis forense a whatsapp (cracking msgstore.db.crypt)

Los mensajes, contactos y configuraciones de Whatsapp se guardan en un archivo con formato de SQlLite. Anteriormente estos archivos estaban sin cifrar, esto hasta un tiempo atrás que con una actualización se cifraron estos archivos, Esto para evitar que cuando se te pierda o te roben el celular no puedan tener acceso a tus conversaciones.

Pero siempre hay como o el porqué buscarle para ver información (la que necesitamos) existen dos casos en donde podemos acceder a estas bases de datos:

Caso IOS: En este caso el archivo esta en el directorio:

"(ID de App)/Documents/ChatStorage.sqlite"
CASO ANDROID: En este caso el archivo está en :

/com.whatsapp/databases/msgstore.db.crypt 
 
y existe otros archivos "backup" que se guardan en la tarjeta de memoria externa

DESCIFRADO
Estas bases de datos en SQLite estan cifradas en AES-192-ECB  que a mi parecer si es un cifrado muy bueno, lo maló/bueno  es que el cifrado a los archivos siempre lo hacen con una misma llave:

"346a23652a46392b4d73257c67317e352e3372482177652c"
en donde no incluye ningún factor único del celular, por lo que podemos acceder a los mensajes de cualquier celular de la misma forma en pocos segundos xDD

Para descifrar estos archivos necesitamos OpenSSL , en mi caso lo tengo ya instalado en mi Distro linux, tan solo especificando el archivo de entrada "-in"  y el de salida "-out" podemos hacerlo con el siguiente comando:

openssl enc -d  -aes-192-ecb -in msgstore.db.crypt -out msgstore.db.sqlite -K 346a23652a46392b4d73257c67317e352e3372482177652c
Una vez descifrado este archivo , podemos acceder mediante SQLite, en mi caso desde el shell de linux:

#apt-get install sqlite3              --> instalamos SQLite3

#sqlite3 msgstore.db.sqlite      --> Accedemos a la base de datos

sqlite> .databases          --> vemos las bases de datos
sqlite> .tables                 --> vemos las tablas
chat_list  messages        
sqlite> select * from messages;  --> vemos los mensajes guardados


Y pues de esta forma podemos ver los mensajes de whatsapp aún y cuando se hayan borrado en la interfaz gráfica del celular.

Los creadores de Xtract (Fabio Sangiacomo and Martina Weidner) encontraron esto en Diciembre del 2011, sacaron su herramienta y un excelente documento explicando como la obtuvieron:

h**p://forum.xda-developers.com/showthread.php?p=24569917

h**ps://code.google.com/p/hotoloti/downloads/list

Aqui el documento con excelente explicación:

h**ps://www.os3.nl/_media/2011-2012/students/ssn_project_report.pdf
Espero les sirva este post como información importante que algún día pueden llegar a utilizar xDD

UPDATE:

Nota:  al parecer los blackberry no se puede con este procedimiento, ya que no tiene el mismo código de cifrado. Les pongo un mensaje si encuentro como resolver esto.

miércoles, 17 de abril de 2013

Establecer proxy para instalar paquetes con portage en Gentoo Linux



Para utilizar emerge a travez de un proxy necesitas establecerlo con este comando:

#export http_proxy="http://username:password@proxy:8080"








Y para utilizar rsync también es necesario establecer el proxy
#export RSYNC_PROXY="http://username:password@proxy:8080" 
 
 
En mi caso trabajo en una institución educativa y todo el trafico pasa a travez de proxy y estos tips me funcionan para configurarle el proxy a los servidores.

Espero les sea de utilidad.

UPDATE !  :
 actuzlizo el post para agregar otras formas de establecer proxy,  que nos facilitó : klondike

También se pueden añadir las variables (sin el export) en el make.conf deberías obtener el mismo resultado.

Por cierto, también es posible usar proxy para ftp con ftp_proxy
 

lunes, 15 de abril de 2013

Backup de mysql cuando no se tiene el password

¿Olvidaste o perdiste la contraseña del usuario 'root' de MySQL?, no hay problema, solo sigue estás sencillas instrucciones y podrás establecer una nueva. Claro siempre y cuando tengas acceso al usuario 'root' de Linux.

Detener el servidor
#> /etc/rc.d/init.d/mysqld stop

Iniciar en modo FULL o abierto
#> mysqld_safe --skip-grant-tables --skip-networking&
esta opción causa que el servidor no use el sistema de privilegios lo que le da acceso ilimitado a todas las bases de datos a todos los usuarios de la base de datos.

Iniciar el monitor
#>mysql -u root
Como no hay sistema de privilegios en este momento, no se preguntara por la contraseña.

En este momento ya podemos manipular cualquier base de datos que esté en nuestro servidor con todos los privilegios.



Respaldar las bases de datos:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| jaws_holafen       | 
| jaws_p108584       | 
| mysql              | 
| mysql_eo           | 
| mysql_ru           | 
| redesuni           | 
| test               | 
| webfcq             | 
| webfcq2            | 
| webfd              | 
+--------------------+ 
 
 
RESPALDAR: Ya que podemos ver los nombres de las bases de datos podemos empezar a respaldar cada base de datos:


mysqldump basededados > /home/usuario/backup.sql

 
O respaldar todas las bases de datos juntas:

mysqldump -A /home/usuario/backup_all.sql


la condición -A (“-all-databases”) selecciona todas las bases de datos existentes en el servidor.

Si nuestro caso , aparte de respaldar la base de datos es seguir usando el servidor, es necesario contar con la contraseña de root para mysql,  como en este caso no la sabemos , la podemos cambiar de esta manera:

CAMBIAR LA CONTRASEÑA DE ROOT MYSQL

Usamos la base de datos del sistema mysql
mysql> use mysql;

Actualizamos el campo que cambiará la contraseña de 'root'
mysql> UPDATE user SET password=PASSWORD('nuevo_pass') WHERE user='root';
Query OK, 1 rows affected (0.07 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> exit
#>

Reiniciar el servidor y listo!!!
#> service mysqld restart

La siguiente vez que entrés al monitor () usa la nueva clave o contraseña.

miércoles, 3 de abril de 2013

Comando grep en linux

El comando grep nos permite buscar, dentro de los archivos, las líneas que concuerdan con un patrón. Bueno, si no especificamos ningún nombre de archivo, tomará la entrada estándar, con lo que podemos encadenarlo con otros filtros.

Por defecto, grep imprime las líneas encontradas en la salida estándar. Es decir, que podemos verlo directamente la pantalla, o redireccionar la salida estándar a un archivo.

Como tiene muchísimas opciones, vamos a ver tan sólo las más usadas:

-c En lugar de imprimir las líneas que coinciden, muestra el número de líneas que coinciden.
-e PATRON nos permite especificar varios patrones de búsqueda o proteger aquellos patrones de búsqueda que comienzan con el signo -.
-r busca recursivamente dentro de todos los subdirectorios del directorio actual.
-v nos muestra las líneas que no coinciden con el patrón buscado.
-i ignora la distinción entre mayúsculas y minúsculas.
-n Numera las líneas en la salida.
-E nos permite usar expresiones regulares. Equivalente a usar egrep.
-o le indica a grep que nos muestre sólo la parte de la línea que coincide con el patrón.
-f ARCHIVO extrae los patrones del archivo que especifiquemos. Los patrones del archivo deben ir uno por línea.
-H nos imprime el nombre del archivo con cada coincidencia.

Veamos algunos ejemplos:

- Buscar todas las líneas que contengan palabras que comiencen por a en un archivo:
$ grep '\' archivo

Otra forma de buscar, sería:
$ cat archivo | grep "\"

- Mostrar por pantalla, las líneas que contienen comentarios en el archivo /boot/grub/menu.lst:
$ grep "#" /boot/grub/menu.lst

- Enviar a un fichero las líneas del archivo /boot/grub/menu.lst que no son comentarios:
$ grep -v "#" /boot/grub/menu.lst

- Contar el número de interfaces de red que tenemos definidos en el fichero /etc/network/interfaces:
$ grep -c "iface" /etc/network/interfaces

- Mostrar las líneas de un fichero que contienen la palabra BADAJOZ o HUELVA:
$ grep -e "BADAJOZ" -e "HUELVA" archivo

- Mostrar las líneas de un fichero que contienen la palabra BADAJOZ o HUELVA, numerando las líneas de salida:
$ grep -n -e "BADAJOZ" -e "HUELVA" archivo

- Mostrar los ficheros que contienen la palabra TOLEDO en el directorio actual y todos sus subdirectorios:
$ grep -r "TOLEDO" *

Veamos algunos ejemplos con expresiones regulares:

- Obtener la dirección MAC de la interfaz de red eth0 de nuestra máquina:
$ ifconfig eth0 | grep -oiE '([0-9A-F]{2}:){5}[0-9A-F]{2}'

Sacamos la dirección MAC de la interfaz eth0 de nuestra máquina haciendo un:
ifconfig eth0

Y aplicando el filtro grep:
grep -oiE '([0-9A-F]{2}:){5}[0-9A-F]{2}'

Las opciones que he usado en grep son:

-o
Indica que la salida del comando debe contener sólo el texto que coincide con el patrón, en lugar de toda la línea, como es lo habitual.
-i Lo he usado para que ignore la distinción entre mayúsculas y minúsculas.
-E Indica que vamos a usar una expresión regular extendida.

En cuanto a la expresión regular, podemos dividirla en dos partes:
([0-9A-F]{2}:){5} Buscamos 5 conjuntos de 2 carateres seguidos de dos puntos
[0-9A-F]{2} seguido por un conjunto de dos caracteres.

Como las direcciones MAC se representan en hexadecimal, los caracteres que buscamos son los números del 0 al 9 y las letras desde la A a la F.

- Extraer la lista de direcciones de correo electrónico de un archivo:
grep -Eio '[a-z0-9._-]+@[a-z0-9.-]+[a-z]{2,4}' fichero.txt

Utilizo las mismas opciones que en el caso anterior:

-o Indica que la salida del comando debe contener sólo el texto que coincide con el patrón, en lugar de toda la línea, como es lo habitual.
-i Lo he usado para que ignore la distinción entre mayúsculas y minúsculas.
-E Indica que vamos a usar una expresión regular extendida.

Analicemos ahora la expresión regular:
[a-z0-9._-]+@[a-z0-9.-]+[a-z]{2,4}

Al igual que antes, la vamos dividiendo en partes:
[a-z0-9._-]+ Una combinación de letras, números, y/o los símbolos . _ y - de uno o más caracteres
@ seguido de una arroba
[a-z0-9.-]+ seguido de una cadena de letras, números y/o los símbolos . y -
[a-z]{2,4} seguido de una cadena de entre dos y cuatro caracteres.

- Obtener la dirección IP de la interfaz de red eth1 de nuestra máquina:
$ ifconfig eth1 | grep -oiE '([0-9]{1,3}\.){3}[0-9]{1,3}' | grep -v 255

En el ejemplo anterior, hemos tomado la información que nos ofrece ifconfig:
ifconfig eth1

Hemos filtrado dicha información con el comando grep, obteniendo todas las direcciones IP que aparecen:
grep -oiE '([0-9]{1,3}\.){3}[0-9]{1,3}'

Por último, hemos filtrado la salida del comando anterior, para eliminar la dirección de broadcast junto con la máscara de red para quedarnos sólo con la dirección IP de la máquina:
grep -v 255

La línea anterior no mostraría las líneas que no contengan el valor 255, es decir, las direcciones de broadcast y máscara de red.

Analicemos ahora el comando grep:
grep -oiE '([0-9]{1,3}\.){3}[0-9]{1,3}'

Al igual que en los otros dos ejemplos de expresiones regulares uso las opciones -oiE en el comando grep:

-o Indica que la salida del comando debe contener sólo el texto que coincide con el patrón, en lugar de toda la línea, como es lo habitual.
-i Lo he usado para que ignore la distinción entre mayúsculas y minúsculas.
-E Indica que vamos a usar una expresión regular extendida.

En cuanto a la expresión regular:
'([0-9]{1,3}\.){3}[0-9]{1,3}'
([0-9]{1,3}\.){3} Representa 3 bloques de entre uno y tres dígitos separados por puntos.
Observemos que como el punto es un metacaracter, tengo que usar el caracter de escape \ para que no sea interpretado como un metacaracter, sino como un caracter normal.
[0-9]{1,3} Representa el último bloque de la dirección IP, que está formado por un número de entre 1 y 3 dígitos.


FUENTE:  http://enavas.blogspot.mx/2008/04/el-shell-de-linux-comando-grep.html