ODAT
ODAT (Oracle Database Attacking Tool) é uma ferramenta de teste de penetração open source que testa a segurança de Bases de Dados Oracle remotamente.
Exemplos de uso do ODAT:
- Tens uma base de dados Oracle à escuta remotamente e queres encontrar SIDs e credenciais válidas para te ligares à base de dados
- Tens uma conta Oracle válida numa base de dados e queres escalar os teus privilégios para te tornares DBA ou SYSDBA
- Tens uma conta Oracle e queres executar comandos de sistema (ex. reverse shell) para avançar no sistema operativo que aloja a base de dados
Testado em Oracle Database 10g, 11g, 12c, 18c e 19c.
Versão ODAT linux standalone em https://github.com/quentinhardy/odat/releases/. Nota: recomenda-se usar a versão de desenvolvimento (git clone), branch master-python3 (versão python 3).
Registo de alterações
- Versão 5.1.1 (27/04/2022):
- Exibe uma mensagem de aviso quando ocorre um "ORA-12519 - TNS:no appropriate service handler found". Este erro pode ser despoletado pelo servidor de base de dados (listener) quando demasiadas ligações foram estabelecidas (ao fazer brute-force de credenciais, por exemplo). Neste caso, a opção --sleep deve ser usada (ex. --sleep 0.2).
- Versão 5.1 (12/03/2021):
- Nova opção no módulo all: --nmap-file para carregar todas as bases de dados Oracle a partir de um ficheiro de saída XML do nmap
- Nova opção no módulo all: -l para carregar todos os alvos a partir de um ficheiro de texto (ip:porta ou ip em cada linha)
- No módulo all, é agora testada uma ligação TCP em cada alvo antes de iniciar os testes ODAT. --timeout-tcp-check pode ser usado para gerir o valor de timeout.
- No módulo all, é agora feito um teste em cada alvo para verificar se o listener TNS está bem configurado. Este teste é feito após o teste de ligação TCP.
- Nova opção global: --client-driver. Permite definir o nome do cliente para a ligação à base de dados (client_driver de V$SESSION_CONNECT_INFO). Útil para aplicações cujos utilizadores finais não sabem que cx_Oracle está a ser usado. Por defeito, agora é 'sql*plus'.
- O ODAT aceita agora um ficheiro sqlnet.ora. Um ficheiro predefinido está em conf/. O timeout de ligação TCP & OUTBOUND (TNS) está definido para 60 segundos por defeito agora.
- Versão 5.0 (08/02/2021):
- Novo módulo importante: Service Name Guesser, para procurar nomes de serviço (Service Names) válidos. Módulo específico chamado snguesser e também integrado no módulo all. Por defeito, o módulo all pesquisa agora todos os nomes de serviço válidos após pesquisar SIDs. Os SIDs podem ser idênticos ao Service Name. Quando um Service Name é encontrado mas não um SID, o Service Name pode ser usado como SID para ligação.
- Opção --basic-info no módulo search para obter algumas informações técnicas básicas sobre a base de dados/instância. Obtém Service Name, SID, bases de dados, estado do Oracle Database Vault, estado do Java, hostname, endereço IP do servidor, política de palavras-passe, privilégios de sistema atuais, funções atuais, patches (quando >= 12c e o utilizador tem privilégios), etc. Requer privilégios elevados para informações muito interessantes (ex. política de palavras-passe e estado de bloqueio).
Funcionalidades
Graças ao ODAT, podes:
- pesquisar SID válido num listener Oracle Database remoto através de:
- um ataque de dicionário
- um ataque de força bruta
- ALIAS do listener
- pesquisar contas Oracle usando:
- um ataque de dicionário
- cada utilizador Oracle como a palavra-passe (necessita de uma conta antes de usar este ataque)
- executar comandos de sistema no servidor de base de dados usando:
- DBMS_SCHEDULER
- JAVA
- tabelas externas
- oradbg
- descarregar ficheiros armazenados no servidor de base de dados usando:
- UTL_FILE
- DBMS_XSLPROCESSOR
- tabelas externas
- CTXSYS
- DBMS_LOB
- carregar ficheiros no servidor de base de dados usando:
- UTL_FILE
- DBMS_XSLPROCESSOR
- DBMS_ADVISOR
- eliminar ficheiros usando:
- obter acesso privilegiado usando as seguintes combinações de privilégios de sistema (consulta a ajuda para comandos do módulo privesc):
- CREATE ANY PROCEDURE
- CREATE PROCEDURE e EXECUTE ANY PROCEDURE
- CREATE ANY TRIGGER (e CREATE PROCEDURE)
- ANALYZE ANY (e CREATE PROCEDURE)
- CREATE ANY INDEX (e CREATE PROCEDURE)
- enviar/receber pedidos HTTP a partir do servidor de base de dados usando:
- digitalizar portas do servidor local ou de um servidor remoto usando:
- UTL_HTTP
- HttpUriType
- UTL_TCP
- capturar uma autenticação SMB através de:
- um índice para despoletar uma ligação SMB
- explorar algumas CVE:
- o CVE-2012-3137
- obter a chave de sessão e o salt para utilizadores arbitrários
- ataque por dicionário em sessões
- o CVE-2012-????: Um utilizador autenticado pode modificar todas as tabelas que consegue selecionar mesmo que normalmente não as possa modificar (sem privilégio ALTER).
Esta lista não é exaustiva.
Mapa mental - ODAT & testes de penetração Oracle Database

