热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

winrar穿越目录漏洞分析

CheckPoint团队爆出了一个关于WinRAR存在19年的漏洞,用它来可以获得受害者计算机的控制

漏洞描述

Check Point团队爆出了一个关于WinRAR存在19年的漏洞,用它来可以获得受害者计算机的控制。攻击者只需利用此漏洞构造恶意的压缩文件,当受害者使用WinRAR解压该恶意文件时便会触发漏洞。

漏洞是由于 WinRAR 所使用的一个06遍编译出来的动态链接库UNACEV2.dll所造成的,动态链接库的作用是处理 ACE 格式文件。而WinRAR解压ACE文件时,由于没有对文件名进行充分过滤,导致其可实现目录穿越,将恶意文件写入任意目录,甚至可以写入文件至开机启动项,导致代码执行。

CVE 编号为CVE-2018-20250,受影响的版本包括

winrar <5.70 Beta
BandZip <= 6.2.0.0
好压 <= 5.9.8.10907
360压缩 <4.0.0.1170

漏洞分析

将UNACEV2.dll拖进IDA进行分析。根据 poc ,直接定位到漏洞代码 0x40CB48

可以看到该函数首先是对输入的 relative paht 进行了一遍预处理。 winrar 穿越目录漏洞分析

如上图所示,称这部分为 Clean_Path ,输入的处理包含以下部分:

  1. 当路径以 \\ 开头时,且路径中还包含两个 \ ,会将中间部分忽略掉。这部分本意可能为处理smb文档的代码,如 \\10.10.10.10\smb_folder_name\some_folder\some_file.txt 路径会被处理为 some_folder\some_file.txt
  2. 当路径以 *:\ 开头时,忽略 *:\ 。这部分本意可能为忽略盘符,如 C:\some_folder\some_file.txt 会被处理为 some_folder\some_file.txt
  3. 当路径包含 \..\ 时,忽略 \..\ 。这部分本意可能为忽略回溯路径,以防止目录穿越。
  4. 当路径开头为 *:* 且路径不为 *:\ 时,忽略 *: 。这部分本意不知道,感觉可能为某种文件路径格式。
  5. 主要为以上四种目录筛选,根据poc中描述,不知什么原因如果路径开头为 C:\C: 也会忽略。

继续往下看,一个名为 GetDevicePathLen 的函数,如果该函数返回非0值,则会将空字符赋值给变量,否则会将文件夹的路径赋值给变量,最终使用 sprintf 函数将文件目录最终形成。

winrar 穿越目录漏洞分析

相应的代码为:

