El blog de Miguel Díaz
Siguiente
Screenshot mDrive

mDrive

Sincroniza tus documentos, fotografías y programas entre tus ordenadores, comparte tus ficheros con tus conocidos y accede documentos estés donde estés.Saber mas

RoboCAUpy

Copia eficiente de archivos, toda la potencia de robocopy con una interfaz sencilla y fácil de usar. Herramienta perfecta para migraciones de equipos y copia masiva de ficheros.Saber mas

Screenshot RoboCAUpy

Acortador de nombres

Detecta ficheros con nombres largos, acortalos de forma masiva y reduce el tamaño de la ruta a la cantidad de carácteres que quieras.
Saber mas

screenshot Acortador Nombres
screenshot mRemoto

DNSPropagationChecker

Controla la propagación DNS de cualquier dominio. Con un solo clic conocerás al instante si se ha propagado en los diferentes servidores DNS existentes.Saber mas

mRemoto

Administra remotamente equipos, controlalos gráficamente o través de la línea de comandos, envía y recibe archivos, habla con el usuario y mucho mas sin ningún tipo de configuración previa.Saber mas

Screenshot mRemoto
Anterior
Miércoles 24 de abril del 2013

antivirusHace un tiempo vimos las diferentes formas en las que un antivirus detectan las amenazas, centrándonos en el análisis de firmas y vimos una forma básica de burlarlo. En esta entrada (2.1) y en la siguiente (2.2) nos centraremos en los análisis heurísticos que tratan de identificar el malware a través de su comportamiento. Por ejemplo, si un ejecutable se copia a los diferentes pendrives  y se conecta a un servidor , es muy probable que un antivirus lo detecte como una amenaza.

Generalmente los antivirus corren los ficheros en un sandbox donde analizan su comportamiento. Una vez sabemos básicamente como funcionan estos análisis vamos a ver cuatro ejemplos de cómo burlar este tipo de análisis, que van desde saturar el proceso dedicado al análisis a detectar si estamos siendo analizados por un antivirus para realizar unas acciones u otras. En nuestro ejemplo usaré un Keylogger programado para la ocasión y el antivirus AVG el cual tiene protección heurística y como podemos ver es identificado como una amenaza.

Excediendo el tiempo límite de análisis.

Este es el ejemplo mas básico de los que vamos a ver, se basa en la limitación de los antivirus a la hora de analizar un fichero y es que por razones de optimización no es capaz de mantener un análisis constante hacia un fichero pasado un tiempo sin actividad sospechosa lo toma como fiable, este método aunque puede sonar sencillo es tenido en cuenta por muchos antivirus que suprimen las “pausas” que tenga el proceso, así que lo correcto es que el malware realice acciones legítimas durante el tiempo que dura dicho análisis a fin de ser considerado un software no malicioso. Un ejemplo de esto es el siguiente código:

Para vurlarlo en este primer ejemplo lo que haremos es iniciar la función keylogger() pasado un determinado tiempo, sin realizar llamadas a Thread.sleep o demás formas “deducibles”, para ello iniciamos en un hilo a parte una funcion encargada de ver si ha pasado dicho tiempo

  double inicio; //Guarda el milisegundo en el que se inicia el programa
 private void Form1_Load(object sender, EventArgs e)
        {
            inicio = new TimeSpan(DateTime.Now.Ticks).TotalMilliseconds;
            hilo_key = new Thread(startKeylogger);
            hilo_key.Start();
        }

Como podéis ver lo primero que hacemos es comprobar el momento en el que se ha iniciado la aplicación y guardarlo en la variable global inicio, a continuación llamamos al proceso startKeylogger la cual se encargará de ver si ha pasado el tiempo indicado como vemos a continuación Continuar leyendo

Categorías: Malware, Pentesting, Programación, Seguridad
Etiquetado , , , , , , | 1 comentario
Jueves 18 de abril del 2013

seguridadHoy quiero compartir un método de ingeniería social que nunca he visto documentado, pero muy creíble y eficaz que se apoya de la propiedad que tienen muchas aplicaciones (Web o de escritorio) de realizar peticiones HTTP a servidores remotos. Un buen ejemplo sería la particularidad que tienen los foros de Internet a incluir imágenes de servidores externos mediante la etiqueta [IMG] o <img>.

