マネージドコード(CLR)を呼び出す

0x1 はじめに

C(++)からマネージドコード(CLR)を呼び出す手法を示す.

0x2 ソースコード

  • test.cs

0x3 実行

 csc /target:library .\test.cs 

0x4 備考

ここからメイン(?)

GUID

  • CLSID_CLRMetaHost : {9280188D-0E8E-4867-B30C-7FA83884E8DE}
  • IID_ICLRMetaHost : {D332DB9E-B9B3-4125-8207-A14884F53216}
  • IID_ICLRRuntimeInfo : {BD39D1D2-BA2F-486A-89B0-B4B0CB466891}
  • CLSID_CLRRuntimeHost : {90F1A06E-7712-4762-86B5-7A5EBA6BDB02}
  • IID_ICLRRuntimeHost : {90F1A06C-7712-4762-86B5-7A5EBA6BDB02}

ppv

  • pMetaHost->GetRuntime : [edx+0Ch]
  • pRuntimeInfo->GetInterface : [edx+24h]
  • pRuntimeHost->Start : [ecx+0Ch]
  • pRuntimeHost->ExecuteInDefaultAppDomain : [edx+2Ch]

0x5 参考文献

MSBuildのインラインタスクについて

1. はじめに

MSBuildのインラインタスクを用いることによってコード実行が可能となる.

2. 手法

以下のxmlファイルを作成して, msbuildで実行するだけ(簡単!)

3. 実行結果

PS C:\Users\test\Desktop\work> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe test.xml
Microsoft (R) Build Engine バージョン 4.8.3752.0
[Microsoft .NET Framework、バージョン 4.0.30319.42000]
Copyright (C) Microsoft Corporation. All rights reserved.

2019/08/05 22:33:32 にビルドを開始しました。
test


ビルドに成功しました。
    0 個の警告
    0 エラー

経過時間 00:00:00.79

4. 参考文献

MSBuild インライン タスク - Visual Studio | Microsoft Docs

検証環境構築(L2スイッチ+ルータ(セキュリティ製品)+VLAN)

はじめに

セキュリティ製品の検証環境構築の簡単なメモ.
L2スイッチ(Cisco) + ルータ(セキュリティ製品を想定)でVLAN環境を作る.
今回はPacket Tracerを用いた. www.netacad.com

検証環境構築

パターン1

L2スイッチでVLANを分けて, トランクポートで接続するパターン

f:id:kmdnet:20190707235117p:plain

スイッチ

  • Switch>ena
  • Switch#conf t
    // Create VLAN
  • Switch(config)#vlan 10
  • Switch(config-vlan)#exit
  • Switch(config)#vlan 20
  • Switch(config-vlan)#exit
    // Assign VLAN
  • Switch(config)#interface range fastEthernet 0/1-10
  • Switch(config-if-range)#switchport mode access
  • Switch(config-if-range)#switchport access vlan 10
  • Switch(config-if-range)#exit
  • Switch(config)#interface range fastEthernet 0/11-20
  • Switch(config-if-range)#switchport mode access
  • Switch(config-if-range)#switchport access vlan 20
  • Switch(config-if-range)#exit
    // 0/24 → trunk port
  • Switch(config)#int fastEthernet 0/24
  • Switch(config-if)#switchport mode trunk

ルータ

  • Router>enable
  • Router#conf t
  • Router(config)#interface fastEthernet 0/0.1
  • Router(config-subif)#encapsulation dot1Q 10
  • Router(config-subif)#ip address 192.168.10.1 255.255.255.0
  • Router(config)#interface fastEthernet 0/0.2
  • Router(config-subif)#encapsulation dot1Q 20
  • Router(config-subif)#ip address 192.168.20.1 255.255.255.0
  • Router(config-subif)#exit
  • Router(config)#interface fastEthernet 0/0
  • Router(config-if)#no shutdown

疎通確認

C:\>ipconfig /all

FastEthernet0 Connection:(default port)

   Connection-specific DNS Suffix..: 
   Physical Address................: 00D0.BC33.622B
   Link-local IPv6 Address.........: FE80::2D0:BCFF:FE33:622B
   IP Address......................: 192.168.10.101
   Subnet Mask.....................: 255.255.255.0
   Default Gateway.................: 192.168.10.1
   DNS Servers.....................: 0.0.0.0
   DHCP Servers....................: 0.0.0.0
   DHCPv6 Client DUID..............: 00-01-00-01-ED-E8-A9-A3-00-D0-BC-33-62-2B

Bluetooth Connection:

   Connection-specific DNS Suffix..: 
   Physical Address................: 0010.1163.B814
   Link-local IPv6 Address.........: ::
   IP Address......................: 0.0.0.0
   Subnet Mask.....................: 0.0.0.0
   Default Gateway.................: 0.0.0.0
   DNS Servers.....................: 0.0.0.0
   DHCP Servers....................: 0.0.0.0
   DHCPv6 Client DUID..............: 00-01-00-01-ED-E8-A9-A3-00-D0-BC-33-62-2B


C:\>ping 192.168.10.102

Pinging 192.168.10.102 with 32 bytes of data:

Reply from 192.168.10.102: bytes=32 time=1ms TTL=128
Reply from 192.168.10.102: bytes=32 time<1ms TTL=128
Reply from 192.168.10.102: bytes=32 time=11ms TTL=128
Reply from 192.168.10.102: bytes=32 time=3ms TTL=128

Ping statistics for 192.168.10.102:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 11ms, Average = 3ms

パターン2

いろいろあってトランクポートを用いない場合()

f:id:kmdnet:20190708221445p:plain

スイッチ

  • enable
  • conf t
    // Create VLAN
  • Switch(config)#vlan 10
  • Switch(config-vlan)#exit
  • Switch(config)#vlan 20
  • Switch(config-vlan)#exit
    // Assign VLAN
  • Switch(config)#interface range fastEthernet 0/1-10
  • Switch(config-if-range)#switchport mode access
  • Switch(config-if-range)#switchport access vlan 10
  • Switch(config-if-range)#exit
  • Switch(config)#interface range fastEthernet 0/11-20
  • Switch(config-if-range)#switchport mode access
  • Switch(config-if-range)#switchport access vlan 20
  • Switch(config-if-range)#exit
    // 0/23, 0/24 → Access port
  • Switch(config)#interface fastEthernet 0/23
  • Switch(config-if)#switchport mode access
  • Switch(config-if)#switchport access vlan 10
  • Switch(config-if)#exit
  • Switch(config)#interface fastEthernet 0/24
  • Switch(config-if)#switchport mode access
  • Switch(config-if)#switchport access vlan 20
  • Switch(config-if)#exit

ルータ

  • Router>ena
  • Router#conf t
  • Router(config)#interface fastEthernet 0/0
  • Router(config-if)#ip address 192.168.10.1 255.255.255.0
  • Router(config-if)#no shutdown
  • Router(config-if)#exit
  • Router(config)#interface fastEthernet 0/1
  • Router(config-if)#ip address 192.168.20.1 255.255.255.0
  • Router(config-if)#no shutdown
  • Router(config-if)#exit

おまけ

VLAN単位でポートミラーリングを行いたい場合.
- Switch>ena
- Switch#conf t
- Switch(config)#monitor session 1 destination interface fastEthernet 0/22

所感

今回はルータ側の処理も記述したが, 本来はセキュリティ製品側で設定する.
限られた資源で環境構築するときに:)

Process Hollowing

1. はじめに

Process Injectionの手法の一つにProcess Hollowingがある.
今回はProcess Hollowingについて調べてみた覚書.

2. 手法

2.1. 検証環境

Windows 7/10

・Dest(Destination) : インジェクションされるプロセス

・Src(Source): インジェクションするPEファイル

以下それぞれのプロセスに対する操作をDest, Srcで示す.

2.2. インジェクションフロー概要

1) Destのプロセスを待機状態(CREATE_SUSPENDED)で作成する(via CreateProcess)

2) DestのPEBを得る(via ntdll!NtQueryInformationProcess)
ここでImageBaseを得る

3) SrcのPEヘッダーをparse
ここでNumberOfSections, Section headerを得る

