0; "); }else{ $result = sqlite_query($db, "SELECT * FROM {$table} where {$type} = '{$id_uuid}'; "); } if ($type == 'rdbuuid' || $type == 'All') { $chktable = sqlite_fetch_all($result, SQLITE_ASSOC); }else{ $chktable = sqlite_fetch_array($result, SQLITE_ASSOC); } sqlite_close($db); return $chktable; } // end func function snortSql_updateRuleSetList($type, $value, $file_size, $downloaded, $filename) { $dbname = 'snortDBtemp'; $table = 'SnortDownloads'; $addDate = date(U); // do let user pick the DB path $db = sqlite_open("/var/snort/{$dbname}"); if ($type === 'percent2'){ $query_ck = sqlite_query($db, // @ supress warnings usonly in production "UPDATE {$table} SET date = '{$addDate}', percent = '{$value}', filesize = '{$file_size}', downloaded = '{$downloaded}' where filename = '{$filename}'; "); } if ($type === 'percent'){ $query_ck = sqlite_query($db, // @ supress warnings usonly in production "UPDATE {$table} SET date = '{$addDate}', percent = '{$value}' where filename = '{$filename}'; "); } if ($type === 'msg1'){ $query_ck = sqlite_query($db, // @ supress warnings usonly in production "UPDATE SnortDownloadsMsg SET date = '{$addDate}', msg = '{$value}' where id = '1'; "); } if ($type === 'msg2'){ $query_ck = sqlite_query($db, // @ supress warnings usonly in production "UPDATE SnortDownloadsMsg SET date = '{$addDate}', msg = '{$value}' where id = '2'; "); } /* * INPORTANT: * Register worker to prevent loops and ghost process * Needs to be watched, */ if ($type === 'working'){ $getmypid = getmypid(); $getmyfilename = $_SERVER['SCRIPT_NAME']; $resultChk = sqlite_query($db, "SELECT * FROM RegisterWorker WHERE uuid = 'jdjEf!773&h3bhFd6A'; "); $resultChkFinal = sqlite_fetch_all($resultChk, SQLITE_ASSOC); if (!empty($resultChkFinal)) { $query_ck = sqlite_query($db, // @ supress warnings usonly in production "UPDATE RegisterWorker SET date = '{$addDate}', processid = '{$getmypid}', filename = '{$getmyfilename}', working = '{$value}' where uuid = 'jdjEf!773&h3bhFd6A'; "); }else{ $query_ck = sqlite_query($db, // @ supress warnings usonly in production "INSERT INTO RegisterWorker (date, processid, filename, working, uuid) VALUES ('{$addDate}', '{$getmypid}', '{$getmyfilename}', '{$value}', 'jdjEf!773&h3bhFd6A'); "); } } if ($type === 'snortWait'){ $query_ck = sqlite_query($db, // @ supress warnings usonly in production "UPDATE {$table} SET waittime = '{$addDate}' where filename = '{$filename}'; "); } if (sqlite_changes($db) < 1){ sqlite_close($db); return 'Error in query'; } sqlite_close($db); } // reapply rule settings function reapplyRuleSettings_run($sidRule_array) { $sid_array = snortSql_fetchAllSettings2('snortDBrules', 'SnortruleSigs', 'rdbuuid', $sidRule_array); if (!empty($sid_array)) { foreach ($sid_array as $sid) { if (!empty($sid['enable']) && !empty($sid['signatureid']) && !empty($sid['rdbuuid']) && !empty($sid['signaturefilename'])) { if ($sid['enable'] === 'on') { exec('/usr/bin/sed -i \'\' \'s/^# \(.*sid:' . "{$sid['signatureid']}" . ';.*\)/\1/\' /usr/local/etc/snort/snortDBrules/DB/' . "{$sid['rdbuuid']}" . '/rules/' . "{$sid['signaturefilename']}"); } if ($sid['enable'] === 'off') { exec('/usr/bin/sed -i \'\' \'s/^\(alert.*sid:' . "{$sid['signatureid']}" . ';.*\)/# \1/\' /usr/local/etc/snort/snortDBrules/DB/' . "{$sid['rdbuuid']}" . '/rules/' . "{$sid['signaturefilename']}"); } } } } // NOTES: DO NOT REMOVE BELOW COMMENTS // returns file pathe of the sid // $testing = exec("grep -ri 'sid: \?1225; ' /usr/local/etc/snort/snortDBrules/DB/RAjFYOrC04D6/rules | tail -n1 | awk -F: '{print $1}'"); // see if sid is enabled // $testing2 = exec("sed -n '/^alert.*sid:1225;.*/p' /usr/local/etc/snort/snortDBrules/DB/RAjFYOrC04D6/rules/snort_x11.rules"); // enable a sid // sed -i '' "s/^# \(.*sid:1225;.*\)/\1/" /usr/local/etc/snort/snortDBrules/DB/RAjFYOrC04D6/rules/snort_x11.rules // disable a sid // sed -i '' "s/^\(alert.*sid:1225;.*\)/# \1/" /usr/local/etc/snort/snortDBrules/DB/RAjFYOrC04D6/rules/snort_x11.rules // grep "^alert.*sid:.*;" rules/emerging-worm.rules | grep -oh "\w*sid:[0-9][^*;]\w*" | awk -F: '{print $2}' // sed -n '/^320 || .*/{p;q;}' rules/ ../etc/sid-msg.map | awk -F '|' '{print $3}' | sed -e 's/^[ \t]*//' } function snortCmpareMD5($type, $path1, $path2, $filename_md5) { update_output_window2('ms2', 'Checking ' . $filename_md5 . ' MD5...'); if (file_exists("{$path1}/{$filename_md5}")){ if ($type == 'string'){ $md5_check_new = @file_get_contents("{$path1}/{$filename_md5}"); $md5_check_old = @file_get_contents("{$path2}/{$filename_md5}"); if ($md5_check_new !== $md5_check_old){ update_output_window2('ms2', "$filename_md5 MD5s do not match..."); return false; } } if ($type == 'md5'){ //md5 snortrules-snapshot-2905.tar.gz | awk '{print $4}' $md5_check_new2 = exec("/sbin/md5 {$path1}/{$filename_md5} | /usr/bin/awk '{print $4}'"); $md5_check_old2 = exec("/sbin/md5 {$path2}/{$filename_md5} | /usr/bin/awk '{print $4}'"); if ($md5_check_new != $md5_check_old){ update_output_window2('ms2', "$filename_md5 MD5s do not match..."); return false; } } if ($type == 'md5FileChk') { //md5 snortrules-snapshot-2905.tar.gz | awk '{print $4}' $md5_check_new = trim(exec("/sbin/md5 {$path1}/{$filename_md5} | /usr/bin/awk '{print $4}'")); $md5_check_old = exec("/bin/cat {$path1}/{$filename_md5}.md5"); $md5_check_old2 = trim(preg_replace('/"/', '', $md5_check_old)); if ($md5_check_new != $md5_check_old2){ update_output_window2('ms2', "$filename_md5 MD5s do not match..."); return false; } } } update_output_window2('ms2', "$filename_md5 MD5 File Check Passed..."); return true; } /* * update_output_window: update bottom textarea dynamically. */ function update_output_window2($type, $text) { if ($type === 'ms1') { $msg = 1; } if ($type === 'ms2') { $msg = 2; } if ($GLOBALS['tmp']['snort']['downloadupdate']['console'] != 'on'){ echo ' '; ob_flush(); apc_clear_cache(); }else{ echo "\n" . $type . ': ' . $text; } } // returns array that matches pattern, option to replace objects in matches function snortScanDirFilter2($arrayList, $pattmatch, $pattreplace, $pattreplacewith) { foreach ( $arrayList as $val ) { if (preg_match($pattmatch, $val, $matches)) { if ($pattreplace != '') { $matches2 = preg_replace($pattreplace, $pattreplacewith, $matches[0]); $filterDirList[] = $matches2; }else{ $filterDirList[] = $matches[0]; } } } return $filterDirList; } // set page vars $generalSettings = snortSql_fetchAllSettings2('snortDB', 'SnortSettings', 'id', '1'); // Setup file names and dir $tmpfname = '/usr/local/etc/snort/snort_download'; $snortdir = '/usr/local/etc/snort'; $snortdir_rules = '/usr/local/etc/snort/snortDBrules/snort_rules'; $emergingdir_rules = '/usr/local/etc/snort/snortDBrules/emerging_rules'; $pfsensedir_rules = '/usr/local/etc/snort/snortDBrules/pfsense_rules'; $customdir_rules = '/usr/local/etc/snort/snortDBrules/custom_rules'; $snort_filename_md5 = 'snortrules-snapshot-2905.tar.gz.md5'; $snort_filename = 'snortrules-snapshot-2905.tar.gz'; $emergingthreats_filename_md5 = 'emerging.rules.tar.gz.md5'; $emergingthreats_filename = 'emerging.rules.tar.gz'; $pfsense_rules_filename_md5 = 'pfsense_rules.tar.gz.md5'; $pfsense_rules_filename = 'pfsense_rules.tar.gz'; // START of MAIN function function sendUpdateSnortLogDownload($console) { if ($console === 'console'){ $GLOBALS['tmp']['snort']['downloadupdate']['console'] = 'on'; } if ($console !== 'console') { echo ' '; } //bring in the global vars global $generalSettings, $tmpfname, $snortdir, $snortdir_rules, $emergingdir_rules, $pfsensedir_rules, $customdir_rules, $snort_filename_md5, $snort_filename, $emergingthreats_filename_md5, $emergingthreats_filename, $pfsense_rules_filename_md5, $pfsense_rules_filename; /* Make shure snortdir exits */ if (!file_exists("{$snortdir}")) { exec("/bin/mkdir -p {$snortdir}"); } if (!file_exists("{$tmpfname}")) { exec("/bin/mkdir -p {$tmpfname}"); } if (!file_exists("{$snortdir_rules}")) { exec("/bin/mkdir -p {$snortdir_rules}"); } if (!file_exists("{$emergingdir_rules}")) { exec("/bin/mkdir -p {$emergingdir_rules}"); } if (!file_exists("{$pfsensedir_rules}")) { exec("/bin/mkdir -p {$pfsensedir_rules}"); } if (!file_exists("{$customdir_rules}")) { exec("/bin/mkdir -p {$customdir_rules}"); } if (!file_exists("{$snortdir}/signatures")) { exec("/bin/mkdir -p {$snortdir}/signatures"); } if (!file_exists('/usr/local/lib/snort/dynamicrules/')) { exec('/bin/mkdir -p /usr/local/lib/snort/dynamicrules/'); } /* Set user agent to Mozilla */ ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 6.0)'); ini_set("memory_limit","150M"); // Get file that does not use redirects, mostly for none snort.org downloads function snort_file_get_contents($tmpfname, $snort_filename, $snort_UrlGet) { if (!file_exists("{$tmpfname}/{$snort_filename}") || filesize("{$tmpfname}/{$snort_filename}") <= 0){ update_output_window2('ms2', 'Downloading ' . $snort_filename. ' MD5...'); ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 6.0)'); $file = file_get_contents("$snort_UrlGet/{$snort_filename}"); // use a @ infront of file_get_contents when in production $f = fopen("{$tmpfname}/{$snort_filename}", 'w'); fwrite($f, $file); fclose($f); update_output_window2('ms2', 'Finnished Downloading ' . $snort_filename. ' MD5...'); } } function read_header2($ch, $string) { global $file_size, $fout; $length = strlen($string); $regs = ""; ereg("(Content-Length:) (.*)", $string, $regs); if($regs[2] <> "") { $file_size = intval($regs[2]); } ob_flush(); return $length; } function read_body2($ch, $string) { global $fout, $file_size, $downloaded, $sendto, $static_status, $static_output, $lastseen; global $pkg_interface; $length = strlen($string); $downloaded += intval($length); if($file_size > 0) { $downloadProgress = round(100 * (1 - $downloaded / $file_size), 0); $downloadProgress = 100 - $downloadProgress; } else $downloadProgress = 0; if($lastseen <> $downloadProgress and $downloadProgress < 101) { if($sendto == "status") { if($pkg_interface == "console") { if(substr($downloadProgress,2,1) == "0" || count($downloadProgress) < 2) { $tostatus = $static_status . $downloadProgress . "%"; update_status($tostatus); } } else { $tostatus = $static_status . $downloadProgress . "%"; update_status($tostatus); } } else { if($pkg_interface == "console") { if(substr($downloadProgress,2,1) == "0" || count($downloadProgress) < 2) { $tooutput = $static_output . $downloadProgress . "%"; update_output_window($tooutput); } } else { $tooutput = $static_output . $downloadProgress . "%"; update_output_window($tooutput); } } update_progress_bar($downloadProgress); $lastseen = $downloadProgress; } if($fout) fwrite($fout, $string); ob_flush(); return $length; } /* * update_progress_bar($percent): updates the javascript driven progress bar. */ function update_progress_bar2($percent, $file_size, $downloaded) { if ($GLOBALS['tmp']['snort']['downloadupdate']['console'] != 'on') { if (!empty($percent)) { echo ' '; } }else{ echo "\n" . 'percent: ' . $percent . ' filesize: ' . $file_size . ' downloaded: ' . $downloaded; } } function read_body_firmware($ch, $string) { global $fout, $file_size, $downloaded, $counter; $length = strlen($string); $downloaded += intval($length); $downloadProgress = round(100 * (1 - $downloaded / $file_size), 0); $downloadProgress = 100 - $downloadProgress; $counter++; if($counter > 150) { update_progress_bar2($downloadProgress, $file_size, $downloaded); flush(); $counter = 0; } fwrite($fout, $string); return $length; } function download_file_with_progress_bar2($url_file, $destination, $workingfile, $readbody = 'read_body2') { global $ch, $fout, $file_size, $downloaded; $file_size = 1; $downloaded = 1; $destination_file = $destination . '/' . $workingfile; /* open destination file */ $fout = fopen($destination_file, "wb"); /* * Originally by Author: Keyvan Minoukadeh * Modified by Scott Ullrich to return Content-Length size */ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url_file); curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header2'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_WRITEFUNCTION, $readbody); curl_setopt($ch, CURLOPT_NOPROGRESS, '1'); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, '5'); curl_setopt($ch, CURLOPT_TIMEOUT, 0); curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if($fout) fclose($fout); curl_close($ch); return ($http_code == 200) ? true : $http_code; } // ----------------------------------------------------- Begin Code -------------------------------------------- // rm all tmp filea @exec("/bin/rm -r $tmpfname/*"); // Set all downloads to be false, download by default $snort_md5_check_ok = false; $emerg_md5_check_ok = false; $pfsense_md5_check_ok = false; // define checks $oinkid = $generalSettings['oinkmastercode']; $emergingthreatscode = $generalSettings['emergingthreatscode']; // dsable downloads if there settings are off if ($generalSettings['snortdownload'] === 'off') { $snort_md5_check_ok = true; } if ($generalSettings['emergingthreatsdownload'] == 'off') { $emerg_md5_check_ok = true; } if ($oinkid == '' && $generalSettings['snortdownload'] === 'on') { update_output_window2('ms1', 'Snort Error!'); update_output_window2('ms2', 'You must obtain an oinkid from snort.org and set its value in the Snort settings tab.'); exec("/usr/bin/logger -p daemon.info -i -t SnortStartup 'You must obtain an oinkid from snort.org and set its value in the Snort settings tab.'"); return false; } if ($emergingthreatscode === '' && $generalSettings['snortdownload'] === 'pro') { update_output_window2('ms1', 'Snort Error!'); update_output_window2('ms2', 'You must obtain an emergingthreat pro id from emergingthreatspro.com and set its value in the Snort settings tab.'); exec("/usr/bin/logger -p daemon.info -i -t SnortStartup 'You must obtain an emergingthreat pro id from emergingthreatspro.com and set its value in the Snort settings tab.'"); return false; } if ($generalSettings['snortdownload'] === 'off' && $generalSettings['emergingthreatsdownload'] === 'off') { // note: basic and pro update_output_window2('ms1', 'Snort Error!'); update_output_window2('ms2', 'SnortStartup: No rules have been selected to download.'); exec("/usr/bin/logger -p daemon.info -i -t SnortStartup 'No rules have been selected to download.'"); return false; } /* * Check MD5s and MARK * */ update_output_window2('ms1', 'Starting MD5 checks...'); // check is we need to wait update_output_window2('ms2', 'Checking Wait Status for Snort.org...'); $getSnort_filename_Waittime_chk = snortSql_fetchAllSettings2('snortDBtemp', 'SnortDownloads', 'filename', $snort_filename); if (date(U) > $getSnort_filename_Waittime_chk['waittime'] + 900) { update_output_window2('ms2', 'Snort.org Wait Time Status: OK...'); }else{ update_output_window2('ms2', 'Snort.org Wait Time Status: Wait 15 min Please...'); $snort_md5_check_ok = true; $snort_wait = true; } // check is we need to wait update_output_window2('ms2', 'Checking Wait Status for Emergingthreats.net...'); $getEmergingthreats_filename_Waittime_chk = snortSql_fetchAllSettings2('snortDBtemp', 'SnortDownloads', 'filename', $emergingthreats_filename); if (date(U) > $getEmergingthreats_filename_Waittime_chk['waittime'] + 900) { update_output_window2('ms2', 'Emergingthreats.net Wait Time Status: OK...'); }else{ update_output_window2('ms2', 'Emergingthreats.net Wait Time Status: Wait 15 min Please...'); $emerg_md5_check_ok = true; $emerg_wait = true; } // if all rules need wait stop if ($snort_wait === true && $emerg_wait === true) { return false; } // download snort.org md5 and compare if ($snort_md5_check_ok === false) { snort_file_get_contents($tmpfname, $snort_filename_md5, 'http://www.snort.org/pub-bin/oinkmaster.cgi/' . $oinkid); snortSql_updateRuleSetList('percent', '100', '', '', $snort_filename_md5); // finsh percent // if snort.org md5 do not match if(snortCmpareMD5('string', $tmpfname, $snortdir_rules, $snort_filename_md5)) { $snort_md5_check_ok = true; } } // download emergingthreats.net md5 and compare if ($emerg_md5_check_ok === false) { snort_file_get_contents($tmpfname, $emergingthreats_filename_md5, 'http://rules.emergingthreats.net/open/snort-2.9.0'); snortSql_updateRuleSetList('percent', '100', '', '', $emergingthreats_filename_md5); // finsh percent // if emergingthreats.net md5 do not match if(snortCmpareMD5('string', $tmpfname, $emergingdir_rules, $emergingthreats_filename_md5)) { $emerg_md5_check_ok = true; } } // download pfsense.org md5 and compare snort_file_get_contents($tmpfname, $pfsense_rules_filename_md5, 'http://www.pfsense.com/packages/config/snort/pfsense_rules'); snortSql_updateRuleSetList('percent', '100', '', '', $pfsense_rules_filename_md5); // finsh percent // if pfsense.org md5 do not match if(snortCmpareMD5('string', $tmpfname, $pfsensedir_rules, $pfsense_rules_filename_md5)) { $pfsense_md5_check_ok = true; } /* * If all rule type is not check clean up. */ /* Make Clean Snort Directory emergingthreats not checked */ if ($snort_md5_check_ok === false && $emergingthreatsdownload === 'off') { update_output_window2('ms1', 'Cleaning the emergingthreats Directory...'); exec("/bin/rm {$snortdir}/emerging_rules/*.rules"); exec("/bin/rm {$snortdir}/version.txt"); update_output_window2('ms2', 'Done cleaning emrg direcory.'); } /* Make Clean Snort Directory snort.org not checked */ if ($emerg_md5_check_ok === false && $snortdownload !== 'on') { update_output_window2('ms1', 'Cleaning the snort Directory...'); exec("/bin/rm {$snortdir}/snort_rules/*.rules"); exec("/bin/rm {$snortdir}/snortrules-snapshot-2905.tar.gz.md5"); update_output_window2('ms2', 'Done cleaning snort direcory.'); } /* Check if were up to date exits */ if ($snort_md5_check_ok === true && $emerg_md5_check_ok === true && $pfsense_md5_check_ok === true) { update_output_window2('ms1', 'Your rules are up to date...'); return false; } /* You are Not Up to date, always stop snort when updating rules for low end machines */; update_output_window2('ms1', 'You are NOT up to date...'); update_output_window2('ms2', 'Stopping Snort and Barnyard2 service...'); $chk_if_snort_up = exec('pgrep -x snort'); $chk_if_barnyad_up = exec('pgrep -x barnyad2'); if ($chk_if_snort_up != '') { exec('/usr/bin/touch /tmp/snort_download_halt.pid'); // IMPORTANT: incase of script crash or error, Mabe use DB exec('/usr/bin/killall snort'); if ($chk_if_barnyad_up != ''){ exec('/usr/bin/killall barnyad2'); } sleep(2); } /* download snortrules file */ if ($snort_md5_check_ok === false) { $GLOBALS['tmp']['snort']['downloadupdate']['workingfile'] = $snort_filename; update_output_window2('ms1', 'Snort.org: Starting Download...'); update_output_window2('ms2', 'May take a while...'); download_file_with_progress_bar2("http://www.snort.org/pub-bin/oinkmaster.cgi/{$oinkid}/{$snort_filename}", $tmpfname, $snort_filename, "read_body_firmware"); //download_file_with_progress_bar2("http://theseusnetworking.com/pub-bin/oinkmaster.cgi/{$oinkid}/{$snort_filename}", $tmpfname, $snort_filename, "read_body_firmware"); update_progress_bar2(100, '', ''); // finsh percent snortSql_updateRuleSetList('percent', '100', '', '', $snort_filename); // finsh percent, add date time finnished update_output_window2('ms2', 'Snort.org: Finished Download...'); // if md5 does not match then the file is bad or snort.org says wait 15 min update_output_window2('ms1', 'Snort.org MD5 File Check ...'); if (!snortCmpareMD5('md5FileChk', $tmpfname, '', $snort_filename)) { $snort_filename_wait_ck = exec("/usr/bin/egrep '\bYou must wait 15\b' {$tmpfname}/{$snort_filename}"); if ($snort_filename_wait_ck != '') { update_output_window2('ms2', 'Snort.org: You must wait 15 min...'); } // disable snort.org download $snort_md5_check_ok = true; $snort_filename_corrupted = true; } } /* download emergingthreats file */ if ($emerg_md5_check_ok === false) { $GLOBALS['tmp']['snort']['downloadupdate']['workingfile'] = $emergingthreats_filename; update_output_window2('ms1', 'Emergingthreats.net: Starting Download...'); update_output_window2('ms2', 'May take a while...'); download_file_with_progress_bar2("http://rules.emergingthreats.net/open/snort-2.9.0/{$emergingthreats_filename}", $tmpfname, $emergingthreats_filename, "read_body_firmware"); update_progress_bar2(100, '', ''); // finsh percent snortSql_updateRuleSetList('percent', '100', '', '', $emergingthreats_filename); // finsh percent update_output_window2('ms2', 'Emergingthreats.net: Finished Download...'); // if md5 does not match then the file is bad or snort.org says wait 15 min update_output_window2('ms1', 'Emergingthreats MD5 File Check ...'); if (!snortCmpareMD5('md5FileChk', $tmpfname, '', $emergingthreats_filename)) { // disable snort.org download $emerg_md5_check_ok = true; $emerg_filename_corrupted = true; } } /* download pfsense rule file */ if ($pfsense_md5_check_ok === false) { $GLOBALS['tmp']['snort']['downloadupdate']['workingfile'] = $pfsense_rules_filename; update_output_window2('ms1', 'pfSense.org: Starting Download...'); update_output_window2('ms2', 'May take a while...'); download_file_with_progress_bar2("http://www.pfsense.com/packages/config/snort/pfsense_rules/{$pfsense_rules_filename}", $tmpfname, $pfsense_rules_filename, "read_body_firmware"); update_progress_bar2(100, '', ''); // finsh percent snortSql_updateRuleSetList('percent', '100', '', '', $pfsense_rules_filename); // finsh percent update_output_window2('ms2', 'pfSense.org: Finished Download...'); // if md5 does not match then the file is bad or snort.org says wait 15 min update_output_window2('ms1', 'pfSense.org MD5 File Check ...'); if (!snortCmpareMD5('md5FileChk', $tmpfname, '', $pfsense_rules_filename)) { // disable snort.org download $pfsense_md5_check_ok = true; } } // if both files are corrupted stop if ($snort_filename_corrupted === true && $emerg_filename_corrupted === true) { update_output_window2('ms1', 'Snort.org and Emergingthreats.net files are corrupted.'); update_output_window2('ms2', 'Stoping Script...'); return false; } /* * START: Untar Files */ // Untar snort rules file individually to help people with low system specs if ($snort_md5_check_ok === false && file_exists("{$tmpfname}/{$snort_filename}")) { update_output_window2('ms1', 'Extracting Snort.org rules...'); update_output_window2('ms2', 'May take a while...'); function build_SnortRuleDir() { global $tmpfname, $snortdir, $snortdir_rules, $snort_filename; // find out if were in 1.2.3-RELEASE $pfsense_ver_chk = exec('/bin/cat /etc/version'); if ($pfsense_ver_chk === '1.2.3-RELEASE') { $pfsense_stable = 'yes'; }else{ $pfsense_stable = 'no'; } // get the system arch $snort_arch_ck = exec('/usr/bin/uname -m'); if ($snort_arch_ck === 'i386') { $snort_arch = 'i386'; }else{ $snort_arch = 'x86-64'; // amd64 } if ($pfsense_stable === 'yes') { $freebsd_version_so = 'FreeBSD-7-3'; }else{ $freebsd_version_so = 'FreeBSD-8-1'; } // extract snort.org rules and add prefix to all snort.org files @exec("/bin/rm -r {$snortdir_rules}/rules"); exec("/usr/bin/tar xzf {$tmpfname}/{$snort_filename} -C {$snortdir_rules} rules/"); $snort_dirList = scandir("{$snortdir_rules}/rules"); // Waning: only in php 5 $snortrules_filterList = snortscandirfilter2($snort_dirList, '/.*\.rules/', '/\.rules/', ''); if (!empty($snortrules_filterList)) { foreach ($snortrules_filterList as $snort_rule_move) { exec("/bin/mv -f {$snortdir_rules}/rules/{$snort_rule_move}.rules {$snortdir_rules}/rules/snort_{$snort_rule_move}.rules"); } } // extract so rules exec("/usr/bin/tar xzf {$tmpfname}/{$snort_filename} -C {$snortdir_rules} so_rules/precompiled/$freebsd_version_so/$snort_arch/2.9.0.5/"); exec("/bin/mv -f {$snortdir_rules}/so_rules/precompiled/$freebsd_version_so/$snort_arch/2.9.0.5/* /usr/local/lib/snort/dynamicrules/"); // list so_rules and exclude dir exec("/usr/bin/tar --exclude='precompiled' --exclude='src' -tf {$tmpfname}/{$snort_filename} so_rules", $so_rules_list); $so_rulesPattr = array('/\//', '/\.rules/'); $so_rulesPattw = array('', ''); // build list of so rules $so_rules_filterList = snortscandirfilter2($so_rules_list, '/\/.*\.rules/', $so_rulesPattr, $so_rulesPattw); if (!empty($so_rules_filterList)) { // cp rule to so tmp dir foreach ($so_rules_filterList as $so_rule) { exec("/usr/bin/tar xzf {$tmpfname}/{$snort_filename} -C {$snortdir_rules} so_rules/{$so_rule}.rules"); } // mv and rename so rules foreach ($so_rules_filterList as $so_rule_move) { exec("/bin/mv -f {$snortdir_rules}/so_rules/{$so_rule_move}.rules {$snortdir_rules}/rules/snort_{$so_rule_move}.so.rules"); } } exec("/bin/rm -r {$snortdir_rules}/so_rules"); // extract base etc files exec("/usr/bin/tar xzf {$tmpfname}/{$snort_filename} -C {$snortdir} etc/"); } build_SnortRuleDir(); // cp md5 to main snort dir exec("/bin/cp {$tmpfname}/{$snort_filename_md5} {$snortdir_rules}/{$snort_filename_md5}"); update_output_window2('ms2', 'Done extracting Snort.org Rules.'); } /* Untar emergingthreats rules to tmp */ if ($emerg_md5_check_ok === false && file_exists("{$tmpfname}/{$emergingthreats_filename}")) { if (file_exists("{$tmpfname}/{$emergingthreats_filename}")) { update_output_window2('ms1', 'Extracting Emergingthreats Rules...'); update_output_window2('ms2', 'May take a while...'); @exec("/bin/rm -r {$emergingdir_rules}/rules"); exec("/usr/bin/tar xzf {$tmpfname}/{$emergingthreats_filename} -C {$emergingdir_rules} rules/"); exec("/bin/cp {$tmpfname}/{$emergingthreats_filename_md5} {$emergingdir_rules}/{$emergingthreats_filename_md5}"); update_output_window2('ms2', 'Done extracting Emergingthreats.net Rules.'); } } /* Untar Pfsense rules to tmp */ if ($pfsense_md5_check_ok === false && file_exists("{$tmpfname}/{$pfsense_rules_filename}")) { if (file_exists("{$tmpfname}/{$pfsense_rules_filename}")) { update_output_window2('ms1', 'Extracting Pfsense rules...'); update_output_window2('ms1', 'May take a while...'); @exec("/bin/rm -r {$pfsensedir_rules}/rules"); exec("/usr/bin/tar xzf {$tmpfname}/{$pfsense_rules_filename} -C {$pfsensedir_rules} rules/"); exec("/bin/cp {$tmpfname}/{$pfsense_rules_filename_md5} {$pfsensedir_rules}/{$pfsense_rules_filename_md5}"); update_output_window2('ms2', 'Done extracting pfSense.org Rules.'); } } /* double make shure cleanup emerg rules that dont belong */ if (file_exists("/usr/local/lib/snort/dynamicrules/lib_sfdynamic_example_rule.so")) { exec("/bin/rm /usr/local/lib/snort/dynamicrules/lib_sfdynamic_example_rule.so"); exec("/bin/rm /usr/local/lib/snort/dynamicrules/lib_sfdynamic_example\*"); } // make sure default rules are in the right format update_output_window2('ms1', 'Reformatting Rules To One Standard...'); update_output_window2('ms2', 'Please Wait...'); exec("/usr/bin/sed -i '' 's/^[ \t]*//' {$snortdir_rules}/rules/*.rules"); // remove white spaces from begining of line exec("/usr/bin/sed -i '' 's/^#alert*/\# alert/' {$snortdir_rules}/rules/*.rules"); exec("/usr/bin/sed -i '' 's/^##alert*/\# alert/' {$snortdir_rules}/rules/*.rules"); exec("/usr/bin/sed -i '' 's/^## alert*/\# alert/' {$snortdir_rules}/rules/*.rules"); exec("/usr/bin/sed -i '' 's/^[ \t]*//' {$emergingdir_rules}/rules/*.rules"); exec("/usr/bin/sed -i '' 's/^#alert*/\# alert/' {$emergingdir_rules}/rules/*.rules"); exec("/usr/bin/sed -i '' 's/^##alert*/\# alert/' {$emergingdir_rules}/rules/*.rules"); exec("/usr/bin/sed -i '' 's/^## alert*/\# alert/' {$emergingdir_rules}/rules/*.rules"); exec("/usr/bin/sed -i '' 's/^[ \t]*//' {$pfsensedir_rules}/rules/*.rules"); exec("/usr/bin/sed -i '' 's/^#alert*/\# alert/' {$pfsensedir_rules}/rules/*.rules"); exec("/usr/bin/sed -i '' 's/^##alert*/\# alert/' {$pfsensedir_rules}/rules/*.rules"); exec("/usr/bin/sed -i '' 's/^## alert*/\# alert/' {$pfsensedir_rules}/rules/*.rules"); update_output_window2('ms2', 'Done...'); /* create a msg-map for snort */ update_output_window2('ms1', 'Updating Alert Sid Messages...'); update_output_window2('ms2', 'Please Wait...'); exec("/usr/local/bin/perl /usr/local/bin/create-sidmap.pl {$snortdir_rules}/rules > /usr/local/etc/snort/etc/sid-msg.map"); exec("/usr/local/bin/perl /usr/local/bin/create-sidmap.pl {$emergingdir_rules}/rules >> /usr/local/etc/snort/etc/sid-msg.map"); exec("/usr/local/bin/perl /usr/local/bin/create-sidmap.pl {$pfsensedir_rules}/rules >> /usr/local/etc/snort/etc/sid-msg.map"); update_output_window2('ms2', 'Done...'); // create default dir if (!file_exists('/usr/local/etc/snort/snortDBrules/DB/default/rules')) { exec('/bin/mkdir -p /usr/local/etc/snort/snortDBrules/DB/default/rules'); } // cp new rules to default dir exec('/bin/rm /usr/local/etc/snort/snortDBrules/DB/default/rules/*.rules'); exec("/bin/cp {$snortdir_rules}/rules/*.rules /usr/local/etc/snort/snortDBrules/DB/default/rules"); exec("/bin/cp {$emergingdir_rules}/rules/*.rules /usr/local/etc/snort/snortDBrules/DB/default/rules"); exec("/bin/cp {$pfsensedir_rules}/rules/*.rules /usr/local/etc/snort/snortDBrules/DB/default/rules"); // reapplay rules from DB cp base rules to dirs $sidOnOff_array = snortSql_fetchAllSettings2('snortDBrules', 'Snortrules', 'All', ''); if (!empty($sidOnOff_array)) { update_output_window2('ms1', 'Reapplying User Settings...'); update_output_window2('ms2', 'Please Wait...'); foreach ($sidOnOff_array as $preSid_Array) { if (!file_exists("/usr/local/etc/snort/snortDBrules/DB/{$preSid_Array['uuid']}/rules")) { exec("/bin/mkdir -p /usr/local/etc/snort/snortDBrules/DB/{$preSid_Array['uuid']}/rules"); } exec("/bin/rm /usr/local/etc/snort/snortDBrules/DB/{$preSid_Array['uuid']}/rules/*.rules"); exec("/bin/cp {$snortdir_rules}/rules/*.rules /usr/local/etc/snort/snortDBrules/DB/{$preSid_Array['uuid']}/rules"); exec("/bin/cp {$emergingdir_rules}/rules/*.rules /usr/local/etc/snort/snortDBrules/DB/{$preSid_Array['uuid']}/rules"); exec("/bin/cp {$pfsensedir_rules}/rules/*.rules /usr/local/etc/snort/snortDBrules/DB/{$preSid_Array['uuid']}/rules"); reapplyRuleSettings_run($preSid_Array['uuid']); update_output_window2('ms2', 'Done...'); } } // cp snort conf's to Ifaces $ifaceConfMaps_array = snortSql_fetchAllSettings2('snortDB', 'SnortIfaces', 'All', ''); if (!empty($ifaceConfMaps_array)) { update_output_window2('ms1', 'Reapplying User Settings...'); update_output_window2('ms2', 'Please Wait...'); foreach ($ifaceConfMaps_array as $preIfaceConfMaps_array) { // create iface dir if missing if (!file_exists("/usr/local/etc/snort/sn_{$preIfaceConfMaps_array['uuid']}")) { exec("/bin/mkdir -p /usr/local/etc/snort/sn_{$preIfaceConfMaps_array['uuid']}"); } // create rules dir soft link if setting is default if ($preIfaceConfMaps_array['ruledbname'] === 'default' || $preIfaceConfMaps_array['ruledbname'] === '') { if (!file_exists("/usr/local/etc/snort/sn_{$preIfaceConfMaps_array['uuid']}/rules") && file_exists('/usr/local/etc/snort/snortDBrules/DB/default/rules')) { exec("/bin/ln -s /usr/local/etc/snort/snortDBrules/DB/default/rules /usr/local/etc/snort/sn_{$preIfaceConfMaps_array['uuid']}/rules"); } } // create rules dir soft link if setting is not default if ($preIfaceConfMaps_array['ruledbname'] !== 'default' || $preIfaceConfMaps_array['ruledbname'] != '') { if (!file_exists("/usr/local/etc/snort/sn_{$preIfaceConfMaps_array['uuid']}/rules") && file_exists("/usr/local/etc/snort/snortDBrules/DB/{$preIfaceConfMaps_array['ruledbname']}/rules")) { exec("/bin/ln -s /usr/local/etc/snort/snortDBrules/DB/{$preIfaceConfMaps_array['ruledbname']}/rules /usr/local/etc/snort/sn_{$preIfaceConfMaps_array['uuid']}/rules"); } } exec("/bin/cp {$snortdir}/etc/*.config /usr/local/etc/snort/sn_{$preIfaceConfMaps_array['uuid']}"); exec("/bin/cp {$snortdir}/etc/*.conf /usr/local/etc/snort/sn_{$preIfaceConfMaps_array['uuid']}"); exec("/bin/cp {$snortdir}/etc/*.map /usr/local/etc/snort/sn_{$preIfaceConfMaps_array['uuid']}"); exec("/bin/cp {$snortdir}/etc/generators /usr/local/etc/snort/sn_{$preIfaceConfMaps_array['uuid']}"); exec("/bin/cp {$snortdir}/etc/sid /usr/local/etc/snort/sn_{$preIfaceConfMaps_array['uuid']}"); reapplyRuleSettings_run($preSid_Array['uuid']); update_output_window2('ms2', 'Done...'); } } // remove old $tmpfname files */ update_output_window2('ms1', 'Removing old files...'); update_output_window2('ms2', 'Working...'); if (file_exists('/usr/local/etc/snort/tmp')) { exec("/bin/rm -r /usr/local/etc/snort/tmp/snort_rules_up"); exec("/bin/rm -r /usr/local/etc/snort/tmp/rules_bk"); apc_clear_cache(); } update_output_window2('ms2', 'Done...'); // php code to flush out cache some people are reportting missing files this might help apc_clear_cache(); exec("/bin/sync ;/bin/sync ;/bin/sync ;/bin/sync ;/bin/sync ;/bin/sync ;/bin/sync ;/bin/sync"); // make all dirs snorts exec("/usr/sbin/chown -R snort:snort /var/log/snort"); exec("/usr/sbin/chown -R snort:snort /usr/local/etc/snort"); exec("/usr/sbin/chown -R snort:snort /usr/local/lib/snort"); exec("/bin/chmod -R 755 /var/log/snort"); exec("/bin/chmod -R 755 /usr/local/etc/snort"); exec("/bin/chmod -R 755 /usr/local/lib/snort"); update_output_window2('ms1', 'Finnished Updateing...'); update_output_window2('ms2', 'Finnished Updateing...'); // if snort is running hard restart, if snort is not running do nothing // TODO: Restart Ifaces // ----------------------------------------------------- End Code -------------------------------------------- } // -------------------- END Main function ------------ //$argv[1] = 'console'; //$getWorkerStat = snortSql_fetchAllSettings2('snortDBtemp', 'RegisterWorker', 'uuid', 'jdjEf!773&h3bhFd6A'); //if ($getWorkerStat['working'] !== 'on') { //snortSql_updateRuleSetList2('working', 'on', '', '', ''); // Register Worker on //sendUpdateSnortLogDownload($argv[1]); // start main function //snortSql_updateRuleSetList2('working', 'off', '', '', ''); // Register Worker off //} ?>