AWS 云基础概念

AWS 核心服务、权限模型和常用云基础概念笔记。

AWS准备工作

(先创建一个账户 登陆上AWS 记住刚创建是以ROOT的身份登录的)

IAM

比如inux或者windows,他们都有一个最高权限的账户 root/administrator,这里也有,感觉有点类似于域的概念,AWS最高权限是ROOT,他有全部权限什么都可以操控,但是如果一直用root大家也知道,如果被黑别人都不用提权了,啥都有了,所以有了IAM。

而IAM呢,你可以创建一个用户并给它分配一个服务,比如我想给他分配一个S3的服务权限,那么会要求你设置账号密码,然后给你生成一个专属的URL,你可以通过这个URL登录这个账户,也称之为IAM账户,你在本地搭建tomcat或者nginx等服务的时候,一般启动这些服务的用户都是www-data,实际上就类似于这个,而像域的概念是因为,作为ROOT你可以修改很多东西,如下图。

你可以创建用户组,用户,角色,策略等等,感觉和域的概念很像,其实linux/windows都一样,角色分配也可以,策略也能做,像是做基线的感觉,只是这里是统一化管理,像是分发的感觉,而不是在同一台机器上操作,所以感觉像域控,为了后续的学习,这里需要创建一个管理员账户。

创建账户

提供 AWS 管理控制台访问就是让 IAM 用户可以通过 Web 页面(AWS 控制台)操作,而不仅仅是使用 API,这里全部开启,学习阶段web和api都要了解。

点击下一步 会到设置权限处

直接创建一个组,权限就选第一个,这里是为了创建一个拥有administrator权限的组,如果以后还想创建administrator权限的用户就可以直接丢进这个组,当然如果不考虑以后,可以自行点击最右边的直接附加策略,附加上去一个administratoraccess就行(跟windows/linux账户管理的架构其实非常非常像)

这个页面最下面其实还有一个设置边界权限,其实也很好理解,adminisratoraccess是不是有了全部的权限,如果我想让某个 IAM 用户只能管理 EC2,而不能管理 S3,即使他加入了管理员组,就可以在这里设置。

这里我们用不到,直接下一步就行。

这里仅仅是添加标签,类似于用户组还有用户的描述把。直接点击创建用户。

角色

介绍一下角色这个模块

正常会生成两个默认角色 主要是有个ARN

每个角色都有一个ARN 类似于linux的/etc/passwd以及windows的SID把 目前了解到的概念就是 如果要学习云渗透 就必须了解这个IAM角色的概念 后续提权会用到这里 我了解到的概念就是:IAM 角色可以让 AWS 服务(如 EC2, Lambda)自动访问 AWS 资源,而不需要 API Key。其实也就是一个服务如果需要另一个服务的资源就可以设置这个,访问如下

1
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/

可以获得临时凭证,但是如果你把这个角色给了EC2,你就必须在登录EC2的状态下才可以访问这个URL,同时可以获得一个临时的凭据,而且这是一个特殊的IP(169.254.169.254),仅对当前实例EC2可见,外部无法访问,IMDS自动识别你的 EC2 实例,并返回当前绑定的IAM角色的临时凭证。

理解就是非常安全和方便,如果像上面一样用APIKEY来访问服务,而APIKEY又是一个长期存在的东西,如果被盗了就很容易被攻击者长期持有,而这个一般只存活一个小时,后续就算拿到了凭证也无法登陆了,无法持久化的去操控。

IAM渗透进阶(暂停)

基础概念学完了 接下来关于渗透部分还有下面这些 目前留空因为还没开始学渗透 把大纲放在这

1️⃣ 识别 IAM 账户信息

  • aws sts get-caller-identity 获取当前 IAM 账户信息
  • aws iam list-usersaws iam list-roles 识别账户内用户和角色
  • 通过 IAM ARN 判断 AWS 账户归属

2️⃣ IAM 权限提升(Privilege Escalation)

  • iam:AttachUserPolicy 绑定管理员权限 (AdministratorAccess)
  • sts:AssumeRole 切换到更高权限的角色
  • iam:CreateAccessKey 创建新 API Key 访问 AWS
  • iam:PassRole + ec2:RunInstances 通过 EC2 绑定高权限角色

