Newer
Older
DirtyScripts / ReportToolz / rep2.php
root on 13 Jan 2020 11 KB minor fixes
  1. #!/usr/bin/php
  2. <?php
  3. //error_reporting(0);
  4.  
  5. /***
  6. * Configuration options
  7. */
  8. $sub1 = 5; // header no in doc e.g. "5 Discovered Vulnerabilities"
  9.  
  10. /***
  11. * Main program - Don't edit below
  12. */
  13. echo "_____ _____ _____ 2\n||_// ||== ||_// \n|| \\ ||___ || \n\n";
  14.  
  15. foreach (glob("classes/*.php") as $filename)
  16. include $filename;
  17.  
  18. $definitions = new \Clapp\CommandLineArgumentDefinition(
  19. array(
  20. "help|h" => "Shows help message",
  21. "doc|d=s" => "/path/to/doc.odt to use",
  22. )
  23. );
  24.  
  25. $filter = new \Clapp\CommandArgumentFilter($definitions, $argv);
  26.  
  27. if ($filter->getParam('h') === true || $argc < 2) {
  28. fwrite(STDERR, $definitions->getUsage());
  29. exit(0);
  30. }
  31.  
  32. // see if doc exists
  33. if ($filter->getParam("doc") == false)
  34. die("[-] no doc set\n");
  35.  
  36. echo "[!] doc: ".$filter->getParam("doc")."\n";
  37. if(!file_exists($filter->getParam("doc")))
  38. die("[-] no such file! \n");
  39.  
  40. // extract doc and get contents
  41. $rand = uniqid();
  42. mkdir("/tmp/$rand");
  43. if(unzipFolder($filter->getParam("doc"), "/tmp/$rand/")) {
  44. $source = file_get_contents("/tmp/$rand/content.xml");
  45. echo "[+] doc extracted\n";
  46. } else {
  47. die("[-] unable to extract doc\n");
  48. }
  49. // Parse Doc's XML
  50. $line = array();
  51. $reader = new XMLReader();
  52. if (!$reader->open("/tmp/$rand/content.xml")) die("[-] Failed to open 'content.xml'\n");
  53.  
  54. // font checker
  55. /***
  56. * FUTURE FEATURE PERHAPS
  57. */
  58. $fonts = array();
  59. while ($reader->read()){
  60. //print_r($reader->name);
  61. if ($reader->nodeType == XMLREADER::ELEMENT && ($reader->name === 'style:font-face')) {
  62. //if(!empty($reader->name)){
  63. //echo "here2\n";
  64. //$line[] = $reader->expand()->textContent; // Put the text into array in correct order...
  65. $fonts[] = $reader->getAttribute("style:name");
  66. //echo $font;echo "\n"; // DEBUG
  67. //}
  68. }
  69. }
  70. $reader->close();
  71. //die();
  72. echo "[=] fonts found: ".sizeof($fonts)."\n";
  73.  
  74. // step through text:h and text:p elements to put them into an array
  75. $reader = new XMLReader();
  76. if (!$reader->open("/tmp/$rand/content.xml")) die("[-] Failed to open 'content.xml'\n");
  77. while ($reader->read()){
  78. if ($reader->nodeType == XMLREADER::ELEMENT && ($reader->name === 'text:h' || $reader->name === 'text:p' || $reader->name === 'text:bookmark')) {
  79. if(!empty($reader->expand()->textContent))
  80. $line[] = $reader->expand()->textContent; // Put the text into array in correct order...
  81. //echo $reader->expand()->textContent;echo "\n"; // DEBUG
  82. }
  83. }
  84. $reader->close();
  85.  
  86. // find the content we want
  87. $start = 0; $end = 0;
  88. foreach($line as $key => $val){
  89. if(strpos($val, "Discovered Vulnerabilities") === 0){ $start = $key; }
  90. if(strpos($val, "Observed Hosts and Services") === 0){ $end = $key-2; }
  91. $line[$key] = trim($val);
  92. }
  93.  
  94. // add to sexy array's
  95. $vuln = array();
  96. $vulnPlace = 0;
  97. $switch = 0;
  98. $sub2 = 0;
  99. $sub3 = 1;
  100. for ($i=$start; $i <= $end ; $i++) {
  101. // change state (action to take)
  102. /***
  103. * ~states~
  104. * 0 = do nothing
  105. * 1 = next is title
  106. * 2 = next is description
  107. * 3 = next is solution
  108. * 4 = next is remediation
  109. * 5 = next is cvss no
  110. * 6 = next is risk level
  111. * 7 = next is hosts
  112. * 8 = next possibly title
  113. */
  114. switch ($line[$i]) {
  115. case 'Discovered Vulnerabilieies':
  116. $switch = 0;
  117. break;
  118. case 'Serious Risk Vulnerabilities':
  119. $sub2++; $sub3 = 1;
  120. $switch = 1;
  121. break;
  122. case 'High Risk Vulnerabilities':
  123. $sub2++; $sub3 = 1;
  124. $switch = 1;
  125. break;
  126. case 'Medium Risk Vulnerabilities':
  127. $sub2++; $sub3 = 1;
  128. $switch = 1;
  129. break;
  130. case 'Low Risk Vulnerabilities':
  131. $sub2++; $sub3 = 1;
  132. $switch = 1;
  133. break;
  134. case 'Description':
  135. $switch = 2;
  136. break;
  137. case 'Solution':
  138. $switch = 3;
  139. break;
  140. case 'Remediation':
  141. $switch = 4;
  142. break;
  143. case 'CVSS Base Score':
  144. $switch = 5;
  145. break;
  146. case 'Risk Level':
  147. $switch = 6;
  148. break;
  149. case 'Vulnerabilities Exist On':
  150. $switch = 7;
  151. break;
  152. case 'Potential Impact':
  153. $switch = 9;
  154. break;
  155. default:
  156. # code...
  157. break;
  158. }
  159.  
  160. //take action
  161. switch ($switch) {
  162. case 1:
  163. $i++;
  164. $vuln[$vulnPlace]['title'] = $line[$i];
  165. $vuln[$vulnPlace]['ref'] = "$sub1.$sub2.$sub3";
  166. $sub3++;
  167. $switch = 0;
  168. break;
  169. case 2:
  170. @$vuln[$vulnPlace]['desc'] .= $line[$i];
  171. break;
  172. case 3:
  173. @$vuln[$vulnPlace]['fix'] .= $line[$i];
  174. break;
  175. case 4:
  176. $i++;
  177. $vuln[$vulnPlace]['rem'] = trim(strtok($line[$i], " "));
  178. $switch = 0;
  179. break;
  180. case 5:
  181. $i++;
  182. $vuln[$vulnPlace]['cvss'] = $line[$i];
  183. $switch = 0;
  184. break;
  185. case 6:
  186. $i++;
  187. $vuln[$vulnPlace]['risk'] = trim(strtok($line[$i], " "));
  188. $vuln[$vulnPlace]['owasp'] = trim(substr($line[$i], strpos($line[$i], ":") + 1));
  189. $switch = 0;
  190. break;
  191. case 7:
  192. $i++;
  193. $vuln[$vulnPlace]['hosts'] = $line[$i];
  194. $switch = 8;
  195. $vulnPlace++;
  196. break;
  197. case 8:
  198. $vuln[$vulnPlace]['title'] = trim($line[$i]);
  199. $vuln[$vulnPlace]['ref'] = "$sub1.$sub2.$sub3";
  200. $sub3++;
  201. $switch = 0;
  202. break;
  203. case 9:
  204. @$vuln[$vulnPlace]['impact'] .= $line[$i];
  205. break;
  206. default:
  207. # code...
  208. break;
  209. }
  210.  
  211. //echo $line[$i]."\n"; // DEBUG
  212. }
  213.  
  214. // minor tidying of arrays
  215. for ($i=0; $i < sizeof($vuln) ; $i++) {
  216. if (strpos($vuln[$i]['desc'], "Description") === 0) $vuln[$i]['desc'] = substr($vuln[$i]['desc'], strlen("Description"));
  217. if (strpos($vuln[$i]['fix'], "Solution") === 0) $vuln[$i]['fix'] = substr($vuln[$i]['fix'], strlen("Solution"));
  218. $vuln[$i]['risk'] = rtrim($vuln[$i]['risk'], ":");
  219. // remove html encoding
  220. foreach($vuln[$i] as $key => $val){
  221. $vuln[$i][$key] = mb_convert_encoding($val, "UTF-8", 'UTF-8');
  222. }
  223. }
  224.  
  225. //print_r($vuln); // DEBUG
  226. echo "[+] vulnerabilities identified\n";
  227.  
  228. delTree("/tmp/$rand");
  229. echo "[+] temp files removed\n";
  230.  
  231. $resultsFolder = substr($filter->getParam("doc"), 0, strrpos( $filter->getParam("doc"), '/') )."/rep2";
  232. if(!file_exists($resultsFolder."/")){
  233. mkdir($resultsFolder."/");
  234. echo "[+] created directory $resultsFolder/\n";
  235. }else{
  236. $i = 1;
  237. while (file_exists($resultsFolder."_$i/"))
  238. $i++;
  239. mkdir($resultsFolder."_$i/");
  240. $resultsFolder .= "_$i";
  241. echo "[+] created directory $resultsFolder/\n";
  242. }
  243.  
  244. if(writeIssueTable($vuln, "Serious", $resultsFolder."/findings_serious.csv"))
  245. echo "[+] serious issues: $resultsFolder/findings_serious.csv\n";
  246. if(writeIssueTable($vuln, "High", $resultsFolder."/findings_high.csv"))
  247. echo "[+] high issues: $resultsFolder/findings_serious.csv\n";
  248. if(writeIssueTable($vuln, "Medium", $resultsFolder."/findings_medium.csv"))
  249. echo "[+] medium issues: $resultsFolder/findings_serious.csv\n";
  250. if(writeIssueTable($vuln, "Low", $resultsFolder."/findings_low.csv"))
  251. echo "[+] low issues: $resultsFolder/findings_serious.csv\n";
  252.  
  253. if(writeAllTable($vuln, $resultsFolder."/findings_all.csv"))
  254. echo "[+] all issues: $resultsFolder/findings_all.csv\n";
  255.  
  256. if(writeRemediationTable($vuln, $resultsFolder."/remediation.csv"))
  257. echo "[+] remediation table: $resultsFolder/remediation.csv\n";
  258.  
  259. if(writeOWASPTable($vuln, $resultsFolder."/owasp.csv"))
  260. echo "[+] OWASP table: $resultsFolder/owasp.csv\n";
  261.  
  262. viewVulns($vuln);
  263.  
  264. function unzipFolder($zipInputFile, $outputFolder) {
  265. $zip = new ZipArchive;
  266. $res = $zip->open($zipInputFile);
  267. if ($res === true) {
  268. $zip->extractTo($outputFolder);
  269. $zip->close();
  270. return true;
  271. }
  272. else {
  273. return false;
  274. }
  275. }
  276.  
  277. function XML2Array(SimpleXMLElement $parent){
  278. $array = array();
  279.  
  280. foreach ($parent as $name => $element) {
  281. ($node = & $array[$name])
  282. && (1 === count($node) ? $node = array($node) : 1)
  283. && $node = & $node[];
  284.  
  285. $node = $element->count() ? XML2Array($element) : trim($element);
  286. }
  287.  
  288. return $array;
  289. }
  290.  
  291. function delTree($dir){
  292. $files = array_diff(scandir($dir), array('.', '..'));
  293.  
  294. foreach ($files as $file) {
  295. (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
  296. }
  297.  
  298. return rmdir($dir);
  299. }
  300.  
  301. function viewVulns($vuln){
  302. $s = $h = $m = $l = 0;
  303. for ($i=0; $i < sizeof($vuln) ; $i++) {
  304. switch ($vuln[$i]['risk']) {
  305. case 'Serious':
  306. $s++;
  307. break;
  308. case 'High':
  309. $h++;
  310. break;
  311. case 'Medium':
  312. $m++;
  313. break;
  314. case 'Low':
  315. $l++;
  316. break;
  317. }
  318. }
  319. echo "[=] Serious = $s, High = $h, Medium = $m, Low = $l\n";
  320.  
  321. echo"
  322. Ref | Title | Risk | CVSS | Remediation | OWASP
  323. -------|-----------------------------------|--------|--------|---------------|------------------------------\n";
  324. for ($i=0; $i < sizeof($vuln) ; $i++) {
  325. $ref = str_pad($vuln[$i]['ref'], 7);
  326. $title = str_pad($vuln[$i]['title'], 35);
  327. $risk = str_pad($vuln[$i]['risk'], 8);
  328. $cvss = str_pad($vuln[$i]['cvss'], 8);
  329. $rem = str_pad($vuln[$i]['rem'], 15);
  330. $owasp = str_pad($vuln[$i]['owasp'], 30);
  331.  
  332. echo substr($ref, 0, 7); echo "|";
  333. echo substr($title, 0, 35); echo "|";
  334. echo substr($risk, 0, 8); echo "|";
  335. echo substr($cvss, 0, 8); echo "|";
  336. echo substr($rem, 0, 15); echo "|";
  337. echo substr($owasp, 0, 30); echo "\n";
  338. }
  339. }
  340.  
  341. function writeIssueTable($vuln, $issue, $path){
  342. $towrite = array();
  343. for ($i=0; $i < sizeof($vuln) ; $i++) {
  344. if($vuln[$i]['risk'] == $issue){
  345. $towrite[$i]['desc'] = $vuln[$i]['title']." - ".$vuln[$i]['desc'];
  346. $towrite[$i]['fix'] = $vuln[$i]['fix'];
  347. $towrite[$i]['ref'] = $vuln[$i]['ref'];
  348. $towrite[$i]['hosts'] = $vuln[$i]['hosts'];
  349. }
  350. }
  351. if(sizeof($towrite) > 0){
  352. $fp = fopen($path, 'w');
  353. fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));
  354. foreach ($towrite as $fields) {
  355. fputcsv($fp, $fields);
  356. }
  357. fclose($fp);
  358. return true;
  359. }else{
  360. return false;
  361. }
  362. }
  363.  
  364. function writeAllTable($vuln, $path){
  365. if(sizeof($vuln) > 0){
  366. $fp = fopen($path, 'w');
  367. fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));
  368. fputcsv($fp, array("Title", "Ref", "Description", "Solution", "Remediation", "CVSS", "Risk", "OWASP", "Affected"));
  369. foreach ($vuln as $fields) {
  370. fputcsv($fp, $fields);
  371. }
  372. fclose($fp);
  373. return true;
  374. }else{
  375. return false;
  376. }
  377. }
  378.  
  379. function writeRemediationTable($vuln, $path){
  380. $towrite = array();
  381. for ($i=0; $i < sizeof($vuln) ; $i++) {
  382. $towrite[$i]['hosts'] = $vuln[$i]['hosts'];
  383. $towrite[$i]['ref'] = $vuln[$i]['ref'];
  384. $towrite[$i]['p'] = " ";
  385. $towrite[$i]['c'] = " ";
  386. $towrite[$i]['d'] = " ";
  387. $towrite[$i]['u'] = " ";
  388. switch ($vuln[$i]['rem']) {
  389. case 'Patch':
  390. $towrite[$i]['p'] = $vuln[$i]['risk'][0];
  391. break;
  392. case 'Configuration':
  393. $towrite[$i]['c'] = $vuln[$i]['risk'][0];
  394. break;
  395. case 'Development':
  396. $towrite[$i]['d'] = $vuln[$i]['risk'][0];
  397. break;
  398. case 'Upgrade':
  399. $towrite[$i]['u'] = $vuln[$i]['risk'][0];
  400. break;
  401. }
  402. }
  403. if(sizeof($towrite) > 0){
  404. $fp = fopen($path, 'w');
  405. fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));
  406. fputcsv($fp, array("Host", "Ref", "P", "C", "D", "U"));
  407. foreach ($towrite as $fields) {
  408. fputcsv($fp, $fields);
  409. }
  410. fclose($fp);
  411. return true;
  412. }else{
  413. return false;
  414. }
  415. }
  416.  
  417. function writeOWASPTable($vuln, $path){
  418. $towrite = array();
  419. for ($i=0; $i < sizeof($vuln) ; $i++) {
  420. if(in_array($vuln[$i]['owasp'], array_column($towrite, 'owaspId'))){
  421. $towrite[$vuln[$i]['owasp']]['no']++;
  422. }else{
  423. $towrite[$vuln[$i]['owasp']]['owaspId'] = $vuln[$i]['owasp'];
  424. $towrite[$vuln[$i]['owasp']]['no'] = 1;
  425. }
  426. }
  427. if(sizeof($towrite) > 0){
  428. $fp = fopen($path, 'w');
  429. fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));
  430. foreach ($towrite as $fields) {
  431. fputcsv($fp, $fields);
  432. }
  433. fclose($fp);
  434. return true;
  435. }else{
  436. return false;
  437. }
  438. }
  439.  
  440. ?>
Buy Me A Coffee