细学《Magic In Java API》(hessian部分)
2023-9-2 13:3:35 Author: www.freebuf.com(查看原文) 阅读量:8 收藏

freeBuf

主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

前言

这篇文章主要是对yemoliR1ckyZ在KCON2023中的议题《Magic In Java API》的一次学习记录

对应的slide可以在https://github.com/knownsec/KCon/tree/master/2023中获取

概述

该议题的结构如下

  1. API的介绍

  2. 该API在各个框架或者组件能够的影响细节

  3. 在RASP中利用该API的小技巧

  4. 根据各个组件的修复方式总结了一些有效的防御措施

API介绍

议题中API指代的就是sun.print.UnixPrintServiceLookup这个类

image-20230826232547663.png

这是一个用于打印服务注册的功能的接口

一个用于查找可用的打印机服务

public static void main(String[] args) throws IOException {
    // 获取 UnixPrintServiceLookup 实例
    PrintServiceLookup lookup = (PrintServiceLookup) PrintServiceLookup.lookupDefaultPrintService();

    // 使用 UnixPrintServiceLookup 查找所有可用的打印服务
    PrintService[] printServices = lookup.getPrintServices();

    if (printServices.length == 0) {
        System.out.println("No printers available.");
    } else {
        System.out.println("Available printers:");
        for (PrintService printer : printServices) {
            System.out.println(printer.getName());
        }
    }
}

在windows中对应的功能是在Win32PrintServiceLookup中实现的

public static void main(String[] args) {
    // 获取 PrintServiceLookup 实例
    // 获取所有可用的打印服务
    PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);

    if (printServices.length == 0) {
        System.out.println("No printers available.");
    } else {
        System.out.println("Available printers:");
        for (PrintService printer : printServices) {
            System.out.println(printer.getName());
        }
    }
}

UnixPrintServiceLookup初始化的时候

image-20230830221252242.png

创建了一个PrinterChangeListener监听器,是一个线程类,不断的更新服务

image-20230830221529635.png

过程中存在有可能利用的点getAllPrinterNamesBSD方法中

image-20230830222226574.png

image-20230830222330793.png

存在有命令执行的位置,传入的参数是在lpcAllCom数组中的其中一个元素

如果我们能够控制传入的参数就能够达到RCE的目的

之后就是从修改类属性的”不同方法“的角度来阐明该API可能导入RCE的情况

  1. 想要更改类的属性值,我们常用的结合反序列化可以通过java


文章来源: https://www.freebuf.com/articles/web/376902.html
如有侵权请联系:admin#unsafe.sh