• 利用溢出扩展SQL注入

    日期:2011-10-22 | 分类:脚本攻防

    在看《hack in the box》杂志时,看到一篇关于结合溢出方式扩展SQL注入攻击手法的文章,因此在博客标记下,作个记录。我以前提到过结合溢出来XSS的方法(http://bbs.pediy.com/showthread.php?t=124209),思路有点类似,只是一个用来XSS,一个SQL注入,实现上有所不同。

    当用普通语句注入时可能会遇到如下错误,此时就可以考虑使用溢出来实现sql注入(作者是在MySQL 5.0.92上测试的):

    下面是作者给出的注入语句,其中第三行的28开头漏掉%了:

    在文末,作者还给出一些绕过WAF的注入语句,方法都比较旧,但有时需要注入时可以回头看下,算作个记录:

  • 【翻译】绕过SEHOP安全机制

    日期:2010-01-20 | 分类:软件漏洞

    作者:Stéfan Le Berre (s.leberre@sysdream.com)
        Damien Cauquil (d.cauquil@sysdream.com)
    译者:riusksk (泉哥:http://riusksk.blogbus.com)
    时间:2010年1月7日

    目录
    0.  前言
    1.  SEHOP简介
    2.  溢出攻击中的SEHOP对抗策略
       2.1经典的溢出方法
       2.2 微妙之处
    3. Proof Of Concept
      3.1 目标程序与限制条件
      3.2 程序崩溃与利用
    4. 结论
    5. 鸣谢
    6. 参考资料

    0.  前言
    最近微软在一些windows版本中加入了一种新的安全机制——《Structured Exception Handling Overwrite Protection 》[1 & 2],这些系统有:

    • Microsoft Windows 2008 SP0
    • Microsoft Windows Vista SP1
    • Microsoft Windows 7

    目前我们尚未发现任何针对这一安全机制而采取的攻击,但已有少量文章已描述了它的特性及健壮性。的确,SEHOP似乎相当可靠,以致Microsoft发 布了一款补丁,以使所有程序在缺省状态下启用这一安全机制。这是否会成为堆栈溢出攻击的未日呢?还没有,详细情况将在后面叙述。

    1.  SEHOP简介
    SEHOP作为Structured Exception Handling的扩展,用于针对程序中使用的SHE结构进行一些安全检测。SEHOP的核心 特性是用于检测程序栈中的所有SHE结构链表,特别是最后一个SHE结构,它拥有一个特殊的异常处理函数指针,指向一个位于ntdll中的函数。下面就是 一个经典的SHE链表:
     名称:  1.jpg
查看次数: 122
文件大小:  12.1 KB
    每一SHE结构均拥有指向下一个SHE结构的指针,后面再连接一个指向ntdll!_except_handler4的异常处理函数指针。在通过覆盖 SHE结构的栈溢出中,next SHE指针被一些字节码覆盖,而SHE handler被一个指向pop pop ret指令串的地址覆盖掉,该指令串 位于一个non-SafeSEH模块中。
    这种使用SEHOP的验证算法首次被A. Sotirov在Black Hat 2008大会上批露[3]。下面我们来看一下:

    BOOL RtlIsValidHandler(handler)
    {
      if (handler is in an image) {
        if (image has the IMAGE_DLLCHARACTERISTICS_NO_SEH flag set)
          return FALSE;
        if (image has a SafeSEH table)
        if (handler found in the table)
          return TRUE;
        else
          return FALSE;
        if (image is a .NET assembly with the ILonly flag set)
          return FALSE;
        // fall through
      }
      if (handler is on a non-executable page) {
        if (ExecuteDispatchEnable bit set in the process flags)
          return TRUE;
        else
        // enforce DEP even if we have no hardware NX
        raise ACCESS_VIOLATION;
      }
      if (handler is not in an image) {
        if (ImageDispatchEnable bit set in the process flags)
          return TRUE;
        else
          return FALSE// don't allow handlers outside of images
      }
    // everything else is allowed
    return TRUE;
    }
    [...]
    // Skip the chain validation if the
    DisableExceptionChainValidation bit is set
    if (process_flags & 0x40 == 0) {
      // Skip the validation if there are no SEH records on the
      // linked list
      if (record != 0xFFFFFFFF) {
        // Walk the SEH linked list
        do {
          // The record must be on the stack
          if (record < stack_bottom || record > stack_top)
            goto corruption;
          // The end of the record must be on the stack
          if ((char*)record + sizeof(EXCEPTION_REGISTRATION) > stack_top)
            goto corruption;
          // The record must be 4 byte aligned
          if ((record & 3) != 0)
            goto corruption;
          handler = record->handler;
          // The handler must not be on the stack
          if (handler >= stack_bottom && handler < stack_top)
            goto corruption;
          record = record->next;
        } while (record != 0xFFFFFFFF);
        // End of chain reached
        // Is bit 9 set in the TEB->SameTebFlags field?
        // This bit is set in ntdll!RtlInitializeExceptionChain,
        // which registers FinalExceptionHandler as an SEH handler
        // when a new thread starts.
        if ((TEB->word_at_offset_0xFCA & 0x200) != 0) {
          // The final handler must be ntdll!FinalExceptionHandler
          if (handler != &FinalExceptionHandler)
            goto corruption;
        }
      }
    }

    下面我们来考虑一些限制:
    • SHE handler必须指向non-SafeSEH module
    • 内存页必须可执行
    • SHE链表不应被篡改,并且位于链表末端的SHE结构必须为特定值(next SHE指针值为0xFFFFFFFF,SHE handler也必须为一特定值)
    • 所有的SHE结构必须为4-byte对齐
    • 最后一个SHE结构的handler必须正确指向ntdll中的ntdll!FinalExceptionHandler例程
    • 所有SHE指针必须指向栈中

    2.  溢出攻击中的SEHOP对抗策略
    2.1 经典的溢出方法
    下面是覆盖SHE结构的经典溢出方法的结构图:
     名称:  2.jpg
查看次数: 122
文件大小:  10.1 KB
    SHE handler指向POP POP RET指令串,next SHE中的栈地址被jmp 06 nop nop(机器 码:EB 06 90 90)替换掉。当处理一个程序异常时,Windows将控制权传给SHE链表中的异常处理程序。当第一个异常处理函数被覆盖掉后, 程序的执行流程重定向到POP POP RET指令串中(代替真实的异常处理函数)。该指令串将执行到当前SHE结构中next SHE的前两个字节 (jmp 06),以此直接跳转到我们的shellcode。这样,SHE链表就被拆分了:
     名称:  3.jpg
查看次数: 122
文件大小:  15.5 KB
    SHE结构中的next SEH的前两字节(90 90)从不被执行,它主要是用于填充字符,以构造出一个DWORD大小的有效栈地址。当然,我们也可以 改变另外的两字节来使其指向一个有效栈地址,而将这两字节改为跳转指令(EB 06)。这一DWORD值当被调用时,它相当于一个有效的栈地址与一个有效 指令的结合以实现跳转。如果我们伪造SHE结构中的这一DWORD值指向的栈地址,那么我们就可伪造整个SHE链表,并控制下一个SHE结构以使此链表有 效。

    2.2 微妙之处
    还有一个问题:哪一被编码的跳转指令可以代替4字节对齐地址?只有一指令与其相配:JE(机器码为0x74),该指令是一条件跳转:只有当Z标志被设置时 才实现跳转。在Windows在处理异常时,Z标志是默认关闭的,我们必须通过执行一指令来计算出零值,以设置该标志位。Xor指令似乎是不错的选择,看 来我们的解决方法已经很明了了:跳至XOR,POP,POP,RET指令串,以便将JE指令解释为JMP。这就是SEHOP绕过技术的微妙之处。
    XOR,POP,POP,RET指令串并不难找到,我们可以通过查找返回NULL值的函数的末端来找到这些指令串:
    XOR EAX, EAX
    POP ESI
    POP EBP
    RET
    为了确保该方案可行,我们就以XOR,POP,POP,RET指令串来编写一份PoC测试一下。
    已知第一个SEH结构位于0x0022FD48,我们就可以在0x0022FD74处构造第二个SHE结构,它的next SHE指针值为 0xFFFFFFFF,handler指向ntdll!FinalExceptHandler。如果我们将第一个SHE结构中的handler指向 XOR,POP,POP,RET指令串,那么我们就可以将执行流程重定向到任何地方,真正地破坏掉SHE链表。具体地,我们可以重新伪造一个有效的SHE 链表,以使其重定向到特定的shellcode。
      另一个主要限制是Microsoft Windows 7和vista中的ASLR安全机制。我们知道程序的利用需要依赖于 ntdll!FinalExceptHandler的地址,但这一地址在每次电脑重启后都会发生改变。Ntdll ImageBase在重启时都被随机 化,这样就增加攻击的难度。我们针对ASLR(未经逆向分析)进行一些测试,结果表明ImageBase似乎在16位中只有9位发生随机化,也就是说,在 超过512次机会中你只有一次机会可以成功地绕过SEHOP实现溢出攻击。

    3. Proof Of Concept
      3.1 目标程序与限制条件
    我们编写一段小程序,以在Windows 7下演示这一技术。这一程序只是复制一个文件(OwnMe.txt)的内容到内存中,并在操作中实现栈溢出,以引发可被异常处理程序捕获的异常。
    我们需要完成以下任务:
    • 伪造一个有效的SEH链表
    • 将最后一个SEH结构中的handler指向ntdll!FinalExceptHandler
    • 在栈中放置shellcode(与Windows 7相兼容)
    • 定位内存中的XOR,POP,POP,RET指令串地址
    首先,XOR,POP,POP,RET指令串是已知的,因为我们已经将其放置在程序代码中了,我们可以发现该指令串位于内存地址0x004018E1中。
      3.2 程序崩溃与利用
    当程序崩溃时,可发现:
       0012F700 41414141 Pointer to next SEH record
       0012F704 41414141 SE handler
    接着我们需要利用存储在0x0012F774中的第二个SEH结构来伪造SEH链表,这一SEH结构中next SEH指针值为 0xFFFFFFFF,SHE handler指向ntdll!FinalExceptHandler。然后位于0x0012F700的SEH结构被篡 改,使其指向仿造的SHE结构,并将handler设置为0x004018E1,同时在每一SHE结构之前写入一跳转指令(JMP+8),以避免数据段被 执行。整个利用的工作流程如下图所示:
     名称:  4 .jpg
查看次数: 123
文件大小:  49.7 KB
    Shellcode将执行calc.exe:
     名称:  5.jpg
查看次数: 123
文件大小:  27.8 KB
    注意:目标程序及exploit均已打包成zip文件,可在Sysdream网站上[4]下载到。

    4. 结论
    SEHOP并不是对抗栈溢出的终极防护。自从SafeSEH扩展被公布之后,很多人认为它是不可突破的。这里我们只是演示了在一些情况下 Structured Exception Handling Overwrite Protection是可能绕过的。但SEHOP结合ASLR和 DEP使用,是一种优秀的本地安全机制,这点是不可否认的。

    5. 鸣谢
    http://sysdream.com/
    http://ghostsinthestack.org/
    http://virtualabs.fr/

    6. 参考资料
    [1] Preventing the Exploitation of Structured Exception Handler (SEH) Overwrites with SEHOP:
    http://blogs.technet.com/srd/archive/2009/02/02/preventing-the-exploitation-of-seh-overwriteswith-
    sehop.aspx
    [2] SEHOP per-process opt-in support in Windows 7:
    http://blogs.technet.com/srd/archive/2009/11/20/sehop-per-process-opt-in-support-in-windows-
    7.aspx
    [3] Bypassing Browser Memory Protections: http://taossa.com/archive/bh08sotirovdowd.pdf
    [4] ZIP containing our target program & exploit http://www.sysdream.com/SEHOP.zip

  • 个性shellcode编写

    日期:2009-04-30 | 分类:软件漏洞

    关于API函数地址的获取,可以借助API地址专家搜索,如下图所示:
    api专家
     
    或者写个OD脚本来获取API地址,代码如下,保存为*.osc,如下图所示:
    在OD中运行此脚本后结果如下图:
    你拍攝的 script1。
    上图中的地址为MessageBoxA函数的,点击确定后,出现的即是LoadLibraryA
    函数地址:
    script2
    因为此shellcode仅为个人使用,因此就不动态加载API,关于这方面的内容,可参考此文:
    Download&&Exec ShellCode 逆向分析 :http://riusksk.blogbus.com/logs/34363397.html
    这里就不再叙述了。
    #include<windows.h>
    int main()
    {
     _asm{   
      push ebp  
      mov ebp,esp
      xor eax,eax
      push eax
      mov byte ptr [esp],0x6c//"l"
      mov byte ptr [esp+1],0x6c//"l"
      push 0x642e3233;   // "32.d"
      push 0x72657375  //"user"
      mov eax,esp
      push eax
      //mov ebx,0x7C801D77 xp sp2
      mov ebx,0x7C801D7B  //xp sp3
      call ebx    //LoadLibraryA
      sub esp,80h
       mov dword ptr[ebp-1Eh],0xBECAE1CC // "提示"
       mov byte ptr[ebp-1Ah],0x00
       lea esi,[ebp-1Eh]  
       mov dword ptr[ebp-18h],0xE6B8A8B1 
       mov dword ptr[ebp-14h],0xE7B8AAC8
       mov dword ptr[ebp-10h],0xE7D2BAA3
       mov dword ptr[ebp-0Ch],0xC9B3F6B3
       mov dword ptr[ebp-08h],0xA1A3A6B9     //报告泉哥:溢出成功!
       mov byte ptr[ebp-04h],0x00
    //关于上面的提示文本的十六进制转换可借助WinHex工具:
       lea edi,[ebp-18h] 
       push 1  //窗口格式
       push esi //提示框标题
       push edi //文本内容
       push 0 //句柄
       //mov eax,0x77D5058A  //xp sp2
       mov eax,0x77D507EA  //xp sp3
       call eax  //MessageBoxA
       mov esp,ebp
       pop ebp
    }
     return 0;
    }
     
    用OD提取机器码:
    55 8B EC 53 56 57 55 8B EC 33 C0 50 C6 04 24 6C C6 44 24 01 6C 68 33 32 2E 64 68 75 73 65 72 8B
    C4 50 BB 78 1D 80 7C FF D3 81 EC 80 00 00 00 C7 45 E2 CC E1 CA BE C6 45 E6 00 8D 75 E2 C7 45 E8
    B1 A8 B8 E6 C7 45 EC C8 AA B8 E7 C7 45 F0 A3 BA D2 E7 C7 45 F4 B3 F6 B3 C9 C7 45 F8 B9 A6 A3 A1
    C6 45 FC 00 8D 7D E8 6A 01 56 57 6A 00 B8 EA 07 D5 77 FF D0 8B E5 5D
     
    测试效果:
     
     鸣谢:零魂