immunity inc...creating class factories and instances 12 hresult cogetclassobject(refclsid rclsid,...

83
https://pixabay.com/en/hong-kong-city-urban-skyscrapers-1990268/

Upload: others

Post on 28-Nov-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

https://pixabay.com/en/hong-kong-city-urban-skyscrapers-1990268/

Page 2: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Agenda

•Component Object Model (COM) Internals•Attacking COM

•Enumerating attack surface for EoP•Reverse engineering COM components

•Bugs and “Features”

2

We’ll be using my OleViewDotNet tool throughout.

https://github.com/tyranid/oleviewdotnet

Page 3: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

3

https://pixabay.com/en/ford-mustang-engine-hood-bonnet-1242192/

Page 4: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

“Any sufficiently complex middleware is

indistinguishable from magic.”

Arthur C. Clarke’s Third Law of Software Development

4

Page 5: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

In the Beginning was OLE

5

Page 6: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Component ProviderComponent Consumer

Interoperability Heaven

6

Visual Basic

C

C++

.NET

Visual Basic

C

C++

.NET

COM

Page 7: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Common ABI

7

Object Pointer Method1 Pointer

Method2 Pointer

...

MethodN Pointer

VTable Pointer

Implementation Specific Data

struct ObjectVTable { void (*SetInt)(struct Object* This, int i); int (*GetInt)(struct Object* This);};

struct Object { struct ObjectVTable* Vtbl; // Implementation specific data follows.};

struct Object* obj;obj->Vtbl->SetInt(obj, 1234);

VTable Pointer at start

Object pointer is first. Arguments passed left to right

Page 8: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

The Casting Problem

8

struct Interface1 { virtual void A() = 0;};

struct Interface2 { virtual void B() = 0;};

class Object : public Interface1, public Interface2 { void A() {} void B() {}};

// Okay (mostly).Interface1* intf1 = new Object;// Incredibly bad idea.Interface2* intf2 = (Interface2*)intf1;

Define a pure virtual “Interface”

Derive from Interface and

implement

No no no!!!

Page 9: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

IUnknown, the Root of all COM Evil

9

DEFINE_GUID(IID_IUnknown, 00000000-0000-0000-C000-000000000046");struct IUnknown { HRESULT QueryInterface(GUID& iid, void** ppv); LONG AddRef(); LONG Release();};

Used to reference count the object.

struct Interface1 : public IUnknown {};struct Interface2 : public IUnknown {};

Interface2* intf2;if (intf1->QueryInterface(IID_Interface2, (void**)&intf2) >= 0) { // Success, we can call methods. intf2->Release();}

Interfaces defined using a 128 bit Globally Unique ID.

Cast is a GIANT code smell!

¯\_(ツ)_/¯

Page 10: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Class Registration

10

Page 11: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Class Factories

11

DEFINE_GUID(IID_ClassFactory, "00000001-0000-0000-C000-000000000046");

struct IClassFactory : public IUnknown { HRESULT CreateInstance( IUnknown *pUnkOuter, REFIID riid, void **ppvObject); HRESULT LockServer(BOOL fLock);};

Page 12: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Creating Class Factories and Instances

12

HRESULT CoGetClassObject( REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv);

HRESULT CoCreateInstanceEx( REFCLSID rclsid, IUnknown *punkOuter, DWORD dwClsCtx, COSERVERINFO *pServerInfo, DWORD dwCount, MULTI_QI *pResults);

Specifies what type of server to lookup:● CLSCTX_INPROC_SERVER● CLSCTX_INPROC_HANDLER● CLSCTX_LOCAL_SERVER● CLSCTX_REMOTE_SERVER

Specify remote server information is required (more on this later).

Page 13: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

In-Process Server

13

Process

server.dll

● DLL server filename specified in InProcServer32 key.

● DLL loaded into process and class factory created by calling exported method:

Class Instance

Class FactoryClient

HRESULT DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv);

Page 14: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

ProcessThread X

COM Apartments

14

STA X

InstanceInstanceInstance

Thread Y

STA Y

InstanceInstanceInstance

Thread A Thread B

MTA or NTA

InstanceInstanceInstance

HRESULT CoInitializeEx( LPVOID pvReserved, DWORD dwCoInit);

COINIT_APARTMENTTHREADEDorCOINIT_MULTITHREADED

Page 15: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Multi-Threaded Apartments (MTA)

15

Process

Thread YThread X

MTA

Instance

Client X

Client Y

Page 16: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Single Threaded Apartments (STA)

16

Process

Thread X

STA X

Instance

Thread Y

STA Y

Client

Page 17: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Single Threaded Apartments (STA)

17

Process

Thread X

STA X

Thread Y

STA Y

Client

Proxy

Instance

Page 18: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Single Threaded Apartments (STA)

18

Process

Thread X

STA X

Instance

STA HWND

Thread Y

STA Y

Client

Proxy

SendMessage

Marshaling

Page 19: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Single Threaded Apartments (STA)

19

Process

Thread X

STA X

Instance

Stub

STA HWND

Thread Y

STA Y

Client

Proxy

Unmarshaling

SendMessage

Page 20: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

The Mystery Window

20

HWND hwnd = FindWindowEx(HWND_MESSAGE, NULL, NULL, NULL);while (hwnd) { WCHAR name[256] = {}; if (GetWindowText(hwnd, name, _countof(name)) && _wcsnicmp(name, L"ole", 3) == 0) { DWORD pid = 0; DWORD tid = GetWindowThreadProcessId(hwnd, &pid); printf("%p %5d %5d %ls\n", hwnd, pid, tid, name); } hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);}

“Main” STA window.

Per-Thread STA window.

Page 21: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Client Process

Local Server Activation

21

Server Process

Instance

Stub

RPC Server

Client

Proxy

RPC Client

DCOM Activator(part of RPCSS)

ALPC Channel

Page 22: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Client Process

Local Server Activation

22

Client

RPCSS

System Activator

Send Request to System Activator

Page 23: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Client Process

Local Server Activation

23

Server Process

Client

RPCSS

System Activator

System Activator

Create New Process(if necessary)

Register Process Activator

Page 24: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Client Process

Local Server Activation

24

Server Process

Client

RPCSS

System Activator

System Activator

Instance

Pass Activation Properties to In-Process Activator

Get Marshaled Result

Page 25: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Client Process

Local Server Activation

25

Server Process

Client

RPCSS

System Activator

System Activator

Instance

Pass back result to client

Connect to Instance

Page 26: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

System Activator

DEFINE_GUID(IID_ISystemActivator, "000001a0-0000-0000-c000-000000000046")struct ISystemActivator : public IUnknown { HRESULT GetClassObject( IActivationPropertiesIn *pActProperties, IActivationPropertiesOut **ppActProperties); HRESULT CreateInstance( IUnknown *pUnkOuter, IActivationPropertiesIn *pActProperties, IActivationPropertiesOut **ppActProperties);};

26

Page 27: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Activation Properties In

27

CustomHeader

Property 1

Property 2

Property 3

Property 4

struct CustomHeader { DWORD totalSize ; DWORD headerSize ; DWORD dwReserved ; DWORD destCtx; DWORD cIfs; CLSID classInfoClsid ; CLSID *pclsid; DWORD *pSizes; CustomOpaqueData *opaqueData;};

List of GUIDs and Sizes of following Property Blobs

struct InstantiationInfoData { CLSID classId; DWORD classCtx; DWORD actvflags ; long fIsSurrogate; DWORD cIID; DWORD instFlag; IID *pIID; DWORD thisSize; COMVERSION clientCOMVersion ;};

CLSID to create.

List of IIDs to query for.

enum ACTIVATION_FLAGS { ACTVFLAGS_DISABLE_AAA, ACTVFLAGS_ACTIVATE_32_BIT_SERVER, ACTVFLAGS_ACTIVATE_64_BIT_SERVER, ACTVFLAGS_NO_FAILURE_LOG, ACTVFLAGS_WINRT_LOCAL_SERVER, ACTVFLAGS_WINRT_PER_USER_OK, ACTVFLAGS_APPCONTAINER,};

Page 28: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Activation Properties Out

28

struct PropsOutInfo { DWORD cIfs; IID *piid; HRESULT *phresults; MInterfacePointer **ppIntfData;};

struct MInterfacePointer { unsigned long ulCntData; byte abData[];};

Page 29: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

It’s like Marshaling Cats

29

‘MEOW’ OBJREF Type

IID (lower 64 bits)

IID (upper 64 bits)

1 = Standard OBJREF4 = Custom OBJREF

Flags References

Object Exporter ID (OXID)

Object ID (OID)

Interface Pointer ID (IPID)

IPID (upper 64 bits)

Binding information for remote access

CLSID (lower 64 bits)

CLSID (upper 64 bits)

Reserved Data Size

Custom Data

Standard OBJREF Custom OBJREF

Page 30: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Client Process

Standard Unmarshaling

30

Server Process

Client

RPCSS

System Activator

Instance

Object Exporter ID (OXID)

Object ID (OID)

Interface Pointer ID (IPID)

IPIDTable

Object Resolver

Resolve OXID Binding

ALPC OLEXXXX

Page 31: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Client Process

Standard Unmarshaling

31

Server Process

Client

RPCSS

System Activator

Instance

IPIDTable

Object Resolver

Server is at ncalrpc:[OLEXXXXX]ALPC OLEXXXX

Object Exporter ID (OXID)

Object ID (OID)

Interface Pointer ID (IPID)

Page 32: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Client Process

Standard Unmarshaling

32

Server Process

Client

RPCSS

System Activator

Instance

IPIDTable

Object Resolver

ALPC OLEXXXXRPC Client

IPID@ncalrpc:[OLEXXXX]

Object Exporter ID (OXID)

Object ID (OID)

Interface Pointer ID (IPID)

Page 33: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Client Process

Standard Unmarshaling

33

Server Process

Client

RPCSS

System Activator

Instance

IPIDTable

Object Resolver

ALPC OLEXXXXRPC Client

UUID ipid;RpcBindingInqObject( Binding, &ipid);IPIDTable::Lookup(ipid)->Invoke();

Page 34: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Client Process

Standard Unmarshaling

34

Server Process

Client

RPCSS

System Activator

Instance

IPIDTable

Object Resolver

ALPC OLEXXXXRPC Client

Page 35: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Interface Proxies and Stubs

35

Page 36: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Interface Proxy-Stub Factory

36

DEFINE_GUID(IID_IPSFactoryBuffer, "D5F569D0-593B-101A-B569-08002B2DBF7A")struct IPSFactoryBuffer : public IUnknown{ HRESULT CreateProxy( IUnknown *pUnkOuter, REFIID riid, IRpcProxyBuffer **ppProxy, void **ppv); HRESULT CreateStub( REFIID riid, IUnknown *pUnkServer, IRpcStubBuffer **ppStub);};

Page 37: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

IRemUnknown

37

struct customREMOTE_REPLY_SCM_INFO { OXID Oxid; DUALSTRINGARRAY *pdsaOxidBindings; IPID ipidRemUnknown; DWORD authnHint; COMVERSION serverVersion;};

DEFINE_GUID(IID_IRemUnknown, "00000131-0000-0000-C000-000000000046")struct IRemUnknown : public IUnknown { HRESULT RemQueryInterface( REFIPID ripid, unsigned long cRefs, unsigned short cIids, IID *iids, PREMQIRESULT *ppQIResults);

HRESULT RemAddRef( unsigned short cInterfaceRefs, REMINTERFACEREF InterfaceRefs[], HRESULT *pResults);

HRESULT RemRelease( unsigned short cInterfaceRefs, REMINTERFACEREF InterfaceRefs[]);};

Page 38: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Client Computer

Server Computer

Client Process

Remote Server

38

Server Process

Instance

Stub

RPC Server

Client

Proxy

RPC Client

RPCSS

TCP/IP Channel

Object Resolver Remote Activator

TCP/IP Channel

Page 39: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

COSERVERINFO

39

struct COSERVERINFO { DWORD dwReserved1; LPWSTR pwszName; COAUTHINFO *pAuthInfo; DWORD dwReserved2;};

struct COAUTHINFO { DWORD dwAuthnSvc; DWORD dwAuthzSvc; LPWSTR pwszServerPrincName; DWORD dwAuthnLevel; DWORD dwImpersonationLevel; void* pAuthIdentityData; DWORD dwCapabilities;};

Can specify better authentication level when connecting such as CALL or even better PKT_PRIVACY

Page 40: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

COM Security Restrictions

40‘Everyone’ not allowed to launch a new object remotely ‘Everyone’ can access an existing object remotely

Page 41: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

COM Security

41

Launch = Create a new instance of the server.Activate = Create new object on existing server.

Enforced in RPCSS

Access = Call methods on existing objects.Enforced in Server Process

SELF = Process Token User SID

Page 42: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Integrity Levels

42

Page 43: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Security Through CoInitializeSecurity

43

HRESULT CoInitializeSecurity( PSECURITY_DESCRIPTOR pSecDesc, LONG cAuthSvc, SOLE_AUTHENTICATION_SERVICE * asAuthSvc, void * pReserved1, DWORD dwAuthnLevel, DWORD dwImpLevel, void * pAuthList, DWORD dwCapabilities, void * pReserved3);

Optional SD:NULL = No Access Security!

EOAC_APPID: pSecDesc is a AppID GUID

EOAC_ACCESS_CONTROL: pSecDesc is a pointer to an IAccessControl implementation

EOAC_NO_CUSTOM_MARSHAL: Disables custom marshaling in the process.

Page 44: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Security Through AppID

44

Page 45: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Application IDs

● AppIDs can configure more than just Launch/Access security● Used to specify a number of features:

○ Allows you to specify a DLL Surrogate. This allows you to create in-process DLL servers as OOP local servers

○ Specify the object is hosted in a Windows service rather than a separate executable○ Specify running as interactive user.

45

Page 46: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Sandboxed Client Process

Activate as Activator (AAA)

46

Server Process

Client

RPCSS

System Activator

Instance

User Privilege

Low Privilege

ActivateCreate Server

Page 47: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Sandboxed Client Process

RunAs Interactive User

47

Server Process

Client

RPCSS

System Activator

Instance

User Privilege

Low Privilege

Activate

Create Server

Page 48: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

48

https://pixabay.com/en/lion-lion-head-teeth-background-2016620/

Page 49: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

49

Sandbox: Activation via Broker

Page 50: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

50

Sandbox: Activation via RPCSS

Page 51: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

51

Edge is Watching You PWN

Edge + LPAC~20 CLSIDs

Edge + AC~40 CLSIDs

Page 52: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

In-process Reverse Engineering

52

VTable RVAs for interface

Page 53: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

OOP Reverse Engineering

53

Page 54: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

IPID Structure

00000000-XXXX-YYYY-ZZZZ-ZZZZZZZZZZZZ

`

Apartment ID(16)

Process ID(16)

Random Data(64)

0 = NTA-1 = MTA* = Thread ID of STA

Allocator Information

Page Number(16)

Random(6)

Page Entry(10)

54

Page 55: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Tracking Down OOP VTable

55

Create Instance

Page 56: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Tracking Down OOP VTable

56

PID from IPID

Marshal

Page 57: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Tracking Down OOP VTable

57

Find IPID in Process List

Page 58: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Tracking Down OOP VTable

58

VTable RVA

Page 59: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

VTable Reverse Engineering

59

IUnknown

Interface Specific

Page 60: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Interface Information - Public Symbols

60

● Most Windows components come with public symbols available● Most COM code written in C++● So, use C++ managed names to recover some parameter information

Page 61: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Interface Information - Type Libraries

61

Page 62: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Interface Information - Proxy/Stub NDR

62

Page 63: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

63

https://pixabay.com/en/strip-bug-bug-macro-insect-red-812767/

Page 64: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Activation Properties In SPD

64

struct SpecialPropertiesData { unsigned long dwSessionId; long fRemoteThisSessionId; long fClientImpersonating; long fPartitionIDPresent; DWORD dwDefaultAuthnLvl; GUID guidPartition; DWORD dwPRTFlags; DWORD dwOrigClsctx; DWORD dwFlags; DWORD dwPid; unsigned __int64 hwnd; DWORD ulServiceId; DWORD Reserved[4];};

enum SPD_FLAGS { SPD_FLAG_USE_CONSOLE_SESSION, SPD_FLAG_USE_DEFAULT_AUTHN_LVL, SPD_FLAG_USE_SERVER_PID, SPD_FLAG_USE_LUA_LEVEL_ADMIN, SPD_FLAG_COAUTH_USER_IS_NULL, SPD_FLAG_COAUTH_DOMAIN_IS_NULL, SPD_FLAG_COAUTH_PWD_IS_NULL, SPD_FLAG_USE_LUA_LEVEL_HIGHEST};

Choosing a Session ID?

UAC Related Stuff

Page 65: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Session and Elevation Monikers

65

Page 66: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Monikers and Binding

66

HRESULT CoCreateInstanceInSession(DWORD session, REFCLSID rclsid, REFIID riid, void ** ppv) { BIND_OPTS3 bo = {}; WCHAR wszCLSID[50]; WCHAR wszMonikerName[300];

StringFromGUID2(rclsid, wszCLSID, _countof(wszCLSID)); StringCchPrintf(wszMonikerName, _countof(wszMonikerName), L"session:%d!new:%s", session, wszCLSID); bo.cbStruct = sizeof(bo); bo.dwClassContext = CLSCTX_LOCAL_SERVER; return CoGetObject(wszMonikerName, &bo, riid, ppv);}

Page 67: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Session 2 “Bob”

Session Moniker in Action

67

Session 1 “Alice”

Process “Alice”

RPCSS

System Activator

Client

Page 68: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Session 2 “Bob”

Session Moniker in Action

68

Session 1 “Alice”

Process “Alice”

RPCSS

System Activator

Request Activation in Session 2

Client

Page 69: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Session 2 “Bob”

Session Moniker in Action

69

Session 1 “Alice”

Process “Alice”

RPCSS

System Activator

Create Process

Client

Process “Bob”

Instance

Page 70: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Session 2 “Bob”

Session Moniker in Action

70

Session 1 “Alice”

Process “Alice” Process “Bob”

RPCSS

System Activator

Instance

Connect to Instance

ClientInteractive Access

AP Client HxHelpPaneServer ClassCLSID: 8CEC58AE-07A1-11D9-B15E-000D56BFE6EE

Page 71: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Session 2 “Bob”

Session Moniker in Action

71

Session 1 “Alice”

Process “Alice” Process “Bob”

RPCSS

System Activator

Instance

Connect to Instance

Client

AP Client HxHelpPaneServer ClassCLSID: 8CEC58AE-07A1-11D9-B15E-000D56BFE6EE

CVE-2017-0100

Page 72: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Abusing Information Disclosure

72

Unmarshal

Page 73: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

You Can’t Help Loving DCOM

73

Page 74: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Plain Text Communications?

74

Defaults to CONNECT Authentication Level?

Authentication Level

CONNECT Authenticates the credentials of the client and server.

CALL/PKT Same as CONNECT but also prevents replay attacks.

PKT_INTEGRITY Same as CALL/PKT but also verifies that none of the data transferred between the client and server has been modified.

PKT_PRIVACY Same as PKT_INTEGRITY but also ensures that the data transferred can only be seen unencrypted by the client and the server.

Page 75: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Good old Wireshark

75

Page 76: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Access Permissions for WMI

76

All authenticated users can access WMI

remotely

Page 77: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

MEOW-Jacking!

77

Client “Domain Admin”

Domain Server

Client

System Activator

Client “Domain User”

WMI Activation Request

WMI

TAP

Page 78: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

MEOW-Jacking!

78

Client “Domain Admin”

Domain Server

Client

System Activator

Client “Domain User”

Marshal Object

WMI

TAP

Page 79: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

MEOW-Jacking!

79

Client “Domain Admin”

Domain Server

Client

System Activator

Client “Domain User”

WMI

TAP

Send back OBJREF

Page 80: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

MEOW-Jacking!

80

Client “Domain Admin”

Domain Server

Client

System Activator

Client “Domain User”

WMI

Client

Connect to Remote Object.

Page 81: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

Not as Bad as it Could Be

81

User’s not allowed to access WMI remotely.

Plenty of other potential COM objects though.

Page 82: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

82

https://pixabay.com/en/pumpkin-halloween-frankenweenie-1789832/

Page 83: Immunity Inc...Creating Class Factories and Instances 12 HRESULT CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID riid, LPVOID *ppv); HRESULT

83

https://pixabay.com/en/question-mark-pile-question-mark-1495858/