A menudo me encuentro con mucha gente que me pregunta la manera en la que se puede convertir en un hacker. Pero por supuesto, con la trampa de añadir las siguientes preguntas: «¿Con qué programa empiezo? ¿Así podría ver el WhatsApp de mi esposo? ¿Cómo hago para tener la contraseña del Facebook de mi novia sin que ella lo sepa?».
Honestamente, no tengo ni idea de cómo se puede llegar a ser un hacker, ni en qué momento una persona obtenga ese calificativo, aunque la verdad sí que puedo ubicar a bastantes hackers y he de decir que no me imagino a ninguno de ellos respondiendo estas preguntas. Lo que he notado, es que adquirieron ese título por tener una pasión que les lleva más allá de sus límites mentales, para realizar cosas increíbles con lo que les rodea. Algunas veces esa pasión, gira entorno a disciplinas tan diametralmente opuestas a la seguridad informática como la música, la cocina, o cualquier otra que contenga un alto grado de intelecto único, irrepetible y que los haga sobresalir de los demás. En realidad un hacker no es bueno, ni malo, ni cracker, ni gray hat, ni white hat, esos términos insulsos nunca se me hicieron pertinentes, simplemente cada uno es lo que es, en ese preciso instante de su vida.
Dicho lo anterior, aunque gogleen y pregunten cómo ser un hacker, la respuesta desde mi punto de vista es que nadie les puede contestar con una guía o con un Manual de Carreño.
Ahora bien, aprender hacking es algo que sí se puede trabajar, aunque claro, también requiere su esfuerzo. Aprender hacking no es fácil, ni se asimila con un solo tutorial. Necesitarás horas de trabajo y aprendizaje, muchos ensayos, errores y sobre todo lidiar con la frustración.
Una de las áreas donde podemos aprender mucho del hacking, es el pentesting. Sin irnos a los tecnicismos, el pentesting tiene como objetivo realizar penetraciones a sistemas específicos para saber sus debilidades, explotarlas y tal vez conocer la manera de remediarlas. Lo anterior puede ser lo más aproximado a lo que la gente quiere aprender sobre hackear una computadora; sin embargo, a pesar de que existen muchas herramientas útiles para automatizar ciertas tareas, tengan por seguro que difícilmente va a existir un software que hackea Facebook en dos clics. Como lo mencioné, conocimientos profundos sobre sistemas operativos, programación, redes, etc. son necesarios para desenvolvernos en dicho campo.
Lo mejor para mostrar cómo es el pentesting es con un ejemplo «real»; un tanto técnico pero explicado para que las personas en general sepan un poco de qué va este asunto del hacking, qué es lo que se hace, y cómo sería el proceso de comprometer una máquina en un escenario más o menos live action. Así que si desean saber sobre este mundo «oculto» posiblemente se vayan a encontrar con estos contextos un tanto extraños que verán a continuación:
Escenario Prueba de Penetración
¿Por qué es necesario realizar un Penetration Test?
Existen muchos casos donde las organizaciones sufren incidentes que podrían haberse evitado si los mecanismos de protección hubieran sido reforzados en su momento. El challenge recurrente a los mecanismos de protección debe ser una tarea proactiva permitiendo encontrar las vulnerabilidades dentro de los mismos y brindar una solución antes de que un pirata aproveche una debilidad.
«Dibujaremos» nuestro escenario. Va a ser extremadamente simple pero ustedes verán por sí mismos lo que esa simpleza involucra. Mi máquina atacante tendrá una dirección IP 192.168.1.2/24 y la máquina víctima una dirección 192.168.1.3/24; en networking básico una IP es la forma de direccionamiento de una entidad que nos ayuda a comunicarnos con otras entidades de una red. Aquí tendremos comunicación directa con la máquina víctima, por lo que solamente nos preocuparemos de la explotación. Entonces:
Atacante Fernando (kali): 192.168.1.2
Víctima: 192.168.1.3
Un Penetration Test comprende múltiples etapas con diferentes tipos de actividades en distintos ámbitos y entornos. La profundidad con que se lleven a cabo las actividades dependerá de ciertos factores, entre los que se destaca el riesgo que puede generar hacia la victima alguno de los métodos que se apliquen durante la evaluación.
A grandes rasgos se llevan a cabo las siguientes fases:
Fase de reconocimiento/enumeración: Posiblemente, esta sea una de las etapas que más tiempo demande. Utilizando la información obtenida de los puertos o servicios de la máquina víctima, se buscan posibles vectores de ataque. En esta etapa también se incluyen los escaneos de vulnerabilidades que permitirán definir qué podemos explotar en el sistema para entrar en él.
Fase de acceso: Se realiza el acceso al sistema. Esta tarea se logra a partir de la explotación de aquellas vulnerabilidades detectadas que fueron aprovechadas para comprometer el medio. Aquí podríamos incluir un punto muy importante que se refiere a la escalación de privilegios, brevemente explicado, consiste en lograr que una vez dentro del sistema, nuestros permisos de usuario sean del nivel de un administrador o root. Esto es vital, puesto que podríamos estar accediendo con un usuario que no posee los suficientes privilegios y de poco o nada habrá servido nuestra penetración.
La escalación de privilegios es un tema bastante complejo y para efectos prácticos de este escenario lo mencionaremos de forma casi implícita.
Hay diversas herramientas que pueden ser de gran utilidad para ejecutar las fases mencionadas, pero siempre implicando el conocimiento profundo de lo que estamos realizando. Un sistema operativo que contiene una suite muy completa para confeccionar pentestings es Kali Linux, esta distro ya provee al usuario todas las tools necesarias para nuestro trabajo.
Comenzando la recopilación y reconocimiento de nuestra víctima, un scanner de puertos nos podría ayudar a ver, qué servicios están corriendo sobre nuestro target, y potencialmente puedan ser usados para intentar una explotación. NMAP es una herramienta de gran versatilidad, pues nos permite justamente conocer los puertos y/o servicios abiertos en una máquina, además de proveernos scripts que nos permiten conocer vulnerabilidades de los sistemas involucrados. Para no hacer tan largo el ejemplo, sabemos de antemano que nuestra víctima corre un protocolo conocido como SMB Server Message Block, el cual es un protocolo de file sharing, impresoras, etc. entre computadoras del sistema operativo Microsoft Windows y que (des) afortunadamente tiene diversas vulnerabilidades.
Al ejecutar NMAP desde nuestra máquina atacante apuntando a la dirección IP de la víctima obtenemos lo siguiente:
Se estarán preguntando seguramente qué significa todo ese output de NMAP que parece ininteligible:
Esta línea nos dice que se ejecutará nmap desde nuestro atacante kali, sobre la dirección víctima en el puerto 445, que es el puerto de SMB y además incluiremos un script llamado smb-vuln*. Básicamente le decimos a NMAP que pruebe si la máquina objetivo es vulnerable a los exploits conocidos sobre SMB, regresándonos un resultado de «State: Vulnerable» si el checkup de nmap resulta positivo. Lo cual no quiere decir que el exploit pueda funcionar al 100%, pero es una muy buena referencia para dirigir nuestros ataques más adelante.
Estas líneas nos detallan más lo descrito con anterioridad, smb-vuln-ms08-067 es una vulnerabilidad de SMB en diversas versiones de Windows que nos permite la inyección de código remoto y por ende un muy probable acceso al sistema. De hecho, hasta nos provee referencias para saber más sobre la vulnerabilidad y muy posiblemente la manera de utilizarla. El sistema parece ser vulnerable a este exploit, (y de hecho lo es para no extendernos en demasía) por lo que procederemos a verificar cómo es que se puede aprovechar para entrar a nuestra víctima.
Una de las bases de datos de vulnerabilidades más famosas en Internet es exploit database. Contiene diversos exploits sobre una gran variedad de sistemas pero lo mejor, es que cada uno de ellos ha sido verificado y analizado previamente para su uso. Por supuesto todo con fines de auditoría y nunca dañando a terceros.
Bueno, bueno, bueno… lo que tenemos aquí resulta mucho más esotérico que el output de nmap ¿no es verdad? Lo que está arriba es un exploit particular para SMB en ciertas versiones de Windows, escrito en el lenguaje Python que efectúa una técnica conocida como Buffer overflow y con el «input correcto» nos puede devolver una shell de la víctima a nuestra máquina atacante. Por supuesto que lo que acabo de escribir sigue siendo muy esotérico para el público no perteneciente al gremio y por ello vuelvo a recalcar: el hacking es un campo muy extenso y requiere su tiempo para comenzar a entenderlo o aplicarlo.
Trataré de explicar lo que sucede aquí. Ese código en Python nos permite hacer inyección de código sobre la víctima. Una inyección de código es, muy simplificadamente, que la víctima efectué las operaciones que deseemos, por ejemplo listar archivos, bajar ficheros, modificar permisos o tal vez que podamos conectarnos a ella en su totalidad o mejor todavía, que la víctima se conecte a nosotros. Muchas veces eso es lo que se busca en un pentest, que la víctima sea la que conecte con nuestra máquina, para obtener una línea de comandos abierta (el command prompt o la pantalla negra con letras raras de Windows), que nos ayude a instalarnos dentro de ella, y para ello mandamos un payload o una «carga», que se conoce como reverse shell.
Si se fijan, en el exploit vienen unos comentarios medio implícitos, sobre cómo podrías generar tu reverse shell para ejecutarlo junto con el exploit:
Esta última línea es la que nos ayudará a tener ese shell. MSFVENOM es otra herramienta que nos ayuda en esta faena, y que no ahondaré más en describir, porque si de por sí ya es complejo el asunto, no vale la pena hacerlo aún más.
Vamos a generar nuestra shell con ese comando y quedaría de esta manera:
Le decimos a msfvenom genere una shell donde la víctima se conecte a la dirección 192.168.1.2 en el puerto 443, además deberá estar en formato tipo Python, (el lenguaje del exploit), y así podremos añadirlo con facilidad:
Sustituimos en el exploit la parte de shellcode, con nuestro propio output generado en msfvenom, y estaremos listos para probar si en realidad nos va a traer una conexión de la víctima hacia nosotros teniendo acceso a ella.
Como mencioné la idea es que la víctima se conecte con nosotros, ¿pero ustedes creen que solamente ejecutando el exploit eso va a suceder? Si recuerdan, en la generación del shellcode con msfvenom puse como parámetros la IP del atacante y el puerto 443. Al ejecutar el exploit, el atacante debe estar listo, escuchando sobre ese puerto para tomar cualquier conexión que provenga de la víctima. Si ese puerto está cerrado, entonces aunque el exploit sea exitoso, no habrá ninguna conexión y todo será en vano.
¿De qué manera podemos ponernos en modo listening a la espera de que nuestra víctima sea quien llame a nuestra puerta?
Una de las maneras es utilizando un handler de Metasploit Framework corriendo en nuestra máquina atacante. Nuevamente, para efectos prácticos, solo veremos a Metasploit como un oyente y eso nos bastará para nuestro propósito:
Utilizando Metasploit ya tenemos lista una herramienta de escucha para cualquier conexión que venga desde el puerto 443, y sabemos de antemano que nuestro exploit va a ir por ese número, por lo que solo queda ejecutarlo y observar qué sucede:
Al ejecutarlo, parece indicarnos que todo ha salido como esperamos y si regresamos a Metasploit para saber lo que ha pasado con nuestro listener tendremos lo siguiente:
Voilá. El listener nos devolvió una shell con conexión inversa y lo mejor de todo es que nos hemos traído una shell como usuarios con privilegios de «administrador». Por lo que incluso la escalación de privilegios fue hecha de manera paralela al exploit. Esto sucedió específicamente porque atacamos un servicio en nuestra víctima que corría ya con altos privilegios y al vulnerarlo, esos privilegios pasan hacia nosotros. Pero esto simplemente fue en este caso concreto. Normalmente muchos servicios vulnerables no corren con privilegios de administrador, por lo que el siguiente paso sería averiguar la manera de escalar los privilegios una vez adentro.
Conclusiones
Hagamos un recuento de los daños.
El motivo de mi post era ilustrar un pentest muy simple para que se dieran cuenta lo que involucra aprender hacking. Así es como se ve un panorama cuando tratamos de vulnerar un sistema. Si bien parece complicado, con práctica y estudio todo se puede lograr sin problema.
En el escenario, el resultado final fue obtener una línea de comandos en Windows con los máximos privilegios, por lo que la máquina queda totalmente comprometida y a nuestra merced. Para ello, mostramos cómo a través de identificar un servicio vulnerable (SMB) y posteriormente buscar un exploit, pudimos ejecutarlo en un lenguaje de programación especifico, y modificarlo para nuestro objetivo en concreto.
Quizá este post deje muchas más preguntas que respuestas, y deje más honda la confusión que la claridad pero esa fue mi verdadera intención: Manténganse siempre curiosos y creativos, siempre hambrientos y siempre descubran nuevos horizontes por más insólitos que luzcan. Tal vez algún día a ustedes también les llamen hackers.
Happy hacking!