c ++ - Winapi: LUID\_AND\_ATTRIBUTES attributtet er 3

Indlæg af Hanne Mølgaard Plasc

Problem



Det jeg forsøger at opnå er at lave et token fra brugerens legitimationsoplysninger og derefter bruge OpenService. Her er min kode:


logonSuccess = LogonUserW(userPartW, domainPartW, pwdW,
                                LOGON32\_LOGON\_BATCH,
                                    LOGON32\_PROVIDER\_DEFAULT, &token);

 PTOKEN\_PRIVILEGES pPrivilegesToken = NULL;

 DWORD cbSize = 0;

  GetTokenInformation(token, TokenPrivileges, NULL, 0, &cbSize);

  pPrivilegesToken = (PTOKEN\_PRIVILEGES) LocalAlloc(LPTR, cbSize);

  if (GetTokenInformation(token, TokenPrivileges, 
                               pPrivilegesToken, cbSize, &cbSize) == FALSE)
  {
    fprintf(stderr, "GetTokenInformation:  cheijva \%d.
", GetLastError());
    fflush(stderr);
  }

 char str[80] = {0};
 char str2[80] = {0};
 DWORD strsize = 80;
 DWORD str2size = 80;
 DWORD langid;

  for (int x = 0; x< pPrivilegesToken->PrivilegeCount; x++)
  {
    if (LookupPrivilegeName(NULL, &pPrivilegesToken->Privileges[x].Luid, str, &strsize) == 0)
    {
      fprintf(stderr, "LookupPrivilegeName:  cheijva -> \%d.
", GetLastError());
      fflush(stderr);
    }
    fprintf(stderr, "name -> \%s
", str);
    fprintf(stderr, "atributes -> \%ld
", pPrivilegesToken->Privileges[x].Attributes);
    fflush(stderr);
    if(LookupPrivilegeDisplayName (NULL, str, str2, &str2size, &langid) == 0)
    {
      fprintf(stderr, "LookupPrivilegeName2222:  cheijva -> \%d.
", GetLastError());
      fflush(stderr);
    }

    fprintf(stderr, "name -> \%s
", str2);
    fflush(stderr);
    strsize = str2size = 80;
  }


Vær venligst opmærksom på styling og variable navne og osv. Mit problem er, at jeg har denne output:


name -> SeShutdownPrivilege
atributes -> 3
name -> Shut down the system
name -> SeChangeNotifyPrivilege
atributes -> 3
name -> Bypass traverse checking
name -> SeUndockPrivilege
atributes -> 3
name -> Remove computer from docking station
name -> SeIncreaseWorkingSetPrivilege
atributes -> 3
name -> Increase a process working set
name -> SeTimeZonePrivilege
atributes -> 3
name -> Change the time zone


Som jeg ved attributtet angiver, om privilegiet er aktiveret eller ej, ønskede jeg at vide, hvad 3 betyder, når den er indstillet i attributes, så jeg åbnede wdm.h og søgte, men jeg fandt dette


#define SE\_PRIVILEGE\_ENABLED\_BY\_DEFAULT (0x00000001L)
#define SE\_PRIVILEGE\_ENABLED            (0x00000002L)
#define SE\_PRIVILEGE\_REMOVED            (0X00000004L)
#define SE\_PRIVILEGE\_USED\_FOR\_ACCESS    (0x80000000L)

#define SE\_PRIVILEGE\_VALID\_ATTRIBUTES   (SE\_PRIVILEGE\_ENABLED\_BY\_DEFAULT | 
                                         SE\_PRIVILEGE\_ENABLED            | 
                                         SE\_PRIVILEGE\_REMOVED            | 
                                         SE\_PRIVILEGE\_USED\_FOR\_ACCESS)


Jeg kunne ikke finde værdien 3. Jeg bemærkede også, at hvis jeg ændrer LOGON32\_LOGON\_BATCH i LogonUser til LOGON32\_LOGON\_INTERACTIVE, får jeg denne output


name -> SeShutdownPrivilege
atributes -> 0
name -> Shut down the system
name -> SeChangeNotifyPrivilege
atributes -> 3
name -> Bypass traverse checking
name -> SeUndockPrivilege
atributes -> 0
name -> Remove computer from docking station
name -> SeIncreaseWorkingSetPrivilege
atributes -> 0
name -> Increase a process working set
name -> SeTimeZonePrivilege
atributes -> 0
name -> Change the time zone


Også når jeg bruger LOGON32\_LOGON\_BATCH i LogonUser OpenService, fejler fejlkode 5, hvilket betyder ACCESS\_DENIED, da det ikke har retværdi, kan jeg finde fejlen, men hvis jeg bruger LOGON32\_LOGON\_INTERACTIVE fungerer det fint. Som jeg forstår, er problemet i privilegier, som i begge tilfælde er de ens, det må være et problem, der gør det muligt for dem (jeg vil gerne gøre det arbejde ved hjælp af BATCH, så mit spørgsmål er, hvordan man opnår det?). Undskyld hvis mine spørgsmål lyder dumt Jeg er ny med winapi, og jeg ved, at denne kode ikke vil hjælpe dig med at reproducere problemet, men jeg troede, at nogen måske vidste, hvad problemet er. Enhver hjælp ville blive appriciated.

Bedste reference


attributter dette er flag. så 3 er SE\_PRIVILEGE\_ENABLED\_BY\_DEFAULT|SE\_PRIVILEGE\_ENABLED


når trådforsøg får adgang til nogle sikrede objekter (med tilhørende SECURITY\_DESCRIPTOR i de fleste tilfælde kontrollerede trådtokengrupper vs. SECURITY\_DESCRIPTOR DACL og obligatorisk integritetsetiket . men dette er ikke altid nøjagtigt token privilegier også brugt i denne proces - sig om trådtoken (hvis tråd ikke har token proces token bruges) har SE\_TAKE\_OWNERSHIP\_PRIVILEGE adgangen WRITE\_OWNER givet. nogle api kan bruge en anden privilegier (siger OpenProcess look er SE\_DEBUG\_PRIVILEGE eksisterer) men dette er undtagelser. [60] [61] [62]


SERVICE\_USER\_DEFINED\_CONTROL normalt (som standard) tildelt SYSTEM, Administrators, INTERACTIVE og SERVICE


Hvis brugeren logger ind med LOGON32\_LOGON\_BATCH, er han ikke medlem af gruppen INTERACTIVE, når brugeren logger ind med LOGON32\_LOGON\_INTERACTIVE, vil han være medlem af gruppen INTERACTIVE og have SERVICE\_USER\_DEFINED\_CONTROL givet.


hvis brugerfejl får SERVICE\_USER\_DEFINED\_CONTROL adgang med LOGON32\_LOGON\_BATCH - han er ikke medlem af Administrators grupper (hvis standard sikkerhed på brugt tjeneste)


mest bemærkelsesværdige forskellige i LOGON32\_LOGON\_INTERACTIVE vs LOGON32\_LOGON\_BATCH


interaktivt vil være medlem af INTERACTIVE ( S-1-5-4 ) gruppe når batch medlem af BATCH ( S-1-5-3 ) gruppe.


også hvis brugeren i 'administrator' -batch logon er medlem af S-1-5-32-544 Administrators og S-1-5-114 [[Local account and member of Administrators group med SE\_GROUP\_ENABLED attributten. og har også S-1-16-12288 High Mandatory Level


men med interaktiv login bruger vil være medlem af Administrators og Local account and member of Administrators group med SE\_GROUP\_USE\_FOR\_DENY\_ONLY - som resultat af praksis ikke medlem af denne gruppe. og har også Medium Mandatory Level


sædvanlig (standard) tjeneste DACL er næste


000F01FF S-1-5-18 SYSTEM
000F01FF S-1-5-32-544 Administrators
0002018D S-1-5-4 INTERACTIVE
0002018D S-1-5-6 SERVICE


så igen - i din tilfældebruger åbenbart ikke medlem eller administratorgruppe - som resultat af batchlogon mislykkes den åbne tjeneste med SERVICE\_USER\_DEFINED\_CONTROL ( 0x100 ) adgang (nej INTERACTIVE, nej [[Administrators), men interaktivt login (selv for ikke admin-bruger) har denne adgang, fordi den tildeles gruppen INTERACTIVE og brugeren af ​​denne gruppe med interaktiv logon

Andre referencer 1


3 er SE\_PRIVILEGE\_ENABLED\_BY\_DEFAULT|SE\_PRIVILEGE\_ENABLED (1|2 == 3).


Brugeren logger på behov SeBatchLogonRight, når du bruger LOGON32\_LOGON\_BATCH. [63]


Da du ikke postede OpenService-koden, er det svært at fortælle, hvad der sker. Privilegier bruges ikke, du skal se på tjenesten ACL:



  Inden du giver den anmodede adgang, kontrollerer systemet adgangstoken til opkaldsprocessen mod den diskretionære adgangskontrol liste over sikkerhedsbeskrivelsen, der er knyttet til serviceobjektet.



OpenService(..., READ\_CONTROL) og derefter ring QueryServiceObjectSecurity for at få ACL. [64]


GetTokenInformation(..., TokenGroups, ...) på dit symbol giver dig en liste over SID'er, sammenligner disse med SID'erne i tjenesten ACL for at se hvilke rettigheder der er givet. Det er også muligt at udføre en AccessCheck. [65]