Blog gratis
Reportar
Editar
¡Crea tu blog!
Compartir
¡Sorpréndeme!
img
img

 

 

Informática forense
Peritajes informáticos, análisis de evidencia presentada por las partes en juicios civiles.

img
img
img
.Más leídos
» Correo Microsoft Exchange modificado manualmente
» Desaparecieron los correos que tenía en hotmail
» Editores de texto que resalten la sintaxis eml de correos electrónicos
» ¿Es posible peritar emails en formato papel o pdf?
» Fingerprint servidor exchange
» Los correos electrónicos no son todos iguales
» Los procedimientos técnicos que se apliquen
» Metadatos de archivos digitales
» Preservar mensajes de WhatsApp
» Thread index análisis forense de emails
img
.Sobre mí
FOTO

Ing. Andres Aliaga

Gerente Comercial - Software -
Profesor de la Universidad del Salvador

» Ver perfil

img
.Buscador
Blog   Web
img
.Nube de tags [?]
img
.Enlaces
img
.Se comenta...
14 de Febrero, 2019 · General

Thread index análisis forense de emails


Los correos electrónicos recibidos desde cuentas hotmail.com, outlook.com, live.com provenientes del servidor de correo electrónico outlook.com poseen un tag generado de manera automática llamado thread-index.

Dicho tag incluye de manera codificada una o más fechas y horas. De incluir una fecha, la misma se corresponde con la fecha de envío del correo electrónico y debe ser similar a la fecha obrante en el correo electrónico.

De tratarse de una comunicación donde se involucra un intercambio de correos que poseen un mismo asunto y sus sucesivas respuestas o reenvíos, el tag thread-index puede incluir asimismo información sobre las fechas y horas de dichos reenvíos.

Toda esta información puede ser útil al momento que se sospecha que la fecha de un correo electrónico ha sido adulterada.

Una forma manual de obtener la decodificación de thread-index es la siguiente:

1) Abrir el encabezado del correo electrónico recibido e identificar la línea donde figura thread-index y extraer el contenido de la misma.

Thread-Index: AQHUvivISat2MUf7JkqOmOj6+xayoA==


Se observa que el contenido del tag se encuentra codificado Base64, a fines de decodificarlo realizar una búsqueda en google por los siguientes términos: base64 to hex online

El primer hipervínculo que aparece es:
https://cryptii.com/pipes/base64-to-hex

Se ingresa a dicha página web y se introduce el texto codificado obteniendo una respuesta en formato hexadecimal:

01 01 d4 be 2b c8 49 ab 76 31 47 fb 26 4a 8e 98 e8 fa fb 16 b2 a0

Aquí vemos que los dos primeros bytes comienzan con 01, con lo cual se debe descartar el primero y sólo obtendremos una fecha hora codificado en filetime.

2) Para decodificar el filetime debemos previamente pasar el valor de hexadecimal a numérico, para ello tomamos los primeros seis bytes y completamos ocho bytes agregando ceros de la siguiente manera:

01 d4 be 2b c8 49 00 00 

Luego convertimos este valor hexadecimal a decimal, el siguiente sitio web es una alternativa:
https://www.mobilefish.com/services/big_number/big_number.php

El valor decimal obtenido es: 131939384353685504

3) Ahora se debe buscar un convertidor online de filetime a fecha en formato legible colocando input format en filetime y no en unixtime que viene por defecto:
https://www.silisoftware.com/tools/date.php

Aquí se obtiene la siguiente fecha y hora: Wednesday, February 6, 2019 2:53:55pm
y es posible compararla con la fecha de recepción del correo. La misma puede diferir en algunos minutos debido a cuestiones de redondeo o de diferencias en el seteo horario de los ordenadores y puede diferir en la cantidad de horas asociadas a la franja horaria. En este caso GMT - 3.

4) La fecha en la cual fue recibido el correo fue 6 de febrero de 2019, 11:54. Se adiciona 3 horas a fines de obtener el formato de hora en GMT y se obtiene 6 de febrero de 2019, 14:54, lo cual dista muy poco de la fecha decodificada en el punto anterior.

Este procedimiento corresponde a una manera manual de revisar este tag. Con fines de análisis forense masivo de correos electrónicos debería disponerse de un programa de computadora que realice todos estos pasos de manera automática.


Tratándose este de un Tag generado por outlook mail el lenguaje de programación de Microsoft C# podría ser el indicado para realizar esta tarea. A continuación acompaño el código fuente que tomé en su momento para realizar la decodificación y que luego modifiqué para poder utilizarlo en mi aplicativo. Este código no contempla el caso en que la fecha en hexadecimal comience con 01 01 ... pero tiene la ventaja de traer todas las fechas en las que el correo fue respondido y/o reenviado.

Aquí el código fuente:


