This commit is contained in:
wujiawei 2024-09-28 19:01:41 +08:00
parent fb086d6e95
commit 600706ccc1
10 changed files with 113 additions and 35 deletions

View File

@ -56,4 +56,9 @@ public class InternalNetworkClientPermeateClientVisitor implements InternalNetwo
* 访客ID * 访客ID
*/ */
private String visitorId; private String visitorId;
/**
* 是否是ssl
*/
private boolean isSsl;
} }

View File

@ -38,4 +38,10 @@ public class InternalNetworkPermeateServerVisitor implements InternalNetworkPerm
*/ */
private List<HandleChannelTypeAdvanced> handleChannelTypeAdvancedList; private List<HandleChannelTypeAdvanced> handleChannelTypeAdvancedList;
/**
* 是否是ssl
*/
private boolean isSsl;
} }

View File

@ -51,5 +51,17 @@ public interface InternalNetworkPermeate {
*/ */
void setVisitorPort(Integer visitorPort); void setVisitorPort(Integer visitorPort);
/**
* 是否是ssl
*
* @return
*/
boolean isSsl();
/**
* 设置ssl
*/
void setSsl(boolean ssl);
} }

View File

@ -13,7 +13,7 @@ import lombok.experimental.Accessors;
@Builder @Builder
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class InternalNetworkPermeateRealServer { public class InternalNetworkServerPermeateServerRealServer {

View File

@ -0,0 +1,31 @@
package org.framework.lazy.cloud.network.heartbeat.server.netty;
import lombok.Data;
import org.framework.lazy.cloud.network.heartbeat.common.InternalNetworkPermeate;
@Data
public class InternalNetworkServerPermeateServerConf implements InternalNetworkPermeate {
/**
* 目标地址
*/
private String targetIp;
/**
* 目标端口
*/
private Integer targetPort;
/**
* 访问端口
*/
private Integer visitorPort;
/**
* 是否是ssl
*/
private boolean isSsl;
}

View File

@ -3,12 +3,27 @@ package org.framework.lazy.cloud.network.heartbeat.server.netty.filter;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.SocketChannel;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
import lombok.extern.slf4j.Slf4j;
import org.framework.lazy.cloud.network.heartbeat.common.InternalNetworkServerPermeateServerRealServer;
import org.framework.lazy.cloud.network.heartbeat.common.decoder.TransferDecoder; import org.framework.lazy.cloud.network.heartbeat.common.decoder.TransferDecoder;
import org.framework.lazy.cloud.network.heartbeat.common.encoder.TransferEncoder; import org.framework.lazy.cloud.network.heartbeat.common.encoder.TransferEncoder;
import org.framework.lazy.cloud.network.heartbeat.common.filter.DebugChannelInitializer; import org.framework.lazy.cloud.network.heartbeat.common.filter.DebugChannelInitializer;
import org.framework.lazy.cloud.network.heartbeat.server.netty.handler.NettyServerPermeateServerRealHandler; import org.framework.lazy.cloud.network.heartbeat.server.netty.handler.NettyServerPermeateServerRealHandler;
import java.net.URI;
import java.net.URISyntaxException;
@Slf4j
public class NettyServerPermeateServerRealFilter extends DebugChannelInitializer<SocketChannel> { public class NettyServerPermeateServerRealFilter extends DebugChannelInitializer<SocketChannel> {
private final InternalNetworkServerPermeateServerRealServer internalNetworkServerPermeateServerRealServer;
public NettyServerPermeateServerRealFilter(InternalNetworkServerPermeateServerRealServer internalNetworkServerPermeateServerRealServer) {
this.internalNetworkServerPermeateServerRealServer = internalNetworkServerPermeateServerRealServer;
}
/** /**
* This method will be called once the {@link Channel} was registered. After the method returns this instance * This method will be called once the {@link Channel} was registered. After the method returns this instance
* will be removed from the {@link ChannelPipeline} of the {@link Channel}. * will be removed from the {@link ChannelPipeline} of the {@link Channel}.
@ -18,14 +33,21 @@ public class NettyServerPermeateServerRealFilter extends DebugChannelInitializer
@Override @Override
protected void initChannel0(SocketChannel ch) { protected void initChannel0(SocketChannel ch) {
ChannelPipeline pipeline = ch.pipeline(); ChannelPipeline pipeline = ch.pipeline();
// // 适配https Boolean isSsl = internalNetworkServerPermeateServerRealServer.getIsSsl();
// try { if(isSsl){
// SslContext sslContext = SslContextBuilder.forClient() log.info("init channel0 ssl");
// .trustManager(InsecureTrustManagerFactory.INSTANCE).build(); String targetIp = internalNetworkServerPermeateServerRealServer.getClientTargetIp();
// ch.pipeline().addLast(sslContext.newHandler(ch.alloc(), "https://juno.shuhan-juno.com", 443)); Integer targetPort = internalNetworkServerPermeateServerRealServer.getClientTargetPort();
// } catch (SSLException e) { // 适配https
// throw new RuntimeException(e); try {
// } SslContext sslContext = SslContextBuilder.forClient()
.trustManager(InsecureTrustManagerFactory.INSTANCE).build();
pipeline.addLast("ssl", sslContext.newHandler(ch.alloc(),targetIp,targetPort));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 解码编码 // 解码编码
pipeline.addLast(new TransferDecoder(Integer.MAX_VALUE, 1024 * 1024*10)); pipeline.addLast(new TransferDecoder(Integer.MAX_VALUE, 1024 * 1024*10));
pipeline.addLast(new TransferEncoder()); pipeline.addLast(new TransferEncoder());

View File

@ -5,17 +5,17 @@ import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.SocketChannel;
import org.framework.lazy.cloud.network.heartbeat.common.InternalNetworkPermeateRealServer; import org.framework.lazy.cloud.network.heartbeat.common.InternalNetworkServerPermeateServerRealServer;
import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelFlowAdapter; import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelFlowAdapter;
import org.framework.lazy.cloud.network.heartbeat.common.filter.DebugChannelInitializer; import org.framework.lazy.cloud.network.heartbeat.common.filter.DebugChannelInitializer;
import org.framework.lazy.cloud.network.heartbeat.server.netty.handler.NettyServerPermeateServerVisitorHandler; import org.framework.lazy.cloud.network.heartbeat.server.netty.handler.NettyServerPermeateServerVisitorHandler;
public class NettyServerPermeateServerVisitorFilter extends DebugChannelInitializer<SocketChannel> { public class NettyServerPermeateServerVisitorFilter extends DebugChannelInitializer<SocketChannel> {
private final InternalNetworkPermeateRealServer internalNetworkPermeateRealServer; private final InternalNetworkServerPermeateServerRealServer internalNetworkServerPermeateServerRealServer;
private final ChannelFlowAdapter channelFlowAdapter; private final ChannelFlowAdapter channelFlowAdapter;
public NettyServerPermeateServerVisitorFilter(InternalNetworkPermeateRealServer internalNetworkPermeateRealServer, ChannelFlowAdapter channelFlowAdapter) { public NettyServerPermeateServerVisitorFilter(InternalNetworkServerPermeateServerRealServer internalNetworkServerPermeateServerRealServer, ChannelFlowAdapter channelFlowAdapter) {
this.internalNetworkPermeateRealServer = internalNetworkPermeateRealServer; this.internalNetworkServerPermeateServerRealServer = internalNetworkServerPermeateServerRealServer;
this.channelFlowAdapter = channelFlowAdapter; this.channelFlowAdapter = channelFlowAdapter;
} }
@ -32,6 +32,6 @@ public class NettyServerPermeateServerVisitorFilter extends DebugChannelInitiali
protected void initChannel0(SocketChannel ch) throws Exception { protected void initChannel0(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline(); ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new ChannelDuplexHandler()); pipeline.addLast(new ChannelDuplexHandler());
pipeline.addLast(new NettyServerPermeateServerVisitorHandler(internalNetworkPermeateRealServer, channelFlowAdapter)); pipeline.addLast(new NettyServerPermeateServerVisitorHandler(internalNetworkServerPermeateServerRealServer, channelFlowAdapter));
} }
} }

View File

@ -7,10 +7,11 @@ import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOption; import io.netty.channel.ChannelOption;
import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.SimpleChannelInboundHandler;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.framework.lazy.cloud.network.heartbeat.common.InternalNetworkPermeateRealServer; import org.framework.lazy.cloud.network.heartbeat.common.InternalNetworkServerPermeateServerRealServer;
import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelFlowAdapter; import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelFlowAdapter;
import org.framework.lazy.cloud.network.heartbeat.common.enums.ChannelFlowEnum; import org.framework.lazy.cloud.network.heartbeat.common.enums.ChannelFlowEnum;
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils; import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
import org.framework.lazy.cloud.network.heartbeat.server.netty.InternalNetworkServerPermeateServerConf;
import org.framework.lazy.cloud.network.heartbeat.server.netty.flow.ServerChannelFlow; import org.framework.lazy.cloud.network.heartbeat.server.netty.flow.ServerChannelFlow;
import org.framework.lazy.cloud.network.heartbeat.server.netty.socket.NettyServerPermeateServerConnectRealSocket; import org.framework.lazy.cloud.network.heartbeat.server.netty.socket.NettyServerPermeateServerConnectRealSocket;
@ -18,12 +19,12 @@ import java.util.UUID;
@Slf4j @Slf4j
public class NettyServerPermeateServerVisitorHandler extends SimpleChannelInboundHandler<ByteBuf> { public class NettyServerPermeateServerVisitorHandler extends SimpleChannelInboundHandler<ByteBuf> {
private final InternalNetworkPermeateRealServer internalNetworkPermeateRealServer; private final InternalNetworkServerPermeateServerRealServer internalNetworkServerPermeateServerRealServer;
private final ChannelFlowAdapter channelFlowAdapter;// 流量适配器 private final ChannelFlowAdapter channelFlowAdapter;// 流量适配器
// private final NettyChannelPool nettyChannelPool = new DefaultNettyChannelPool(10); // private final NettyChannelPool nettyChannelPool = new DefaultNettyChannelPool(10);
public NettyServerPermeateServerVisitorHandler(InternalNetworkPermeateRealServer internalNetworkPermeateRealServer, ChannelFlowAdapter channelFlowAdapter) { public NettyServerPermeateServerVisitorHandler(InternalNetworkServerPermeateServerRealServer internalNetworkServerPermeateServerRealServer, ChannelFlowAdapter channelFlowAdapter) {
this.internalNetworkPermeateRealServer = internalNetworkPermeateRealServer; this.internalNetworkServerPermeateServerRealServer = internalNetworkServerPermeateServerRealServer;
this.channelFlowAdapter = channelFlowAdapter; this.channelFlowAdapter = channelFlowAdapter;
} }
@ -42,9 +43,10 @@ public class NettyServerPermeateServerVisitorHandler extends SimpleChannelInboun
// 判断是否有可用的通道 如果没有创建新的通道 // 判断是否有可用的通道 如果没有创建新的通道
log.info("开始准备绑定渗透真实通道: {}", internalNetworkPermeateRealServer.getVisitorPort()); log.info("开始准备绑定渗透真实通道: {}", internalNetworkServerPermeateServerRealServer.getVisitorPort());
// 创建这是客户端通道池 // 创建这是客户端通道池
NettyServerPermeateServerConnectRealSocket.buildRealServer(internalNetworkPermeateRealServer, visitorChannel, visitorId);
NettyServerPermeateServerConnectRealSocket.buildRealServer(internalNetworkServerPermeateServerRealServer, visitorChannel, visitorId);
log.info("内网渗透 服务端访客端口连接成功了"); log.info("内网渗透 服务端访客端口连接成功了");
@ -56,7 +58,7 @@ public class NettyServerPermeateServerVisitorHandler extends SimpleChannelInboun
// 访客通道 // 访客通道
Channel visitorChannel = ctx.channel(); Channel visitorChannel = ctx.channel();
Integer visitorPort = internalNetworkPermeateRealServer.getVisitorPort(); Integer visitorPort = internalNetworkServerPermeateServerRealServer.getVisitorPort();
byte[] bytes = new byte[buf.readableBytes()]; byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes); buf.readBytes(bytes);
// 获取客户端通道而后进行数据下发 // 获取客户端通道而后进行数据下发

View File

@ -6,7 +6,7 @@ import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.channel.socket.nio.NioSocketChannel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.framework.lazy.cloud.network.heartbeat.common.InternalNetworkPermeateRealServer; import org.framework.lazy.cloud.network.heartbeat.common.InternalNetworkServerPermeateServerRealServer;
import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils; import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
import org.framework.lazy.cloud.network.heartbeat.server.netty.filter.NettyServerPermeateServerRealFilter; import org.framework.lazy.cloud.network.heartbeat.server.netty.filter.NettyServerPermeateServerRealFilter;
@ -22,23 +22,23 @@ public class NettyServerPermeateServerConnectRealSocket {
/** /**
* 连接真实服务 * 连接真实服务
* *
* @param internalNetworkPermeateRealServer 访客信息 * @param internalNetworkServerPermeateServerRealServer 访客信息
*/ */
public static void buildRealServer(InternalNetworkPermeateRealServer internalNetworkPermeateRealServer,Channel visitorChannel ,String visitorId) { public static void buildRealServer(InternalNetworkServerPermeateServerRealServer internalNetworkServerPermeateServerRealServer, Channel visitorChannel , String visitorId) {
buildNewRealServer(internalNetworkPermeateRealServer,visitorChannel,visitorId); buildNewRealServer(internalNetworkServerPermeateServerRealServer,visitorChannel,visitorId);
} }
/** /**
* @param internalNetworkPermeateRealServer 访客信息 * @param internalNetworkServerPermeateServerRealServer 访客信息
* @param visitorChannel * @param visitorChannel
* @param visitorId * @param visitorId
*/ */
private static void buildNewRealServer(InternalNetworkPermeateRealServer internalNetworkPermeateRealServer, private static void buildNewRealServer(InternalNetworkServerPermeateServerRealServer internalNetworkServerPermeateServerRealServer,
Channel visitorChannel, String visitorId) { Channel visitorChannel, String visitorId) {
try { try {
String clientTargetIp = internalNetworkPermeateRealServer.getClientTargetIp(); String clientTargetIp = internalNetworkServerPermeateServerRealServer.getClientTargetIp();
Integer clientTargetPort = internalNetworkPermeateRealServer.getClientTargetPort(); Integer clientTargetPort = internalNetworkServerPermeateServerRealServer.getClientTargetPort();
Integer visitorPort = internalNetworkPermeateRealServer.getVisitorPort(); Integer visitorPort = internalNetworkServerPermeateServerRealServer.getVisitorPort();
Bootstrap bootstrap = new Bootstrap(); Bootstrap bootstrap = new Bootstrap();
bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class)
// 设置读缓冲区为2M // 设置读缓冲区为2M
@ -50,7 +50,7 @@ public class NettyServerPermeateServerConnectRealSocket {
// .option(ChannelOption.SO_BACKLOG, 128)//务端接受连接的队列长度 默认128 // .option(ChannelOption.SO_BACKLOG, 128)//务端接受连接的队列长度 默认128
// .option(ChannelOption.RCVBUF_ALLOCATOR, new NettyRecvByteBufAllocator(1024 * 1024))//用于Channel分配接受Buffer的分配器 默认AdaptiveRecvByteBufAllocator.DEFAULT // .option(ChannelOption.RCVBUF_ALLOCATOR, new NettyRecvByteBufAllocator(1024 * 1024))//用于Channel分配接受Buffer的分配器 默认AdaptiveRecvByteBufAllocator.DEFAULT
.option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 1024 * 1024 * 2)) .option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 1024 * 1024 * 2))
.handler(new NettyServerPermeateServerRealFilter()) .handler(new NettyServerPermeateServerRealFilter(internalNetworkServerPermeateServerRealServer))
; ;
@ -77,7 +77,7 @@ public class NettyServerPermeateServerConnectRealSocket {
} else { } else {
log.error("服务端内网渗透 无法连接当前网络内的目标IP【{}】,目标端口:【{}】", clientTargetIp, clientTargetPort); log.error("服务端内网渗透 无法连接当前网络内的目标IP【{}】,目标端口:【{}】", clientTargetIp, clientTargetPort);
channelFuture.channel().eventLoop().schedule(() -> { channelFuture.channel().eventLoop().schedule(() -> {
buildNewRealServer(internalNetworkPermeateRealServer, visitorChannel, visitorId); buildNewRealServer(internalNetworkServerPermeateServerRealServer, visitorChannel, visitorId);
}, 2, TimeUnit.SECONDS); }, 2, TimeUnit.SECONDS);
} }
}); });