3️⃣ 利用 IAM 角色

  • aws sts assume-role 获取临时权限
  • 读取 EC2 实例的 IAM 角色 (169.254.169.254/latest/meta-data/iam/security-credentials/)
  • SSRF 读取 IAM 角色凭证(IMDS v1 漏洞)
  • IMDS v2 保护机制及绕过方法

4️⃣ IAM 访问策略分析

  • 解析 aws iam list-policies 获取的策略内容
  • JSON 格式的 IAM 策略解读
  • 通过 aws iam get-policy-version 查看策略版本历史
  • 发现过度授权的 IAM 角色(Overly Permissive Policies)

5️⃣ IAM 角色滥用

  • aws iam list-attached-role-policies 检查 IAM 角色的附加策略
  • 通过 sts assume-role 获取跨账户访问权限
  • 发现外部身份提供者(OIDC/SAML)配置错误

6️⃣ IAM 账户访问 AWS 资源

  • aws s3 ls 枚举 IAM 账户对 S3 的访问权限
  • aws ec2 describe-instances 检查 EC2 资源访问情况
  • aws lambda list-functions 查看 Lambda 函数绑定的 IAM 角色

7️⃣ IAM 账户数据泄露

  • 公开 S3 存储桶 (aws s3 ls s3://target-bucket --no-sign-request)
  • CloudFormation/Terraform 配置文件泄露
  • aws iam get-account-authorization-details 获取 IAM 账户权限详情
  • aws iam list-access-keys 检查 AWS API Key 泄露

8️⃣ 防御与检测

  • 监控 AWS CloudTrail 日志,检测 IAM 账户滥用
  • AWS GuardDuty 监测异常 IAM 行为
  • 限制 IAM 角色的 sts:AssumeRole 访问范围
  • 启用 IAM 访问分析器(IAM Access Analyzer)

EC2

你可以把 EC2 理解为 AWS 提供的“云端虚拟机”,主要包括:

  • 实例(Instance):一台云服务器,可以启动、停止、重启。
  • AMI(Amazon Machine Image):EC2 的操作系统镜像,比如 Ubuntu、Amazon Linux、Windows Server。
  • 实例类型(Instance Type):决定 CPU、内存、带宽,比如 t2.micro(免费)。
  • EBS(Elastic Block Store):EC2 的硬盘存储,相当于云端磁盘。
  • 安全组(Security Group):EC2 的防火墙规则,控制允许哪些 IP 访问。
  • 公有 IP & 私有 IP
  • 公有 IP:互联网上可以直接访问的 IP。
  • 私有 IP:只能在 VPC(AWS 内部网络)中访问。

直接创建一个实例 search EC2找到直接进入创建页面 配置如下就行了 用免费版本的话实例一个月不超过750小时就免费 750个小时相当于31天多了 肯定会有疑问 直接写免费不就行了吗 但是EC2支持创建多个实例 创建两个 那每个就只允许开375个小时了 配置如下(因为国外大部分用的都是 Amazon Linux 而且集成也方便 所以这里创建这个 还可以学习一下AmazonLinux和普通不一样的地方)

到此就可以了 用SSH连上去就行 主要是知道EC2是什么 体验一下就行

还有一个 Security Group 这个跟你在国内的aliyun之类的非常像,只不过aliyun那些会自动把这个防火墙给你开启,导致你在本机开了端口还要去aliyunweb页面开端口,感觉就是一个防火墙。

接着是一个EBS,我对他的理解就是类似于vmware虚拟机,当你需要给你的虚拟化的vpc扩充硬盘的时候,可以挂载一个上去,当然这个硬盘是虚拟化的,他不会消失,就相当于又插上去了一个硬盘,可以独立存储东西,很方便,就是一个独立的云硬盘。

这可能就是云服务的概念,而EFS呢,是通过NFS共享的硬盘,就是不知道通信会不会卡,不过这样确实挺不错的。

S3

S3 是对象存储,不是传统的文件系统

实际利用比如aliyun已经有很多了,比如常见你文件上传的时候,他会上传到oss服务,读取文件也是从那边读的,相当于你怎么上传都传不到服务器本地,而是其他的云端。我感觉这个S3其实跟OSS没啥区别。

S3 与 OSS 的不同点

特性AWS S3阿里云 OSS
存储桶名称全局唯一同区域唯一
区域限制必须选择 AWS 区域(如 us-east-1)必须选择阿里云区域(如 cn-hangzhou)
存储类型标准(Standard)、低频(IA)、Glacier标准、低频、归档、冷归档
API 兼容性S3 API部分兼容 S3 API,但有阿里云专有 API
默认访问权限默认私有,需要手动修改默认私有,需要手动修改
跨区域复制支持跨 AWS 区域复制支持跨阿里云区域复制

默认是私有的 你可以存一些备份资料什么的,其他人也看不见,接下来操作S3的话,需要学习创建S3存储桶,通过URL和AWSCLI进行操作尝试。

创建S3存储桶

配置如下

创建好之后找到创建的存储桶 随便传上去一个文件

然后再存储桶策略处写入下面的策略

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::mentalityxttest/*"
        }
    ]
}

因为默认情况下 只允许当前用户访问上传的资源 但是目前为了学习 全部开放比较好 所以允许存储桶策略控制之后 还要写规则来允许外部访问存储桶 至此就可以访问到图片了

AWS CLI

先检查 AWS CLI 是否安装

执行:

1
aws --version

如果没有安装,可以参考官方文档:

  • Linux/macOS:
1
2
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
  • Windows: 下载 AWS CLI

配置 AWS CLI(绑定你的 AWS 账户)

你需要配置 Access Key 和 Secret Key(可以在 IAM 里创建),然后执行:

1
aws configure

然后按提示输入:

  • AWS Access Key ID:你的 AWS 访问密钥
  • AWS Secret Access Key:你的 AWS 密钥
  • Default region nameap-southeast-1(你选的区域)
  • Default output formatjson(默认 JSON,推荐)

区域在主页 两个key都在用户的访问密钥处

S3 CLI 常用操作

下面是 S3 常用命令,结合你学习的存储桶权限,可以直接在终端测试操作!

创建 S3 存储桶

1
aws s3 mb s3://your-bucket-name

mb = make bucket(创建存储桶)

列出存储桶

1
aws s3 ls

上传文件到 S3

1
aws s3 cp localfile.jpg s3://your-bucket-name/

cp = copy(拷贝文件)

如果想递归上传整个文件夹:

1
aws s3 cp ./my-folder s3://your-bucket-name/ --recursive

下载 S3 的文件

1
aws s3 cp s3://your-bucket-name/3.jpg ./localfile.jpg

列出存储桶中的文件

1
aws s3 ls s3://your-bucket-name/

删除 S3 存储桶中的文件

1
aws s3 rm s3://your-bucket-name/3.jpg

删除整个存储桶

1
aws s3 rb s3://your-bucket-name --force

rb = remove bucket,--force 代表删除所有内容后再删除存储桶。

Lambda

Lambda 就是 一个能自动运行的代码托管环境,它的作用类似:你写了一段 Python 代码 → 但不需要开服务器运行

  • 事件触发器(Event Source):Lambda 代码什么时候执行?
  • S3 事件(上传文件后自动执行 Lambda)
  • API Gateway(用户访问 API 时触发)
  • CloudWatch 事件(定时触发)
  • SNS / SQS 消息(消息触发 Lambda)

运行环境(Runtime)

  • Lambda 支持多种语言(Python、Node.js、Go、Java、C#、Ruby)。
  • 你需要选择一个运行时,比如 Python 3.9

执行时间限制

  • Lambda 最大执行时间 15 分钟
  • 代码执行时间越长,费用越高。

直接搜索Lambda就能找到 在刚开始进入的时候 会有教程按个走就行了 慢慢看 其中比较有意思的是响应事件 正如上面列出来的一样 S3事件API事件都可以触发Lambda函数 挺有意思的

默认就可以了 先添加一个触发器 主要是熟悉一下流程就行

开始测试 上传一个文件到S3

1
aws s3 cp .\3.jpg s3://*********/3.jpg

可以看到触发了

当然可以到 CloudWatch 看详细信息

具体的事件 当然我们只能看到他被触发了 无法确定是由什么事件出发的 结果是什么

回到Lambda 写入如下代码点击 Deploy 保存代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import json

def lambda_handler(event, context):
    print("=== Lambda 被触发 ===")
    print(json.dumps(event, indent=4))  # 打印触发 Lambda 的事件

    response = {
        'statusCode': 200,
        'body': json.dumps('Lambda 运行成功')
    }

    print("=== Lambda 返回值 ===")
    print(json.dumps(response, indent=4))  # 打印 Lambda 返回的结果

    return response

重新触发一次 不论是上传文件触发事件 还是 点击测试代码都可以触发

这里是点击测试代码的日志 可以看到 返回值的json跟测试里面的json一模一样 被记录下来了

这里是上传文件到S3存储桶出发的日志 里面有详细的awscli的模块 也有上传文件的名称 也有存储桶的名称还有文件大小等等

event(事件数据)

  • event 是 AWS 触发 Lambda 时自动传进来的数据,比如:
  • S3 触发 Lambdaevent 里会包含 上传的文件名、存储桶名
  • API Gateway 触发 Lambdaevent 里会包含 HTTP 请求信息
  • CloudWatch 触发 Lambdaevent 里会包含 定时任务信息

故此我们输出了event才有s3存储桶的很多信息 包括上传者的IP都有

context(执行环境)

context 不是事件数据,而是 AWS 运行 Lambda 时的一些环境信息,比如:

  • context.function_nameLambda 函数名称
  • context.memory_limit_in_mb分配的内存
  • context.aws_request_id当前请求的 ID
  • context.get_remaining_time_in_millis()Lambda 剩余的运行时间

context包含如上 如果想看一下 也可以放到函数里面进行调用

AWS CLI

首先,确保你已经正确 配置 AWS CLIaws configure),并且有足够的权限。