Estas peticiones envían nuestras cabeceras igual que a cualquier otra Web y podemos enlazar imágenes o un fichero php corriente, la única diferencia es que el navegador intentará mostrarlo como una imagen una vez descargado y quizás no pueda, pero en la parte de servidor se ejecutará todo igual, por lo que estas consultas pueden diseñarse para realizar cualquier acción que se le permita al navegador y es aquí donde se puede aprovechar la ingeniería social para perpetuar ataques tipo phishing, entre otros.

Un caso típico de phishing es enviar un enlace donde se pide un usuario y contraseña simulando ser una página legítima, estadísticamente sigue funcionando, pero a día de hoy no es tan efectivo por que es fácilmente detectable con solo ver la URL, además la gente está bastante “educada” de no abrir enlaces desconocidos, así que lo que veremos es como solicitar las credenciales a un usuario sin que este visite un sitio Web, simplemente le aparecerá la ventana de login mientras abre un hilo.

Caso práctico: Robo de credenciales de un foro sin abandonar la Web

Como hemos visto antes, una consulta HTTP que solicita una imagen es exactamente igual a una consulta que solicita un fichero, una imagen puede tener extension .php o cualquier otra. Los captcha, por ejemplo al ser una imagen dinámica tienen extensión .php ya que se autogeneran a si mismos cada vez que se imprimen ¿pero cómo puede utilizarse esto en un ataque de phishing? El protocolo HTTP incluye una característica de autentificación que permite al administrador poner ciertos ficheros o directorios bajo contraseña, al realizar una petición hacia ellos el usuario verá un formulario de login, si habéis entrado a un router sabréis de lo que estoy hablando. Un ejemplo de fichero que solicita contraseña al recibir una petición HTTP sería este

fichero.php

<?php
    header('WWW-Authenticate: Basic realm="http://www.forodeejemplo.com/fileattach?foto.jpg"');
    header('HTTP/1.0 401 Unauthorized');
    exit();
?>

Continuar leyendo

Categorías: Internet, Pentesting, Privacidad, Seguridad
Escribir un comentario
Sábado 13 de abril del 2013

mysqlSi habéis seguido el post inicial del curso os habréis dado cuenta de que SQLmap es una potente herramienta, mucho mas que un simple detector de SQLinjection es un potente framwork para la explotación de esta vulnerabilidad. En la pasada entrega aprendimos a buscar vulnerabilidades mediante las variables GET, a realizar consultas SQL y a volcar las bases de datos a nuestro disco duro, pero no debemos cerrarnos únicamente a las variables GET, ya que hay muchos apartados como buscadores, formularios de login que funcionan mediante las variables POST y Cookies lo cual supone cerca de un 70% de los “Inputs” de cualquier Web, por eso hoy veremos como buscar inyecciones de SQL en POST y Cookies. Además, aprenderemos a recolectar información acerca del usuario de la base de datos y sus permisos. Es muy importante tener en cuenta que para seguir este curso es necesario tener conocimientos de HTML y SQL Injection

Realizando un ataque hacia un formulario de login

Lo primero para esto es saber hacia que Web lanza la petición nuestro formulario, puesto que el lector de este curso tiene conocimientos de HTML no voy a reparar en explicar como saberlo, en nuestro caso la petición se hará contra checkuser.php, y los campos del formulario se llamarán inputUser e inputPassword

./sqlmap.py -u "http://ejemplo.com/checkuser.php" --data="inputUser=Admin&inputPassword=12345"

Como veis, igual que en los ejemplos anteriores introducimos la URL, pero despues añadimos el modificador --data, el cual define todos los datos que serán enviados mediante el método POST, las variables se separan con “&” igual que se hace en la cabecera.

Continuar leyendo

Categorías: Internet, Pentesting, Seguridad, Utilidades
Etiquetado , , , , , , , , | 2 comentarios
Miércoles 10 de abril del 2013

2222Hace unos días os presentaba mDrive, un nuevo proyecto que estoy realizando para  sincronziar ficheros entre dispositivos de forma automática. Hoy os traigo una actualización del programa que trae las siguientes mejoras:

