漏洞背景

2019 年2 月 20日 @NadavGrossman 发表了一篇关于他如何发现一个在WinRAR 中存在19 年的逻辑问题以至成功实现代码执行的文章。WinRAR 代码执行相关的CVE 编号如下:

CVE-2018-20250,CVE-2018-20251, CVE-2018-20252, CVE-2018-20253

该漏洞是由于WinRAR 所使用的一个陈旧的动态链接库UNACEV2.dll所造成的,该动态链接库在2006 年被编译,没有任何的基础保护机制(ASLR,DEP 等)。该动态链接库的作用是处理ACE 格式文件。而在解压处理过程中存在一处目录穿越漏洞,允许解压过程写入文件至开机启动项,导致代码执行。

准备工作

下载安装winace,一路默认安装即可

新建一个demo文件夹,创建名为test的文本文档,内容如下

使用winace打开

点击右上角file->create

阴影部分下拉框选择storefull path,点击add即可,此时在demo文件夹下生成了test.ace

熟悉ACE格式

接下来使用16进制编辑器打开(winhex,010Editor也行),此处使用010Editor进行

待会儿需要在这儿修改一些数据,接下来先gitclone https://github.com/droe/acefile

我们需要使用acefile.py来进行校验等操作,这是python3写的,它的功能是

1、可以提取ACE档案。

2、包含有关ACE文件格式的简要说明。

3、有一个非常有用的功能,打印文件格式标题和解释

win上没有3的环境,所以我使用kali来进行。首先下载test.ace

然后查看文件头信息

回显如下

关键参数详细说明:

·hdr_crc:

两个CRC字段存在于2个标头中。如果CRC与数据不匹配,则中断提取。

·文件名:

文件名包含文件的相对路径。在提取过程中(包括文件)创建相对路径中指定的所有目录。文件名的大小由十六进制转储中的2个字节(小端)定义。

·advert:

如果使用未注册版本的WinACE创建存档,则在创建ACE存档期间,WinACE会自动添加广告字段。

·文件内容:

“origsize” -内容的大小。

“hdr_size” –头部大小。

上图可以看到crc为0xc5e9,size为63,这个63是十进制,转换为16进制为

而在010Editor中看到的是相反的(小端序),如c5e9,在下图则是e9c5,003f在下图则是3f00

另外还有个参数就是文件名长度,使用acefile没检测,我们可以手动查看

阴影部分即文件名,长度在最下面的选区中可以看到是20h,即对应阴影选中前的2000

构造恶意文件

很明显,crc受限于文件内容,size受限于文件内容,文件名长度受限于文件文件名,所以需要从文件内容、文件名开始修改(使用010Editor的好处就是可以直接在左侧进行修改)。下图橙色的就是我们修改的内容

把helloworld改成byeworld,文件名改成了evil.txt,之后按照上面的分析,我们需要修改文件名长度这个参数

长度为1bh,所以将2000改为1b00即可

然后修改size

大小为3ah,将阴影前的3f00(原size)修改为3a00(现在的size)

接下来修改CRC,crc怎么修改呢?crc是循环冗余校验,根据文件自有的算法得出,那么我们怎么才能得到修改后的文件的CRC呢?别忘了我们之前的acefile.py,这个脚本为了获取ace文件信息,肯定会先对ace文件进行校验,查看它的代码找到校验逻辑不就好了?

代码很长,通读不显示,不如把刚才修改后的文件先校验一下,看看会出什么提示,然后根据关键字去定位代码段,重新在kali下载修改后的ace

然后检测

果然提示文件头CRC校验出错,根据关键字定位到代码片段

根据逻辑,3060行的判断成立时则会抛出crc校验出错的提示,为此,我们可以打印出if判断的对象,即ace_crc16(buf)

在3061行插入一句代码即可

再次运行

36050便是我们的crc了,同样转成16进制

将相应位置数据修改为D28C即可

保存后再次校验

没有出错,并且显示了头信息。到这一步,我们的恶意文件就制作完成了。

执行攻击

受害者如果按照平时的情况解压

则会在我们设置好的路径下解压出恶意文件

修复

1.尽快升级到最新版本的WinRAR

下载地址如下

32位:http://win-rar.com/fileadmin/winrar-versions/wrar57b1.exe

64位:http://win-rar.com/fileadmin/winrar-versions/winrar-x64-57b1.exe

2.删除UNACEV2.dll

找到所使用的压缩文件,右键打开文件所在位置

在打开的文件夹下删除该文件即可

参考

声明:本文为原创文章转载请注明出处!

