Skip to content

Instantly share code, notes, and snippets.

@timkimber
Forked from jgamblin/instantkali.sh
Last active March 8, 2023 11:46
Show Gist options
  • Select an option

  • Save timkimber/12c297e0645920c413273c9d15edbc68 to your computer and use it in GitHub Desktop.

Select an option

Save timkimber/12c297e0645920c413273c9d15edbc68 to your computer and use it in GitHub Desktop.
Start an EC2 Instance In Under 60 Seconds.
#!/bin/bash
# Originally from jgamblin/instantkali.sh
# https://gist.github.com/jgamblin/fff0bd2187f070390248c14cc9148062
set -e
set -u
now=$(date +"%m-%d-%y-%H%M")
today=$(date +"%m-%d-%y")
localip=$(curl -s https://ipinfo.io/ip)
clear
# TODO offer to use spot instance (after showing the price)
read -r -p "Region (eu-west-2) [eu-west-2]: " ec2_region
if [ -z "$ec2_region" ]; then ec2_region="eu-west-2"; fi
echo "Checking for running instances with Tag=*Kali* in $ec2_region"
IFS=$'\n\r' ec2_instances="$(aws ec2 describe-instances \
--filter "Name=tag-key,Values=Name" "Name=tag-value,Values=*Kali*" "Name=instance-state-name,Values=running" \
--query "Reservations[*].Instances[*].[KeyName,InstanceId,PublicIpAddress]" \
--region "${ec2_region}" \
--output text)"
for instance_line in $ec2_instances
do
echo "$instance_line"
IFS=$'\t' read -r -a running_instance<<<"$instance_line"
printf "Found running instance: %s=%s\n" "${running_instance[0]}" "${running_instance[1]}"
printf "Connect using:\n"
printf " ssh -i ${HOME}/instant-ec2/KaliKey%s.pem ubuntu@%s\\n" "$today" "${running_instance[2]}"
read -r -p "Terminate the running instance? [Y]: " terminate_instance
if [ -z "$terminate_instance" ] || [ "$terminate_instance" = "Y" ]; then
# Remove trailing carriage return
if [ "${running_instance[1]: -1}" = $'\r' ]; then
aws ec2 terminate-instances --region "$ec2_region" --instance-ids "${running_instance[1]::-1}"
else
aws ec2 terminate-instances --region "$ec2_region" --instance-ids "${running_instance[1]}"
fi
fi
done
read -r -p "Distribution (ubuntu) [ubuntu]: " ec2_distro
if [ -z "$ec2_distro" ]; then ec2_distro="ubuntu"; fi
read -r -p "Architecture (x86_64 / arm64) [arm64]: " ec2_arch
if [ -z "$ec2_arch" ]; then ec2_arch="arm64"; fi
IFS=$'\t' read -r -a ec2_out <<< "$(aws ec2 describe-images \
--owner amazon \
--filters "Name=name,Values='${ec2_distro}/images/*'" "Name=architecture,Values=${ec2_arch}" \
--query "sort_by(Images, &CreationDate)[-1].[ImageId,Description]" \
--region "${ec2_region}" --output text)"
if [ "${ec2_arch}" == "arm64" ]; then
instance_type="t4g.small"
instance_cost="\$0.0188 per hour"
else
instance_type="t3.small"
instance_cost="\$0.0236 per hour"
fi
printf "\\nAMI: %s\\n" "${ec2_out[0]}"
printf "Description: %s\\n" "${ec2_out[1]}"
printf "Type: %s\\n" "${instance_type} (${instance_cost})"
printf "\\n"
read -r -p "Start instance? [N]: " start
if [ "$start" != "Y" ]; then exit; fi
mkdir -p "${HOME}/instant-ec2/"
# Check to see if we've already created a key for today
if [ ! -e "${HOME}/instant-ec2/KaliKey${today}.pem" ]; then
# Create SSH Key
aws ec2 create-key-pair --key-name "KaliKey${today}" --query 'KeyMaterial' --region "$ec2_region" --output text > "${HOME}/instant-ec2/KaliKey${today}.pem"
chmod 400 "${HOME}/instant-ec2/KaliKey${today}.pem"
# Create Security Group
aws ec2 create-security-group --group-name KaliSecurityGroupSSHOnly"$today" --region "$ec2_region" --description "Inbound SSH only from my IP address" > /dev/null
aws ec2 authorize-security-group-ingress --group-name KaliSecurityGroupSSHOnly"$today" --region "$ec2_region" --cidr "$localip"/32 --protocol tcp --port 22
fi
# Launch a Ec2 instance
run_instances_output=$(aws ec2 run-instances \
--image-id "${ec2_out[0]}" \
--instance-type ${instance_type} \
--key-name "KaliKey$today" \
--region "$ec2_region" \
--security-groups "KaliSecurityGroupSSHOnly$today" \
--tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=Kali${now}}]" \
--query "Instances[*].[InstanceId,State.Name]" \
--output text)
IFS=$'\t' read -r -a instance<<<"$run_instances_output"
id=${instance[0]}
state=${instance[1]}
printf "Instance launched: %s state: %s \\n" "$id" "$state"
printf "\\n"
printf "Starting Instance: \\n"
# Wait for instance in `running` status
while [ "$state" = pending ]; do
echo -ne "Waiting for running status.\\r"
sleep 10
state=$(aws ec2 describe-instances --instance-ids "$id" --query "Reservations[*].Instances[*].State.Name" --region "$ec2_region" --output text)
done
printf "\\n"
# Fetch the publish host name
awsip=$(aws ec2 describe-instances --instance-ids "$id" --query "Reservations[*].Instances[*].PublicIpAddress" --region "$ec2_region" --output=text)
# Probe SSH connection until it's available
X_READY=''
while [ ! "$X_READY" ]; do
echo -ne "Waiting for ready status.\\r"
sleep 10
set +e
if (ssh -o ConnectTimeout=1 -o StrictHostKeyChecking=no -o BatchMode=yes "ubuntu@${awsip}" 2>&1 | grep 'Permission denied' )
then
X_READY='ready'
fi
set -e
done
printf "\\n"
printf "\\n"
# Done
printf "Kali is Ready! Login With:\\n"
printf "ssh -i ${HOME}/instant-ec2/KaliKey%s.pem ubuntu@%s\\n" "$today" "$awsip"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment