SuperAPI AI 工具集

performing-authenticated-vulnerability-scan

安全与审计

查看项目

更新于 10-15 13:55

技能介绍

用途

认证(凭据)漏洞扫描使用有效的系统凭据登录目标主机,对已安装软件、补丁、配置和安全设置进行深度检查。相比非认证扫描,凭据扫描能多检测出 45-60% 的漏洞,且误报显著更少,因为它可以直接查询已安装的软件包、注册表键和文件系统内容。

何时使用

  • 进行涉及认证漏洞扫描的安全评估时
  • 遵循相关安全事件的事件响应流程时
  • 执行计划的安全测试或审计活动时
  • 通过动手测试验证安全控制时

前提条件

  • 漏洞扫描器(Nessus、Qualys、OpenVAS、Rapid7 InsightVM)
  • 在目标系统上具有适当权限的服务账号
  • 安全的凭据存储(推荐使用保险库集成)
  • 从扫描器到目标管理端口的网络访问
  • 系统所有者的书面授权

核心概念

为什么使用认证扫描

非认证扫描只能评估外部可见的服务和横幅,通常导致:

  • 遗漏本地安装软件中的漏洞
  • 因横幅变化导致版本检测不准确
  • 无法检查补丁级别、配置或本地策略
  • 基于推断的检测导致更高的误报率

认证扫描通过直接查询目标操作系统来解决这些问题。

各平台凭据类型

Linux/Unix 系统

  • SSH 密钥认证:RSA/Ed25519 密钥对(推荐)
  • SSH 用户名/密码:无密钥认证系统的回退方案
  • Sudo/Su 提权:具有 sudo 权限的非 root 用户
  • 基于证书的 SSH:企业环境使用 X.509 证书

Windows 系统

  • SMB(Windows):域或本地管理员凭据
  • WMI:Windows 管理规范查询
  • WinRM:Windows 远程管理(推荐 HTTPS)
  • Kerberos:使用服务票据的域认证

网络设备

  • SNMP v3:带认证和隐私(AES-256)的 USM
  • SSH:用于 Cisco IOS、Juniper JunOS、Palo Alto PAN-OS
  • API 令牌:现代网络平台的 REST API

数据库

  • Oracle:SYS/SYSDBA 凭据或 TNS 连接
  • Microsoft SQL Server:Windows 认证或 SQL 认证
  • PostgreSQL:基于角色的认证
  • MySQL:具有 SELECT 权限的用户/密码

工作流程

步骤 1:创建专用服务账号

# Linux: Create scan service account
sudo useradd -m -s /bin/bash -c "Vulnerability Scanner Service Account" nessus_svc
sudo usermod -aG sudo nessus_svc

# Configure sudo for passwordless specific commands
echo 'nessus_svc ALL=(ALL) NOPASSWD: /usr/bin/dpkg -l, /usr/bin/rpm -qa, \
/bin/cat /etc/shadow, /usr/sbin/dmidecode, /usr/bin/find' | sudo tee /etc/sudoers.d/nessus_svc

# Generate SSH key pair
sudo -u nessus_svc ssh-keygen -t ed25519 -f /home/nessus_svc/.ssh/id_ed25519 -N ""

# Distribute public key to targets
for host in $(cat target_hosts.txt); do
    ssh-copy-id -i /home/nessus_svc/.ssh/id_ed25519.pub nessus_svc@$host