4) DestをImageBaseを基準としてUnmap(空洞化)する(via ntdll!NtUnmapViewOfSection)

5) DestをImageBaseからOptionalHeader.SizeOfImageだけメモリを確保(via VirtualAllocEx)

6) DestにSrcのヘッダーをOptionalHeader.SizeOfHeadersだけ書き込む(via WriteProcessMemory)

7) DestにSrcのSectionの数(NumberOfSections)だけセクションを書き込む(via WriteProcessMemory)

8) DestとSrcのImageBaseのアドレスが異なる場合, Srcの".reloc"セクションの情報をもとにベースの再配置を行う.

9) (Dest)PEBのImageBaseAddress + SrcのAddressOfEntryPointをEAXに設定->プロセスを再開する(via GetThreadContext -> SetThreadContext -> ResumeThread)

2.3. 補足

2.3.1 PEB(Process Environment Block)について

PEBは以下の構造体で定義される(winternl.h).


typedef struct _PEB {
    BYTE Reserved1[2];
    BYTE BeingDebugged;
    BYTE Reserved2[1];
    PVOID Reserved3[2];
    PPEB_LDR_DATA Ldr;
    PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
    PVOID Reserved4[3];
    PVOID AtlThunkSListPtr;
    PVOID Reserved5;
    ULONG Reserved6;
    PVOID Reserved7;
    ULONG Reserved8;
    ULONG AtlThunkSListPtr32;
    PVOID Reserved9[45];
    BYTE Reserved10[96];
    PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
    BYTE Reserved11[128];
    PVOID Reserved12[1];
    ULONG SessionId;
} PEB, *PPEB;

ここでReserved3[1]はImageBaseAddressに対応する.

 

2.3.2 ベースの再配置について

 relocation tableには以下の2つの構造体から定義される(winnt.h).

※TYPE_OFFSETは筆者が作成した構造体.


typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;
    DWORD   SizeOfBlock;
//  WORD    TypeOffset[1];
} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;

typedef struct _TYPE_OFFSET {
	WORD offset : 12;
	WORD Type : 4;
}TYPE_OFFSET, *PTYPE_OFFSET;

 

上記の構造体は以下の図のように配置されている.

f:id:kmdnet:20190528210522p:plain

TYPE_OFFSETの数は