Java防御目录穿越漏洞方法_WinRAR目录穿越漏洞复现及防御相关推荐

  1. Linux拷贝排除一个或多个目录的实现方法

    Linux拷贝排除一个或多个目录的实现方法 文章目录: 一.用cp命令实现 二.用rsync命令 你有没有想要拷贝某个目录下的很多文件或者目录,但是又偏偏有几个文件你不想要拷贝,有人说可以全部拷贝过去 ...

  2. Eclipse 使用 Maven 构建动态 Web 工程,默认无 java 目录的解决方法

    Eclipse 使用 Maven 构建动态 Web 工程,默认无 java 目录的解决方法 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署 ...

  3. Nginx漏洞修复之目录穿越(目录遍历)漏洞复现及修复

    Nginx漏洞修复之目录穿越[目录遍历]漏洞复现及修复 漏洞描述 漏洞复现 环境搭建 漏洞验证 漏洞修复 参考链接 漏洞描述 前言 Nginx是一个高性能的HTTP和反向代理服务器,经常被做为反向代理 ...

  4. WEB安全基础入门—目录遍历(路径遍历\路径穿越攻击)

    欢迎关注订阅专栏! WEB安全系列包括如下三个专栏: <WEB安全基础-服务器端漏洞> <WEB安全基础-客户端漏洞> <WEB安全高级-综合利用> 知识点全面细致 ...

  5. java递归url目录_Java递归实现某个目录下所有文件和目录

    import java.io.File; import java.util.ArrayList; public class Test1// 实现打印某个目录下的所有文件和目录,要目录在上,文件在下,每 ...

  6. java gui 项目解密,java GUI(实例小项目--列出磁盘目录)

    //java实例小项目:列出磁盘目录. import java.awt.*; import java.awt.event.*; import java.io.File; class MyWindDem ...

  7. Java的知识点27——打印子孙级目录和文件的名称、统计文件夹的大小、编码与解码的应用

    打印子孙级目录和文件的名称 package cn.dym12;import java.io.File;/*** 递归:方法自己调用自己* 打印子孙级目录和文件的名称* @author Administ ...

  8. Java编程的逻辑 (59) - 文件和目录操作

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  9. java拷贝文件目录结构_Java如何复制目录_Java基础教程系列

    Java如何复制目录,Java基础教程系列,如果要将目录及其包含的所有子文件夹和文件从一个位置复制到另一个位置,请使用下面的代码,该代码使用递归遍历目录结构,然后使用Files.copy()函数复制文 ...

  10. 【JAVA资料免费下载】158个JAVA免豆精品资料汇总——下载目录

    2019独角兽企业重金招聘Python工程师标准>>> 应广大网友要求,最近小弟整理了一批免积分下载的Java优质资料,因资料众多,一一将资料上传上来需要时间,先将下载目录分享给大家 ...

最新文章

  1. robo3t 连接服务器数据库_车牌识别软件连接各种数据库方法大全
  2. “我的开源项目被威胁了!”
  3. S标签实际大全(struts2)
  4. xampp mysql.sock_解决xampp自启动和mysql.sock问题
  5. 实现一个包含Microsoft.Advertising和SmartMad广告控件的UserControl
  6. 2017/5 JavaScript基础9 --- 闭包、作用域
  7. 递归和分治的概念性的理解
  8. 伪标记是一种简单的半监督学习方法
  9. 建筑电气工程设计常用图形和文字符号_电气设计绘图线宽是什么标准,需要遵循哪些基本原则?你知道吗?...
  10. MacOS上禁用自动启动Adobe Creative Cloud
  11. 软件智能:aaas系统中AI众生的“世”和“界” 之11 认知水平的假想supposition
  12. 如何换主题不被搜索降权
  13. 取十位数,百位数,千位数的各位方法小姐
  14. Adaptation---多屏幕多分辨率的支持和一些概念
  15. winform中使用ReportViewer的时候,找不到报表数据面板.
  16. 读书笔记-追风筝的人
  17. 似然,似然,似是而然!
  18. ad9361收发异常问题分析
  19. 数据库设计之学生选课系统
  20. 移动设备屏幕尺寸换算

热门文章

  1. JavaScript-Date类的getMonth方法释疑
  2. 改变系统TCP默认 MSS
  3. Telnet Sequence Diagram
  4. 计算机辅导资料,计算机二级辅导资料
  5. js双击事件条件触发_js页面触发chargeRequest事件和Nginx获取日志信息
  6. MATLAB把型线图画静水力曲线,静水力曲线计算与绘制指导书
  7. c#调用python脚本效率_C# 调用python程序脚本(IronPython)
  8. mysql主从同步 忽略库_主从复制中忽略库的参数
  9. JSON.parse与eval
  10. visual studio运行时库MT、MTd、MD、MDd