224 lines
8.1 KiB
Bash
224 lines
8.1 KiB
Bash
#!/bin/bash
|
|
# randomize_ports.sh - Generate and set random ports for C2 services
|
|
|
|
# ANSI color codes
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
RED='\033[0;31m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
echo -e "${BLUE}==================================================${NC}"
|
|
echo -e "${BLUE} C2ingRed Port Randomization ${NC}"
|
|
echo -e "${BLUE}==================================================${NC}"
|
|
|
|
# Define port range (avoid well-known and commonly monitored ports)
|
|
MIN_PORT=10000
|
|
MAX_PORT=60000
|
|
|
|
# Define list of ports to avoid (commonly used services and monitoring tools)
|
|
AVOID_PORTS=(22 80 443 3389 5985 5986 3306 5432 1433 8080 8443 9090 9091 8008 4444 5555 1234 4321 31337 50051)
|
|
|
|
# Function to check if a port is in the avoid list
|
|
is_port_avoided() {
|
|
local port=$1
|
|
for avoid_port in "${AVOID_PORTS[@]}"; do
|
|
if [ "$port" -eq "$avoid_port" ]; then
|
|
return 0 # Port should be avoided
|
|
fi
|
|
done
|
|
return 1 # Port is fine to use
|
|
}
|
|
|
|
# Function to check if a port is already in use
|
|
is_port_in_use() {
|
|
local port=$1
|
|
if ss -tuln | grep -q ":$port "; then
|
|
return 0 # Port is in use
|
|
fi
|
|
return 1 # Port is not in use
|
|
}
|
|
|
|
# Function to generate a random port number
|
|
generate_random_port() {
|
|
local attempts=0
|
|
local max_attempts=20
|
|
local port
|
|
|
|
while [ $attempts -lt $max_attempts ]; do
|
|
port=$((RANDOM % (MAX_PORT - MIN_PORT) + MIN_PORT))
|
|
|
|
# Check if port is in avoid list or already in use
|
|
if ! is_port_avoided $port && ! is_port_in_use $port; then
|
|
echo $port
|
|
return 0
|
|
fi
|
|
|
|
attempts=$((attempts + 1))
|
|
done
|
|
|
|
# If we reach here, we couldn't find a suitable port
|
|
echo "Error: Could not find a suitable random port after $max_attempts attempts" >&2
|
|
return 1
|
|
}
|
|
|
|
# Generate random ports for different services
|
|
HTTP_C2_PORT=$(generate_random_port)
|
|
HTTPS_C2_PORT=$(generate_random_port)
|
|
MTLS_C2_PORT=$(generate_random_port)
|
|
SHELL_HANDLER_PORT=$(generate_random_port)
|
|
BEACON_SERVER_PORT=$(generate_random_port)
|
|
ADMIN_PORT=$(generate_random_port)
|
|
|
|
# Print the generated ports
|
|
echo -e "\n${GREEN}Generated random ports:${NC}"
|
|
echo -e "HTTP C2 Port: ${YELLOW}$HTTP_C2_PORT${NC}"
|
|
echo -e "HTTPS C2 Port: ${YELLOW}$HTTPS_C2_PORT${NC}"
|
|
echo -e "MTLS C2 Port: ${YELLOW}$MTLS_C2_PORT${NC}"
|
|
echo -e "Shell Handler Port: ${YELLOW}$SHELL_HANDLER_PORT${NC}"
|
|
echo -e "Beacon Server Port: ${YELLOW}$BEACON_SERVER_PORT${NC}"
|
|
echo -e "Admin Port: ${YELLOW}$ADMIN_PORT${NC}"
|
|
|
|
# Create a port configuration file
|
|
PORT_CONFIG="/root/Tools/port_config.json"
|
|
cat > $PORT_CONFIG << EOF
|
|
{
|
|
"http_c2_port": $HTTP_C2_PORT,
|
|
"https_c2_port": $HTTPS_C2_PORT,
|
|
"mtls_c2_port": $MTLS_C2_PORT,
|
|
"shell_handler_port": $SHELL_HANDLER_PORT,
|
|
"beacon_server_port": $BEACON_SERVER_PORT,
|
|
"admin_port": $ADMIN_PORT
|
|
}
|
|
EOF
|
|
|
|
echo -e "\n${GREEN}Port configuration saved to $PORT_CONFIG${NC}"
|
|
|
|
# Function to update Sliver configuration
|
|
update_sliver_config() {
|
|
local sliver_config="/root/.sliver/configs/daemon.json"
|
|
|
|
if [ -f "$sliver_config" ]; then
|
|
echo -e "\n${BLUE}Updating Sliver daemon configuration...${NC}"
|
|
cp "$sliver_config" "${sliver_config}.bak"
|
|
|
|
# Check if jq is installed
|
|
if ! command -v jq &> /dev/null; then
|
|
echo -e "${YELLOW}jq not found, installing...${NC}"
|
|
apt-get update && apt-get install -y jq
|
|
fi
|
|
|
|
# Update the configuration with jq
|
|
jq ".daemon_port = $MTLS_C2_PORT | .daemon_http_port = $HTTP_C2_PORT | .daemon_https_port = $HTTPS_C2_PORT" "${sliver_config}.bak" > "$sliver_config"
|
|
|
|
echo -e "${GREEN}Sliver configuration updated successfully${NC}"
|
|
|
|
# Restart Sliver service
|
|
echo -e "${BLUE}Restarting Sliver service...${NC}"
|
|
systemctl restart sliver
|
|
else
|
|
echo -e "${YELLOW}Sliver configuration file not found at $sliver_config${NC}"
|
|
fi
|
|
}
|
|
|
|
# Function to update shell handler configuration
|
|
update_shell_handler() {
|
|
local handler_script="/root/Tools/shell-handler/persistent-listener.sh"
|
|
|
|
if [ -f "$handler_script" ]; then
|
|
echo -e "\n${BLUE}Updating shell handler configuration...${NC}"
|
|
|
|
# Update the port in the script
|
|
sed -i "s/LISTEN_PORT=.*/LISTEN_PORT=$SHELL_HANDLER_PORT/" "$handler_script"
|
|
|
|
# Update the service if it exists
|
|
local service_file="/etc/systemd/system/shell-handler.service"
|
|
if [ -f "$service_file" ]; then
|
|
# Add environment variable to service file if not already present
|
|
if ! grep -q "Environment=\"LISTEN_PORT=" "$service_file"; then
|
|
sed -i "/\[Service\]/a Environment=\"LISTEN_PORT=$SHELL_HANDLER_PORT\"" "$service_file"
|
|
else
|
|
sed -i "s/Environment=\"LISTEN_PORT=.*/Environment=\"LISTEN_PORT=$SHELL_HANDLER_PORT\"/" "$service_file"
|
|
fi
|
|
|
|
# Reload systemd and restart the service
|
|
systemctl daemon-reload
|
|
systemctl restart shell-handler
|
|
fi
|
|
|
|
echo -e "${GREEN}Shell handler updated to use port $SHELL_HANDLER_PORT${NC}"
|
|
else
|
|
echo -e "${YELLOW}Shell handler script not found at $handler_script${NC}"
|
|
fi
|
|
}
|
|
|
|
# Function to update beacon server configuration
|
|
update_beacon_server() {
|
|
local beacon_script="/root/Tools/serve-beacons.sh"
|
|
|
|
if [ -f "$beacon_script" ]; then
|
|
echo -e "\n${BLUE}Updating beacon server configuration...${NC}"
|
|
|
|
# Update the port in the script
|
|
sed -i "s/LISTEN_PORT=.*/LISTEN_PORT=$BEACON_SERVER_PORT/" "$beacon_script"
|
|
|
|
# Restart the beacon server if it's running
|
|
if pgrep -f "serve-beacons.sh" > /dev/null; then
|
|
echo -e "${YELLOW}Stopping running beacon server...${NC}"
|
|
pkill -f "serve-beacons.sh"
|
|
|
|
echo -e "${GREEN}Starting beacon server with new port...${NC}"
|
|
nohup "$beacon_script" > /dev/null 2>&1 &
|
|
fi
|
|
|
|
echo -e "${GREEN}Beacon server updated to use port $BEACON_SERVER_PORT${NC}"
|
|
else
|
|
echo -e "${YELLOW}Beacon server script not found at $beacon_script${NC}"
|
|
fi
|
|
}
|
|
|
|
# Function to update NGINX configuration for the redirector
|
|
update_nginx_redirector() {
|
|
local nginx_config="/etc/nginx/sites-available/default"
|
|
|
|
if [ -f "$nginx_config" ]; then
|
|
echo -e "\n${BLUE}Updating NGINX redirector configuration...${NC}"
|
|
|
|
# Update configuration to use new ports
|
|
# Note: This assumes standard format used in the C2ingRed templates
|
|
if grep -q "proxy_pass http://.*:" "$nginx_config"; then
|
|
sed -i "s|proxy_pass http://.*:8888;|proxy_pass http://{{ c2_ip }}:$HTTP_C2_PORT;|g" "$nginx_config"
|
|
sed -i "s|proxy_pass https://.*:443;|proxy_pass https://{{ c2_ip }}:$HTTPS_C2_PORT;|g" "$nginx_config"
|
|
|
|
# Update stream configuration if it exists
|
|
local stream_config="/etc/nginx/modules-enabled/stream.conf"
|
|
if [ -f "$stream_config" ]; then
|
|
sed -i "s|proxy_pass .*:31337;|proxy_pass {{ c2_ip }}:$MTLS_C2_PORT;|g" "$stream_config"
|
|
sed -i "s|proxy_pass .*:50051;|proxy_pass {{ c2_ip }}:$HTTP_C2_PORT;|g" "$stream_config"
|
|
fi
|
|
|
|
# Reload NGINX
|
|
systemctl reload nginx
|
|
|
|
echo -e "${GREEN}NGINX configuration updated to use new ports${NC}"
|
|
else
|
|
echo -e "${YELLOW}Could not find proxy_pass directives in NGINX config${NC}"
|
|
fi
|
|
else
|
|
echo -e "${YELLOW}NGINX configuration file not found at $nginx_config${NC}"
|
|
fi
|
|
}
|
|
|
|
# Apply the configuration updates
|
|
update_sliver_config
|
|
update_shell_handler
|
|
update_beacon_server
|
|
update_nginx_redirector
|
|
|
|
echo -e "\n${GREEN}Port randomization complete!${NC}"
|
|
echo -e "${YELLOW}Remember to update any firewall rules to allow traffic on these ports.${NC}"
|
|
echo -e "${YELLOW}You should also update your DNS records if they contain SRV records that specify ports.${NC}"
|
|
|
|
# Display the new port configuration again for reference
|
|
echo -e "\n${BLUE}New Port Configuration:${NC}"
|
|
cat $PORT_CONFIG | jq |