28 mayo, 2014

Python.- HTML E-Mail Extractor (GUI) Newbie Style

En mi última entrada en este blog hablé de un script que programe en Python y que era capaz de hacer crawling por un pagina web y obtener los correos electrónicos que estuvieran en el código fuente. Ese script funcionaba pero tenia algunos errores que podéis ver en la entrada anterior. 

Así que he cogido una versión anterior de mi script le he quitado la parte del crawling y le he Interfaz Gráfica gracias a Tkinter, una librería de Python dedicada a ello . Hacia mucho que quería ponerme a ello y me gustaría contribuir a la comunidad con algún programa así que creo que mi HTML E-Mail Extractor (GUI) os podrá ser de ayuda. 


Como no, aquí tenéis el código. Para que los que no sepáis leerlo, como yo hace unos meses,  os diré que es un programa que lee el código fuente de una web mediante su url y mira en todo el texto de la web hasta que encuentra una expresión que corresponda al patrón de la expresión regular que hay en el código y que coincide con los de una dirección de Correo electrónico. 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from Tkinter import * 
import urllib2
import re 


def mostrar(window): 
window.deiconify()
def ocultar(window):
window.withdraw()
def ejecutar(f): 
ventana.after(0,f)
def crawler(web):
try: 
respuesta = urllib2.Request(web) 
  pagina = urllib2.urlopen(respuesta).read()
  if pagina: 
#esto complia la exprsion siguiente
  patron = re.compile("[-a-zA-Z0-9._]+@[-a-zA-Z0-9_]+.[a-zA-Z0-9_.]+")
#se explica por si mismo 
smails = re.findall(patron,pagina)
listaemails = open ('listaemail.txt', 'a+')
d2 = str(smails)
listaemails.write(d2)
listaemails.close()
label3=Label(ventana, bg='white' ,text=" URL valida  ")
label3.grid(row=5, column=2) 
ejecutar(mostrar(ventana1))

except:
label3=Label(ventana, bg='white' ,text=" Pon una URL ")
label3.grid(row=5, column=2)


#Configuración ventanas

if __name__ == "__main__":

ventana = Tk()
ventana1 = Toplevel(ventana)
ventana.title('HTML Email Extractor')
ventana.config(bg='white')
ventana1.config(bg='white')
#ventana

label1=Label(ventana, bg='white',text="StateX Email Extractor", font= (16) )
label1.grid(row=1, column=2)
label2=Label(ventana,bg='white' ,text="Pon una URL:")
label2.grid(row=2,column =2)
caja = Entry(ventana)
caja.grid(row=3, column=2)
boton1 = Button(ventana, text="Start", bg='white', command=lambda: crawler(caja.get()))
boton1.grid(row=4, column=2)
 
#ventana 1

label4=Label(ventana1, bg ='white', text = "Correos almacenados con éxito") 
label4.grid(row=1, column=2)
boton2 = Button(ventana1, bg='white', text="Seguir",command= lambda: ejecutar(mostrar(ventana)) or caja.delete(0,END))
boton2.grid(row=3, column=2)
boton3 =  Button(ventana1, bg='white', text="Salir", command=  ventana.destroy)
boton3.grid(row=4, column=2)

#Estado inicial de las ventanas

ventana1.withdraw()
ventana.mainloop()

Si os lo queréis descargar tenéis la carpeta con el programa hecho un .exe, el programa en Python  y el script original del extractor en mi GitHub y espero que dentro de poco en el apartado Herramientas de esta Web ;) 

GitHub: 
Espero que os haya gustado y Sed Buenos con esto ;) 

27 mayo, 2014

Un Minuto sin 010101 con David Barroso

Hola a tod@s

Hoy tenemos el placer de tener en Estación Informática a David Barroso, David es CTO de Eleven Paths. Con un larga trayectoria profesional que daría para varios post. 

Me siento muy identificado con una frase que podéis encontrar en su web personal, dice así: “Considero que lo más importante para trabajar en seguridad es tener pasión y ganas de divertirse, además de dedicar noches y fines de semana para poder estar al día de todo lo que acontece”.