screen

  • Sistema de actualizaciones: mDrive es capaz ahora de detectar nuevas versiones y e instalarlas.
  • Mejora de velocidad: Se ha aumentado un 100% la velocidad a la hora de detectar cambios en nuestros ficheros y reducido un 50% del código.
  • Disminución del ancho de banda: Se ha conseguido optimizar el proceso de sincronización de forma que ahora realiza comprobaciones del listado de directorio remoto de forma incremental lo que reduce considerablemente el uso de ancho de banda.
  • Añadida la opción de mostrar u ocultar notificaciones al actualizar un fichero.
  • Corrección de errores menores

Ahora mismo mDrive está en desarrollo pero puedes probarlo gratuitamente utilizando nuestros servidores creando una cuenta de prueba.

descargar

A continuación os dejo unas gráficas de diferencia de rendimiento entre versiones. Continuar leyendo

Categorías: Cloud Computing, mDrive, Proyectos, Servidores, Utilidades
Etiquetado , , , , , , | Escribir un comentario
Jueves 4 de abril del 2013

mysqlLas inyecciones de SQL llevan siendo desde hace años el top de vulnerabilidades Web ya que es fácil cometer un error al validar una entrada, bien por despiste del programador o por desconocimiento. Detectarlas son medianamente fácil mediante el método de ensayo-error, pero justo por eso hay veces se torna una tarea tediosa. Por esto nació SQLmap, que se encargará de probar múltiples combinaciones  hasta dar con una válida. Además, una vez encontrada nos permitirá realizar acciones como descargar la base de datos o consultas SQL. Durante la primera entrega aprenderemos a buscar vulnerabilidades de una Web a través de las variables GET probando diferentes niveles de dificultad y una vez conseguido aprenderemos a ver las diferentes bases de datos, copiarlas a nuestro disco duro o ejecutar consultas SQL. Para seguir este curso debes conocer en qué consisten las inyecciones SQL.

Ejemplo básico de SQLmap para encontrar una vulnerabilidad en variables GET

Como todos sabemos, hay varias formas de enviar variables a un servidor Web, por un lado está GET, que incluye esta información de manera visible en la URL y por otro lado POST, que es aquella información enviada de forma transparente al usuario y generalmente usada en los formularios, pongamos un ejemplo de la típica Web de noticias en las que su URL termina con un id=NUMERO_NOTICIA, en nuestro ejemplo será http://ejemplo.com?id=3, si quisieramos lanzar un escaneo básico a esta Web deberiamos hacer

./sqlmap.py -u "http://ejemplo.com?id=3"

-u establece la URL a analizar, es muy importante poner la URL siempre entrecomillada, especialmente si queremos analizar mas de una variable ya que en caso contrario sqlmap no será capaz de reconocer mas que la primera de ellas.

Si la URL constara de mas de una variable y solo quisiéramos analizar una de ellas, manteniendo el resto estáticas utilizaremos el modificador -p “nombre_variable” para indicar que variable analizar, por ejemplo si tenemos la URL http://ejemplo.com/login.php?user=miguel&password=12345 y quisiéramos analizar la variable password deberiamos poner: Continuar leyendo

Categorías: Internet, Pentesting, Privacidad, Seguridad, Servidores
Etiquetado , , , , , , , , | 2 comentarios
Miércoles 27 de marzo del 2013

mDrive es un nuevo proyecto que he programado que permite mantener sincronizados y accesibles tus archivos en cualquier PC. Imagina que tienes varios ordenadores y en todos ellos quieres mantener organizada tu librería de fotos, con mDrive esto se hará automáticamente de forma que si añades una nueva fotografía esta se añadirá a todos tus equipos o imagina que quieres compartir una carpeta con el resto de tus compañeros de trabajo, no es problema, esto también puedes hacerlo con mDrive.

screen

Si usas algún servicio de sincronización en la nube como Skydrive o Box seguro que te has preguntado en mas de una ocasión como se maneja tu información y qué pasaría si uno de estos servicios cerrara.

Con esta idea he creado mDrive, un servicio de sincronización en la nube similar a los anteriores que puedes montar en tu propio servidor, de forma que solo tu seas el dueño de tu información, además podrás sincronizar tantas carpetas como desees y no te limitarás a una sola como en el caso de otros servicios.

Ahora mismo mDrive está en desarrollo pero puedes probarlo gratuitamente utilizando nuestros servidores creando una cuenta de prueba.

Si finalmente te animas a montar tu propio servidor de mDrive sus requisitos son simples, Apache, PHP5 y MySQL en el lado del servidor y .Net Framework 2.0 en el lado del cliente.

