Apache-ActiveMQ是apache旗下的消息中间件,至今为止还是有较多的甲方爸爸们,还在使用该中间件。据了解,Apache-ActiveMQ中间件有2个厉害的CVE,一个是CVE-2016-3088,还有一个是CVE-2015-5254。本次文章内容,主要结合HW中遇到的CVE-2016-3088漏洞与ssh 公钥结合,拿下服务器的权限。

Apache-ActiveMQ漏洞介绍&环境

漏洞介绍

该漏洞为Apache消息中间件漏洞,URL访问地址为:http://x.x.x.x:8161------>默认开启的端口为8161,当你使用nmap进行全端口扫描受害机器时,发现8161端口时需要提高警惕性。

默认后台管理控制端,URL地址http://x.x.x.x:8161/admin

默认密码:admin/admin

漏洞环境

在centos7.5上安装docker并pull vulhub镜像,使用vulhub下的ActiveMQ环境。

漏洞原理

ActiveMQ的web控制台分为三个应用:admin、api和fileserver;前两个需要登陆权限;最后一个无需登录权限,及CVE2016-3008又称为任意文件写入,可以理解是未授权访问的一种。Fileserver是一个api接口,通过GET/PUT/DELETE等HTTP的OPTIONS方法对文件进行任意读、传、取等操作。

影响版本

Apache-ActiveMQ5.0.0-5.13.x;5.14.0版本后,彻底删除了fileserver应用

漏洞详情&利用方法

fileserver应用中,ActiveMQ中的file server服务允许用户通过HTTP PUT方法上传文件到指定目录,fileserver支持写入文件(但并不提供解析),支持http方法中的move方法【移动并覆盖】文件,可将jsp文件put到filserver中,在通过mv移动到可执行的目录下。

CVE-2016-3088为任意文件写入:故名思意,即使用PUT上传到受害机服务器的目录下,渗透测试的目的是为了获取更高的权限,在这里我们可以利用任意文件写入的这个漏洞,结合linux系统本身以及其他可利用的漏洞,打一套组合拳,将该漏洞的危害面积,提升到最大,从而提升攻击者的权限。

写入文件的组合拳【利用方式】,总结有如下三种:

1.写入webshell------>【该方法简单粗暴,有被管理员发现/被安全设备拦截的危险】

2.写入定时任务cron/上传攻击者ssh公钥【常用手法】等文件------->【该方法最大程度依赖了这个漏洞的PUT缺陷,简单并安全的将攻击者权限提升到最大】

3.写入jar/jetty.xml等库和配置文件

接下来,文章的复现阶段主要围绕利用方式的前2种进行实际操作以及遇到问题的实际解决办法

漏洞复现

利用方式1:上传webshell

  总体思路:通过HTTP PUT方法上传小马.txt文本------>http 访问204(成功)------> move 小马.txt到api【/admin】/1.jsp即可访问该小马;具体操作如下

1.使用默认口令登录【admin/admin】,查看ActiveMQ的默认路径

 http://x.x.x.x:8161/admin/test/systemProperties.jsp

2.上传小马,以txt文本格式上传,然后服务器返回204,表示上传成功,但该fileserver目录下,是没有解析执行的权限。

3.然后将小马1.txt移动到webapps/admin目录下,成功的话,返回204 No Content

MOVE /fileserver/1.txt HTTP/1.1 ------>移动fileserver目录下的1.txt文本

Destination: file:///opt/activemq/webapps/admin/1.jsp --------->移动到目的地址为file:///路径下的1.jsp文件中【即为将1.txt内容复制为1.jsp,并更换后缀名为可被服务器解析的脚本文件】

或者写入到api/1.jsp也可【这里可写入的地方较多】

此时,浏览器访问该小马,成功;

利用方式2:定时任务cron tab,自动化弹shell

1.上传cron配置文件【换行注意使用\n】

写入cron配置文件,地址为攻击机地址,端口随意,只要不占用其他正在使用的端口即可

2.移动到/etc/cron.d/root

**注意该方法写定时任务,反弹shell,ActiveMQ必须是以root方式运行的,不然失效。