Sin más dilación os dejo con la entrevista.

1º ¿Quién es David?

Una persona que quiere hacer bien las cosas y sacar de cada uno lo mejor que tiene. Una vez me dijeron que era un soñador contemplaestrellas :)


2º ¿Que sueles hacer cuando tienes tiempo libre?

La verdad es que la definición de tiempo libre es complicada :) Estar con la familia, ir a nadar, leer, ahora por ejemplo también estoy viendo alguna serie que me gusta (House of Cards, True Detective, GoT, The Wire, etc.)


3º Si no hubieras sido informático, ¿A qué te hubieras dedicado?

Cuando estaba en BUP tenía la ilusión de estudiar Ciencias del Mar y dedicarme a estudiar el mar. Algo así como hacerme de GreenPeace y estar toda mi vida luchando por proteger la naturaleza y aprendiendo sobre el mar.


4º El último libro que has leído.

From Pablo to Osama: Trafficking and Terrorist Networks, Government Bureaucracies, and Competitive Adaptation. Un libro muy interesante donde hablan de las similitudes entre combatir el narcotráfico y el terrorismo. Aunque también recientemente leí ‘El tiempo de los héroes’ de Javier Reverte, sobre la Guerra Civil española, que la verdad es que no la conozco muy a fondo y creo que es importante puesto que es historia ‘reciente’ de España que todavía no se ha solucionado.


5º Tu plato favorito.

Difícil elegir uno en concreto, pero ahora mismo diría rape a la brasa.

6º El último sueño raro que tuviste.

Uno en el que me perseguían con un salchichón; mejor no contar los detalles ;)


7º ¿Qué música sueles escuchar?

De todo un poco, depende del momento, pero ahora me estoy aficionando mucho a David Bowie, que aunque no esté de moda, estoy descubriéndolo :) 


8º Lo último que piensas antes de dormirte.

Depende de mi estado de ánimo. Si tengo algo dando vueltas a la cabeza estoy horas en la cama pensando sobre ello. Si no, suelo pensar en lo más positivo del día.

9º Lo primero que piensas cuando te levantas por la mañana.

Por las mañanas estoy en modo zombie total, mi primer pensamiento tarda en salir unos 10 minutos desde que me levanto :) Generalmente es mirar por la ventana y disfrutar de la belleza del día.


10º Lo primero que harías si fueras presidente.

Rodearme de los mejores. Crear un equipo muy potente capaz de poder cambiar muchos de los males que tenemos ahora mismo.


No seáis malos. 

25 mayo, 2014

WP-BackitUp: Arbitrary File Deletion vulnerability (o porqué no subestimar un CSRF)

