aboutsummaryrefslogtreecommitdiffstats
path: root/config/strikeback/parse.tmp
diff options
context:
space:
mode:
Diffstat (limited to 'config/strikeback/parse.tmp')
-rw-r--r--config/strikeback/parse.tmp289
1 files changed, 289 insertions, 0 deletions
diff --git a/config/strikeback/parse.tmp b/config/strikeback/parse.tmp
new file mode 100644
index 00000000..085a73fb
--- /dev/null
+++ b/config/strikeback/parse.tmp
@@ -0,0 +1,289 @@
+#!/usr/local/bin/php
+<?php
+/**
+ * Script to transform multiple nmap XML output files (presumably of the same host/port range with different scan options) into a HTML table
+ *
+ * The canonical source of the latest version of this script is:
+ * <http://svn.jasonantman.com/misc-scripts/nmap-xml-to-table.php>
+ *
+ * Copyright 2011 Jason Antman <jason@jasonantman.com> <http://www.jasonantman.com> all rights reserved.
+ * Distribution and use of this script is unlimited, provided that you leave this notice intact and send any corrections/additions back to me.
+ *
+ * This is assuming a relatively simple scan - only one protocol, one or more hosts, one or more ports, and that different scans will be differentiated only by type
+ *
+ * USAGE: nmap-xml-to-table.php [xml file] [xml file] [...]
+ *
+ * $LastChangedRevision$
+ * $HeadURL$
+ *
+ */
+header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
+header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
+
+exec("mkdir /usr/local/www/packages/strikeback/reports");
+
+$dir = 'reports/';
+$reports = scandir($dir);
+//print_r($reports);
+
+foreach($reports as $i => $value){
+ $reports[$i] = "reports/".$reports[$i];
+ $i++;
+}
+
+array_shift($reports);
+array_shift($reports);
+//print_r($reports);
+//array_shift($argv); // get rid of script name
+
+
+
+
+//print_r($reports);
+$files = array();
+//foreach($argv as $file)
+foreach($reports as $file)
+{
+ if(file_exists($file) && is_readable($file))
+ {
+ $files[] = $file;
+ }
+ else
+ {
+ fwrite(STDERR, "File $file does not exist or is not readable, skipping.\n");
+ }
+}
+
+$results = array();
+$scanInfo = array();
+$hostAndPort = array();
+
+$count = 0;
+foreach($files as $file)
+{
+ $info = getScanResults($file);
+ $results[$count] = $info['hosts'];
+ $info['scan']['filename'] = $file;
+ $scanInfo[$count] = $info['scan'];
+ foreach($info['hosts'] as $host => $portArr)
+ {
+ if(! isset($hostAndPort[$host])){ $hostAndPort[$host] = array();}
+ foreach($portArr as $port => $foo)
+ {
+ $hostAndPort[$host][$port] = $foo['service'];
+ }
+ }
+ $count++;
+}
+
+?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<title>Condensed NMAP scan results</title>
+
+<style type="text/css">
+table.result {
+ border-width: 1px 1px 1px 1px;
+ border-spacing: 0px;
+ border-style: solid solid solid solid;
+ border-color: black black black black;
+ border-collapse: separate;
+ background-color: white;
+ margin-left: auto;
+ margin-right: auto;
+}
+table.result th {
+ border-width: 1px 1px 1px 1px;
+ padding: 2px 2px 2px 2px;
+ border-style: solid solid solid solid;
+ border-color: black black black black;
+ background-color: white;
+ -moz-border-radius: 0px 0px 0px 0px;
+}
+table.result td {
+ border-width: 1px 1px 1px 1px;
+ padding: 2px 2px 2px 2px;
+ border-style: solid solid solid solid;
+ border-color: black black black black;
+ background-color: white;
+ -moz-border-radius: 0px 0px 0px 0px;
+}
+h2 { text-align: center;}
+.lookhere { color: red;}
+</style>
+<script type="text/javascript" language="javascript">
+function show_hide(show) {
+<?php
+$tableint = 0;
+foreach($scanInfo as $num => $arr)
+{
+ $tableint++;
+
+ echo "if (tbl = document.getElementById(\"td".$tableint."\")) {\n";
+ echo "if (null == show) show = tbl.style.display == 'none';\n";
+ echo "tbl.style.display = (show ? '' : 'none');\n";
+ echo "}\n";
+
+ echo "if (tbl = document.getElementById(\"th".$tableint."\")) {\n";
+ echo "if (null == show) show = tbl.style.display == 'none';\n";
+ echo "tbl.style.display = (show ? '' : 'none');\n";
+ echo "}\n";
+}
+?>
+}
+</script>
+</head>
+<body>
+<h2>Nmap scan results (condensed)</h2>
+<a href="javascript:void();" onclick="show_hide()">Show/Hide scanned services</a>
+<?php
+
+// output scan information
+echo '<table class="result">'."\n";
+echo '<tr><th colspan="7">Scans</th></tr>'."\n";
+//echo '<tr><th>Num</th><th>proto</th><th>type</th><th>Services</th><th>num hosts</th><th>command</th><th>filename</th></tr>'."\n";
+echo '<tr><th>Num</th><th>proto</th><th>type</th><th id="th'.$tableint.'" style="display:none;">Services</th><th>filename</th><th>Delete</th></tr>'."\n";
+
+if(isset($_GET[delete])) {
+ echo($_GET[delete]);
+
+
+ exec("rm ".$_GET[delete]);
+ unlink($_GET[delete]);
+
+
+ echo "<script type=\"text/javascript\">\n";
+ echo "<!--\n";
+ echo "window.location = \"parse.php\"\n";
+ echo "//-->\n";
+ echo "<\/script>\n";
+
+}
+
+$tableint = 0;
+foreach($scanInfo as $num => $arr)
+{
+ $tableint++;
+ //echo($tableint);
+ //echo '<tr><td>'.$num.'</td><td>'.$arr['protocol'].'</td><td>'.$arr['type'].'</td><td>'.$arr['services'].'</td><td>'.$arr['numHosts'].'</td><td><pre>'.$arr['command'].'</pre></td><td>'.$arr['filename'].'</td></tr>'."\n";
+ echo '<tr><td>'.$num.'</td><td>'.$arr['protocol'].'</td><td>'.$arr['type'].'</td><td id="td'.$tableint.'" style="display:none;">'.$arr['services'].'</td><td>'.$arr['filename'].'</td><td><a href=parse.php?delete='.$arr['filename'].'>Delete</a></td></tr>'."\n";
+}
+echo '</table>'."\n";
+
+echo '<br />'."\n";
+
+echo '<table class="result">'."\n";
+echo '<tr><th colspan="'.(count($scanInfo)+1).'">Results</th></tr>'."\n";
+echo '<tr><th>Port</th>';
+for($i = 0; $i < count($scanInfo); $i++){ echo '<th>'.$i.' ('.$scanInfo[$i]['type'].')</th>';}
+echo '</tr>'."\n";
+foreach($hostAndPort as $host => $portArr)
+{
+ echo '<tr><th colspan="'.(count($scanInfo)+1).'">'.$host.'</th></tr>'."\n";
+
+ foreach($portArr as $portName => $service)
+ {
+ echo '<tr><td>'.$portName.($service != "" ? " (".$service.")" : "").'</td>';
+ foreach($scanInfo as $scanNum => $arr)
+ {
+ if(isset($results[$scanNum][$host][$portName]))
+ {
+ echo '<td>'.(($results[$scanNum][$host][$portName]['state'] == "open" || $results[$scanNum][$host][$portName]['state'] == "closed" || $results[$scanNum][$host][$portName]['state'] == "unfiltered") ? '<span class="lookhere">' : '').$results[$scanNum][$host][$portName]['state'].' ('.$results[$scanNum][$host][$portName]['state_reason'].(isset($results[$scanNum][$host][$portName]['state_reason_ip']) ? ' '.$results[$scanNum][$host][$portName]['state_reason_ip'] : '').')'.(($results[$scanNum][$host][$portName]['state'] == "open" || $results[$scanNum][$host][$portName]['state'] == "closed" || $results[$scanNum][$host][$portName]['state'] == "unfiltered") ? '</span>' : '').'</td>';
+ }
+ else
+ {
+ echo '<td><em>n/a</em></td>';
+ }
+ }
+ echo '</tr>'."\n";
+ }
+
+}
+echo '</table>'."\n";
+
+/**
+ * Parse meaningful information from a nmap XML output file and return it as an array
+ *
+ * @return array
+ */
+function handleError($errno, $errstr, $errfile, $errline, array $errcontext)
+{
+ // error was suppressed with the @-operator
+ if (0 === error_reporting()) {
+ return false;
+ }
+
+ throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
+}
+set_error_handler('handleError');
+
+function getScanResults($file)
+{
+ try {
+ $xml = simplexml_load_file($file);
+
+ $result = array("scan" => array(), "hosts" => array());
+
+ $command = $xml->attributes();
+ $command = (string)$command['args'];
+ $result['scan']['command'] = $command;
+
+ $foo = $xml->scaninfo->attributes();
+ $result['scan']['type'] = (string)$foo['type'];
+ $result['scan']['protocol'] = (string)$foo['protocol'];
+ $result['scan']['services'] = (string)$foo['services'];
+
+ $count = 0;
+ foreach($xml->host as $host)
+ {
+ $count++;
+
+ $foo = $host->address->attributes();
+ $addr = (string)$foo['addr'];
+
+ $arr = array(); // array to hold ports and results
+
+ // <port protocol="tcp" portid="445"><state state="filtered" reason="admin-prohibited" reason_ttl="241" reason_ip="67.83.255.41"/><service name="microsoft-ds" method="table" conf="3" /></port>
+ foreach($host->ports->port as $port)
+ {
+ $foo = $port->attributes();
+ $bar = array();
+
+ $name = (string)($foo['protocol']." ".$foo['portid']);
+ $bar['protocol'] = (string)$foo['protocol'];
+ $bar['portid'] = (string)$foo['portid'];
+ $bar['name'] = $name;
+
+ $foo = $port->state->attributes();
+ $bar['state'] = (string)$foo['state'];
+ $bar['state_reason'] = (string)$foo['reason'];
+ $bar['state_reason_ttl'] = (string)$foo['reason_ttl'];
+ if(isset($foo['reason_ip'])){ $bar['state_reason_ip'] = (string)$foo['reason_ip'];}
+
+ if($port->service)
+ {
+ $foo = $port->service->attributes();
+ $bar['service'] = (string)$foo['name'];
+ }
+
+ $arr[$name] = $bar;
+ }
+ $result['hosts'][$addr] = $arr;
+ }
+
+ $result['scan']['numHosts'] = $count;
+ return $result;
+
+} catch (ErrorException $e) {
+ echo ("fail");
+}
+}
+
+?>
+</body>
+</html> \ No newline at end of file