Pilgrimage é uma máquina Linux de dificuldade fácil. Nela é preciso abusar de um Information Disclosure no ImageMagick para obter as credenciais para acessar por SSH. Com isso é possível abusar de uma vulnerabilidade do Binwalk para obter uma reverse shell como root.
Para essa máquina é necessário inserir o domínio pilgrimage.htb no arquivo de hosts local.
Com um scan do nmap encontra-se duas portas abertas nessa máquina, 22 do ssh e 80 de uma aplicação web. O próprio nmap já identificou que existe um diretório de git no site.
Nessa aplicação podemos enviar imagens para terem seu tamanho reduzido, quando se faz o upload de uma imagem ele gera uma URL para acessar e baixar a nova imagem. Também é possível se registrar ou fazer login, assim a URL das suas imagens ficam salvas.
Utilizando a ferramenta git-dumper podemos obter todo o conteúdo que está no repositório git do site. Com isso conseguimos os códigos da aplicação e o binário do magick na versão 7.1.0-49, que é uma ferramenta de manipulação de imagens.
Podemos ver no código-fonte do index.php que é executado o magick com o parâmetro convert e a imagem que fizemos o upload. Após a imagem ser redimensionada a URL que é gerada é salva em um banco de dados sqlite na pasta “/var/db/pilgrimage”.
if($upload) {
$mime = ".png";
$imagePath = $upload->getFullPath();
if(mime_content_type($imagePath) === "image/jpeg") {
$mime = ".jpeg";
}
$newname = uniqid();
exec("/var/www/pilgrimage.htb/magick convert /var/www/pilgrimage.htb/tmp/" . $upload->getName() . $mime . " -resize 50% /var/www/pilgrimage.htb/shrunk/" . $newname . $mime);
unlink($upload->getFullPath());
$upload_path = "http://pilgrimage.htb/shrunk/" . $newname . $mime;
if(isset($_SESSION['user'])) {
$db = new PDO('sqlite:/var/db/pilgrimage');
$stmt = $db->prepare("INSERT INTO `images` (url,original,username) VALUES (?,?,?)");
$stmt->execute(array($upload_path,$_FILES["toConvert"]["name"],$_SESSION['user']));
}
header("Location: /?message=" . $upload_path . "&status=success");
}
Essa versão do magick que está sendo utilizada é vulnerável ao CVE-2022-44268 e há exploits públicos. Aqui estarei utilizando a PoC do voidz0r que está disponível nesse link.
Essa PoC foi escrita em rust e ela gera uma imagem que ao ser redimensionada fará o magick ler algum outro arquivo e inserir o conteúdo na imagem resultante. Aqui eu vou ler o arquivo do banco de dados da aplicação, pois como ele também armazena os logins dos usuários pode conter alguma credencial útil.
Dessa forma eu criei a imagem utilizando a PoC, depois enviei no site e fiz o download do output. Então com o identify, que também é uma ferramenta do magick, podemos obter o conteúdo do arquivo em hexadecimal (não coube no print).
Com o CyberChef eu converti de hexadecimal para texto e também removi os caracteres nulos para facilitar a visualização. Assim, podemos ver as credenciais de um usuário, emily:abigchonkyboi123.
Essas credenciais nos dão acesso a máquina via SSH e obtemos a primeira flag.
Ao fazer uma enumeração local com o pspy, encontramos que está sendo executado um script chamado “malwarescan.sh” pelo root.
Esse script apenas utiliza o binwalk para validar se existe alguma string no arquivo que esteja na sua blacklist. Acontece que essa versão do binwalk que está sendo executada é vulnerável ao CVE-2022-4510.
Utilizando a PoC que está no exploit-db eu criei um payload para uma reverse shell e a transferi para o diretório em que o script analisa.
Logo ao baixar a imagem, já recebi a reverse shell como root.