¡Saludos!

   Escribo esta entrada para dar un toque de atención a todos aquellos desarrolladores de plugins para WordPress: por favor, la API de WordPress permite crear directamente tokens (o "nonces") y después comprobar su validez. ¡NO QUIERO VER UN CSRF MÁS!

   En este mes y dos semanas que he pasado buscando vulnerabilidades en plugins de WordPress lo que más me he encontrado son CSRF que permiten cosas tan dispares como que puedas recibir un atacante pueda recibir por correo electrónico un backup de la base de datos (¡Toma ya!, en un plugin con más de un millón de descargas y que bastantes webs gordas lo tenían instalado), realizar un DoS al servidor , o como en este caso, poder eliminar cualquier archivo. Voy a usar el plugin "WP-BackItUp" como ejemplo porque fue reportado hace un mes (tal y como se indicó en Quantika14 ) y no han parcheado este grave fallo de seguridad pese ha que han sacado diversas actualizaciones desde entonces.

  Cuando comprobamos las cabeceras HTTP que se mandan cuando realizamos alguna acción, por ejemplo crear un backup, vemos que en ningún momento se manda ningún token que proteja esa petición y por tanto no se comprueba si realmente ha sido el administrador quien ha querido hacerla y no ha sido "forzado" por un atacante:


   Por lo pronto podemos forzar a que realice un backup de la base de datos y de los archivos de ese WordPress. En otros casos de plugins que realizan backups y también son vulnerables a CSRF se ha podido usar esa caracterísitica para que se inicien 10.000 full backups practicamente al unísono, produciendose un denial of service del servidor. Por desgracia este no es el caso :(


    Cuando observamos la petición de borrado de un archivo vemos que tampoco lleva un token que la proteja:


  Lo primero que pensé cuando lo ví es que bueno, pode borrar backups puede ser un fallo de seguridad, pero tampoco nada transcendental. Lo segundo fue: ¿porqué diablos pone el nombre del archivo? ¿no serán capaces de cometer tal atrocidad....?

    Efectivamente, la hacen. Contemplad este trozo de código, obelisco que simboliza la candidez de ese desarrollador. Un minuto de silencio por la inocencia de quien hizo esto:


function deletefile()
{
$fileToDel = str_replace('deleteRow', '', $_POST['filed']);
$restore_path =  WPBACKITUP_CONTENT_PATH .WPBACKITUP_BACKUP_FOLDER .'/' . $fileToDel;
_log('(functions.deletefile) Delete File:' . $restore_path);
if (unlink($restore_path))
echo 'deleted';
else
echo 'problem';
exit(0);
}

   En vez de guardar en la base de datos el nombre del archivo y después pedirlo para borrarlo, se lo pasa directamente a través de una petición POST. Sin filtrar. A pelo. Un "unlink()" a lo que le pases. Eso es confiar en el usuario.


    Procedamos a hacer la petición de rigor para ver si podemos aprovechar esto, sabiendo que la carpeta de la que parte es /wp-content/wpbackitup_backups:




Premio para el niño, el archivo ha sido borrado:



  Para poder hacer el PoC rápidamente y probarlo podeis usar el script que hice, CSRFtoPOST, que podeis descargar haciendo click AQUI.



No es dificil usar tokens en WordPress, de hecho hay un artículo donde lo explica dentro de la propia documentación de la API (http://codex.wordpress.org/WordPress_Nonces )  por lo que este tipo de fallos pueden ser subsanados agregando apenas 3 líneas más a tu código. No seas vago y hazlo ;)


Byt3z!

20 mayo, 2014

Criptografía Cuántica

Hola a tod@s

Generan números aleatorios con un móvil ¿el futuro de la criptografia?
Un grupo de físicos de la Universidad de Ginebra, en Suiza, han inventado un sistema que genera números aleatorios con un simple móvil. ¿Estamos ante el futuro de la criptografía? ¿Será realmente invulnerable? 

Un algoritmo criptográfico realmente seguro debería generar números verdaderamente aleatorios. Una buena forma de lograrlo es la observación de fenómenos de la física cuántica para generar lo que se conoce como números cuánticos aleatorios.

Uno de los materiales imprescindibles son un smartphone y un sensor fotográfico que se utiliza para determinar las variaciones cuánticas en el número de fotones que detecta. 

El grupo de científicos realizo el experimento utilizando un Nokia N9 con una cámara de 8 megapíxeles. Con una capacidad para generar números de 1Mbps, los científicos calculan que, incluso aunque todas las personas del planeta utilizaran este método, haría falta 10^80 veces la edad del universo para detectar una pauta en la cadena de números.

Más información aquí.


No seáis malos. 

15 mayo, 2014

Pásate al hacking móvil



Hola a tod@s
 
Pwn Phone el smartphone para hackers, creado por la empresa Pwnie, este teléfono está diseñado para pruebas de penetración.

Se trata de un modelo basado en el Nexus 5, y cuenta con un procesador Qualcomm Snapdragon 800 de cuatro núcleos a 2.3 GHz, 2 GB de RAM y 32 GB de almacenamiento interno.

Estamos hablando de un martphone totalmente personalizado, ya que cuenta con una versión modificada de Android KitKat, con gran cantidad de aplicaciones de hacking preinstaladas. Además, posee un USB de tamaño estándar, como el de cualquier PC, al que se pueden conectar diferentes dispositivos (por ejemplo antenas o adaptadores bluetooth) para aumentar la potencia y el alcance de la señal del teléfono.

Entre las 103 herramientas de ataque y monitorización de redes que vienen de serie con este smartphone, podríamos destacar EvilAP, que permite crear un punto de acceso WiFi. Otras herramientas destacables son Nmap, Strings Watch, este último mencionado para quien no lo conozca es un potente sniffer, mi querido Metasploit, dSploit, Dismet, Airodump... y muchas más.

Además, el Pwn Phone está previsto de un botón que al pulsarse borra todos los datos del terminal, en el caso de que nos descubran haciendo algo que no debemos, pero ese no será nuestro caso... ¿no? 

El precio es bastante elevado, cuesta 1.295 dólares, y tiene una versión en forma de tablet (basada en nexus 7) denominada Pwn Pad, con un precio de 1.095 dólares.

Para más información visitad la web del fabricante.

No seáis malos. 

13 mayo, 2014

Python,- HTML Crawler E-mail Extractor Newbie Style

Hace unas semanas Francisco Javier me dio la oportunidad de formar parte de esta comunidad y de escribir algún articulo. Así que, empecé a curiosear la pagina, a ver perfiles de los otros autores y ver cual era la mejor manera de empezar a escribir aquí. La verdad es que no quería publicar nada hasta que no tuviera una buena idea y viendo el nivel de mis compañeros posiblemente sea el mas Newbie de todos. Suponiendo esto y puestos a lanzar la novatada, he decidido reutilizar dos script que hice con Python para mi blog y me parece que puede quedar genial. 


Scripts usados:

Lo que queremos es un script que pueda leer el código fuente de una pagina y la interprete guardando los correos electrónicos en un .txt, en el caso de detectar alguno en el código, o, si encuentra un enlace, prosiga su búsqueda en la siguiente pagina y vuelva a comprobar si hay algún correo. Bueno,  por si no queda claro aquí os dejo el código: 

import re
import urllib

web =  raw_input("pega aqui la Url: ")
emails = []

patron= re.compile('''href=["'](.[^"']+)["']''')
patron2= re.compile("[-a-zA-Z0-9._]+@[-a-zA-Z0-9_]+.[a-zA-Z0-9_.]+")

busqueda = re.findall(patron, urllib.urlopen(web).read())
busqueda2= re.findall(patron2,urllib.urlopen(web).read())

emails.append(busqueda2)
d1 =  str(busqueda2)
ListaEmails = open('correos.txt','a+')
ListaEmails.write("--> "+ d1 +" <--")
ListaEmails.close()

for i in busqueda:
busqueda3 = re.findall(patron2,urllib.urlopen(i).read())
emails.append(busqueda3)
d2 =  str(busqueda3)
ListaEmails = open('correos.txt','a+')
ListaEmails.write("--> "+ d2 +" <--")
ListaEmails.close()
busqueda4 = re.findall(patron, urllib.urlopen(i).read())

for e in busqueda4:
busqueda5 = re.findall(patron2,urllib.urlopen(e).read())
emails.append(busqueda5)
d3 =  str(busqueda5)
ListaEmails = open('correos.txt','a+')
ListaEmails.write("--> "+ d3 +" <--")
ListaEmails.close()

print "Correos Guardadas con Exito."

Si, es una forma muy chapurrera de hacerlo, pero soy un Newbie y mas con Python. Así que, estoy abierto a criticas y a posibles mejoras. 

Lo he probado con esta web, una forma genial para garantizar mi permanencia, y este a sido el resultado: 


Como veis el script ha encontrado, aparte del noreply de blogger, el correo electrónico de Francisco Javier varias veces y el de dergli. También habréis visto en el código el programa se basa en el siguiente patrón para usar la librería re (Regular Expresions) y dar con los correos [-a-zA-Z0-9._]+@[-a-zA-Z0-9_]+.[a-zA-Z0-9_.]+ Lo cual comporta que si alguien ha escrito, como es en este caso, tod@s se nos mete en la lista. 

También en la ejecución de este script después de introducir la url de la pagina web, al encontrar una url la cual no pueda abrir, el programa parará de guardar correos electrónicos mostrándonos el siguiente problema. 


La verdad es que me lo he pasado bastante bien jugando con este script y creo que si le dedico un poco mas de tiempo puede salir algo muy chulo. Para los que queráis el script os dejo en enlace a GitHub aquí abajo: 
Acepto criticas y/o propuestas de mejora. 

Sed Buenos con esto ;) 

10 mayo, 2014

Herramienta de pentesting para escalar Privilegios en Windows: PowerUP



Buenas a tod@s antes de nada quería agradecerle a @n0ipr0cs la gran oportunidad que me ha brindado de poder escribir en este gran blog como es Estación-Informatica y permitirme entrar en este gran "mundillo" de la (in)Seguridad Informática.

Bien una vez dicho esto, hoy vengo a presentaros una herramienta de pentesting llamada PowerUp bajo licencia GNU, herramienta de PowerShell para ayudar con la elevación local de privilegios en los sistemas Windows. Dicha herramienta nos permite encontrar métodos y servicios vulnerables y poder abusar de estos,  así como "secuestro" de DLL, configuraciones de registro vulnerables y sobre todo y más importante las posibilades de escalabilidad de privilegios dentro del sistema, la herramienta ha sido desarrollada por @harmj0y , el código de la herramienta esta aquí.

Bien vamos a explicar los distintos métodos de los cuales se compone esta herramienta:
Para probar la herramienta necesitamos el código, el cual se encuentra aquí:


Lo primero que necesitaremos hacer es copiar todo el código en nuestro PowerShell, de la siguiente manera:  

  1. Para los que no sepan como lanzar PowerShell o Instalarlo etc, aqui hay un manual de cómo utilizarlo, solo necesitareis leer de la pg 12 a la 13 para poder seguir esto, aunque os recomiendo que saquéis tiempo para leerlo entero ;-)  
  2. Bien una vez llegados a este punto en el que tengáis el PowerShell lanzado , solo tendremos que copiar todo el código en la consola de PowerShell  tal que así:  
  3. Una vez introducido todo el código de la herramienta podemos empezar a ver los distintos métodos en los que se compone: 


