Write up CTF CI/CD Goat (Part 1)
date
Jul 17, 2024
slug
write-up-ctf-cicd-goat-part-1
status
Published
tags
ctf
devsecops
summary
Môi trường CI/CD cố ý tạo lỗ hổng. Tấn công các CI/CD pipeline để lấy flag.
type
Post
Mô hình lab:

White Rabbit

Đề bài cho ta biết có 1 secret có tên flag1 được lưu trữ trong Jenkins credential store.
Kiểm tra trong config của project wonderland-white-rabbit trên Jenkin.


Tuy nhiên, user alice không có quyền để xem

Tiếp tục kiểm tra repo Wonderland/white-rabbit theo đề bài xem có dùng được gì không, ta thấy repo có file Jenkinsfile dùng để cấu hình pipeline

Thử thay đổi code, xem repo đó có trigger sang jenkins không, do repo cấu hình không cho phép push code trực tiếp lên branh main, nên ta tạo branh khác để push code lên

Khi tạo xong PR, ta thấy user thealice không có quyền merge code vào branch main.

Tuy nhiên chỉ mới tạo PR mà chưa merge vào branch main, pipeline vẫn được trigger:

Lợi dụng điều này, ta sẽ in ra secret có tên flag1:

Sau khi push code, ta thấy biến đó đã được in ra, tuy nhiên nó đã bị ẩn bởi ký tự *

Thử tìm xem có cách nào để hiển thị rõ biến đó không, ta tìm được hướng dẫn sau, bằng cách in secret dưới dạng base64:

Sửa lại pipeline và push lại:

Ta nhận được secret dưới dạng base64:

Decode base64, ta nhận được giá trị của secret flag1:

Submit flag thành công:

Điểm yếu bảo mật
- Cấu hình sai event trigger dẫn đến hậu quả build các branch không mong muốn.
Biện pháp khắc phục
- Cấu hình chính xác event cần trigger, ở đây khi muốn build, cần trigger sự kiện merge code thay vì sự kiện tạo PR.
- Có thể config pipeline (Jenkinsfile) trực tiếp trên project Jenkins mà không cần sử dụng file trong source code tránh việc user không có quyền chỉnh sửa.
Mad Hatter

Kiểm tra, ta thấy alice không có quyền truy cập vào cấu hình project trên Jenkins

Kiểm tra source code, ta không thấy file cấu hình pipeline (Jenkinsfile), như vậy có thể pipeline đã được cấu hình trực tiếp trên project của Jenkins.

Ta thử push code lên branch main xem có trigger sang Jenkins để build không

Ta thấy code được push trực tiếp lên branch main mà không bị chặn lại, tuy nhiên không được trigger sang Jenkins để build

Thử đổi qua branch khác và tạo PR và main, ta thấy sự kiện đã được trigger

Làm cách nào để ta có thể in secret ra mà không dùng file Jenkinsfile, thử xem kỹ log khi build

Ta thấy pipeline có config để chạy lệnh make, đọc log ta ta thấy nó đang chạy Makefile và đang lỗi tại dòng số 2 trong whoami target. Thử kiểm tra trong source code có chứa file Makefile như log báo không, ta thấy file Makefile, với câu lệnh đúng như trên log ⇒ file này được thực thi trong pipeline

Biến FLAG khi hiển thị trên console dưới dạng *** ⇒ đây có thể là tên secret flag cần tìm, vì biến secret sẽ tự động ở dạng *** khi được in ra trực tiếp
Tìm hiểu một chút về Makefile:
Makefile là một tệp được sử dụng trong quá trình phát triển phần mềm để tự động hóa các tác vụ như biên dịch mã nguồn và liên kết các tệp để tạo ra chương trình hoặc phần mềm hoàn chỉnh. Nó chứa một tập hợp các quy tắc mà make, một công cụ xây dựng, sử dụng để xác định các tác vụ cần thực hiện để đạt được một mục tiêu cụ thể. Mỗi quy tắc trong Makefile bao gồm các mục tiêu, các phụ thuộc và các lệnh cần thiết để tạo ra mục tiêu đó.
Tạo mục tiêu mới để lấy flag, thực hiện encode base64 tương tự lab 1:

Push code lên và tạo MR vào main, truy cập vào màn console xem lệnh được thực thi không
Ta lấy thành công base64 của secret FLAG

Decode base64:

Submit flag thành công

Điểm yếu bảo mật
- Cấu hình sai event trigger dẫn đến hậu quả build các branch không mong muốn.
- Không cấu hình bảo vệ branch chính dẫn tới mọi thay đổi code đều có thể được MR vào main mà không qua kiểm tra.
- Không có sự kiểm soát các file tham gia trực tiếp trong pipeline.
Biện pháp khắc phục
- Branch chính cần được bảo vệ, không ai có quyền push trực tiếp code vào branch chính ngoại trừ project owner hoặc user có thẩm quyền.
- Cấu hình chính xác event cần trigger.
- Giám sát và kiểm tra mã nguồn thường xuyên, đảm bảo rằng các thay đổi trong mã nguồn được xem xét và phê duyệt bởi các thành viên có kinh nghiệm trong nhóm.
Duchess

Đề bài yêu cầu tìm token PyPi có trong repo, sau khi clone về, thử search với một vài keyword như secret, token, Pypi nhưng có vẻ nó không tồn tại hoặc không đúng.

Sau khi pull code về, add project vào sourcetree, ta thấy repo này lưu rất nhiều history chứa các commit, liệu rằng trong các commit cũ có chứa PyPi token ?
Sau khi kiểm tra history, ta thấy có commit với message “remove pypi token”, trong commit đó có chứa token pypi:

Submit flag:

Điểm yếu bảo mật
- Không kiểm tra chặt chẽ các commit, để cho những commit chứa nội dung nhảy cảm được lưu lại trong git dẫn tới việc lộ lọt thông tin.
Biện pháp khắc phục
- Kiểm soát chặt chẽ các commit, không để những commit chứa nội dung nhạy cảm được push lên repo.
- Giám sát và kiểm tra mã nguồn thường xuyên, đảm bảo rằng các thay đổi trong mã nguồn được xem xét và phê duyệt bởi các thành viên có kinh nghiệm trong nhóm.
- Cần thay đổi lại những thông tin nhảy cảm khi phát hiện chúng đã bị lộ lọt.
- Cấu hình github hook (pre-commit) ngăn chặn những commit chứa thông tin nhạy cảm (có thể dùng regex)
- Các thông tin nhạy cảm nên được khai báo trong file env và được add vào file .gitignore để git bỏ qua chúng.