quentinhardy/odat

GitHub: quentinhardy/odat

一款专用于 Oracle 数据库的开源渗透测试工具,提供 SID 猜解、凭据爆破、权限提升及远程命令执行等全面功能。

Stars: 1742 | Forks: 355

| __Quentin HARDY__ | | ------------- | | __quentin.hardy@protonmail.com__ | | __quentin.hardy@bt.com__ | # ODAT __ODAT__ (Oracle Database Attacking Tool) 是一个开源的 __渗透测试__ 工具,用于测试 __Oracle 数据库__ 的远程安全性。 ODAT 的使用场景: * 你有一个远程监听的 Oracle 数据库,并且想找到有效的 __SID__ 和 __凭据__ 以便连接到数据库 * 你在数据库上拥有一个有效的 Oracle 账户,并希望 __提升你的权限__ 以成为 DBA 或 SYSDBA * 你拥有一个 Oracle 账户,并希望 __执行系统命令__(例如 __反向 shell__),以便在托管数据库的操作系统上进一步操作 已在 Oracle Database __10g__, __11g__, __12c__, __18c__ 和 __19c__ 上测试。 [https://github.com/quentinhardy/odat/releases/](https://github.com/quentinhardy/odat/releases/) 提供 __ODAT Linux 独立__ 版本。请注意,建议使用开发版本(*git clone*),*master-python3* 分支(Python 3 版本)。 # 更新日志 * 版本 __5.1.1__ (__27/04/2022__): * 当发生 "ORA-12519 - TNS:no appropriate service handler found" 时打印警告信息。当建立了过多连接时(例如暴力破解凭据时),数据库服务器(监听器)可能会触发此错误。在这种情况下,应使用 __--sleep__ 选项(例如 *--sleep 0.2*)。 * 版本 __5.1__ (__12/03/2021__): * _all_ 模块中的新选项:__--nmap-file__,用于从 nmap XML 输出文件加载所有 Oracle 数据库 * _all_ 模块中的新选项:__-l__,用于从文本文件加载所有目标(每行 ip:port 或 ip) * 在 _all_ 模块中,现在在开始 ODAT 测试之前会在每个目标上测试 TCP 连接。可以使用 __--timeout-tcp-check__ 来管理超时值。 * 在 _all_ 模块中,现在对每个目标进行测试以检查 TNS 监听器配置是否正确。此测试在 TCP 连接测试之后进行。 * 新的全局选项:__--client-driver__。允许为数据库连接设置客户端名称(来自 __V$SESSION_CONNECT_INFO__ 的 __client_driver__)。 对于最终用户未意识到正在使用 cx_Oracle 的应用程序非常有用。现在默认为 'sql*plus'。 * ODAT 现在接受 __sqlnet.ora__ 文件。默认文件位于 __conf/__ 中。现在默认情况下 TCP & OUTBOUND (TNS) 连接超时设置为 60 秒。 * 版本 __5.0__ (__08/02/2021__): * 重要的新模块:__Service Name Guesser__,用于搜索有效的 Service Name。名为 __*snguesser*__ 的特定模块,也集成在 *all* 模块中。默认情况下,*all* 模块现在在搜索 SID 之后搜索所有有效的 Service Name。SID 可以与 Service Name 相同。当发现 Service Name 但未发现 SID 时,Service Name 可以用作 SID 进行连接。 * _search_ 模块中的 __--basic-info__ 选项,用于获取有关数据库/实例的一些基本技术信息。它获取 Service Name、SID、数据库、Oracle Database Vault 状态、Java 状态、主机名、服务器 IP 地址、密码策略、当前系统权限、当前角色、补丁(当 >= 12c 且用户具有特权时)等。需要高权限才能获取非常有趣的信息(例如密码策略和锁定状态)。 * 当目标是 Windows 时,在 _DbmsScheduler_ 模块中实现了反向 shell。启动一个最小的 HTTP 服务器,使 Oracle Database 下载 PowerShell 代码并远程执行。用户拥有一个交互式 PS shell。下载的文件会自动删除。 * 在 _DbmsScheduler_ 中实现了 _--make-download_ 选项,以便让 Windows 目标下载脚本/二进制文件。 * _DbmsScheduler_ 模块输出中的错误修复(_printOSCmdOutput()_)。 * _DbmsScheduler_ 模块中有更好的解释(选项)。 * 版本 __4.3__ (__28/06/2020__): * 新选项:_--both-ul_。如果凭据文件中未完成,则尝试小写和大写形式的每个密码 * 新选项:_--random-order_。以随机顺序测试账户。默认情况下,它使用文本文件顺序 * 现在默认情况下所有密码都以小写形式测试(账户文件从大写修改为小写) * 一些新账户 * 版本 __4.2__ (__04/02/2020__): * search 模块中的最小交互式 SQL shell * 在 DbmsXslprocessor 模块中使用 DBMS_XSLPROCESSOR.read2clob 下载文件的新功能 * 改进身份验证后的远程操作系统获取 * 错误修复(例如终端大小) * 版本 __4.1__ (__01/15/2020__): * 使用 SERVICE NAME 而不是 SID 进行连接的选项 * 某些操作(例如 NVARCHAR2 和 NCLOB,VARCHAR2 和 CLOB)的编码默认设置为 UTF-8 * 多个错误修复(编码问题) * 版本 __4.0__ (__08/10/2019__): * ODAT 配合 Python 3,稳定版本 * 版本 __3.0__ (__01/09/2019__): * 兼容 Oracle Database 18c * Java 模块中用于设置 shell 路径的新选项(例如 CentOS 上的 /usr/bin/sh) * 版本 __2.3.2__ (__16/07/2019__): * 错误修复: * 外部表和假阴性 * 版本 __2.3.1__ (__10/08/2018__): * Java 模块中用于利用 CVE-2018-3004 的新选项:它允许经过身份验证的用户任意写入操作系统上的文件(绕过内置 Oracle JVM 安全性的权限提升)。更多详情请见 [http://obtruse.syfrtext.com/2018/07/oracle-privilege-escalation-via.html](http://obtruse.syfrtext.com/2018/07/oracle-privilege-escalation-via.html)。 * 版本 __2.3__ (__06/03/2018__): * 错误修复: * 在 passwordguesser 模块中无法检测到某些数据库凭据(当它之前尝试以 SYSDBA/SYSOPER 连接时)。重要的错误修复! * smb 模块中缺少 PPoutput(感谢 dirkjanm) * tnspoison 模块中的假阳性 * 有时无法从 VSNNUM 获取版本 * 改进: * 暴力破解账户时的性能改进。 * 使用 TNS 连接字符串进行连接的选项 * 账户文件中的新简单凭据 * dbmsLob 模块中更好的读取文件方法(感谢 omair2084) * 版本 __2.2.1__ (__12/04/2017__): * 错误修复: * tnscmd 中的版本([信息](https://github.com/quentinhardy/odat/commit/9b7ec57cfed0fe74381edff28b73532562acaa2c)) * 外部模块(捕获 Oracle 错误) * 当“连接服务器失败”时捕获错误 * Tnscmd:“必须使用 '-d SID' 选项给出服务器 SID * tnspoison 模块中的 TypeError 错误修复 * 当 port!=1521 时的 TNS poisoning 模块(整数错误) * 改进: * 新 SID * 版本 __2.2__ (__25/03/2016__): * 一个新模块(_tnspoison_),用于利用 TNS 监听器中毒攻击(CVE-2012-1675)。非常感谢 [Joxean Koret](http://seclists.org/fulldisclosure/2012/Apr/204) 和 [donctl](https://github.com/donctl)。 * 一些错误修复 * 更好的帮助菜单 * ODAT 仓库中的 [__WIKI__ 页面](https://github.com/quentinhardy/odat/wiki) * 版本 __2.1__ (__04/03/2016__) : * 一个新模块(_cve_),用于利用某些 CVE(常见漏洞和暴露)。目前实现了 CVE-2012-3137(可能是这个数字,我不确定……):经过身份验证的用户可以修改他可以 select 的所有表,即使他通常不能修改它们(没有 ALTER 权限)。 * 用于远程认证攻击的新选项(__--accounts-files__),它使用 2 个不同的文件:登录列表和密码列表。 * 打印 10g 密码以兼容 oclHashcat。 * 错误修复(使用 __nc__ 监听)。 * 版本 __2.0__ (__21/02/2016__) : * 一个新模块(_privesc_),用于使用 Oracle 用户的系统权限(例如 CREATE ANY PROCEDURE)来获得特权访问(即 DBA)。ODAT 在此版本中可以使用的系统权限: * CREATE ANY PROCEDURE:以 APEX_040200 的权限执行任意请求(例如修改 Oracle 用户的密码) * CREATE PROCEDURE 和 EXECUTE ANY PROCEDURE:以 SYS 身份执行任意请求(例如向用户授予 DBA 角色) * CREATE ANY TRIGER(和 CREATE PROCEDURE):以 SYS 身份执行任意请求(例如向用户授予 DBA 角色) * ANALYZE ANY(和 CREATE PROCEDURE):以 SYS 身份执行任意请求(例如向用户授予 DBA 角色) * CREATE ANY INDEX(和 CREATE PROCEDURE):以 SYS 身份执行任意请求(例如向用户授予 DBA 角色) * 模块 _privesc_ 可用于获取所有授予的系统权限和角色。它显示了可用于获得特权访问的系统权限。 * 新选项用于调试时显示 ODAT 发送的 SQL 请求 * 独立版本移至 *releases*([https://github.com/quentinhardy/odat/releases/](https://github.com/quentinhardy/odat/releases/)) * 版本 __1.6__ (__14/07/2015__) : * 检测目标是否易受 TNS poisoning(CVE-2012-1675)攻击的新功能 * 名为 *unwrapper* 的新模块,用于从文件或远程数据库解包经过包装的 PL/SQL 源代码 * 做了一些改进 * 版本 __1.5__ (__17/03/2015__) : * 名为 *search* 的新模块,以便在列名中搜索 * 做了一些改进(例如:表的输出) * 新选项:输出编码 * 版本 __1.4__ (__07/12/2014__) : * 修复一些假阳性 * 改进 CVE-2012-3137 模块:更轻松地检查漏洞是否可以利用 * 版本 __1.3__ (__07/10/2014__) : * 在 *all* 模块中添加 *-C* 选项。此模块可用于使用包含凭据的文件(禁用 *-U* 和 *-P* 选项) * 添加 *tnscmd* 模块以获取 TNS *别名*、数据库*版本*(感谢 VSNNUM)和 TNS *状态* * 错误修复:可以将名称服务器提供给 *-s* 选项 * 版本 __1.2__ (__08/08/2014__) : * 添加 *SMB* 模块以捕获 SMB 身份验证 * 在 *Constants.py* 中添加选项(*SHOW_SQL_REQUESTS_IN_VERBOSE_MODE*)以显示发送到数据库服务器的 SQL 请求 * 版本 __1.1__ (__28/07/2014__) : * 添加 *DBMS_LOB* 模块,用于通过 Oracle Database 下载存储在远程服务器上的文件。 * 错误修复:Java 源代码:“不再支持 getenv,请使用 properties 和 -D 代替” * 版本 __1.0__ (__26/06/2014__) : * 第一个 ODAT 版本。 # 功能 借助 ODAT,你可以: * 通过以下方式在远程 Oracle 数据库监听器上搜索 __有效 SID__: * 字典攻击 * 暴力破解攻击 * 监听器的 ALIAS * 使用以下方式搜索 Oracle __账户__: * 字典攻击 * 每个 Oracle 用户作为密码(使用此攻击之前需要一个账户) * 使用以下方式在数据库服务器上 __执行系统命令__: * DBMS_SCHEDULER * JAVA * 外部表 * oradbg * 使用以下方式 __下载__ 存储在数据库服务器上的 __文件__: * UTL_FILE * DBMS_XSLPROCESSOR * 外部表 * CTXSYS * DBMS_LOB * 使用以下方式在数据库服务器上 __上传文件__: * UTL_FILE * DBMS_XSLPROCESSOR * DBMS_ADVISOR * 使用以下方式 __删除文件__: * UTL_FILE * 使用以下系统权限组合 __获取特权访问__(有关 *privesc* 模块命令,请参阅帮助): * CREATE ANY PROCEDURE * CREATE PROCEDURE 和 EXECUTE ANY PROCEDURE * CREATE ANY TRIGER(和 CREATE PROCEDURE) * ANALYZE ANY( CREATE PROCEDURE) * CREATE ANY INDEX(和 CREATE PROCEDURE) * 使用以下方式从数据库服务器 __发送/接收 HTTP 请求__: * UTL_HTTP * HttpUriType * 使用以下方式 __扫描__ 本地服务器或远程服务器的 __端口__: * UTL_HTTP * HttpUriType * UTL_TCP * 通过以下方式 __捕获 SMB 身份验证__: * 一个索引以触发 SMB 连接 * 利用某些 CVE: * [__CVE-2012-3137__](http://cvedetails.com/cve/2012-3137) * 获取任意用户的会话密钥和盐值 * 对会话进行字典攻击 * [__CVE-2012-????__](https://twitter.com/gokhanatil/status/595853921479991297):经过身份验证的用户可以修改他可以 select 的所有表,即使他通常不能修改它们(没有 ALTER 权限)。 * [__CVE-2012-1675__](http://seclists.org/fulldisclosure/2012/Apr/204)(又称 TNS poisoning 攻击) * 借助 *search* 模块 __在列名中搜索__: * 在列名中搜索模式(例如:password) * __解包__ PL/SQL 源代码(10g/11g 和 12c) * 获取 __系统权限__ 和 __授予的角色__。也可以获取授予的角色的权限和角色 * 执行任意 SELECT 请求(即最小 SQL shell) 此列表并非详尽无遗。 # 思维导图 - ODAT & Oracle Database 渗透测试 ![Alt text](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/52b035c47d081119.jpg) # 支持的平台和依赖项 ODAT 仅兼容 __Linux__。 存在 __独立版本__,以便无需安装依赖项(请参阅 [https://github.com/quentinhardy/odat/releases/](https://github.com/quentinhardy/odat/releases/))。 ODAT 独立版本是借助 *pyinstaller* 生成的。 如果你想在计算机上安装 __开发版本__,则需要以下工具和依赖项: * 语言:Python 3 * Oracle 依赖项: * Instant Oracle basic * Instant Oracle sdk * Python 库: * cx_Oracle * passlib * pycrypto * python-scapy * python-libnmap(Python 5.1 新增) * colorlog(推荐) * termcolor(推荐) * argcomplete(推荐) * pyinstaller(推荐) # 安装(可选,用于开发版本) 本部分介绍如何在 __Ubuntu__ 上安装 instantclient、CX_Oracle 和其他一些 Python 库,以获得 ODAT 开发版本。 不要忘记 [https://github.com/quentinhardy/odat/releases/](https://github.com/quentinhardy/odat/releases/) 存在 ODAT 独立版本:__使用独立版本无需安装任何东西__ * 克隆仓库以获取 ODAT 源代码: ``` git clone https://github.com/quentinhardy/odat.git ``` * 更新此仓库中的 wiki 页面以便在本地获取 ODAT 文档: ``` cd odat/ git submodule init git submodule update ``` * 从 Oracle 网站获取 instant client basic、sdk (devel) 和 sqlplus: * X64: http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html * X86: http://www.oracle.com/technetwork/topics/linuxsoft-082809.html * 目前(03/2021),如果你想用 pyinstaller 生成 ODAT 独立版,Oracle Database instant client 版本 11.2 是最佳版本。 要使用 ODAT 开发版本,可以使用最新版本的 Oracle 客户端(例如版本 19)。 * 安装 *python3-dev*、*alien* 和 *libaio1* 包(用于 sqlplus): ``` sudo apt-get install libaio1 python3-dev alien python3-pip ``` * 使用以下命令从 RPM 文件生成 DEB 文件: ``` sudo alien --to-deb oracle-instantclient19.3-basic-???.x???.rpm sudo alien --to-deb oracle-instantclient19.3-devel-???.x???.rpm ``` * 安装 instant client basic、sdk 和 sqlplus: ``` sudo dpkg -i oracle-instantclient19.3-basic-???.x???.deb sudo dpkg -i oracle-instantclient19.3-devel_???_???.deb ``` * 将这些行放入你的 */etc/profile* 文件中,以定义 Oracle *env* 变量: ``` export ORACLE_HOME=/usr/lib/oracle/19.3/client64/ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib export PATH=${ORACLE_HOME}bin:$PATH ``` * 重启你的会话(以应用环境变量) * 创建 */etc/ld.so.conf.d/oracle.conf* 文件并添加 Oracle 主目录的路径: ``` /usr/lib/oracle/19.3/client64/lib/ ``` * 使用以下命令更新 ldpath: ``` sudo ldconfig ``` * 安装 *CX_Oracle* ``` sudo -s source /etc/profile pip3 install cx_Oracle ``` * 测试是否一切正常: ``` python3 -c 'import cx_Oracle' ``` * 安装一些 Python 库: ``` sudo apt-get install python3-scapy sudo pip3 install colorlog termcolor pycrypto passlib python-libnmap sudo pip3 install argcomplete && sudo activate-global-python-argcomplete ``` * 下载并安装 python 3 的 pyinstaller __开发__ 版本 (http://www.pyinstaller.org/)。 ``` python setup.py install ``` * 或通过 pip 安装: ``` pip3 install pyinstaller ``` * 运行 ODAT: ``` ./odat.py -h ``` # 文档和示例 文档和示例位于 [__WIKI__](https://github.com/quentinhardy/odat/wiki) # 捐赠 如果你想通过捐赠来支持我的工作,我将不胜感激: * 通过 BTC: 36FugL6SnFrFfbVXRPcJATK9GsXEY6mJbf
标签:DBA, DNS解析, Oracle, Oracle 10g/11g/12c/18c/19c, PE 加载器, PoC, Python, SID探测, SYSDBA, TNS监听, 云资产清单, 命令执行, 开源项目, 提权, 无后门, 暴力破解, 特权提升, 自动化部署, 逆向工具, 逆向工程