VulnScan-Nessus Adapter
Di 03 November 2015 by Christoph Bleß de en Tags Vulnerabiliy Scanner / Nessus / Java / VulnScan-APIVulnScan-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
}