Actualmente mDrive se encuentra en versión beta y la parte del servidor será liberada al alcanzar la primera versión estable.

Categorías: Cloud Computing, mDrive, Programación, Proyectos
Etiquetado , , , , , , , , , | Escribir un comentario
Miércoles 19 de septiembre del 2012

Cómo todos sabemos cuando un programa se actualiza este lo hace realizando una solicitud a un servidor, este le responde diciendo cual es la versión actual y donde descargarla. A continuación si el programa tiene una versión distinta descarga el instalador y lo ejecuta, hasta aquí nada nuevo pero si no se toman las medidas adecuadas las actualizaciones pueden ser un fallo de seguridad en si mismo. Contradictorio ¿no?

Básicamente son aquellas en las que una vez descargadas, el sistema de actualizaciones no comprueba si ese fichero es legítimo (bien mediante la firma del fabricante o cualquier otra medida de seguridad) por lo que si un atacante efectúa un Man In The Middle podría hacerse pasar por el servidor y decirle al actualizador que existe una nueva versión la cual debe descargarse desde un servidor ilegitimo.

Caso práctico vulnerabilidad Evilgrade en MiPony.

El primer paso es saber de que forma se actualiza la aplicación, saber cómo verifica si está actualizada o no y de dónde obtiene los ficheros necesarios para obtener dicha actualización. En mi caso he decidido auditar la última versión de MiPony simplemente por que me olía que sería vulnerable a este tipo de ataques. Obviamente he avisado MiPony de esta vulnerabilidad así que imagino que la resolverán en breve.

Para monitorizar como trabaja la aplicación a la hora de buscar actualizaciones simplemente dejaremos ejecutando MiPony sin ningún trabajo activo, además mediante WireShark capturaremos el tráfico de red. Por último pediremos a MiPony que nos busque actualizaciones, un vez hecho paramos Wireshark y analizamos el tráfico generado.

Continuar leyendo

Categorías: Pentesting, Programación, Seguridad, Sockets
Etiquetado , , , , , , , | Escribir un comentario
Martes 21 de agosto del 2012

Las activitys son el equivalente a las ventanas o formularios de cualquier lenguaje de programación en Windows, además tienen una ventaja frente a estos ya que un programa puede llamar a un determinado formulario de otra aplicación. Por poner un ejemplo claro cuando abrimos la aplicación de Facebook y pulsamos subir foto, la aplicación de Facebook llama al activity de la camara para realizar una nueva fotografía. Además podemos pasar diferentes parámetros a dicha Activity como si llamáramos a una función mas.

En esta entrega aprenderemos a crear nuestros propios activitys y llamar de uno al otro al pulsar un botón, una vez aprendido veremos como pasar un parámetro de un Activity a otro.

Si no has leído aún las entregas anteriores recordar que las tenéis a vuestra disposición:

Abrir un nuevo Activity al pulsar un botón

Para empezar en nuestro activity principal (Nosotros le hemos llamado Juegoactivitys) crearemos un botón, con id btAbrirNuevoActivity que será el encargado de llamar a nuestra segundo Activity. Además crearemos una segunda actividad para ello pulsamos con el botón derecho sobre nuestro proyecto y vamos a Nuevo>Otras>Android Activity y seguimos el asistente, nosotros le hemos dando el nombre de SegundaActivity y le hemos puesto un TextView con id tvHolaMundo.

JugandoActivitys.java

public class JugandoActivitys extends Activity implements OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jugando_activitys);

        //Define el boton
        Button boton = (Button) findViewById(R.id.btAbrirNuevoActivity);

        //Asigna el evento onclick al boton
        boton.setOnClickListener(this);
    }

	public void onClick(View v) {
		//Define la actividad
		Intent i = new Intent(this, SegundaActivity.class);

		//Inicia la actividad
		startActivity(i);

	}

}
Fijemonos a partir de la línea 9, justo en esa línea y 12 establece el evento onClick al botón, esto vimos como hacerlo en la entrega número 4 del curso.

Continuar leyendo

Categorías: Android, Programación
Etiquetado , , , , , , , , | Escribir un comentario
Domingo 19 de agosto del 2012

Hasta ahora hemos visto como ejecutar acciones durante la carga de el Activity o ventana principal de nuestra aplicación, pero obviamente un programa precisa de una interacción con el usuario, el usuario debe poder pulsar en algunos lugares, introducir texto y realizar acciones sobre la interfaz del programa, para ello Android nos permite asignar eventos a los diferentes elementos de nuestro programa.

