📖

Security-JAWS DAYS CTF - Writeup

2023/09/01に公開

Security-JAWS 第30回の中で行われたSecurity-JAWS DAYS CTFに参加しました。
Security-JAWS DAYS CTFはAWSに関連する問題のみが出題されるCTFとなっており、AWSを普段あまり触らない自分としては非常に勉強になる内容が多いCTFでした。

https://twitter.com/security_jaws/status/1695738603522154732

問題の難易度は Trivia / Warmup / Easy / Medium / Hard の5段階に分かれていて、AWS初心者でも挑める問題が複数用意されていました。MediumとHardの問題には挑めなかった/解けませんでしたが、Trivia~Easyで解けた問題についてWriteupを書きました。

https://speakerdeck.com/tigerszk/security-jaws-days-ctf-zuo-wen-zhe-jie-shuo?slide=6

Trivia問題

Trivia1~12は省略します

Trivia13 (10pt)

CloudTrailログを読み取り、作成されたユーザー名を回答してください。

CloudTrailのログを記録したファイルが提供される。ログファイルを確認するとCreateUserイベントが記録されており、 KRJXVVAWC13R というユーザが作成されている。

{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROXXXXXXXXXXXXXXXXX:test-user",
        "arn": "arn:aws:sts::123456789012:assumed-role/test-user/test-user",
        "accountId": "123456789012",
        "accessKeyId": "ASIA44JPO63AVLDDIY5N",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROXXXXXXXXXXXXXXXXX",
                "arn": "arn:aws:iam::123456789012:role/test-user",
                "accountId": "123456789012",
                "userName": "test-user"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2022-10-15T21:38:24Z",
                "mfaAuthenticated": "true"
            }
        }
    },
    "eventTime": "2022-10-15T22:05:16Z",
    "eventSource": "iam.amazonaws.com",
    "eventName": "CreateUser",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": {
        "userName": "KRJXVVAWC13R", ★
        "tags": []
    },
    "responseElements": {
        "user": {
            "path": "/",
            "userName": "KRJXVVAWC13R",
            "userId": "AIDAXXXXXXXXXXXXXXXXX",
            "arn": "arn:aws:iam::123456789012:user/KRJXVVAWC13R",
            "createDate": "Oct 15, 2022 10:05:16 PM"
        }
    },
    "requestID": "5eda3a85-64ed-4c5f-8d0a-9497e05f99bd",
    "eventID": "5586ec9d-4e9d-431b-ad8e-e33a6c8ecb94",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management",
    "sessionCredentialFromConsole": "true"
}

Warmup問題

AWS CLI practice (50pt)

このIAMユーザー(シークレットキー+アクセスキー)が所属するAWSアカウントIDは何? この問題ではAWSアカウントIDの値がFLAGとなっています。

IAMユーザのアクセスキーとシークレットアクセスキーが提供されているので、AWS CLI(aws sts get-caller-identityコマンド)を使用して、IAMユーザの情報を確認する。
コマンドの実行結果から、AWSアカウントIDが 946546793415 であることが確認できた。

C:\Users\hamasho>aws configure
AWS Access Key ID [None]: <redacted>
AWS Secret Access Key [None]: <redacted>
Default region name [None]: ap-northeast-1
Default output format [None]:

C:\Users\hamasho>aws sts get-caller-identity
{
    "UserId": "<redacted>",
    "Account": "946546793415", ★
    "Arn": "arn:aws:iam::946546793415:user/ctf_challenge_0"
}

Run function (50pt)

アクセスキーを調べてFLAGを入手せよ!

IAMユーザのアクセスキーとシークレットアクセスキーが提供されているので、AWS CLI(aws sts get-caller-identityコマンド)を使用してIAMユーザの情報を確認する。

IAMユーザ名は ctf_challenge_6 となっている。

C:\Users\hamasho\Downloads>aws configure
AWS Access Key ID [****************FL6G]:
AWS Secret Access Key [****************pmXV]:
Default region name [ap-northeast-1]:
Default output format [None]:

C:\Users\hamasho\Downloads>aws sts get-caller-identity
{
    "UserId": "AIDAQZ2IU22WIFYNZDUBU",
    "Account": "055450064556",
    "Arn": "arn:aws:iam::055450064556:user/ctf_challenge_6"
}

