【实战】WebDav漏洞简单分析及通用exploit设计

Web中间件常见安全漏洞总结_web中间件常见漏洞总结 4.打开IIS,管理工具 ->Internet 信息服务(IIS)管理器5.选择编辑ISAPI或者CGI限制添加安装的php-cgi.exe路径,描述随意6.返回第五步的第一个图片位置,点击处理程序映射,添加如下。7.phpinfo测试IIS7.x版本 在Fast-CGI运行模式下,在任意文件,例:test.jpg后面加上/.php,会将test.jpg 解析为php文件。配置cgi.fix_pathinfo(php.ini中)为0并重启php-cgi程序。 阅读详情

WebDav漏洞简单分析及通用exploit设计


创建时间:2003-05-09
文章属性:原创
文章提交: eyas (ey4s_at_21cn.com)

WebDav漏洞简单分析及通用exploit设计
ey4s<cooleyas@21cn.com>
2003-04-25


    拜读了isno写的<<WebDav远程溢出漏洞分析>>、<<通用的攻击WebDAV漏洞的方法>>,以及Nankia写的
<<Webdav漏洞ISNO方法的补充>>之后,用他们发布的exploit、以及能在网上找到的exploit在我的一些测试
机上测试,有些成功,有些不成功。于是便想自己调试一下。在后来的调试过程中,参考了大量资料,特别
是yuange所写的<<widechar的字符串缓冲溢出攻击技术>>。在这过程中我学到了很多东西,自己也有些心
得体会,其中可能有不少错误的地方,于是便想写下来,一来请各位高手多多指点,二来可以当做笔记供日
后参考(我记性不好:-))。
    
    建议各位在阅读了以上提及的文章后再继续往下看。以下测试是在windows 2000 简体中文版本进行的。


   -=-=-=- 第一部分 漏洞简单分析 -=-=-=-


    webdav溢出具体是怎么发生的我就不罗嗦了,请大家参考isno所写的文章,这里只简述一下。我们向
IIS发送如下数据:
    
    SEARCH /O HTTP/1.0
    Host:xxx
    Content-Type: text/xml
    Content-length: 3
    xxx

    IIS把我们请求的文件名转换成UNICODE,在前面加上路径,然后作为文件名参数传给了
GetFileAttributesExW(先加上路径再转换成UNICODE,还是转换成UNICODE再加路径,我没有仔细看,但这
并不重要)。假如IIS根目录是c:/inetpub/wwwroot,那么传递给GetFileAttributesExW的文件名就是
"//?/c:/inetpub/wwwroot/O"的UNICODE形式,如下:
0197efe0  5c 00 5c 00 3f 00 5c 00-63 00 3a 00 5c 00 69 00  /./.?./.c.:./.i.
0197eff0  6e 00 65 00 74 00 70 00-75 00 62 00 5c 00 77 00  n.e.t.p.u.b./.w.
0197f000  77 00 77 00 72 00 6f 00-6f 00 74 00 5c 00 4f 00  w.w.r.o.o.t./.O.
    
    漏洞引用关系如下:

    GetFileAttributesExW
    |__RtlDosPathNameToNtPathName_U
        |__RtlInitUnicodeString <-buff超过65535就会导致短整型数溢出
        |__在这后面的代码进行字符copy的时候就会触发堆栈溢出
    
    我们来看看UNICODE_STRING结构的定义:
    typedef struct _UNICODE_STRING
    {
      USHORT Length; <--这长度指的是buffer的字节数,并不是unicode字符的个数
      USHORT MaximumLength;
      PWSTR Buffer;
    } UNICODE_STRING *PUNICODE_STRING;

    从上面的分析我们可以看到,事实上只要我们保证($FileName+$IIS_Path)*2 > 65535就可以触发
存储buff长度的短整型数溢出,其中$FileName是我们提交的文件名(非UNICODE形式)。

  

    -=-=-=- 第二部分 关于widechar的字符串 -=-=-=-

    IIS在接收到我们发送的buff之后,会调用MultiByteToWideChar函数把我们的buff转换成widechar,
即UNICODE,用的CodePage是系统默认的CodePage,在简体中文系统上是936。在转换过程中,不符合
相应code page widechar范围的双字节字符会被替换掉,单字节字符会被转换成"/xXX/x00"的形式。

    怎么判断字符是单字节字符还是双字节字符?  简体中文、繁体中文、韩文、日文都是双字节语言,
