0799bfbae8
Sanitized version of red team infrastructure automation platform. Operational content (implant pipelines, lures, credential capture) replaced with documented stubs. Architecture and infrastructure automation code intact.
150 lines
4.3 KiB
Bash
150 lines
4.3 KiB
Bash
#!/bin/bash
|
|
# secure_payload_sync.sh - OPSEC-focused payload distribution
|
|
|
|
# Configuration
|
|
C2_PAYLOAD_DIR="/root/Tools/Havoc/payloads"
|
|
REDIRECTOR_IP="{{ redirector_ip }}"
|
|
REDIRECTOR_USER="root"
|
|
SSH_KEY_PATH="/root/.ssh/id_ed25519"
|
|
REMOTE_PAYLOAD_DIR="/var/www/resources"
|
|
ENCRYPTED_TRANSFER=true
|
|
LOG_FILE="/root/Tools/logs/payload_sync.log"
|
|
LOG_RETENTION_DAYS=3
|
|
MAX_RANDOM_DELAY=300 # Max random delay in seconds
|
|
|
|
# Create minimal timestamped log with auto-rotation
|
|
log() {
|
|
mkdir -p $(dirname $LOG_FILE)
|
|
echo "$(date "+%Y-%m-%d %H:%M:%S") - $1" >> $LOG_FILE
|
|
find $(dirname $LOG_FILE) -name "*.log" -mtime +$LOG_RETENTION_DAYS -delete 2>/dev/null
|
|
}
|
|
|
|
# Add random delay for OPSEC
|
|
sleep_random() {
|
|
DELAY=$((RANDOM % $MAX_RANDOM_DELAY))
|
|
log "Adding random delay of $DELAY seconds"
|
|
sleep $DELAY
|
|
}
|
|
|
|
# Generate payload manifest and check for changes
|
|
check_for_changes() {
|
|
if [ ! -d "$C2_PAYLOAD_DIR" ]; then
|
|
log "ERROR: Payload directory not found"
|
|
return 1
|
|
fi
|
|
|
|
TMP_DIR=$(mktemp -d)
|
|
MANIFEST_FILE="$TMP_DIR/manifest"
|
|
find $C2_PAYLOAD_DIR -type f -exec sha256sum {} \; | sort > $MANIFEST_FILE
|
|
|
|
CURRENT_HASH=$(sha256sum $MANIFEST_FILE | awk '{print $1}')
|
|
HASH_FILE="/root/Tools/.payload_hash"
|
|
|
|
if [ -f "$HASH_FILE" ] && [ "$(cat $HASH_FILE)" == "$CURRENT_HASH" ]; then
|
|
log "No payload changes detected"
|
|
secure_delete $TMP_DIR
|
|
return 1
|
|
fi
|
|
|
|
echo $CURRENT_HASH > $HASH_FILE
|
|
return 0
|
|
}
|
|
|
|
# Secure deletion of files/directories
|
|
secure_delete() {
|
|
if [ -d "$1" ]; then
|
|
find "$1" -type f -exec shred -n 3 -z -u {} \; 2>/dev/null
|
|
rm -rf "$1" 2>/dev/null
|
|
elif [ -f "$1" ]; then
|
|
shred -n 3 -z -u "$1" 2>/dev/null
|
|
fi
|
|
}
|
|
|
|
# Encrypt archive with random password
|
|
encrypt_archive() {
|
|
SRC="$1"
|
|
DEST="$2"
|
|
|
|
# Generate random password
|
|
PASSWORD=$(head /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 32)
|
|
PASS_FILE=$(mktemp)
|
|
echo $PASSWORD > $PASS_FILE
|
|
|
|
# Encrypt the archive
|
|
openssl enc -aes-256-cbc -salt -in "$SRC" -out "$DEST" -pass file:$PASS_FILE
|
|
|
|
# Store password temporarily for transfer
|
|
echo $PASSWORD
|
|
|
|
# Securely delete password file
|
|
secure_delete $PASS_FILE
|
|
}
|
|
|
|
# Main execution
|
|
main() {
|
|
log "Starting secure payload sync"
|
|
|
|
# Add randomized timing
|
|
sleep_random
|
|
|
|
# Check for payload changes
|
|
check_for_changes || exit 0
|
|
|
|
# Generate random archive name for OPSEC
|
|
RANDOM_ID=$(head /dev/urandom | tr -dc 'a-z0-9' | head -c 12)
|
|
ARCHIVE_NAME="updates_${RANDOM_ID}.tar.gz"
|
|
ENCRYPTED_NAME="${ARCHIVE_NAME}.enc"
|
|
TEMP_DIR=$(mktemp -d)
|
|
|
|
# Create payload archive
|
|
log "Creating payload archive"
|
|
tar czf "$TEMP_DIR/$ARCHIVE_NAME" -C $(dirname $C2_PAYLOAD_DIR) $(basename $C2_PAYLOAD_DIR)
|
|
|
|
# Encrypt archive if enabled
|
|
PASSWORD=""
|
|
if [ "$ENCRYPTED_TRANSFER" = true ]; then
|
|
log "Encrypting payload archive"
|
|
PASSWORD=$(encrypt_archive "$TEMP_DIR/$ARCHIVE_NAME" "$TEMP_DIR/$ENCRYPTED_NAME")
|
|
TRANSFER_FILE="$TEMP_DIR/$ENCRYPTED_NAME"
|
|
else
|
|
TRANSFER_FILE="$TEMP_DIR/$ARCHIVE_NAME"
|
|
fi
|
|
|
|
# Transfer archive to redirector
|
|
log "Transferring payloads to redirector"
|
|
scp -i $SSH_KEY_PATH -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -q "$TRANSFER_FILE" "$REDIRECTOR_USER@$REDIRECTOR_IP:/tmp/$ENCRYPTED_NAME"
|
|
|
|
# Handle remote extraction with decryption if needed
|
|
if [ "$ENCRYPTED_TRANSFER" = true ]; then
|
|
REMOTE_CMD="
|
|
mkdir -p $REMOTE_PAYLOAD_DIR
|
|
TEMP_DIR=\$(mktemp -d)
|
|
openssl enc -aes-256-cbc -d -in /tmp/$ENCRYPTED_NAME -out \$TEMP_DIR/$ARCHIVE_NAME -pass pass:\"$PASSWORD\"
|
|
tar xzf \$TEMP_DIR/$ARCHIVE_NAME -C /var/www/
|
|
# Clean up
|
|
shred -n 3 -z -u /tmp/$ENCRYPTED_NAME \$TEMP_DIR/$ARCHIVE_NAME 2>/dev/null
|
|
rm -rf \$TEMP_DIR
|
|
# Update web server if needed
|
|
systemctl reload nginx 2>/dev/null
|
|
"
|
|
else
|
|
REMOTE_CMD="
|
|
mkdir -p $REMOTE_PAYLOAD_DIR
|
|
tar xzf /tmp/$ENCRYPTED_NAME -C /var/www/
|
|
shred -n 3 -z -u /tmp/$ENCRYPTED_NAME 2>/dev/null
|
|
systemctl reload nginx 2>/dev/null
|
|
"
|
|
fi
|
|
|
|
# Execute command on redirector
|
|
ssh -i $SSH_KEY_PATH -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$REDIRECTOR_USER@$REDIRECTOR_IP" "$REMOTE_CMD"
|
|
|
|
# Clean up local temp files
|
|
log "Cleaning up temporary files"
|
|
secure_delete $TEMP_DIR
|
|
|
|
log "Payload sync completed successfully"
|
|
}
|
|
|
|
# Run main function
|
|
main |