Java 端口映射辅助
刚写好这小玩意,发现好像有小伙伴儿在捣乱,博客一直以来都是拿来随意记录下平时的代码什么的。之前都随便托管在一主机商,前段时间买了几个VPS一直没用上,现在就随便找个VPS腾了下。
身处内网,操作什么的很不方便反弹个shell什么的都很麻烦。远控之类的有端口映射功能,可以先在公网IP上开一个端口(如9527),然后反弹shell到目标9527端口。9527端口再转发到自己的1080端口做数据交互,同时用本地程序和数据交互端口1080通信再次交换数据即可。本地再提供一个1080代理,代码如下:
RemoteConnector.java
import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.logging.Logger; public class RemoteConnector extends Thread { InputStream is; OutputStream os; static final Logger logger = Logger.getLogger(RemoteConnector.class.getName()); public RemoteConnector() { } public RemoteConnector(InputStream is, OutputStream os) { this.is = is; this.os = os; } public void run() { InputStream in = null; OutputStream out = null; try { in = this.is; byte[] b = new byte[8192]; int length; out = this.os; while ((length = in.read(b)) > 0) { out.write(b, 0, length); out.flush(); } } catch (Exception e) { e.printStackTrace(); }finally{ try { if (in != null){ in.close(); } if (out != null){ out.close(); } } catch (Exception e) { logger.info(e.toString()); } } } public void startX(){ new Sb1().start(); new Sb2().start(); } public static void main(String[] args) { new RemoteConnector().startX(); } class Sb1 extends Thread{ Socket local; public void startX() throws Exception{ int port = 1080; ServerSocket ss = new ServerSocket(port); logger.info("监听端口:"+port); while(true){ Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); if("127.0.0.1".equals(ip)){ logger.info("建立本地连接成功!"); this.local = s; }else{ if(this.local!=null){ try { logger.info("开始传输数据到:"+ip); (new RemoteConnector(s.getInputStream(), this.local.getOutputStream())).start(); (new RemoteConnector(this.local.getInputStream(), s.getOutputStream())).start(); } catch (Exception e) { throw e;//抛出异常,等待重新连接 } } } } } public void run(){ try { startX(); } catch (Exception e) { logger.info(this.getClass()+"-通信异常:"+e.toString()+"\n重新启动...."); } } } class Sb2 extends Thread{ public void startX() throws Exception{ int port = 9527; String forwardHost = "127.0.0.1"; int forwardPort = 1080; ServerSocket ss = new ServerSocket(port); logger.info("监听端口:"+port); while(true){ Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); logger.info("主机:"+ip+",连接成功!"); Socket socket = new Socket(forwardHost, forwardPort); logger.info("转发到:"+forwardHost+",端口:"+forwardPort); (new RemoteConnector(socket.getInputStream(), s.getOutputStream())).start(); (new RemoteConnector(s.getInputStream(), socket.getOutputStream())).start(); } } public void run(){ try { startX(); } catch (Exception e) { logger.info(this.getClass()+"-通信异常:"+e.toString()+"\n重新启动...."); } } } }
LocalConnector.java
import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.logging.Logger; public class LocalConnector extends Thread { InputStream is; OutputStream os; static final Logger logger = Logger.getLogger(LocalConnector.class.getName()); public LocalConnector(InputStream is, OutputStream os) { this.is = is; this.os = os; } public void run() { InputStream in = null; OutputStream out = null; try { in = this.is; out = this.os; byte buffer[] = new byte[8192]; int a; while ((a = in.read(buffer)) > 0) { out.write(buffer, 0, a); out.flush(); } } catch (Exception e) { e.printStackTrace(); }finally{ try { if (in != null){ in.close(); } if (out != null){ out.close(); } } catch (Exception e) { logger.info(e.toString()); } } } public static void main(String[] args) { try { int port = 1080; String forwardHost = "23.244.180.74"; int forwardPort = 1080; ServerSocket ss = new ServerSocket(port); logger.info("监听端口:"+port); while(true){ try { Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); logger.info("Host:"+ip+",连接成功!"); Socket socket = new Socket(forwardHost, forwardPort); logger.info("转发到:"+forwardHost+",端口:"+forwardPort); (new LocalConnector(socket.getInputStream(), s.getOutputStream())).start(); (new LocalConnector(s.getInputStream(), socket.getOutputStream())).start(); } catch (Exception e) { logger.info(e.toString()); } } } catch (Exception e) { e.printStackTrace(); } } }