---
title: "Velociraptor — Forensique & Collecte Distante"
domain: monitoring
subdomain: velociraptor
type: snippet
tags: [velociraptor, forensics, dfir, hunting, vql, endpoint, soc]
difficulty: intermediate
status: stable
updated: "Fri Jun 19 2026 00:00:00 GMT+0000 (Coordinated Universal Time)"
---
## Présentation

Velociraptor est un outil de **forensique et de chasse aux menaces (threat hunting)** sur les endpoints. Il permet de :
- Collecter des artefacts forensiques à distance (RAM, fichiers, registry, logs)
- Exécuter des requêtes VQL sur des milliers d'endpoints simultanément
- Répondre aux incidents sans déplacement physique

---

## Architecture

```
Server Velociraptor  (port 8000/8889)
    ↕  TLS mutuellement authentifié
Client Velociraptor  (agent sur chaque endpoint)
    → Windows, Linux, macOS
```

---

## Déploiement — Serveur

```bash
# Télécharger le binaire
wget https://github.com/Velocidex/velociraptor/releases/download/v0.73/velociraptor-v0.73-linux-amd64

# Générer la configuration
./velociraptor config generate -i
# → Renseigner : hostname, port, certificats auto-générés

# Lancer le serveur
./velociraptor --config server.config.yaml frontend -v

# Créer un admin
./velociraptor --config server.config.yaml user add admin --role administrator

# Accès GUI : https://localhost:8889
```

```yaml
# docker-compose.yml
services:
  velociraptor:
    image: wlambert/velociraptor:latest
    ports:
      - "8000:8000"   # Agents
      - "8889:8889"   # GUI
    volumes:
      - ./server.config.yaml:/etc/velociraptor/server.config.yaml
      - velociraptor_data:/var/lib/velociraptor
    command: frontend -v

volumes:
  velociraptor_data:
```

---

## Déploiement Agent (client)

```bash
# Générer le MSI Windows depuis le serveur
./velociraptor --config server.config.yaml config repack \
  --exe velociraptor-windows.exe client.config.yaml velociraptor-client.exe

# Installer sur Windows (admin)
velociraptor-client.exe service install

# Linux — service systemd
./velociraptor --config client.config.yaml client -v

# Déploiement masse via GPO (Windows)
# MSI téléchargeable depuis la GUI → Déploiement > Agent Installers
```

---

## VQL — Velociraptor Query Language

VQL est similaire à SQL mais orienté artefacts systèmes.

### Structure
```sql
SELECT Column1, Column2
FROM plugin(arg1='value', arg2='value')
WHERE condition
LIMIT 100
```

### Requêtes utiles

```sql
-- Processus en cours d'exécution
SELECT Pid, Name, CommandLine, Username, CreateTime
FROM pslist()
ORDER BY CreateTime DESC

-- Connexions réseau actives
SELECT Pid, FamilyString, TypeString,
       Laddr.IP, Laddr.Port, Raddr.IP, Raddr.Port, Status
FROM netstat()
WHERE Status = "ESTABLISHED"

-- Fichiers modifiés récemment (< 24h)
SELECT FullPath, Mtime, Atime, Size
FROM glob(globs='C:/Users/**')
WHERE Mtime > now() - 86400
  AND NOT IsDir

-- Clés Run (persistance registry)
SELECT Key.FullPath, Name, Data
FROM read_reg_key(globs="HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run/**")

-- Services Windows
SELECT Name, DisplayName, State, PathName, StartMode
FROM wmi(query="SELECT * FROM Win32_Service WHERE State='Running'")
WHERE PathName =~ "Temp|AppData|ProgramData"

-- Connexions DNS récentes (cache)
SELECT Name, Data.Strings
FROM read_reg_key(globs="HKLM/SYSTEM/CurrentControlSet/Services/Dnscache/Parameters/Cache/**")

-- Scheduled Tasks suspectes
SELECT Name, Command, Arguments, UserId
FROM scheduled_tasks()
WHERE UserId != "SYSTEM" AND UserId != "NT AUTHORITY"

-- Prefetch (exécutions récentes Windows)
SELECT Name, Mtime, Atime, Hash
FROM glob(globs="C:/Windows/Prefetch/*.pf")
ORDER BY Mtime DESC
LIMIT 20
```

---

## Artefacts — Collections prédéfinies

```
# Artefacts Windows essentiels (GUI → Hunt Manager)
Windows.KapeFiles.Targets         → Collecte complète KAPE (logs, artefacts)
Windows.EventLogs.Evtx            → Tous les event logs Windows
Windows.Forensics.Prefetch        → Historique d'exécution
Windows.Forensics.SRUM            → Historique réseau/CPU par process
Windows.Registry.UserAssist       → Applications récemment lancées
Windows.Persistence.PermanentWMI  → Persistence WMI
Windows.Sys.AllUsers              → Comptes locaux
Windows.Network.NetstatEnriched   → Netstat + process associé

# Artefacts Linux
Linux.Sys.Users                   → /etc/passwd, /etc/shadow
Linux.Sys.Crontab                 → Crontabs système et utilisateurs
Linux.Forensics.LastLogin         → lastlog, wtmp, btmp
Linux.Network.Netstat             → Connexions actives
Linux.Sys.BashHistory             → Historique bash par utilisateur
```

---

## Hunts — Chasse sur tout le parc

```bash
# Via la GUI :
# Hunt Manager → New Hunt → Sélectionner artefact → Launch

# Cas d'usage courants :
# 1. Chercher un IOC sur tout le parc
#    Artefact : Windows.Search.FileFinder
#    Paramètre : SearchFilesGlob = **/*mimikatz*

# 2. Vérifier si un processus tourne quelque part
#    VQL : SELECT * FROM pslist() WHERE Name =~ "cobaltstrike"

# 3. Collecter les event logs sur tous les endpoints
#    Artefact : Windows.EventLogs.Evtx

# 4. Chercher des clés de registry suspectes
#    Artefact : Windows.Registry.NTUser
```

---

## Collecte de mémoire

```bash
# Dump mémoire via Velociraptor
# Artefact : Windows.Memory.Acquisition
# → Génère un fichier .raw téléchargeable depuis le serveur

# Analyse avec Volatility ensuite
volatility3 -f memory.raw windows.pslist
volatility3 -f memory.raw windows.netscan
volatility3 -f memory.raw windows.malfind
```

---

## Intégration SOC

```
Wazuh alerte → Shuffle workflow
  → Shuffle appelle API Velociraptor
  → Velociraptor collecte artefacts sur l'endpoint
  → Résultats stockés sur le serveur Velociraptor
  → Transfert vers TheHive (attachments)
  → Analyste SOC consulte les preuves
```

```python
# API Velociraptor (Python)
import requests

# Lancer une collecte sur un client
url = "https://velociraptor:8889/api/v1/StartFlowOnClient"
headers = {"Authorization": "Bearer API_KEY"}
payload = {
    "client_id": "C.abcdef1234567890",
    "flow": {
        "artifacts": ["Windows.KapeFiles.Targets"],
        "parameters": {"request": {"env": [{"key": "Device", "value": "C:"}]}}
    }
}
r = requests.post(url, json=payload, headers=headers, verify=False)
flow_id = r.json()["flow_id"]
```
