$50,000 0-day RCE on Apple bug bounty program

¡Hola! En este episodio de Bug Bounty Reports
Explicado, aprenderá cómo dos piratas informáticos: Harsh Jaiswal y Rahul Maini consiguieron un caparazón en no uno sino
tres servidores de Apple diferentes por los que fueron recompensados ​​​​con $ 50,000. Como siempre, el informe y sus
perfiles de Twitter están vinculados en la descripción. Si alguna vez se preguntó dónde encuentro
todos esos artículos para mis videos, generalmente es en el boletín semanal Bug Bytes de Intigriti,
que contiene los mejores artículos, tutoriales, herramientas y videos de seguridad de
TI. E Intigriti es una plataforma de recompensas por errores que se preocupa por la comunidad y también
decidieron patrocinar este video.

Cuentan con más de 30.000 investigadores y 200 programas activos.
Regístrese en https://go.intigriti.com/bbre y comience a piratear ahora… bueno, no
literalmente ahora, ¡primero mire el video! Los piratas informáticos querían encontrar un error crítico y bien pagado
en el programa de recompensas por errores de Apple. Decidieron centrarse en un servidor llamado Lucee que se
encontraba en tres dominios de Apple diferentes.

Es un lenguaje de secuencias de comandos basado en Java
que utiliza plantillas que se ven así. Se llama Coldfusion y me recuerda
un poco a un código PHP. La lógica está contenida dentro del archivo de plantilla que se
procesa cuando el usuario solicita este archivo. Es importante destacar que Lucee también expone un
panel de administración que es un objetivo muy atractivo. Los cazadores decidieron ejecutar el servidor localmente
e intentar encontrar un día cero allí para luego atacar el servidor de Apple con él. Es una gran
ventaja probar una aplicación de código abierto. Para obtener el máximo impacto, la
vulnerabilidad debe explotarse sin autenticación. Pero en los archivos .cfm utilizados para el panel de administración,
se verificó la propiedad request.adminType para ver si el usuario inició sesión como administrador.
Por supuesto, esos intentos fracasaron al principio. Pero, lo que es más importante, esta verificación no siempre se encontraba
al comienzo del archivo. Eso significaba que todo el código anterior todavía se ejecutó.

Esta es
una característica crucial. Significa que si encontramos un archivo que tiene una vulnerabilidad antes de esta comprobación,
puede explotarse sin autenticación. Y encontrar un RCE fue sorprendentemente fácil.
Había un archivo imgProcess.cfm que contenía este código. Tomó el contenido del parámetro imgSrc,
el nombre de archivo del parámetro de archivo y lo guardó dentro del directorio admin-ext-thumbnails. Los
archivos .cfm son muy potentes y, entre otras cosas , puede crear un shell web que le
permitirá ejecutar comandos en el servidor. Pero para hacer esto , debe cargar el archivo .cfm dentro de
webroot. Webroot es un directorio en el que se puede acceder a los archivos desde la web. Cuando
desee obtener un RCE cargando un webshell, debe estar dentro de la raíz web. Por supuesto, de forma predeterminada, esta
secuencia de comandos imgProcess guardaba archivos en un directorio diferente, fuera de la raíz web, pero afortunadamente
, era vulnerable al cruce de ruta y podía volver a la raíz web.

Un problema fue que
se agregó __ al principio del nombre del archivo. Es un problema porque en Linux, la ruta debe
existir incluso si vuelves a atravesarla más tarde. Por lo tanto, esta ruta no se encontrará porque
el directorio __ no existe. Afortunadamente, imgProcess.cfm tiene el atributo
createPath=true. Entonces, primero puede enviar tales solicitudes para que se cree el directorio __, para que
luego pueda ejecutar el recorrido del directorio más tarde. Esta es la solicitud que le proporcionó un RCE
en la instancia local. Pero no funcionó en el servidor de Apple. Se debe al
cortafuegos de aplicaciones web de Apple, que es muy estricto y no permite que los caracteres ../ estén presentes en
la URL. Previno con éxito este ataque. Los cazadores necesitaban encontrar un desvío para eso.
Encontraron el archivo admin.index.search.cfm que parecía copiar archivos de una ubicación a otra.
Esto podría estar encadenado con el imgProcess.

