浅谈RASP手艺攻防之实战[代码完成篇] | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

浅谈RASP手艺攻防之实战[代码完成篇]

申博_安全预警 申博 133次浏览 已收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

概述

本篇重要讲了简易版RASP完成,一切的情况都能够参考前一篇文章《浅谈RASP手艺攻防之实战[情况设置装备摆设篇]》,再次申明,本文只起到举一反三的作用,仅供参考,文笔欠好,人人轻拍。关于个中涉及到的ASM等学问,人人能够来我的博客[Sky’s自留地]举行查找相干的文章,笔者现在就任于《安百科技》,迎接人人一起来讨论RASP攻防手艺。

浅谈RASP手艺攻防之实战[情况设置装备摆设篇] 和 浅谈RASP手艺攻防之实战[代码完成篇]中的代码已上传到github,地点为:java_rasp_example

关于 ASM 中分歧类分歧要领之间的干系图以下
浅谈RASP手艺攻防之实战[代码完成篇]

简易版RASP完成

建立进口类

cn.org.javaweb.agent包下新建一个类。
内容以下:

/*
 * Copyright sky 2019-04-03 Email:sky@03sec.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package cn.org.javaweb.agent;

import java.lang.instrument.Instrumentation;

/**
 * @author sky
 */
public class Agent {

    public static void premain(String agentArgs, Instrumentation inst) {
        inst.addTransformer(new AgentTransform());
    }
}

建立Transform

然后我们再新建一个AgentTransform类,该类须要完成ClassFileTransformer的要领,内容以下:

/*
 * Copyright sky 2019-04-03 Email:sky@03sec.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package cn.org.javaweb.agent;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;

/**
 * @author sky
 */
public class AgentTransform implements ClassFileTransformer {

    /**
     * @param loader
     * @param className
     * @param classBeingRedefined
     * @param protectionDomain
     * @param classfileBuffer
     * @return
     * @throws IllegalClassFormatException
     */
    @Override
    public byte[] transform(ClassLoader loader, String className,
                            Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
                            byte[] classfileBuffer) throws IllegalClassFormatException {

        className = className.replace("/", ".");

        System.out.println("Load class:" + className);
        return classfileBuffer;
    }


}

build Agent设置装备摆设

点击右上角的agent[clean,intall]举行build。
浅谈RASP手艺攻防之实战[代码完成篇]
由上图可见我们的包的地位为

/Volumes/Data/code/work/JavawebAgent/agent/target/agent.jar

将改包的地位记录下来,然后点开tomcat设置装备摆设(这边没有对idea怎样设置装备摆设tomcat举行解说,不会的能够自行百度|谷歌)

浅谈RASP手艺攻防之实战[代码完成篇]

在VM options处填写以下内容:

-Dfile.encoding=UTF-8
-noverify
-Xbootclasspath/p:/Volumes/Data/code/work/JavawebAgent/agent/target/agent.jar
-javaagent:/Volumes/Data/code/work/JavawebAgent/agent/target/agent.jar

个中/Volumes/Data/code/work/JavawebAgent/agent/target/agent.jar的途径为你在上一步编译出来的agent的途径,注重替代。

这时刻我们在启动tomcat,就能够看到我们在AgentTransform中写的打印包名已见效了,以下图:
浅谈RASP手艺攻防之实战[代码完成篇]
上图红框地区为tomcat启动的时刻加载的一切类名。然后我们翻开浏览器检察web是不是一般。
浅谈RASP手艺攻防之实战[代码完成篇]

能够看到web也一般启动了。

建立ClassVisitor类

然后我们新建一个TestClassVisitor类,须要继续ClassVisitor类而且完成Opcodes类,代码以下

/*
 * Copyright sky 2019-04-03 Email:sky@03sec.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package cn.org.javaweb.agent;

import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;


/**
 * @author sky
 */
public class TestClassVisitor extends ClassVisitor implements Opcodes {

    public TestClassVisitor(ClassVisitor cv) {
        super(Opcodes.ASM5, cv);
    }

    @Override
    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
        MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);

        System.out.println(name + "要领的描述符是:" + desc);
        return mv;
    }
}

对ProcessBuilder(敕令实行)类举行hook用户实行的敕令

运用transform对类名举行过滤

然后回到AgentTransform中,对transform要领的内容举行修正,transform要领代码以下:

public byte[] transform(ClassLoader loader, String className,
                            Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
                            byte[] classfileBuffer) throws IllegalClassFormatException {

        className = className.replace("/", ".");

        try {
            if (className.contains("ProcessBuilder")) {
                System.out.println("Load class: " + className);

                ClassReader  classReader  = new ClassReader(classfileBuffer);
                ClassWriter  classWriter  = new ClassWriter(classReader, ClassWriter.COMPUTE_MAXS);
                ClassVisitor classVisitor = new TestClassVisitor(classWriter);

                classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES);

                classfileBuffer = classWriter.toByteArray();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return classfileBuffer;
    }

简朴引见一下代码块内容

起首推断类名是不是包罗ProcessBuilder,若是包罗则运用ClassReader对字节码举行读取,然后新建一个ClassWriter举行对ClassReader读取的字节码举行拼接,然后在新建一个我们自定义的ClassVisitor对类的触发事宜举行hook,在然后挪用classReaderaccept要领,末了给classfileBuffer从新赋值修正后的字节码。

能够看起来对照绕,然则若是学会运用今后就对照好理解了。

建立测试情况

我们在tomcat中新建一个jsp,用来挪用敕令实行,代码以下:

<%@ page import="java.io.InputStream" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<pre>
<%
    Process process = Runtime.getRuntime().exec(request.getParameter("cmd"));
    InputStream in = process.getInputStream();
    int a = 0;
    byte[] b = new byte[1024];

    while ((a = in.read(b)) != -1) {
        out.println(new String(b, 0, a));
    }

    in.close();
%>
</pre>

能够看到就是一个简朴的实行敕令的代码;下面我们对就此更悛改的内容举行build,看一下会输出点甚么。
浅谈RASP手艺攻防之实战[代码完成篇]

内核漏洞挖掘技术系列(3)——bochspwn-reloaded(1)

前言 上一篇文章我们讲解了内核double fetch漏洞和Project Zero的j00ru开源的这种漏洞的挖掘工具bochspwn的原理。这一篇文章我们继续讲解内核中未初始化导致的信息泄露漏洞和Project Zero的j00ru开源的同样基于bochs的插桩API实现的这种

biuld完成,启动tomcat。
浅谈RASP手艺攻防之实战[代码完成篇]
接见

http://localhost:8080/cmd.jsp?cmd=whoami

能够看到已胜利实行敕令,我们回到idea内里的控制台看一下输出了甚么。
浅谈RASP手艺攻防之实战[代码完成篇]
经由过程上图能够完全的看到一个实行敕令所挪用的一切挪用链。

Load class: java.lang.ProcessBuilder
<init>要领的描述符是:(Ljava/util/List;)V
<init>要领的描述符是:([Ljava/lang/String;)V
command要领的描述符是:(Ljava/util/List;)Ljava/lang/ProcessBuilder;
command要领的描述符是:([Ljava/lang/String;)Ljava/lang/ProcessBuilder;
command要领的描述符是:()Ljava/util/List;
environment要领的描述符是:()Ljava/util/Map;
environment要领的描述符是:([Ljava/lang/String;)Ljava/lang/ProcessBuilder;
directory要领的描述符是:()Ljava/io/File;
directory要领的描述符是:(Ljava/io/File;)Ljava/lang/ProcessBuilder;
redirects要领的描述符是:()[Ljava/lang/ProcessBuilder$Redirect;
redirectInput要领的描述符是:(Ljava/lang/ProcessBuilder$Redirect;)Ljava/lang/ProcessBuilder;
redirectOutput要领的描述符是:(Ljava/lang/ProcessBuilder$Redirect;)Ljava/lang/ProcessBuilder;
redirectError要领的描述符是:(Ljava/lang/ProcessBuilder$Redirect;)Ljava/lang/ProcessBuilder;
redirectInput要领的描述符是:(Ljava/io/File;)Ljava/lang/ProcessBuilder;
redirectOutput要领的描述符是:(Ljava/io/File;)Ljava/lang/ProcessBuilder;
redirectError要领的描述符是:(Ljava/io/File;)Ljava/lang/ProcessBuilder;
redirectInput要领的描述符是:()Ljava/lang/ProcessBuilder$Redirect;
redirectOutput要领的描述符是:()Ljava/lang/ProcessBuilder$Redirect;
redirectError要领的描述符是:()Ljava/lang/ProcessBuilder$Redirect;
inheritIO要领的描述符是:()Ljava/lang/ProcessBuilder;
redirectErrorStream要领的描述符是:()Z
redirectErrorStream要领的描述符是:(Z)Ljava/lang/ProcessBuilder;
start要领的描述符是:()Ljava/lang/Process;
<clinit>要领的描述符是:()V
Load class: java.lang.ProcessBuilder$NullInputStream
<init>要领的描述符是:()V
read要领的描述符是:()I
available要领的描述符是:()I
<clinit>要领的描述符是:()V
Load class: java.lang.ProcessBuilder$NullOutputStream
<init>要领的描述符是:()V
write要领的描述符是:(I)V
<clinit>要领的描述符是:()V

拿到用户所实行的敕令

接下来我们看看实验一下可否拿到所实行的敕令
新建一个名为ProcessBuilderHook的类,然后在类中新建一个名字为start的静态要领,完全代码以下:

/*
 * Copyright sky 2019-04-04 Email:sky@03sec.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package cn.org.javaweb.agent;

import java.util.Arrays;
import java.util.List;

/**
 * @author sky
 */
public class ProcessBuilderHook {

    public static void start(List<String> commands) {
        String[] commandArr = commands.toArray(new String[commands.size()]);
        System.out.println(Arrays.toString(commandArr));
    }
}

这个要领干啥用的我们一会在说,先看下面。

复写visitMethod要领

翻开TestClassVisitor,对visitMethod要领举行变动。详细代码以下:

@Override
    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
        MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);

        if ("start".equals(name) && "()Ljava/lang/Process;".equals(desc)) {
            System.out.println(name + "要领的描述符是:" + desc);

            return new AdviceAdapter(Opcodes.ASM5, mv, access, name, desc) {
                @Override
                public void visitCode() {

                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitFieldInsn(GETFIELD, "java/lang/ProcessBuilder", "command", "Ljava/util/List;");
                    mv.visitMethodInsn(INVOKESTATIC, "cn/org/javaweb/agent/ProcessBuilderHook", "start", "(Ljava/util/List;)V", false);

                    super.visitCode();
                }
            };
        }
        return mv;
    }

给人人诠释下新增添的代码,从if推断最先

推断传入进来的要领名是不是为start要领描述符是不是为()Ljava/lang/Process;,若是是的话就新建一个AdviceAdapter要领,而且复写visitCode要领,对其字节码举行修正,

mv.visitVarInsn(ALOAD, 0);

拿到栈顶上的this

mv.visitFieldInsn(GETFIELD, "java/lang/ProcessBuilder", "command", "Ljava/util/List;");

拿到this内里的command

mv.visitMethodInsn(INVOKESTATIC, "cn/org/javaweb/agent/ProcessBuilderHook", "start", "(Ljava/util/List;)V", false);

然后挪用我们上面新建的ProcessBuilderHook类中的start要领,将上面拿到的this.command压入我们要领。

ProcessBuilderHook类的作用就是让这部分举行挪用,然后转移就能够转入到我们的逻辑代码了。

我们再次编译一下,然后启动tomcat,接见cmd.jsp看看.

测试hook用户实行的敕令参数是不是拿到

接见

http://localhost:8080/cmd.jsp?cmd=ls%20-la

浅谈RASP手艺攻防之实战[代码完成篇]

能够看到已将以后目录下的内容打印了出来。
我们到idea中看看控制台输出了甚么。
浅谈RASP手艺攻防之实战[代码完成篇]

能够看到我们输入的敕令

[whoami]

已输出出来了,到此为止,我们拿到了要实行的敕令.

总结

关于拿到要实行的敕令今后怎么做,是须要阻拦照样替代照样告警,这边就须要人人本身去完成了。固然,若是要完成阻拦功用,还须要注重要猎取以后要求中的的response,否则没法对response举行复写,也没法对其举行阻拦。这边给人人供应一个思绪,对应阻拦功用,人人能够去hook要求相干的类,然后在风险hook点连系http要求上下文举行阻拦要求。

关于其他攻击点的阻拦,能够参考百度开源的OpenRasp举行编写hook点。

如需在Java中完成RASP手艺,笔者发起好好相识一下ASM,如许对今后JAVA的运行机制也会有肯定的相识,轻易今后调试和写代码。

内核漏洞挖掘技术系列(3)——bochspwn-reloaded(1)

前言 上一篇文章我们讲解了内核double fetch漏洞和Project Zero的j00ru开源的这种漏洞的挖掘工具bochspwn的原理。这一篇文章我们继续讲解内核中未初始化导致的信息泄露漏洞和Project Zero的j00ru开源的同样基于bochs的插桩API实现的这种


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明浅谈RASP手艺攻防之实战[代码完成篇]
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

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

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