![]() |
General: Exploring Windows Objects ACL's Tue, 29 Dec 2009 In the last post, we talked about mutex objects and how to enumerate them. Today we'll learn how to check mutex access lists from WinDBG as well as from user-mode extending the EnumerateMutex example. Let's see an example using WinDBG. First query the "\BaseNamedObjects" directory that usually contains mutex objects:
lkd> !object \BaseNamedObjects
Object: e18ce788 Type: (823ed418) Directory
ObjectHeader: e18ce770 (old version)
HandleCount: 71 PointerCount: 593
Directory Object: e1001150 Name: BaseNamedObjects
Hash Address Type Name
---- ------- ---- ----
00 e15a8880 SymbolicLink Local
81e996d0 Event userenv: Machine Group Policy has been applied
82286598 Mutant SHIMLIB_LOG_MUTEX
82308700 Mutant ZonesCacheCounterMutex
e1dfe298 Section CTF.AsmListCache.FMPDefaultS-1-5-21-507921405-412668190-839522115-500
817e3ea0 Timer userenv: refresh timer for 1048:768
e1f12ed8 Section MSCTF.MarshalInterface.FileMap.MPJ.DI.HDGDJDJ
813f90d0 Event CorDBIPCLSEventReadName_5752
e25994a8 Section Cor_Private_IPCBlock_4760
e2319518 Section Cor_Private_IPCBlock_4448
e1fc1818 Section MSCTF.MarshalInterface.FileMap.ILD.FOB.FNOEBJE
8231e468 Event userenv: machine policy force refresh event
82196f50 Event jjCSCSessEvent_UM_KM_0
82111148 Event AgentToWkssvcEvent
Now query one of them:
lkd> !object \BaseNamedObjects\SHIMLIB_LOG_MUTEX
Object: 82286598 Type: (823c55e0) Mutant
ObjectHeader: 82286580 (old version)
HandleCount: 8 PointerCount: 9
Directory Object: e18ce788 Name: SHIMLIB_LOG_MUTEX
And query the object header at 82286580: lkd> dt nt!_OBJECT_HEADER 82286580 +0x000 PointerCount : 9 +0x004 HandleCount : 8 +0x004 NextToFree : 0x00000008 +0x008 Type : 0x823c55e0 _OBJECT_TYPE +0x00c NameInfoOffset : 0x10 '' +0x00d HandleInfoOffset : 0 '' +0x00e QuotaInfoOffset : 0 '' +0x00f Flags : 0x20 ' ' +0x010 ObjectCreateInfo : 0x8055a000 _OBJECT_CREATE_INFORMATION +0x010 QuotaBlockCharged : 0x8055a000 +0x014 SecurityDescriptor : 0xe1756a7e +0x018 Body : _QUAD The security descriptor is at 0xe1756a7e so, convert it: lkd> ?? 0xe1756a7e & ~0x7 unsigned int 0xe1756a78 And then we can check the information we wanted:
lkd> !sd 0xe1756a78 0
->Revision: 0x1
->Sbz1 : 0x0
->Control : 0x8004
SE_DACL_PRESENT
SE_SELF_RELATIVE
->Owner : S-1-5-32-544
->Group : S-1-5-18
->Dacl :
->Dacl : ->AclRevision: 0x2
->Dacl : ->Sbz1 : 0x0
->Dacl : ->AclSize : 0x44
->Dacl : ->AceCount : 0x2
->Dacl : ->Sbz2 : 0x0
->Dacl : ->Ace[0]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[0]: ->AceFlags: 0x0
->Dacl : ->Ace[0]: ->AceSize: 0x14
->Dacl : ->Ace[0]: ->Mask : 0x001f0001
->Dacl : ->Ace[0]: ->SID: S-1-5-18
->Dacl : ->Ace[1]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
->Dacl : ->Ace[1]: ->AceFlags: 0x0
->Dacl : ->Ace[1]: ->AceSize: 0x18
->Dacl : ->Ace[1]: ->Mask : 0x00120001
->Dacl : ->Ace[1]: ->SID: S-1-5-32-544
->Sacl : is NULL
So now that we now how to check an object ACL via WinDBG, let's take advantage of .NET classes inside System.Security.AccessControl namespace to query objects ACL's. We can query a previously created mutex object via Mutex.OpenExisting method:
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static Mutex OpenExisting(
string name,
MutexRights rights
)
We'll use MutexRights.ReadPermissions to be able to read ACL information and then call Mutex.GetAccessControl to read access control information. Here is the EnumerateMutex example extended to print ACL information from mutexs inside object directories: (Tested on Windows XP SP2 and Windows 7) Example:
This method can be useful to identify weak ACL's that can lead to a local Denial of Service. Example Winsock Mutex Vulnerability Regards posted at: 17:32 | path: /General | permanent link to this entry | 1 comments | General: Windows Kernel Objects Thu, 24 Dec 2009 The Windows Kernel offers different resources to developers: Process, Socket, Thread, Mutex...
A kernel object is a memory block which structure has different members containing information about the object. Let's begin playing with WinDbg that can be used to debug windows in kernel mode. The best way to retrieve the list of kernel objects is to query the ObjectTypes directory:
lkd> !object \ObjectTypes
Object: e1000110 Type: (823ed418) Directory
ObjectHeader: e10000f8 (old version)
HandleCount: 0 PointerCount: 25
Directory Object: e1001150 Name: ObjectTypes
Hash Address Type Name
---- ------- ---- ----
00 823ed418 Type Directory
01 823c8ca0 Type Thread
823c55e0 Type Mutant
03 82335770 Type FilterCommunicationPort
05 823b4958 Type Controller
07 823ed5e8 Type Type
823c4ca0 Type Profile
823c5980 Type Event
09 823ed248 Type SymbolicLink
823c4560 Type Section
823c57b0 Type EventPair
10 823c4730 Type Desktop
11 823c4e70 Type Timer
12 823c4900 Type WindowStation
823eb040 Type File
16 823b45b8 Type Driver
18 823ae250 Type WmiGuid
823c4ad0 Type KeyedEvent
19 823c8040 Type Token
823b4788 Type Device
20 823c8408 Type DebugObject
21 823b43e8 Type IoCompletion
22 823c8e70 Type Process
24 823b4b28 Type Adapter
26 823c18a0 Type Key
28 823c8ad0 Type Job
31 823ec3d0 Type WaitablePort
823ec5a0 Type Port
32 823c5410 Type Callback
33 82335940 Type FilterConnectionPort
34 823c4040 Type Semaphore
Then we have a list with all the available object types managed by the Kernel. We can get more info about an object type querying its address: lkd> dt _OBJECT_TYPE 823c4900 ntdll!_OBJECT_TYPE +0x000 Mutex : _ERESOURCE +0x038 TypeList : _LIST_ENTRY [ 0x823c4938 - 0x823c4938 ] +0x040 Name : _UNICODE_STRING "WindowStation" +0x048 DefaultObject : (null) +0x04c Index : 0x11 +0x050 TotalNumberOfObjects : 5 +0x054 TotalNumberOfHandles : 0x76 +0x058 HighWaterNumberOfObjects : 5 +0x05c HighWaterNumberOfHandles : 0x80 +0x060 TypeInfo : _OBJECT_TYPE_INITIALIZER +0x0ac Key : 0x646e6957 +0x0b0 ObjectLocks : [4] _ERESOURCE And ever more information: lkd> dt _OBJECT_TYPE_INITIALIZER 823c55e0 ntdll!_OBJECT_TYPE_INITIALIZER +0x000 Length : 0x5690 +0x002 UseDefaultObject : 0x3c '<' +0x003 CaseInsensitive : 0x82 '' +0x004 InvalidAttributes : 0x823c5908 +0x008 GenericMapping : _GENERIC_MAPPING +0x018 ValidAccessMask : 0 +0x01c SecurityRequired : 0 '' +0x01d MaintainHandleCount : 0 '' +0x01e MaintainTypeList : 0 '' +0x020 PoolType : 0 ( NonPagedPool ) +0x024 DefaultPagedPoolCharge : 0 +0x028 DefaultNonPagedPoolCharge : 0 +0x02c DumpProcedure : (null) +0x030 OpenProcedure : (null) +0x034 CloseProcedure : (null) +0x038 DeleteProcedure : 0x823c5618 void +ffffffff823c5618 +0x03c ParseProcedure : 0x823c5618 long +ffffffff823c5618 +0x040 SecurityProcedure : 0x000e000c long +e000c +0x044 QueryNameProcedure : 0xe1005498 long +ffffffffe1005498 +0x048 OkayToCloseProcedure : (null) All the kernel objects are managed by the object manager which manage all the resources: kernel data structures, kernel references, user references, synchronization... The Windows Kernel provides "Object directories" to categorize objects being managed according to the types. For example we previously queried the ObjectTypes directory to retrieve the list of object types. Another example, query the \Drivers directory to get the list of drivers present on the system:
lkd> !object \Driver
Object: e1023908 Type: (823ed418) Directory
ObjectHeader: e10238f0 (old version)
HandleCount: 0 PointerCount: 96
Directory Object: e1001150 Name: Driver
Hash Address Type Name
---- ------- ---- ----
00 823343b0 Driver NDIS
82335340 Driver KSecDD
82171320 Driver Beep
01 8217ef38 Driver Raspti
82233260 Driver Mouclass
8217dd68 Driver es1371
02 82060030 Driver vmx_svga
...
...
In the next post I will explain the way to query object directories from user land via NtQueryDirectoryObject [Ntdll.dll] and take advantage of it for incident response and malware detection. posted at: 01:24 | path: /General | permanent link to this entry | 0 comments | sobek-hids: Host Monitoring System Sat, 20 Jun 2009 I've just created a google code's project with some code I wrote some time ago. Sobek-Hids is a python based Host IDS system capable to monitor: I hope I will have the time to continue and improve this couple of scripts. You can find it at sobek-hids posted at: 20:30 | path: /General | permanent link to this entry | 0 comments | |
Categories
/ (34) Jaime Blasco (feel free to get in touch) Friend's blogs:
Lecture...
Archives
2010-Aug Tags
| ![]() | ||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |




