#!/usr/bin/php <?php //error_reporting(0); /*** * Configuration options */ $vulnDB = "/opt/RossMarks/vdb/"; /*** * Main program - Don't edit below */ #echo " +-+-+-+-+-+-+\n |V|u|l|n|D|B|\n +-+-+-+-+-+-+\n\n"; foreach (glob("classes/*.php") as $filename) include $filename; $definitions = new \Clapp\CommandLineArgumentDefinition( array( "help|h" => "Shows help message", "search|s=s" => "search term", "id|i=i" => "id of vuln to view details or copy (requires -p)", "path|p=s" => "path to copy vuln to (requires -c)", ) ); $filter = new \Clapp\CommandArgumentFilter($definitions, $argv); if ($filter->getParam('h') === true || $argc < 2) { fwrite(STDERR, $definitions->getUsage()); exit(0); } // get all vulns $vuln = recursiveScan($vulnDB); $i = 1; foreach($vuln as $key => $value){ $vuln[$key]['count'] = $i; $i++; } // search for search term if($filter->getParam("search") == true){ #echo "[!] Searching: ".$filter->getParam("search")."\n"; echo" Ref | Title | Description -------|--------------------------------------------------|----------------------------------------------------------------\n"; foreach ($vuln as $key => $value) { $flag = 0; if (strpos($vuln[$key]['title'], $filter->getParam("search")) == true){ $flag = 1; } if (strpos($vuln[$key]['description'], $filter->getParam("search")) == true){ $flag = 1; } if (strpos($vuln[$key]['tech_description'], $filter->getParam("search")) == true){ $flag = 1; } if (strpos($vuln[$key]['impact'], $filter->getParam("search")) == true){ $flag = 1; } if (strpos($vuln[$key]['solution'], $filter->getParam("search")) == true){ $flag = 1; } if (strpos($vuln[$key]['tags'], $filter->getParam("search")) == true){ $flag = 1; } if($flag == 1){ // found search term $ref = str_pad($vuln[$key]['count'], 7); $title = str_pad($vuln[$key]['title'], 50); $desc = trim(preg_replace('/\s\s+/', ' ', $vuln[$key]['tech_description'])); $desc = str_pad( $desc, 61); echo substr($ref, 0, 7); echo "|"; echo substr($title, 0, 50); echo "|"; echo substr($desc, 0, 61); echo "\n"; } } echo "\n"; } if($filter->getParam("id") == true){ $id = $filter->getParam("id"); foreach ($vuln as $key => $value) { if($vuln[$key]['count'] == $id){ $chosenVuln = $vuln[$key]; $path = $key; break; } } echo "\033[1m\033[4m".$chosenVuln['count']." - ".$chosenVuln['title']."\033[0m\n"; echo "\033[1mCVSS:\033[0m ".$chosenVuln['cvss_score']." "; echo "\033[1mRisk:\033[0m ".$chosenVuln['risk']." "; echo "\033[1mOWASP:\033[0m ".$chosenVuln['owasp']."\n"; echo "\033[1mCVSS2:\033[0m ".$chosenVuln['cvss2_score']." ".$chosenVuln['cvss2_vector']."\n"; echo "\033[1mCVSS3:\033[0m ".$chosenVuln['cvss3_score']." ".$chosenVuln['cvss3_vector']."\n"; echo "\033[1mDescription:\033[0m ".$chosenVuln['description']."\n"; echo "\033[1mTechnical Description:\033[0m ".$chosenVuln['tech_description']."\n"; echo "\033[1mSoluton:\033[0m ".$chosenVuln['solution']."\n"; echo "\033[1mImpact: \033[0m".$chosenVuln['impact']."\n"; echo "\033[1mRemediation:\033[0m ".$chosenVuln['remediation']."\n"; echo "\033[1mTags:\033[0m ".$chosenVuln['tags']."\n"; if($filter->getParam("path") == true){ $resultsFolder = add_ending_slash($filter->getParam("path")); if(file_exists($resultsFolder)){ if(!file_exists($resultsFolder.basename($path))){ system("cp $path $resultsFolder".basename($path)); echo "\n\033[0;92m\033[1m".basename($path)." copied to $resultsFolder\033[0m\n"; }else{ echo "\n\033[0;31m\033[1m".basename($path)." already in $resultsFolder\033[0m\n"; } }else{ echo "\n\033[0;31m\033[1m$resultsFolder does not exist!\033[0m\n"; } } } function recursiveScan($dir) { global $vuln; $tree = glob(rtrim($dir, '/') . '/*'); if (is_array($tree)) { foreach($tree as $file) { if (is_dir($file)) { #echo "dir - ".$file . "\n"; recursiveScan($file); } elseif (is_file($file)) { //echo $file . "\n"; //$vuln[] = "test"; if(substr($file, -5) == '.json'){ $vuln[$file] = json_decode(file_get_contents($file), true); } } } } return $vuln; } function add_ending_slash( $path ){ if ( substr( $path, ( 0 - ( int ) strlen( "/" ) ) ) !== "/" ){ $path .= "/"; } return $path; } ?>