done
# Windows: Create scan service account via PowerShell
New-ADUser -Name "SVC_VulnScan" `
    -SamAccountName "SVC_VulnScan" `
    -UserPrincipalName "SVC_VulnScan@domain.local" `
    -Description "Vulnerability Scanner Service Account" `
    -PasswordNeverExpires $true `
    -CannotChangePassword $true `
    -Enabled $true `
    -AccountPassword (Read-Host -AsSecureString "Enter Password")

# Add to local Administrators group on targets via GPO or:
Add-ADGroupMember -Identity "Domain Admins" -Members "SVC_VulnScan"
# For least privilege, use a dedicated GPO for local admin rights instead

# Enable WinRM on targets
Enable-PSRemoting -Force
Set-Item WSMan:\localhost\Service\AllowRemote -Value $true
winrm set winrm/config/service '@{AllowUnencrypted="false"}'

步骤 2:配置扫描器凭据

Nessus 配置示例:

{
  "credentials": {
    "add": {
      "Host": {
        "SSH": [{
          "auth_method": "public key",
          "username": "nessus_svc",
          "private_key": "/path/to/id_ed25519",
          "elevate_privileges_with": "sudo",
          "escalation_account": "root"
        }],
        "Windows": [{
          "auth_method": "Password",
          "username": "DOMAIN\\SVC_VulnScan",
          "password": "stored_in_vault",
          "domain": "domain.local"
        }],
        "SNMPv3": [{
          "username": "nessus_snmpv3",
          "security_level": "authPriv",
          "auth_algorithm": "SHA-256",
          "auth_password": "stored_in_vault",
          "priv_algorithm": "AES-256",
          "priv_password": "stored_in_vault"
        }]
      }
    }
  }
}

步骤 3:验证凭据访问

# Test SSH connectivity
ssh -i /path/to/key -o ConnectTimeout=10 nessus_svc@target_host "uname -a && sudo dpkg -l | head -5"

# Test WinRM connectivity
python3 -c "
import winrm
s = winrm.Session('target_host', auth=('DOMAIN\\\\SVC_VulnScan', 'password'), transport='ntlm')
r = s.run_cmd('systeminfo')
print(r.std_out.decode())
"

# Test SNMP v3 connectivity
snmpwalk -v3 -u nessus_snmpv3 -l authPriv -a SHA-256 -A authpass -x AES-256 -X privpass target_host sysDescr.0

步骤 4:运行认证扫描

使用 Nessus API 配置并启动扫描:

# Create scan with credentials
curl -k -X POST https://nessus:8834/scans \
  -H "X-Cookie: token=$TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "uuid": "'$TEMPLATE_UUID'",
    "settings": {
      "name": "Authenticated Scan - Production",
      "text_targets": "192.168.1.0/24",
      "launch": "ON_DEMAND"
    },
    "credentials": {
      "add": {
        "Host": {
          "SSH": [{"auth_method": "public key", "username": "nessus_svc", "private_key": "/keys/id_ed25519"}],
          "Windows": [{"auth_method": "Password", "username": "DOMAIN\\SVC_VulnScan", "password": "vault_ref"}]
        }
      }
    }
  }'

步骤 5:验证凭据成功

扫描完成后,检查凭据验证结果:

  • 插件 19506(Nessus 扫描信息):显示凭据状态
  • 插件 21745(操作系统安全补丁评估):确认本地检查
  • 插件 117887(本地安全检查):凭据验证
  • 插件 110385(Nessus 凭据检查):目标级认证状态

凭据安全最佳实践

  • 使用机密保险库(HashiCorp Vault、CyberArk、AWS Secrets Manager)存储凭据
  • 每 90 天或在人员变动后轮换凭据
  • 最小权限原则——仅授予最低必要访问权限
  • 审计凭据使用——监控服务账号登录事件
  • 传输加密——优先使用 SSH 密钥而非密码,WinRM 使用 HTTPS
  • 每个扫描器使用独立账号——切勿跨工具共享凭据
  • 尽可能禁用扫描服务账号的交互式登录
  • 在 SIEM 中记录扫描账号的所有认证事件

常见陷阱

  • 使用域管理员账号而非最小权限服务账号
  • 在扫描配置中以明文存储凭据
  • 扫描启动前未测试凭据(导致浪费扫描窗口)
  • 忘记为 Linux 目标配置 sudo/提权
  • Windows UAC 阻止远程凭据检查
  • 防火墙规则阻止扫描器与目标之间的 WMI/WinRM/SSH
  • 多次认证失败导致凭据锁定

相关技能

  • scanning-infrastructure-with-nessus
  • performing-network-vulnerability-assessment
  • implementing-continuous-vulnerability-monitoring