即double-byte character set (DBCS)。上述四种语言双字节中的第一个字节都大于等于0x80。所以
某个字符如果大于等于0x80的话,那么后面就还有一个字节的字符一起跟这个字符组成一个完整"字符"。

    不信的话,可以写程序验证一下,调用一个API就可以了。
    The IsDBCSLeadByteEx function determines whether a specified byte is a lead byte
that is, the first byte of a character in a double-byte character set (DBCS).
    BOOL IsDBCSLeadByteEx(
      UINT CodePage,   // identifier of code page
      BYTE TestChar    // byte to test
    );

    假如我们发送的字符是"/x61/x81/x81"的话,用简体中文的CodePage经过MultiByteToWideChar函数
转换后就成了"/x61/x00/xXX/xXX",当然,前提是"/x81/x81"转换成Unicode后符合简体中文的wide
char范围。所以我们要确定shellcode在经过MultiByteToWideChar转换后,符合相应code page的wide
char范围。

    反复拜读了yuange的文章<<widechar的字符串缓冲溢出攻击技术>>后,由衷佩服yuange技术之高!
向他致敬!
    yuange在他的文章中提出:
    (1)把real shellcode编码成可见字符,即小于0x80。这样在经过MultiByteToWideChar转换后就成为
"/xXX/x00",字符不会被改变。
    (2)再精心编写一段符合相应code page widechar范围的代码,用这些代码来解码上述经过编码的
real shellcode。


    yuange在那篇文章里面还提供了一段解码shellcode的代码,这些代码符合简体中文WideChar范围。
后来台湾网友Nankia说这些代码在繁体中文上面无法使用,然后Nankia自己又写了个符合繁体中文
widechar范围的解码代码。

    后来我花了不少时间,在yuange发布的代码的基础上,修改了一些地方,写了一段符合简体中文、繁体
中文、韩文、日文 widechar范围的解码代码。以下是我测试这些解码代码是否符合相应widechar范围的
c代码。不知yuange和Nankia是怎么调试解码代码的??

-=-=-=-=-=-=-=-=-=-=-=-=-=-= CheckCode.c -=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-==-=-=-=-=
#include <windows.h>
#include <stdio.h>

#define CODE_CN        936// ANSI/OEM - Simplified Chinese (PRC, Singapore)
#define CODE_TW        950// ANSI/OEM - Traditional Chinese (Taiwan; Hong Kong SAR, PRC)
#define CODE_JP        932// ANSI/OEM - Japanese, Shift-JIS
#define CODE_Korean    949// ANSI/OEM - Korean (Unified Hangeul Code)
int        g_iCodePageList[]={936,950,932,949};
//如果为合法的wide char范围,则此byte值为1,否则为0
char    *g_szWideCharShort;

void checkcode(unsigned char *shellcode,int iLen);
void printsc(unsigned char *sc, int len);
BOOL MakeWideCharList();
void SaveToFile();
void  shellcodefnlock();

#define  FNENDLONG   0x08

void main()
{
    char *fnendstr="/x90/x90/x90/x90/x90/x90/x90/x90/x90";
    unsigned    char    temp;
    unsigned    char    *shellcodefnadd;
    unsigned    char    shellcode[512];
    int            len,k;
    
    /* 定位 shellcodefnlock的汇编代码 */
    shellcodefnadd=shellcodefnlock;
    temp=*shellcodefnadd;
    if(temp==0xe9)
    {
          ++shellcodefnadd;
          k=*(int *)shellcodefnadd;
          shellcodefnadd+=k;
          shellcodefnadd+=4;
    }
    for(k=0;k<=0x500;++k)
         if(memcmp(shellcodefnadd+k,fnendstr,FNENDLONG)==0)
             break;
    /* shellcodefnadd+k+8是得到的shellcodefnlock汇编代码地址 */
    len = 2*wcslen(shellcodefnadd+k+8);
    memcpy(shellcode,shellcodefnadd+k+8,len);

    if(!MakeWideCharList()) return;
    //SaveToFile();
    /*检测shellcode是否在合法的wide char范围*/
    checkcode(shellcode, len);
    //printsc(shellcode, len);
}

