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