美国骇客年会(Black Hat 2008) 观察:第二天

时间:2022-03-30 07:32:38
 

说真的如果不是要来 Black Hat / DEFCON,我是绝对不会想到这边来的。我去过不少城市,但是了解我的人应该都知道,这边除了骇客年会,还真没有东西可以吸引我。

今天的 keynote 是美国*资安界的当红新人炸子鸡 Rod Beckstrom,大家都来看他的风采。Rod 是我们营运长 Matt 的 Stanford MBA 学长,也是一位有名的创业家,他之前以 twiki 作者的身份,创办了 TWIKI.NET。今年叁月20日,他正式接受美国国土安全部(DHS、Department of Homeland Security)的邀请,担任底下一个新成立的单位:「国家资安中心(National Cyber Security Center、NCSC)」的首席。NCSC 是一个新的跨部门单位,负责协调各资安部门之间情报的交换。

NCSC 的成立以及这项任命,是源自于布希于今年一月签同的一项机密的指引,主要用以扩大情报界对于目前日益严重的针对美国的网路攻击之掌握度,因为之前美国情报单位对于资安攻击的掌握过渡零散,缺乏一个*协调的组织。Rod Beckstrom 其实并没有资安背景,但是他有创业家的经验,对业界很熟,成功创办 TWIKI.NET 帮助企业用 wiki 观念协调资讯交换,以及着有很畅销的「The Starfish and the Spider」一书,提出新的分散式企业管理概念,这些都是美国国土安全部(DHS)看中他的原因。

美国骇客年会(Black Hat 2008) 观察:第二天

Rod 讲了很多美国*的历史与*在资安方面的历史,基本上我觉得就是帮*建立形象啦,表示美国*从电报的年代就很懂资安与情报的重要。我对美国*的历史没有兴趣,我对骇客的历史比较有兴趣,但是我觉得 Rod 的加入对布希*在形象上一定是一大加分,因为 Rod 感觉很有业界经验,不会让外界觉得*都闭门造车。

Rod 讲了他认为目前资安难做的原因,我非常的认同。他说,有些球类,进攻难,防守易,例如足球,所以分数都不高(几比几);有些球类,则是进攻容易,防守难,例如篮球,所以分数都很高(可以破百)。资安比较像篮球;事实上在资安里面,防守比攻击要难太多太多了,这也就是资安难做的原因。

这个我完全认同。是的,要有好的防守,必须很懂得敌人,很懂得敌人所用的攻击方法。所以重要的骇客年会我们都会派人参加。但是这只是基本功而已。懂得攻击之后,要设计防守,又更加困难。为什么?因为攻击成本低,防守成本高!就拿防毒软体来说,其实测不到,不是防毒厂商没有样本,可是防毒软体不能佔用系统太多资源,所以样本不能无限制的长大,必须有所选择,在尽量不影响到系统效能的前提下,达到最高的侦测率。

又像如果打生物战,那么一样,设计病毒,只需能感染让人致死就好,可是设计解药,不但要杀死病毒,还要保存人体不被破坏。不论在网路空间或实际生活中,攻击总比防守简单太多,这是资安难做的原因。再加上攻击处于主动,何时攻击可以自行选择,但是防守处于被动,何时被攻击无法预期,所以无时无刻都需要检查与防範,而这些无时无刻都需要做的检查与防範,都是成本的增加,这也是资安难做的原因。

另外 Rod 探讨了一些我们在业界常探讨的资安的投资报酬率问题。感觉他有观念,但是毕竟他之前不在资安产业,探讨的东西都还太浅了些。以下是两张投影片,基本上是说,如果 x 轴是资安的投资,y 轴是因为资安投资而减低的损失,那么需要找到投资报酬率最高的点。但是 Rod 你说用一条 45 度的线跟曲线取交点,是这样吗?我高中毕业很久了,博班资格考也没考微积分,但是我怎么直觉觉得,要分析要看此曲线斜率,所以要做一下一次微分后分析...