Service Enumeration:

  • Get-ServiceUnquoted: está función encuentra todos los servicios no cotizados, que también tienen un espacio (es decir, el modulo trusted_service_path.rb MSF). Si tienen algun servicio que hace referencia a algo como C:\Herramientas\Herramientas Personalizadas\estacioninformatica.exe, y tiene acceso de escritura al directorio base C:\Herramientas\, dejando caer un ejecutable a C:\Herramientas\herramientas.exe lo podrás ejecutar en ese programa, en vez del servicio original. Esto es debido a la ambigüedad de algunas funciones de la API de windows a las que hace referencia.
  • Get-ServiceEXEPerms: esta función busca todos los servicios en los que el usuario actual tiene permisos de escritura. Si se sustituye uno de estos ejecutables nos permitira secuestrar un servicio actual
  • Get-ServicePerms: esta función enumera todos los servicios disponibles para abrir el servicio
     para su modificación. Podremos cambiar la ruta binaria como por ejemplo
     "net user password backdoor/add" y posteriormente reiniciar el servicio.
     

    Service Abuse:

  • Invoke-ServiceUserAdd: esta función detiene un servicio, lo modifica, lo inicia, lo detiene y a continuación restaura la ruta original exe, es decir, permite abusar de todo lo que se encuentra en "Get-ServicePerms". Podremos detener un servicio, modificarlo para crear un usuario y añadirlo al grupo de administradores locales y reiniciamos el servicio, y se restaura la ruta binaria del servicio original
  • Write-UserAddServiceBinary: esta función toma un precompilado C# ejecutable, servicio y parches binarios con el nombre del servicio, nombre de usuario, contraseña, nombre del grupo para agregar, a continuación,  el binario a la ubicación especificada, es decir, nos permite secuestrar servicios de "Get-ServiceUnquoted", necesitaremos un servicio de C# precompilado y los parches binarios con el nombre del servicio, le metemos el usuario/contraseña y grupo y cuando se ejecute, el binario creara el usuario con los parámetros establecidos.
  • Write-ServiceEXE: esta función invoca "WtireServicePSBinary" reemplaza el binario para el servicio "VulnSVC" por uno que añade un usuario local con contraseña y el grupo administrador, es decir, se puede utilizar para abusar de binarios vulnerables que se encuentren en "GET-ServiceEXEPerms". Respaldaremos el exe para un servicio establecido, después utilizaremos "Write-UserAddServiceBinary" para reemplazar el ejecutable con uno que crea y agrega un administrador local.
  • Restore-ServiceEXE: esta función restaura la copia de seguridad original del archivo por la ruta del servicio manipulado, la cual devolverá true si se realizo correctamente o false en caso contrario. Con Restore-ServiceEXE podremos restaurr el ejecutable original