ctf_challenge_6ユーザに割り当てられているポリシー情報を確認すると、インラインポリシーとして runlambda というポリシーが存在する。問題名の通り、Lambdaを実行する必要がありそう?

C:\Users\hamasho\Downloads>aws iam list-attached-user-policies --user-name ctf_challenge_6
{
    "AttachedPolicies": []
}

C:\Users\hamasho\Downloads>aws iam list-user-policies --user-name ctf_challenge_6
{
    "PolicyNames": [
        "runlambda" ★
    ]
}

runlambdaのポリシードキュメントを参照すると、Lambda関数のリソース名を確認できる。

C:\Users\hamasho\Downloads>aws iam get-user-policy --user-name ctf_challenge_6 --policy-name runlambda --query "PolicyDocument"
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "readiam",
            "Effect": "Allow",
            "Action": [
                "iam:Get*",
                "iam:List*"
            ],
            "Resource": "arn:aws:iam::055450064556:user/ctf_challenge_6"
        },
        {
            "Sid": "lambdaInvoke",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": "arn:aws:lambda:ap-northeast-1:055450064556:function:run_me" ★
        }
    ]
}

リソース名を確認できたので、aws lambda invokeコマンドでLambda関数を実行してみる。応答内容の文言の通り、実行ログを見る必要がありそう。

C:\Users\hamasho\Downloads> aws lambda invoke --function-name arn:aws:lambda:ap-northeast-1:055450064556:function:run_me test
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}

C:\Users\hamasho\Downloads>type test
{"statusCode": 200, "body": "\"Look at the log!\""}

オプションを変更して、実行ログを標準出力に出力させてみる、Base64エンコードされていると思われる文字列が得られる。

C:\Users\hamasho\Downloads>aws lambda invoke --function-name arn:aws:lambda:ap-northeast-1:055450064556:function:run_me --log-type Tail test
{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiBmYzkyNmM4OS1lYjA2LTRlNjctYmU4Zi1iNWFjZDU2YmJmYTAgVmVyc2lvbjogJExBVEVTVApTSkFXU3tZb3Vfd2FzX2FibGVfdG9fYXJyaXZlX0B0X3RoZV9sYW1iZGFfZnVuY3Rpb24uLXdlbGxfZG9uZSF9CkVORCBSZXF1ZXN0SWQ6IGZjOTI2Yzg5LWViMDYtNGU2Ny1iZThmLWI1YWNkNTZiYmZhMApSRVBPUlQgUmVxdWVzdElkOiBmYzkyNmM4OS1lYjA2LTRlNjctYmU4Zi1iNWFjZDU2YmJmYTAJRHVyYXRpb246IDEuMTIgbXMJQmlsbGVkIER1cmF0aW9uOiAyIG1zCU1lbW9yeSBTaXplOiAxMjggTUIJTWF4IE1lbW9yeSBVc2VkOiA0MCBNQgkK",
    "ExecutedVersion": "$LATEST"
}

LogResultをBase64デコードするとFLAG文字列が得られる。

START RequestId: fc926c89-eb06-4e67-be8f-b5acd56bbfa0 Version: $LATEST
SJAWS{You_was_able_to_arrive_@t_the_lambda_function.-well_done!} ★
END RequestId: fc926c89-eb06-4e67-be8f-b5acd56bbfa0
REPORT RequestId: fc926c89-eb06-4e67-be8f-b5acd56bbfa0	Duration: 1.12 ms	Billed Duration: 2 ms	Memory Size: 128 MB	Max Memory Used: 40 MB

FLAG : SJAWS{You_was_able_to_arrive_@t_the_lambda_function.-well_done!}

Find data 1 (50pt)

FLAGはバケツに突っ込んであるので探してね!

バケツ = S3バケットと思われる。AWSアカウントの情報が与えられるので、コンソールにアクセスしてS3バケットを確認する。

himituno-bucket1を確認すると、 FLAG というファイルが格納されている。

格納されているFLAGをダウンロードして中身を確認するとFLAG文字列が記載されていた。