利用方式3:上传SSH公钥,实现免密登录受害机

SSH免密登录,在电厂以及实际生产环境下的数据库之间交互数据时,经常使用;SSH默认也支持公钥免密登录的这种方式。

首先:说明一点不同的系统ssh支持的免密登录的参数可能不一致。本次实验分别在ubuntu16.04、centos7以及凝思系统上进行实际操作

ssh免密登录主要涉及到几点内容

ssh-keygen -t rsa ------>用来生成rsa的公私钥------>id_rsa.pub

/etc/ssh/sshd_config 或者 /ssh_config

用户目录/.ssh/authorized_keys ----->用来存放攻击者的公钥

1.kali上ssh-keygen -t rsa ----->生成id_rsa.pub

2.ssh localhost

在实际模拟环境操作中遇到ubuntu16.04、centos7以及凝思系统的当前用户目录下,本地sshd_conf文件内容为空或者无 /.ssh/known_hosts时,可以使用ssh localhost 这样即可出现文件;

其次,.ssh目录下还要存在authorized_keys,这个可以在move时创建并存放公钥

3.受害机的sshd_config要实现免密登录

RSAAuthentication yes
PubkeyAuthentication yes

StrictModes no ----->这个存在于centos的高版本中,默认这个是yes即为开启状态;在这种情况下必须关闭该参数

RSA和Pubkey这两个选项,我做了一系列的测试,发现RSAAuthentication yes/no 都不影响最后的免密登录,只有PubkeyAuthentication这个参数必须设置为YES,不然免密操作会失败

4.使用PUT方法将攻击者的id_rsa.pub上传至受害者fileserver;

再使用move移动到用户名/.ssh/authorized_keys ------>ps:这里主要是因为docker下部署的环境容器下,未安装ssh服务导致的。

于是在本地开启centos7/unbuntu16.04,按照第2、3两步进行配置,成功免密登录

漏洞修复&加固

1.主要就是升级到15.x版本后吧

总结:

1.在很多大型甲方公司,经常会使用SSH的免密登录,其次SSH配置文件中默认也开启了这个方式;这也是linux存在的安全风险点

2.渗透技术的难点:在于漏洞与漏洞之间的连环利用;这次利用PUT文件上传+MOVE操作成功SSH免密登录。

3.SSH免密主要核心点就是能上传公钥+PubkeyAuthentication 开启;至于其他博主上说 /.ssh要700 /.ssh/authorized_keys要600这个权限说法,个人感觉没啥用,用默认文件/文件夹的权限就可以了吧

参考文章链接:https://paper.seebug.org/346/

