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 渗透测试

# 支持的平台和依赖项
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监听, 云资产清单, 命令执行, 开源项目, 提权, 无后门, 暴力破解, 特权提升, 自动化部署, 逆向工具, 逆向工程