AWS Lambda function URLs: Persistence เทคนิคบน AWS ที่น้อยคนจะรู้จัก

Introduction
โดยปกติแล้วภายหลังจากที่ผู้โจมตีสามารถเข้าควบคุม AWS account ของเหยื่อได้แล้ว มักจะพบการใช้เทคนิคในการพยายามแฝงตัวอยู่ในระบบ (persistence) บน AWS เช่น การสร้าง IAM User และ Create access key หรือการสร้าง/แก้ไข Role trust policy ให้สามารถ Assume Role จาก account ของผู้โจมตีได้ แต่วิธีการเหล่านี้ถือว่าค่อนข้างง่ายต่อการถูกตรวจจับ

ในวันที่ 06 เมษายน 2022 AWS ประกาศ Lambda ฟีเจอร์ใหม่ที่ชื่อว่า Lambda function URLs [1] ซึ่งทำให้ Lambda function สามารถมี API Endpoint ได้โดยไม่ต้องใช้ API Gateway

function URLs ถือเป็น attack vector ใหม่ที่ทำให้ผู้โจมตีสามารถนำมาใช้ได้หลากหลายวิธี แต่ในบทความนี้จะเน้นไปที่การใช้ function URLs เพื่อทำ persistence บน AWS Cloud

Lambda function URL Persistence Technique

  1. สร้าง lambda role ที่มีสิทธิ Admin
  2. สร้าง lambda function และ Enable functions URL ให้ Auth type เป็น None

3. Dump Lambda OS environment

โดย Lambda role credentials จะถูกฝังอยู่ใน Lambda runtime environment ทำให้เมื่อ dump OS environment ออกมาก็จะได้ credentials ติดมาด้วย โดยใช้ code ดังตัวอย่างด้านล่าง

4. ดึงข้อมูล Credentials จาก lambda URL endpoint

5. ทดสอบใช้ credentials โดย AWS CLI

จะเห็นได้ว่าถ้าผู้โจมตีต้องการ IAM credentials ก็เพียงแค่ไป request function URL ก็จะได้ credentials มาใช้โดยไม่ต้องสร้าง User ใหม่ หรือสร้าง Access key แต่อย่างใด

Detect with Cloudtrail logs
ในการตรวจจับการโจมตี สามารถใช้ Cloudtrail Event ที่เกิดขึ้นจากการ simulate ที่เกิดขึ้นตามลำดับดังนี้

  1. CreateRole ที่มี Trust relationships ให้กับ service lambda
  2. CreateFunction20150331 โดยให้ lambda ใช้ Role ที่ถูกสร้างจากข้อที่ 1.
  3. CreateFunctionUrlConfig ที่เป็น public endpoint

หากพบทั้งสาม event นี้เกิดขึ้นตามลำดับ หมายความว่าอาจมีการพยามทำ persistance เกิดขึ้นใน AWS environment

1. EventName: CreateRole

ตรวจสอบได้จาก requestParameters ว่า Role ที่ถูกสร้างขึ้นมาเป็น role ของ service lambda

2. EventName: CreateFunction20150331

ตรวจสอบได้จาก function ที่สร้างขึ้นมาใหม่ใช้ role จากข้อที่หนึ่ง หรือไม่

3. EventName: CreateFunctionUrlConfig

หากมีการสร้าง function url ให้กับ function ในข้อที่สอง โดยใช้ authType เป็น NONE ให้แจ้งเตือนทีมที่เกี่ยวข้องเพื่อทำการตรวจสอบทันที

Incident Response Playbook
Playbook เบื้องต้นสำหรับการรับมือเมื่อมี Incidents เกิดขึ้น

Containment
เป็นขั้นตอนในการแยก resource ที่ถูก compromised ออกไปไม่ให้สามารถเข้ามาใช้งานได้

  1. ลบ Function URL ออก เพือป้องกันไม่ให้ผู้โจมตีสามารถเรียกใช้ URL ได้อีก
  2. ลบ Function Triggers ออก ถ้ามี เนื่องจากผู้โจมตีอาจใช้เป็นช่องทางในการ trigger function
  3. ลบ Function Destinations ออก ถ้ามี เนื่องจากผู้โจมตีอาจใช้เป็นช่องทางในการรับ response ของ function
  4. Revoke Lambda IAM role session [2] เพื่อเลือก session role ที่ผู้โจมตีอาจกำลังเข้าใช้งานอยู่
  5. Revoke IAM Role หรือ Deactivate access key IAM User ที่สร้าง Lambda function เพื่อป้องกันไม่ให้ผู้โจมตีสามารถเข้าใช้งาน IAM User/Role ได้อีก

Eradication
เป็นขั้นตอนในการกำจัด resource ที่ผู้โจมตีอาจสร้างไว้ใน AWS environment

  1. Review source code lambda และ Lambda role ว่าสามารถทำอะไรได้บ้าง
  2. ค้นหา Cloudtrail logs ของ Lambda role ว่าเคยมีการแก้ใข หรือสร้าง resources อะไรบ้าง
  3. ค้นหา Cloudtrail logs ของ IAM User/Role ที่สร้าง Lambda Function ว่าเคยมีการแก้ใข หรือสร้าง resources อะไรบ้าง
  4. ลบ resources ที่ถูกสร้างขึ้นมาโดยผู้โจมตี
  5. ตรวจสอบ และแก้ไข resources ที่โดนแก้ไขจากผู้โจมตี

Mitre ATT&CK
Tactic: Persistence

  • T1098.003: Account Manipulation: Additional Cloud Roles
  • T1505.003: Server Software Component: Web Shell

ที่มา : [1]aws.amazon
[2] docs.aws.amazon