ActiveMQ【CVE-2016-3088】上传公钥实现sssh免密登录的更多相关文章

  1. GIT生成SSH-KEY公钥放到服务器免密登录

    在使用git时老是碰到在push的时候提示没有权限的问题,那么现在咱们就来创建ssh-key来免密登录.我们来看看如何配置服务器端的 SSH 访问. 本例中,我们将使用 authorized_keys ...

  2. linux 生成密钥和公钥,实现免密登录

    1. 在相应的用户根目录下生成密钥公钥,输入如下命令: ssh-keygen -t rsa 2. 直接三次回车:会生成两个文件:id_rsa / id_rsa.pub,分别为密钥和公钥 3.  打开公 ...

  3. OpenFire后台插件上传获取webshell及免密码登录linux服务器

    1.目标获取 (1)fofa.so网站使用搜索body="Openfire, 版本: " && country=JP,可以获取日本存在的Openfire服务器.如图 ...

  4. EXPECT交互式批量上传公钥

    EXPECT交互式批量上传公钥 # vim key.sh #/bin/bash Public_Key() { [ ! -f /usr/bin/expect ] && yum insta ...

  5. linux上ssh免密登录原理及实现

    因为我的服务器集群需要回收日志到中央进行统一处理,所以需要建立ssh互信关系实现免密登录.关于ssh的使用大家可能都很熟悉了,我们今天主要来讲下ssh连接和免密登录的原理. scp 传输文件 scp( ...

  6. linux做免密登录,成功分发公钥后登录主机依旧需要输入密码的问题解决

    问题描述 在主机A上用ssh-keygen生成密钥对后,用ssh-copy-id命令将公钥成功copy到主机B上后,测试从A免密登录B,但是依旧需要输入主机B的密码后才能登录. 出现此错误的原因 如果 ...

  7. 版本管理·玩转git(远程仓库配置和配置公钥免密登录)

    git系列的最后一部分内容,我们先来看看如何查看远程仓库. 输入 git remote -v 我们还可以删除远程库,输入 git remote remove origin 删除后再次查询,信息为空. ...

  8. ssh免密登录(公钥私钥)指令

    1.在.ssh目录中执行ssh-keygen -t rsa命令生成两个秘钥,公钥(id_rsa.pub)和私钥(id_rsa) 2.ssh-copy-id -i id_rsa.pub 对方用户名@对方 ...

  9. ActiveMq PUT任意文件上传漏洞(CVE-2016-3088)漏洞复现

    漏洞原理 该漏洞出现在fileserver应用中,ActiveMQ中的fileserver服务允许用户通过HTTP PUT方法上传文件到指定目录.Fileserver支持写入文件(不解析jsp),但是 ...

随机推荐

  1. Codeforces Round #651 (Div. 2)

    感觉自己无可救药了. A题:找到小于等于n的两个不同的数的gcd最大是多少,显然是floort(n/2).设这两数是a * gcd, b * gcd然后gcd(a,b) = 1,那么gcd要尽量大,不 ...

  2. 【asp.net core 系列】14 .net core 中的IOC

    0.前言 通过前面几篇,我们了解到了如何实现项目的基本架构:数据源.路由设置.加密以及身份验证.那么在实现的时候,我们还会遇到这样的一个问题:当我们业务类和数据源越来越多的时候,我们无法通过普通的构造 ...

  3. 【部分】ASP.NET MVC的Controller接收输入详解

    原文:https://blog.csdn.net/lxrj2008/article/details/79455360 ASP.NET mvc的Controller要正确的响应用户发出的请求就要获取到用 ...

  4. MySQL 字符串索引优化方案

    字符串建立索引的优化 1. 建立前缀索引 假设建立一个支持邮箱登录的用户表,对于邮件字段来说,可以有以下几种建立索引的方式: 直接对整个字符串建立索引 alter table SUser add in ...

  5. 2020年Web前端开发工程师市场怎么样?学会什么技术才能拿到高薪

    几乎整个互联网行业都缺前端工程师,不仅在刚起步的创业公司,对上市公司乃至巨头这个问题也一样存在.据统计,国外的前端开发人员和后端开发人员比例约1:1,但是在国内比例却在1:3以下, Web前端开发职位 ...

  6. 执行dotnet *.dll启动项目,如何修改环境变量----ASPNETCORE_ENVIRONMENT

    docker环境: 启动容器时,添加参数:-e " ASPNETCORE_ENVIRONMENT=Development" windows系统: 命令行,以管理员身份运行:setx ...

  7. python字符串与文本操作(一)

    1.一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定的 #string 对象的split()方法只适应于非常简单的字符串分割情形,它并不允许有 多个分隔符或者是分隔符周围不确定的空 ...

  8. 学习 Java 网站推荐给你

    推荐几个非常不错的 Java 学习网站 LearnJava 在线 这是一个非常不错的学习 Java 的在线网站,纯免费.这是一个个人项目,旨在通过简单有效的在浏览器中进行练习让你快速掌握 Java 编 ...

  9. 「区间DP」「洛谷PP3146 」[USACO16OPEN]248 G

    [USACO16OPEN]248 G 题目: 题目描述 Bessie likes downloading games to play on her cell phone, even though sh ...

  10. unity vscode 断点问题

    困扰了很久的vscode老莫名其妙的断到网络通信那里. 后来发现是因为起来了一个线程并且调用的unity API 导致. unity 线程中是禁止调用unity API 的. 删掉用 DateTime ...