-
-
[原创]ServerLess Aws Lambda攻击方法研究
-
发表于: 2022-6-9 11:07 974
-
文本围绕三个问题
1、lambda会遇到什么攻击场景
2、什么情况下,在lambda中读取到的env环境变量密钥可以让我们接管服务器甚至整个账号
3、什么情况下,可以通过lambda权限去横向到其他的EC2服务器
本文会对这三个问题进行解答,并且进行演示
Serverless,即无服务器计算。然而Serverless不是不再需要服务器,而是公司或开发者不用过多考虑服务器的问题,计算资源仅作为一种服务而不再以物理硬件的形式出现。
为什么使用ServerLess
Serverless免除公司和开发者对服务器维护的麻烦,因此也不用考虑DevOps了。公司和开发者只需关注应用的开发和运维即可,因此Serverless可以在更大程度上节约运维的成本。
Serverless的优势
选自阿里云
eebK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2S2L8r3W2T1j5h3u0S2j5$3I4G2N6h3c8Q4x3X3g2U0L8$3#2Q4x3V1k6*7K9q4)9J5c8X3E0F1L8%4N6D9k6h3c8Y4k6g2)9J5c8Y4N6Z5j5i4c8Q4x3X3c8A6M7#2)9J5k6s2y4W2M7Y4k6W2M7X3I4W2M7%4x3`.
2f6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6#2M7#2)9J5k6r3g2S2M7%4c8Q4x3X3b7I4i4K6u0W2j5$3!0F1M7$3!0D9k6g2)9J5k6h3q4%4M7#2)9J5k6h3q4E0j5i4A6G2L8W2)9J5k6h3y4G2L8g2)9J5c8X3I4S2L8h3u0V1j5g2)9J5c8X3S2G2L8h3g2Q4x3@1k6J5k6h3N6A6L8$3&6Q4x3@1c8#2M7#2)9J5k6r3g2S2M7%4c8Q4x3X3b7I4i4K6t1K6i4K6u0r3j5%4u0W2j5i4c8W2i4K6u0r3k6Y4g2F1j5%4c8A6L8$3^5`.
这里都是用默认的设置
并且我们对执行的角色也是用默认的选项
在高级设置中,我们也保持默认
在编写函数代码之前,我们需要添加触发器
为了演示方便,我们不去考虑这个函数在业务中的具体作用,只需在意这个函数在什么时候触发即可
首先我们创建一个S3 存储桶
并且我们在刚刚创建的函数添加触发器,并且选择这个存储桶,触发的事件类型也选择所有对象创建事件
在我们开始编写函数前,我们需要知道,在S3上传对象时,所获取到的内容是什么样子的
上传一个文件,触发一下日志
随后在cloud watch中就可以看到上传的日志
这里可以看到object中的key是上传的文件名,那假设函数获取的文件名并且当成命令执行,那么在上传文件时如果未对文件进行重命名就会造成问题,或者更加直接一些,我们直接获取文件的内容,将内容当做命令执行,或者写一个flask或者django的服务来接收参数然后执行命令
这里看上去会比较鸡肋,因为毕竟太刻意了,黑盒模式下也不太好遇上,这里的举例只做研究使用
我们将这里的Json数据取出来,然后丢到lambda测试,这样更加方便
这里我们主要关注这个event,对event的数据进行处理
这样可以单独把文件名取出来
开始对这个文件名进行处理,直接使用Split函数对文件名进行.号分割,取下标值即可取到文件名
为了方便测试 手动把测试数据的KEY改为whoami.jpeg
点击Test函数,查看返回结果
那么此时尝试反弹Shell,看看是否能弹回来
代码需要改成下面这样
为什么要用rsplit而不用split呢?因为只需要取最后一个.点开始分割,如果使用split,会把IP地址也进行分割
将这个代码更新到lambda函数中,随后运行Test
NC监听发现,这里会显示有连接过来,但是会超时,导致连不上,我一开始以为是国内服务器的问题,换了一台香港服务器也还是如此
既然反弹Shell失败的话,我们先暂且不去研究到底是为什么导致无法连接,那么能不能读env信息呢?答案是可以的
用DNSLOG外带平台,或者NC监听都行
b03K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7s2m8Q4x3X3g2A6L8Y4c8W2M7X3q4U0N6s2y4Z5i4K6u0W2j5$3!0E0i4K6u0r3i4K6t1K6i4K6u0r3
这里使用服务器来NC监听,然后使用curl来进行请求
从图片中可以看到,将env信息带了出来,那么此时有AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,可以进行利用吗?
首先我们看一这个Key能做一些什么?
这里肯定会遇到一个问题,将ID和KEY配置到aws cli中会出现下面的情况
An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials
这里提示我们,AWS无法验证所提供的的凭证,那么是写错了吗?其实还需要提供上面的token,如何添加?
加上aws_session_token = xxxx
在执行列EC2的命令,就会提示没有权限
但是这里有这么多的API,怎么知道这个KEY有什么权限呢?这就需要切换到白盒的方式,因为创建lambda函数的时候,所有的配置都是用的默认的,这个时候,只需要确定默认配置创建的IAM给的权限是多少即可
来到IAM,查看这个系统创建的角色有哪些权限
点击策略名称
进去之后可以发现,只有三个权限
1、CreateLogGroup-创建日志组
bd1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8$3y4K6i4K6u0W2j5i4N6K6i4K6u0W2j5h3#2S2P5X3!0F1i4K6u0W2j5$3!0E0i4K6u0r3b7h3#2S2P5X3!0F1b7$3I4G2N6h3c8i4j5i4c8U0K9p5I4G2k6%4y4Q4x3V1k6D9j5i4c8W2M7%4c8Q4x3V1k6m8f1p5W2d9k6h3k6W2M7X3g2F1j5$3g2Q4x3V1k6m8f1p5W2Q4y4h3k6o6M7X3g2S2N6r3g2x3L8$3N6s2M7X3!0#2M7q4)9J5k6h3S2@1L8h3H3`.
2、CreateLogStream-创建日志流
f10K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8$3y4K6i4K6u0W2j5i4N6K6i4K6u0W2j5h3#2S2P5X3!0F1i4K6u0W2j5$3!0E0i4K6u0r3b7h3#2S2P5X3!0F1b7$3I4G2N6h3c8i4j5i4c8U0K9p5I4G2k6%4y4Q4x3V1k6D9j5i4c8W2M7%4c8Q4x3V1k6m8f1p5W2d9k6h3k6W2M7X3g2F1j5$3g2Q4x3V1k6m8f1p5W2Q4y4h3k6o6M7X3g2S2N6r3g2x3L8$3N6e0N6s2u0W2j5h3#2Q4x3X3g2Z5N6r3#2D9
3、PutLogEvents-将日志事件上传到指定的日志流
35dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8$3y4K6i4K6u0W2j5i4N6K6i4K6u0W2j5h3#2S2P5X3!0F1i4K6u0W2j5$3!0E0i4K6u0r3b7h3#2S2P5X3!0F1b7$3I4G2N6h3c8i4j5i4c8U0K9p5I4G2k6%4y4Q4x3V1k6D9j5i4c8W2M7%4c8Q4x3V1k6m8f1p5W2d9k6h3k6W2M7X3g2F1j5$3g2Q4x3V1k6m8f1p5W2Q4y4h3k6b7N6i4c8x3L8$3N6q4N6X3g2F1N6s2y4Q4x3X3g2Z5N6r3#2D9
import
json
def
lambda_handler(event, context):
for
i
in
event[
'Records'
]:
getObjectName
=
i[
's3'
][
'object'
][
'key'
]
print
(getObjectName)
import
json
def
lambda_handler(event, context):
for
i
in
event[
'Records'
]:
getObjectName
=
i[
's3'
][
'object'
][
'key'
]
print
(getObjectName)
import
json
import
os
def
lambda_handler(event, context):
for
i
in
event[
'Records'
]:
getObjectName
=
i[
's3'
][
'object'
][
'key'
]
getSplitObjectName
=
getObjectName.split(
'.'
)
os.system(getSplitObjectName[
0
])
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!