194 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * File: parse_ms_kb_to_cve.php
 | |
|  * Author: Ryan Prather
 | |
|  * Purpose: To parse Excel MS/KB to CVE file retrieved from https://technet.microsoft.com/en-us/security/bulletin
 | |
|  *    Released on the second Tues of the month
 | |
|  * Created: Jul 9, 2014
 | |
|  *
 | |
|  * Portions Copyright 2016: Cyber Perspectives, All rights reserved
 | |
|  * Released under the Apache v2.0 License
 | |
|  *
 | |
|  * Portions Copyright (c) 2012-2015, Salient Federal Solutions
 | |
|  * Portions Copyright (c) 2008-2011, Science Applications International Corporation (SAIC)
 | |
|  * Released under Modified BSD License
 | |
|  *
 | |
|  * See license.txt for details
 | |
|  *
 | |
|  * Change Log:
 | |
|  *  - Jul 9, 2014 - File created
 | |
|  *  - Sep 1, 2016 - Copyright Updated and updated functions after class merger
 | |
|  */
 | |
| $cmd = getopt("f:", array('debug::'));
 | |
| include_once 'config.inc';
 | |
| include_once 'database.inc';
 | |
| include_once 'helper.inc';
 | |
| 
 | |
| chdir(DOC_ROOT . "/tmp");
 | |
| 
 | |
| set_time_limit(0);
 | |
| 
 | |
| $db = new db();
 | |
| $base_name = basename($cmd['f']);
 | |
| $err = new Sagacity_Error($cmd['f']);
 | |
| 
 | |
| if (!file_exists($cmd['f'])) {
 | |
|   $db->update_Running_Scan($base_name, array('name' => 'status', 'value' => 'ERROR'));
 | |
|   $err->script_log("File not found", E_ERROR);
 | |
| }
 | |
| 
 | |
| $start = new DateTime();
 | |
| 
 | |
| $fh = fopen($cmd['f'], "r");
 | |
| $row = fegetcsv($fh);
 | |
| while ($row = fgetcsv($fh)) {
 | |
|   print ".";
 | |
|   $adv = array();
 | |
|   $ms_url = '';
 | |
|   $kb_url = '';
 | |
|   $sev = 'II';
 | |
|   $pdi_id = 0;
 | |
|   $date = $row[0];
 | |
|   $ms = $row[1];
 | |
| 
 | |
|   switch ($row[3]) {
 | |
|     case 'Critical':
 | |
|     case 'Important':
 | |
|       $sev = 'I';
 | |
|       break;
 | |
|     case 'Low':
 | |
|       $sev = 'III';
 | |
|       break;
 | |
|   }
 | |
| 
 | |
|   $impact = $row[4];
 | |
|   $title = $row[5];
 | |
|   $prod = $row[6];
 | |
|   $kb = "KB" . (isset($row[7]) && !empty($row[7]) ? $row[7] : $row[2]);
 | |
|   $comp = $row[8];
 | |
|   $cves = explode(",", $row[13]);
 | |
| 
 | |
|   if (isset($cmd['debug'])) {
 | |
|     $err->script_log("$ms/$kb/$date");
 | |
|   }
 | |
| 
 | |
|   $db_cve = null;
 | |
|   $has_cve = false;
 | |
| 
 | |
|   if (is_array($cves) && count($cves)) {
 | |
|     foreach ($cves as $cve) {
 | |
|       $db_cve = $db->get_CVE($cve);
 | |
| 
 | |
|       if (!is_null($db_cve)) {
 | |
|         if ($db_cve->get_PDI_ID()) {
 | |
|           $has_cve = true;
 | |
|         }
 | |
| 
 | |
|         $dt = DateTime::createFromFormat("m-d-y", $date);
 | |
|         $db_cve->set_Phase_Date($dt->format("Y-m-d"));
 | |
| 
 | |
|         if ($ms && !$db_cve->ref_Exists($ms)) {
 | |
|           $db_cve->add_Reference(new cve_reference(null, 'MS', $ms_url, $ms));
 | |
|         }
 | |
| 
 | |
|         if ($kb && !$db_cve->ref_Exists($kb)) {
 | |
|           $db_cve->add_Reference(new cve_reference(null, 'MS', $kb_url, $kb));
 | |
|         }
 | |
| 
 | |
|         $db->save_CVE(array(0 => $db_cve));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   $stig = $db->get_Stig($ms);
 | |
|   if (!$iavm = $db->get_IAVM_From_External($ms)) {
 | |
|     $iavm = $db->get_IAVM_From_External($kb);
 | |
|   }
 | |
| 
 | |
|   if (is_array($stig) && count($stig) && isset($stig[0]) && is_a($stig[0], 'stig')) {
 | |
|     $stig = $stig[0];
 | |
|   }
 | |
|   else {
 | |
|     $err->script_log("Failed to identify the correct STIG", E_WARNING);
 | |
|   }
 | |
| 
 | |
|   // insert pdi and advisory
 | |
|   if ($iavm) {
 | |
|     $pdi_id = $iavm->get_PDI_ID();
 | |
|   }
 | |
|   elseif ($has_cve && $db_cve->get_PDI_ID()) {
 | |
|     $pdi_id = $db_cve->get_PDI_ID();
 | |
|   }
 | |
|   elseif ($stig) {
 | |
|     $pdi_id = $stig->get_PDI_ID();
 | |
|   }
 | |
|   else {
 | |
|     // insert PDI, STIG, advisory, and CVE's
 | |
|     $pdi = new pdi(null, $sev, null);
 | |
|     $pdi->set_Short_Title($title);
 | |
|     $pdi->set_Group_Title($title);
 | |
|     $pdi_id = $db->save_PDI($pdi);
 | |
| 
 | |
|     $stig = new stig($pdi_id, $ms, $title);
 | |
|     $db->add_Stig($stig);
 | |
|   }
 | |
| 
 | |
|   if ($tmp = $db->get_Advisory($ms)) {
 | |
|     $adv[] = $tmp[0];
 | |
|   }
 | |
| 
 | |
|   if ($tmp = $db->get_Advisory("$kb")) {
 | |
|     $adv[] = $tmp[0];
 | |
|   }
 | |
| 
 | |
|   if (is_array($adv) && count($adv)) {
 | |
|     foreach ($adv as $key => $ad) {
 | |
|       //if(!$ad->get_PDI_ID()) {
 | |
|       $ad->set_PDI_ID($pdi_id);
 | |
|       //}
 | |
| 
 | |
|       $ad->set_Title($title);
 | |
|       $ad->set_Impact($impact);
 | |
|     }
 | |
|   }
 | |
|   else {
 | |
|     if ($ms && $kb) {
 | |
|       $adv = array(
 | |
|         0 => new advisory($pdi_id, $ms, "", "", $ms_url),
 | |
|         1 => new advisory($pdi_id, $kb, "", "", $kb_url)
 | |
|       );
 | |
| 
 | |
|       $adv[0]->set_Title($title);
 | |
|       $adv[0]->set_Impact($impact);
 | |
| 
 | |
|       $adv[1]->set_Title($title);
 | |
|       $adv[1]->set_Impact($impact);
 | |
|     }
 | |
|     elseif ($ms) {
 | |
|       $adv = array(
 | |
|         0 => new advisory($pdi_id, $ms, "", "", $ms_url)
 | |
|       );
 | |
| 
 | |
|       $adv[0]->set_Title($title);
 | |
|       $adv[0]->set_Impact($impact);
 | |
|     }
 | |
|     elseif ($kb) {
 | |
|       $adv = array(
 | |
|         0 => new advisory($pdi_id, $kb, "", "", $kb_url)
 | |
|       );
 | |
| 
 | |
|       $adv[0]->set_Title($title);
 | |
|       $adv[0]->set_Impact($impact);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   $db->save_Advisory($adv);
 | |
| }
 | |
| 
 | |
| $end = new DateTime();
 | |
| 
 | |
| $diff = $start->diff($end);
 | |
| 
 | |
| $err->script_log($diff->format("%H:%I:%S"));
 |