<WatchPuppy>AutoCAD病毒可执行恶意代码漏洞分析及补丁(附代码、补丁)
本帖最后由 Onlystone 于 2018-4-4 13:07 编辑有没有大佬教我下怎么把内容折叠一下?有些东西想折叠起来,要不文章看着太长
软件定名为 WatchPuppy 之后插件我还会持续在这里更新,软件本身大家可随意转载。
各位安全大佬可能很少关注CAD这种边缘软件,故而此类分析较少,本文本想做论文发稿,实在没时间也没路,等过段时间再说了,先发在论坛里面请各位提些意见吧,前半段还是照搬以前写的废话了,后面是正文
本文意在彻底解决cad病毒对建筑行业的威胁,故而下面放出编译好的dll,所有人可以在不修改的前提下,加入自己的工具箱、软件集,防止各种改名卖软件的,恕不完全开源。也放出了安装程序,给伸手党们准备的,昨天在版务区询问附件的相关要求,还没得到答复,先放出来吧,若管理员有要求请与我联系,我再整改。
0x01 概述
近年来,出现一类使用AutoCAD运行漏洞的恶意程序在建筑、房地产等相关行业中蔓延,此类恶意软件多为lisp语言编写的Lsp脚本,或编译过的Vlx、Fas程序。早期该类病毒仅表现为“伴随型”病毒,跟随cad图纸文件(后缀为*.dwg,以下称dwg文件)启动,多为减缓用户开启文档速度或恶作剧。此后,发展出了中等破坏度的“蠕虫型”,跟随图纸启动后,大量向硬盘写入无用信息直至占满硬盘,严重妨碍用户工作。今日,已有木马病毒瞄向该漏洞,通过该漏洞直接感染计算机,通过修改注册表达到隐藏目的,用于窃取用户信息、图纸等目的。
故而,CAD病毒已经引发了各安全软件公司的重视。金山、360等公司相继推出针对CAD病毒的专杀工具,经测试微软MSE也可识别大部分CAD病毒的特征码,但此行收效甚微,未能抑制其发展。
0x02 分析
简述该漏洞较为简单,可在开启图纸时执行本地代码。AutoCAD打开dwg文件时,dwg文件所在目录将成为软件的“支持文件搜索路径”。软件会在该目录下搜索可用的SHX文件、线形文件等图纸所需的支持文件,但同时也会搜索lsp、fas和vlx的CAD脚本程序,并执行其中代码。
攻击者从此处入手,将恶意代码保存为CAD可执行脚本的文件名,放置在DWG文件路径下,开启图纸时即会使软件执行代码。由于AutoCAD软件本身的可执行程序acad.exe拥有系统管理员权限,恶意代码可控制系统安全路径及注册表等敏感目录,达到对系统的破坏或对用户信息的窃取。
―――――――――――――我是分割线―――――――――――――――――
0xA1 正文
好了,上面是拿之前写的论文扳过来的,废话一堆,下面说正题。
这个漏洞很简单,也很多人都知道,就是把Lsp脚本,或者编译后的lsp、arx改名成cad能识别的名字,跟图纸放在一起,cad开图的时候就会执行。就这么简单。
举个栗子,我们写一段病毒脚本,保存为acaddoc.lsp,跟图纸“一层平面图.dwg”放在一起,不管我们以何种方式开启这个dwg文件,均会执行acaddoc中的lsp语言脚本。
这是一个看似简单的例子,而实际之中有些变数,如果说早期的cad病毒还算耿直,现在就不一样了,首先说能被执行的文件不仅仅只有acaddoc.lsp一个,仅仅是这个用的比较多。
其次一点,攻击者往往会加点盐,在cmd中使用attrib命令(参数+a +s +h+r),为文件添加“系统”属性,如下图:
注意这个系统属性,文件若被加上系统属性,在windows中设置显示隐藏文件也是看不到的,需要同时勾选“隐藏受保护的操作系统文件”才能看到(这个可能地球人都知道,只是提一句,cad病毒可以为自己设置系统属性)从目前遇到的cad病毒判断,会破坏注册表中的
、
以及
等注册表项,以使得系统无法现实隐藏文件(即使勾选也无法显示隐藏文件)。所以导致用户无法察觉的情况下,运行了带有病毒的dwg文件。导致cad中毒的情况。
0xA2 思路
该漏洞类似于win98时代的desktop.ini配合folder.htt的方式执行脚本(以下简称D+F,比autorun.inf恶劣的多,而且完全没有实用价值),微软对D+F的做法就是完全取消该功能,使得desktop.ini不允许绑定Folder.htt,并且取消所有shell的功能。Autodesk(下称自动桌)也采用相同做法,最新版的CAD中已经修复了这个shell漏洞(下文会提到)。
那么本文意义何在?问题就在于,没有人用最新版的CAD,现在主流的CAD是2012其次是2014,甚至还有用户在用2007和2008等古老版本,才使得cad病毒频繁发作。
这里说个题外话,为什么用户都喜欢用老版本cad?不是因为好用,而是cad用户都依赖自己用的cad插件。Cad二次开发依赖arx版本和.net版本,导致老版本插件移植到新cad需要改动,甚至较大改动,所以各厂商基本不支持新版本cad。用户自然也不会为新版cad买单,毕竟自动桌心黑的很。
以下简单谈下我的思路,由于脚本类的病毒很容易改动,稍微改动就会影响到特征码,所以杀毒软件对现在的acd病毒查杀率不到50%,我们应该放开从cad病毒的出发角度,换一种角度看待这个问题,直接封堵cad的这个漏洞,抑制cad病毒传播。
故而,下文不会反编译病毒文件,也不会涉及到病毒本身,我们只会从cad的执行程序acad.exe下手。
0xA3 分析acad.exe
思路:无需反编,直接查明到底会执行多少的脚本文件名。
采用软件:Procmon(进程监视器)
举例cad版本:AutoCAD 2012 官方简体中文版(恐怕市场占有率超过70%)
为了过滤掉不重要的信息,我们先开启cad,选择文件――》打开,然后找到D盘中预先存放好的D:\test\Drawing1.dwg文件,选中这个文件不要打开。
此时启动Procmon进行记录。
选择Filter(过滤器)添加条目:
Process Nameisacad.exe -》过滤cad的进程
Path containsd:\test -》检查这个路径下到底发生了什么
点击OK之后,拉到最下方
这里很简单的可以看出,黄色箭头是加载完成Drawing1.dwg后,cad持续搜索了这么多文件,状态都是NAME NOT FOUND(因为根本没有病毒)。以下,在dwg文件下创建一个空文本文件,重命名为acad.lsp,保存,我们再加点盐,cmd中执行:
D:
Cdtest
Attrib +a +s+ r+ h acad.lsp
赋予系统、隐藏、只读、存档的属性,让他在界面中消失
现在是普通隐藏状态。执行cad命令后如下图(未开启系统显示)
执行后acad.lsp消失。(两个文件夹是给大家对比隐藏和非隐藏的颜色)
属性中隐藏是灰色的,不能动,说明是系统属性隐藏文件。 重复以上方法,监控acad.exe。
Acad.lsp被加载执行。同样原理列表中的其他文件也会遇到这个问题。若此时该文件中存在恶意代码,会被执行。且CAD会请求管理员权限,该执行代码也将具有管理员权限,对系统造成破坏。
0xA4 FIXit
思路:采用cad二开的方式,监控CAD的事件,在开图时候执行我们自己的代码,在扫描路径之前,消灭所有可执行代码。
IDE:Visual Studio2015
语言:Viusal Baisc.net(各位忍忍吧,我C#写不顺手,同样道理用托管C和C#也能写)
我们新建一个VB类库(拿本记一下,我们要注入到cad里面,不能创建exe程序,必须是dll类库),引用cad路径下的acdbmgd.dll和acmgd.dll(如果是cad14还需要引用accoremgd.dll),.net Frame版本与CAD同步(2012对应4.0)。
我们既然是被动的加载,需要创建构造
Public Class Initialize
Implements IExtensionApplication
Dim docc As DocumentCollection = Application.DocumentManager
Overridable Sub Initialize()
Implements IExtensionApplication.Initialize
'加载Dll的时候执行,注册命令可以用<CommandMethod("")>这里不多说了
End Sub
End Class
通过cad api加入回调函数监视cad的事件
AddHandler docc.DocumentBecameCurrent, AddressOf DocumentCreateStarted
关联子程序DocumentCreateStarted,在类中声明子程序。Docc详见上文的声明。
Sub DocumentCreateStarted(ByVal sender As Object,ByVal e As DocumentCollectionEventArgs)
End Sub
这里画下重点,为什么是DocumentBecameCurrent这个事件?CAD中有诸多事件与打开相关,经过一系列的测试,执行脚本的漏洞正好是发生在DocumentBecameCurrent之后。以下省略100万字测试方法。
请注意此处的 ByVal e As DocumentCollectionEventArgs。 使用e.Document.Name即可获得正在开启的dwg文件路径,在此先人一步,扫描这个路径:
这里简单的写一句:
Dim addr As String= e.Document.Name
Dim i_addr As Int16 =InStrRev(addr, "\")
Dim V_add As String= Microsoft.VisualBasic.Left(addr, i_addr) & "acad.lsp"
注释:这里简单的字符串处理,其他语言可能不一样,各位自行查阅MSDN吧。
这里如果获取到acad.lsp,则将其改名。 我们将写好的程序生成DLL,在cad中使用Netload加载这个demo,使用上文方法继续监视。
得到如下结果(为了方便演示,我将过滤器调整为d:\test\acad.lsp)。
修改过滤器之后,明显能看到过程,红色箭头的时候,acad.lsp已经被改名,绿色箭头部分是cad搜索acad.lsp提示失败,脚本未被运行。
0xA5 强制cad加载我们的dll
实际上这里无需大费周折,cad已经留好了相应方法,打开注册表编辑器(regedit,请注意区分x64和x86),
在中添加项
添加三个注册表键值
LOADCTRLS REG_DWORD 2
LOADER REG_SZ dll文件路径
MANAGED REG_DWORD 1
DESCRIPTION REG_SZ 可以胡来
在开启cad的时候即加载我们的dll。收工!
--------------------我是分割线---------------------------
0xB1病毒样本分析
以上我说过,主要类型有两种,未被编译的lsp脚本,以及lsp编译成中间语言的fas程序(多个fas可以打包成vlx程序集)。(刨除cpp编译的arx不谈。因为太少。哦对了,CAD还有宏病毒,,你没听错,是宏病毒,绝对化石级的存在,早期CAD支持VBA,有类似于20年前的word的97宏病毒,,,但由于现在cad的vba需要单独安装,所以这类病毒绝迹了。。)
首先公布两个病毒样本
解压密码:52pojie
两个样本一个为3kb,另外一个3356KB,文件大小跨度巨大。全部使用lsp语言编写,是我的插件从其他人电脑中拦截到的样本。
经测试,两个样本均会被微软MSE响应。(有大量的cad病毒是不被杀毒软件响应的,因为随便改改就识别不到)
为啥挑这两个文件?
因为vlx文件不是明文,都是编译后的程序,lsp都是明文,有明文不看干啥费这劲。。。
我们先使用Npp打开那个3MB的样本
简单说下lisp语言,这是一门古老的函数式语言,具体去百度。
;分号开头为注释行
setq表示赋值(setq name value的格式)
如果习惯Basic和C语序的朋友,看Lisp的语序可能比较诡异(毕竟古老的语言,不过看起来也比E语言舒服。。。至少是行间对齐的)
Npp打开头 1~24行均为注释,且保留ACAD.MNL的字样,cad目录中确实有启动文件名为ACAD.MNL且包含注释,目测应该是起到防杀作用,让杀毒软件误以为是正常的cad自家文件。
而有意思的是,前面一堆全部都是废话(不知道是从哪里粘贴来的代码,我也无心去看),并且被复制粘贴数次。
直到第1054行的时候,才开始露出马脚
setq表示赋值,此处大量的相同赋值语句直到114533行,全部为相同语句
由于lisp是脚本语言形同vbs(但在执行过程中不依赖win脚本宿主,由cad翻译,所以速度很慢),cad开启dwg文件时,会加载该文件,这11万条赋值语句将对系统造成极大负担(CAD多核油画几乎为0),在该脚本未运行完成之前,cad将处于无响应状态,干扰用户开图使用。(后经过测试,部分cad病毒会在C盘生成一个文件,该文件中全部是(setq flagx t),直到给C盘写满为止)
我在这里就不演示这个过程了,开启图形时,cad命令行中会无限执行(setq flagx t)。
从114535行之后,画风一转,进入破坏模式。
请注意绿色的箭头,我不知道自动桌哪根筋放错位置了,一个制图软件居然还为脚本提供了注册表的接口。。。。。
如上图所示,脚本会破坏下面三条注册表项,造成的结果是无法显示隐藏文件。
这里是重点,请注意,两个圈圈都是空的!,这里在此选中之后,点了确定,回来他还是空的。
当然不是没有修复的办法,只要重新写回去就好。
修复方法:新建一个reg文件,写入如下
Windows Registry Editor Version 5.00
"Text"="@shell32.dll,-30499"
"Type"="group"
"Bitmap"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,\
00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,53,00,\
48,00,45,00,4c,00,4c,00,33,00,32,00,2e,00,64,00,6c,00,6c,00,2c,00,34,00,00,\
00
"HelpID"="shell.hlp#51131"
"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"
"Text"="@shell32.dll,-30501"
"Type"="radio"
"CheckedValue"=dword:00000002
"ValueName"="Hidden"
"DefaultValue"=dword:00000002
"HKeyRoot"=dword:80000001
"HelpID"="shell.hlp#51104"
"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"
"Text"="@shell32.dll,-30500"
"Type"="radio"
"CheckedValue"=dword:00000001
"ValueName"="Hidden"
"DefaultValue"=dword:00000002
"HKeyRoot"=dword:80000001
"HelpID"="shell.hlp#51105"
保存成reg文件,双击导入即可,我附件里面存一个写好的
后面就更可怕了,cad不光提供了注册表的接口,还提供了网卡控制的接口,各位自行浏览即可。
--------------------我是分割线---------------------------
我们来看第二个只有3kb的文件
这个地方大家看的有没有一些眼熟??
如果看着眼熟的话你肯定没干好事!
使用chr来代表文本,可以通过很多安全程序的过滤系统。
那么我们挨个对其解析。
Chr("97") a
Chr("99") c
Chr("97") a
Chr("100") d
Chr("46") .
Chr("109") m
Chr("110") n
Chr("108") l
strcat表示连接字符,将第一段chr链接后:acad.mnl
acad.mnl是cad的一个正常加载文件,后文对该文件进行了写入操作。。
第二段
acaddoc.lsp
cad病毒依靠这种方式可以过掉部分杀毒软件的检测功能。
其余代码自行浏览。。。。都是明文
。。。。。。。。。。。。。。。我也是分割线。。。。。。。。。。。。。。。。。。。。。。。。
1.1版本已经更新,详见70楼,支持的cad版本为2010、2012、2014~2018
。。。。。。。。。。。。。。。我也是分割线。。。。。。。。。。。。。。。。。。。。。。。。
1.2版本更新,详见98楼
链接: https://pan.baidu.com/s/16fVqPAUHOkmU8lzthUA4Eg 密码: hewk
我也入乡随俗,各位觉得有用,给个评分吧~
bbvbvbbv 发表于 2018-3-28 22:09
不知道楼主什么时候能出2017的呢
马上能出,主要2017不会中毒,有这套东西能隔离病毒,没有像老版本那样起到实质性作用
本帖最后由 Onlystone 于 2018-5-14 11:04 编辑
1.1版本现已加入
修改内容:
本来就是写个demo,没想到大家这么支持,那么进一步完善了程序
感谢论坛支持,软件中添加了52pojie的网址,和网站标题,为了大家研究方便,没混淆。
现在全面支持2015、2016、2017、2018的64位版本(2016之后cad本身不会中毒,但本软件能将病毒隔离,防止传染其他人)
2008版本推出无望,建议各位更新cad(或者,你可以多找几个人来建议我出。为啥?因为我写一个版本我就要装一个版本的cad。。。而且要改代码)
卸载按钮之前报告路径写错了。已修改
修复了之前CAD2010不能安装的问题。
完善了病毒库。
软件请去1L下载1.2版本。 虽然作为一个小白,对大佬的讲解看得不怎么明白
但是是一个深受CAD病毒摧残的设计狗啊!!!
CAD病毒让我和同事返工过N次!!!
请问大佬CAD还会生成acad.fas这个格式是什么情况啊{:1_904:} zzz52pj 发表于 2018-3-28 12:17
虽然作为一个小白,对大佬的讲解看得不怎么明白
但是是一个深受CAD病毒摧残的设计狗啊!!!
CAD病毒让我 ...
仔细看我的文章,我的截图里面有,acad.fas是fas文件,编译后的lsp脚本,也会自动运行,有些病毒会选择这个格式,因为比lsp脚本更隐蔽,我放出的插件可以解决这个病毒 小白们只需要点击下载我的附件,然后点安装就行了,可能过多的解释不如直接一个安装按钮来得快。我放出的这个demo不会访问网络,各位放心使用。管理员要有要求比如挂上论坛名什么的可以发我,我改,跟打疫苗一样,安装量大了,才能净化cad环境 这个很好,谢谢楼主提供。 Onlystone 发表于 2018-3-28 12:21
仔细看我的文章,我的截图里面有,acad.fas是fas文件,编译后的lsp脚本,也会自动运行,有些病毒会选择这 ...
不好意思哈
回复的时候突然想起.fas这个格式。就忽略前面楼主提到的
简直是深恶痛绝这个cad病毒啊。
万分感谢楼主!!! 在沙盒启动cad(沙盒设置读取写入权限),这样就能再加一层保护 MaxMadcc 发表于 2018-3-28 12:53
在沙盒启动cad(沙盒设置读取写入权限),这样就能再加一层保护
可能和你想的不太一样,,cad自带lsp的解释器,所有恶意代码都是cad自身执行的,并不是外界注入的,病毒的目的是借用cad自带的解释器来实现攻击windows 的目的。
若用沙盒隔离cad,问题也多多,cad是需要靠插件来维持工作的,隔绝之后,正常插件运行会出现症状。cad病毒只不过是有恶意代码的cad插件。 谢谢分享 感谢分享