前言
最近实在忙,也没时间写文章了,妥妥的纯牛马。部的HVV刚结束,调休还没来得及用,没想到各地市的HVV接着拉开了帷幕,这次总成果都还不错,名次也不错,这次的案例也值得分享一下。目标单位之一规模很大,也比较有钱,安全方面的预算据了解到的也比较足,所以整体上这家单位觉得还是比较难拿下的,但是比较有意思的是今年的红队也和去年的一场红队一样,同样突破后是出口墙。
防火墙SSLVPN配置
弱口令登录DP防火墙直接开始配置
全局配置
需要勾选开启SSL VPN服务器,等配置完成后访问IP+6443即可访问VPN
此配置无需修改,使用默认即可,后期SSLvpn给客户端分配的地址池,其它选项无需配置
资源管理
配置VPN的资源,这里仅需要配置IP资源配置和资源组配置
在资源组配置中添加资源配置添加的几个地址段
这里资源组配置的时候添加的地址段为组网配置的的接口内网地址段
用户管理
添加用户成功后即可使用添加的用户进行vpn配置登录了,登录之后即可获取到资源列表
内网横向
探测内网业务段
由于根据防火墙接口了解内网网段情况,直接进行都目标段的信息搜集和扫描。为了规避安全设备的感知,这里我使用的ai协助先把主机明探测了一遍,方便了解各个地址段所处的网络状态。
这里探测主机由于需要规避安全设备,需要考虑两点
防止局域网内禁ping协议开启
防止速度过快导致设备告警,当然不同的设备在捕获到ICMP协议的告警端口不一致,比如某服的SIP端口为0,某3的端口为2048等。
udp扫描一般使用的比较少,大多数的扫描工具扫描一般使用的是TCP协议。
这里我使用UDP协议暂时使用137端口进行主机主机名探测,探测到主机名和具体的ip地址段后再针对不用的业务进行批量的漏洞扫描
这里分享脚本:
import subprocess
import time
import random
import ipaddress
def get_hosts_with_names(ip_range):
network = ipaddress.ip_network(ip_range, strict=False)
ip_list = list(network.hosts())
random.shuffle(ip_list) # 随机化 IP 列表
for ip in ip_list:
try:
result = subprocess.run(['nbtstat', '-A', str(ip)], capture_output=True, text=True, check=True)
if "UNIQUE" in result.stdout:
print(f"Host: {ip}")
print(result.stdout)
except subprocess.CalledProcessError as e:
print(f"Error occurred while scanning {ip}: {e}")
# 随机延迟在 10ms 到 2 秒之间
delay = random.uniform(0.01, 2)
time.sleep(delay)
def main():
ip_range = input("Enter the CIDR network range (e.g., 192.168.1.0/24): ")
get_hosts_with_names(ip_range)
if __name__ == "__main__":
main()
时间比较慢,效果还不错,间隔时间越久效果越OK。但是之后建议使用nbtscan配合python脚本使用,时间间隔随机数尽可能的放的更更长以及对增加对7680以及1024等其它物业端口进行遍历扫描。这些端口在今年24年HVV行动中一些厂商设备的误报的基础上建议增加的,更容易规避被发现的风险。文件过大输出到文档中。
基本上根据扫描的结果可以大概的分析出目标的单位的网络图谱情况
探测办公网打印机
找到业务办公网这里可以仅针对打印机端口UDP端口9100扫描
import socket
import time
import random
import ipaddress
def scan_port(ip, port):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1) # 设置超时时间为1秒
result = sock.connect_ex((ip, port))
sock.close()
return result == 0
except Exception as e:
print(f"Error scanning {ip}:{port} - {e}")
return False
def main():
cidr = input("Enter the CIDR (e.g., 10.1.1.1/8): ")
try:
network = ipaddress.ip_network(cidr, strict=False)
except ValueError as e:
print(f"Invalid CIDR: {e}")
return
for ip in network.hosts():
ip_str = str(ip)
# 扫描7680端口但不判断结果
scan_port(ip_str, 7680)
# 扫描9100端口并仅打印开放的IP
if scan_port(ip_str, 9100):
print(f"Port 9100 is open on {ip_str}")
# 随机延迟时间,范围在10毫秒到3秒之间
delay = random.uniform(0.01, 3)
time.sleep(delay)
if __name__ == "__main__":
main()
根据扫描结果获取大量的打印机,这里手动增加端口,规避批量扫描的风险
访问打印机自己加端口80或者443一般都可,无需再扫描端口
当然对于打印机来说,默认情况下FTP是开启的,为得分是可以尝试连接,批量匿名用户登录截图即可
由于已经摸清网络拓扑架构,吃饭时间直接开始拼手速,确保短平快的结束内网。扫描服务器段发现存在ssh弱口令
连接服务器发现可出网,权限维持,linux主机直接使用nps权限维持即可,多做几个隧道,防止VPN被发现。
比较遗憾,还是被发现了,防火墙vpn的入口被切掉了,脚本的扫描确实太耗时了,比较幸运的是拼手速做的隧道还在。
决定利用跳板直接一把梭
使用工具对内网办公网进行若口令爆破,考虑目标单位的特殊性,直接使用的是密码为
123
0
1
000000
888888
这四个弱口令进行的爆破,巧合的是内网大量的终端口令均为X
巧合的是第二台机器RDP连接发现为运维机
连接RDP发现该运维桌面上存在运维工作台的客户端
登录控制服务器+终端六百多台
但是比较有意思的运维终端无网络设备的权限,无密码记录但是有连接记录,接下来是重点
微信查询聊天记录
远程运维机后,运维机的微信是登录在线的,根据记录搜索聊天记录的密码
根据运维群群名搜索
连接卡巴服务器
这里可以利用卡巴下发任务服务器批量上线,因为考虑到担心影响业务,上报裁判组后到此为止,利用EDR批量控制下发文件上线的操作不算难
根据运维人员同事聊天记录搜索
发现大量的安全设备以及网络设备的密码,连接核心汇聚等交换机
同时利用运维机器浏览器保存的应用系统的账号密码登录系统取证,这里给上截图
到此,目标单位全部打穿。
小结
本次红队本来是打算规避一下防守队来进行,但是动作还是被发现了,一把梭之前可能被发现是因为队友做其它扫描了,因为脚本的扫描延迟是在2s之上的,以某服的态感规则为例,扫描类的阈值是放在2s的。如果没有自定义的剧本来监测行为一般还是很难发现的。
这个案例比较值有意义值得记录的有五点
- 利用边界出口防火墙启用SSLVPN实现突破边界
- 运维机的微信聊天记录查询关键词实现控制EDR
- 扫描增加时间延时规避设备感知
- 在获取拼手速阶段获取的linux主机都出网,及时的搭建好了多个隧道
- 大成果的突破点不单单局限于服务器区,同样办公网突破的成果是巨大的、
比较取巧的有三点
- 办公网巧合的获取运维机的权限
- 运维人员的微信在线
- 运维工作台C/S架构的记住密码导致对该目标直接被打穿。
值得强调的是在红队攻击的过程中对于边界设备的利用不要单单局限于传统的VPN设备,比如通过防火墙自己划分资源开启SSLVPN实现成果扩大也是很好的选择。本次红队中一把梭没有从服务器区开始是考虑到服务器区的边界防护必定要强于办公网,这点儿的决策也是正确的。