BOOL MakeWideCharList()
{
    unsigned char wbuff[4];
    unsigned char wbuff2[4];
    unsigned char buff[4];
    int         i,j,ret,k;

    g_szWideCharShort = (char *)malloc(65536);
    memset(g_szWideCharShort, 1 , 65536);

    for(k=0;k<sizeof(g_iCodePageList)/sizeof(int);k++)//for 1
    {
        printf("UseCodePage=%d/n",g_iCodePageList[k]);
        for(i=0;i<256;i++)//for 2
        {
            for(j=0;j<256;j++)//for 3
            {
                if((i==0) && (j==0)) j=1;
                memset(buff, 0, 4);
                memset(wbuff2, 0, 4);
                wbuff[0]=(BYTE)i;
                wbuff[1]=(BYTE)j;
                wbuff[2]=(BYTE)'/0';
                wbuff[3]=(BYTE)'/0';
                if(!(ret = WideCharToMultiByte(g_iCodePageList[k], 0,
(unsigned short *)wbuff, 1, buff, 2, 0,0)))        
                {
                    printf("WideCharToMultiByte error:%d/n",
GetLastError());
                    return FALSE;
                }
                if(!(ret = MultiByteToWideChar(g_iCodePageList[k], 0,
buff,strlen(buff), (unsigned short *)wbuff2, 1)))
                {
                    printf("MultiByteToWideChar error:%d %d/n",
GetLastError(), ret);
                    return FALSE;
                }
                //判断经过两次转换后是否改变,只要在任何一种code
page改变都视为非法wide char范围
                if(*(DWORD *)wbuff != *(DWORD *)wbuff2)
                    g_szWideCharShort[(BYTE)wbuff[0]*0x100 +
(BYTE)wbuff[1]] = (BYTE)'/0';
            }
            //getchar();
        }//end of for 2
    }//end of for 1
    return TRUE;
}

