IV Jornada STIC CCN-CERT
La semana pasada, concretamente el martes 14 de diciembre, tuvo lugar la IV Jornada STIC CCN-CERT. Con TB·Security tuvimos la oportunidad de participar activamente en la jornada, entre otra cosas, con una charla sobre análisis de aplicaciones para dispositivos Blackberry, tratando especialmente el análisis de aplicaciones spyware. Durante la charla se explicaron los conceptos básicos relacionados con el entorno Blackberry y la ejecución de aplicaciones, aspectos concretos de spyware para dichos entornos, y se expusó como afrontar el análisis (estático y dinámico) de aplicaciones. Finalmente se mostraron los resultados del análisis de demos de aplicaciones spyware para Blackberry. Por cierto, cualquier feedback sobre la ponencia es bienvenido!
Para aquellos que no pudieron asistir aprovechamos para publicar las diapositivas que se utilizaron durante la ponencia.
Para aquellos que si pudieron asistir, recordar que falló la última parte de la demostración (que vergüenza, que vergüenza! :)), en la que se intentó mostrar uno de los resultados del análisis de la aplicación Kisses, utilizada para el descubrimiento de programas y procesos ocultos en Blackberry. Concretamente falló la plantilla que llevabamos preparada del 010 Editor para ilustrar el parsing del fichero de firmas, una vez descifrado. Para no dejar las cosas a medias, aprovechamos para incluir una captura de pantalla de la plantilla, ahora si, ejecutada correctamente:
La plantilla de 010 editor es la siguiente:
//-------------------------------------- //--- 010 Editor v3.1.3 Binary Template // // File: KissessSignaturesTemplate.bt // Author: juan vazquez // Revision: 0.1 // Purpose: Kissess signatures db decrypted file parser //-------------------------------------- typedef struct { SetBackColor(cRed); char magic[6]; SetBackColor(cRed-0x40); short num_signatures; SetBackColor(cRed-0x60); short version; SetBackColor(cRed-0x80); quad date; } HEADER; typedef struct { SetBackColor(cGreen); ubyte size_signature; SetBackColor(cBlue-0x20); ubyte size_id_signature; SetBackColor(cLtBlue); byte id_signature[size_id_signature]; SetBackColor(cPurple); ubyte size_signature_content; SetBackColor(cLtPurple); byte signature_content[size_signature_content]; } SIGNATURE; BigEndian(); // Header HEADER header; // Signatures local short i = 0; while (i < header.num_signatures) { SIGNATURE sign; i++; } // Hash SetBackColor(cGray); byte file_hash[20];
Como ya comentamos, la plantilla se tiene que aplicar sobre el fichero de firmas de Kisses una vez descifrado. EL fichero de firmas se puede descifrar con el siguiente ruby (el algoritmo, clave e IV se obtienen a partir del análisis que se comentó durante la ponencia):
require 'openssl' module AESCrypt # Decrypts a block of data (encrypted_data) given an encryption key # and an initialization vector (iv). Keys, iv's, and the data # returned are all binary strings. Cipher_type should be # "AES-256-CBC", "AES-256-ECB", or any of the cipher types # supported by OpenSSL. Pass nil for the iv if the encryption type # doesn't use iv's (like ECB). #:return: => String #:arg: encrypted_data => String #:arg: key => String #:arg: iv => String #:arg: cipher_type => String def AESCrypt.decrypt(encrypted_data, key, iv, cipher_type) aes = OpenSSL::Cipher::Cipher.new(cipher_type) aes.decrypt aes.key = key aes.iv = iv if iv != nil aes.update(encrypted_data) + aes.final end # Encrypts a block of data given an encryption key and an # initialization vector (iv). Keys, iv's, and the data returned # are all binary strings. Cipher_type should be "AES-256-CBC", # "AES-256-ECB", or any of the cipher types supported by OpenSSL. # Pass nil for the iv if the encryption type doesn't use iv's (like # ECB). #:return: => String #:arg: data => String #:arg: key => String #:arg: iv => String #:arg: cipher_type => String def AESCrypt.encrypt(data, key, iv, cipher_type) aes = OpenSSL::Cipher::Cipher.new(cipher_type) aes.encrypt aes.key = key aes.iv = iv if iv != nil aes.update(data) + aes.final end end class SignaturesDecryptor include AESCrypt attr_accessor :filename attr_accessor :key attr_accessor :iv attr_accessor :cipher_type def initialize(filename = "") @filename = filename @key = [-117, 109, -121, 50, 44, 127, -61, -37, -27, 110, 36, -28, 66, -85, -9, -102] @iv = [109, -76, -62, 45, -121, 12, 16, -8, -26, -89, 92, 112, -37, 9, 36, 7] @cipher_type = "AES-128-CBC" end def decrypt_signatures if @filename.empty? return "" end decrypted = "" File.open(filename, "rb") do |signatures| decrypted = AESCrypt.decrypt(signatures.read, @key.pack("c16"), @iv.pack("c16"), @cipher_type) end decrypted end end sd = SignaturesDecryptor.new("signatures.db") File.open("signatures_decrypted.db", "wb") do |result| result.write(sd.decrypt_signatures) end
El módulo AESCrypt me lo agencié de un blog (creo) que ahora no soy capaz de recordar, así que no puedo hacer referencia, sorry 😦
Ya para acabar, comentar que bajo mi punto de vista la organización del evento fué fantástica, hubieron charlas muy interesantes y, almenos yo, disfruté de un gran día en una muy grata compañía! 🙂
Saludos!
Deja una respuesta