
Enterprise vulnerability management on Azure — Terraform-deployed Nessus scanner, credentialed scanning, CVE-2013-3900 remediation with verified re-scan
Full vulnerability management lifecycle — scan, find, fix, verify — executed against my live Azure Active Directory lab environment using a dedicated, Terraform-deployed Nessus scanner.
I deployed a dedicated Ubuntu 24.04 scanner VM into my existing Azure AD lab environment, ran an unauthenticated baseline scan and a credentialed scan against a domain controller, a file server, and a domain-joined client, analyzed the results, remediated a High-severity finding (CVE-2013-3900) via PowerShell registry hardening, and verified the fix with a re-scan. This is the complete workflow enterprise vulnerability management programs run continuously.
| Unauthenticated Baseline | Credentialed Scan | |
|---|---|---|
| Findings | 35 | 64 |
| Visibility | External attack surface only — the attacker's view | Inside the OS — patch levels, registry configuration, local checks |
| Authentication | Fail (all 3 hosts) | Windows credentials via NTLMv2, never sent in the clear |
| Scan time | 15 minutes | 23 minutes |
That jump in findings is the entire argument for credentialed scanning — the High-severity CVE-2013-3900 finding I remediated in this lab is a local check that the unauthenticated scan could not see at all.
Dedicated NESSUS01 scanner appliance on Subnet-Servers with credentialed scan paths to all three Windows targets. Management plane reachable only via SSH tunnel from the admin workstation — port 8834 is never exposed publicly.
The scanner joins the existing lab VNet from my Enterprise Azure Infrastructure Automation series, deployed as an independent Terraform configuration with its own remote state.
| Host | Role | OS | Private IP |
|---|---|---|---|
| NESSUS01 | Vulnerability scanner | Ubuntu 24.04 LTS | 10.0.1.8 |
| DC01 | Domain controller (lab.local) | Windows Server 2025 | 10.0.1.5 |
| FS01 | File server | Windows Server 2025 | 10.0.1.6 |
| CLIENT01 | Domain-joined workstation | Windows 11 Pro | 10.0.1.7 |
Design decisions I made:
data blocks rather than duplicating them, with state isolated in its own nessus-scanner.tfstate key so the scanner can be created and destroyed without touching the core lab state.ssh -L 8834:localhost:8834). Management-plane exposure is the number one way scanner appliances get compromised.Before deploying anything, I audited the existing NSG rules — and found exactly the kind of misconfiguration this lab exists to catch: the RDP rule allowed source * (any IP on the internet).
Pre-flight audit: az network nsg list query exposes Allow-RDP-3389 open to any source (*).
I tightened it to my current public IP before proceeding:
az network nsg rule update -g RG-FileServerLab --nsg-name NSG-RDP \
-n Allow-RDP-3389 --source-address-prefixes $(curl -s ifconfig.me)
The same rule after remediation — source restricted to a single admin IP.
Finding and fixing an exposure in your own environment before pointing a scanner at it is the mindset shift from "running a tool" to "doing security."
Five resources — public IP, NSG, NIC, NSG association, and the Ubuntu VM — deployed in under two minutes:
terraform apply: 5 added, 0 changed, 0 destroyed. Outputs include the ready-to-use SSH command.
I then connected over SSH and performed the headless Nessus Essentials 10.12.1 install:
First SSH connection to NESSUS01 with key-based auth — Ubuntu 24.04 up at 10.0.1.8, ready for the headless Nessus install.
First scan: no credentials — this is what an attacker on the network segment sees.
Basic Network Scan targeting all three hosts: 10.0.1.5, 10.0.1.6, 10.0.1.7.
Baseline results: 35 findings across 3 hosts, Auth column showing Fail — Nessus could not log in, so every result comes from external observation only.
Credentialed scanning is the enterprise standard for internal vulnerability management. I prepared the Windows targets by enabling the Remote Registry service and opening the required firewall rule groups on the Domain profile:
Set-Service -Name RemoteRegistry -StartupType Automatic
Start-Service RemoteRegistry
Set-NetFirewallRule -DisplayGroup "File and Printer Sharing" -Enabled True -Profile Domain
Set-NetFirewallRule -DisplayGroup "Windows Management Instrumentation (WMI)" -Enabled True -Profile Domain
Target preparation on FS01 — RemoteRegistry running with Automatic startup, WMI and File & Printer Sharing rules enabled for the Domain profile.
I configured Windows credentials in the scan with the security options enterprises require: never send credentials in the clear, and NTLMv2 only.
Windows credential configuration — domain LAB, NTLMv1 disabled, cleartext credential transmission disabled, Remote Registry auto-start enabled for the scan.
Credentialed results: 64 findings — an 83% increase over the unauthenticated baseline against the exact same three hosts.
Severity-sorted findings, with the High-severity WinVerifyTrust local check now visible — a finding the unauthenticated scan had no way to detect.
Plugin #166555 flagged WinVerifyTrust Signature Validation (CVE-2013-3900) on both DC01 and FS01 — CVSS v3 base score 8.8, Tenable VPR 9.0. The EnableCertPaddingCheck registry value was missing, leaving the hosts in a state where an attacker could append malicious content to a signed executable without invalidating its Authenticode signature.
Full finding analysis: plugin output confirms the registry value is absent on 10.0.1.5 and 10.0.1.6, with the exact remediation path documented in the Solution section.
Why this finding matters: it is a mitigation-by-configuration vulnerability — no patch exists because Microsoft made the fix opt-in. It shipped missing on fresh Windows Server 2025 images in 2026, thirteen years after the CVE was published. This is exactly the class of issue only credentialed scanning and configuration management catch.
I applied the fix on the affected hosts per the plugin's Solution section — setting EnableCertPaddingCheck = 1 at both the 64-bit and Wow6432Node registry paths — then verified both keys before re-scanning:
New-Item -Path "HKLM:\Software\Microsoft\Cryptography\Wintrust\Config" -Force | Out-Null
Set-ItemProperty -Path "HKLM:\Software\Microsoft\Cryptography\Wintrust\Config" `
-Name "EnableCertPaddingCheck" -Value "1" -Type String
New-Item -Path "HKLM:\Software\Wow6432Node\Microsoft\Cryptography\Wintrust\Config" -Force | Out-Null
Set-ItemProperty -Path "HKLM:\Software\Wow6432Node\Microsoft\Cryptography\Wintrust\Config" `
-Name "EnableCertPaddingCheck" -Value "1" -Type String
Remediation applied and verified with Get-ItemProperty — both registry paths now return EnableCertPaddingCheck : 1.
Then the step most people skip — the verification re-scan. You don't close the ticket until the scanner confirms the finding is gone:
Verification scan (History: 2): the High-severity CVE-2013-3900 finding is resolved. Highest remaining severity is Medium.
Find → analyze → fix → verify. Loop closed.
| Skill | Where |
|---|---|
| Vulnerability management lifecycle | End-to-end: baseline, credentialed scan, analysis, remediation, verification |
| Nessus deployment & operation | Essentials 10.12.1 on Ubuntu, scan policy configuration, credentialed scanning |
| Secure scanner architecture | Dedicated VM, SSH-tunnel-only management plane, key-based auth, least-privilege NSG |
| Infrastructure as Code | Terraform with data sources against existing infrastructure, isolated remote state |
| Azure network security | NSG auditing and hardening via Azure CLI, source-IP restriction workflow |
| Windows hardening | Registry-based mitigation (CVE-2013-3900), Remote Registry / WMI / firewall preparation |
| CVSS & risk interpretation | CVSS 8.8 / VPR 9.0 analysis, credentialed-vs-unauthenticated visibility comparison |
| PowerShell administration | Service configuration, firewall rule groups, registry remediation with verification |
Vulnerability management is a core function in virtually every security operations, cloud security, and GRC role. This lab covers the whole job — not just running a scanner, but architecting its placement securely, preparing targets correctly, distinguishing signal from noise in the results, executing a remediation, and proving it worked. The unauthenticated-vs-credentialed comparison and the verification re-scan are the two things that separate practitioners from tool operators.
The full professional deliverable — executive summary, methodology, detailed CVE-2013-3900 finding analysis, residual-risk disposition, and prioritized recommendations — is available as a PDF:
Nessus Essentials does not include report export, so this deliverable was authored independently from the scan data — which is itself the assessment-reporting skill the free tier leaves out.
This scanner deploys into the environment built by my Enterprise Azure Infrastructure Automation series:
No secrets are stored in this repository — the scanner uses SSH key authentication only, and scan credentials were entered directly in the Nessus console, never committed to code.