FLAG : SJAWS{mazuha-kote-sh1rabe_yokumitukemasitane!}

Find data 2 (50pt)

FLAGはバケツに突っ込んであるので探してね!

Find data 2と同様に、S3バケットからFLAGを探す問題と推測する。

今度はコンソール画面にはアクセスできないため、AWS CLIからS3バケットの中身を調査する。aws s3 lsコマンドを使ってバケット一覧を取得し、それぞれ中身を閲覧可能か確認する。
himituno-bucket2バケットは閲覧可能で、その配下にSECRETというディレクトリがある。

C:\Users\hamasho\Downloads>aws s3 ls
2023-08-13 23:13:07 backup-37szjp8pny7xx01
2023-08-26 22:43:13 camouflagedrop-wxhqft4lqf-assets-wxhqft4lqf-assets
2023-08-26 22:39:22 camouflagedrop-wxhqft4lqf-web-wxhqft4lqf-static
2023-08-22 20:16:14 cdk-hnb659fds-assets-055450064556-ap-northeast-1
2023-08-25 03:05:46 file-storage-afeffefespntbaiw7o5
2023-08-06 21:55:59 himituno-bucket1
2023-08-06 21:58:33 himituno-bucket2
2023-08-06 23:08:46 himituno-bucket3
2023-08-27 02:41:30 my-backup-file-ulxmhiw3jroec7sclynr06fkvhqssf
2023-08-22 20:56:47 s3misssignurl-t6j4qj4r-assets-t6j4qj4r-assets-bucket
2023-08-22 20:52:31 s3misssignurl-t6j4qj4r-web-t6j4qj4r-static-host-bucket
2023-08-24 04:24:09 totemo-kawaii-neko-no-namae-ha-lise-desu
2023-08-27 01:18:59 ulxmhiw3jroec7sclynr06fkvhqssf

C:\Users\hamasho\Downloads>aws s3 ls s3://backup-37szjp8pny7xx01
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://camouflagedrop-wxhqft4lqf-assets-wxhqft4lqf-assets
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://camouflagedrop-wxhqft4lqf-web-wxhqft4lqf-static
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://cdk-hnb659fds-assets-055450064556-ap-northeast-1
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://file-storage-afeffefespntbaiw7o5
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://himituno-bucket1
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://himituno-bucket2
                           PRE SECRET/

C:\Users\hamasho\Downloads>aws s3 ls s3://himituno-bucket3
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://my-backup-file-ulxmhiw3jroec7sclynr06fkvhqssf
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://s3misssignurl-t6j4qj4r-assets-t6j4qj4r-assets-bucket
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://s3misssignurl-t6j4qj4r-web-t6j4qj4r-static-host-bucket
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://totemo-kawaii-neko-no-namae-ha-lise-desu
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://ulxmhiw3jroec7sclynr06fkvhqssf
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

更にその下には大量のディレクトリと大量のflag.jpgというファイルが存在する。

C:\Users\hamasho\Downloads> aws s3 ls --recursive s3://himituno-bucket2/SECRET/
2023-08-06 22:03:43      62896 SECRET/1/flag.jpg
2023-08-06 22:03:43      62896 SECRET/10/flag.jpg
2023-08-06 22:03:44      62896 SECRET/100/flag.jpg
2023-08-06 22:03:44      62896 SECRET/1000/flag.jpg
2023-08-06 22:03:45      62896 SECRET/101/flag.jpg
2023-08-06 22:03:45      62896 SECRET/102/flag.jpg
2023-08-06 22:03:45      62896 SECRET/103/flag.jpg
2023-08-06 22:03:46      62896 SECRET/104/flag.jpg
2023-08-06 22:03:46      62896 SECRET/105/flag.jpg
(以下略)


C:\Users\hamasho\Downloads>aws s3 cp s3://himituno-bucket2/SECRET/ ./ --recursive
(以下略)

flag.jpgを全部ダウンロードして目grepしていくと、他と異なるファイルが見つかった。正解の画像ファイルにFLAG文字列が記載されていた。

FLAG : SJAWS{t@1hen-yoku_mitukemasita!}

Show IAM policy (50pt)

このユーザーにアタッチされているポリシーを確認してみよう!Policyドキュメントを注意深くみたらFLAGが隠れているかも。

