<?xml version="1.0" encoding="ISO-8859-15"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sergio Hernando &#187; Auditoria Oracle</title>
	<atom:link href="http://www.sahw.com/wp/archivos/tag/auditoria-oracle/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sahw.com/wp</link>
	<description>Seguridad de la Información y Auditoría de Sistemas</description>
	<lastBuildDate>Tue, 07 Sep 2010 18:58:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Auditoría de contraseñas en Oracle Database (4 de 4). Ataques de diccionario sobre claves Oracle</title>
		<link>http://www.sahw.com/wp/archivos/2010/03/10/auditoria-de-contrasenas-en-oracle-database-4-de-4-ataques-de-diccionario-sobre-claves-oracle/</link>
		<comments>http://www.sahw.com/wp/archivos/2010/03/10/auditoria-de-contrasenas-en-oracle-database-4-de-4-ataques-de-diccionario-sobre-claves-oracle/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 19:58:07 +0000</pubDate>
		<dc:creator>Sergio Hernando</dc:creator>
				<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Auditoria Oracle]]></category>
		<category><![CDATA[Contraseñas Oracle]]></category>
		<category><![CDATA[Oracle audit]]></category>
		<category><![CDATA[Oracle passwords]]></category>
		<category><![CDATA[Oracle security]]></category>
		<category><![CDATA[Seguridad Oracle]]></category>

		<guid isPermaLink="false">http://www.sahw.com/wp/?p=5886</guid>
		<description><![CDATA[TEMARIO Auditoría de contraseñas en Oracle Database (1 de 4). Introducción y primeros pasos Auditoría de contraseñas en Oracle Database (2 de 4). Adivinación de Oracle SID (System ID) Auditoría de contraseñas en Oracle Database (3 de 4). Fuerza bruta sobre claves Oracle Auditoría de contraseñas en Oracle Database (4 de 4). Ataques de diccionario [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>TEMARIO</p>
<p><a href="http://www.sahw.com/wp/archivos/2010/02/27/auditoria-de-contrasenas-en-oracle-database-1-de-4-introduccion-y-primeros-pasos/">Auditoría de contraseñas en Oracle Database (1 de 4). Introducción y primeros pasos</a><br />
<a href="http://www.sahw.com/wp/archivos/2010/02/28/auditoria-de-contrasenas-en-oracle-database-2-de-4-adivinacion-de-oracle-sid-system-id/">Auditoría de contraseñas en Oracle Database (2 de 4). Adivinación de Oracle SID (System ID)</a><br />
<a href="http://www.sahw.com/wp/archivos/2010/03/02/auditoria-de-contrasenas-en-oracle-database-3-de-4-fuerza-bruta-sobre-claves-oracle/">Auditoría de contraseñas en Oracle Database (3 de 4). Fuerza bruta sobre claves Oracle</a><br />
<strong><a href="http://www.sahw.com/wp/archivos/2010/03/10/auditoria-de-contrasenas-en-oracle-database-4-de-4-ataques-de-diccionario-sobre-claves-oracle/">Auditoría de contraseñas en Oracle Database (4 de 4). Ataques de diccionario sobre claves Oracle</a></strong></p></blockquote>
<p>Finalizamos la serie hablando de ataques de diccionario en el mundo de las contraseñas de Oracle. <a href="http://www.sahw.com/wp/archivos/2010/03/02/auditoria-de-contrasenas-en-oracle-database-3-de-4-fuerza-bruta-sobre-claves-oracle/">En el tercer capítulo de la entrega</a> comentamos cómo se obtenían las distintas combinaciones de usuario y hash de clave en Oracle. Recordad que propusimos algunos ejemplos reales en una instalación XE, disponibles en <a href="http://www.sahw.com/images/oracle_audit/usuarios.txt">http://www.sahw.com/images/oracle_audit/usuarios.txt</a>.</p>
<p>Los ataques de diccionario son tremendamente fáciles de ejecutar cuando se dispone de los <em>hashes</em>, y dependerá de la calidad de nuestro diccionario, así como de la complejidad de la clave a analizar, el éxito de la prueba. Como en cualquier otro ataque de diccionario, se trata de obtener el <em>hash</em> de una palabra conocida (presente en el diccionario) y verificar si es igual al del usuario cuya contraseña estamos analizando. En caso de que coincidan, la clave del usuario será la palabra que estemos empleando en el diccionario.</p>
<p><strong>Ejemplos</strong></p>
<p>Una de las herramientas más conocidas, aunque no es la única, es <em>checkpwd</em>, que podéis obtener en <a href="http://www.red-database-security.com/software/checkpwd.html">http://www.red-database-security.com/software/checkpwd.html</a>. Su empleo es extremadamente sencillo, y puede ejecutarse en Windows, Linux y MacOS. Cuenta además con un binario que realizará la verificación sin mostrar la contraseña, con lo que se puede preservar el conocimiento de la misma. Adicionalmente permite al auditor ejecutar la verificación tanto <em>offline</em> como directamente contra la base de datos, método con el cual no haría falta obtener la relación de <em>hashes</em>.</p>
<p><img src="http://www.sahw.com/images/oracle_audit/passwords9.png" alt="Oracle Audit" /></p>
<p>En el siguiente ejemplo, conectamos a la base de datos y hacemos la verificación. El operador <em>-quiet</em> hará que solo se muestren las contraseñas que sea posible vencer por ataque de diccionario, no apareciendo las claves que resitan el ataque:</p>
<p><img src="http://www.sahw.com/images/oracle_audit/passwords10.png" alt="Oracle Audit" /></p>
<p>Los métodos de ataque en línea no están recomendados, salvo que se tenga permiso expreso para ello. Por tanto, si tenéis que analizar <em>offline</em> un fichero con cientos o incluso miles de usuarios, emplear la utilidad se vuelve tedioso, ya que para cada caso, hay que introducir el usuario y el <em>hash</em>. Para facilitaros la vida, he escrito este sencillo script Perl con el que sólo hay que procurar tener un fichero llamado <em>usersandpasswordhashes.txt</em> en el que en cada linea, separado por al menos un espacio, haya una relación de usuario y <em>hash</em>. Los usuarios de sistemas no Windows, siéntanse libres de modificar las llamadas al sistema.</p>
<pre class="perl">&nbsp;
<span style="color: #808080; font-style: italic;">#!/usr/bin/perl -w</span>
<span style="color: #808080; font-style: italic;"># chechpwd.exe automation </span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$input</span>=<span style="color: #ff0000;">&quot;usersandpasswordhashes.txt&quot;</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$output</span>=<span style="color: #ff0000;">&quot;checkpwd_audit_results.txt&quot;</span>;
&nbsp;
<a href="http://perldoc.perl.org/functions/open.html"><span style="color: #000066;">open</span></a> <span style="color: #66cc66;">&#40;</span>INPUT,<span style="color: #ff0000;">&quot;&lt; $input&quot;</span><span style="color: #66cc66;">&#41;</span> || <a href="http://perldoc.perl.org/functions/die.html"><span style="color: #000066;">die</span></a> <span style="color: #ff0000;">&quot;ERROR: Cannot open entry file $input<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
&nbsp;
<span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$line</span>=<span style="color: #009999;">&lt;INPUT&gt;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>	
&nbsp;
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@string</span> = <a href="http://perldoc.perl.org/functions/split.html"><span style="color: #000066;">split</span></a> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot; &quot;</span>, <span style="color: #0000ff;">$line</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$userandhash</span> = <span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span>.<span style="color: #ff0000;">&quot;:&quot;</span>.<span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span>;
    <a href="http://perldoc.perl.org/functions/print.html"><span style="color: #000066;">print</span></a> <span style="color: #ff0000;">&quot;Analyzing username $string[0]<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
	<a href="http://perldoc.perl.org/functions/system.html"><span style="color: #000066;">system</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;ECHO ===================== &gt;&gt; $output&quot;</span><span style="color: #66cc66;">&#41;</span>;
	<a href="http://perldoc.perl.org/functions/system.html"><span style="color: #000066;">system</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;ECHO $string[0] &gt;&gt; $output&quot;</span><span style="color: #66cc66;">&#41;</span>;
	<a href="http://perldoc.perl.org/functions/system.html"><span style="color: #000066;">system</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;ECHO ===================== &gt;&gt; $output&quot;</span><span style="color: #66cc66;">&#41;</span>;
	<a href="http://perldoc.perl.org/functions/system.html"><span style="color: #000066;">system</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;checkpwd.exe $userandhash password_file.txt &gt;&gt; $output&quot;</span><span style="color: #66cc66;">&#41;</span>;
    <a href="http://perldoc.perl.org/functions/system.html"><span style="color: #000066;">system</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;ECHO. &gt;&gt; $output&quot;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span> 
&nbsp;
<a href="http://perldoc.perl.org/functions/close.html"><span style="color: #000066;">close</span></a> INPUT;
&nbsp;</pre>
<p>Tenéis un ejemplo del fichero que produce el <em>script</em> en <a href="http://www.sahw.com/images/oracle_audit/checkpwd_audit_results.txt">http://www.sahw.com/images/oracle_audit/checkpwd_audit_results.txt</a></p>
<p>Pues aquí acaba nuestro recorrido por la auditoría de contraseñas en Oracle Database. Espero que estos contenidos os sean de utilidad y os ayuden a mejorar la calidad de las claves presentes en vuestros sistemas.</p>
<p>Un saludo,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sahw.com/wp/archivos/2010/03/10/auditoria-de-contrasenas-en-oracle-database-4-de-4-ataques-de-diccionario-sobre-claves-oracle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Auditoría de contraseñas en Oracle Database (3 de 4). Fuerza bruta sobre claves Oracle</title>
		<link>http://www.sahw.com/wp/archivos/2010/03/02/auditoria-de-contrasenas-en-oracle-database-3-de-4-fuerza-bruta-sobre-claves-oracle/</link>
		<comments>http://www.sahw.com/wp/archivos/2010/03/02/auditoria-de-contrasenas-en-oracle-database-3-de-4-fuerza-bruta-sobre-claves-oracle/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 23:32:07 +0000</pubDate>
		<dc:creator>Sergio Hernando</dc:creator>
				<category><![CDATA[Auditoria]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Auditoria Oracle]]></category>
		<category><![CDATA[Contraseñas Oracle]]></category>
		<category><![CDATA[Oracle audit]]></category>
		<category><![CDATA[Oracle passwords]]></category>
		<category><![CDATA[Oracle security]]></category>
		<category><![CDATA[Seguridad Oracle]]></category>

		<guid isPermaLink="false">http://www.sahw.com/wp/?p=5860</guid>
		<description><![CDATA[TEMARIO Auditoría de contraseñas en Oracle Database (1 de 4). Introducción y primeros pasos Auditoría de contraseñas en Oracle Database (2 de 4). Adivinación de Oracle SID (System ID) Auditoría de contraseñas en Oracle Database (3 de 4). Fuerza bruta sobre claves Oracle Auditoría de contraseñas en Oracle Database (4 de 4). Ataques de diccionario [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>TEMARIO</p>
<p><a href="http://www.sahw.com/wp/archivos/2010/02/27/auditoria-de-contrasenas-en-oracle-database-1-de-4-introduccion-y-primeros-pasos/">Auditoría de contraseñas en Oracle Database (1 de 4). Introducción y primeros pasos</a><br />
<a href="http://www.sahw.com/wp/archivos/2010/02/28/auditoria-de-contrasenas-en-oracle-database-2-de-4-adivinacion-de-oracle-sid-system-id/">Auditoría de contraseñas en Oracle Database (2 de 4). Adivinación de Oracle SID (System ID)</a><br />
<strong><a href="http://www.sahw.com/wp/archivos/2010/03/02/auditoria-de-contrasenas-en-oracle-database-3-de-4-fuerza-bruta-sobre-claves-oracle/">Auditoría de contraseñas en Oracle Database (3 de 4). Fuerza bruta sobre claves Oracle</a></strong><br />
Auditoría de contraseñas en Oracle Database (4 de 4). Ataques de diccionario sobre claves Oracle</p></blockquote>
<p>Buenas,</p>
<p>Continuando con lo explicado en los dos primeros artículos toca hablar de cómo utilizar ataques de fuerza bruta para evaluar la calidad de las claves Oracle. No obstante, antes de hacerlo, es preciso comprender dónde y cómo se almacenan las claves.</p>
<p><strong>Distintas versiones, distintas ubicaciones</strong></p>
<p>Las contraseñas Oracle se guardan, por norma general, en una tabla llamada <em>DBA_USERS</em>. Excepciones a esta norma hay muchas, así por ejemplo, <em>SYS.USER$</em>, o la tabla <em>USERS$</em>, lugar donde se almacenan en la versión XE que estamos utilizando para esta serie de artículos.</p>
<p><img src="http://www.sahw.com/images/oracle_audit/passwords1.png" alt="Oracle passwords" /></p>
<p>Históricamente la presencia de numerosos usuarios de sistema en la configuración de fábrica ha supuesto y sigue suponiendo muchos problemas para la seguridad Oracle. Me recuerda al caso de los servidores de largo y medio alcance de IBM, donde los sistemas operativos suelen venir con una cantidad ingente de usuarios creados que si no son modificados pueden provocar un problema cuando el sistema entre en producción.</p>
<p>A lo largo de los años, y según han ido cambiando las versiones de Oracle, también han ido cambiando los métodos de generación y conservación de claves. Desde el cifrado de la concatenación de usuario y clave en las versiones entre 7 y 10g R2 hasta el empleo de <em>salts</em> en 11g, donde se emplea SHA-1 para generar un <em>hash</em> de la concatenación de clave y <em>salt</em>. Para cada versión el auditor debe repasar la documentación y comprender cómo y dónde se conservan las claves. Tenéis un estupendo artículo al respecto en <a href="http://www.red-database-security.com/whitepaper/oracle_passwords.html">http://www.red-database-security.com/whitepaper/oracle_passwords.html</a> que puede servir de orientación.</p>
<p>Es importante reseñar que desde la versión 11g en adelante los <em>hashes</em> no se almacenan en DBA_USERS. En esta versión hay que recuperar los campos <em>name</em> y <em>spare4</em> de <em>SYS.USER$</em>. </p>
<blockquote><p>SELECT name,spare4 FROM SYS.USER$ WHERE password is not null;</p></blockquote>
<p>Tampoco entraremos a comentar otras ubicaciones donde puedan estar presentes los <em>hashes</em> de las claves, como las vistas que se hayan creado, duplicados de las tablas, <em>rollbacks</em>, copias de seguridad, etc. En definitiva, la misión del auditor es identificar dónde están las claves y obtener la relación usuario-<em>hash</em> para poder así realizar una verificación de calidad de las mismas. También es importante determinar quién puede obtener esos datos, qué permisos son necesarios y por supuesto, hay que indagar en todos los métodos posibles para obtenerlos, incluyendo el <em>pentesting</em>.</p>
<p><strong>Caja negra, gris y blanca</strong></p>
<p>En el primero de los casos, las pruebas irán encaminadas, mediante <em>pentesting</em>, a hacernos con un listado de usuarios y <em>hash</em> de clave para tratar de obtener claves en claro. El ataque constará de dos partes:</p>
<ul>
<li>Intrusión al sistema, habitualmente por cuentas con clave por defecto no modificadas o bien aprovechando algún <em>exploit</em> que nos permita el acceso.</li>
<li>Extracción de relación de usuarios y <em>hashes</em>, bien por haber logrado acceso privilegiado que permita hacerlo directamente, bien por provocar escalada de privilegios que nos permita finalmente obtener la relación. En algunos casos, si la configuración de seguridad no es adecuada, bastará con tener los privilegios mínimos para obtener la relación.</li>
</ul>
<p>En el caso de caja gris el auditor tratará de obtener la relación de usuarios empleando las credenciales no privilegiadas que le han sido entregadas. Es frecuente, por mala configuración, que incluso los perfiles más bajos puedan obtener la relación de usuarios y <em>hashes</em>. Este modelo es análogo al de caja negra, pero con la diferencia de que el auditor contará de partida con una cuenta en el sistema.</p>
<p>Para el caso de caja blanca, que será el que ejemplifiquemos, el auditor solicitará al DBA que extraiga la relación de usuarios y <em>hashes</em> para analizarlas.</p>
<p><strong>Los usuarios especiales y los datos críticos, el botín más cotizado</strong></p>
<p>Siempre que sea posible, habida cuenta de que por defecto son las cuentas más poderosas, el análisis tendrá en cuenta especialmente los siguientes usuarios: SYS, SYSTEM, SYSMAN y DBSNMP. En la documentación hallaréis descripciones de cada uno de estos usuarios. </p>
<p>No debemos perder de vista los usuarios con privilegios elevados (DBA y otros) que se hayan podido crear tras la instalación. Basta con descuidar un sólo perfil privilegiado para que un atacante tome control total de la instalación. Es tan importante que SYS disponga de una clave de alta calidad como cualquier otro usuario creado con perfil suficiente para acceder a los datos críticos. No olvidemos que en Oracle la seguridad debe siempre enfocarse a la seguridad de los datos, así pues, si el usuario SHERNANDO tiene privilegios mínimos globales pero es dueño de la tabla más importante del sistema, su compromiso es equivalente al de comprometer la cuenta SYS.</p>
<p><strong>Fuerza bruta sobre las claves</strong></p>
<p>En nuestro ejemplo vamos a crear algunos usuarios adicionales con distintas claves:</p>
<p><img src="http://www.sahw.com/images/oracle_audit/passwords2.png" alt="Oracle passwords" /></p>
<p>A continuación, sacaremos a fichero todas las relaciones usuario-<em>hash</em>, empleando el comando <em>spool</em>.</p>
<p><img src="http://www.sahw.com/images/oracle_audit/passwords3.png" alt="Oracle passwords" /></p>
<p>Recogemos el fichero, en este caso de <em>C:\XEClient\bin</em> y lo ponemos a buen recaudo. He dejado una copia del fichero en <a href="http://www.sahw.com/images/oracle_audit/usuarios.txt">http://www.sahw.com/images/oracle_audit/usuarios.txt</a> por si queréis utilizarlo.</p>
<p>Hay infinidad de programas para someter a los <em>hashes</em> obtenidos a fuerza bruta. <a href="http://www.toolcrypt.org/index.html?orabf">Uno de los más populares es orabf</a>, que incluye una lista de claves habituales y diversas opciones para construir los ataques de fuerza bruta. Veamos un ejemplo de cómo se utiliza:</p>
<p><img src="http://www.sahw.com/images/oracle_audit/passwords4.png" alt="Oracle passwords" /></p>
<p>En el ejemplo anterior vemos cómo el usuario SYS tiene una clave por defecto llamada <em>password</em>, que ni siquiera ha sido preciso romper mediante fuerza bruta puesto que estaba en el diccionario. Otro ejemplo: </p>
<p><img src="http://www.sahw.com/images/oracle_audit/passwords5.png" alt="Oracle passwords" /></p>
<p>En este caso ha bastado un minuto para averiguar la clave. Veamos qué pasa si cambiamos la clave de <em>pass2</em> a <em>clave2</em> (ampliamos de 5 a 6 caracteres)</p>
<p><img src="http://www.sahw.com/images/oracle_audit/passwords6.png" alt="Oracle passwords" /></p>
<p>Sometemos el nuevo <em>hash</em> a fuerza bruta:</p>
<p><img src="http://www.sahw.com/images/oracle_audit/passwords7.png" alt="Oracle passwords" /></p>
<p>Como era previsible, el tiempo de ataque se ha elevado a varios minutos. A mayor calidad de la clave, más tiempo. Por lo general el tiempo de cómputo elevado no hace rentable los intentos de fuerza bruta en claves complejas de 7 o más caracteres. </p>
<p>Existen infinidad de herramientas para fuerza bruta: herramientas W32 como la mostrada, UNIX, procedimientos PL/SQL, scripts Perl ... Tenéis una buena selección de las mismas en <a href="http://www.petefinnigan.com/tools.htm">http://www.petefinnigan.com/tools.htm</a>, y cada día aparecen más. Cuestión de probarlas, y elegir la que más os guste.</p>
<p><strong>Fuerza bruta con múltiples cuentas</strong></p>
<p>Entre las muchas herramientas existentes <a href="http://inguma.sourceforge.net/">siempre recomiendo Inguma</a>, de Joxean Koret, un <em>framework</em> de seguridad bastante completo que además tiene funcionalidades específicas para Oracle. Además de su versatilidad, Inguma está escrita en Python, con lo que es multiplataforma, y para el caso que nos ocupa tiene un módulo de fuerza bruta para contraseñas Oracle llamado <em>bruteora</em> que podemos lanzar contra las cuentas usuales en la base de datos:</p>
<p><img src="http://www.sahw.com/images/oracle_audit/passwords8.png" alt="Oracle passwords" /></p>
<p>Al ser código abierto, es fácil incorporar las cuentas declaradas en la base de datos para complementar las cuentas frecuentes empleadas por Inguma, con lo que finalmente es posible obtener también una valoración de la calidad de todas las contraseñas que existan en el sistema. Este método, a diferencia de otros, es <em>online</em>, con lo que el auditor debe tener presente el impacto sobre el sistema a auditar.</p>
<p>Un saludo,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sahw.com/wp/archivos/2010/03/02/auditoria-de-contrasenas-en-oracle-database-3-de-4-fuerza-bruta-sobre-claves-oracle/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Auditoría de contraseñas en Oracle Database (2 de 4). Adivinación de Oracle SID (System ID)</title>
		<link>http://www.sahw.com/wp/archivos/2010/02/28/auditoria-de-contrasenas-en-oracle-database-2-de-4-adivinacion-de-oracle-sid-system-id/</link>
		<comments>http://www.sahw.com/wp/archivos/2010/02/28/auditoria-de-contrasenas-en-oracle-database-2-de-4-adivinacion-de-oracle-sid-system-id/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 14:13:02 +0000</pubDate>
		<dc:creator>Sergio Hernando</dc:creator>
				<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Auditoria Oracle]]></category>
		<category><![CDATA[Contraseñas Oracle]]></category>
		<category><![CDATA[Oracle audit]]></category>
		<category><![CDATA[Oracle passwords]]></category>
		<category><![CDATA[Oracle security]]></category>
		<category><![CDATA[Seguridad Oracle]]></category>

		<guid isPermaLink="false">http://www.sahw.com/wp/?p=5825</guid>
		<description><![CDATA[TEMARIO Auditoría de contraseñas en Oracle Database (1 de 4). Introducción y primeros pasos Auditoría de contraseñas en Oracle Database (2 de 4). Adivinación de Oracle SID (System ID) Auditoría de contraseñas en Oracle Database (3 de 4). Fuerza bruta sobre claves Oracle Auditoría de contraseñas en Oracle Database (4 de 4). Ataques de diccionario [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>TEMARIO</p>
<p><a href="http://www.sahw.com/wp/archivos/2010/02/27/auditoria-de-contrasenas-en-oracle-database-1-de-4-introduccion-y-primeros-pasos/">Auditoría de contraseñas en Oracle Database (1 de 4). Introducción y primeros pasos</a><br />
<strong><a href="http://www.sahw.com/wp/archivos/2010/02/28/auditoria-de-contrasenas-en-oracle-database-2-de-4-adivinacion-de-oracle-sid-system-id/">Auditoría de contraseñas en Oracle Database (2 de 4). Adivinación de Oracle SID (System ID)</a></strong><br />
Auditoría de contraseñas en Oracle Database (3 de 4). Fuerza bruta sobre claves Oracle<br />
Auditoría de contraseñas en Oracle Database (4 de 4). Ataques de diccionario sobre claves Oracle</p></blockquote>
<p>Hola,</p>
<p>En la introducción que hicimos ayer vimos que para conectar a una instancia Oracle es necesario, antes de autenticarnos, alcanzar el <em>Oracle Listener</em>, y para eso hacen falta 3 datos:</p>
<ul>
<li>La dirección de la máquina (<em>hostname</em> o IP)</li>
<li>El puerto donde Oracle Listener está a la escucha</li>
<li>El SID (System ID), o identificador del sistema</li>
</ul>
<p>El <em>listener</em> es un proceso que corre en el lado del servidor que como su propio nombre indica, realiza escuchas a las peticiones de conexión con el objetivo de gestionar las conexiones entrantes. Cuando se hace una petición, esta llega al <em>listener</em>, el cual verifica que contiene los parámetros que han sido definidos en el servidor (mediante el fichero <em>listener.ora</em>). Si la verificación es positiva, se permite al cliente peticionario establecer conexión con el servidor, lo que posibilita que pueda a posteriori autenticarse con su usuario y contraseña.</p>
<p>Este fichero está normalmente ubicado en <em>$ORACLE_HOME/network/admin</em>, si tenemos una versión UNIX, o en <em>ORACLE_HOME\network\admin</em> si tenemos una versión Windows. En el caso de la versión Express Edition que estamos utilizando para nuestros ejemplos, este fichero reside por defecto en <em>C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN</em> junto a los ficheros de configuración <em>sqlnet.ora</em> y <em>tnsnames.ora</em>, comentado en el artículo anterior. Por defecto, el fichero <em>listener.ora</em> tiene los siguientes contenidos:</p>
<blockquote><p>
SID_LIST_LISTENER =<br />
  (SID_LIST =<br />
    (SID_DESC =<br />
      (SID_NAME = PLSExtProc)<br />
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)<br />
      (PROGRAM = extproc)<br />
    )<br />
    (SID_DESC =<br />
      (SID_NAME = CLRExtProc)<br />
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)<br />
      (PROGRAM = extproc)<br />
    )<br />
  )</p>
<p>LISTENER =<br />
  (DESCRIPTION_LIST =<br />
    (DESCRIPTION =<br />
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))<br />
      (ADDRESS = (PROTOCOL = TCP)(HOST = nimoy)(PORT = 1521))<br />
    )<br />
  )</p>
<p>DEFAULT_SERVICE_LISTENER = (XE)</p></blockquote>
<p>Del fichero anterior se deduce que para la versión de Oracle Express que estamos utilizando, el SID principal es <em>XE</em>, que el host se llama <em>nimoy</em> (es local, puede ser invocado mediante 127.0.0.1) y que el puerto es 1521. Esta información casa a la perfección con las declaraciones que hay que hacer en <em>tnsnames.ora</em> documentadas en el artículo anterior. Estos son los tres datos que nos permitirán conectar al <em>listener</em>.</p>
<p><strong>¿Es el SID un dato adivinable?</strong></p>
<p>La respuesta es sí. Todo se basa en que si el SID es incorrecto cuando intentamos conectar se devuelve al cliente un mensaje <em>ORA-12505: TNS:listener does not currently know of SID given in connect descriptor</em>, lo que puede ser utilizado para determinar que pese a que la dirección y el puerto son correctos, el SID no lo es.</p>
<p>Esto hace extremadamente sencillo programar una utilidad que lance peticiones al <em>listener</em> empleando los SID más comunes, y que verifique si se devuelven mensajes del tipo ORA-12505, lo que permite dilucidar si la base de datos está empleado un SID por defecto o adivinable en cuestión de segundos. Ejemplos de adivinadores de SID son <a href="http://www.red-database-security.com/whitepaper/oracle_guess_sid.html">sidguess de Red Database Security</a>, o <a href="http://www.cqure.net/wp/sidguesser/">SIDguesser de Patrik Karlsson</a>. La diferencia fundamental entre ambas es que sidguess permite la adivinación del SID mediante ataque de diccionario y fuerza bruta, mientras que SIDguesser sólo emplea diccionario. Para esta última modalidad, tenéis publicada una lista de SIDs comunes en <a href="http://www.red-database-security.com/scripts/sid.txt">http://www.red-database-security.com/scripts/sid.txt</a>. </p>
<p>Otras herramientas para la adivinación de SID son:</p>
<ul>
<li><a href="http://inguma.sourceforge.net/">Inguma</a>, de Joxean Koret, un excelente framework que incluye un módulo específico de adivinación de SID (<em>CSidGuess.py</em>). Ojo: Requiere los módulos Python <em>cx_Oracle</em> y <em>readline</em></li>
<li>The Oracle Assessment Kit (OAK), de David Litchfield.  Se puede descargar en <a href="http://www.vulnerabilityassessment.co.uk/oak.htm">http://www.vulnerabilityassessment.co.uk/oak.htm</a></li>
<li>oscanner, también de Patrick Karlsson, que además de enumeración SID realiza otras tareas de auditoría en la base de datos. Se puede descargar en <a href="http://www.cqure.net/wp/oscanner/">http://www.cqure.net/wp/oscanner/</a></li>
<li>También es posible usar Metasploit para estos menesteres, a través del módulo <em>sid_brute</em>. Otros módulos están disponibles, como <em>spy_sid</em>, pero debe tenerse en cuenta que en las versiones 9.2.0.8 y superiores, el listener está protegido y hay que recurrir a la fuerza bruta o adivinación. En cualquier caso, la adivinación de SIDs puede ser obtenida mediante consultas directas al listener (<em>sid_enum</em>), aplicando fuerza bruta y/o diccionario (<em>sid_brute</em>), así como realizando consultas a otros componentes que puedan contener el SID (<em>sid_enum+spy_sid</em>)</li>
</ul>
<p>Algunos ejemplos:</p>
<p><strong>SIDguesser en la instalación por defecto de Oracle XE</strong></p>
<p><img src="http://www.sahw.com/images/oracle_audit/sidguesser1.png" alt="Oracle SIDguesser " /></p>
<p><strong>sidguess (diccionario) en la instalación por defecto de Oracle XE</strong></p>
<p><img src="http://www.sahw.com/images/oracle_audit/sidguess1.png" alt="Oracle sidguess" /></p>
<p><strong>sidguess (fuerza bruta) en la instalación por defecto de Oracle XE</strong></p>
<p><img src="http://www.sahw.com/images/oracle_audit/sidguess2.png" alt="Oracle sidguess" /></p>
<p><strong>OAK (ora-brutesid) en la instalación por defecto de Oracle XE</strong></p>
<p><img src="http://www.sahw.com/images/oracle_audit/oak1.png" alt="OAK" /></p>
<p><strong>OAK (ora-getsid) en la instalación por defecto de Oracle XE</strong></p>
<p><img src="http://www.sahw.com/images/oracle_audit/oak2.png" alt="OAK" /></p>
<p><strong>inguma (sidguess) en la instalación por defecto de Oracle XE</strong></p>
<p><img src="http://www.sahw.com/images/oracle_audit/inguma1.png" alt="inguma" /></p>
<p><strong>Metasploit (sid_brute) en la instalación por defecto de Oracle XE</strong></p>
<p><img src="http://www.sahw.com/images/oracle_audit/metasploit1.png" alt="Oracle Metasploit" /></p>
<p><strong>Enumeración Metasploit (sid_enum) fallida por protección de listener</strong></p>
<p><img src="http://www.sahw.com/images/oracle_audit/metasploit2.png" alt="Oracle Metasploit" /></p>
<p>Y que nadie olvide una de las maneras más simples de obtener los SID: empleando <em>Oracle listener control utility</em>. Nótese que los comandos <em>status</em> y <em>services</em> de esta utilidad no pueden ser lanzados remotamente si la autenticación contra el sistema operativo está activa (<em>LOCAL_OS_AUTHENTICATION</em>), cosa que sucede por defecto en las versiones 10g R1 y superiores.</p>
<p><img src="http://www.sahw.com/images/oracle_audit/lsnrctl.png" alt="Listener Control" /></p>
<p><img src="http://www.sahw.com/images/oracle_audit/lsnrctl2.png" alt="Listener Control" /></p>
<p>A la vista de lo explicado, el primer paso fundamental para proteger las contraseñas es proteger la base de datos. La regla número uno del buen DBA es siempre instalar instancias de Oracle cuyo SID no sea adivinable y cuyo contenido no sea revelable mediante ningún tipo de consulta, y a la vista está el porqué.</p>
<p>Un saludo,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sahw.com/wp/archivos/2010/02/28/auditoria-de-contrasenas-en-oracle-database-2-de-4-adivinacion-de-oracle-sid-system-id/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Auditoría de contraseñas en Oracle Database (1 de 4). Introducción y primeros pasos</title>
		<link>http://www.sahw.com/wp/archivos/2010/02/27/auditoria-de-contrasenas-en-oracle-database-1-de-4-introduccion-y-primeros-pasos/</link>
		<comments>http://www.sahw.com/wp/archivos/2010/02/27/auditoria-de-contrasenas-en-oracle-database-1-de-4-introduccion-y-primeros-pasos/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 14:27:43 +0000</pubDate>
		<dc:creator>Sergio Hernando</dc:creator>
				<category><![CDATA[Auditoria]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Auditoria Oracle]]></category>
		<category><![CDATA[Oracle audit]]></category>
		<category><![CDATA[Oracle database]]></category>
		<category><![CDATA[Oracle security]]></category>

		<guid isPermaLink="false">http://www.sahw.com/wp/?p=5789</guid>
		<description><![CDATA[TEMARIO Auditoría de contraseñas en Oracle Database (1 de 4). Introducción y primeros pasos Auditoría de contraseñas en Oracle Database (2 de 4). Adivinación de Oracle SID (System ID) Auditoría de contraseñas en Oracle Database (3 de 4). Fuerza bruta sobre claves Oracle Auditoría de contraseñas en Oracle Database (4 de 4). Ataques de diccionario [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>TEMARIO</p>
<p><strong><a href="http://www.sahw.com/wp/archivos/2010/02/27/auditoria-de-contrasenas-en-oracle-database-1-de-4-introduccion-y-primeros-pasos/">Auditoría de contraseñas en Oracle Database (1 de 4). Introducción y primeros pasos</a></strong><br />
<a href="http://www.sahw.com/wp/archivos/2010/02/28/auditoria-de-contrasenas-en-oracle-database-2-de-4-adivinacion-de-oracle-sid-system-id/">Auditoría de contraseñas en Oracle Database (2 de 4). Adivinación de Oracle SID (System ID)</a><br />
Auditoría de contraseñas en Oracle Database (3 de 4). Fuerza bruta sobre claves Oracle<br />
Auditoría de contraseñas en Oracle Database (4 de 4). Ataques de diccionario sobre claves Oracle</p></blockquote>
<p>Buenas,</p>
<p>He recibido durante los últimos meses alguna que otra petición para que hablara de la auditoría de productos Oracle. Me es imposible escribir entradas para cada uno de los productos de esta compañía, porque además de ser <a href="http://www.oracle.com/us/products/index.htm">muy numerosos</a> y complejos, algunos son sólo de aplicación en entornos muy determinados, con lo que el ejercicio sólo tendría interés para unos pocos. Hablamos de los productos y servicios tan variopintos como la gama <em>on demand</em>, <em>Fusion middleware</em>, <em>Portal</em>, <em>Data mining</em>, <em>OLAP</em> y dentro del mundo de aplicaciones podríamos citar la gestión centralizada de datos (MDM), sectoriales para banca, finanzas, capital humano, JD Edwards, Peoplesoft, Siebel ... la lista es demasiado larga para escribirla completa.</p>
<p>Sin embargo, me vienen a la mente dos productos que quizás si gocen de más popularidad. En la mayoría de corporaciones son los dos <em>entry-level products</em> por excelencia, y es relativamente frecuente toparse con ellos. Se trata de <a href="http://www.oracle.com/us/products/applications/ebusiness/index.htm">Oracle E-Business Suite</a> y cómo no, de <a href="http://www.oracle.com/us/products/database/index.htm">Oracle Database</a>, la base de datos. Podríamos escribir muchísimo sobre ambos, ya que son productos extremadamente extensos y complejos, pero en esta serie de artículos sólo nos vamos a centrar en uno de los productos y en una única faceta de auditoría del mismo: contraseñas en <em>Oracle Database</em>.</p>
<p><strong>Gama de Oracle Database</strong></p>
<p>Oracle Database tiene hoy en día 4 ediciones principales, con un importante nímero de versiones en cada una:</p>
<ul>
<li>Express Edition</li>
<li>Standard Edition One</li>
<li>Standard Edition</li>
<li>Enterprise Edition</li>
</ul>
<p>Todas funcionan en Linux y Windows, si bien la versión básica no puede correr en Unix ni en 64 bits. No sabría deciros qué predomina en el mercado, ya que este es un caso donde el mero hecho de correr en un derivado Unix no garantiza mejor rendimiento. Las versiones Windows tienen una tremenda popularidad, ya que en práctica igualdad de rendimiento en lo que al motor se refiere, tienen una gran ventaja sobre los derivados Unix: Un sistema operativo Windows es, por lo general, más fácil de instalar, usar y mantener, con lo que también es más fácil (y económico) contratar a personal con nociones suficientes para el mundo Microsoft. Por otro lado, también tienen una estructura de licencias completamente distinta y potencialmente menos beneficiosa, con lo que tampoco son siempre la opción a implementar. </p>
<p>Las diferencias entre el producto gratuito (<em>Express Edition</em>) y el destinado a corporaciones (<em>Enterprise Edition</em>) <a href="http://www.oracle.com/database/product_editions.html">son más que apreciables</a>. Sinceramente he visto de todo, aunque probablemente he visto con un poco más de asiduidad <em>Enterprise Edition</em> corriendo en Linux o Unix. La mayor incidencia sobre el rendimiento la determinan siempre la configuración y la presencia de productos de optimización, y no el sistema operativo sobre el que corren los productos.</p>
<p>Para todo aquel que quiera practicar lo que aquí explicaremos recomiendo la descarga e instalación de la <a href="http://www.oracle.com/technology/products/database/xe/index.html">Oracle Database 10g Express Edition</a>, que es gratuita y relativamente sencilla de instalar. Asumiendo que la mayoría de auditores se sienten más cómodos en Windows, emplearemos una instalación para Windows, aunque aquellos que se sientan mejor con Linux pueden optar por este formato. En esencia lo que vamos a ver es independiente (con sus matices, claro) de la plataforma. Recomiendo la instalación de estos dos productos:</p>
<ul>
<li>Oracle Database 10g Express Edition (el motor de base de datos)</li>
<li>Oracle Database 10g Express Client (el software cliente)</li>
</ul>
<p>Recomiendo a todos los que quieran instalarse estos productos que lean muy detenidamente la documentación. Todo está en la documentación, e insisto que pese a ser la versión más pequeña y simple de Oracle, la puesta en marcha y mantenimiento de la misma no es trivial. </p>
<p><strong>Conectar a Oracle Database</strong></p>
<p>Aunque es posible realizar <em>pentesting</em> en caja negra, siempre es recomendable auditar las contraseñas en caja blanca o gris, ya que el hecho de que no podamos hacer intrusión no implica que las calidades de las claves sean las mejores. En algín momento necesitaremos conectar con la base de datos para ver si podemos hacernos con los <em>hashes</em> de las claves, o directamente para descargarlos y ser analizados. ¿Cómo conectar con Oracle?</p>
<ul>
<li><a href="http://www.oracle.com/technology/tech/sql_plus/index.html">SQL*Plus</a>. Es el producto oficial de Oracle para la línea de mandatos. Para mí, salvo que se vaya a hacer desarrollo, es el más aconsejable.</li>
<li><a href="http://www.oracle.com/technology/products/database/sql_developer/index.html">Oracle SQL Developer</a>. Es un producto oficial de Oracle, adecuado para desarrolladores, ya que tiene interfaz gráfico y ayudas a la productividad. </li>
<li>Otros productos comerciales. Casi todos están enfocados al desarrollo y a la utilización gráfica. Posiblemente, <a href="http://www.allroundautomations.com/plsqldev.html">PL/SQL Developer</a> sea el más conocido, aunque no es el único.</li>
</ul>
<p><strong>Mi primera conexión local a Oracle</strong></p>
<p>Una vez instalado podremos conectar vía <em>Application Express</em> (Apex) o vía línea de comandos. Apex está disponible por defecto tras la instalación en <a href="http://127.0.0.1:8080/apex/">http://127.0.0.1:8080/apex/</a>. </p>
<p>En el caso de la edición XE que hemos recomendado, los binarios de SQL*Plus se instalan junto a la base de datos. Suponiendo que estás en Windows:</p>
<p><img src="http://www.sahw.com/images/oracle_audit/sqlplus1.png" alt="oracle audit" /></p>
<p>Durante el proceso de instalación habrás creado contraseñas (es la misma) para las cuentas SYS y SYSTEM. Para probar si todo ha ido bien, así como para hacer ajustes de configuración, trata de conectar mediante la cuenta SYSTEM:</p>
<p><img src="http://www.sahw.com/images/oracle_audit/sqlplus2.png" alt="oracle audit" /></p>
<p>Nótese que <em>SYSTEM</em> es el usuario con el que conectamos, <em>password</em> es la clave de dicho usuario y <em>localhost</em> es la dirección del servidor de Oracle Database.</p>
<p><strong>Conexiones en remoto</strong></p>
<p>Aunque también se puede emplear SQL*Plus, es preciso contar con la definición del listener Oracle para poder hacer la conexión. Esta definición se introduce <a href="http://www.orafaq.com/wiki/Tnsnames.ora">en el fichero tnsnames.ora</a>, cuyo estándar es el siguiente:</p>
<blockquote><p>
addressname =<br />
 (DESCRIPTION =<br />
   (ADDRESS_LIST =<br />
     (ADDRESS = (PROTOCOL = TCP)(Host = hostname)(Port = port))<br />
   )<br />
 (CONNECT_DATA =<br />
   (SERVICE_NAME = SID)<br />
 )<br />
)</p>
</blockquote>
<p>Como podéis ver, para conectarse a una base de datos Oracle hacen falta 3 datos: la dirección del servidor, el puerto en el cual <a href="http://download.oracle.com/docs/cd/B10501_01/network.920/a96580/listener.htmÃ§">el <em>listener</em></a> está a la escucha y por íltimo el SID (System ID) o identificador de sistema. Veremos más adelante que el SID puede ser adivinado en remoto, y como más de uno podrá imaginar, a veces nos dejanos este fichero abierto al mundo (<a href="http://www.google.com/search?&q=%22tnsnames%22+filetype%3Aora">http://www.google.com/search?&q=%22tnsnames%22+filetype%3Aora</a>, la versión Bing <a href="http://elladodelmal.blogspot.com/2010/02/un-poco-de-bing-hacking-i-de-iii.html">disponible aquí</a> por cortesía de Chema)</p>
<p>Si has instalado Oracle en una máquina virtual o en un servidor, utiliza la documentación para configurar tu fichero <em>tnsnames.ora</em>. Ten presente que SQL*Plus lo va a buscar en determinadas ubicaciones, con lo que si no usas las que recomienda el fabricante (ver documentación) tendrás que crear variables de enterno (ver documentación). Por defecto, XE coloca el fichero en la ruta <em>C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN</em>, siendo sus contenidos los siguientes:</p>
<blockquote><p>
XE =<br />
  (DESCRIPTION =<br />
    (ADDRESS = (PROTOCOL = TCP)(HOST = nimoy)(PORT = 1521))<br />
    (CONNECT_DATA =<br />
      (SERVER = DEDICATED)<br />
      (SERVICE_NAME = XE)<br />
    )<br />
  )</p>
<p>EXTPROC_CONNECTION_DATA =<br />
  (DESCRIPTION =<br />
    (ADDRESS_LIST =<br />
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))<br />
    )<br />
    (CONNECT_DATA =<br />
      (SID = PLSExtProc)<br />
      (PRESENTATION = RO)<br />
    )<br />
  )</p>
<p>ORACLR_CONNECTION_DATA =<br />
  (DESCRIPTION =<br />
    (ADDRESS_LIST =<br />
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))<br />
    )<br />
    (CONNECT_DATA =<br />
      (SID = CLRExtProc)<br />
      (PRESENTATION = RO)<br />
    )<br />
  )
</p></blockquote>
<p>A la vista de lo anterior, ya sabéis que mi host se llama <em>nimoy</em>, que mi SID es <em>XE</em> y que el <em>listener</em> admite peticiones en el puerto 1521, que es el puerto por defecto.</p>
<p><strong>Próxima lección</strong></p>
<p>En la próxima lección veremos cómo se audita si el nombre escogido como identificador de sistema (SID), necesario para poder conectar a instancias Oracle, puede ser adivinado remotamente. Esto, como veremos, juega un papel importante en la seguridad de la instalación.</p>
<p>Un saludo,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sahw.com/wp/archivos/2010/02/27/auditoria-de-contrasenas-en-oracle-database-1-de-4-introduccion-y-primeros-pasos/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
