Blog de Miguel Díaz » Servidores http://www.blogdemigueldiaz.com Blog sobre Informática, programación y diseño Web Fri, 14 Jun 2013 19:00:38 +0000 es-ES hourly 1 http://wordpress.org/?v=3.6.1 Nueva versión de mDrive 0.6.2.6 http://www.blogdemigueldiaz.com/2013/04/nueva-version-de-mdrive-sincronizacion-nube/?utm_source=rss&utm_medium=rss&utm_campaign=nueva-version-de-mdrive-sincronizacion-nube http://www.blogdemigueldiaz.com/2013/04/nueva-version-de-mdrive-sincronizacion-nube/#comments Wed, 10 Apr 2013 18:45:04 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=2133 Continuar leyendo ]]> 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.

Captura

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

]]>
http://www.blogdemigueldiaz.com/2013/04/nueva-version-de-mdrive-sincronizacion-nube/feed/ 0
Pentesting: SQL Injection – Curso de SQLmap a fondo – Parte 1 http://www.blogdemigueldiaz.com/2013/04/sql-injection-curso-de-sqlmap-a-fondo-i/?utm_source=rss&utm_medium=rss&utm_campaign=sql-injection-curso-de-sqlmap-a-fondo-i http://www.blogdemigueldiaz.com/2013/04/sql-injection-curso-de-sqlmap-a-fondo-i/#comments Thu, 04 Apr 2013 18:05:33 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=2074 Continuar leyendo ]]> 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:

./sqlmap.py -u "http://ejemplo.com/login.php?user=miguel&password=12345" -p "password"

Una vez lanzado el proceso SQLmap comenzará a lanzar consultas en las diferentes variables de la URL hasta encontrar una válida, si no encontrara ninguna podríamos aumentar el nivel de dificultad, esto lanzará consultas mas complejas que intenten evitar los métodos mas conocidos de validación de entrada, si todo ha ido bien obtendremos algo como esto:

IMG_20130402_200250

Pero por el contrario si no se ha encontrado ninguna vulnerabilidad nos encontraremos un mensaje advirtiéndonos de que ninguna de las variables es vulnerable, si es así puedes probar el modificador --level=NUMERO para aumentar la dificultad, hay cinco niveles diferentes, otro modificador interesante es -v NUMERO, que como suele ser habitual se refiere al modo vervose de la aplicación, cuanto mas alto sea el numero mas información nos mostrará sqlmap mientras realiza el escaneo, viene muy bien si nos interesa revisar los encabezados que se reciben, etc y así asegurarnos de que no se le está pasando por alto nada a sqlmap

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --level=5 -v 3

Pero SQLmap es mucho mas que un puro escaner, lo realmente interesante de SQLmap es que una vez encontrada la vulnerabilidad nos ofrece multiples opciones interesantes para interactuar con la base de datos, por ejemplo, si queremos obtener un listado con las bases de datos existentes bastaría con usar el modificador --dbs

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --dbs

A lo que obtendremos algo como

Captura

Donde vemos que ha encontrado dos bases de datos, si quisiéramos saber cuál es la base de datos actual a la que estamos conectados tendríamos que usar el modificador --current-db

Otro modificador interesante es --tables el cual nos permite ver el nombre de las tablas. Por defecto mostraría las tablas de todas las bases de datos, pero si quisiéramos ver únicamente las tablas de una base de datos en concreto añadiremos el modificador -D “nombre_base_datos”

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --tables -D information_schema

Nos mostraría el nombre de las tablas de la base de datos information_schema

Captura

Es interesante saber que toda la información extraída la va guardando en ficheros de texto dentro de la carpeta output.

Además podemos ejecutar arbitrariamente una sentencia SQL mediante el modificador --sql-query=”CONSULTA SQL” por ejemplo

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --sql-query="SELECT user,pass FROM usuarios WHERE user LIKE '%admin%'"

Que nos daría en este caso algo parecido a esto

Captura

Otro modificador importante si vamos a realizar varias consultas SQL es --sql-shell el cual nos proporciona una shell de SQL para ejecutar las consultas que necesitemos.

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --sql-shell

Por último vamos a ver como guardar una copia de las bases de datos en nuestro PC mediante el modificador --dump, este modificador guardará todas las tablas por lo que es interesante utilizar el modificador -T “NOMBRE_TABLA” para dumpear únicamente aquello que nos interese

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --dump -T usuarios

Además de que el resultado nos lo va a mostrar nos va a generar un fichero csv que podemos abrir con cualquier programa como excel para consultarlo de una manera mas cómoda, si quisieramos seleccionar una base de datos diferente a la actual debemos usar el modificador --D “nombre_base_datos”

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --dump -D "information_schema" -T "GLOBAL_VARIABLES"

Captura

Si por el contrario estamos ansiosos de información podemos volcar todo el contenido de todas las bases de datos mediante el modificador --dump-all

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --dump-all

Y esto es todo por hoy hasta la próxima entrega en la que explicaremos otras funciones, no tan conocidas pero muy útiles y potentes de SQLmap.

]]>
http://www.blogdemigueldiaz.com/2013/04/sql-injection-curso-de-sqlmap-a-fondo-i/feed/ 4
Pentesting: Obteniendo usuarios y servidores Exchange de una determinada corporación. http://www.blogdemigueldiaz.com/2012/01/pentesting-obteniendo-usuarios-y-software-usado-en-una-determinada-corporacion/?utm_source=rss&utm_medium=rss&utm_campaign=pentesting-obteniendo-usuarios-y-software-usado-en-una-determinada-corporacion http://www.blogdemigueldiaz.com/2012/01/pentesting-obteniendo-usuarios-y-software-usado-en-una-determinada-corporacion/#comments Wed, 11 Jan 2012 20:12:26 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=1449 Continuar leyendo ]]> Siguiendo la racha que llevamos sobre seguridad informática y para continuar el último post de pentesting hoy vamos a descubrir una nueva forma para obtener información acerca de la estructura interna de una corporación.

Si no habéis leído la entrada de DNSCacheSnooping os recomiendo hacerlo ahora pues en el se explica una de las técnicas para obtener el software usado y sitios Web visitados desde una corporación.

Usaremos una técnica que está muy de moda últimamente y es el análisis de metadatos, es una técnica simple pero muy efectiva que nos proporcionará muchísima información.

Obtener usuarios de active y servidores de Exchange de la NASA

En este caso he elegido la NASA ya que es una empresa internacional y conocida en en cada lugar de la tierra, todo un ejemplo de gran corporación y un caso que tenemos todos bien cercano, no quiero poner a nadie en evidencia pues su seguridad es muy buena y simplemente se explica una técnica usada en el pentesting.

Cómo muchos sabéis los metadatos son información almacenada en los ficheros que no es visible a simple vista pero los programas la utilizan para realizar acciones como organizar documentos, guardar un historial de cambios, etc. Estos datos no suelen ser visibles por el usuario y debido a ello suele ser información obviada por ellos.

Generalmente cualquier corporación de un determinado tamaño pone a disposición del público documentos (.doc, .pdf, .xls..) que contienen este tipo de información a no ser que el usuario o el administrador del sistema se haya encargado de limpiarlos, esta información es pública para consulta y examen de cualquier persona puesto que está colgada intencionadamente en la Web.

Obtener un listado de este tipo de archivos es muy facil gracias a herramientas de como Google o Bing con una búsqueda de este tipo:

Como veis en este caso hemos encontrado mas de seiscientos mil ficheros pdf publicados, podéis usar otros motores como bing u otros tipos de archivo.

Para descargar todos estos ficheros vamos a utilizar la herramienta metagoofil, es muy sencilla y está basada en python aunque podéis usar muchísimas otras:

Una vez el proceso ha terminado abrimos el fichero de resultados y entre toda la información que contamos podemos ver un listado de usuarios que se han detectado en los metadatos, aquí os dejo un pequeño extracto:

No hace falta ser un genio para ver que el formato de los mismos es generalmente es iniciales seguidas de un apellido (cfjones, rbmedina, etc..) por lo que imaginar otros usuarios por ingeniería inversa es muy posible (y mas si desde la corporación se empeñan en hacer las cosas fáciles), aunque seguramente con el enorme listado de usuarios que se obtienen mediante el analisis de metadatos sea mas que suficiente

Esta información es mas sensible de lo que uno puede pensar a simple vista, puesto que a pesar de que en teoría el secreto de una cuenta debe ser la contraseña el saber una cantidad significativa de usuarios nos facilita un trabajo reverso de fuerza bruta, es decir:

Generalmente los servidores están preparados contra ataques de fuerza bruta en los que si un usuario mete su password mal un determinado número de veces se bloquea la cuenta por un tiempo determinado o de forma indefinida, pero no al revés: Podemos probar cuatro o cinco contraseñas típicas (lease bigbang3, orion5…) o intentar con la contraseña inicial con cada uno de los usuarios con lo cual dar con una combinación válida es solo cuestión de tiempo.

Otro tipo de ataques son igualmente posibles como bloquear todos los usuarios realizando intentos de login erroneo de forma intencionada, etc.

Todo esto está muy bien, pero no disponemos de ningún servidor dónde realizar estos intentos de login, así que ¿Dónde probamos el usuario?

Caso práctico: Obtener los servidores de Exchange de la NASA o Telefónica

Tenemos una inmensa cantidad de estrategias para descubrir servidores o intranets de una corporación, como por ejemplo buscar subdominios “tipicos” o usando el buscador de Google para buscar subdominios:

En este caso hemos obtenido muchísimos resultados y la mayoría no nos interesan, en empresas mas pequeñas o con menos servicios públicos la cosa se torna mas sencilla, pero para estos casos eso es bueno saber un pequeño truco que suele ser útil la mayoría de las veces.

Cuando configuramos un programa como Outlook con una cuenta exchange este es capaz de autodetectar el servidor al que conectarse, para obtener estos datos el cliente. Para ello se conecta a una de las siguientes URL, https://dominio.com/autodiscover/autodiscover.xml o hacia https://autodiscover.dominio.com/autodiscover/autodiscover.xml, lo mejor de todo es que pese a que exista una un OWA tipo email.nasa.gov accediendo a https://autodiscover.nasa.gov/exchange nos suele mostrar o bien el propio OWA o el vinculo desde el cual acceder.

Podemos probar en el de la NASA y otra empresa como Telefónica entre otros muchos.

]]>
http://www.blogdemigueldiaz.com/2012/01/pentesting-obteniendo-usuarios-y-software-usado-en-una-determinada-corporacion/feed/ 0
Nueva versión de DNS Propagation Checker http://www.blogdemigueldiaz.com/2011/12/nueva-version-de-dns-propagation-checker/?utm_source=rss&utm_medium=rss&utm_campaign=nueva-version-de-dns-propagation-checker http://www.blogdemigueldiaz.com/2011/12/nueva-version-de-dns-propagation-checker/#comments Mon, 26 Dec 2011 05:09:22 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=1370 Continuar leyendo ]]> Hoy os presento una actualización del comprobador de propagación DNS que he desarrollado. Esta nueva versión incluye varias mejoras principales entre las que podemos destacar:

  • Actualización en tiempo real de los DNS comprobados, antes nos mostraba el resultado una vez se había comprobado en todos los DNS, ahora irá mostrando el resultado conforme se vaya comprobando.
  • Capacidad de usar diferentes listados de servidores DNS: Podremos elegir entre distintos listados DNS personalizados, porejemplo uno con servidores nacionales o internos de una empresa, otro con servidores extranjeros, etc.

Además se ha mejorado el resultado del programa logrando hasta un 30% mayor de precisión.

A continuación, como viene siendo habitual os dejo el código fuente:

Form1.vb

Imports System
Imports System.IO
Imports System.Text.RegularExpressions
Public Class DNSPropagationChecker
    Dim hilo As Threading.Thread
    Public Sub cargaListas()
        cbSeleccionListado.Items.Clear()
        Dim Ini As CIniClass
        Ini = New CIniClass
        Ini.Archivo = Application.StartupPath & "/dnspropagationchecker.ini"
        Dim contador As Integer = 1

Continuación de Form1.vb

        Dim servidor As String = "-1"
        While servidor <> ""
            servidor = Ini.LeeIni("LISTADOS", "LISTADO" & contador)
            If servidor <> "" Then
                cbSeleccionListado.Items.Add(servidor)
            End If
            contador += 1
        End While
        cbSeleccionListado.Items.Add("Nuevo listado")
    End Sub
    Public Sub cargaListadoDNS(ByVal listado As String)
        lbServidoresDNS.Items.Clear()
        lbServidoresDNS.Items.Add("Todos")
        Dim Ini As CIniClass
        Ini = New CIniClass
        Ini.Archivo = Application.StartupPath & "/dnspropagationchecker.ini"
        Dim contador As Integer = 1
        Dim servidor As String = "-1"
        While servidor <> ""
            servidor = Ini.LeeIni(listado, "SERVIDOR" & contador)
            If servidor <> "" Then
                lbServidoresDNS.Items.Add(servidor)
            End If
            contador += 1
        End While
        lbServidoresDNS.SelectedIndex = 0
    End Sub
    Private Sub btAñadir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAñadir.Click
        Form2.cantidadElementos = lbServidoresDNS.Items.Count()
        Form2.Show()
    End Sub
    'Esta funcion devueve true si la IP introducida es valida y false si no es valida
    Function compruebaIP(ByVal strFindin As String)
        Dim myRegex As New Regex("^(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d)$")
        If myRegex.IsMatch(strFindin) Then
            compruebaIP = True
        Else
            compruebaIP = False
        End If
    End Function
    Private Sub DNSPropagationChecker_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Leave
        Try
            hilo.Abort()
        Catch ex As Exception
        End Try
    End Sub
    Private Sub DNSPropagationChecker_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        CheckForIllegalCrossThreadCalls = False
        cbSeleccionListado.SelectedIndex = 0
        'Comprueba que el INI exista, si no existe lo crea con los servidores de Google de ejemplo.
        If System.IO.File.Exists(Application.StartupPath & "/dnspropagationchecker.ini") = False Then
            Dim Ini As CIniClass
            Ini = New CIniClass
            Ini.Archivo = Application.StartupPath & "/dnspropagationchecker.ini"
            Ini.GrabaIni("LISTADOS", "LISTADO1", "Listado variado")
            Ini.GrabaIni("Listado variado", "SERVIDOR2", "8.8.4.4")
            Ini.GrabaIni("Listado variado", "SERVIDOR1", "8.8.8.8")
        End If
        Try
            cargaListas()
            cbSeleccionListado.SelectedIndex = 0
        Catch ex As Exception
            MsgBox("No se ha podido cargar dnspropagationchecker.ini")
            End
        End Try
    End Sub
    Private Sub btComprobar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btComprobar.Click
        'Desactiva los controles
        tbDominio.Enabled = False
        tbIP.Enabled = False
        btAñadir.Enabled = False
        lbIP.Enabled = False
        lbServidoresDNS.Enabled = False
        btComprobar.Text = "Comprobando..."
        btComprobar.Enabled = False
        lbDNSPropagados.Visible = True
        hilo = New Threading.Thread(AddressOf comprobar_propagacion)
        hilo.Start()
    End Sub
    Sub comprobar_propagacion()
        Dim cantidadDNS As Integer = 1
        Dim contador As Integer = 0
        'Comprueba que haya puesto un dominio
        tbDominio.Text = tbDominio.Text.Replace(" ", "")
        tbIP.Text = tbIP.Text.Replace(" ", "")
        lbIP.Items.Clear()
        If tbDominio.Text = "" Then
            MsgBox("Debe introducir un nombre de dominio", MsgBoxStyle.Information)
            rehabilitar_elementos()
            Exit Sub
        End If
        'Comprueba que haya puesto una IP valida
        If compruebaIP(tbIP.Text) = False Then
            MsgBox("Debe introducir una IP válida", MsgBoxStyle.Information)
            rehabilitar_elementos()
            Exit Sub
        End If
        'Si se ha elegido el servidor Todos, guarda en el array todos los DNS. Si solo elige uno
        'Crea un array valor 0 y mete el servidor DNS concreto
        If lbServidoresDNS.SelectedIndex = 0 Then
            cantidadDNS = lbServidoresDNS.Items.Count() - 1
        End If
        Dim arrayDNS(cantidadDNS - 1) As String
        If lbServidoresDNS.SelectedIndex = 0 Then
            While contador < lbServidoresDNS.Items.Count - 1
                arrayDNS(contador) = lbServidoresDNS.Items(contador + 1).ToString
                contador += 1
            End While
        Else
            arrayDNS(0) = lbServidoresDNS.Items(lbServidoresDNS.SelectedIndex).ToString
        End If
        lbDNSPropagados.Visible = True
        lbIP.Visible = True
        'Prepara el proceso nslookup para que no se muestre la ventana de DOS
        Dim proceso As New Process
        proceso.StartInfo.RedirectStandardOutput = True
        proceso.StartInfo.FileName = "nslookup.exe"
        proceso.StartInfo.UseShellExecute = False
        proceso.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
        proceso.StartInfo.CreateNoWindow = True
        'Lo lanza contra cada servidor DNS recorriendo el array
        contador = 0
        While contador < arrayDNS.Length
            proceso.StartInfo.Arguments = "-retry=1 -timeout=1 " & tbDominio.Text & " " & arrayDNS(contador)
            proceso.Start()
            Dim sr As IO.StreamReader = proceso.StandardOutput
            Dim sb As New System.Text.StringBuilder("")
            Dim sinput As String = ""
            Do Until sinput = "-1"
                Dim resultado As String = sr.ReadLine
                'En caso de que devuelva algo con la IP buena, lo declara propagado
                If InStr(resultado, tbIP.Text) Then
                    anadir_elementos_listbox(arrayDNS(contador))
                ElseIf InStr(resultado, "timeout") Then
                    sinput = "-1"
                    proceso.Close()
                Else
                    sinput = sr.Read()
                End If
            Loop
            contador += 1
        End While
        If lbIP.Items.Count = 0 Then
            lbIP.Items.Add("Aún no se ha propagado en ningun servidor DNS seleccionado")
        End If
        'Reactiva los controles
        rehabilitar_elementos()
    End Sub
    Delegate Sub anadir_elementos_listboxCallback(ByVal elemento As String)
    Private Sub anadir_elementos_listbox(ByVal elemento As String)
        Try
            If lbIP.InvokeRequired Then
                Dim d As New anadir_elementos_listboxCallback(AddressOf anadir_elementos_listbox)
                Me.Invoke(d, elemento)
            Else
                lbIP.Items.Add(elemento)
            End If
        Catch ex As Exception
        End Try
    End Sub
    Delegate Sub rehabilitar_elementosCallback()
    Private Sub rehabilitar_elementos()
        If lbIP.InvokeRequired Then
            Dim d As New rehabilitar_elementosCallback(AddressOf rehabilitar_elementos)
            Me.Invoke(d)
        Else
            tbDominio.Enabled = True
            lbIP.Enabled = True
            lbServidoresDNS.Enabled = True
            btComprobar.Text = "Comprobar propagacion"
            btComprobar.Enabled = True
            tbIP.Enabled = True
            btAñadir.Enabled = True
        End If
    End Sub
    Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
        System.Diagnostics.Process.Start("http://www.blogdemigueldiaz.com/?proyecto=DNSPropagationChecker")
    End Sub
    Private Sub cbSeleccionListado_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbSeleccionListado.SelectedIndexChanged
        If cbSeleccionListado.SelectedItem.ToString <> "" And cbSeleccionListado.SelectedIndex < cbSeleccionListado.Items.Count - 1 Then
            cargaListadoDNS(cbSeleccionListado.SelectedItem.ToString)
        Else
            formNuevoListado.Show()
        End If
    End Sub
End Class

Form2.vb

Public Class Form2
    Dim listadoActual As String = DNSPropagationChecker.cbSeleccionListado.SelectedItem.ToString
    Public cantidadElementos As Integer = 0
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Guarda el DNS en el .ini
        If DNSPropagationChecker.compruebaIP(tbIPServidor.Text) = True Then
            Dim Ini As CIniClass
            Ini = New CIniClass
            Ini.Archivo = Application.StartupPath & "/dnspropagationchecker.ini"
            Ini.GrabaIni(listadoActual, "SERVIDOR" & cantidadElementos, tbIPServidor.Text)
            DNSPropagationChecker.cargaListadoDNS(DNSPropagationChecker.cbSeleccionListado.SelectedItem.ToString)
            Me.Close()
        Else
            MsgBox("Esa no es una IP Valida", MsgBoxStyle.Information)
        End If
    End Sub
End Class

formNuevoListado.vb

Public Class formNuevoListado
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim cantidadElementos As Integer = DNSPropagationChecker.cbSeleccionListado.Items.Count
        If tbNombreListado.Text.Replace(" ", "") <> "" Then 'Si ha introducido algo en el cuadro de texto
            'Comprueba que no exista ya en el listado
            For contador As Integer = 0 To DNSPropagationChecker.cbSeleccionListado.Items.Count - 1 Step 1
                If DNSPropagationChecker.cbSeleccionListado.Items.Item(contador).ToString = tbNombreListado.Text Then
                    MsgBox("Ya existe un listado con ese nombre", MsgBoxStyle.Information)
                    Exit Sub
                End If
            Next
            Dim ini As New CIniClass
            ini.Archivo = Application.StartupPath & "/dnspropagationchecker.ini"
            ini.GrabaIni("LISTADOS", "LISTADO" & cantidadElementos, tbNombreListado.Text)
            DNSPropagationChecker.cargaListas()
            DNSPropagationChecker.cbSeleccionListado.SelectedIndex = DNSPropagationChecker.cbSeleccionListado.Items.Count - 2
        Else 'Si esta vacio
            MsgBox("Debes introducir un nombre para el listado", MsgBoxStyle.Information)
        End If
    End Sub
End Class
]]>
http://www.blogdemigueldiaz.com/2011/12/nueva-version-de-dns-propagation-checker/feed/ 0
Pentesting: Conocer qué servidores y qué Webs visitan desde una determinada corporación mediante DNSCacheSnooping http://www.blogdemigueldiaz.com/2011/12/privacidad-conocer-el-trafico-de-una-determinada-corporacion-mediante-dns-cache-snooping/?utm_source=rss&utm_medium=rss&utm_campaign=privacidad-conocer-el-trafico-de-una-determinada-corporacion-mediante-dns-cache-snooping http://www.blogdemigueldiaz.com/2011/12/privacidad-conocer-el-trafico-de-una-determinada-corporacion-mediante-dns-cache-snooping/#comments Sat, 10 Dec 2011 15:40:11 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=1193 Continuar leyendo ]]> Parece que día a día nos vamos concienciando mas de la importancia de la privacidad: los navegadores añaden la navegación privada, las redes sociales mejoran sus políticas de privacidad y el usuario además aprende a usar todo esto… Pero… ¿y si muchas de estas medidas no sirvieran de (casi) nada?

Me gustaría empezar una nueva parte en el blog acerca de la seguridad informática es algo que siempre me ha llamado la atención aunque no sea mas que un pequeño aprendiz.

Hoy os explicaré la técnica del DNS Cache Snooping con la que podremos conocer las páginas, servidores visitados (y mucho mas) desde una empresa mediante un caso práctico y os propondré alguna solución.

Caso práctico: Conocer el tráfico de la red informática de Correos

He elegido Correos como ejemplo al ser una empresa grande y conocida a nivel nacional. Antes de empezar debemos tener claro como funcionan los servidores DNS:

Cuando introducimos el servidor de un portal nuestro ordenador preguntará a un DNS qué IP corresponde a ese dominio y con esta información el PC se conectará con dicha página. Los servidores DNS están interconectados de forma que si en su caché no figura el dominio solicitado lo preguntará a otro y lo guardará la caché un tiempo prudencial para poder responder mas rápidamente en futuras ocasiones.

Para saber qué dominios están visitando en su red nos conectaremos a uno de sus DNS, y una vez hecho le preguntaremos qué páginas tiene cacheadas sin que tenga que recurrir a otros servidores DNS. Podemos averiguar que DNS usan en Correos usando nslookup:

Como veis es sencillo, establecemos que queremos consultar qué DNS hay y luego damos el servidor sobre el cual queremos realizar la consulta y obtenemos los distintos servidores que usan en correos: En nuestro caso usaremos ns1.correos.es

Ahora pasamos a lo divertido, conectarnos al DNS de Correos y ver a qué servidores se ha accedido recientemente:

Os comento, lo primero que hemos hecho ha sido definir sobre que servidor DNS haremos las consultas, a continuación le hemos dicho que nos de resultados de tipo a, es decir nos dirá a que IP corresponde un determinado dominio y posteriormente hemos pedido que en caso de que no encuentre cacheado el dominio no lo pregunte a fuentes externas. Por último hemos introducido la URL del dominio que queríamos ver si estaba cacheada “www.facebook.com” y puesto que el servidor nos ha sabido resolver la IP podemos decir que esa página se ha visto de forma muy reciente desde el la red de Correos.

Debemos saber además que si ponemos una Web que no existe o que no ha sido visitada obtendremos un listado de servidores que si pueden darnos esa información.

Si le damos un par de vueltas al coco veremos que no solo nos valdrá para marujear si no que podemos averiguar la tecnología que usan en esa red: Por ejemplo si una de las url cacheadas es update.microsoft.com seguramente usarán Windows, si conectan con los servidores de Symantec quizás usen Norton Antivirus, o si lo hacen a servidores Sun tengan equipos con Java, etc.

Obviamente sería tedioso comprobar dirección a dirección cada uno de los dominios, pero podemos crear nuestro propio script encargado de hacerlo automáticamente desde un listado y nos guarde el listado en un txt. Lo dejo a vuestra imaginación.

La solución frente a esto es muy sencilla: Usar varios servidores DNS  uno encargado de gestionar exclusivamente nuestros servicios y usar otro para Internet el cual no sea accesible desde fuera de la red corporativa.

]]>
http://www.blogdemigueldiaz.com/2011/12/privacidad-conocer-el-trafico-de-una-determinada-corporacion-mediante-dns-cache-snooping/feed/ 2
Nueva versión de mRemoto 0.9.8 – Programa de control remoto http://www.blogdemigueldiaz.com/2011/12/nueva-version-de-mremoto-0-9-8-programa-de-control-remoto/?utm_source=rss&utm_medium=rss&utm_campaign=nueva-version-de-mremoto-0-9-8-programa-de-control-remoto http://www.blogdemigueldiaz.com/2011/12/nueva-version-de-mremoto-0-9-8-programa-de-control-remoto/#comments Thu, 08 Dec 2011 19:22:35 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=1136 Continuar leyendo ]]>
Los que me seguís en Twitter o Facebook sabréis que hace poco publicaron mRemoto en softonic. Llevaba tiempo queriendo publicar algunas de mis aplicaciones en este portal y para celebrarlo he añadido varias mejoras en mRemoto.
Ahora, además de todas las funcionalidades anteriores, respetando la portabilidad y el reducido tamaño de la aplicación he añadido la posibilidad de enviar ficheros a el equipo controlado, de esta forma si estamos realizando alguna actividad y necesitamos de algún programa o documento que no tenemos podemos enviarlo desde nuestro equipo.

Otra funcionalidad que pedía a gritos ser añadida ha sido la de bloquear el teclado y el mouse del equipo, así si estamos utilizándolo podemos hacer clic en el botón “Bloquear mouse” para evitar que otra persona intente trabajar en el equipo al mismo tiempo.

Descarga de portables y mas información disponible en la página de mRemoto

]]>
http://www.blogdemigueldiaz.com/2011/12/nueva-version-de-mremoto-0-9-8-programa-de-control-remoto/feed/ 1
mRemoto – Programa de control remoto http://www.blogdemigueldiaz.com/2011/10/mremoto-%e2%80%93-programa-de-control-remoto/?utm_source=rss&utm_medium=rss&utm_campaign=mremoto-%25e2%2580%2593-programa-de-control-remoto http://www.blogdemigueldiaz.com/2011/10/mremoto-%e2%80%93-programa-de-control-remoto/#comments Sun, 02 Oct 2011 12:53:57 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=998 Continuar leyendo ]]> He desarrollado un sistema de control remoto. 

Hacía tiempo que quería hacer algo así, siempre me han llamado mucho la atención este tipo de programas, no se muy bien por qué, así que me he puesto manos a la obra  y aquí lo tenéis en .Net.

mRemoto te permite ver remotamente equipos e interactuar con sus aplicaciones a través de la red.

Tiene varias características muy buenas frente a otros programas similares, por ejemplo:

  • El equipo administrador puede conectar directamente  o el equipo controlado sea el que solicite ayuda al primero.
  • Muy poco peso: Apenas 200Kb, con lo que podremos realizar actualizaciones o instalarlo en cualquier momento.
  • No es necesario permisos de administrador en ninguna de las partes
  • No es necesario instalar el programa ya que se dispone de versiones portables tanto de la parte administradora (la encargada de controlar el equipo) como del agente, que es la parte del equipo controlado

Descargas portables y mas información disponible en la página de mRemoto
El código fuente lo iré liberando a partir de la primera versión, de momento es una beta con lo que para la primera habrá que esperar un poco

]]>
http://www.blogdemigueldiaz.com/2011/10/mremoto-%e2%80%93-programa-de-control-remoto/feed/ 0
Nueva versión de RoboCAUpy – Interfaz de robocopy http://www.blogdemigueldiaz.com/2011/09/nueva-version-de-robocaupy-interfaz-de-robocopy/?utm_source=rss&utm_medium=rss&utm_campaign=nueva-version-de-robocaupy-interfaz-de-robocopy http://www.blogdemigueldiaz.com/2011/09/nueva-version-de-robocaupy-interfaz-de-robocopy/#comments Sun, 18 Sep 2011 23:05:38 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=652 Continuar leyendo ]]> He desarrollado una nueva versión de RoboCAUpy.

Para quien no lo conzoca RoboCAUpy es una interfaz sencilla de robocopy, programa que nos permite realizar copias de directorios completos (tanto locales como en red) evitando aquellos problemas que pudieran surgir por cosas como nombres largos, carácteres extraños, archivos en uso o microcortes de red.

Esta utilidad es muy común para realizar copias de seguridad, migraciones de equipos, o copias de gran cantidad de ficheros, por su fiabilidad y rapidez.

La nueva versión ha añadido la opción parScreenshot de robocaupya mantener los permisos originales de los ficheros o volver a escribirlos, ahora se puede ver el progreso individual de cada archivo al lado de su nombre y además lanza por un hilo independiente el proceso de copia de archivos de forma que la interfaz siga respondiendo aunque robocopy se encuentre pausado.

Puedes ver los cambios de código fuente (147 líneas) a continuación:

Form1.vb

 Imports System
Imports System.IO
Imports System.Collections
Imports System.Threading
Public Class Form1
    Dim proceso As New Process 'Crea el proceso
    Dim rutaRoboCopy As String 'Contendra la ruta a robocopy
    Dim hilo As Thread 'Hilo encargado de comprobar el estado de robocopy
    Private Sub EjecutarRoboCopy() 'Funcion encargada de ejecutar el robocopy
        'Desactiva los controles antes de iniciar la copia y muestra el textbox del log.
        ListBox1.Items.Clear()
        ListBox1.Visible = True
        ProgressBar1.Visible = True

Continuación de Form1.vb

        gbOpcionesError.Enabled = False
        gbOpcionesPermisos.Enabled = False
        btCopiar.Text = "Parar"
        btExaminarOrigen.Enabled = False
        btExaminarDestino.Enabled = False
        tbOrigen.Enabled = False
        tbDestino.Enabled = False
        Me.Size = New System.Drawing.Size(Me.Size.Width, Me.MaximumSize.Height)
        'Definicion del proceso robocopy
        proceso.StartInfo.FileName = rutaRoboCopy
        proceso.StartInfo.Arguments = """" & tbOrigen.Text.TrimEnd("\") & """ """ & tbDestino.Text.TrimEnd("\") & """ /E /R:" & nUDReintentar.Value & " /W:" & nUDSegundos.Value 'Parametros
        If rbNuevos.Checked = False Then
            proceso.StartInfo.Arguments &= " /SEC"
        End If
        proceso.StartInfo.RedirectStandardOutput = True 'Redirige la salida
        proceso.StartInfo.UseShellExecute = False 'No sale a ms-dos.
        proceso.StartInfo.CreateNoWindow = True 'No crea nueva ventana.
        proceso.Start() 'Lanza el proceso
        Try
            If hilo.IsAlive = True Then
                hilo.Abort()
            End If
        Catch ex As Exception
        End Try
        'Verifica el estado a través de un hilo
        hilo = New Thread(AddressOf comprobar_robocopy)
        hilo.Start()
        'Timer1.Enabled = True
    End Sub
    Sub comprobar_robocopy()
        'Encargado de ir mostrando en el ListBox la salida del proceso robocopy.exe, se hace mediante un timer en lugar de a tiempo real para no relentizar la aplicacion
        Dim linea As String = "algo"
        ListBox1.TopIndex = ListBox1.Items.Count
        Dim sr As IO.StreamReader = proceso.StandardOutput
        Dim sb As New System.Text.StringBuilder("")
        Dim sinput As String
        Do Until sinput = "-1"
            Dim bytes() As Byte = {sinput}
            linea = System.Text.Encoding.UTF8.GetString(bytes) & sr.ReadLine
            If linea.Contains("%") = True Then
                If linea.Substring(0, InStr(linea, "%") - 1) > 0 Then
                    Dim antiguoitem As String = ListBox1.Items(ListBox1.Items.Count - 2)
                    antiguoitem = antiguoitem.Remove(0, InStr(antiguoitem, "%"))
                    If InStr(ListBox1.Items(ListBox1.Items.Count - 1), "%") < 1 Then
                        ListBox1.Items(ListBox1.Items.Count - 1) = linea.Substring(0, InStr(linea, "%")) & ListBox1.Items(ListBox1.Items.Count - 1)
                    Else
                        ListBox1.Items(ListBox1.Items.Count - 1) = linea.Substring(0, InStr(linea, "%")) & antiguoitem
                    End If
                Else
                    ListBox1.Items.Add(linea)
                End If
            Else
                ListBox1.Items.Add(linea)
            End If
            ListBox1.SelectedIndex = ListBox1.Items.Count - 1
            sinput = sr.Read()
        Loop
        'Oculta la barra de progreso
        restablecer_controles()
    End Sub
    Delegate Sub restablecer_controlesCallBack()
    Private Sub restablecer_controles()
        ' InvokeRequired required compares the thread ID of the
        ' calling thread to the thread ID of the creating thread.
        ' If these threads are different, it returns true.
        ProgressBar1.Visible = False
        gbOpcionesError.Enabled = True
        btExaminarOrigen.Enabled = True
        btExaminarDestino.Enabled = True
        tbOrigen.Enabled = True
        tbDestino.Enabled = True
        ProgressBar1.Visible = False
        gbOpcionesPermisos.Enabled = True
        btCopiar.Text = "Copiar"
    End Sub
    Private Sub btCopiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCopiar.Click
        If btCopiar.Text = "Copiar" Then
            EjecutarRoboCopy() 'Ejecuta el robocopy
        Else 'Si en el boton no ponia Copiar quiere decir que ya se estaba ejecutando el robocopy por tanto para robocopy y reactiva los controles.
            proceso.Kill()
            restablecer_controles()
        End If
    End Sub
    Private Sub btExaminarOrigen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btExaminarOrigen.Click
        If oFDOrigen.ShowDialog = Windows.Forms.DialogResult.OK Then
            tbOrigen.Text = IO.Path.GetDirectoryName(oFDOrigen.FileName) 'Ruta de origen
        End If
    End Sub
    Private Sub btExaminarDestino_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btExaminarDestino.Click
        If oFDDestino.ShowDialog = Windows.Forms.DialogResult.OK Then
            tbDestino.Text = IO.Path.GetDirectoryName(oFDDestino.FileName) 'Ruta de destino
        End If
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Comprueba que exista el fichero system32/robocopy.exe, program files\Windows Resource Kits\Tools\robocopy.exe o ./robocopy.exe y si no finaliza
        If IO.File.Exists(Environment.SystemDirectory.ToString & "\robocopy.exe") = True Then
            rutaRoboCopy = Environment.SystemDirectory.ToString & "\robocopy.exe"
        ElseIf IO.File.Exists(System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) & "\Windows Resource Kits\Tools\robocopy.exe") = True Then
            rutaRoboCopy = System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) & "\Windows Resource Kits\Tools\robocopy.exe"
        ElseIf IO.File.Exists(IO.Path.GetDirectoryName(Application.ExecutablePath) & "\robocopy.exe") = True Then
            rutaRoboCopy = IO.Path.GetDirectoryName(Application.ExecutablePath) & "\robocopy.exe"
        Else
            MsgBox("No se ha encontrado robocopy.exe, asegurese de tenerlo instalado o una copia en el directorio local.")
            End
        End If
        CheckForIllegalCrossThreadCalls = False 'Realizar cambis en formulario desde otro hilo
    End Sub
End Class
]]>
http://www.blogdemigueldiaz.com/2011/09/nueva-version-de-robocaupy-interfaz-de-robocopy/feed/ 2
Comprobar el estado de la propagación DNS – DNSPropagationChecker http://www.blogdemigueldiaz.com/2011/08/comprobar-el-estado-de-la-propagacion-dns-dnspropagationchecker/?utm_source=rss&utm_medium=rss&utm_campaign=comprobar-el-estado-de-la-propagacion-dns-dnspropagationchecker http://www.blogdemigueldiaz.com/2011/08/comprobar-el-estado-de-la-propagacion-dns-dnspropagationchecker/#comments Sun, 21 Aug 2011 15:26:07 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=608 Continuar leyendo ]]> Recientemente he cambiado el servidor del blog y las DNS han tardado bastante mas de lo esperado en propagarse, realmente me sentia desconcertado tras las primeras 8 horas sin rastro de vida en el blog, no sabía si las IP se estaban propagando o no y realmente hacer un seguimiento con nslookup era un suplicio.

Por eso he programado DNS Propagation Checker, que básicamente nos servirá para comprobar el estado de la propagación DNS del dominio que queramos en un listado enorme (editable a través de un INI) de DNS.

La interfaz del programa es muy sencilla: introducimos el dominio y la IP a la que debe apuntar, damos a comprobar y  en unos segundos tendremos el listado de todas las DNS a donde se ha propagado.

Es importante que descomprimáis todo el contenido, ya que aparte del exe hay un .ini donde se guarda un listado importante de DNS.

Como siempre, os dejo el código fuente de la aplicación. Es necesario un proyecto con un Formulario (Form1) que contenga dos textbox (tbDominio, tbIP), dos ListBox (listDNSPropagados, lbServidoresDNS), dos botones (btComprobar, btAñadir), y otro formulario (Form2) con un textbox (TextBox1) y un boton (Button1).

Form1.vb

Imports System
Imports System.IO
Imports System.Text.RegularExpressions
'Lectura de archivos INI
Imports System.Runtime.InteropServices
Public Class DNSPropagationChecker
    'Esta funcion devueve true si la IP introducida es valida y false si no es valida
    Function compruebaIP(ByVal strFindin As String)


Continuación Form1.vb

        Dim myRegex As New Regex("^(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d)$")
        If myRegex.IsMatch(strFindin) Then
            compruebaIP = True
        Else
            compruebaIP = False
        End If
    End Function
    Private Sub DNSPropagationChecker_Load() Handles MyBase.Load
        'Comprueba que el INI exista, si no existe lo crea con los servidores de Google de ejemplo.
        If System.IO.File.Exists(Application.StartupPath & "/dnspropagationchecker.ini") = False Then
            Dim Ini As CIniClass
            Ini = New CIniClass
            Ini.Archivo = Application.StartupPath & "/dnspropagationchecker.ini"
            Ini.GrabaIni("DNS", "SERVIDOR1", "8.8.8.8")
            Ini.GrabaIni("DNS", "SERVIDOR2", "8.8.4.4")
        End If
        Try
            cargaListadoDNS()
        Catch ex As Exception
            MsgBox("No se ha podido cargar dnspropagationchecker.ini")
            End
        End Try
    End Sub
    Private Sub btComprobar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btComprobar.Click
        Dim cantidadDNS As Integer = 1
        Dim contador As Integer = 0
        'Comprueba que haya puesto un dominio
        tbDominio.Text = tbDominio.Text.Replace(" ", "")
        tbIP.Text = tbIP.Text.Replace(" ", "")
        listDNSPropagados.Items.Clear()
        If tbDominio.Text = "" Then
            MsgBox("Debe introducir un nombre de dominio", MsgBoxStyle.Information)
            Exit Sub
        End If
        'Comprueba que haya puesto una IP valida
        If compruebaIP(tbIP.Text) = False Then
            MsgBox("Debe introducir una IP válida", MsgBoxStyle.Information)
            Exit Sub
        End If
        'Si se ha elegido el servidor Todos, guarda en el array todos los DNS. Si solo elige uno
        'Crea un array valor 0 y mete el servidor DNS concreto
        If lbServidoresDNS.SelectedIndex = 0 Then
            cantidadDNS = lbServidoresDNS.Items.Count() - 1
        End If
        Dim arrayDNS(cantidadDNS - 1) As String
        If lbServidoresDNS.SelectedIndex = 0 Then
            While contador                 arrayDNS(contador) = lbServidoresDNS.Items(contador + 1).ToString
                contador += 1
            End While
        Else
            arrayDNS(0) = lbServidoresDNS.Items(lbServidoresDNS.SelectedIndex).ToString
        End If
        'Desactiva los controles
        tbDominio.Enabled = False
        lbIP.Enabled = False
        lbServidoresDNS.Enabled = False
        btComprobar.Text = "Comprobando..."
        btComprobar.Enabled = False
        lbDNSPropagados.Visible = True
        listDNSPropagados.Visible = True
        'Prepara el proceso nslookup para que no se muestre la ventana de DOS
        Dim proceso As New Process
        proceso.StartInfo.RedirectStandardOutput = True
        proceso.StartInfo.FileName = "nslookup.exe"
        proceso.StartInfo.UseShellExecute = False
        proceso.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
        proceso.StartInfo.CreateNoWindow = True
        'Lo lanza contra cada servidor DNS recorriendo el array
        contador = 0
        While contador < arrayDNS.Length             proceso.StartInfo.Arguments = "-retry=1 -timeout=1 " & tbDominio.Text & " " & arrayDNS(contador)             proceso.Start()             Dim sr As IO.StreamReader = proceso.StandardOutput             Dim sb As New System.Text.StringBuilder("")             Dim sinput As String = ""             Do Until sinput = "-1"                 Dim resultado As String = sr.ReadLine                 'En caso de que devuelva algo con la IP buena, lo declara propagado                 If InStr(resultado, tbIP.Text) Then                     listDNSPropagados.Items.Add(arrayDNS(contador))                 ElseIf InStr(resultado, "timeout") Then                     sinput = "-1"                     proceso.Close()                 Else                     sinput = sr.Read()                 End If             Loop             contador += 1         End While         If listDNSPropagados.Items.Count = 0 Then             listDNSPropagados.Items.Add("Aún no se ha propagado en ningun servidor DNS seleccionado")         End If         'Reactiva los controles         tbDominio.Enabled = True         lbIP.Enabled = True         lbServidoresDNS.Enabled = True         btComprobar.Text = "Comprobar propagacion"         btComprobar.Enabled = True     End Sub     'Esta funcion devueve true si la IP introducida es valida y false si no es valida     Function compruebaIP(ByVal strFindin As String)         Dim myRegex As New Regex("^(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d)$")         If myRegex.IsMatch(strFindin) Then             compruebaIP = True         Else             compruebaIP = False         End If     End Function     Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked         System.Diagnostics.Process.Start("http://www.blogdemigueldiaz.com/?proyecto=DNSPropagationChecker")     End Sub     Public Class CIniClass         Private m_Ini As String         Private Declare Function GetPrivateProfileStringKey Lib "kernel32" Alias _         "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal _         lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString _         As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer         Private Declare Function WritePrivateProfileString Lib "kernel32" Alias _         "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal _         lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer         Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer         Property Archivo() As String             Get                 Archivo = m_Ini             End Get             Set(ByVal value As String)                 m_Ini = value             End Set         End Property         'Leer una llave de un archivo .ini         Public Function LeeIni(ByVal Seccion As String, ByVal Llave As String) As String             Dim Est As String = New String(Chr(0), 255)             Dim i As Long = GetPrivateProfileString(Seccion, Llave, "", Est, Len(Est), Archivo)             If i > 0 Then
                LeeIni = Est.Split(Chr(0))(0)
            Else
                LeeIni = ""
            End If
        End Function
        Public Sub GrabaIni(ByVal Seccion As String, ByVal Llave As String, ByVal Valor As String)
            Dim lret As Long
            lret = WritePrivateProfileString(Seccion, Llave, Valor, m_Ini)
        End Sub
    End Class
    Private Sub btAñadir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAñadir.Click
        Form2.cantidadElementos = lbServidoresDNS.Items.Count()
        Form2.Show()
    End Sub
    Public Sub cargaListadoDNS()
        lbServidoresDNS.Items.Clear()
        lbServidoresDNS.Items.Add("Todos")
        Dim Ini As CIniClass
        Ini = New CIniClass
        Ini.Archivo = Application.StartupPath & "/dnspropagationchecker.ini"
        Dim contador As Integer = 1
        Dim servidor As String = "-1"
        While servidor <> ""
            servidor = Ini.LeeIni("DNS", "SERVIDOR" & contador)
            If servidor <> "" Then
                lbServidoresDNS.Items.Add(servidor)
            End If
            contador += 1
        End While
        lbServidoresDNS.SelectedIndex = 0
    End Sub
End Class

Form2.vb

Public Class Form2
    Public cantidadElementos As Integer = 0
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  'Guarda el DNS en el .ini
        If DNSPropagationChecker.compruebaIP(TextBox1.Text) = True Then
            Dim Ini As CIniClass
            Ini = New CIniClass
            Ini.Archivo = Application.StartupPath & "/dnspropagationchecker.ini"
            Ini.GrabaIni("DNS", "SERVIDOR" & cantidadElementos, TextBox1.Text)
            DNSPropagationChecker.cargaListadoDNS()
            Me.Close()
        Else
            MsgBox("Esa no es una IP Valida", MsgBoxStyle.Information)
        End If
    End Sub
    Public Class CIniClass
        Private m_Ini As String
        Private Declare Function GetPrivateProfileStringKey Lib "kernel32" Alias _
        "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal _
        lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString _
        As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
        Private Declare Function WritePrivateProfileString Lib "kernel32" Alias _
        "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal _
        lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer
        Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
        Property Archivo() As String
            Get
                Archivo = m_Ini
            End Get
            Set(ByVal value As String)
                m_Ini = value
            End Set
        End Property
        'grabar una llave a un archivo ini
        Public Sub GrabaIni(ByVal Seccion As String, ByVal Llave As String, ByVal Valor As String)
            Dim lret As Long
            lret = WritePrivateProfileString(Seccion, Llave, Valor, m_Ini)
        End Sub
    End Class
End Class
]]>
http://www.blogdemigueldiaz.com/2011/08/comprobar-el-estado-de-la-propagacion-dns-dnspropagationchecker/feed/ 1
Autoarchivado por fecha en Outlook 2007 automaticamente mediante una extensión http://www.blogdemigueldiaz.com/2011/08/autoarchivado-por-fecha-en-outlook-mediante-una-extension/?utm_source=rss&utm_medium=rss&utm_campaign=autoarchivado-por-fecha-en-outlook-mediante-una-extension http://www.blogdemigueldiaz.com/2011/08/autoarchivado-por-fecha-en-outlook-mediante-una-extension/#comments Thu, 18 Aug 2011 18:34:42 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=566 Continuar leyendo ]]> Si hay una herramienta usada en el mundo empresarial es Microsoft Outlook, para bien o para mal cualquier persona pasa horas con ella al día, por esta aplicación pasa muchísima información diaria y por eso es muy importante tenerla siempre activa y funcionando sin problemas. Una caracteristica de Outlook muy usada es el autoarchivado, esta caracteristica descarga los correos del servidor y los guarda en un archivo en el disco duro local para liberar espacio en el servidor y ahorrar ancho de banda, esto es una gran solución pero conlleva un problema y es que si dicho archivo termina superando los 2GB de información Outlook se vuelve especialmente lento e inestable a la hora de trabajar con el, por eso he desarrollado un Addin (codigo fuente mas adelante) que genera un nuevo fichero de archivado cada año, de esta forma reducimos muy considerablemente el riesgo a sobrepasar ese limite y además nos ayuda a tener nuestras carpetas archivadas ordenadas según fechas.

El fichero PST creado  lo guarda en %AppData%/Local settings/Microsoft/Outlook/ y le da este nombre dinámico “archivePerfilAño.pst” donde Perfil seria el nombre de nuestro perfil de Outlook y año el año correspondiente a las carpetas archivadas.

Además, es posible exportar la configuración en un archivo (AutoArchiveByDate.cfg) e importarla con solo copiarla: ideal para instalaciones masivas. Para acceder a la ventana de configuración  debemos ir a un nuevo menú que aparecerá llamado AutoArchiveByDate.

Para los mas curiosos, aquí tenéis el código fuente, consta de un formulario (Form1, ventana de configuracion) que debe contener al menos dos NumericUpDown (nFrecuencia, nAnteriores) un ComboBox (cbFormatoTiempo), dos CheckBox (cbHabilitarAutoarchivado, cbPreguntar) y dos botones (Aceptar, Cancelar) y por otro lado la extensión:

ThisAddin.vb

Imports System.Runtime.InteropServices
Imports System.Runtime.InteropServices
Public Class ThisAddIn
    Private menuBar As Office.CommandBar
    Private newMenuBar As Office.CommandBarPopup
    Private buttonOne As Office.CommandBarButton
    Private menuTag As String = "A unique tag"
    Dim frecuencia_archivado As Integer 'Cada X tiempo se ejecuta
    Dim preguntar_archivado As Integer '0 no pregunta, 1 pregunta antes de archivar
    Dim elementos_anteriores As Integer 'Eliminar anteriores a X


