Pack recon — read-only
2026-11-01 04:58:11 · 17,259 chars
Press COPY and paste it in chat. Passwords and hashes appear only as their length and type, never as values.
COPY
PACK-RECON 2026-11-01 04:58:11 root: /home/admipvet/public_html host: adminsiteus.com === PHP =========================================================== version 8.2.35 pdo_mysql yes mysqli yes curl yes zip yes openssl yes mbstring yes gd yes fileinfo yes ZipArchive yes exec() yes memory_limit -1 max_execution 180s === FILE TREE (top level of public_html) ========================== .well-known/ dir 1 files 27 B SETUP.md file 4.6 KB _backup_js/ dir 2 files 14.7 KB admin/ dir 32 files 830.9 KB api/ dir 19 files 170.2 KB assets/ dir 1 files 7.8 KB cgi-bin/ dir 0 files 0 B <- excluded from the package check-site.php file 13 KB config.php file 573 B config.php.bak-20260918-140657 file 573 B <- excluded core/ dir 9 files 21.9 KB delivery-check.php file 11.3 KB error_log file 15.8 KB <- excluded fix-api-db.php file 10.8 KB lint-satellite.php file 8.9 KB mail-enquiry-test.php file 10.5 KB mail-enquiry-test_1.php file 10.5 KB pack-admin.php file 20.5 KB pack-recon.php file 16.9 KB patch-jurisdiction.php file 37.4 KB patch10-mail-encoding.php file 13.4 KB patch11-footer-gap.php file 7.2 KB patch12-enquiry-email.php file 10.7 KB patch12-enquiry-email_1.php file 10.7 KB patch12b.php file 10.9 KB patch13-one-per-vehicle.php file 10.6 KB patch14-block-duplicate.php file 10.1 KB patch15-fix-rule.php file 10.2 KB patch15b.php file 10.2 KB patch16-enquiry-message.php file 9.3 KB patch2-baseurl.php file 9.6 KB patch3-reviews-jurisdiction.php file 13 KB patch4-mail.php file 15.4 KB patch5-copy.php file 10.7 KB patch6-fix.php file 11.3 KB patch7-vehicle-info.php file 8.7 KB patch8-logging-wording.php file 11.2 KB patch9-titles.php file 10.1 KB patch9-titles_1.php file 11.5 KB patch9b.php file 11.5 KB repara-inventory-mobil.php file 13.2 KB script-451122.php.txt file 176.1 KB show-enquiry-email.php file 3.9 KB site-template/ dir 26 files 186.8 KB smtp-check.php file 10.9 KB superadmin/ dir 2 files 425 B uploads/ dir 1970 files 1.4 GB whereami.php file 11.2 KB TOTAL 2100 files, 1.4 GB === THE FILES THE NEW DESIGN WILL TOUCH =========================== admin/_satellite/index.php.tpl 87.2 KB the satellite template - all markup site-template/assets/style.css 38.2 KB satellite stylesheet, served live from the admin site-template/ 26 files 186.8 KB whole folder core/functions.php 6.8 KB shared helpers core/smtp_mailer.php 4.7 KB mail (holds the mailbox password) api/ 19 files 170.2 KB the endpoints satellites call admin/ 32 files 830.9 KB the panel === UPLOADED MEDIA (excluded: the new admin starts with no content) ==== uploads/ 1970 files 1.4 GB === CONFIG FILES (constant names and value shapes, never values) ==== --- config.php --- 573 B, 16 lines define DB_HOST = localhost define DB_NAME = admipvet_db define DB_USER = admipvet_db define DB_PASS = [15 chars] define SUPERADMIN_DOMAIN = https://adminsiteus.com/ define PLATFORM_NAME = Adolf Admin -- shape of the file -- 2 | // ========================================================= 3 | // CONFIGURATION - fill in with real values from cPanel > MySQL Databases 4 | // ========================================================= 6 | define('DB_HOST', 'localhost'); 7 | define('DB_NAME', 'admipvet_db'); 8 | define('DB_USER', 'admipvet_db'); 9 | define('***', '***'); 11 | // The hosting account's main domain = the Super Admin panel 12 | // (no www, lowercase) 13 | define('SUPERADMIN_DOMAIN', 'https://adminsiteus.com/'); 15 | // Platform name, shown in the super admin panel 16 | define('PLATFORM_NAME', 'Adolf Admin'); --- api/_api_inc.php --- 5.4 KB, 139 lines define DB_HOST = localhost define DB_NAME = admipvet_db define DB_USER = admipvet_db define DB_PASS = [15 chars] define API_KEY = [looks like sha256 (64 hex)] -- shape of the file -- 2 | /** 3 | * ============================================================================= 4 | * API SATELIT -- bootstrap comun 5 | * Se urca pe ADMIN, in: public_html/api/ 6 | * URL rezultat: https://adminsiteuk.com/api/<endpoint>.php 7 | * ============================================================================= 8 | * Sateliţii nu se conecteaza la MySQL. Cer datele de aici, prin HTTPS, deci 9 | * functioneaza pe orice hosting, indiferent de firewall sau de Remote MySQL. 10 | * ============================================================================= 11 | */ 15 | // Fara Access-Control-Allow-Origin: apelurile sunt server-to-server (cURL din 16 | // index.php al satelitului), nu din browser. Nu deschidem API-ul catre pagini terte. 18 | /* ------------------------- CONFIGURARE ------------------------- */ 20 | define('DB_HOST', 'localhost'); 21 | define('DB_NAME', 'admipvet_db'); // baza de pe ACEST server 22 | define('DB_USER', 'admipvet_db'); 23 | define('***', '***'); // completeaza 25 | // URL-ul public al acestui admin, folosit pentru a construi adresele pozelor 26 | define('BASE_URL', ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http') 29 | // Cheie partajata cu satelitii. Aceeasi valoare trebuie pusa in index.php, 30 | // la constanta API_KEY. Genereaza una lunga si aleatoare. 31 | define('***', '***'); 33 | define('API_DEBUG', false); // true doar temporar, la diagnostic 35 | /* ------------------------- INFRASTRUCTURA ------------------------- */ 37 | function json_out($data, $code = 200) { 43 | function json_err($error, $code = 400) { 47 | /** Verifica cheia partajata. Se apeleaza la inceputul fiecarui endpoint. */ 48 | function require_key() { 49 | $sent = $_SERVER['***'] ?? ($_REQUEST['k'***''); 50 | if (!is_string($sent) || !hash_equals(API_KEY, $sent)) { 55 | function db(): PDO { 57 | if ($pdo !== null) return $pdo; 59 | $pdo = new PDO( 72 | return $pdo; 75 | /* ------------------------- HELPERE ------------------------- */ 77 | /** Transforma un nume de fisier din DB intr-un URL absolut catre acest admin. */ 78 | function upload_url($file, $folder) { 79 | $file = trim((string)$file); 80 | if ($file === '') return null; 81 | if (preg_match('#^(https?:)?//#i', $file)) return $file; // deja absolut 82 | return BASE_URL . 'uploads/' . trim($folder, '/') . '/' . ltrim($file, '/'); 85 | function clean_domain($d) { 86 | $d = strtolower(trim((string)$d)); 87 | $d = preg_replace('#^https?://#i', '', $d); 88 | $d = preg_replace('#^www\.#', '', $d); 89 | $d = preg_replace('#[:/].*$#', '', $d); // taie portul si calea 90 | return $d; 93 | /** Cauta site-ul dupa domeniu. Returneaza randul brut din tabela sites. */ 94 | function site_by_domain($domain) { 95 | $domain = clean_domain($domain); 96 | if ($domain === '') return null; 97 | $stmt = db()->prepare("SELECT * FROM sites WHERE domain = ? LIMIT 1"); 98 | $stmt->execute([$domain]); 99 | $row = $stmt->fetch(); 100 | return $row ?: null; 103 | /** 104 | * Rezolva site-ul din parametrul ?domain= si opreste executia cu eroarea 105 | * potrivita daca nu exista sau e dezactivat. Folosit de toate endpoint-urile. 106 | */ 107 | function require_site() { ... 11 more lines --- core/smtp_mailer.php --- 4.7 KB, 121 lines define SMTP_HOST = adminsiteus.com define SMTP_USER = noreply@adminsiteus.com define SMTP_PASS = [15 chars] define SMTP_FROM = noreply@adminsiteus.com -- shape of the file -- 2 | // Minimal, dependency-free SMTP mailer (implicit SSL/TLS on port 465, AUTH LOGIN). 3 | // Used to send contact-form / vehicle-enquiry notifications to the contact email 4 | // configured for each site, with Reply-To set to the customer's address. 6 | defined('SMTP_HOST') || define('SMTP_HOST', 'adminsiteus.com'); 7 | defined('SMTP_PORT') || define('SMTP_PORT', 465); 8 | defined('SMTP_USER') || define('SMTP_USER', 'noreply@adminsiteus.com'); 9 | defined('***') || define('***', '***'); 10 | defined('SMTP_FROM') || define('SMTP_FROM', 'noreply@adminsiteus.com'); 12 | function smtp_mime_header($str) { 13 | if (preg_match('/[^\x20-\x7e]/', $str)) { 14 | return '=?UTF-8?B?' . base64_encode($str) . '?='; 16 | return $str; 19 | /** 20 | * Sends a plain-text email via SMTP (SSL, AUTH LOGIN). Returns true on success, 21 | * false on failure (never throws - failures are logged via error_log so a mail 22 | * problem never breaks the page for the visitor). 23 | */ 24 | function smtp_send($to, $subject, $body, $replyTo = null, $fromName = null, $html = null) { 25 | $fp = @stream_socket_client('ssl://' . SMTP_HOST . ':' . SMTP_PORT, $errno, $errstr, 15); 26 | if (!$fp) { 28 | return false; 32 | $read = function () use ($fp) { 33 | $data = ''; 35 | $data .= $line; 36 | if (isset($line[3]) && $line[3] === ' ') break; 38 | return $data; 40 | $write = function ($cmd) use ($fp) { 44 | $resp = $read(); 45 | if (substr($resp, 0, 3) !== '220') { fclose($fp); error_log("SMTP greeting failed: $resp"); return false; } 47 | // Identify with the web host: receiving servers check that the EHLO name 48 | // looks like it belongs to the sender. 49 | $ehlo = $_SERVER['HTTP_HOST'] ?? SMTP_HOST; 50 | $ehlo = preg_replace('/[^A-Za-z0-9.\-]/', '', $ehlo) ?: SMTP_HOST; 51 | $write('EHLO ' . $ehlo); 52 | $read(); 54 | $write('AUTH LOGIN'); 55 | $read(); 56 | $write(base64_encode(SMTP_USER)); 57 | $read(); 58 | $write(base64_encode(SMTP_PASS)); 59 | $resp = $read(); 60 | if (substr($resp, 0, 3) !== '235') { fclose($fp); error_log("SMTP auth failed: $resp"); return false; } 62 | $write('MAIL FROM:<' . SMTP_FROM . '>'); 63 | $resp = $read(); 64 | if (substr($resp, 0, 3) !== '250') { fclose($fp); error_log("SMTP MAIL FROM failed: $resp"); return false; } 66 | $write('RCPT TO:<' . $to . '>'); 67 | $resp = $read(); 68 | if (substr($resp, 0, 3) !== '250' && substr($resp, 0, 3) !== '251') { fclose($fp); error_log("SMTP RCPT TO fai 70 | $write('DATA'); 71 | $resp = $read(); 72 | if (substr($resp, 0, 3) !== '354') { fclose($fp); error_log("SMTP DATA failed: $resp"); return false; } 74 | $displayName = $fromName ?: 'Website'; 75 | $domain = substr(strrchr(SMTP_FROM, '@'), 1) ?: SMTP_HOST; 77 | $headers = []; 78 | $headers[] = 'From: ' . smtp_mime_header($displayName) . ' <' . SMTP_FROM . '>'; 79 | if ($replyTo) $headers[] = 'Reply-To: ' . $replyTo; 80 | $headers[] = 'To: ' . $to; 81 | $headers[] = 'Subject: ' . smtp_mime_header($subject); 82 | $headers[] = 'Date: ' . date('r'); 83 | $headers[] = 'Message-ID: <' . bin2hex(random_bytes(12)) . '@' . $domain . '>'; ... 19 more lines === DATABASE ====================================================== connected via the DB_* constants server: 11.4.13-MariaDB-cll-lve-log 8 tables table rows columns ---------------------------------------------------------------------------------------------------- contact_messages 298 id:int site_id:int vehicle_id:int name:varchar email:varchar phone:varchar message:text is_read:tinyint created_at:timestamp review_sites 39 review_id:int site_id:int reviews 39 id:int site_id:int author_name:varchar rating:tinyint content:text image_path:varchar is_approved:tinyint created_at:timestamp sites 1 id:int domain:varchar jurisdiction:varchar company_name:varchar company_short_name:varchar company_number:varchar year_founded:smallint theme_color:varchar logo_path:varchar contact_email:varchar contact_phone:varchar address_line1:varchar address_line2:varchar city:varchar state:varchar postcode:varchar country:varchar bank_name:varchar bank_account_name:varchar bank_sort_code:varchar bank_account_number:varchar is_active:tinyint created_at:timestamp updated_at:timestamp users 3 id:int site_id:int role:enum name:varchar email:varchar password_hash:varchar is_active:tinyint created_at:timestamp vehicle_images 1901 id:int vehicle_id:int path:varchar sort_order:int vehicle_sites 97 vehicle_id:int site_id:int vehicles 97 id:int site_id:int slug:varchar title:varchar make:varchar model:varchar variant:varchar registration_number:varchar year:smallint mileage:int fuel:varchar transmission:varchar body_type:varchar color:varchar mot_expiry:date price:decimal status:enum description:text created_by:int created_at:timestamp updated_at:timestamp === ADMIN LOGIN =================================================== table that holds accounts: users id int(11) NOT NULL site_id int(11) role enum('super_admin','site_admin') NOT NULL name varchar(255) NOT NULL email varchar(255) NOT NULL password_hash varchar(255) NOT NULL is_active tinyint(1) NOT NULL default 1 created_at timestamp default current_timestamp() one existing row, every value masked: id 1 site_id role super_admin name Apple Adolf email a***@adminapple.work password_hash bcrypt hash ($2y$), 60 chars is_active 1 created_at 2026-08-04 19:35:32 how the code checks a password: admin/satellite_download.php 26 | return substr(hash('...', $apiKey . '...' . strtolower($domain)), 0, 24); core/Auth.php 7 | if (!$user || !password_verify($password, $user['...'])) { core/Auth.php 13 | unset($user['...']); pack-admin.php 300 | 'auth'...'table' => 'users', '...' => '...', 'algo' => '...'], site-template/admin/impersonate.php 18 | unset($admin['...']); === WHAT A SATELLITE IS GIVEN ===================================== API_BASE ADMIN_ROOT . 'api/' API_KEY [11 chars] CACHE_TTL 90 CACHE_DIR __DIR__ . '/.cache' FORCE_DOMAIN '' BASE_URL not a define - probably injected when you download placeholders the downloader fills in (looking for {{ }} or __X__): ADMIN_ROOT, API_KEY, SAT_CHECK_KEY, DIR === END =========================================================== Nothing was modified. Delete this file once you have copied the report.
Delete this file once you have copied it.