Java 端口映射辅助

yzmm
665 阅读
刚写好这小玩意,发现好像有小伙伴儿在捣乱,博客一直以来都是拿来随意记录下平时的代码什么的。之前都随便托管在一主机商,前段时间买了几个VPS一直没用上,现在就随便找个VPS腾了下。

身处内网,操作什么的很不方便反弹个shell什么的都很麻烦。远控之类的有端口映射功能,可以先在公网IP上开一个端口(如9527),然后反弹shell到目标9527端口。9527端口再转发到自己的1080端口做数据交互,同时用本地程序和数据交互端口1080通信再次交换数据即可。本地再提供一个1080代理,代码如下:

1

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();
		}
	}
}

评论 (0)

发表评论