列出所有 Lambda 函数

1
aws lambda list-functions

这个命令会返回你的 Lambda 函数列表,你应该会看到 MyFirstFunction

获取 Lambda 详细信息

1
aws lambda get-function --function-name MyFirstFunction

查看 Lambda 代码存储位置、运行时(Python 3.9)、执行角色等信息还会返回代码的ZIP压缩包的连接,可以下载。

手动调用 Lambda

你可以用 CLI 直接触发 Lambda(相当于控制台的“测试”功能)。

1
2
3
4
5
6
7
aws lambda invoke \
    --function-name MyFirstFunction \
    --payload '{"key1": "value1", "key2": "value2"}' \
    --cli-binary-format raw-in-base64-out \
    response.json

aws lambda invoke --function-name MyFirstFunction --payload "{\"key1\": \"value1\", \"key2\": \"value2\"}" response.json --cli-binary-format raw-in-base64-out

Lambda 运行完后,结果会存到 response.json文件

如果用的是 AWS CLI v2 新版本的 需要在后面加上 –cli-binary-format raw-in-base64-out 让 AWS CLI 不做 base64 编码,直接发送 JSON 作为请求体,Lambda 就能正确解析了。

查看结果

1
cat response.json

你应该会看到:

1
2
3
4
{
    "statusCode": 200,
    "body": "\"Lambda 运行成功\""
}

