Communication Inter-Processus (IPC) Windows
Introduction
La communication inter-processus (IPC) permet a des processus distincts d'echanger des donnees et de se synchroniser. C'est un concept fondamental des systemes d'exploitation modernes, essentiel pour comprendre comment les applications communiquent entre elles.
Pourquoi l'IPC est important
Dans un systeme d'exploitation moderne:
- Les applications sont souvent composees de plusieurs processus
- Les services systeme doivent communiquer entre eux
- Les clients et serveurs echangent des donnees
- La securite depend de la bonne isolation des processus
Mecanismes IPC Windows
Vue d'Ensemble
| Mecanisme | Type | Portee | Performance | Cas d'usage |
|---|---|---|---|---|
| Pipes anonymes | Stream | Local | Haute | Parent-enfant |
| Named Pipes | Stream | Reseau | Haute | Services, RPC |
| Mailslots | Datagram | Reseau | Moyenne | Broadcast |
| Shared Memory | Direct | Local | Tres haute | Haute performance |
| Sockets | Stream/Datagram | Reseau | Variable | Applications reseau |
| COM/DCOM | RPC | Local/Reseau | Moyenne | Integration Windows |
| WMI | Query | Local/Reseau | Basse | Administration |
Pipes Anonymes
Definition
Un pipe anonyme est un canal de communication unidirectionnel entre deux processus lies (generalement parent-enfant).
Caracteristiques
- Communication unidirectionnelle
- Pas de nom, donc non accessible par d'autres processus
- Cree par le processus parent
- Herite par le processus enfant
- Pas d'acces reseau
Exemple en ligne de commande
dir | findstr "txt"
Le caractere | cree un pipe anonyme:
direcrit sa sortie dans le pipefindstrlit depuis le pipe- Les donnees passent de l'un a l'autre
Utilisation en programmation
// Pseudo-code simplifie
HANDLE hReadPipe, hWritePipe;
CreatePipe(&hReadPipe, &hWritePipe, NULL, 0);
// Le parent ecrit dans hWritePipe
// L'enfant lit depuis hReadPipe
Named Pipes (Pipes Nommes)
Definition
Un named pipe est un canal de communication bidirectionnel accessible par son nom, pouvant traverser le reseau.
Caracteristiques
- Communication bidirectionnelle
- Accessible par nom:
\\.\pipe\NomDuPipe - Peut traverser le reseau:
\\serveur\pipe\NomDuPipe - Supporte les ACL (Access Control Lists)
- Mode message ou byte stream
Format du nom
\\.\pipe\MonPipe (local)
\\serveur\pipe\MonPipe (distant)
\\127.0.0.1\pipe\MonPipe (localhost)
Enumeration des pipes
PowerShell:
# Lister tous les pipes actifs
Get-ChildItem \\.\pipe\
# Methode alternative
[System.IO.Directory]::GetFiles("\\.\pipe\")
Avec PipeList (Sysinternals):
pipelist.exe /accepteula
Pipes Windows courants
| Pipe | Service |
|---|---|
\pipe\lsarpc | LSA (Local Security Authority) |
\pipe\samr | SAM (Security Account Manager) |
\pipe\netlogon | Netlogon service |
\pipe\srvsvc | Server service |
\pipe\wkssvc | Workstation service |
\pipe\spoolss | Print Spooler |
Implications securite
Les named pipes sont utilises pour:
- Communication avec services Windows
- Remote Procedure Calls (RPC)
- Impersonation de tokens (risque de securite)
- Techniques d'escalade de privileges (Potato attacks)
Shared Memory (Memoire Partagee)
Definition
La memoire partagee permet a plusieurs processus d'acceder a la meme region de memoire physique.
Caracteristiques
- Acces direct a la memoire (tres rapide)
- Necessite synchronisation manuelle
- Local uniquement
- Implemente via File Mapping sous Windows
Creation en PowerShell
# Creer une zone de memoire partagee
Add-Type -TypeDefinition @"
using System;
using System.IO.MemoryMappedFiles;
public class SharedMem {
public static MemoryMappedFile Create(string name, long size) {
return MemoryMappedFile.CreateNew(name, size);
}
}
"@
$mmf = [SharedMem]::Create("MonPartage", 1024)
Cas d'usage
- Applications haute performance
- Partage de donnees volumineuses
- Communication entre processus locaux rapide
Sockets
Definition
Les sockets permettent la communication reseau entre processus, localement ou sur des machines distantes.
Types de sockets
| Type | Protocole | Caracteristiques |
|---|---|---|
| Stream | TCP | Connexion fiable, ordonnee |
| Datagram | UDP | Sans connexion, rapide |
| Raw | IP | Acces bas niveau |
Ports courants Windows
| Port | Service | Risque |
|---|---|---|
| 80 | HTTP | Attaques web |
| 443 | HTTPS | Attaques web |
| 445 | SMB | EternalBlue, lateral movement |
| 3389 | RDP | Brute force, BlueKeep |
| 5985 | WinRM HTTP | Remote execution |
| 5986 | WinRM HTTPS | Remote execution |
| 135 | RPC | DCOM attacks |
Exemple serveur TCP simple
# Serveur TCP basique
$listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Any, 8080)
$listener.Start()
Write-Host "Serveur en ecoute sur port 8080..."
$client = $listener.AcceptTcpClient()
$stream = $client.GetStream()
$reader = [System.IO.StreamReader]::new($stream)
$message = $reader.ReadLine()
Write-Host "Recu: $message"
$client.Close()
$listener.Stop()
COM et DCOM
COM (Component Object Model)
COM est un framework Microsoft pour creer des composants logiciels reutilisables.
Caracteristiques:
- Objets accessibles via interfaces
- Independant du langage de programmation
- Utilise par Office, Shell, Explorer
Exemple PowerShell:
# Creer un objet COM Excel
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.Quit()
DCOM (Distributed COM)
DCOM etend COM pour permettre la communication sur le reseau.
Risques de securite:
- Utilise pour le lateral movement en pentest
- Techniques: MMC20, ShellBrowserWindow, Excel DDE
- Port 135 (RPC) + ports dynamiques
WMI (Windows Management Instrumentation)
Definition
WMI est l'implementation Microsoft de WBEM (Web-Based Enterprise Management), permettant de gerer et interroger les systemes Windows.
Utilisation basique
# Information systeme
Get-WmiObject Win32_OperatingSystem
# Processus
Get-WmiObject Win32_Process | Select-Object Name, ProcessId
# Services
Get-WmiObject Win32_Service | Where-Object {$_.State -eq "Running"}
# A distance
Get-WmiObject -ComputerName "ServeurDistant" -Class Win32_OperatingSystem
WMI pour administration a distance
# Executer une commande a distance via WMI
Invoke-WmiMethod -ComputerName "Cible" -Class Win32_Process -Name Create -ArgumentList "cmd.exe /c whoami > C:\result.txt"
Implications securite
WMI est utilise pour:
- Administration legitime a distance
- Lateral movement (wmic /node:)
- Persistence via WMI Event Subscriptions
- Execution de code sans fichier sur disque
Tableau Comparatif
| Critere | Pipes | Named Pipes | Shared Memory | Sockets | COM/DCOM | WMI |
|---|---|---|---|---|---|---|
| Reseau | Non | Oui | Non | Oui | Oui | Oui |
| Performance | Haute | Haute | Tres haute | Variable | Moyenne | Basse |
| Securite | ACL | ACL | ACL | Firewall | DCOM config | WMI namespace |
| Complexite | Faible | Moyenne | Haute | Moyenne | Haute | Moyenne |
| Bidirectionnel | Non | Oui | Oui | Oui | Oui | Oui |
Securite des IPC
Vecteurs d'attaque courants
-
Named Pipes:
- Token impersonation
- Potato attacks (PrintSpoofer, JuicyPotato)
- C2 communication (Cobalt Strike)
-
DCOM:
- Lateral movement
- Remote code execution
-
WMI:
- Execution distante
- Persistence via subscriptions
- Reconnaissance
-
Sockets:
- Reverse shells
- Backdoors
- Exfiltration
Detection
Sysmon Events:
- Event ID 17: Pipe created
- Event ID 18: Pipe connected
PowerShell:
# Detecter les pipes suspects
Get-ChildItem \\.\pipe\ | Where-Object {
$_.Name -notmatch "^(lsarpc|samr|netlogon|srvsvc|wkssvc)"
}
Exercice Pratique
- Listez tous les named pipes actifs sur votre systeme
- Identifiez quel processus utilise chaque pipe
- Creez un serveur et client de pipe simple en PowerShell
- Testez la communication