Evenement:SecFriday 0x00

Introduction
Pourquoi pas une soirée sur le thème de la sécurité informatique ;-)

Programme

 * 19h30 : Userspace backdoor/rootkit avec LD_PRELOAD (par haxelion)
 * 20h00 : crypto challenge write-up: un challenge du CTF de Hack.lu2012 qui implique de la crypto pour péter un jeu en ligne. (par Doegox)
 * 20h30 : Reverse engineering dynamique avec OllyDbg (par haxelion)

Userspace backdoor avec LD_PRELOAD
Présenté par haxelion.

Découvrez les joies du linking dynamique sous linux avec LD_PRELOAD. Ensuite j'expliquerai comment utiliser ce mécanisme pour réaliser une backdoor et un rootkit en userspace.

Crypto Challenge
Présenté par Doegox.

Voici donc le challenge que je vous propose d'essayer par vous-même d'ici lundi. Il y a évidemment déjà des write-ups de ce challenge sur le Net, dont le mien, mais jouez le jeu et attendez la présentation avant de les chercher ;-) Et si vous n'y tenez plus et jetez tout de même un oeil aux solutions, essayez de les coder vous-même car il y a une différence entre comprendre et mettre en oeuvre! Vous pouvez en discuter ou poser vos questions sur la ML discussions par contre je ne suis pas sur le chan IRC.

Jouez contre la Zlot Machine sur devel.yobi.be:2053 nc devel.yobi.be 2053 Ce challenge comporte deux étapes (mais on peut faire la seconde sans passer par la première...)


 * 1) Décodez le contenu d'une sauvegarde
 * 2) Débrouillez-vous pour obtenir 8 points de bonus

Bonne chance!

Hints:
 * The probability to win a bet is very, very, very low.
 * You might think that the strategy for solving this challenge is placing a risky bet and restoring a saved game when the bet is lost. The chance to win like this is ZERO (0, Nada, Non, Niente, Nix, Nullo, None).
 * This is a crypto challenge.
 * Check the leaked part of the source code below

def loadState(self, statestr): try: dec = decrypt(statestr.decode("base64")) if '\x00' in dec: self.sendLine('Error loading game: invalid characters') return try: state = json.loads(dec) except Exception, e:	   self.sendLine('Error loading game: ' + str(e)) return self.credits = state['credits'] self.bonus = state['bonus'] if self.bonus > 8: #XXX A few lines got lost in here during our recovery self.sendLine('Restored state.') self.sendLine(self.msgs['BALANCE'] % (self.credits, self.bonus)) except Exception, e:	self.sendLine('Error loading game: ' + str(e))


 * 1) crypto stuff

def addPadding(data, block_size): data_len = len(data)+1 # required for the last byte pad_len = (block_size - data_len ) % block_size pad_string = '\xff' * (pad_len) # arbitrary bytes to fill up block, -1 for last byte. generated below last_byte = struct.pack(' block_size or pad_len < 1: raise ValueError("Encryption Error, Invalid Padding :/") else: return data[:(len(data)-pad_len)]

def encrypt(data, key=SECRET_KEY, iv=IV): iv = urandom(16) # change IV for each encryption. cipher_obj = AES.new(key, AES.MODE_CBC, iv) data = addPadding(data, 16) return iv+cipher_obj.encrypt(data)

def decrypt(data, key=SECRET_KEY): iv, data = data[:16], data[16:] # d'uh   cipher_obj = AES.new(key, AES.MODE_CBC, iv) padded = cipher_obj.decrypt(data) return delPadding(padded, 16)

Reverse engineering dynamique avec OllyDbg
Présenté par haxelion.

Une présentation sur OllyDbg et le reverse engineering dynamique sous windows avec comme exemple un challenge du CTF de hack.lu 2013. J'introduirai OllyDbg et ses fonctionnalités. Ensuite j'expliquerai les bases de l'analyse dynamique et comment les utiliser pour résoudre ce challenge de différentes manières. Enfin je parlerai un peu des techniques courrantes d'anti-debugging.

Vous pouvez trouver le challenge ici: https://ctf.fluxfingers.net/static/downloads/roboauth/RoboAuth.exe

Le but est de trouver les mot de passes.