如果你的 Lambda 代码会打印 event,你也会看到它解析输入数据的日志。

更新 Lambda 代码

假设你有一个新的 lambda_function.py,可以这样上传:

1
2
3
4
5
zip function.zip lambda_function.py

aws lambda update-function-code \
    --function-name MyFirstFunction \
    --zip-file fileb://function.zip

这个命令会 直接更新 Lambda 代码,你不需要去 AWS 控制台手动上传。

更新 Lambda 配置

如果你想 修改 Lambda 运行时、内存、超时时间,可以:

1
2
3
4
aws lambda update-function-configuration \
    --function-name MyFirstFunction \
    --memory-size 256 \
    --timeout 30

这里把 Lambda 的 内存改为 256MB,超时时间改为 30 秒

删除 Lambda 函数

如果你不需要这个 Lambda 了,可以删除:

1
aws lambda delete-function --function-name MyFirstFunction

注意:这个操作是不可逆的!

编写上传 Lambda代码

基础编写就不提了 进阶会提到boto3这个库 需要学习

1
2
3
4
5
6
7
8
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
1
zip function.zip lambda_function.py
1
2
3
4
5
6
aws lambda create-function \
    --function-name BackdoorLambda \
    --runtime python3.8 \
    --role arn:aws:iam::<ACCOUNT_ID>:role/<HIGH_PRIV_ROLE> \
    --handler lambda_function.lambda_handler \
    --zip-file fileb://function.zip