void SaveToFile()
{
    unsigned char    *g_pStr;
    FILE    *f;
    int &
WebDav漏洞简单分析及通用exploit设计 WebDav漏洞简单分析及通用exploit设计    拜读了isno写的>、>,以及Nankia写的>之后,用他们发布的exploit、以及能在网上找到的exploit在我的一些测试机上测试,有些成功,有些不成功。于是便想自己调试一下。在后来的调试过程中,参考了大量资料,特别是yuange所写的>。在这过程中我学到了很多东西,自己也有些心得体会,其中可能有不少错误的地方,于是便想写下来,一来请各 阅读详情

相关推荐

从零基础到精通:50个高危RCE漏洞实战指南与防御策略

远程代码执行(RCE)是网络安全领域的核心威胁之一,它允许攻击者在目标系统上执行任意命令,从而获取系统控制权。其原理通常源于软件在处理用户输入时存在缺陷,如缓冲区溢出、命令注入或不安全的反序列化,导致攻击者能够注入并执行恶意代码。掌握RCE漏洞的利用与防御,对于构建有效的安全防护体系具有极高的技术价值。无论是红队进行渗透测试、漏洞验证,还是蓝队进行威胁狩猎、应急响应,深入理解RCE都是提升实战能力的关键。在实际应用场景中,从广泛使用的Web服务器、开发框架到分布式编译工具,都可能成为RCE的攻击面。本文聚焦

weixin_34242509的博客 416

〖教程〗LadonExp使用IIS写权限Webdav漏洞复现

LadonExp生成器使用教程之IIS写权限漏洞利用,含环境配置、EXP生成、批量利用、Pyhton复现代码。 漏洞成因 该漏洞的产生原因来源于服务器配置不当造成,此漏洞主要是因为服务器开启了webdav的组件导致的可以扫描到当前的操作,具体操作其实是通过webdav的OPTION来查询是否支持PUT。 IIS配置 1 启用webdav组件 2 目录给写权限(为了方便直接eveyone完全写入权限) 3 脚本资源访问权限(不然MOVE失败即无法GetShell) 漏洞复现 使用LadonEXP可轻松复现

K8哥哥 759

从MS16-016漏洞解析内核提权原理与纵深防御实践

缓冲区溢出是软件安全领域的经典漏洞类型,其原理在于程序对用户输入数据缺乏严格的边界检查,导致数据写入超出预分配的内存区域,从而可能覆盖相邻的关键数据或指令指针。在操作系统内核中,此类漏洞的危害性被放大,攻击者可通过精心构造的输入触发溢出,进而劫持控制流并执行恶意代码,最终实现从普通用户权限到系统最高权限的非法提升,这对系统安全构成严重威胁。从技术价值看,深入理解内核级漏洞的利用链,是构建有效防御体系、实施精准威胁检测的基础。在应用场景上,此类漏洞常被用于渗透测试中的权限提升环节,也是红蓝对抗与系统安全加固的

ciya3282的博客 473

文件解析漏洞深度剖析:从原理到实战的攻防指南

文件解析是计算机系统处理各类数据格式(如文档、图片、视频)的基础技术,其核心原理是将二进制数据转换为应用程序可识别的结构化信息。然而,当解析逻辑存在缺陷时,攻击者可通过构造恶意文件触发非预期行为,导致严重的安全风险,例如远程代码执行(RCE)和信息泄露。在工程实践中,常见的漏洞场景包括服务器端解析逻辑缺陷、第三方解析库漏洞(如ImageMagick、XML解析器)以及容器配置不当。这些漏洞常被用于文件上传绕过、XXE攻击和反序列化攻击,对Web应用安全构成直接威胁。本文聚焦于文件解析漏洞的挖掘与防御,通过分

culiao6493的博客 460

Web中间件常见安全漏洞总结

IIS IIS是Internet Information Services的缩写,意为互联网信息服务,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。IIS目前只适用于Windows系统,不适用于其他操作系统。 解析漏洞 IIS 6.X 基于文件名 该版本 默认会将 *.asp;.jpg 此种格式的文件名,当成Asp解析,原理是 服务器默认不解析; 号及其后面的内容,相当于截断。 基于文件夹名 该版本 默认会将 *.asp/目录下的所有文件当成Asp解析。 另外,IIS6.

qq_40907977的博客 7169

openEuler在虚拟机的网络配置

ethernet0.virtualDev 可以配置成其他类型的虚拟网络适配器。常见的选项包括:vlance - 用于模拟 AMD PCnet32 LANCE 网络适配器,支持10Mbps。e1000 - 用于模拟 Intel E1000 千兆网络适配器,支持1Gbps。e1000e - 用于模拟更现代的 Intel E1000e 千兆网络适配器。vmxnet - 用于 VMware 的自定义网络适配器,性能更好但需要安装 VMware Tools。

FHY1221的博客 2933

STM32学习笔记【江科协】【4-2】OLED显示屏

可以注意到接电源的GND和VCC同时和PB6、PB7号口连接,我们可以直接不初始化这两个引脚解决,因为STM32的引脚上电后,如果不初始化,默认是浮空输入的模式,在这个模式下,引脚不会输出电平,所以不会有什么影响,或者直接给PB6口输出低电平,PB7口输出高电平,用GPIO口直接给OLED供电,这个也是没问题的,因为OLED的功率很小这个也是可以驱动的,不过用GPIO口供电不是很规范,实际项目还是用电源供电。然后点击这里放大镜里面带d的图标,进入调试模式,这个界面里,

m0_74651303的博客 1595

OriginPro实战:5步搞定碳材料拉曼光谱D峰G峰分析(附完整数据处理流程)

本文详细介绍了使用OriginPro进行碳材料拉曼光谱D峰G峰分析的完整流程,涵盖数据预处理、多图层可视化、高精度分峰拟合等关键步骤。特别针对材料科学研究中的基线漂移、多峰重叠等问题提供专业解决方案,帮助研究者快速完成从原始数据到科研级图表的全流程分析,提升碳材料表征效率与准确性。

vodka的博客 951

五子棋AI算法第一篇-我对谷歌Alphago的看法

最近Google宣布他们的围棋AI以5:0的战绩打败欧洲围棋三冠王。我一直对人工智能比较感兴趣,正好趁年前空闲的几天用JS写了一个五子棋的AI。其实很久以前就用自创的算法写过一个JAVA版的五子棋AI,不过棋力很不理想。这次用的是JS写的,所以无论任何平台上只要能打开网页的都可以玩。google爆出这个新闻之后,很多人觉得这是不是意味着电脑智商已经在人类之上了,围棋已经没有意义了之类的。甚至觉得这是

言川的博客 2万+

ASTRA Toolbox学习笔记-Python

ASTRA Toolbox 是一个用于处理 X 射线相干散射和 X 射线传输成像的开源算法工具箱。本文档概述了该工具箱的基本概念。

hou9021的博客 8262

【OpenCV】第二十四章: 图像特征匹配:暴力特征匹配算法、FLANN特征匹配算法

参数match就是匹配器的匹配结果;参数crossCheck表示交叉检查,意思就是用第一组中的每个描述子和第二组的所有描述子进行匹配完后,再用第二组中的每个描述子和第一组的所有描述子进行匹配,这两步做完后,两步同时找到的相同的匹配对儿就是有效的匹配。方法一:用匹配器的match方法,进行特征匹配:match = bf.match(des1, des2),就是对两幅图的描述子进行计算,返回匹配的结果。匹配的时候是计算两个描述子之间的相似度,然后返回相似度最高的一对儿匹配点,也就是最终的匹配结果。

因为热爱所以坚持 5062

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 【例子】windows 2000 wmi service buffer overflow expolit
下一篇: 【分析】MS RPC LOCATOR Service Exploit for win2k(new version)
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值