Hoy vamos a ver el elemento mas sencillo de todos, el evento OnClick, si ya habéis programado alguna vez en lenguajes como JavaScript o VisualBasic os sonará, es el evento que se produce cuando un elemento es pulsado una vez y nos servirá como base para familiarizarnos con el resto.

Para nuestro primer ejemplo debemos crear un nuevo proyecto en cuyo activity incluiremos un botón llamado btPrincipal y un TextView con id tvPrincipal y con un texto en blanco. En lo que va a consistir el ejemplo es en escribir “Hola mundo” dentro de tvPrincipal en el momento es pulsado el botón.

Asignar el evento OnClick a un botón en Android.

MainActivity.java

public class MainActivity extends Activity implements OnClickListener {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button boton = (Button) findViewById(R.id.btPrincipal); //Definimos el boton
        boton.setOnClickListener(this); //Le asignamos el evento onclick

    }

	public void onClick(View control_pulsado) {
		TextView campo_texto = (TextView)findViewById(R.id.tvPrincipal); //Definimos el campo de texto
		campo_texto.setText("Hola mundo"); //Cambiamos su contenido

	}

 }

Como vemos en la primera línea implementamos el metodo OnClickListener, si quisieramos usar otro evento, por ejemplo el OnTouch lo añadiriamos también con OnTouchListener, etc.

En la línea 9 asignamos el evento OnClick al boton, desde este momento se ejecutará la función onClick cada vez que este sea pulsado. La razón por la que pasamos el argumento this la veremos mas adelante.

A continuación en la función onClick cambiamos el texto como vimos en la tercera entrega del curso.

La razón por la que se pasa el argumento this es simple, imagina que tenemos dos botones, el btPrincipal queremos que cambie el texto a “Hola mundo” y el btSecundario queremos que ponga “Hasta luego mundo”, a ambos le asignamos el evento onClickListener, por lo cual la función onClick se va a ejecutar se pulse el botón que se pulse, por lo que es la propia función onClick la que debe averiguar por quién ha sido llamada, al incluir this, podemos diferenciar el botón con un simple condicional

	public void onClick(View control_pulsado) {
		TextView campo_texto = (TextView)findViewById(R.id.tvPrincipal); //Definimos el campo de texto
		if(control_pulsado.getId() == R.id.btPrincipal){ //Si se ha pulsado btPrincipal
			campo_texto.setText("Hola mundo"); //Escribimos Hola Mundo
		}else if(control_pulsado.getId() == R.id.btSecundario){
			campo_texto.setText("Hasta luego mundo"); //Escribimos Hasta luego mundo
		}
	}

En la próxima entrega veremos como crear nuevas ventanas o activitys en Android y las diferencias con respecto a las existentes en otros sistemas operativos.

Categorías: Android, Programación
Etiquetado , , , , , , , , , | Escribir un comentario
Miércoles 15 de agosto del 2012

Y en esta entrega empezamos con los códigos, nada complicado pero necesario especialmente si vienes de lenguajes sencillos como VB.Net o C#. Como se ha dicho en las anteriores entregas es necesario conocer algún lenguaje de programación orientado a objetos, preferiblemente Java pues es el usado en Android.

Además si no has leído las entregas anteriores este es el momento:

Hoy veremos como modificar los diferentes elementos gráficos (contenedores de imagen, etiquetas de texto, botones, etc) en tiempo de ejecución. Si vienes de otros entornos como .net, verás que es muy similar pero con algunas variaciones, por ejemplo a los elementos de un Activity se les llama View en lugar de elementos.

En nuestro primer ejemplo tendremos un Activity que contendrá un TextView llamado “caja_de_texto”, por lo que nuestro xml será algo así:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/caja_de_texto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />

</RelativeLayout>

Como veis es simple, un textview con el texto “Hello World”. Es importante que veais la línea que dice android:id la cual define el nombre o id del view. Sin ello no podremos realizar cambios a posteriori.
Ahora vamos a explicar las partes de las que costa MainActivity.java

Continuar leyendo

Categorías: Android, Programación
Etiquetado , , , , , , , | Escribir un comentario
Blog de Miguel Díaz
Diseño Web por Miguel Díaz.