美国骇客年会(Black Hat 2008) 观察:第二天

听完之后去帮 Jeremiah 捧场,听他同事 Arian Evans(大会)讲“Encoded, Layered, and Trancoded Syntax Attacks: Threading the Needle past Web Application Security Controls”

这个题目就不翻译了,基本上整个演讲在说一件事:Web 上的攻击,如果加上各种不同的编码方式,那么穿透率几乎可以达 100%,没有任何 Web 防火墙可以阻挡。这是指 Web 防火墙设定成利用黑名单的情况下,如果花时间设白名单的话,一样可以阻挡,可是一般稍微有规模的站,我看到大部分都是用黑名单方式,因为设白名单是很繁琐的事情,需要找到好的厂商才行。

讲到这里,其实我深深觉得资安业,找对公司比找对产品重要多了。不论是源码检测或 Web 防火墙,如果卖方只是想塞产品给您,那么买了再好的,牌子在大的产品也没有用,一样会失败,最后还是会发生资安事件。如果找对好的 partner,有心服务客户,长期经营,技术能量也够,那即使用免费的开放源码 ModSecurity 做 Web 防火墙,一样能设定到让您高枕无忧。其实对方有没有心做服务,还是只想塞产品,还有对方的技术团队有没有实力,通常很快就能看出来。

美国骇客年会(Black Hat 2008) 观察:第二天

这张明天要去卖 Arian 了,拍得太好了 :)


投影片一拿出来就开始讲今年初进行到现在的大规模 SQL Injection 加网页挂马攻击(阿码新闻稿,PC World(IDG),ITHome)。Arian 拿当初 Neil Carpenter 蒐集到的攻击字串做例子:

2008-03-08 13:37:13 /dir1/archive.asp id=z%27%20ANd%20char(124)%2Buser%2Bchar(124)=0%20and%20%27%25%27=%27

这是一行 web server 的 log。在这个例子里,%XX(例如 %27、%20、%2B)是 URL encoding 的一部份,会被 web server decode,decode 完变成:

2008-03-08 13:37:13 /dir1/archive.asp id=z' ANd char(124)+user+char(124)=0 and '%'='

然后整个 SQL injection 字串,会被 SQL server 解码成:

id=z ANd |user|=0 and '%'='

不要说多层编码,即使只用一层的 URL 编码,就可以因为 UTF-8,而使同一个字串几乎有无限种编码可能。譬如一个简单的:

GET / indexA.html HTTP/1.1

就可以被编码成:

GET /index%41.html HTTP/1.1
GET /index%2541.html HTTP/1.1 (double percent)
GET /index%%34%31.html HTTP/1.1 (double nibble)
GET /index%%341.html HTTP/1.1 (first nibble)
GET /index%4%31.html HTTP/1.1 (second nibble)

然后如果再利用 2-byte or 3-byte UTF-8 编码的话,变化又更多了。

但是这整个演讲的内容其实对我来说一点都不新,这些编码来穿透 Web 防火墙的方式大概四五年前很多书还有 paper 都已经介绍得很完整了。整理起来,整个演讲的重点就两个:

一、由于 UTF-8,攻击字串几乎有无限种编码方式。

二、攻击可以分层的编码,像上述例子,一层给 web server 解,一层给 SQL server 解。或穿插 URI % encoding 或 UTF-8 encoding、HTML decimal entity encoding、SQL server encoding(char())等混合使用。

听完后去听好友 Billy Hoffman的演讲:“击败 javascript 分析工具(Circumventing Automated JavaScript Analysis Tools)”。Billy着有「Ajax Security」,上次在 RSA 2008 办签名会,我一口气签了很多本回来送朋友,让他高兴得不得了。既然是 Billy,当然要照帅一些啰!有没有注意到左下方 Billy 的笔电?併购后笔电也该 HP 啰!

美国骇客年会(Black Hat 2008) 观察:第二天