View File

@ -7,7 +7,7 @@ import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.framework.lazy.cloud.network.heartbeat.common.InternalNetworkPermeateRealServer; import org.framework.lazy.cloud.network.heartbeat.common.InternalNetworkServerPermeateServerRealServer;
import org.framework.lazy.cloud.network.heartbeat.common.NettyPermeateVisitorContext; import org.framework.lazy.cloud.network.heartbeat.common.NettyPermeateVisitorContext;
import org.framework.lazy.cloud.network.heartbeat.common.NettyVisitorPortContext; import org.framework.lazy.cloud.network.heartbeat.common.NettyVisitorPortContext;
import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelFlowAdapter; import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelFlowAdapter;
@ -200,7 +200,7 @@ public class NettyServerPermeateServerConnectVisitorSocket {
if (permeateVisitorPort == null) { if (permeateVisitorPort == null) {
throw new IllegalArgumentException("visitorPort must not null"); throw new IllegalArgumentException("visitorPort must not null");
} }
InternalNetworkPermeateRealServer internalNetworkPermeateRealServer = InternalNetworkPermeateRealServer InternalNetworkServerPermeateServerRealServer internalNetworkServerPermeateServerRealServer = InternalNetworkServerPermeateServerRealServer
.builder() .builder()
.clientTargetIp(clientTargetIp) .clientTargetIp(clientTargetIp)
.clientTargetPort(clientTargetPort) .clientTargetPort(clientTargetPort)
@ -208,7 +208,7 @@ public class NettyServerPermeateServerConnectVisitorSocket {
.isSsl(isSsl) .isSsl(isSsl)
.build(); .build();
NettyServerPermeateServerVisitorFilter nettyServerPermeateServerVisitorFilter = new NettyServerPermeateServerVisitorFilter(internalNetworkPermeateRealServer, channelFlowAdapter); NettyServerPermeateServerVisitorFilter nettyServerPermeateServerVisitorFilter = new NettyServerPermeateServerVisitorFilter(internalNetworkServerPermeateServerRealServer, channelFlowAdapter);
return new NettyServerPermeateServerConnectVisitorSocket(nettyServerPermeateServerVisitorFilter, permeateVisitorPort); return new NettyServerPermeateServerConnectVisitorSocket(nettyServerPermeateServerVisitorFilter, permeateVisitorPort);
} }