(IMAGE_BASE_RELOCATION.SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(TYPE_OFFSET)

で求められる.

2.4. 実行結果

恒例の電卓(calc.exe)に対してProcess Hollowingを用いて, プロセスインジェクションした結果.

f:id:kmdnet:20190523220741p:plain

3. 所感

Process Hollowing : プロセスの空洞化(そのまま)

4. 参考文献

https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process

https://github.com/m0n0ph1/Process-Hollowing

Windows Serviceのデバッグ

概略

Windows Serviceのデバッグを行いたい場合のためのメモ

自己責任で(VM推奨)

デバッグした後は元の環境に戻す(重要)

環境

Windows 7 x86 (VirtualBox)



手法 その1

サービスの初期状態からデバッグできるようにする

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Optionにプログラム名のレジストリキーを作成する.


    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution
    String Value
    Value name : Debugger
    Value data : <debugger path> -server npipe:pipe=<Session Name>

今回の場合は以下のようにした.


    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution
    String Value
    Value name : Debugger
    Value data : C:\Debuggers\x86\ntsd.exe -server npipe:pipe=hoge

セッション分離

Windows Vista以降はセッションが分離されているため上記の方法をとる.

それより前のOSだと直接WinDbgを指定してやれば良いらしい(未確認).

f:id:kmdnet:20180522162816p:plain

Let's Debug!

WinDbg → Connect to Remote Session(Ctrl+R)


npipe:server=localhost,pipe=hoge

タイムアウト時間の調整

サービスのタイムアウト時間を伸ばさないとすぐ終了してしまう. デフォルトで30000ミリ秒(30秒).


C:\Windows\System32>sc start MySrv
[SC] StartService FAILED 1053:

The service did not respond to the start or control request in a timely fashion.

f:id:kmdnet:20180522160852p:plain

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Controlでデフォルトのタイムアウト時間を伸ばす. → 再起動


    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
    DWORD
    Value Name : ServicesPipeTimeout
    Value data : 86400000(Decimal)

※ 86400000(Decimal) = 24hours

※ 全てのサービスに影響するためデバッグ後は修正する



手法 その2(svchostと依存関係がある場合)

svchost.exeと依存関係がある場合, 孤立させる必要がある.

今回はBITS(Background Intelligent Transfer Service)を対象にする.


C:\Windows\System32>sc qc bits
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: bits
        TYPE               : 20  WIN32_SHARE_PROCESS
        START_TYPE         : 2   AUTO_START  (DELAYED)
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:\Windows\System32\svchost.exe -k netsvcs
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : Background Intelligent Transfer Service
        DEPENDENCIES       : RpcSs
                           : EventSystem
        SERVICE_START_NAME : LocalSystem

見る箇所はBINARY_PATH_NAMEのグループ名(netsvcs). ちなみにsvchost -k (group).

新しいグループ(TempGrp)を作成する.


    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\SvcHost 
    REG_MULTI_SZ
    Value Name : TempGrp
    Value data : 孤立させたいサービスのValue data

※ 作成したグループのValue dataにnetsvcsのValue dataを指定する.

f:id:kmdnet:20180522212132p:plain

元々のグループのsub keyを作成したグループにコピーする.

今回の場合はnetsvcsなのでAuthenticationCapabilities, CoInitializeSecurityParamを新しいグループにコピーすれば良い.

f:id:kmdnet:20180522213303p:plain

サービスのパスを修正する.


C:\Windows\System32>sc config BITS binPath= "C:\Windows\system32\svchost.exe -k TempGrp"
[SC] ChangeServiceConfig SUCCESS

※ 細かい所だけどbinPathはクオーテーションで囲む, binPath=の後のスペースは必要. ハマりやすい所なので注意.

必要に応じてサービスの再起動を行う. あとは手法 その1と同じ.



手法 その3(非推奨)

MSDNによると非推奨.

svchostを複製する.

%SystemRoot%\System32にsvchost.exeをコピーしてsvchost2.exeを作成する.


C:\Windows\System32>sc config BITS binPath= "C:\Windows\System32\svchost2.exe -k netsvcs"
[SC] ChangeServiceConfig SUCCESS

必要に応じてサービスの再起動を行う. あとは手法 その1と同じ.

所感

個人的には手法1と3(適当)

参考文献

Debugging a Service Application | Microsoft Docs

UBoatRAT(解析)

はじめに

元ネタはこれ.

researchcenter.paloaltonetworks.com

今更だけどちょっと興味のある箇所があったので実際に解析してみた.

検体

・ドロッパー : f4c659238ffab95e87894d2c556f887774dce2431e8cb87f881df4e4d26253a3

・UBoatRAT : 460328fe57110fc01837d80c0519fb99ea4a35ea5b890785d1e88c91bea9ade5

ドロッパー

・UPXでパックされているためアンパックしてやると読めるようになる.

解析環境の検知として2種類の方法を取っている. 詳細はソースコード参照.

  • AntiVM(qemu, virtual, vmware)
  • ※VirutalBoxだと"vbox harddisk"となるので検知不可:(
  • ネットワークのドメイン
f:id:kmdnet:20180213143308p:plain

以下ソースコード

UboatRAT

必要なところだけ

アンチデバッグ機構がDropperと全く同じなので, ドメイン名を適当に埋めてやり, VirtualBox上で解析を行うと, とりあえず動くようになる.

  • ShellExecuteW(NULL,L"open",L"cmd.exe" ,L"/c c:\\programdata\\init.bat", NULL,SW_HIDE);
  • ShellExecuteW(NULL,L"open", L"(同一のパス&ファイル名).xlsx", NULL, NULL, SW_SHOW);

%programdata%\\init.bat

f:id:kmdnet:20180216221843p:plain

%programdata%\\init.batの中身

f:id:kmdnet:20180216221917p:plain

 

ちょっとした補足

uninstall?

"unst"という引数で以下の処理を行うように作られていた

f:id:kmdnet:20180216222656p:plain

デバッグ

デバッグする際にShellExecuteW, GetNetworkParamsあたりを見ておくと幸せになれるかも.

所感

cmd /c...

svchost・servicesについてのメモ

メモ1(関連するプロセス)

  • services.exe ("C:\Windows\System32\services.exe")
  • サービスコトロールマネージャ(Service Control Manager : SCM)
  • svchost.exe ("C:\Windows\System32\svchost.exe")
  • サービスホスト(Service Host)

メモ2 (プロセスと関連しているサービスを調べる)

例) tasklist(一部抜粋)


PS C:\Users\IEUser> tasklist.exe /svc

Image Name                     PID Services
========================= ======== ============================================
System Idle Process              0 N/A
System                           4 N/A
smss.exe                       216 N/A
csrss.exe                      292 N/A
csrss.exe                      328 N/A
wininit.exe                    336 N/A
winlogon.exe                   364 N/A
services.exe                   424 N/A
lsass.exe                      432 SamSs
lsm.exe                        440 N/A
svchost.exe                    548 DcomLaunch, PlugPlay, Power
svchost.exe                    664 RpcEptMapper, RpcSs
svchost.exe                    756 Audiosrv, Dhcp, eventlog, lmhosts, wscsvc
svchost.exe                    816 AudioEndpointBuilder, CscService, Netman,
                                   PcaSvc, TrkWks, UmRdpService, UxSms
svchost.exe                    848 EventSystem, FontCache, netprofm, nsi,
                                   sppuinotify, WdiServiceHost,
                                   WinHttpAutoProxySvc
svchost.exe                    872 AeLookupSvc, BITS, CertPropSvc, gpsvc,
                                   iphlpsvc, LanmanServer, MMCSS, ProfSvc,
                                   Schedule, SENS, SessionEnv,
                                   ShellHWDetection, Themes, Winmgmt, wuauserv
svchost.exe                   1132 CryptSvc, Dnscache, LanmanWorkstation,
                                   NlaSvc, TermService
svchost.exe                   1260 BFE, DPS, MpsSvc
svchost.exe                   2944 WinDefend
svchost.exe                   4020 SSDPSRV



BITS(Background Intelligent Transfer Service)はPID:872のsvchostを調べてみるとサービスとして登録されていることがわかる.

f:id:kmdnet:20170912173020p:plain

 

メモ3(Serviceの調査)

scというSCMとサービスと通信するためのコマンドラインプログラムがある(注: PowerShellではscはSet-Contentが割り当てられている).scを用いてサービスについて調査を行う.

例2) scを用いたサービスの列挙(PowerShellでSelect-Stringで抜粋)