今年讲网站挂马的演讲真是多,其实这个题目去年就很红了,今年年初再加上两点,使得这个议题红到不行:

一、年初的大规模自动 SQL Injection 加 网页挂马(阿码新闻稿,PC World(IDG),ITHome)

二、网路挂马所使用的 javascript 语言,其编码与变形太过容易(除了大家熟悉的 MPack 自动化犯罪工具包,现在线上的 javascript 编码/变形服务也到处都是:看这里和这里。)

Billy 在他的摘要里就直接提到:“拜 MPack 所赐,大部分恶意 javascript 都编码过
(Obfuscated JavaScript payloads are the norm thanks to malware frameworks like MPACK.)”

的确,根据“IBM X-Force 2008 年终趋势报告(IBM X-Force 2008 Mid-Year Trend Statistics)”,2007年后半年,网页挂马中 javascript 编码变形以达 100%:“A year later,
in the second half of 2007, Web browser attack obfuscation approached 100
percent.”

在这个 talk 中,Billy 讲了恶意程式变形技术与侦测技术间永无止境的斗智游戏。这是我很期待的一个 talk,因为跟我们 HackAlert 非常相关。

Billy 今年的研究延续去年 Ben Feinstein跟 Daniel Peck 讲的 Caffeine Monkey 。

OKOK,继续之前,我们先来看看这些人到底在讲什么。

现在的大规模自动网站挂马,ITHome)都是利用 SQL Injection 漏洞在网页里安插恶意的 javascript。这些 javascript 都经过变形(或称编码)。利用 MPack,甚至可以动态变形,也就是说,每一个访客所下载到的网页,里头的 javascript 都经过不同的变形。

变形的 javascript 到底长什么样子?我们就拿我之前写的“神秘 Web 攻击绑架剪贴簿”来看好了,其中用的一段範例 javascript:

function IE_ClipBoard()
{
  if (window.clipboardData) {
    window.clipboardData.setData("Text","Hello from Wayne!");
  }
}

1、好,现在我们用 malwareguru 上的线上编码工具 Vanishing Point Packer(网页、malwareguru 上提供的线上 demo),把上面这一段 javascript 贴进去,按「pack」,塬本的 javascript 就变成了以下这段了:

eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){return d[e]}];e=function(){return'//w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('//b'+e(c)+'//b','g'),k[c])}}return p}('4 3(){2(1.0){1.0.5("8","7 6 9!")}}',10,10,'clipboardData|window|if|IE_ClipBoard|function|setData|from|Hello|Text|Wayne'.split('|'),0,{}))

2、网路上随便 Google 「javascript obfuscator」或「javascript packer」,可以找到一堆线上的服务,每一个变形出来都不太一样。举几个例子:

Yellopipe source code encrypter:


document.write(unescape("function%20IE_ClipBoard%28%29%20%20%0D%0A%7B%20%20%0D%0A%20%20if%20%28window.clipboardData%29%20%7B%20%20%0D%0A%20%20%20%20window.clipboardData.setData%28%22Text%22%2C%22Hello%20from%20Wayne%21%22%29%3B%20%20%0D%0A%20%20%7D%20%20%0D%0A%7D%20%20"));


3、Audit My PC HTML Encoder:

document.write('/u0066/u0075/u006E/u0063/u0074/u0069/u006F/u006E/u0020/u0049/u0045/u005F/u0043/u006C/u0069/u0070/u0042/u006F/u0061/u0072/u0064/u0028/u0029/u0020/u0020/u000D/u007B/u0020/u0020/u000D/u0020/u0020/u0069/u0066/u0020/u0028/u0077/u0069/u006E/u0064/u006F/u0077/u002E/u0063/u006C/u0069/u0070/u0062/u006F/u0061/u0072/u0064/u0044/u0061/u0074/u0061/u0029/u0020/u007B/u0020/u0020/u000D/u0020/u0020/u0020/u0020/u0077/u0069/u006E/u0064/u006F/u0077/u002E/u0063/u006C/u0069/u0070/u0062/u006F/u0061/u0072/u0064/u0044/u0061/u0074/u0061/u002E/u0073/u0065/u0074/u0044/u0061/u0074/u0061/u0028/u0022/u0054/u0065/u0078/u0074/u0022/u002C/u0022/u0048/u0065/u006C/u006C/u006F/u0020/u0066/u0072/u006F/u006D/u0020/u0057/u0061/u0079/u006E/u0065/u0021/u0022/u0029/u003B/u0020/u0020/u000D/u0020/u0020/u007D/u0020/u0020/u000D/u007D/u0020/u0020');

4、中国的「网?免? 孤程?雪」线上服务:

t="97,108,101,114,116,40,39,72,101,108,108,111,32,102,114,111,109,32,87,97,121,110,101,32,111,102,32,65,114,109,111,114,105,122,101,33,39,41,59"
t=eval("String.fromCharCode("+t+")");

5、嗯嗯,图很熟悉吧?各位 IT 应该都不陌生...是的,这种编码方式很受到前一波挂马骇客的喜爱,很多网站挂马都长得很像图 5...所以我们把这个「网?免? 孤程?雪」站的话面贴出来一下好了:

美国骇客年会(Black Hat 2008) 观察:第二天

6、编码还可以分很多层,可以用不同的编码器编过几层。看到这些,我们想一想,现在很多 gateway 产品,都号称他们可以及时侦测与阻挡恶意网页...现在网路频宽都很大,在这么大的频宽下,一个 gateway 装置要 buffer 住所有的 HTTP response,然后即时的执行 javascript 解码,然后识别恶意程式...您相信吗?

看着5的图,您也许会想,编码过的 javascript 都有一些特徵,例如都是一堆的数字,侦测这些特徵,不就可以侦测到恶意的 javascript 了吗?问题是这会有很多的误判。因为塬本这些 javascript 编码器,都不是拿来做网站挂马的,而是用来保护 javascript 的智慧财产权的。Javascript 必须要在浏览器上执行,所以不论你花多少时间写 javascript,最后谁都可以拿到你的程式,因为 javascript 不会编译成执行档,而是直接以程式码的方式传到浏览器上,再由浏览器执行。所以为了要保护 javascript 程式不要轻易的被有心人研究,许许多多的程式设计师,都会将自己的 javascript 利用上述这些编码器编码或变形。也就是说,编码过的 javascript 不见得都是恶意的,很多大型网站上,拥有非常多编码过的 javascript,大部分商售的 javascript,也都经过编码变形。究竟有多少 javascript 编码器?很多,连 Yahoo! 都提供 Yahoo! 的 javascript 编码器,也介绍其他好用的编码器。

好吧,那到底该如何侦测呢?HackAlert用的是实际的浏览器环境,所以没有问题,不论什么样的 javascript 变形方式,或者此 javascript 攻击什么样的未知的 0day 弱点,反正只要试图攻击,就一定测得到。可是这样的技术要对 windows 环境以及各 browser 的构造很熟才行。

这次在 Black Hat / DEFCON,在会后的一些 meeting 中,我发现一个很有趣的现象,就是在侦测网站挂马方面,“使用者”(大银行,大企业,军方,情报单位)的功力,有时反而比厂商甚至讲师更强。探讨下来,因为网站挂马太严重了,可是厂商都没有好的解决方案,号称可以测到的,其实都是用静态分析或黑名单方式,没有办法即时,辨识率也偏低,所以这一年下来,“使用者”只好 DIY,自己利用 Caffeine Monkey(paper、投影片、程式码)或 spidermonkey 来侦测(SANS最近也玩了一下),但是就如同 SANS 的 Daniel Wesemann 说的:”But SpiderMonkey is only a JavaScript engine - it doesn't emulate the browser and doesn't even have a "document" or "location" object...“。Caffeine Monkey就是建构在Spidermonkey 之上。SpiderMonkey 是 Mozilla 的 javascript 执行器,但是不是一个浏览器,还缺很多环境,Caffeine Monkey 一方面设法补足,一方面增加了一些自动侦测的技巧。

Billy 今年的 talk,则是针对诸多以 SpiderMonkey 为基础的侦测方式做破解,列了一打以上的破解方式,不过基本上可以粗分为两类:

一、侦测抓网页的是否是真的人还是要侦测的机器人(执行 SpiderMonkey 之类的)

二、直接用一些方法,让以SpiderMonkey 为基础的的自动侦测失效。

对于(一),Billy 列了很多的方法,包含了 HTTP/browser fingerprinting、DOM testing and encrypting、Doman and Network testing、Execution environment testing、cross plugin communication testing 等等。Billy 的演讲是针对 SpiderMonkey 和 Caffeine Monkey 设计的,所以这次讲的方法对以这些为基础的技术或产品真的很有效。以这些为基础的产品很多吗?非常多,因为这些是开放源码的程式,现在很多公司都是看到客户有需要了,不做研究,不花功夫,拿一些开放源码的程式整合一下,就把产品推出了。有的时候从客户那边听到这些业务的语言,我真的不敢相信,怎么大家都这么敢虎!客户又不是笨蛋,你说你功能都有,其实是那一些开放源码堆起来的,客户难道就不会测试吗?我接触的客户技术水準都越来越高,这些说话不打草稿的业务,应该会越来越吃亏。

Billy 讲的方法,基本上对 HackAlert 都无效,因为 HackAlert 后端基本上就是一套跟使用者一模一样的环境,是我们自己开发的,不是拿开放源码的程式凑的。

对于(二),则分两方面。一方面,因为 SpiderMonkey 毕竟不是整个浏览器环境,所以很容易可以用一些方法侦测出,执行的环境是「人」在用的浏览器,还是侦测用的环境。如果次侦测用的环境,那就不发动攻击,环境也就测不出来了。另一方面则是利用 SpiderMonkey 环境跟真正浏览器环境的不同,把 javascript 设计成,在 SpiderMonkey 环境下无法成功执行,那么 SpiderMonkey 就测不到了。

一样,对 SpiderMonkey 很有效,对 HackAlert 则无效。

但是看这两种攻击,其实用一句 Billy 最后讲的话就可以总结了:”现在我碰到的网站挂马越来越多是用 vbscript 而非 javascript。SpiderMonkey 和 Caffeine Monkey 都只支援 javascript,所以一旦恶意程式用 vbscript,所有这些侦测方法都完蛋了。“

写到这边,如果您回去看 图 6,左上角的第二个和第叁个按钮:”VB 网页加密“、”VBS 脚本加密“,也就说明了一切--在必要的情况下,骇客用 vbscript。

于是 Billy 在演讲中强调又强调,目前没有开放源码的 vbscript parser,造成他研究的瓶颈。我会后跟他说,vbscript 虽然是很烂的语言,但是文法还是能表示出来,我们约花一个月时间就做出 vbscript 的 parser 了。所有语言里面,vbscript 的语法最模拟两可,最难用 lalr 表示出来,但是解译不只需要 parser,还需要处理如 scoping 等等,几乎等于需要一个 compiler,所以即使他弄出了 parser,后面的功夫还很大。他问我们为何这么快可以完成 vbscript parser。问题是...我们本来就是源码检测的公司,parser 跟 grammar 对于源码检测或 compiler 的公司来说,是基本功。我们原本做 vbscript parser,是为了 CodeSecure 对 ASP 语言的支援,不是要侦测恶意程式。

至于我们的 vbscript parser,是否会用在 HackAlert 中,辅助侦测网站挂马呢?目前看起来没有必要。不论是 javascript 或 vbscript,这些都是 interpreted 语言,不是 compiled 语言。Interpreted 语言,动态可以产生新程式,语法也较不严谨,太多状态需 runtime 时才能决定,非常不利于静态分析技术。HackAlert 目前动态侦测方面,完全模拟使用者环境,侦测率很高,不需要再靠其他方式。

最后 Billy 你说我们的 vbscript grammar 可否开放源码,这我们得思考看看了。

这里可以看到 Daniel Peck (Caffeine Monkey 作者之一)
blog 对于 Billy 这场演讲的看法。

Billy 的演讲一向都很受欢迎,如果您想要听,他有一场 2007 年底在 Google Toolkit Conference 上讲的 Ajax Security:

Ok,我必须承认,在 Billy 演讲的中间,我落跑了 20 分鐘... 我去听了 Justin Clarke 的短演讲:「SQL Injection 蠕虫:为了兴趣也为了利益(SQL Injection Worms for Fun and Profit)」。看这就知道今年网页挂马热到什么程度了,竟然同一时间有两个演讲,逼不得已只好跟 Billy 请个假了!

Justin Clarke 是 Network Security Tools (O'Reilly)的作者,也是 SQL Brute 工具的作者。

美国骇客年会(Black Hat 2008) 观察:第二天

Justin 主要就是讲今年年初开始的大规模 SQL injection 加网站挂马攻击,但是我发现,我们对这些攻击的掌握度似乎更快。基本上他所有讲的,我们在之前都公开过了:阿码新闻稿,PC World(IDG),ITHome

整理重点:大规模攻击,SQL Injection 指令设计得很好,针对微软的平台,利用 Google (?q=)找寻攻击点,SQL Injection 的目的是为了要挂马...等等。这边重点是,虽然 HackAlert 可以侦测挂马,但是为何会被入侵挂马?都是因为有 SQL Injection 漏洞,故需把程式改好,才是彻底解决之道。今天听到现在已经第叁场讲大规模 SQL 加挂马了,大家的 SQL 漏洞快修修吧!

听完又回去捧场 Jeremiah 了,这回他带同事一起讲:”Get Rich or Die Trying - ‘Making Money on The Web, The Black Hat Way’“。

美国骇客年会(Black Hat 2008) 观察:第二天

Jeremiah 这次讲的,跟我上次安排他来台北(他blog的游记1、游记2,值得看)讲的”商业逻辑错误(Business Logic Flaws)(他的 blog、paper)“其实是一样的,只是多花了一些时间整理出更有去的内容:怎样可以利用这些逻辑错误来赚钱(其实也就是会造成什么损失啦!)。但是所介绍的逻辑错误本身,跟在台北讲的那场差不多。他带着年轻的同事 Trey 一起讲,感觉是要训练后辈,而 Trey 以这么轻的年纪,这么满的一间,台风算很好了,应该没让 Jeremiah 失望啦!

最后去了 Matthieu Suiche 的演讲:”Windows Hibernation File for Fun and Profit“。Matthieu 是专门分析 Windows 休眠档工具 Sandman 的作者。

美国骇客年会(Black Hat 2008) 观察:第二天

他对于这次演讲的 blog 在这里,投影片在这里:PDF、PPTX,demo 环境在这里。其实内容跟我们在台北办的 SySCAN Taipei 2008 里 PK 讲的「犯罪现场: Windows 记忆体内容撷取与鑑识」差不多,基本上就是 demo 从分析记忆体或休眠档,可以取出非常多的资讯。PK 那场讲得非常好,我很感谢他。PK 的许多内容应该都是参考 Matthieu Suiche的,因为 Matthieu 是这方面的先驱,修眠档的资安问题方面研究,他算是祖师,他的 Sandman也是现在这方面最领先的工具之一。

好啦!终于写完啦!感谢各位花时间看完。这些资安会议多跑几个,攻击的趋势,技术的进步,产业的趋势就都很容易掌握了。没有时间去的就看我的 blog 啰。另外我们在*办的会议,品质也都很好,有空可以多来