CloudTrail

CloudTrail = AWS 账户的操作记录系统

  • 记录xxxx谁(用户、角色、服务)在 AWS 做了什么(创建、修改、删除资源)。
  • 记录xxxx什么时候、从哪里(IP 地址、地理位置)访问了 AWS。
  • 记录xxxxAPI 调用(通过 AWS 控制台、CLI、SDK 执行的所有操作)。

简单理解: CloudTrail 就像 AWS 账户的“黑匣子”,能记录所有 AWS 操作,帮助你 排查问题 & 发现异常。

主要是行为审计,非常像堡垒机对运维人员的任何行为做出的审计记录,

随便创建一个进来就能看到了,这里面都能看到,但是比如调用S3的接口执行ls或者下载文件的话,是不会被记录的,因为没有开,如下图 数据事件处是可以开的,但是要收费,就不管了,实际上知道怎么调用接口之类的就行了,下面看一下AWSCLI。

AWS CLI

查询最近的 CloudTrail 事件

1
aws cloudtrail lookup-events --max-results 10

查询最近 10 个事件,默认是 所有管理事件(不包含 S3 数据事件)。

按事件名称查询

1
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=CreateBucket

过滤出所有 CreateBucket 事件(即创建 S3 存储桶的操作)。

1
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=GetObject

尝试查找 S3 文件下载(GetObject)事件,前提是你已经启用了 S3 数据事件

按 IAM 用户查询

1
aws cloudtrail lookup-events --lookup-attributes AttributeKey=Username,AttributeValue=MentalityXt --max-results 10

查找 MentalityXt 用户最近 10 个操作

按资源名称查询

1
aws cloudtrail lookup-events --lookup-attributes AttributeKey=ResourceName,AttributeValue=mentalityxttest

过滤出所有操作 mentalityxttest S3 存储桶 的事件。

按时间范围查询

1
aws cloudtrail lookup-events --start-time "2025-03-03T00:00:00Z" --end-time "2025-03-03T23:59:59Z"

查询 2025 年 3 月 3 日的所有 CloudTrail 事件

列出所有 CloudTrail 跟踪(Trails)

1
aws cloudtrail list-trails

列出 AWS 账户内所有的 CloudTrail 追踪(Trails)。

获取某个 Trail 的详细信息

1
aws cloudtrail describe-trails

查询 CloudTrail 追踪的详细信息,包括 S3 日志存储位置。

停止 CloudTrail 记录

1
aws cloudtrail stop-logging --name management-events

停止 management-events Trail 的日志记录(不会删除已存储的日志)。

重新启动 CloudTrail 记录

1
aws cloudtrail start-logging --name management-events

重新启动 management-events Trail 的日志记录。

下载 CloudTrail 事件日志

1
aws s3 ls s3://aws-cloudtrail-logs-6502********-63db363a/AWSLogs/6502********/CloudTrail/

列出存储在 S3 里的 CloudTrail 日志(如果你启用了 S3 存储)。

1
2
aws s3 cp s3://aws-cloudtrail-logs-6502********-63db363a/AWSLogs/6502********/CloudTrail/2025/03/03/日志文件.json.gz .
gunzip 日志文件.json.gz

