VulnScan-Nessus Adapter

Di 03 November 2015 by Christoph Bleß de en  Tags Vulnerabiliy Scanner / Nessus / Java / VulnScan-API

VulnScan-Nessus

VulnScan-Nessus ist eine Java Bibliothek, die die vorgeschriebenen Methoden der VulnScan-API implementiert und somit einen einfachen Zugriff auf des Nessus Server gewährt. Die Sourcen zu dieser Bibliothek sind in meinem Account auf bitbucket.org zu finden. Selbiges gilt auch für die Abhängigkeiten in Form der Schnittstellen-Definitionen, der VulnScan-API und den gewrappten NessusClient. Diese Bibliotheken sowie ein Adapter für OpenVAS sind während eines Studien-Projekts entstanden.

Usage

Das erste Beispiel zeigt wie ein Client instantiiert und wie sich am Server authentisiert wird. Der Konstruktor nimmt drei Argumente an. Das Erste ist der Host des Nessus Servers, das Zweite ist der Port auf dem der Server lauscht. Der dritte Parameter ist das trustAll-Flag. Wenn dieses Flag gesetzt ist, wird ein TrustManager gesetzt der alle SSL-Zertifikate akzeptiert. Diese Option kann auf true gesetzt werden wenn der Server mit einem selbst signierten Zertifikat läuft. Anderen Falls sollte dieser Wert auf false gesetzt werden.

try {
    // create the Client 
    AbstractClient client = new NessusClient("127.0.0.1", 8834, true);
    // authenticate 
    client.login("testuser", "testuser");

    // now you can do some magic stuff with the client ...
} catch(SessionException ex){ 
    // login wasn't successful
} catch (ClientException ex) { 
    // any other error during the communication with the Server
}

Nach einer erfolgreichen Authentifizierung können weitere Methoden ausgeführt werden. Das nächste Beispiel zeigt die beispielhafte Verwendung der Methoden getScans(), getScanDetails(id), getScanStatus(id). Der Übersichtlichkeit geschuldet, wird in den folgenden Beispielen auf die Instantiierung und Authentifizierung verzichtet.

try {
    // create client and authenticate

    // get all availabe scans
    for (Scan s : client.getScans()){
        // Do something with the scan
        System.out.println(s); 
    }
    // Scan{id=110, name=XP_Basic, status=canceled}
    // Scan{id=209, name=UNI-LAB, status=completed}
    // ...

    // you can also get the details of a scan, which contains the targets
    ScanDetails scanDetails = client.getScanDetails("209");
    System.out.println(scanDetails);
    // ScanDetails{id=209, name=UNI-LAB, status=completed, targets=192.168.56.10,192.168.56.11,192.168.56.101,192.168.56.200,192.168.56.250.}

    String status = client.getScanStatus("209");
    System.out.println(status);
    // completed
} catch(SessionException ex){ 
    // login wasn't successful
} catch (ClientException ex) { 
    // any other error during the communication with the Server
}

Weiterhin ist es möglich existierende Scans zu starten, stoppen, pausieren oder wieder aufzunehmen. Das folgende Beispiel zeigt die Verwendung der launch Methode, die dazu dient einen Scan zu starten.

try {
    // create client and authenticate ...

    // Start scan with id 110
    String id = client.launch("110");

    // we can use the method *getScanStatus* to check the current state of the scan. 
    while(!"completed".equals(client.getScanStatus(id))){
        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
            // Handle Exception
        }
    }
    System.out.println("Scan completed");
} catch(SessionException ex){ 
    // login wasn't successful
} catch (ClientException ex) { 
    // any other error during the communication with the Server
}

Wenn ein Scan fertig ist können die während der Ausführung gefundenen Schwachstellen abgerufen werden. Um diese abzufragen kann die Methode getResults verwendet werden, die die ID des Scans als Parameter erwartet.

try {
    // create client and authenticate ...

    // get a list of vulnerabilities found by the scan
    List<Vulnerability> vulns = client.getResults("209");
    for (Vulnerability v : vulns){
        System.out.println(v); 
    }
    // ...
    // Vulnerability{id=42263, name=Unencrypted Telnet Server, severity=Medium, pluginId=42263}
    // ...
} catch(SessionException ex){ 
    // login wasn't successful
} catch (ClientException ex) { 
    // any other error during the communication with the Server
}

If the scan contains more than one target host you can use the method getResultByHost to get a list of vulnerabilities for each host. The result of this method is a map with the host as key an a list of vulnerabilities as value.

try {
    // create client and authenticate ...

    // get a list of vulnerabilities sorted by hosts
    Map<String, List<Vulnerability>> resultsByHost = client.getResultsByHost("209");
    for (String host : resultsByHost.keySet()){
        List<Vulnerability> hostVulns = resultsByHost.get(host);
        for (Vulnerability v : hostVulns){
            System.out.println("Host: " + host + " => " + v);
        }
    }
    // ...
    // Host: 192.168.56.11 => Vulnerability{id=11936, name=OS Identification, severity=High, pluginId=11936}
    // ...
} catch(SessionException ex){ 
    // login wasn't successful
} catch (ClientException ex) { 
    // any other error during the communication with the Server
}

To get more detailed about a vulnerability you can get information about the plugin which found it. To get the information about a plugin you have to use the method getPlugin which needs an id of the plugin.

try {
    // ...

    // Abrufen der Informationen zu einem Plugin
    Plugin plugin = client.getPlugin("35362");
    System.out.println(plugin);
    //  Plugin{id=35362, name=MS09-001: Microsoft Windows SMB Vulnerabilities Remote Code Execution (958687) (uncredentialed check), family=Windows, cvss=10.0, description=, references=[Reference{type=CVE, reference=CVE-2008-4834}, Reference{type=CVE, reference=CVE-2008-4835}, Reference{type=CVE, reference=CVE-2008-4114}, Reference{type=XREF, reference=OSVDB:48153}, Reference{type=OSVDB, reference=48153}, Reference{type=XREF, reference=OSVDB:52691}, Reference{type=OSVDB, reference=52691}, Reference{type=XREF, reference=OSVDB:52692}, Reference{type=OSVDB, reference=52692}, Reference{type=XREF, reference=MSFT:MS09-001}, Reference{type=XREF, reference=CWE:399}, Reference{type=XREF, reference=CWE:399}]}
} catch(SessionException ex){ 
    // login wasn't successful
} catch (ClientException ex) { 
    // any other error during the communication with the Server
}