Cómo obtener información de un sitio web con técnicas de análisis pasivo. Cómo obtener posibles vulnerabilidades (ficheros con usuarios, carpetas sensibles, ficheros con contraseñas, etc.). Otro análisis que forma parte de Information Gathering, para el Hacking Ético, es la obtención de información de un sitio web: tecnologías utilizadas, encabezados, etc. Usaremos sólo técnicas pasivas para que el procedimiento sea legal y no requiera de la autorización explícita de la empresa/organización propietaria del dominio.
- Requisitos para hacer Information Gathering.
- Analizando el código fuente HTML de la página web.
- whatweb.
- pagodo.
- Obtener de forma rápida el posible sistema operativo (Windows/Linux/MacOS, Solaris) de un sitio web con ping.
- Obtener información del servidor de un sitio web visualizado los encabezados (headers) con curl, lynx y wget.
- Obtener tecnologías empleadas en sitio web con plugin para Firefox y Chrome.
Requisitos para hacer Information Gathering
Aunque no es un requisito imprescindible, sí que es recomendable, para todas las técnicas de Hacking Ético, disponer de una máquina virtual con Kali Linux, distribución diseñada para este cometido: Penetration Testing, Information Gathering, etc.. Cuenta con numerosas herramientas para estos propósitos y en el modo gráfico las incluye agrupadas por 13 categorías: Information Gathering, Vulnerability Analysis, Web Application Analysis, Database Assessment, Password Attacks, Reverse Enginieering, Explotation Tools, Sniffing & Spoofing, Post Explotation, Forensic, Reporting Tools y Social Engineering Tools.
En el siguiente enlace mostramos un tutorial donde indicamos cómo desplegar una máquina virtual Kali Linux en un entorno de virtualización VMware ESXi:
Si no podemos contar con una máquina Kali Linux, tendremos que instalar las herramientas que mostramos a continuación para hacer Information Gathering, y dentro de este grupo de técnicas de Hacking Ético, para obtener información de un sitio web.
Analizando el código fuente HTML de la página web
Una forma rápida y sin necesidad de usar software es visualizar el código fuente de alguna de las páginas del sitio web. Esto podremos hacerlo desde cualquier navegador, accediendo al sitio web y pulsando en «Ver código fuente de la página»:
Analizando el código HTML podremos obtener información sobre el CMS usado (Joomla, WordPress, Drupal, OSCommerce, …), sobre la versión de JavaScript empleada, jQuery, plugin, etc.
También podremos hacerlo por comando, buscando, por ejemplo, la palabra «wordpress». Usando curl:
1 |
curl -s https://proyectoa.com | grep wordpress |
Si nos devuelve texto podría querer decir que la web está hecha con WordPress.
Usando wget (sin que decargue los ficheros HTML del sitio web):
1 |
wget -qO- http://proyectoa.com | grep wordpress |
whatweb
La herramienta whatweb, que viene instalada en Kali Linux, nos proporciona información interesante para un dominio (posible sitio web). Usaremos el parámetro aggressive a valor 1, para que no haga análisis activo. Ejecutaríamos el comando:
1 |
whatweb --aggression 1 -v ajpdsoft.com |
Devolverá toda la información del sitio web: estado, IP, país, plugins, headers, meta-author, meta-generator, CMS, etc.:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
WhatWeb report for http://ajpdsoft.com Status : 301 Moved Permanently Title : <None> IP : 82.98.136.69 Country : SPAIN, ES Summary : HTTPServer[HTTPd], RedirectLocation[https://ajpdsoft.com/] Detected Plugins: [ HTTPServer ] HTTP server header string. This plugin also attempts to identify the operating system from the server header. String : HTTPd (from server string) [ RedirectLocation ] HTTP Server string location. used with http-status 301 and 302 String : https://ajpdsoft.com/ (from location) HTTP Headers: HTTP/1.1 301 Moved Permanently Date: Mon, 30 May 2022 19:02:50 GMT Content-Type: text/html; charset=utf-8 Content-Length: 0 Connection: close Location: https://ajpdsoft.com/ Server: HTTPd WhatWeb report for https://ajpdsoft.com/ Status : 200 OK Title : Proyecto AjpdSoft IP : 82.98.136.69 Country : SPAIN, ES Summary : Cookies[lang], HTTPServer[HTTPd], Meta-Author[Proyecto AjpdSoft], MetaGenerator[Proyecto AjpdSoft], probably PHPNuke[Contactar,Content,Downloads,Encyclopedia,Foros,Historia,News,Politica_Cookies,Quienes_Somos,Search,Stories_Archive,Top,Topics], Script[text/javascript] Detected Plugins: [ Cookies ] Display the names of cookies in the HTTP headers. The values are not returned to save on space. String : lang [ HTTPServer ] HTTP server header string. This plugin also attempts to identify the operating system from the server header. String : HTTPd (from server string) [ Meta-Author ] This plugin retrieves the author name from the meta name tag - info: http://www.webmarketingnow.com/tips/meta-tags-uncovered.html #author String : Proyecto AjpdSoft [ MetaGenerator ] This plugin identifies meta generator tags and extracts its value. String : Proyecto AjpdSoft [ PHPNuke ] PHP-Nuke is a free CMS Certainty : probably Module : Contactar,Content,Downloads,Encyclopedia,Foros,Historia,News,Politica_Cookies,Quienes_Somos,Search,Stories_Archive,Top,TopicsERROR Logging failed: https://ajpdsoft.com/ - undefined method `ertainty_to_words' for #<LoggingVerbose:0x000055e8616e9d90 @f=#<IO:<STDOUT>>> |
Si queremos que nos muestre la información más resumida, quitaremos el parámetro -v:
1 |
whatweb --aggression 1 ajpdsoft.com |
Devolviendo:
1 2 |
http://ajpdsoft.com [301 Moved Permanently] Country[SPAIN][ES], HTTPServer[HTTPd], IP[82.98.136.69], RedirectLocation[https://ajpdsoft.com/] https://ajpdsoft.com/ [200 OK] Cookies[lang], Country[SPAIN][ES], HTTPServer[HTTPd], IP[82.98.136.69], Meta-Author[Proyecto AjpdSoft], MetaGenerator[Proyecto AjpdSoft], probably PHPNuke[Contactar,Content,Downloads,Encyclopedia,Foros,Historia,News,Politica_Cookies,Quienes_Somos,Search,Stories_Archive,Top,Topics], Script[text/javascript], Title[Proyecto AjpdSoft] |
En este ejemplo lo hemos ejecutado para el dominio sin indicar HTTP o HTTPS, si lo ejecutamos para HTTPS:
1 |
whatweb --aggression 1 https://ajpdsoft.com |
Nos devuelve estos datos:
1 |
https://ajpdsoft.com [200 OK] Cookies[lang], Country[SPAIN][ES], HTTPServer[HTTPd], IP[82.98.136.69], Meta-Author[Proyecto AjpdSoft], MetaGenerator[Proyecto AjpdSoft], probably PHPNuke[Contactar,Content,Downloads,Encyclopedia,Foros,Historia,News,Politica_Cookies,Quienes_Somos,Search,Stories_Archive,Top,Topics], Script[text/javascript], Title[Proyecto AjpdSoft] |
En este caso, para el HTTP vemos que devuelve [301 Moved Permanently] y para el HTTPS devuelve [200 OK]. Esto podría indicar que el sitio web tiene redirigido el HTTP al HTTPS.
pagodo
pagodo es una herramienta desarrollada en Python que permite obtener mucha información interesante de un dominio/sitio web. Las categorías que analiza:
- Footholds.
- File Containing Usernames.
- Sensitives Directories.
- Web Server Detection.
- Vulnerable Files.
- Vulnerable Servers.
- Error Messages.
- File Containing Juicy Info.
- File Containing Passwords.
- Sensitive Online Shopping Info.
- Network or Vulnerability Data.
- Pages Containing Login Portals.
- Various Online devices.
- Advisories and Vulnerabilities.
En Kali necesitaremos instalarla. Para ello seguiremos los siguientes pasos.
En primer lugar clonaremos el repositorio GitHub de pagodo, que se encuentra en la URL:
Accederemos a la carpeta /opt, y clonaremos el repositorio:
1 2 |
cd /opt sudo git clone https://github.com/opsdisk/pagodo |
pagodo necesita algunas librerías adicionales de Python, para instalarlas accederemos a la carpeta de pagodo y ejecutaremos el siguiente comando:
1 2 |
cd /pagodo pip3 install -r requirements.txt |
Dado que en el fichero requirements.txt se incluyen las librerías necesarias para pagodo:
beautifulsoup4==4.10.0
yagooglesearch==1.6.0
requests==2.27.1
Nota: si queremos instalar pagodo en un entorno virtual Python, ejecutaremos los siguientes comandos:
1 2 3 4 5 |
git clone https://github.com/opsdisk/pagodo.git cd pagodo virtualenv -p python3 .venv source .venv/bin/activate pip3 install -r requirements.txt |
Una vez instalado pagodo, ejecutaremos el siguiente comando para mostrar las opciones posibles:
1 |
sudo python3 pagodo.py -h |
h, –help | show this help message and exit |
-g | GOOGLE_DORKS_FILE File containing Google dorks, 1 per line |
-d DOMAIN | Domain to scope the Google dork searches. Not required |
-i MINIMUM_DELAY_BETWEEN_DORK_SEARCHES_IN_SECONDS | Minimum delay (in seconds) between a Google dork search. Default: 37 |
-x MAXIMUM_DELAY_BETWEEN_DORK_SEARCHES_IN_SECONDS | Maximum delay (in seconds) between a Google dork search. Default: 60 |
-l | Disable SSL/TLS validation. Sometimes required if using an HTTPS proxy with self-signed certificates |
-m MAX_SEARCH_RESULT_URLS_TO_RETURN_PER_DORK | Maximum results to return per dork. Default 100 |
-p PROXIES | Comma separated string of proxies to round-robin through. Example: https://myproxy:8080,socks5h://127.0.0.1:9050,socks5h://127.0.0.1:9051 – The proxy scheme must confrom per the Python requests library: https://docs.python-requests.org/en/master/user/advanced/#proxies See https://github.com/opsdisk/yagooglesearch for more information |
-o | Save JSON dictionary to pagodo_results_<TIMESTAMP>.json file. Contains more information than pagodo_results_<TIMESTAMP>.txt |
-s | Save any URLS found for a dork to the pagodo_results_<TIMESTAMP>.txt file |
-v VERBOSITY | Verbosity level (0=NOTSET, 1=CRITICAL, 2=ERROR, 3=WARNING, 4=INFO, 5=DEBUG). Default: 4 |
Antes de lanzar la herramienta pagodo, revisaremos que tenemos la carpeta /opt/pagodo/dorks, que contiene ficheros con palabras clave útiles para rastrear. Pagodo viene con varios de estos ficheros: advisories_and_vulnerabilities.dorks, all_google_dorks.json, all_google_dorks.txt, error_messages.dorks, files_containing_juicy_info.dorks, files_containing_passwords.dorks, files_containing_usernames.dorks, footholds.dorks, network_or_vulnerability_data.dorks, pages_containing_login_portals.dorks
sensitive_directories.dorks, sensitive_online_shopping_info.dorks, various_online_devices.dorks
vulnerable_files.dorks, vulnerable_servers.dorks, web_server_detection.dorks.
Un ejemplo de lo que contienen estos ficheros:
1 2 3 4 5 6 7 |
intitle:index.of people.lst inurl:passlist.txt intitle:"index of" intext:globals.inc filetype:reg reg +intext:"defaultusername" +intext:"defaultpassword" filetype:url +inurl:"ftp://" +inurl:"@" filetype:pem intext:private inurl:"wvdial.conf" intext:"password" |
Estos ficheros dorks contienen palabras y frases típicas de fallos de seguridad expuestos en los sitios webs.
Para hacer un primer análisis del sitio web ajpdsoft.com, usando uno de estos ficheros dorks, por ejemplo vulnerable_servers.dorks, ejecutaremos el siguiente comando:
1 |
sudo python3 pagodo.py -d ajpdsoft.com -g dorks/vulnerable_servers.dorks |
La herramienta pagodo iniciará el análisis, en principio es pasivo porque realiza las búsquedas en Google y no en el sitio web indicado. También hay que tener en cuenta que el proceso puede tardar bastante tiempo, dado que pagodo hace pausas de varios segundos o minutos (aleatorios), para que Google no bloquee la IP por considerarla spam.
En algunos casos la herramienta puede tardar días en realizar el análisis, dado que hará pausas (sleeping) de una hora o más, para evitar bloqueos de Google:
El proceso de análisis concluirá y mostrará el número de resultados encontrados:
Obtener de forma rápida el posible sistema operativo (Windows/Linux/MacOS, Solaris) de un sitio web con ping
Una forma fácil y rápida de saber si el sistema operativo de un servidor es Windows, Linux, FreeBSD, HP-UX, MacOS, NetBSD, OpenBSD, Solaris, Stratus, SunOS, Ultrix, etc., es usar el comando ping. En base al TTL (Time To Live) obtenido, se puede sabar el SO.
Cuando hacemos un ping a un dispositivo, obtendremos, entre otros datos, el TTL:
A continuación mostramos la tabla con la información del TTL por Sistema Operativo. Algunos TTL de diferentes sistemas operativos coinciden, colocamos al principio los más usados: Linux, Windows, MacOS:
SO | Versión | TTL |
Linux | 2.0.x kerne y Red Hat 9 | 64 |
Linux | 2.2.14, 2.4 kernel | 255 |
Windows | NT 4.0, NT 4.0 SP6+, NT 4 WRKS SP 3, SP 6a, NT 4 Server SP4, ME, 98 SE, 2000 pro, Server 2003, XP, Vista, 7, Server 2008, 10 | 128 |
Windows | NT 3.51, NT 4.0 SP5-, 98, 95 | 32 |
MacOS | X (10.5.6) | 64 |
AIX | 3.2 y 4.1 | 255 |
Cisco | 254 | |
OpenBSD | 2.6 y 2.7 | 255 |
Solaris | 2.5.1, 2.6, 2.7, 2.8 | 255 |
Solaris | 2.8 | 64 |
SunOS | 5.7 | 255 |
Stratus | TCP_OS | 255 |
NetBSD | 255 | |
Juniper | 64 | |
HP-UX | 255 | |
FreeBSD | 3.4, 4.0 | 255 |
FreeBSD | 5 | 64 |
Si hacemos un ping a un PC/Servidor y nos devuelve un TTL de 128 lo más probable es que se trate de un equipo Windows y si nos devuelve un TTL de 64 lo más habitual es que se trate de un PC con Linux:
Lógicamente si el TTL coincide con el de varios sistemas operativos, con este método no podremos garantizar a ciencia cierta que se trate de uno de ellos. Pero es un método rápido para, al menos, hacernos una idea, dado que los SO habituales son MacOS, Linux y Windows.
Obtener información del servidor de un sitio web visualizado los encabezados (headers) con curl, lynx y wget
Seguimos con los métodos para obtener información sobre las tecnologías empleadas por un sitio web. Visualizando los encabezados HTTP que devuelve el sitio web, a veces, podremos obtener información sobre el aplicativo web que se utiliza, el sistema operativo y otros datos.
Para obtener los encabezados del sitio web ajpdsoft.com (para el HTTP) usaremos el siguiente comando:
1 |
curl -I ajpdsoft.com |
Que devolverá:
1 2 3 4 5 6 7 |
HTTP/1.1 301 Moved Permanently Date: Tue, 31 May 2022 12:00:19 GMT Content-Type: text/html; charset=utf-8 Content-Length: 0 Connection: keep-alive Location: https://ajpdsoft.com/ Server: HTTPd |
Si lo ejecutamos para el HTTPS del mismo sitio web:
1 |
curl -I https://ajpdsoft.com |
Vemos que nos devuelve estos otros datos:
1 2 3 4 5 6 7 8 9 10 |
HTTP/2 200 date: Tue, 31 May 2022 12:02:10 GMT content-type: text/html set-cookie: lang=spanish; expires=Wed, 31-May-2023 12:01:57 GMT vary: Accept-Encoding cache-control: max-age=0, public expires: Tue, 31 May 2022 12:01:57 GMT age: 13 server: HTTPd accept-ranges: bytes |
Otra herramienta que devuelve los encabezados (headers) de una web es lynx, aunque en Kali Linux no viene instalada. Se instala de forma sencilla con:
1 |
sudo apt install lynx |
La incluimos junto con curl porque devuelve los mismos resultados:
1 |
lynx -head -dump https://ajpdsoft.com |
Aunque en estos ejemplos no ha devuelto encabezados con mucha información interesante, en este otro:
1 |
lynx -head -dump http://comunidadbiker.com |
devuelve la siguiente información:
1 2 3 4 5 6 7 8 9 |
HTTP/1.1 200 OK Date: Tue, 31 May 2022 12:13:06 GMT Server: Apache/2.2.22 (Ubuntu) X-Powered-By: PHP/5.3.10-1ubuntu3.13 Set-Cookie: lang=spanish; expires=Wed, 31-May-2023 12:13:06 GMT Vary: Accept-Encoding Connection: close Content-Type: text/html X-Pad: avoid browser bug |
Analizamos los encabezados y comprobamos que podría tratarse de un servidor con el sistema operativo Ubuntu, y con el servidor de aplicaciones web Apache, versión 2.2.22. Incluso devuelve la versión de PHP, la 5.3.10-1ubuntu3.13. Estos datos podrían ser usados por un atacante para buscar posibles vulnerabilidades de la versión de software empleada (Ubuntu, Apche, PHP). Sólo tendría que buscar posibles vulnerabilidades en algún sitio web y explotarlas.
Por supuesto, podremos emplear también el comando weget, que también nos obtendrá los encabezados de un sitio web:
1 |
wget -q --server-response http://comunidadbiker.com |
Obtener tecnologías empleadas en sitio web con plugin para Firefox y Chrome
Existen plugin para Mozilla Firefox y Google Chrome que permiten obtener información del sitio web visitado. Sólo tendremos que instarlos en el navegador, como por ejemplo Wappalizer: