OwlCyberSecurity - MANAGER
Edit File: generate_report
#!/usr/local/cpanel/3rdparty/bin/php <?php // Version $version = @file_get_contents('/var/cpanel/addons/accountdnscheck/version'); // $reportdate = time(); // Pull in Opts $getopts = getopt("hpas", [ 'help', 'accountdomains', 'parkeddomains', 'addondomains','subdomains', 'verbose', 'format:', 'filename:']); if(isset($getopts['help']) || count($getopts) < 1 ) { print "Usage: " . $argv[0] . " [OPTION]...\n\n"; print "OPTIONS\n"; print " --accountdomains Check Account Primary Domains\n"; print " --parkeddomains Check Account Parked Domains\n"; print " --addondomains Check Account Addon Domains\n"; print " --subdomains Check Account Sub-Domains\n"; print " --format=[format] Sets the output format to html or csv (default: html)\n"; print " --filename=[name] Filename to store output to, prefixed with format option\n"; print " --verbose Displays verbose output of progress\n"; print " --help Displays this help information\n"; exit(1); } // Verbose if(isset($getopts['verbose'])) $verbose = true; // Format if(!isset($getopts['format'])) $getopts['format'] = 'html'; if($getopts['format'] != 'csv' && $getopts['format'] != 'html') { print "format option is invalid, supported values are csv and html\n"; exit(1); } // Filename if(isset($getopts['filename']) && $getopts['filename'] !== false) { if(!preg_match('/^[a-z0-9_\-]*$/', $getopts['filename'])) { print "The filename can only contain letters, numbers, hyphens, and underscores\n"; exit(1); } } else { $getopts['filename'] = date("Y-m-d_G-i-s", $reportdate); } // Ensure duplicate report does not exist if(is_file('/var/cpanel/addons/accountdnscheck/reports/' . $getopts['filename'] . '.' . $getopts['format'])) { print "A report with the filename /var/cpanel/addons/accountdnscheck/reports/" . $getopts['filename'] . '.' . $getopts['format'] . " already exists\n"; exit(1); } // If REMOTE_USER is not set, use current user if(!isset($_ENV['REMOTE_USER'])) { $pwinfo = posix_getpwuid(posix_getuid()); if(!is_array($pwinfo)) { print "Failed to get system user info for current user\n"; exit(1); } $_ENV['REMOTE_USER'] = $pwinfo['name']; } // System user info $pwinfo = posix_getpwnam($_ENV['REMOTE_USER']); if(!is_array($pwinfo)) { print "Failed to get system user info for username " . $_ENV['REMOTE_USER'] . "\n"; exit(1); } // Get API Token if (is_file($pwinfo['dir'] . '/.accountdnscheck_api_token')) { $api_token = @file_get_contents($pwinfo['dir'] . '/.accountdnscheck_api_token'); } // Check API Token and create if missing if (!is_file($pwinfo['dir'] . '/.accountdnscheck_api_token') || empty($api_token)) { // Check if a token exists in the WHM exec('/usr/local/cpanel/bin/whmapi1 --output=json api_token_list', $output, $exit_status); if ($exit_status > 0) { print "WHMAPI1 failed to get a list of API tokens from WHM\n"; exit(1); } $api_token_list = json_decode($output[0]); unset($output); if (json_last_error() > 0) { print "Failed to json_decode api_token_list response from WHMAPI1\n"; exit(1); } foreach($api_token_list->data->tokens as $token) { if ($token->name == 'AccountDNSCheck') { print "Looks like an existing AccountDNSCheck API token already exists. Please remove it and try again.\n"; exit(1); } } // Create new API token exec('/usr/local/cpanel/bin/whmapi1 --output=json api_token_create token_name=AccountDNSCheck acl-1=list-accts acl-2=cpanel-api', $output, $exit_status); if ($exit_status > 0) { print "WHMAPI1 failed to create a new api token\n"; exit(1); } $api_token_create = json_decode($output[0]); unset($output); if (json_last_error() > 0) { print "Failed to json_decode api_token_create response from WHMAPI1\n"; } if ($api_token_create->metadata->result == 0) { print "WHMAPI1 api_token_create failed: " . $api_token_create->metadata->reason . "\n"; } $api_token = $api_token_create->data->token; @file_put_contents($pwinfo['dir'] . '/.accountdnscheck_api_token', $api_token_create->data->token); @chmod($pwinfo['dir'] . '/.accountdnscheck_api_token', 0600); } // Get API Token $api_token = @file_get_contents($pwinfo['dir'] . '/.accountdnscheck_api_token'); // WHM API require_once('/var/cpanel/addons/accountdnscheck/lib/whmapi.class.php'); try { $whmapi = new whmapi( [ // 'debug' => true, 'server' => '127.0.0.1', 'username' => $_ENV['REMOTE_USER'], 'accesshash' => $api_token, 'useragent' => 'AccountDNSCheck/' . $version . '( generate_reports )' ] ); } catch (Exception $e) { print "An Exception was caught! " . $e->getMessage() . "\n"; exit(1); } // Accounts $accounts = []; try { if($verbose) print "Fetching Account List"; $result = $whmapi->request('listaccts'); if($result === false) { print "\n" . $whmapi->whmapi_error() . "\n"; exit(1); } elseif($result['status'] != 1) { print "\n" . $result['statusmsg'] . "\n"; exit(1); } // Sort by account username uasort($result['acct'], function($a,$b) { return strnatcmp($a['user'], $b['user']); } ); foreach($result['acct'] as $k => $v) { $accounts[$v['user']] = [ 'domains' => [], 'ip' => $v['ip'] ]; // Check Account Domains if(isset($getopts['accountdomains'])) { $accounts[$v['user']]['domains'][$v['domain']] = [ 'type' => 'account', 'status' => 'unknown', 'resolvedto' => 'unknown' ]; } if($verbose) print "."; } if($verbose) print "Done\n"; foreach($accounts as $k => $v) { if($verbose) print "Fetching domain information for user " . $k . "..."; // Parked Domains if(isset($getopts['parkeddomains'])) { $result = $whmapi->request('cpanel', [ 'cpanel_jsonapi_module' => 'Park', 'cpanel_jsonapi_apiversion' => '2', 'cpanel_jsonapi_func' => 'listparkeddomains', 'user' => $k ]); if($result === false) { print $whmapi->whmapi_error() . "\n"; continue; } foreach($result['cpanelresult']['data'] as $kk => $vv) { $accounts[$k]['domains'][$vv['domain']] = [ 'type' => 'parked', 'status' => 'unknown', 'resolvedto' => 'unknown' ]; } } // Addon Domains if(isset($getopts['addondomains'])) { $result = $whmapi->request('cpanel', [ 'cpanel_jsonapi_module' => 'AddonDomain', 'cpanel_jsonapi_apiversion' => '2', 'cpanel_jsonapi_func' => 'listaddondomains', 'user' => $k ]); if($result === false) { print $whmapi->whmapi_error() . "\n"; continue; } foreach($result['cpanelresult']['data'] as $kk => $vv) { $accounts[$k]['domains'][$vv['domain']] = [ 'type' => 'addon', 'status' => 'unknown', 'resolvedto' => 'unknown' ]; } } // Sub Domains if(isset($getopts['subdomains'])) { $result = $whmapi->request('cpanel', [ 'cpanel_jsonapi_module' => 'SubDomain', 'cpanel_jsonapi_apiversion' => '2', 'cpanel_jsonapi_func' => 'listsubdomains', 'user' => $k ]); if($result === false) { print $whmapi->whmapi_error() . "\n"; continue; } foreach($result['cpanelresult']['data'] as $kk => $vv) { $accounts[$k]['domains'][$vv['domain']] = [ 'type' => 'sub', 'status' => 'unknown', 'resolvedto' => 'unknown' ]; } } if($verbose) print "done, found " . count($accounts[$k]['domains']) . "\n"; } // Check Domains if($verbose) print "Checking to see if domains resolve to correct IP..."; foreach($accounts as $k => $v) { foreach($v['domains'] as $kk => $vv) { $result = gethostbyname($kk); if($verbose) print "."; if($result == $kk) { $accounts[$k]['domains'][$kk]['status'] = 'error'; $accounts[$k]['domains'][$kk]['resolvedto'] = 'Failed to Resolve'; } elseif($result == $v['ip']) { $accounts[$k]['domains'][$kk]['status'] = 'ok'; $accounts[$k]['domains'][$kk]['resolvedto'] = $result; } else { $accounts[$k]['domains'][$kk]['status'] = 'error'; $accounts[$k]['domains'][$kk]['resolvedto'] = $result; } } } if($verbose) print "done\n"; // Create Reports Folder if(!is_dir('/var/cpanel/addons/accountdnscheck/reports')) { @mkdir('/var/cpanel/addons/accountdnscheck/reports', 0700); } // Create Report if($verbose) print "Writing report..."; if($getopts['format'] == 'csv') { $output = "Username,Domain,Type,Account IP,Resolved To,Status"; foreach($accounts as $k => $v) { foreach($v['domains'] as $kk => $vv) { $output .= "\n" . $k . "," . $kk . "," . $vv['type'] . "," . $v['ip'] . "," . $vv['resolvedto'] . "," . $vv['status']; } } } else { if(!is_dir('/var/cpanel/addons/accountdnscheck/templates_c')) { @mkdir('/var/cpanel/addons/accountdnscheck/templates_c', 0700); } try { require_once('/var/cpanel/addons/accountdnscheck/lib/Smarty/Smarty.class.php'); $smarty = new Smarty(); $smarty->setTemplateDir('/var/cpanel/addons/accountdnscheck/templates'); $smarty->setCompileDir('/var/cpanel/addons/accountdnscheck/templates_c'); $smarty->assign('reportname', $getopts['filename']); $smarty->assign('reportdate', $reportdate); $smarty->assign('accounts', $accounts); $output = $smarty->fetch('report.tpl'); } catch(Exception $e) { print "failed, " . $e->getMessage() . "\n"; exit(1); } } @file_put_contents('/var/cpanel/addons/accountdnscheck/reports/' . $getopts['filename'] . '.' . $getopts['format'], $output, LOCK_EX); @touch('/var/cpanel/addons/accountdnscheck/reports/' . $getopts['filename'] . '.' . $getopts['format'], $reportdate); if($verbose) print "done\n"; if($verbose) print "\nReport has been saved to /var/cpanel/addons/accountdnscheck/reports/" . $getopts['filename'] . "." . $getopts['format'] . "\n"; exit(0); } catch (Exception $e) { print "\nAn Exception was caught! " . $e->getMessage() . "\n"; exit(1); }