#!/usr/bin/php <?php //error_reporting(0); include('config.php'); /*** * Main program - Don't edit below */ echo "·▄▄▄▄▄▌ .▄▄ · .▄▄ · \n▐▄▄·██• ▪ ▐█ ▀. ▐█ ▀. \n██▪ ██▪ ▄█▀▄ ▄▀▀▀█▄▄▀▀▀█▄\n██▌.▐█▌▐▌▐█▌.▐▌▐█▄▪▐█▐█▄▪▐█\n▀▀▀ .▀▀▀ ▀█▄▀▪ ▀▀▀▀ ▀▀▀▀ \n"; foreach (glob("classes/*.php") as $filename) include $filename; $definitions = new \Clapp\CommandLineArgumentDefinition( array( "help|h" => "Shows help message", "path|p=s" => "/path/to/jsons/" ) ); $filter = new \Clapp\CommandArgumentFilter($definitions, $argv); if ($filter->getParam('h') === true || $argc < 2) { echo "The JSON prettyfier\n\n"; fwrite(STDERR, $definitions->getUsage()); exit(0); } if(!file_exists($vulnDB."/floss.csv")) die("[!] floss.csv not found, is config.php correct?\n"); // create the CSV array $csv = array(); $file = fopen($vulnDB."/floss.csv", 'r'); while (($result = fgetcsv($file)) !== false){ $csv[] = $result; } fclose($file); // see if doc exists if ($filter->getParam("path") == false) die("[-] no path set\n"); // load vdb vulns $vdbVulns = getDirContents($vulnDB); foreach($vdbVulns as $h => $i){ // remove begining of vdb path (keeps clean) $vdbVulns[$h] = str_replace($vulnDB, "", $i); } echo "VDB: ".sizeof($vdbVulns).", "; // get all vulns $vuln = array(); $files = glob($filter->getParam("path")."*.json"); foreach($files as $finding){ $vuln[]['orig'] = str_replace(".json", "", str_replace($filter->getParam("path"), "", $finding)); } echo "Vulns: ".sizeof($vuln)."\n"; // check for existing foreach($vuln as $key => $finding){ foreach($vdbVulns as $issue){ $title = substr($issue, strrpos($issue, '/') + 1); if($finding['orig'].".json" == $title){ $vuln[$key]['new'] = $issue; //echo $finding['orig']." -> ".$issue."\n"; // DEBUG } } } // check for pattern match in floss.csv foreach($csv as $finding){ foreach($vuln as $key => $issue){ if(fnmatch($finding[0], $issue['orig'])){ $vuln[$key]['new'] = $finding[1]; //echo $issue['orig']." -> ".$finding[1]."\n"; // DEBUG } } } //print_r($vuln); // DEBUG $flossFolder = substr($filter->getParam("path"), 0, strrpos( $filter->getParam("path"), '/') )."/flossed"; if(!file_exists($flossFolder."/")){ mkdir($flossFolder."/"); echo "[+] created directory $flossFolder/\n"; } $checkFolder = substr($filter->getParam("path"), 0, strrpos( $filter->getParam("path"), '/') )."/to_check"; if(!file_exists($checkFolder."/")){ mkdir($checkFolder."/"); echo "[+] created directory $checkFolder/\n"; } $flossed = 0; $flossArr = array(); $fp = fopen($filter->getParam("path")."flossed/".date("d-m-Y_H-i-s").".log", "wb"); foreach($vuln as $key => $finding){ if(isset($finding['new'])){ $content = $finding['orig']." -> ".$finding['new']."\n"; // log changes fwrite($fp,$content); rename($filter->getParam("path").$finding['orig'].".json",$filter->getParam("path")."flossed/".$finding['orig'].".json"); if($finding['new'] != "-del-"){ $title = substr($finding['new'], strrpos($finding['new'], '/') + 1); copy($vulnDB.$finding['new'], $filter->getParam("path").$title); $flossArr[] = $finding['new']; } $flossed++; }else{ rename($filter->getParam("path").$finding['orig'].".json",$filter->getParam("path")."to_check/".$finding['orig'].".json"); } } fclose($fp); $flossedInto = sizeof(array_unique($flossArr)); $left = sizeof($vuln)-$flossed; echo "Flossed: ".$flossed." -> ".$flossedInto."\n"; echo "To Check: ".$left."\n"; echo "________________________________________________ | | |Please (on VDB) either add a rule to floss.csv | |or create a new vulnerability for each .json | |in /to_check to help the team and make | |reporting easier for everyone! | |_______________________________________________|\n"; function getDirContents($path) { $rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); $files = array(); foreach ($rii as $file) if (!$file->isDir()) $files[] = $file->getPathname(); return $files; }