Nexpose ‐ Finding Credential issues - dishplate/blog GitHub Wiki

Untested code from chatGPT


import requests
import json
from dotenv import load_dotenv
import os

# Load environment variables from .env file
load_dotenv()

INSIGHTVM_CONSOLE = os.getenv("INSIGHTVM_CONSOLE")
USERNAME = os.getenv("USERNAME")
PASSWORD = os.getenv("PASSWORD")

# Replace this with your hostname or IP
TARGET_HOSTNAME = "example-hostname"

# Function to fetch the site ID from hostname or IP
def get_site_id(target):
    url = f"{INSIGHTVM_CONSOLE}/api/3/sites"
    headers = {
        "Content-Type": "application/json",
    }
    response = requests.get(url, headers=headers, auth=(USERNAME, PASSWORD), verify=False)
    if response.status_code == 200:
        sites = response.json()["resources"]
        for site in sites:
            site_id = site["id"]
            site_assets = get_site_assets(site_id)
            for asset in site_assets:
                if asset.get("host-name") == target or asset.get("ip-address") == target:
                    return site_id
    else:
        print(f"Error: Unable to fetch sites ({response.status_code}).")
    return None

# Function to fetch assets for a site
def get_site_assets(site_id):
    url = f"{INSIGHTVM_CONSOLE}/api/3/sites/{site_id}/assets"
    headers = {
        "Content-Type": "application/json",
    }
    response = requests.get(url, headers=headers, auth=(USERNAME, PASSWORD), verify=False)
    if response.status_code == 200:
        return response.json()["resources"]
    return []

# Function to get credential status messages for a given asset
def get_credential_status(asset_id):
    url = f"{INSIGHTVM_CONSOLE}/api/3/assets/{asset_id}/credentials"
    headers = {
        "Content-Type": "application/json",
    }
    response = requests.get(url, headers=headers, auth=(USERNAME, PASSWORD), verify=False)
    if response.status_code == 200:
        return response.json()
    else:
        print(f"Error: Unable to fetch credential status ({response.status_code}).")
        return None

# Main
site_id = get_site_id(TARGET_HOSTNAME)
if site_id:
    print(f"Found site ID: {site_id}")
    site_assets = get_site_assets(site_id)
    for asset in site_assets:
        if asset.get("host-name") == TARGET_HOSTNAME or asset.get("ip-address") == TARGET_HOSTNAME:
            asset_id = asset["id"]
            credential_status = get_credential_status(asset_id)
            if credential_status:
                print(json.dumps(credential_status, indent=4))
else:
    print("Target hostname or IP not found.")