下载 CloudTrail 日志文件并解压,可以本地分析。

上面列了一堆我感觉就第十条最好用,它可以下载所有的日志,再慢慢分析一样的,像上面如果一直查在数据量特别大的情况下好用一些,但是数据量不是很大的话还是全部下载下来分析比较好,目前记录AWSCLI操作的命令还算比较少,其实这也是为了一个场景,当获取到泄露的Access Key 和 Secret Key的时候就可以利用API来获取到一些信息,所以这个实际上不用死记硬背,但是得知道有这些API的请求方法。

CloudWatch

CloudWatch 是 AWS 的 监控 & 日志管理服务,可以:

  • 监控 AWS 资源(EC2、S3、Lambda、RDS 等)
  • 收集 & 存储日志(Lambda、EC2、CloudTrail 等日志)
  • 设置告警(比如 CPU 超过 80% 时触发告警)
  • 可视化数据(创建 Dashboard 进行展示)

和上一个相似,上一个主要是用户的操作审计等等,而这个是对资源方面的监控,如果用过安全设备,啥设备都行,其实都有这一块,比如WAF、IPS/IDS、态势感知等等。

直接搜点开看两眼就行了,有时候接口方面的审计也能细化,在Lambda处实际上我们创建了一个并打开过一次,这里随便放点图把。

其他的这些东西 可以挨个点开看看 理解一下就行 另外

  • CloudWatch 本身不记录 API 请求,但是 CloudTrail 记录 API
  • 如果你想在 CloudWatch 里看到 API 日志,需要把 CloudTrail 事件存到 CloudWatch Logs
  • 这样你就能用 AWS CLI 查询 API 调用日志了!

这里也不多赘述了,如果以后需要在AWS上搭建服务的话在了解,目前不需要了解。

在翻得时候我发现了一个有意思的地方,流量监视器,但是前提是得开一个EC2实例,我之前给他关了因为我学完就不咋用还可能会计费。所以下面一条数据流量没有。

当然如果光开启了只会收到流量包发不过去失败的情况的日志,不会有流量传输的日志。下面的方法是可以传过去的

注意左上角的位置,有点麻烦,这里就不搞了,值得一提的是这里也可以通过AWSCLI来设置及查询。我想到了一个场景,当目标的KEY泄露了,同时目标放着一个站点,这个站点用的人挺多的,可能通信没有加密也可能用了JS加密了(JS逆向可以解开加密),获得到别人的通信流量包的时候很容易知道他人的密码,或者捕获COOKIE危害性还是蛮大的。(实际上不行,只能记录源IP/目标IP 源端口/目标端口 传输协议(TCP/UDP/ICMP)数据包数量/字节数),那感觉除非是开发才用得到,像云安全之类的也需要开一下以外,就没啥大作用了。我发现学的这些东西实际上是攻防都在学,日志系统可以溯源应急梳理攻击链。

我上面画线的部分可以解决,AWS还有个WAF,可以自己写规则,当登录发包的请求里面存在username/passwd之类的敏感词的时候可以添加规则并捕获,但是要收费。

就算了 知道有这个东西就行了

VPC

  • VPC 是 AWS 上的虚拟私有网络(Virtual Private Cloud)
  • 你可以在 VPC 里创建 EC2、数据库(RDS)、负载均衡(ELB)等资源
  • VPC 允许你控制网络拓扑(子网、路由表、安全组、NACL 等)
  • 所有 AWS 资源都运行在某个 VPC 里

这个概念在我22年实习的时候就了解了,当时一直想买一台VPS用来开一些服务,但我发现VPC貌似比VPS便宜,而且感觉也差不多,最主要是想要那个公网IP。

VPC主要是一个网络环境。可以看下面,都是配置网络相关的。如果操作得当实际上可以搭建一个AWS内网横向靶场,双网卡的那种,挺有意思的。

在EC2那我也提到了这里好像跟aliyun那种不一样,aliyun那边自带防火墙这边都没有,结果在这里。

这里实际上我的理解也都是,可以都看看,VPC负责网络流量方面的事情,而EC2主要是处理计算方面的吧,比如给一个操作系统分配CPU、内存等等。