DLL Hijacking:

  • Invoke-FindDLLHijack: esta función comprueba todos los módulos cargados para cada proceso, y devuelve lugares donde no existe un modulo cargado en la ruta de la base ejecutable, es decir, busca servicios con posibles oportunidades de secuestro dll, si una carpeta de la norma %PATH% tiene permisos de escritura por el usuario actual pe: \Python27, podremos colocar un archivo DLL malicioso en determinados lugares para escalar privilegios.

  • Invoke-FindPathDLLHijack:  esta función comprueba si el PATH actual contiene cualquier directorio con permisos del usuario actual. Si existe, se puede escribir, entonces comprueba la versión de Windows y envía un servicio hijackable para la versión de windows correspondiente.

Registry Checks:

  • Get-RegAlwaysInstallElevated: esta función comprueba si la clave del registro  " AlwaysInstallElevated" está habilitada, es decir,  verificara el registro de windows para la clave AlwaysInstallElevated, si se encuentra habilitada, los instaladores MSI siempre se ejecutaran con privilegios elevados. hay un modulo de Metasploit llamado:  " always_install_elevated.rb" que explota este mismo comportamiento, "Write-UserAddMSI" que escribirá un archivo instalador MSI que cuando se ejecuta, pide una cuenta de usuario para añadir al grupo de administradores locales.
  • Get-RegAutoLogon: esta función comprueba las credenciales de sesión automática en el registro "DefaultUserName/DefaultPassword", es decir, comprobara si se ajusta la clave del registro "AutoAdminLogon", y procederá a sacar las credenciales en texto plano.

