Un blog de Seguridad Informática, desde un punto de vista tecnológico

Entradas etiquetadas como “ccn-cert

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!