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
CVE-2024-30088 — Preuve de concept d'exploitation pour CVE-2024-30088, une vulnérabilité TOCTOU du noyau Windows dans AuthzBasepCopyoutInternalSecurityAttributes permettant une écriture arbitraire via une condition de course pour l'élévation de privilèges. | Kitploit
Outils/GitHubGitHub/tykawaii98/cve-2024-30088
Escalade de PrivilègesAnalyse des VulnérabilitésExploitationExploitation de Binaires
GitHubtykawaii98/cve-2024-30088

CVE-2024-30088

Preuve de concept d'exploitation pour CVE-2024-30088, une vulnérabilité TOCTOU du noyau Windows dans AuthzBasepCopyoutInternalSecurityAttributes permettant une écriture arbitraire via une condition de course pour l'élévation de privilèges.

Voir le dépôt
2906146il y a 2 ansVé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

CVE-2024-30088

Bug :

  • Le bug se trouve dans la fonction AuthzBasepCopyoutInternalSecurityAttributes lorsque le noyau copie la structure _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION de l'objet token actuel vers le mode utilisateur, dont la structure est la suivante :
root@kitploit:~
//0x30 bytes (sizeof)
struct _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION
{
    ULONG SecurityAttributeCount;                                           //0x0
    struct _LIST_ENTRY SecurityAttributesList;                              //0x8
    ULONG WorkingSecurityAttributeCount;                                    //0x18
    struct _LIST_ENTRY WorkingSecurityAttributesList;                       //0x20
}; 
  • Lors de la copie de la SecurityAttributesList, le noyau configure la liste des structures SecurityAttribute *directement* sur le pointeur fourni par l'utilisateur. Ensuite, il appelle les fonctions RtlCopyUnicodeString et AuthzBasepCopyoutInternalSecurityAttributeValues pour copier le nom et la valeur de la structure SecurityAttribute, ce qui entraîne de multiples TOCTOU dans cette fonction.

  • Avec un simple thread concurrent pour modifier le pointeur Buffer du nom de l'attribut avant que RtlCopyUnicodeString ne soit appelé [*], je peux facilement obtenir une écriture à une adresse arbitraire avec une valeur fixe et une taille contrôlée.

  • Notez qu'il existe également d'autres façons de l'exploiter, mais dans mon cas, j'ai choisi d'utiliser RtlCopyUnicodeString.

Déclencher le bug :

  • Ce bug peut être facilement déclenché en appelant NtQueryInformationToken avec la classe TokenAccesInformation.

Les correctifs :

  • Le correctif utilise une variable locale sur la pile du noyau (v18 dans le bloc de code ci-dessous) comme tampon pour copier le(s) nom(s) de l'attribut de sécurité avant de le(s) réécrire dans le tampon utilisateur si l'appel système provient du mode utilisateur.
root@kitploit:~
    [...]
        p_SecurityAttributesList = &a1->SecurityAttributesList;
        Flink = a1->SecurityAttributesList.Flink;
        if ( Flink == p_SecurityAttributesList )
          return (unsigned int)inserted;
        v13 = a2 + 0x98;
        while ( 1 )
        {
          if ( (unsigned int)Feature_2516935995__private_IsEnabledDeviceUsage() )
          {
            inserted = AuthzBasepProbeAndInsertTailList(a2 + 8, v13 - 0x68);
            if ( inserted < 0 )
              goto LABEL_24;
          }
          else
          {
            [...]
          }
          ++*(_DWORD *)a2;
          *(_WORD *)(v13 - 56) = Flink[3].Flink;
          *(_DWORD *)(v13 - 52) = HIDWORD(Flink[3].Flink);
          *(_QWORD *)(v13 - 24) = v13 - 32;
          *(_QWORD *)(v13 - 32) = v13 - 32;
          *(_QWORD *)v13 = v13 - 8;
          *(_QWORD *)(v13 - 8) = v13 - 8;
          *(_QWORD *)(v13 - 48) = 0i64;
          *(_DWORD *)(v13 - 40) = 0;
          *(_DWORD *)(v13 - 16) = 0;
          Flink_low = LOWORD(Flink[2].Flink);
          v19 = Flink_low;
          v17 = (wchar_t *)((v10 + 1) & 0xFFFFFFFFFFFFFFFEui64);
          v15 = (unsigned __int64)v17 + Flink_low;
          if ( (unsigned __int64)v17 + Flink_low > v6 )
            break;
          if ( (unsigned int)Feature_3391791421__private_IsEnabledDeviceUsage() )
          {
            *(_QWORD *)&v18.Length = 0i64;
            v18.MaximumLength = Flink_low;
            v18.Buffer = v17;
            RtlCopyUnicodeString(&v18.Length, (unsigned __int16 *)&Flink[2]);
            *(_UNICODE_STRING *)(v13 - 0x48) = v18;
          }
          else
          {
            [...]
          }
          inserted = AuthzBasepCopyoutInternalSecurityAttributeValues(
                       (__int64)Flink,
                       v13 - 104,
                       v15,
                       (int)v6 - (int)v15,
                       &v19);
    [...]
  • Dans la session de débogage, nous pouvons voir que rcx est l'adresse du noyau après le correctif :
root@kitploit:~
5: kd> 
nt!AuthzBasepCopyoutInternalSecurityAttributes+0x1aa:
fffff803`5dbcf14a e8810fa5ff      call    nt!RtlCopyUnicodeString (fffff803`5d6200d0)
5: kd> r
rax=0000025a81d006a0 rbx=0000025a81d00590 rcx=ffffe20697c4f778
rdx=ffffa609c7a101a0 rsi=0000025a81d00598 rdi=0000025a81d00628
rip=fffff8035dbcf14a rsp=ffffe20697c4f740 rbp=0000025a81d006c0
 r8=0000000000000003  r9=0000025a81d00590 r10=ffffa609c816ef78
r11=ffffe20697c4f7d0 r12=0000000000000a70 r13=ffffa609ca9b1118
r14=ffffa609c7a10180 r15=0000025a81d01000
iopl=0         nv up ei pl nz na pe nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040202
nt!AuthzBasepCopyoutInternalSecurityAttributes+0x1aa:
fffff803`5dbcf14a e8810fa5ff      call    nt!RtlCopyUnicodeString (fffff803`5d6200d0)

POC :

  • https://youtu.be/y5LnlHjzA64
Télécharger l’outil