Continuación de ThisAddin.vb

    Dim autoarchivado_habilitado As Integer '0 deshabilitado, 1 pregunta
    Dim formato_tiempo As Integer '0-Meses/1-Semanas/1-Dias
    Dim nombre_pst As String
    Private Sub ThisAddIn_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shutdown
        'RemoveMenubar()
    End Sub
    Private Sub ThisAddIn_Startup() Handles Me.Startup
        'Conexion con la aplicación Outlook
        Dim olApp As Outlook.Application
        olApp = CreateObject("Outlook.Application")
        'Variables de configuración
        If System.IO.File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Microsoft\Outlook\AutoArchiveByDate.cfg") = False Then 'Si no existe el archivo de configuracion lo crea
            Dim fichero_w As New System.IO.StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Microsoft\Outlook\AutoArchiveByDate.cfg")
            fichero_w.WriteLine("1,1,0,69,0,1")
            fichero_w.Close()
        End If
        Dim fichero_r As New System.IO.StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Microsoft\Outlook\AutoArchiveByDate.cfg")
        Dim contenido_fichero() As String = fichero_r.ReadLine.Split(",")
        fichero_r.Close()
        autoarchivado_habilitado = contenido_fichero(0) '0 deshabilitado, 1 pregunta
        frecuencia_archivado = contenido_fichero(1) 'Cada X tiempo se ejecuta
        preguntar_archivado = contenido_fichero(2) '0 no pregunta, 1 pregunta antes de archivar
        elementos_anteriores = contenido_fichero(3) 'Eliminar anteriores a X
        formato_tiempo= contenido_fichero(4) '0-Meses/1-Semanas/1-Dias
        nombre_pst = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Microsoft\Outlook\archive" & olApp.Session.CurrentProfileName.ToString & My.Computer.Clock.LocalTime.Year & ".pst"     'El nombre del PST sera formato archiveNombrePerfilAño.pst
        Dim version_office As String = olApp.Version.Split(".")(0) & "." & olApp.Version.Split(".")(1)
        'Variable donde se guardan los datos de configuración de outlook
        Dim cadena_registro As String = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & version_office & "\Outlook\Preferences"
        Dim cadena_pst As String = "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\" & olApp.Session.CurrentProfileName.ToString & "\0a0d020000000000c000000000000046"
        'Habilita/Deshabilita el archivado
        My.Computer.Registry.SetValue(cadena_registro, "DoAging", autoarchivado_habilitado)
        'Establece la frecuencia
        My.Computer.Registry.SetValue(cadena_registro, "EveryDays", frecuencia_archivado)
        'Preguntar o no preguntar antes de archivar
        My.Computer.Registry.SetValue(cadena_registro, "PromptForAging", preguntar_archivado)
        'Elementos anteriores a
        My.Computer.Registry.SetValue(cadena_registro, "ArchivePeriod", elementos_anteriores)
        My.Computer.Registry.SetValue(cadena_registro, "ArchiveGranularity", formato_tiempo)
        'Establece el nombre de la PST
        My.Computer.Registry.SetValue(cadena_pst, "001" & Chr(90 + olApp.Version.Split(".")(0)) & "0324", nombre_pst)
        RemoveMenubar()
        AddMenuBar()
    End Sub
    Private Sub AddMenuBar()
        Try
            menuBar = Application.ActiveExplorer().CommandBars.ActiveMenuBar
            newMenuBar = menuBar.Controls.Add( _
                Office.MsoControlType.msoControlPopup, _
                Temporary:=False)
            If newMenuBar IsNot Nothing Then
                newMenuBar.Caption = "AutoArchiveByDate"
                newMenuBar.Tag = menuTag
                buttonOne = newMenuBar.Controls.Add( _
                    Office.MsoControlType.msoControlButton, _
                    Before:=1, Temporary:=True)
                With buttonOne
                    .Style = Office.MsoButtonStyle.msoButtonIconAndCaption
                    .Caption = "Configurar"
                    .FaceId = 65
                    .Tag = "c123"
                End With
                AddHandler buttonOne.Click, AddressOf ButtonOne_Click
                newMenuBar.Visible = True
            End If
        Catch Ex As Exception
            MsgBox(Ex.Message)
        End Try
    End Sub
    Public Sub ButtonOne_Click(ByVal buttonControl As Office. _
    CommandBarButton, ByRef Cancel As Boolean)
        Dim formulario As New Form1
        formulario.Show()
    End Sub
    Private Sub RemoveMenubar()
        Try
            ' If the menu already exists, remove it.
            Dim foundMenu As Office.CommandBarPopup = _
                Application.ActiveExplorer().CommandBars.ActiveMenuBar. _
                FindControl(Office.MsoControlType.msoControlPopup, _
                System.Type.Missing, menuTag, True, True)
            If foundMenu IsNot Nothing Then
                foundMenu.Delete(True)
            End If
        Catch Ex As Exception
            MsgBox(Ex.Message)
        End Try
    End Sub
End Class

Form1.vb

Public Class Form1
    Private Sub Cancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancelar.Click
        Me.Close()
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim fichero_r As New System.IO.StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Microsoft\Outlook\AutoArchiveByDate.cfg")
        Dim contenido_fichero() As String = fichero_r.ReadLine.Split(",")
        fichero_r.Close()
        Dim autoarchivado_habilitado As String = contenido_fichero(0) '0 deshabilitado, 1 pregunta
        Dim frecuencia_archivado As String = contenido_fichero(1) 'Cada X tiempo se ejecuta
        Dim preguntar_archivado As String = contenido_fichero(2) '0 no pregunta, 1 pregunta antes de archivar
        Dim elementos_anteriores As String = contenido_fichero(3) 'Eliminar anteriores a X
        Dim formato_tiempo As String = contenido_fichero(4) '0-Meses/1-Semanas/1-Dias
        If autoarchivado_habilitado = 1 Then
            cbHabilitarAutoarchivado.Checked = True
        End If
        nFrecuencia.Value = frecuencia_archivado
        If preguntar_archivado = 1 Then
            cbPreguntar.Checked = True
        End If
        nAnteriores.Value = elementos_anteriores
        cbFormatoTiempo.SelectedIndex = formato_tiempo
    End Sub
    Private Sub Aceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Aceptar.Click
        'Guarda las preferencias
        Dim preferencias As String
        If cbHabilitarAutoarchivado.Checked = True Then
            preferencias = "1,"
        Else
            preferencias = "0,"
        End If
        preferencias &= nFrecuencia.Value & ","
        If cbPreguntar.Checked = True Then
            preferencias &= "1,"
        Else
            preferencias &= "0,"
        End If
        preferencias &= nAnteriores.Value & "," & cbFormatoTiempo.SelectedIndex
        Dim fichero_w As New System.IO.StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Microsoft\Outlook\AutoArchiveByDate.cfg")
        fichero_w.WriteLine(preferencias)
        fichero_w.Close()
        MsgBox("Debe reiniciar Microsoft Outlook para cargar que los cambios tengan efecto")
        Me.Close()
    End Sub
End Class
]]>
http://www.blogdemigueldiaz.com/2011/08/autoarchivado-por-fecha-en-outlook-mediante-una-extension/feed/ 1