O ODAT é compatível apenas com Linux.
Existe uma versão standalone para não ser necessário instalar dependências (ver https://github.com/quentinhardy/odat/releases/).
O ODAT standalone foi gerado graças ao pyinstaller.
Se quiseres ter a versão de desenvolvimento instalada no teu computador, estas ferramentas e dependências são necessárias:
- Linguagem: Python 3
- Dependências Oracle:
- Instant Oracle basic
- Instant Oracle sdk
- Bibliotecas Python:
- cx_Oracle
- passlib
- pycrypto
- python-scapy
- python-libnmap (novo desde python 5.1)
- colorlog (recomendado)
- termcolor (recomendado)
- argcomplete (recomendado)
- pyinstaller (recomendado)
Instalação (opcional, para versão de desenvolvimento)
Esta parte descreve como instalar instantclient, CX_Oracle e algumas outras bibliotecas python no Ubuntu para ter a versão de desenvolvimento do ODAT.
Não te esqueças que existe uma versão standalone do ODAT em https://github.com/quentinhardy/odat/releases/: Não é necessário instalar nada para usar a versão standalone
- Clonar o repositório para obter o código fonte do ODAT:
git clone https://github.com/quentinhardy/odat.git
- Atualizar as páginas wiki neste repositório para obter a documentação do ODAT localmente:
cd odat/
git submodule init
git submodule update
-
Obter instant client basic, sdk (devel) e sqlplus do site da Oracle:
-
Por enquanto (03/2021), a versão 11.2 do instant client Oracle Database é a melhor se quiseres gerar o ODAT standalone com pyinstaller.
Para usar a versão de desenvolvimento do ODAT, pode ser usada a última versão do cliente Oracle (ex. versão 19).
-
Instalar o pacote python3-dev, alien e libaio1 (para sqlplus):
sudo apt-get install libaio1 python3-dev alien python3-pip
- Gerar ficheiros DEB a partir de ficheiros RPM com:
sudo alien --to-deb oracle-instantclient19.3-basic-???.x???.rpm
sudo alien --to-deb oracle-instantclient19.3-devel-???.x???.rpm
- Instalar instant client basic, sdk e sqlplus:
sudo dpkg -i oracle-instantclient19.3-basic-???.x???.deb
sudo dpkg -i oracle-instantclient19.3-devel_???_???.deb
- Colocar estas linhas no ficheiro /etc/profile para definir as variáveis env Oracle:
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
/usr/lib/oracle/19.3/client64/lib/
- Atualizar o ldpath usando:
sudo -s
source /etc/profile
pip3 install cx_Oracle
python3 -c 'import cx_Oracle'
Este comando deve apenas retornar sem erros.
- Instalar algumas bibliotecas 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
- ou instalar através do pip:
Bom trabalho se não tiveres erros:)
Documentação e exemplos
A documentação e exemplos estão no WIKI
Doação
Se quiseres apoiar o meu trabalho fazendo uma doação, agradeço muito:
- Via BTC: 36FugL6SnFrFfbVXRPcJATK9GsXEY6mJbf