[转]Shadowsocks RCE分析
来源:互联网 发布:在手机上怎么开淘宝店 编辑:程序博客网 时间:2024/06/05 23:05
前言
10月13号X41 D-Sec组织披露了有关Shadowsocks的一些漏洞,文章在此。以下对文中提及的日志文件写入和命令执行漏洞进行简要分析。
漏洞细节还是很简单的,但其中涉及到了一些小技巧还是可以提一提的。
要点
- 日志文件写入漏洞原因在于Shadowsocks基于Socks5的代理是支持用域名作为连接目标的,在精心构造目标域名为可控内容时,Shadowsocks会将其直接写入日志。
- 命令执行漏洞原因在于Shadowsocks提供的用于检测与封禁暴力破解IP的autoban.py脚本在处理日志时不严谨,造成字符串拼接形式的命令执行。
LOG FILE MANIPULATION
角色有三:ss服务器端,ss客户端和用户端。
ss客户端作为socks5代理,在接收到用户端发送过来的请求后,会对请求进行解析。关键解析函数shadowsocks/common.py中parse_header(data)函数在判断请求目标地址类型为域名后,会将其写入日志文件。
ss客户端会将请求向后传输给ss服务器端,ss服务器端也会如上写入日志。
因此,如果可以控制用户端请求的目标地址部分,即可将任意内容写入日志。简单写个脚本如下,9001是ss客户端地址:
查看日志:
可以看到,“bar”是单行写入的,漏洞触发成功。
COMMAND EXECUTION
autoban.py脚本的作用是通过检查ss日志中的错误来对请求来源ip进行一些封禁处理。脚本处于shadowsocks/utils/autoban.py。
内容简短说就是按行查日志,如果出现
关键字符串在行内就进一步处理,最终提取来源IP拼接进cmd执行。
也就是说,在日志内容可控的情况下,完全可以通过精心构造请求来达到ip的内容可控,从而造成命令执行。
这里有三个坑:
- 命令内容不能有空格,不然被切开了
- 命令内容不能有冒号,不然被切开了
- 脚本查来源ip是有频次控制的,默认为3。也就是攻击请求需要发三次以上才会触发autoban的ban。
源文中为了绕过空格限制,给出的POC用到了一个将日志作为脚本执行的方法,但并不是很好,因为需要知道ss的日志存储路径。如果路径非默认,就没用了。
这里需要提一下执行bash脚本不用空格的方法。主要用到了${IFS}环境变量,${IFS}=‘空格\n\t\00’,空格在第一个字符。
直接给出吧:
- echo “a${IFS:0:1}b” 从0位置截取1个字符,这里不能用,因为引入冒号了
- echo “a${IFS%???}b” %逆向裁掉3个字符,?是占位符,这个可以用
因此POC也呼之欲出了:
最后给出完成测试过程:
最后
谁没事儿会用autoban.py啊,大家的ss还是很安全的
- [转]Shadowsocks RCE分析
- CVE2012-1723 Java Field Bytecode Verifier Cache RCE分析
- JAVA Apache-CommonsCollections 序列化RCE漏洞分析
- CVE-2016-4977 RCE in Spring Security OAuth漏洞分析
- Jenkins RCE CVE-2016-0788分析及利用
- Shadowsocks
- Shadowsocks
- shadowsocks
- shadowsocks
- shadowsocks
- shadowsocks
- Shadowsocks
- Shadowsocks
- shadowsocks
- Shadowsocks
- common-collections中Java反序列化漏洞导致的RCE原理分析
- 我听说你不需要密码?Cisco ASA SNMP RCE漏洞分析利用
- 我听说你不需要密码?Cisco ASA SNMP RCE漏洞分析利用
- mt6735 [Audio Common] 通话时如何播放声音给对方听
- JavaWeb笔记之Tomcat虚拟主机技术
- 技术分享连载(六十四)
- leetcode_41. First Missing Positive ? 待解决
- xml封装成对象(1-1)
- [转]Shadowsocks RCE分析
- 开启数据科学职业生涯的8个基本技巧
- android studio升级到3.0之后,注解插件Butterknife 8.8.1出错的问题
- js实现tab菜单(选项卡)
- DES方式加解密的简单介绍
- 6-2 多态性与虚函数
- 20171124学习强化学习,尽快出论文,Q-learning2.1
- Struts Action实例化,从源码上分析
- warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared librar