Posted on 2010-01-08 17:42
S.l.e!ep.¢% 阅读(313)
评论(0) 编辑 收藏 引用 所属分类:
RootKit
网游木马防御技术漫谈
2008年06月04日 星期三 下午 10:40
大家好!首先讲讲网游木马常用攻击技术。第二,讲讲从开发商的角度,以较低的成本实现防御网游木马的策略。首先是键盘记录,所谓的键盘记录是在在键盘输入的时候木马会把你的键盘输入的信息记录下来,网上流传最广、最通俗的方法就是安装全局消息钩子,从而窃取密码。原来消息钩子这种进入密码的方法用得比较多,但是从2006年起主动防御的流行这类方法会被行为监控拦截,比如卡巴斯基这种主动防御就防这个。后来逐步地有一些黑客发掘出以前使用的比较少的被厂商所忽视的一种方法,例如图片上举到的这些(图)。
前面几个安装全局消息钩子、GetKeyState、GetAsyncKeyState 、 DirtecX接口的方法是从用户态实现的。原始输出设备raw input用它来窃取密码,这也是属于用户态的。键盘过滤驱动以及挂钩键盘驱动的Dispatch例程等方法属于核心态实现的。 Ppt中后面提到的所谓的Inline Hook是广义的,就是我进行挂接的时候可以在Rin3上挂,也可以在Rin0下挂,我的hook可以挂在自己的游戏程序里面,从而获取密码,深入的话也可以深到话kbclass设备的回调函数。突破nPtotect保护也不难。
第二部分是内存读取。用户输入密码后,通常情况下密码没有经过处理的话,有一段时间用户输入的密码会以明文的形式存放在内存中,包括登录游戏后,游戏中人物装备等级等信息都可以从游戏进程的内存中读取。
第三是星号密码获取以及缓存密码,比如在QQ或MSN上输入密码的时候,可以选择记录密码的情况。 使用GetWindowText函数就可以获取常规的星号密码,当然对于具有密码属性的输入框在GetWindowText之前需要使用SendMessage取消其密码属性。
下面讲到浏览器插件,主要用于获取IE相关的信息,也可以用来突破HTPS。
来看张图片,小区域精确截图(图),这种方法可以应对许多种网游的保护措施,先安装一个全局鼠标钩子,对你鼠标点击的时候,比如鼠标点击这边,事先算一下你的按纽的像素,把边长除以二,以鼠标点击的点为正方形的中心,从而以这个点截取一个正方形,面积最大的就是我们所要的密码信息。小区域精确截图的方法和图象识别,从而可以把图象信息直接转化为字符。如果说比较复杂,图象识别不了的话,黑客们常使用的方法就是发邮件,因为发邮件是可以以HTML的方式,从而可以把图片嵌在里面,黑客收到信的时候,看密码就一目了然。虽然是截取的图,但是也能很清楚地看到。
除了刚才讲的这些,下面还有应用得比较广的,例如封包截取或者协议分析,从协议的角度分析人物信息、用户名、密码。现在还是有一些比较厉害的人可以通过调试,逆向工程,结合ARP欺骗,对于非对称密钥加密的话,传统的破解方法比较困难。但是在局域网里面可以结合ARP欺骗、伪造,实现相应的效果。基本上现在的木马在对付非对称密钥加密的时候基本上是采用欺骗的方法。
还有一些其他技术,比如一些猥琐方法,谈技术含量比较低,但还是有效果。举一个例子,很久之前人家想到QQ密码,他自己写一个界面和QQ基本上差不多的,然后输入之后,再把真正的QQ进程运行起来。这是被人鄙视的方法,要钻空子的话还是比较多的。几年前盛大对安全很重视,那时候推出的盛大密宝,但它那种对于真正想窃取的人也是形同虚设,但是那个可能比较困难,或者还需要入侵它的服务器,把相应的算法搞清楚。这是比较困难的,但是用得比较多的,现在很容易实现的就比如这张图(图),我们后面讲的解决方案也会碰到类似的问题,对于盛大密宝使用的这些方法,我先简单地把盛大密宝的使用过程讲一下。
在输入用户名、密码后,它会又出现一个对话框,盛大密宝是以1分钟为间隔。以一分钟为单位,有一个函数,那个函数有两个变量,盛大密宝的序列号做了变量,还有一个变量就是和时间相关的。以一分钟为单位,会随机生成六位数,但是登录之后游戏里面就会随机抽取三位,请你输入盛大密宝,所谓盛大密宝就像U盘大小,中间有一个写字屏,以一分钟为单位,按照它的算法随机生成六位数,游戏的程序比如说请输入第一位、第三位、第四位,从六位数里面选三位数,让你输入第几,这是游戏随机的。以我们常人的角度看来就很安全,安全性很高。但是还是能被破解,原理就是这样(图)。
比如这里有两台机器,这台机器上面已经感染了能够破解密宝的高级木马,攻击者已获取初次登录及的用户名、密码。攻击者用已获得受害者的用户名密码登录。当受害者登录游戏时输入的用户名和密码已被木马程序换掉,登录另外一个无关帐户。为什么木马要在受害者登录时把他的帐号密码换成其他帐号呢,因为一个帐号不能同时登录。这样受害者输入自己的用户名、密码的时候其实已经变成另外一个人的帐号了。他进去之后会出现一个框,要求输入盛大密宝随机生成的6位数中的3位数。而且3位数的序号是给定的,比如第一位、第三位、第四位的六位数。从六位里面选三位位置是随机的。攻击者登录后出现密宝信息输入框,比如说请输入六位数里面的第四位、五位、六位。如图,攻击者只需在木马控制端里输入四、五、六,点完发送。此时木马端收到信息后就会把受害者的第一位、第三位、第四位提示信息换成四、五、六位。这样受害者就会输入盛大密宝随机生成的6位数第4、5、6位数字,这正是攻击者登录游戏所需要的信息。所以攻击者就实现了破解盛大密宝保护的效果。
因为黑客进入游戏之后防止他再重新进入,发现帐号正在使用,可以在我们的木马端做一些手脚,拦截封包两三分钟内让他上不了网,等他看看是否有一些有价值的装备或者游戏币,等处理完之后再让他上线。或者暴力一点,就是直接终止进程。也可以挂钩NtCreateProcess/Ex、NtCreateSetion,在一定时间内禁止次进程创建。
从内存读取的方法在木马里面也是使用得非常广泛的。在QQ稍微老一点的版本也是同样存在内存里面。现在有一些网上银行及游戏,他可能采用软键盘,我刚才说的对付软件盘通常有两种,一种是截图的方法,还有就是挂钩TextOut函数,取得软件中的字符,类似于金山词霸的技术,也就是是屏幕取词,用户点击点密码时已经被屏幕取词获得密码的字符信息。我这里讲的是一些主流的,还有针对特定的情况有一些比较猥琐的方法。
刚才是从攻击的角度进行分析的。现在开始讲怎样防御。考虑防御站的角度不同,比如游戏开发商是从自己写游戏的角度。从第三方安全软件开发商,比如瑞星、卡巴斯基,或者从使用者、网络管理员,比如网络管理员怎么样从边界防火墙角度怎样进行相应的配置。现在我讲的主要侧重于游戏开发者的角度。从游戏开发商的角度和第三方安装软件的防御角度还是有区别的。因为如果是游戏开发商的话,他做防御是要小型化,主要针对我自身的特性。不像安全软件可以做的很全面很庞大。 从游戏开发商的角度是怎样做最少的事情取得自身游戏的安全性。
我们先从基于主机的角度谈一谈。我们刚才已经粗略地了解了网游木马的密码获取常用手段,对应地我们要将缓存密码加密,自定义窗口类对相应读取密码内容的窗口消息进行处理,从而使它用传统的方法获取不到密码。第二是防范按键记录,虽然这只是简简单单几个字,我是把涉及到的面讲一讲,同样是一个防范按键进入,可以做得很浅,但同样也可以做得很深。越深入底层公开的资料越少,操作的系统提供的现成接口比较少,需要自己做的比较多,所以难度系数增大,从而会写的人就比较少,安全性就提高了。但是随着防御越往底层做,虽然安全性提高了,但是稳定性也下降了。从理论上说,只要原理正确的,也是可以做到稳定的。但是因为这些东西是人开发的,由于水平、经验,尤其是开发时间的限制,没有那么多时间去测试,没有时间经过多种客户环境的考验,所以想推出一个非常底层的产品级的、比较稳定的,时间会比较漫长。现在防范键盘记录的一个比较底层的比较稳定的方法是挂kbclass中的KeyboardClassServiceCallback,兼容性也较好,兼容USB、PS/2的。
原来QQ采用的是虚拟键盘,虚拟键盘其实也是一种成本较低效果较好的方法。但需要防御我刚才说那些密码窃取方法,比如挂钩TextOut的屏幕取词以及小区域精确截图。另外就是软键盘中按键的顺序要随机生成,还有就是软键盘在屏幕上出现的位置最好也要随机,如果大键盘位置固定的话还是很容易被盗取。还有就是最好不用字符,用比较复杂具有较强干扰性的图片,这样图象解析就比较困难,一般只能用截屏。我们现在已经知道的屏幕截取的方法通常是CreateDC和模拟鼠标按键PrintScreen键,所以只要挂钩相关函数就可以防止截取。从产品可用性的角度,在输入密码的一分钟之内对截屏功能禁用,这样对可用性也没有什么影响,而且避免了因交互式保护的烦琐带来的用户体验下降的弊端。
还有一种是在网吧里比较盛行的基于ARP欺骗窃取整个局域网内的游戏帐号信息。现在网吧基本上都是交换机的,基本上都是通过ARP欺骗的方法,就可以破取局域网里面其它机器的分包,如果能把网游的协议逆向分析出的话,就可以破解获取整个局域网里所有使用游戏用户的信息。对于网吧和局域网用户,防范ARP欺骗是很有必要的。
网游木马使用的各种密码窃取技术都会使用到相关的函数,从基于主机主动防御的角度,对相关函数挂钩实施行为监控即可防御相应密码防御技术,如 NtOpenProcess、NtReadVirtualMemory、NtUserSetWindowsHookEx、CreateDC等 。其中挂钩NtOpenProcess/NtReadVirtualMemory用来防范木马程序读取游戏程序进程空间中的密码,NtUserSetWindowsHookEx用来防范安装全局钩子。另外还可以枚举设备栈,对键盘过滤驱动进行检查。 通常安全软件中使用较多的是编写驱动程序挂钩SSDT,还有少部分inline hook。去年出现的比较多的安全软件的驱动漏洞不少是因为SSDT挂钩后的处理函数编写不完善,所以实现行为监控功能时我们自己的处理函数也要写得很健壮,防止漏洞的产生。
对于防御ARP欺骗,通常采取NDIS HOOK或者NDIS IMD技术,截取ARP包进行分析,丢弃伪造的欺骗包。另外实现还应建立一个可信的IP-MAC库,所谓的可信基就是在确保网络没有欺骗的情况下,确保其他机器尤其是网关的IP-MAC映射关系,先把它存起来,然后截取到ARP封包时与事先建立的可信IP-MAC关系进行比较判断。还有一个是比较简单的,就是用系统自带arp命令实现IP/MAC绑定的,但是对于Windows2000应该是没有用的,这点网上几乎没有披露,印象中只有flashsky以前提及过。因为Windows2000没有检查IP-MAC绑定是静态的还是动态的,虽然进行了绑定,但只要有ARP请求/应答包,WIindows系统还是会把伪造的IP-MAC对应关系添加到自身的ARP缓存表中。ARP的绑定功能在Windows2000里面形同虚设。所以通用有效的还是使用驱动利用NDIS HOOK/NDIS IMD技术拦截ARP包分析过滤。
有些情况下要获取游戏密码以及人物信息的话,最好到它的进程空间里面去,所以有很多木马就把自己的dll先注入到你的游戏进程里面。但是现在许多安全软件比如卡巴7、江民2008都采用的主动防御技术,而已防范常规的诸如CreateRemoteThread、SetThreadContext等注入技术。为了绕过主动防御以及实现自启动,某些木马利用了Windows一个简单的系统机制,就是目录的优先级, 具体讲如果当没有写绝对路径只是相对路径,调用dll时,优先加载同目录下的,然后才是系统目录。比如在网游目录下释放一个kernel32.dll,kernel32.dll所有Ring3程序都需要用到的吧,所以只要你的游戏程序运行起来了,木马释放的kernel32.dll也就注入到了游戏进程里面。 所以防止其他程序在游戏目录中创建相关文件也是比较重要的。关于具体的实现技术可以采用文件过滤驱动,甚至是Ring3下的全局钩子。另外,Ppt中提到的辅助方案:“游戏主进程检查自身模块中除了自身dll模块以及已签名文件有没其他dll模块,有则强行卸载”,与刚才说的互补的,还是比较有效的。
还有就是保护自身程序不被修改,因为当安全软件越来越严格,可能盗号木马无路可走时就以修改你自身的程序实现密码窃取以及自启动,所以对游戏自身的保护也很重要。
刚才说的主动防御行为监控的方法可以在不需要特征码的情况下实现通用的防护,但是和传统的特征码的方法相结合的话,往往可以取得更好的效果。而且自动更新也很重要,万一出现一个从来没有出现过的比较强的破解方法的话,应急小组知道这个情况,可以立马对程序进行更新。所以Office文件格式的漏洞为什么比PDF漏洞利用效果好,指的是非0day,因为PDF会强行自动更新,Office的是手动更新的(正版用户Office2003以及以后也会自动更新了)。
我们刚才是从游戏开发商的角度讲,所以他不可能就像卡巴斯基从安全软件的角度那样实施纵深立体防御,面面俱到。无论你怎么防,虽然说能够很大程度地防御,但是还是有漏过的地方。安全防护和黑客技术没有谁最厉害,你这个安全方案出现的话他完全可以钻你的空子,尤其做产品不是纯粹从技术角度出发,往往因为从程序的稳定性以及使用友好型的角度都会牺牲一些安全强度。 所以很难做到百分之百的安全,所以我们不妨换一角度,找一个可信基。比如现在因为手机的普及,可以将帐号与手机关联,登录以及修改密码时需要绑定的手机回复短信确认。有些游戏现在与MAC地址绑定,我认为绑定的话最好绑定PC以外的,因为木马程序已在机器当中,运用广义Hook的这一强大思想机型伪造,都能搞定。所以我们从另外一个角度,不应绑定pc上的,脱离它,比如和手机绑定,如果修改密码的话,它就会收到一条短消息,如果确认修改密码请回复Y等类似途径。对于虚拟物品的操作发短信通知用户并询问。当然对于虚拟物品操作可以尝试采用T+1方式,预先登记然后审核确认。 再就是动态口令卡,就像工商银行的网上银行。还有移动证书/Usbkey等。相对而言比较安全。但对于动态口令卡以及类似盛大密宝的保护措施,需要防御我刚才介绍的破解盛大密宝的那种思路。可以和基于主机的防御方法相结合。另外动态口令卡算法健壮性和验证服务器安全性也很重要。
时间快到了,先谈这些,谢谢大家。
|