Misc. Checks:

  • Get-UnattendedInstallFiles: esta función comprueba ubicaciones de instalaciones desatendidas para obtener un archivo con credenciales de despliegue, es decir, comprobara la existencia de varios archivos desatendidos sobrantes, que suelen tener las credenciales administrativas en texto plano.

Helpers:

  • Invoke-AllChecks: esta función ejecuta todas las funciones que comprueban todas las opciones de escalar privilegios del sistema, es decir, chequeara todo y nos mostrara un informe con las opciones de escalar disponibles.
  • Write-UserAddMSI: esta función escribe un instalador MSI precompilado que solicita usuario/grupo. Esta función se puede utilizar para abusar Get-RegAlwaysInstallElevated.
  • Invoke-ServiceStart: esta función inicia un servicio especificado, permitiendo marcarlo como deshabilitado.
  • Invoke-ServiceStop: esta función para un servicio especificado, el cual nos devolverá verdadero si la función tuvo éxito o falso en caso contrario.
  • Invoke-ServiceEnable: invoca un servicio y lo habilita.
  • Invoke-ServiceDisable: esta función deshabilita/desactiva  un servicio especificado 
  •  Get-ServiceDetails: obtiene información detallada acerca de un servicio


Como podéis observar nos brinda grandes oportunidades y si le damos juego con la herramienta Pyinstaller podremos hacer grandes cosas, bien esta primera entrada es una introducción para poder centrarnos posteriormente detalladamente en cada funcionalidad de dicha herramienta con casos prácticos. Espero que os guste la herramienta y  trasteéis con ella. 
 

Aquí os dejo un libro y un artículo interesantes:

Bien antes de acabar volver a agradecer a @n0ipr0cs esta oportunidad muchas gracias ;-)

Un saludo desde el CPD (^_-)