if ((GetDevicePathLen(file_path))
    var1=∅_string
else
    var1=add_slash(&dest_dir_path)
sprintf(final_file_path,"%s%s",var1,file_path)

此处便是漏洞的形成点。漏洞的形成原理是如若能伪造文件路径使得 GetDevicePathLen 函数返回非0值,则该文件路径会被当成绝对路径而不是相对路径,从而解压的时候实现任意目录写。

如果 file_pathC:\some_folder\1.txt 且使得 GetDevicePathLen 返回非0,则会将txt解压到相应目录 C:\some_folder\1.txt

现在的问题就转移至如何构造文件路径使得 GetDevicePathLen 返回非0。跟进该函数查看代码:

_BYTE *__usercall __spoils GetDevicePathLen@(_BYTE *path@)
{
  _BYTE *path_ptr; // ecx
  _BYTE *slash_pos; // eax
  int v3; // ecx

  path_ptr = path;
  slash_pos = 0;
  if ( *path_ptr == '\\' )
  {
    if ( path_ptr[1] == '\\' )
    {
      slash_pos = strchr(path_ptr + 2, '\\');
      if ( slash_pos )
      {
        slash_pos = strchr(slash_pos + 1, '\\');
        if ( slash_pos )
          slash_pos = &slash_pos[-v3 + 1];  //注释A
      }
    }
    else
    {
      slash_pos = (_BYTE *)1;   //注释B
    }
  }
  else if ( path_ptr[1] == ':' )
  {
    slash_pos = (_BYTE *)2; //注释C
    if ( path_ptr[2] == '\\' )
      slash_pos = (_BYTE *)3; //注释D
  }
  return slash_pos;
}

代码总结为:

  • 注释A: 如果路径开头为 \\ 且路径中仍还包含多的两个 \ 则返回第四个斜杆与开头的差距。如 \\LOCALHOST\some\some_folder\some_file.txt 返回值为17。
  • 注释B:如果路径以 \ 开头,且不以 \\ 开头,则返回1。如 \some_folder\some_file.txt 返回值为1。
  • 注释C:如果路径以 *: 开头,且不以 *:\ 开头,则返回2。如 C:some_folder\some_file.txt 返回值为2。
  • 注释D:如果路径以 *:\ 开头,则返回3。如如 C:\some_folder\some_file.txt 返回值为3。

至此代码分析完毕,可以看到漏洞原理主要为可构造预期文件路径使得 GetDevicePathLen 返回非0,从而实现目录穿越。

漏洞利用

如何利用漏洞,首先要解决的是如何实现任意目录的解压。

具体来说可以使用 C:\some_folder\some_file.txt 文件路径使的 GetDevicePathLen 返回非0。但是,由于函数一开始存在一个 Clean_Path 函数,如目录为 C:\some_folder\some_file.txt ,则会被处理为 some_folder\some_file.txt

绕过该处理的方法为将目录更改为: C:C:\some_folder\some_file.txt ,根据 Clean_Path 处理部分的第四条,该路径会被处理成 C:\some_folder\some_file.txt ,从而实现了目录穿越。

同时也可实现对smb共享文件夹的攻击,如目录 C:\\\10.10.10.10\smb_folder_name\some_folder\some_file.txt => \\10.10.10.10\smb_folder_name\some_folder\some_file.txt ,根据根据 Clean_Path 处理部分的第二条,将会被处理成 \\10.10.10.10\smb_folder_name\some_folder\some_file.txt ,实现共享文件的目录穿越。

到这里目录穿越的原理已经解释清楚,下一个问题是如何利用。实际利用有一个局限性,就是需要知道相应解压目录的具体目录,不能使用回溯路径。利用的方法为主要有两个:

  • 一个是将文件解压至开机自启动目录。
  • 一个是实现dll劫持。

关于开机自启动目录,主要有两个:

  1. C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
  2. C:\Users\$user_name\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
    第一个需要管理员权限,路径是固定的,但是实施攻击的条件较高;第二个则不需要管理员权限,但是需要知道相应的用户名称,可能需要爆破。
    poc中也提到了唯一一个可以不使用用户名的方式,那就是使用 C:\C:C:../AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\some_file.exe 路径。该路径的主要方式根据 Clean_Path 处理部分的第五条,得到 C:../AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\some_file.exe ,这个目录是假设用户解压的路径一般为 C:\Users\$user_name\Desktop 或者 C:\Users\$user_name\Downloads ,此时的 C:../ 便会回溯至 C:\Users\$user_name\ 目录,所以可以顺利解压至 C:\Users\$user_name\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 目录。

另一个利用方法是 dll劫持 ,覆盖相应dll文件等,具体可搜索了解实现方式。

利用实现

python有一个ace文件解析的模块 acefile ,基于该模块源码,了解ace文件格式,即可实现相应的路径修改。

手动实现过程为:

  1. 首先使用 WinACE 创建一个acefile文件,选择store full path。

    winrar 穿越目录漏洞分析
  2. 使用acefile查看该文件头格式。

    winrar 穿越目录漏洞分析
  3. 修改文件路径,我这里使用的是Winhex。把路径修改成了 C:../AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\calc.exe
    winrar 穿越目录漏洞分析

  4. 修改hdr_size以及hdr_crc以及路径长度。只修改文件名使用acefile去解析是会报错的,整个头部的size也发生了变化,因为文件路径长度发生了变化,也需要修改,由之前的 71-->111 ;还需要修改路径长度,因为路径发生了变化,由之前的 0x28->0x50 ;在acefile.py检查hdr_crc的地方加打印出crc的代码,可以得到正确crc(crc修改过很多次,图片为最后一次修改的);

    winrar 穿越目录漏洞分析

最终修改前与修改后的对比如下,修改前winhex里显示为:

winrar 穿越目录漏洞分析

修改后的字节为:

winrar 穿越目录漏洞分析
  1. 解压实现攻击。

    winrar 穿越目录漏洞分析

将上述步骤最终实现了一个自动化的脚本,还有相关的脚本也放在了我的 github 。

参考链接

winace

acefile

Extracting a 19 Year Old Code Execution from WinRAR

以上所述就是小编给大家介绍的《winrar 穿越目录漏洞分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 我们 的支持!


推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
author-avatar
qinqin20082602898705
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有