using System;
using System.Collections; 
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Email
{
    class OutlookThreadIndex
    {
        public DateTime Date { get; private set; }
        public Guid Id { get; private set; }
        public string Raw { get; private set; }
        string retorno = Environment.NewLine;
        string retornoSinFormato = "";

        public bool IsValid
        {
            get { return Date != default(DateTime) && Id != default(Guid); }
        }

        public OutlookThreadIndex(string threadIndexValue, int shiftBytes)
        {
            Raw = threadIndexValue;

            var bytes = Convert.FromBase64String(threadIndexValue);



            // thread index length should be 22 plus extra 5 bytes per reply
            if (bytes.Length < 22 || (bytes.Length - 22) % 5 != 0)
                return;

            Id = new Guid(bytes.Skip(6).Take(16).ToArray());

            long headerTicks; 
            if (shiftBytes > 0)
            {

                headerTicks = bytes.Skip(1)
                    .Take(5)
                    .Select(b => (long)b)
                    .Aggregate((l1, l2) => (l1 << 8) + l2)
                    << 24;

            }
            else
            {

                headerTicks = bytes
                    .Take(6)
                    .Select(b => (long)b)
                    .Aggregate((l1, l2) => (l1 << 8) + l2)
                    << 16;
            }

            Date = new DateTime(headerTicks, DateTimeKind.Utc).AddYears(1600);
            retorno += Date.ToLocalTime() + Environment.NewLine;
            retornoSinFormato += Date.ToLocalTime() + " - ";

            var childBlockCount = (bytes.Length - 22) / 5;

            for (var i = 0; i < childBlockCount; i++)
            {
                var childTicks = bytes
                    .Skip(22 + i * 5).Take(4)
                    .Select(b => (long)b)
                    .Aggregate((l1, l2) => (l1 << 8) + l2)
                    << 18;

                childTicks &= ~((long)1 << 50);
                Date = Date.AddTicks(childTicks);
                retorno += Date.ToLocalTime() + Environment.NewLine;
                retornoSinFormato += Date.ToLocalTime() + " - ";
            }
            retorno += Environment.NewLine + Environment.NewLine;
        }

        public override string ToString()
        {
            //return string.Format("Id: {0}, Date: {1}", Id, Date.ToLocalTime());
            return string.Format("Date: {0}, Id: {1}", retorno, Id);
        }

        public string RetornoSinFormato()
        {
            return retornoSinFormato;
        }
    }
}

Código fuente original es posible obtenerlo de:

http://forum.rebex.net/3841/how-to-interprete-thread-index-header


Para el caso de que el valor hex comience con 01 01 ... el código fuente a utilizar es el siguiente:

        private void btnThreadIndexToHex_Click(object sender, EventArgs e)
        {
            long longDateTimeDirecto = 0, longDateTimeDesplazado = 0;
            string hex = "";
            try
            {
                byte[] bytes = Convert.FromBase64String(tbThreadIndex.Text);

                hex = BitConverter.ToString(bytes);

                tbThreadIndexEnFormatoHex.Text = hex.ToString();

                string hexDateTimeDirecto = hex.Replace("-", "").Substring(0, 12) + "0000";
                string hexDateTimeDesplazado = hex.Replace("-", "").Substring(2, 12) + "0000";

                longDateTimeDirecto = Convert.ToInt64(hexDateTimeDirecto, 16);
                longDateTimeDesplazado = Convert.ToInt64(hexDateTimeDesplazado, 16);

                try
                {
                    var DateTimeDirecto = DateTime.FromFileTime(longDateTimeDirecto);
                    tbDateTimeDirecto.Text = DateTimeDirecto.ToString("dd/MM/yyyy HH:mm:ss");
                }
                catch (Exception e1) { tbDateTimeDirecto.Text = "Debe desplazar el valor HEX"; }

                try
                {
                    var DateTimeDesplazado = DateTime.FromFileTime(longDateTimeDesplazado);
                    tbDateTimeDesplazado.Text = DateTimeDesplazado.ToString("dd/MM/yyyy HH:mm:ss");
                }
                catch (Exception e1) { tbDateTimeDesplazado.Text = "No desplazar el valor HEX"; }
            }
            catch (Exception e1) { }

        }


// Código fuente de creación propia.


Si luego de probar ambas formas, el valor de fecha devuelto corresponde a un año similar a 1.830 no se trata de un error, simplemente que dicho valor de thread-index ha sido codificado de otra manera la cual debe investigarse de manera particular para cada caso.




publicado por andresaliaga a las 11:01 · Sin comentarios  ·  Recomendar
Más sobre este tema ·  Participar
Comentarios (0) ·  Enviar comentario
Enviar comentario

Nombre:

E-Mail (no será publicado):

Sitio Web (opcional):

Recordar mis datos.
Escriba el código que visualiza en la imagen Escriba el código [Regenerar]:
Formato de texto permitido: <b>Negrita</b>, <i>Cursiva</i>, <u>Subrayado</u>, <li>· Lista</li>
img img
FULLServices Network | Blog gratis | Privacidad