VPC 的防御端主要是做访问控制、流量管控,而攻击端则是尝试获取这些配置信息或绕过防御机制

大概的理解都是这种 VPC的防御已经在上面的左边列出来了,而我们主要是攻方面的,接下来列出来一些重要的API接口,用来查询这些配置信息,前提是获得KEY。

服务API 作用可能的攻击利用
VPCDescribeVpcs获取所有 VPC 的 CIDR、状态、默认 VPC 等信息
子网(Subnet)DescribeSubnets查看所有子网的 IP 范围、可用区等
路由表(Route Table)DescribeRouteTables获取当前 VPC 的路由配置,查看公网访问策略
NACL(网络 ACL)DescribeNetworkAcls查看当前 VPC 的 ACL 规则(入站 / 出站限制)
安全组(Security Groups)DescribeSecurityGroups获取 EC2 安全组规则,查找可能的开放端口
互联网网关(IGW)DescribeInternetGateways获取 VPC 连接外网的方式,是否暴露公网
NAT 网关DescribeNatGateways获取 NAT 代理信息,可能绕过公网限制
VPN 连接DescribeVpnConnections获取 VPN 连接信息,可能尝试劫持 VPN
DNS 防火墙ListFirewallRules获取 DNS 防火墙规则,可能尝试绕过拦截
弹性 IP(Elastic IP)DescribeAddresses获取当前账户绑定的公网 IP,寻找攻击目标

这些 API 都可以通过 AWS CLISDK 查询,例如:

1
2
3
aws ec2 describe-security-groups --region us-east-1
aws ec2 describe-route-tables --region us-east-1
aws ec2 describe-network-acls --region us-east-1

通过这些规则找到漏洞进行绕过就行。

  • 创建新的安全组规则,放宽访问权限
  • 创建隐藏的 IAM 账号,保留后门
  • 修改 VPC 流量日志,隐藏访问记录
  • 创建弹性 IP,绑定到自己控制的实例

RDS

RDS 主要用于 管理关系型数据库,它和自己部署 MySQL 的区别在于:

  1. 无需手动运维:AWS 自动管理 备份、补丁、监控、扩展
  2. 高可用:可以 跨多个可用区(AZ)部署,保证故障时数据库可用。
  3. 安全性:可以使用 VPC 内网部署、加密存储、自动备份
  4. 性能优化:支持 自动扩展、读副本(Read Replica)、Aurora 进行高性能读写。

这里到稍微重点的地方了,很多时候,开发者用的数据库都是用的云服务,这样更方便更加的安全,更加的便宜。

RDS 的关键概念

概念作用
RDS 实例运行数据库的主机(相当于一台数据库服务器)
数据库引擎支持 MySQL、PostgreSQL、MariaDB、Oracle、SQL Server、Aurora
子网组(Subnet Group)让数据库运行在特定的 VPC 子网
安全组(Security Group)控制 RDS 的访问权限(是否允许外部连接)
参数组(Parameter Group)控制数据库的 配置参数(比如 MySQL 的 max_connections
快照(Snapshot)备份数据库,可以随时恢复
读副本(Read Replica)用于读操作优化,减少主实例负载
多可用区部署(Multi-AZ)主数据库在 多个可用区(AZ) 运行,主备切换时不中断

搭建MYSQL

还是一样找到对应的控制台,目前要找的是RDS

按照我下面的配置走 不然要付费

剩下的随便点点 默认就行

连接MYSQL (AWSCLI)

第一种在EC2里面连接就不提了 就是正常连接就行

1
mysql -h your-rds-endpoint -u admin -p

主要是第二种通过AWSCLI

查询 RDS 实例

1
aws rds describe-db-instances

返回结果示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
{
    "DBInstances": [
        {
            "DBInstanceIdentifier": "mydatabase",
            "DBInstanceClass": "db.t3.micro",
            "Engine": "mysql",
            "DBInstanceStatus": "available",
            "Endpoint": {
                "Address": "mydatabase.xxxxxxxx.us-east-1.rds.amazonaws.com",
                "Port": 3306
            },
            "VpcSecurityGroups": [
                {
                    "VpcSecurityGroupId": "sg-0abcd1234",
                    "Status": "active"
                }
            ]
        }
    ]
}
  • 你可以从 “Endpoint” 获取 RDS 连接地址
  • “DBInstanceStatus” 显示数据库状态

备份 RDS

1
aws rds create-db-snapshot --db-instance-identifier mydatabase --db-snapshot-identifier mybackup
  • 创建快照(备份)

删除 RDS

1
aws rds delete-db-instance --db-instance-identifier mydatabase --skip-final-snapshot
  • 立即删除数据库(跳过最后快照)

查询 RDS 是否允许公网访问

1
aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier, PubliclyAccessible]"