PS C:\Users\IEUser> C:\Windows\System32\sc.exe query | Select-String BITS -Context 0,8

> SERVICE_NAME: BITS
  DISPLAY_NAME: Background Intelligent Transfer Service
          TYPE               : 20  WIN32_SHARE_PROCESS
          STATE              : 4  RUNNING
                                  (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
          WIN32_EXIT_CODE    : 0  (0x0)
          SERVICE_EXIT_CODE  : 0  (0x0)
          CHECKPOINT         : 0x0
          WAIT_HINT          : 0x0



例3) サービスの照会


 PS C:\Users\IEUser> C:\Windows\System32\sc.exe qc BITS
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: BITS
        TYPE               : 20  WIN32_SHARE_PROCESS
        START_TYPE         : 2   AUTO_START  (DELAYED)
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:\Windows\System32\svchost.exe -k netsvcs
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : Background Intelligent Transfer Service
        DEPENDENCIES       : RpcSs
                           : EventSystem
        SERVICE_START_NAME : LocalSystem   
  



おまけ

  • winlogon.exe("C:\Windows\System32\winlogon.exe")
  • ログオンプロセス.
  • csrss.exe("C:\Windows\System32\csrss.exe")
  • Windowsサブシステム
  • explorer.exe("C:\Windows\explorer.exe")
  • explorer.exeの親プロセスはUserinitプロセス

参考文献

インサイド MS WINDOWS 第4版 上