Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Scan systems and dependencies for CVEs and security vulnerabilities. Use tools like Nessus, OpenVAS, and Qualys to identify and prioritize vulnerabilities. Use when performing security assessments, compliance scanning, or vulnerability management.
.claude/skills/bagelhole-vulnerability-scanning/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flashlowest | 97% | 219 |
| gemini-3.1-pro-preview | 100% | 1 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 37% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 52% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 155% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 128% | 0% |
Identify and prioritize security vulnerabilities across infrastructure and applications.
Use this skill when:
| Tool | Type | Best For | |------|------|----------| | Nessus | Commercial | Enterprise scanning | | OpenVAS | Open Source | Free alternative | | Qualys | Cloud SaaS | Large scale | | Nexpose/InsightVM | Commercial | Asset management | | Nuclei | Open Source | Template-based |
bash# Run OpenVAS container docker run -d --name openvas \ -p 443:443 \ -v openvas-data:/data \ greenbone/openvas-scanner # Access web UI at https://localhost # Default credentials: admin/admin
bash# Create target omp -u admin -w admin --xml='<create_target> <name>Web Servers</name> <hosts>192.168.1.0/24</hosts> </create_target>' # Create task omp -u admin -w admin --xml='<create_task> <name>Weekly Scan</name> <target id="target-uuid"/> <config id="daba56c8-73ec-11df-a475-002264764cea"/> </create_task>' # Start task omp -u admin -w admin --xml='<start_task task_id="task-uuid"/>' # Get results omp -u admin -w admin --xml='<get_results task_id="task-uuid"/>'
pythonimport requests class NessusScanner: def __init__(self, url, access_key, secret_key): self.url = url self.headers = { 'X-ApiKeys': f'accessKey={access_key}; secretKey={secret_key}', 'Content-Type': 'application/json' } def create_scan(self, name, targets, template='basic'): """Create a new scan.""" templates = self.get('/editor/scan/templates') template_uuid = next( t['uuid'] for t in templates['templates'] if t['name'] == template ) payload = { 'uuid': template_uuid, 'settings': { 'name': name, 'text_targets': targets, 'enabled': True } } return self.post('/scans', payload) def launch_scan(self, scan_id): """Start a scan.""" return self.post(f'/scans/{scan_id}/launch') def get_results(self, scan_id): """Get scan results.""" return self.get(f'/scans/{scan_id}') def export_report(self, scan_id, format='pdf'): """Export scan report.""" payload = {'format': format} response = self.post(f'/scans/{scan_id}/export', payload) file_id = response['file'] # Wait for export while True: status = self.get(f'/scans/{scan_id}/export/{file_id}/status') if status['status'] == 'ready': break time.sleep(5) return self.get(f'/scans/{scan_id}/export/{file_id}/download') def get(self, path): response = requests.get(f'{self.url}{path}', headers=self.headers, verify=False) return response.json() def post(self, path, data=None): response = requests.post(f'{self.url}{path}', json=data, headers=self.headers, verify=False) return response.json() # Usage scanner = NessusScanner('https://nessus:8834', 'access-key', 'secret-key') scan = scanner.create_scan('Weekly Infrastructure Scan', '10.0.0.0/24') scanner.launch_scan(scan['scan']['id'])
bash# Install nuclei go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest # Or download binary wget https://github.com/projectdiscovery/nuclei/releases/latest/download/nuclei_linux_amd64.zip unzip nuclei_linux_amd64.zip
bash# Update templates nuclei -update-templates # Scan single target nuclei -u https://example.com # Scan multiple targets nuclei -l targets.txt # Scan with specific templates nuclei -u https://example.com -t cves/ nuclei -u https://example.com -t vulnerabilities/ # Scan with severity filter nuclei -u https://example.com -s critical,high # Output formats nuclei -u https://example.com -o results.txt nuclei -u https://example.com -json -o results.json
yaml# custom-check.yaml id: custom-admin-panel info: name: Admin Panel Detection author: security-team severity: info tags: recon,panel requests: - method: GET path: - "{{BaseURL}}/admin" - "{{BaseURL}}/administrator" - "{{BaseURL}}/wp-admin" matchers-condition: or matchers: - type: word words: - "admin" - "login" condition: and - type: status status: - 200 - 301 - 302
| Score | Rating | Response Time | |-------|--------|---------------| | 9.0-10.0 | Critical | 24 hours | | 7.0-8.9 | High | 7 days | | 4.0-6.9 | Medium | 30 days | | 0.1-3.9 | Low | 90 days |
yamlprioritization_criteria: critical_factors: - Internet-facing systems - Systems with sensitive data - Active exploitation in the wild - Authentication bypass high_factors: - Remote code execution - Privilege escalation - Data exfiltration risk context_adjustments: - Compensating controls in place (-1) - No direct exposure (-1) - Critical business system (+1) - Compliance requirement (+1)
yamlvulnerability_workflow: discovery: - Run scheduled scans - Import third-party findings - Correlate with asset inventory analysis: - Validate findings - Remove false positives - Assess business impact - Prioritize by risk score remediation: - Assign to owners - Track SLA compliance - Verify fixes - Document exceptions reporting: - Executive summaries - Technical details - Trend analysis - Compliance metrics
markdown## Vulnerability Ticket **ID:** VULN-2024-001 **CVE:** CVE-2024-12345 **CVSS:** 9.8 (Critical) **Affected System:** web-server-01 ### Description Remote code execution vulnerability in Apache Struts. ### Impact Attacker can execute arbitrary code on the server. ### Remediation 1. Update Apache Struts to version 2.5.33 2. Apply WAF rule as temporary mitigation ### Timeline - Discovered: 2024-01-15 - SLA Due: 2024-01-16 - Remediated: 2024-01-15 ### Evidence - Scan report: [link] - Screenshot: [link]
yamlname: Vulnerability Scan on: schedule: - cron: '0 2 * * *' push: branches: [main] jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run Nuclei uses: projectdiscovery/nuclei-action@main with: target: https://example.com templates: cves/ output: nuclei-results.txt - name: Check for critical findings run: | if grep -q "critical" nuclei-results.txt; then echo "Critical vulnerabilities found!" exit 1 fi - name: Upload results uses: actions/upload-artifact@v4 with: name: vulnerability-report path: nuclei-results.txt
bash# Using OpenSCAP oscap xccdf eval \ --profile xccdf_org.ssgproject.content_profile_cis \ --results results.xml \ --report report.html \ /usr/share/xml/scap/ssg/content/ssg-ubuntu2204-ds.xml
yamlpci_scan_requirements: quarterly: - External vulnerability scan (ASV) - Internal vulnerability scan after_changes: - Significant infrastructure changes - New system deployments passing_criteria: - No vulnerabilities rated 4.0+ (CVSS) - False positives documented - Scan completed within 90 days
Problem: Scanner reports non-existent vulnerabilities Solution: Validate manually, tune scanner, maintain exception list
Problem: Not all assets scanned Solution: Update asset inventory, verify credentials, check network access
Problem: Scans affecting production systems Solution: Schedule during maintenance windows, use authenticated scans
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-07 | fail→pass | 16,395 | 16,345 | -0% | 1 | 1 | 0% | 2,778 | 4,268 | +54% | 0 | 0 | — |
case-01 | pass→pass | 25,859 | 25,121 | -3% | 1 | 1 | 0% | 3,914 | 6,461 | +65% | 0 | 0 | — |
case-02 | fail→pass | 25,869 | 12,467 | -52% | 1 | 1 | 0% | 3,323 | 4,551 | +37% | 0 | 0 | — |
case-03 | fail→fail | 16,962 | 12,672 | -25% | 1 | 1 | 0% | 3,096 | 4,331 | +40% | 0 | 0 | — |
case-04 | fail→pass | 36,920 | 4,780 | -87% | 1 | 1 | 0% | 2,056 | 3,132 | +52% | 0 | 0 | — |
case-05 | pass→pass | 11,246 | 11,475 | +2% | 1 | 1 | 0% | 1,804 | 3,498 | +94% | 0 | 0 | — |
case-06 | pass→pass | 14,840 | 10,854 | -27% | 1 | 1 | 0% | 1,630 | 3,449 | +112% | 0 | 0 | — |
case-08 | pass→pass | 10,418 | 7,484 | -28% | 1 | 1 | 0% | 727 | 2,892 | +298% | 0 | 0 | — |
case-09 | pass→pass | 4,421 | 8,320 | +88% | 1 | 1 | 0% | 632 | 3,018 | +378% | 0 | 0 | — |
case-10 | pass→pass | 10,737 | 2,727 | -75% | 1 | 1 | 0% | 797 | 2,999 | +276% | 0 | 0 | — |
case-11 | fail→pass | 13,221 | 3,040 | -77% | 1 | 1 | 0% | 1,172 | 2,985 | +155% | 0 | 0 | — |
case-17 | pass→pass | 8,386 | 11,372 | +36% | 1 | 1 | 0% | 1,302 | 3,530 | +171% | 0 | 0 | — |
case-12 | fail→pass | 14,901 | 14,193 | -5% | 1 | 1 | 0% | 1,344 | 3,063 | +128% | 0 | 0 | — |
case-13 | fail→pass | 15,455 | 7,806 | -49% | 1 | 1 | 0% | 1,396 | 2,947 | +111% | 0 | 0 | — |
case-14 | fail→pass | 21,972 | 9,466 | -57% | 1 | 1 | 0% | 2,317 | 3,232 | +39% | 0 | 0 | — |
case-15 | fail→fail | 21,311 | 16,625 | -22% | 1 | 1 | 0% | 2,436 | 4,115 | +69% | 0 | 0 | — |
case-16 | pass→pass | 18,242 | 17,460 | -4% | 1 | 1 | 0% | 2,109 | 4,475 | +112% | 0 | 0 | — |
case-18 | pass→fail | 19,968 | 15,306 | -23% | 1 | 1 | 0% | 2,376 | 4,234 | +78% | 0 | 0 | — |
case-19 | pass→pass | 13,980 | 5,367 | -62% | 1 | 1 | 0% | 1,464 | 3,557 | +143% | 0 | 0 | — |
case-20 | pass→pass | 19,919 | 15,781 | -21% | 1 | 1 | 0% | 2,297 | 4,279 | +86% | 0 | 0 | — |
case-21 | pass→pass | 24,801 | 14,241 | -43% | 1 | 1 | 0% | 2,764 | 3,897 | +41% | 0 | 0 | — |
case-22 | pass→pass | 20,378 | 18,631 | -9% | 1 | 1 | 0% | 2,642 | 4,962 | +88% | 0 | 0 | — |
case-23 | pass→pass | 8,634 | 13,675 | +58% | 1 | 1 | 0% | 1,473 | 3,876 | +163% | 0 | 0 | — |
case-24 | pass→pass | 17,943 | 14,774 | -18% | 1 | 1 | 0% | 2,023 | 4,163 | +106% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +25 percentage points is the difference between those two pass rates over the 24 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.