返回结果示例(被拒绝了):

1
2
3
4
5
6
[
    [
        "database-1",
        false
    ]
]

开启 RDS 公网访问

1
2
3
4
5
6
aws rds modify-db-instance \
    --db-instance-identifier mydatabase \
    --publicly-accessible \
    --apply-immediately

aws rds modify-db-instance --db-instance-identifier mydatabase --publicly-accessible --apply-immediately

执行完成之后 就会返回mysql的地址了 允许公网访问

开启 RDS 的安全组策略

上面成功获得了这个RDS里的mysql的外部访问权限,但是实际上这里还被安全组阻止了,即使开启了,但是安全组也就是防火墙没有放行还是无法访问,这里将策略打开。

1
aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier,VpcSecurityGroups]"

result:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[
    [
        "database-1",
        [
            {
                "VpcSecurityGroupId": "sg-0e8c9518e********",
                "Status": "active"
            }
        ]
    ]
]

记住VpcSecurityGroupId

开放权限

1
2
3
4
5
6
7
8
9
aws ec2 authorize-security-group-ingress \
    --group-id sg-0123456789abcdef \
    --protocol tcp \
    --port 3306 \
    --cidr YOUR_IP/32

为了安全期间也可以 curl ifconfig.me
找到IP之后 将上面的YOUR_IP替换为当前的 而不是0.0.0.0
aws ec2 authorize-security-group-ingress --group-id sg-0123456789abcdef --protocol tcp --port 3306 --cidr 0.0.0.0/0

成功

修改MYSQL密码

1
2
3
aws rds modify-db-instance \
    --db-instance-identifier database-1 \
    --master-user-password "NewPassword123!"

上面这个可以直接把密码改了 然后连进去 看看数据 但是一般不允许这样 即使是合法渗透 这样也要出事 记一下就行了

至此RDS完毕了,AWSCLI加了一个入站规则,然后给RDS设置了可以被外部访问,现在通过WEB全删了吧。

第二个关闭RDS的远程访问

1
aws rds modify-db-instance --db-instance-identifier mydatabase --no-publicly-accessible --apply-immediately

操作步骤

  • 进入 AWS 控制台RDS 服务
  • 数据库实例 列表找到你的数据库 database-1
  • 点击 “修改(Modify)”
  • 找到 “连接” 部分,取消勾选Publicly accessible(公网可访问)。
  • 选择 立即应用(Apply Immediately)等待维护窗口
  • 保存更改等待 RDS 实例重新启动

我已经删了就不截图步骤了。

基础完结

至此基础部分全部完结 如果需要任何服务 做任何基线 任何访问控制 存储等等 通过上面学到的所有东西都可以完成 你还可以通过上面了解到的自行搭建一个免费的web服务器 并且架构非常棒 涉及各种应用

接下来可以走向很多方向 比如先把AWS certified Security考了 或者如下

  • 走安全方向(深入 IAM、VPC、攻防演练、渗透测试)
  • 走 DevOps & 自动化方向(Terraform、CI/CD、Serverless)
  • 探索 AWS 专项服务(AI、物联网 IoT、区块链等)

CI/CD 在jenkins还有Azure DevOps等等里面比较多 我不清楚在AWS里面自带的DevOps是否能够完成渗透 下一步就是安全方向渗透测试