競技時間内にギリギリ解けなかった問題。

IAMユーザのアクセスキーとシークレットアクセスキーが提供される。AWS CLI(aws sts get-caller-identityコマンド)を使用してユーザ情報を確認する。ユーザ名はctf_challenge_5となっている。

C:\Users\hamasho\Downloads>aws configure
AWS Access Key ID [****************STUF]:
AWS Secret Access Key [****************eJbG]:
Default region name [ap-northeast-1]:
Default output format [None]:

C:\Users\hamasho\Downloads>aws sts get-caller-identity
{
    "UserId": "AIDAQZ2IU22WGWQKEMXU3",
    "Account": "055450064556",
    "Arn": "arn:aws:iam::055450064556:user/ctf_challenge_5"
}

IAMユーザに紐付くポリシーの情報は得られなかったので、IAMユーザが所属するグループを確認してみる。ctf_challenge_5ユーザはctf5グループに所属している。

C:\Users\hamasho\Downloads>aws iam list-groups-for-user --user-name ctf_challenge_5 --query "Groups[].GroupName"
{
    "Groups": [
        {
            "Path": "/",
            "GroupName": "ctf5",
            "GroupId": "AGPAQZ2IU22WHDOHFQVUC",
            "Arn": "arn:aws:iam::055450064556:group/ctf5", ★
            "CreateDate": "2023-08-06T14:48:22+00:00"
        }
    ]
}

aws iam list-group-policiesコマンドでctf5グループのインラインポリシーを取得すると、selfcheckというインラインポリシーが存在していた。

C:\Users\hamasho\Downloads>aws iam list-group-policies --group-name ctf5
{
    "PolicyNames": [
        "selfcheck"
    ]
}

aws iam get-group-policyコマンドでインラインポリシーの詳細を確認する。

C:\Users\hamasho\Downloads>aws iam get-group-policy --group-name ctf5 --policy-name selfcheck
{
    "GroupName": "ctf5",
    "PolicyName": "selfcheck",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": {
            "Sid": "U0pBV1N7RG9feW91LWZpbmRfdGhlX0B0dGFjaGVkX3AwbDFjeT99",
            "Effect": "Allow",
            "Action": [
                "iam:Get*",
                "iam:List*"
            ],
            "Resource": [
                "arn:aws:iam::055450064556:group/ctf5",
                "arn:aws:iam::055450064556:user/ctf_challenge_5"
            ]
        }
    }
}

Sidにセットされている文字列("U0pBV1N7RG9feW91LWZpbmRfdGhlX0B0dGFjaGVkX3AwbDFjeT99")をBase64デコードするとFLAGが得られる。

FLAG : SJAWS{Do_you-find_the_@ttached_p0l1cy?}

Where is the password? (50pt)

「AWSのとあるサービスからパスワードを取得してください! ヒント:AWSで安全にパスワード管理をしたい時に利用するサービスと言えば?」
パスワードの値を探せばFLAGが見つかるかも。

AWSで安全にパスワード管理をしたい時に利用するサービスというヒントがあるため、AWSコンソールからAWS Secrets Managerを確認する。

https://aws.amazon.com/jp/secrets-manager/

ctf/secretpasswordを確認すると、シークレットの値がFLAG文字列となっていた。

FLAG : SJAWS{Use_Secrets_Manager_for_P@ssw0rd_Management!}

Easy問題

Find data 3 (100pt)

FLAGはバケツに突っ込んであるので探してね!

s3 lsコマンドを各S3バケットに対して実行する。himituno-bucket3は閲覧権限がありそう。

C:\Users\hamasho\Downloads>aws s3 ls s3://backup-37szjp8pny7xx01
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://camouflagedrop-wxhqft4lqf-assets-wxhqft4lqf-assets
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://camouflagedrop-wxhqft4lqf-web-wxhqft4lqf-static
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://cdk-hnb659fds-assets-055450064556-ap-northeast-1
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://file-storage-afeffefespntbaiw7o5
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://himituno-bucket1
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://himituno-bucket2
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://himituno-bucket3
2023-08-06 23:11:05         89 readme.txt

C:\Users\hamasho\Downloads>aws s3 ls s3://my-backup-file-ulxmhiw3jroec7sclynr06fkvhqssf
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://s3misssignurl-t6j4qj4r-assets-t6j4qj4r-assets-bucket
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://s3misssignurl-t6j4qj4r-web-t6j4qj4r-static-host-bucket
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://totemo-kawaii-neko-no-namae-ha-lise-desu
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

C:\Users\hamasho\Downloads>aws s3 ls s3://ulxmhiw3jroec7sclynr06fkvhqssf
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

readme.txtをダウンロードして中身を確認する。FLAGが入ったファイルは削除されている?

C:\Users\hamasho\Downloads>aws s3 cp s3://himituno-bucket3/readme.txt ./
download: s3://himituno-bucket3/readme.txt to .\readme.txt

C:\Users\hamasho\Downloads>type readme.txt
It was pointed out that placing sensitive data on S3 is not recommended, so I removed it.

オブジェクト情報の一覧を表示する。readme.txt以外に SECRET_DATA というファイルが存在していたようだが、DeleteMarkersがTrueになっており、削除済み状態の状態になっているようだった。

C:\Users\hamasho\Downloads>aws s3api list-object-versions --bucket himituno-bucket3
{
    "Versions": [
        {
            "ETag": "\"c9f27b84582adb55f13c221fcb6a98c2\"",
            "Size": 34,
            "StorageClass": "STANDARD",
            "Key": "SECRET_DATA", ★
            "VersionId": "MO4Xz6sB8DONDjCid6ideiRgfdyywcSv", ★
            "IsLatest": false,
            "LastModified": "2023-08-06T14:09:57+00:00",
            "Owner": {
                "DisplayName": "metal.preacher.667+secjawsctf02",
                "ID": "fc0f5cd79b017dfe728d64cc204668f1627550263b144a54ae6c2074446d2f59"
            }
        },
        {
            "ETag": "\"5a60a9f41ca16805b78555e750446f4f\"",
            "Size": 89,
            "StorageClass": "STANDARD",
            "Key": "readme.txt",
            "VersionId": "C5Liv01TTxQDidoi3Uhs2NJuBkFCPCQI",
            "IsLatest": true,
            "LastModified": "2023-08-06T14:11:05+00:00",
            "Owner": {
                "DisplayName": "metal.preacher.667+secjawsctf02",
                "ID": "fc0f5cd79b017dfe728d64cc204668f1627550263b144a54ae6c2074446d2f59"
            }
        }
    ],
    "DeleteMarkers": [
        {
            "Owner": {
                "DisplayName": "metal.preacher.667+secjawsctf02",
                "ID": "fc0f5cd79b017dfe728d64cc204668f1627550263b144a54ae6c2074446d2f59"
            },
            "Key": "SECRET_DATA",
            "VersionId": "RNzJqEkR36thowt.ug5SxaGYT18yckYP",
            "IsLatest": true,
            "LastModified": "2023-08-06T14:10:21+00:00"
        }
    ],
    "RequestCharged": null
}

削除済みオブジェクトのKey(ファイル名)とVersionIdが確認できたので、aws s3api get-objectコマンドで当該オブジェクトをローカル環境にダウンロードしてみる。ダウンロードした SECRET_DATA の中にFLAGが記載されていた。

C:\Users\hamasho\Downloads>aws s3api get-object --bucket himituno-bucket3 --key SECRET_DATA --version-id MO4Xz6sB8DONDjCid6ideiRgfdyywcSv ./SECRET_DATA
{
    "AcceptRanges": "bytes",
    "LastModified": "2023-08-06T14:09:57+00:00",
    "ContentLength": 34,
    "ETag": "\"c9f27b84582adb55f13c221fcb6a98c2\"",
    "VersionId": "MO4Xz6sB8DONDjCid6ideiRgfdyywcSv",
    "ContentType": "binary/octet-stream",
    "ServerSideEncryption": "AES256",
    "Metadata": {}
}

C:\Users\hamasho\Downloads>type SECRET_DATA
SJAWS{Versi0ning_ni_kizukim@sita?} ★

FLAG : SJAWS{Versi0ning_ni_kizukim@sita?}

Discussion