En el primer paso, cargaría un
shell usando imgProcess a un directorio seguro sin atravesar la ruta. Luego, en el segundo
paso, copiaría este archivo dentro de webroot. El uso de rutas absolutas permitiría evitar los
caracteres ../ . Pero resultó que no era una copia normal. Ni siquiera copió el contenido del archivo.
Pero si tuviera un archivo cuyo nombre coincidiera con esta expresión y contenido que coincidiera con esta
expresión regular y lo cargaría en un directorio señalado por este parámetro, el nombre de este archivo
se guardaría dentro del archivo searchindex.cfm dentro del directorio datadir. El nombre del archivo se
guardaría dentro de JSON anidado en el archivo cfm. Esto le permite colocar las etiquetas CFML dentro
del nombre del archivo. El código dentro de esas etiquetas se ejecutará cuando
se solicite el archivo searchindex.cfm . Para ello, debe colocarse dentro del webroot. Pero, de nuevo, tú controlas
el directorio en el que se guardará. Conectando todos estos juntos, puede lograr
un RCE.

Ahora vamos a repasarlo paso a paso. Primero, crea un archivo con la carga útil dentro de
su nombre. El contenido de este archivo no importa mucho, pero debe coincidir con esta expresión regular. Luego,
usando el punto final de imgProcess, este archivo se guardará dentro del directorio admin-ext-thumbnails,
fuera de webroot. Para acortar el nombre del archivo, no coloque todo el webshell allí. Este código
le permite cargar cualquier archivo que pueda usarse para cargar el webshell más adelante.

Luego, en el segundo paso,
activa la función de copia que busca a través del directorio admin-ext-thumbnails y guarda el nombre
de su archivo dentro del archivo searchindex.cfm que se guarda dentro de la raíz web. Luego, solicita el
punto de conexión del índice de búsqueda que le permite cargar cualquier archivo. Puede cargar este webshell allí. En el paso
4, tuvo éxito: logró un RCE… al menos en el único host con la versión más nueva
de Lucee.

Pero resultó que 2/3 de los servidores ejecutan la versión anterior de Lucee que no
tiene el archivo imgProcess. Pero se usó un método similar para lograr un RCE en esos dos hosts.
La diferencia fue que, en lugar de usar imgProcess para cargar el archivo, nuestros cazadores
usaron el archivo ext.applications.upload.cfm. Aunque llegar a este punto final hizo que
la aplicación generara una excepción sobre la falta de permisos, el archivo
aún se cargó. Fue porque el código responsable de la carga estaba antes de
la verificación de permisos.

Era muy importante que los cazadores no creyeran en este error, sino que
comprobaran manualmente si el archivo se había subido o no. Para cargar una secuencia de comandos con este punto final,
puede usar la misma carga útil que antes, pero debe estar comprimida y el nombre del archivo debe
cambiarse a .lex. Su archivo con carga útil en su nombre debe estar dentro del archivo zip. Luego,
para la función de copia, proporcione este nombre con el protocolo zip:// y luego el servidor
lo descomprimirá por usted. Este método proporcionó el webshell en los dos hosts restantes. Los cazadores
fueron recompensados ​​con $ 50,000 sólidos por esos RCE gratuitos. Apple informó el problema a los mantenedores de Lucee
y la solución que implementaron es que los usuarios no autenticados ahora solo pueden solicitar
puntos finales gratuitos. Hace que este ataque sea imposible, a menos que sea un administrador, pero
puede ejecutar el código de todos modos. Y eso es. Creo que esta vulnerabilidad realmente muestra qué tan profundo
puedes llegar cuando estás probando una aplicación de código abierto y también lo gratificante que puede ser.
Gracias a todos por leer el boletín.

Observé una tasa de apertura de alrededor del 50 %, donde el 30 % generalmente se
considera un muy buen resultado. También estoy recibiendo muchos mensajes y estoy muy feliz de que te
guste. Si aún no está suscrito, asegúrese de hacerlo usando el enlace en la descripción.
Pero por ahora, ¡gracias por mirar y adiós!.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *