Mình biết đến TAMU Ctf do hóng được trên ctftime.org. Mặc dù diễn ra trong thời gian khá bận với contest thuật toán trên lớp nhưng mình vẫn cố để làm. Phần vì tập luyện để kiếm cái giải vào tháng sau, phần vì cái hứng try hard lúc contest. Lạ là lúc bận mình thì cứ mua việc vào người, còn lúc rảnh (như lúc ngồi lọc cọc gõ những dòng này) thì lại lười không để đâu cho hết :v. Mà thôi không dài dòng nữa, bắt đầu phần chính luôn. Với lần ctf này, mình chủ yếu làm các phần là web, mics và crypto.
I. MICS.
1. Howdy!

Đây là 1 bài để giới thiệu form flag cơ bản trong lần ctf nên chỉ cần mở lên và submit flag: gigem{H0wdy!} là xong.
2. Who am I?

Đề bài có nói flag ở challenge này sẽ không giống với form gigem{...}. Challenge này đề cập đến A record của trang tamuctf.com. Trước hết, chúng ta phải hiểu A record là gì? A record là 1 record căn bản và quan trọng, ánh xạ 1-1 từ domain thành địa chỉ IP. Để xem A record của 1 trang cũng khá đơn giản, chỉ cần thực hiện lệnh ping trong cmd của Windows là ok.

Kia rồi, nhập địa chỉ 52.33.57.247 và clear challenge này.
3.  Who do I trust?

Cũng là 1 bài với form flag khác so với dạng gigem{...}. Lần này chúng ta phải xem ai hay công ty nào đã cấp certificate cho trang tamuctf.com. Certificate ở đây là SSL certificate, là một tiêu chuẩn an ninh công nghệ toàn cầu tạo ra một liên kết được mã hóa giữa máy chủ web và trình duyệt. Liên kết này đảm bảo tất cả các dữ liệu trao đổi giữa máy chủ web và trình duyệt luôn được bảo mật và an toàn. Để xem certificate cũng khá dễ dàng, nhấn vào biểu tượng hình ổ khóa trên thanh url của trình duyệt, tìm đến mục chứng chỉ là ta sẽ có câu trả lời.


Gõ Let's Encrypt Authority X3 và submit.
4.Where I am?

Challenge này hỏi địa điểm đặt sever của tamuctf.com. Như chúng ta biết địa chỉ IP của mỗi trang web giống với địa chỉ nhà của trang web đó, tức là chỉ cần có địa chỉ IP chúng ra sẽ biết được sever của trang web đó nằm ở đâu. Ở challenge Who I am?, chúng ta đã có IP của tamuctf.com là 52.33.57.247. Từ đó chỉ cần sử dụng 1 trang ip search trên mạng là có thể tìm ra địa chỉ đặt sever. Mình sử dụng trang https://check-host.net/ip-info vì có hỗ trợ thư viện MaxMind GeoLite2 được update liên tục.

Nhập tên thành phố Boardman và submit để clear challenge này. Bài này về cơ bản khá là dễ thế nhưng cần chú ý thư viện tìm kiếm ip, lúc đầu mình dùng những trang chưa được update thư viện tìm kiếm nên toàn tìm ra Oregon :v. Thư viện MaxMind Geolite2 là thư viện được update thường xuyên nhất.
5. I heard you like the files.

Đề bài có kèm theo 1 file tên là art.png. Dựa vào đề bài mình đã tải xuống và đổi đuôi file từ png thành pdf xem sao.

File pdf được viết bằng 1 thứ tiếng nào đó mà mình cũng méo biết :v. Nhưng có 2 dòng cuối viết bằng tiếng anh và đọc xong 2 dòng này mình mới biết hint từ đề bài là cú lừa đầu tiên :v. Cú lừa này làm mình loay hoay 1 hồi, mãi mới nhớ ra có 1 tool kiểm tra xem có file nào được giấu trong 1 file khác không. Tool đó là binwalk, thử kiểm tra và thật may mắn là có kết quả.

Và đây là file bị giấu:

Lục lọi file này thì mình nhận ra đây có vẻ là source code của 1 trang web, mất thêm 1 tiếng nữa ngồi tìm cách clone lại cái web này nhưng méo có kết quả lắm. Và đây chính là cú lừa thứ 2 của bài này :v. Flag nằm ở chỗ rất đơn giản, trong folder word có 1 folder tên là media, trong folder đó lại có 1 cái ảnh khá là đáng nghi.

Trước hết mình thử check bit hex của ảnh bằng bless.

Ở gần cuối file ảnh có 1 đoạn mã base 64, copy paste vào kt.gy và bingo, mình đã có flag sau khi ăn 2 cú lừa :v.

1. Not Another SQLi Challenge.

Đề bài có kèm theo 1 địa chỉ url, và đây là trang web đó:

Dựa vào hint từ tên của challenge, mình sẽ thử inject câu lệnh cơ bản nhất của lỗi SQLi: a' or 1=1 # vào ô NetID. 

Flag kia rồi, nhập vào và chúng ta clear challenge này.
2. Robot rules.

Truy cập địa chỉ url trong đề bài:

Lại tiếp tục là 1 challenge mà tên challenge đã là 1 hint. Hint ở đây là cần phải truy cập file robots.txt của trang web này. Robots.txt là một tệp tin văn bản nằm trong thư mục gốc của trang web và cung cấp hướng dẫn cho các công cụ tìm kiếm thu thập thông tin về các trang mà họ có thể thu thập thông tin để lập chỉ mục. Truy cập web5.tamuctf.com/robots.txt để xem file robots.txt:

Đọc qua file thì mình đoán là sẽ phải đổi User-agent thành User-agent của google để xem được nội dung bị ẩn. Mình sẽ thực hiện điều này bằng tool Burpsuite. Mình sẽ bắt request, sau đó sửa trường User-agent trong request đó và gửi lại đến trang web. Đầu tiên, đây là request mình bắt được:

Sau đó chỉ cần sửa trường User-agent rồi foward lại cho web xử lý là chúng ta có được flag:

3. Many Gig'ems to you!.

Truy cập địa chỉ url mà đề bài cung cấp:

Truy cập đến 2 đường dẫn đính kèm trong web:
Gigs!
Cookies!
Trước hết mình sẽ lục lọi trang Cookies! xem có gì lạ không. Dựa vào cái tên "Cookies!", khi check cookie của trang mình thấy 1 đoạn khá giống với form của flag

Có vẻ đây là đoạn cuối của flag, mình tiếp tục lục source code để tìm các đoạn còn lại. Nếu nhìn qua source code của web không có gì đáng nghi, nhưng để ý kỹ trường src ở mỗi ảnh trong web đều có vẻ là hint gì đó. Thử ctrl+F và mình tìm thấy đoạn giữa của flag:


Vậy là đã có đoạn giữa và đoạn cuối của flag, quay lại trang Gigs! để tìm nốt đoạn đầu thôi. Tiếp tục ctrl+F ở source code của Gigs!:

Và chúng ta có flag: gigem{flag_in_source_and_cookies}. Challenge này cũng không đến mức khó, chỉ là người ra đề để khá nhiều bẫy để đánh lạc hướng. Mình chỉ mất 15 phút để tìm ra đoạn giữa và đoạn cuối nhưng lại mất hơn 1 ngày để tìm đoạn đầu vì cứ nghĩ trang Gigs! chỉ là bẫy :v
4. Buckets

Trước hết truy cập trang web mà đề bài cho:

Có vẻ phải tìm cái gì đó liên quan đến chó ở đây, mình check thử soure code thì thấy vài thông tin khá hay

Trước hết web này sử dụng AWS hay Amazon Web Service, 1 dịch vụ điện toán đám mây của Amazon. Tiếp theo, chúng ta phải tìm 1 Amazon S3 hay Amazon Simple Storage Service trên web này. Amazon S3 là đối tượng lưu trữ được xây dựng để lưu trữ và truy xuất bất kỳ số lượng dữ liệu từ bất cứ đâu -các trang web, ứng dụng di động, dữ liệu từ các thiết bị hoặc cảm biến loT. Và cuối cùng Amazon S3 chúng ta cần tìm có liên quan đến Dogs. Đến đây thì đơn giản hơn rồi, để xem các S3 của web sử dụng AWS, mình chỉ cần sửa url của web thành dạng: "....".s3.amazonaws.com. Áp dụng với challenge này:

Tìm đến key Dogs, dễ thấy có 1 file flag.txt, truy cập vào S3 này và lấy flag thôi:

5. Science!


Ở đây, đề bài đã cho chúng ta 1 hint khá quan trọng. Đây là 1 web application sử dụng flask, 1 micro web framework khá nổi tiếng viết bởi python. Với các web app sử dụng flask thì lỗ hổng được biết đến nhiều nhất là Sever Side Template injection hay SSTi. Trước hết mình sẽ kiểm tra xem web app này có dính SSTi không, thử nhập {{ 7*'7' }} vào 1 trong 2 ô Chemical:

Đến đây mình có thể xác định template engine của web app này là Jinja2. Mình thử lấy thông tin của web bằng các lệnh {{ config }}, {{ self }} nhưng không có kết quả gì:
Lệnh {{ config }}
Lệnh {{ self }}
Loay hoay google các thứ 1 hồi, mình tìm được 1 function của Flask là {{ url_for() }}, function có cái hay và áp dụng được cho challenge này có thể liệt kê toàn bộ các global variables. Sử dụng lệnh {{ url_for.__globals__ }}

Đến đây mình thấy có thể sử dụng tiếp function .os.system() để gọi các lệnh như trong terminal của linux, mình thử tiếp {{ url_for.__globals__.os.system("ls") }} để xem các file trong web app này:

Đến đây thì lại trả về giá trị 0 :v. Mất thêm vài tiếng nữa google các kiểu con đà điểu thì mình mới biết giá trị trả về sau khi gọi lệnh ls được in ra trực tiếp chứ không thông qua python, vì vậy để thực thi lệnh ls mình sẽ sửa .os.system("ls") thành .os.popen("ls").read():

Đã thấy file flag.txt rồi, việc cần làm còn lại là cat file đó ra để xem nội dung thôi, đổi ls thành cat flag.txt là ok:

6. Login App.


Trước hết mình đã thử kiểm tra xem trang có bị lỗi SQLi hay SSTi không nhưng có vẻ là không. Sau đó khi check source code mình thấy 1 register form đã bị ẩn đi:

Mình đã thử hiển thị cái form này lên, rồi thay nút login bằng nút create nhưng chẳng thu lại cái gì hữu ích, có vẻ cái form này là cú lừa của người ra đề :v. Thế là mình delay bài này lại, cho đến tận lúc đọc write up mình mới biết web này phải sử dụng kỹ thuật NoSQLi để khai thác :v. NoSQLi không có nghĩa là NO injection :)). Đây là 1 kỹ thuật tấn công với những trang web không sử dụng database SQL. Về bản chất thì NoSQLi cũng giống với SQLi, sử dụng các câu lệnh truy vấn lên server, dựa vào request từ client server sẽ truy vấn đến Database và nhận lại kết quả từ database để trả cho client. Challenge này sẽ sử dụng 1 kiểu tấn công đặc thù nhất là login bypass, tuy nhiên khác với SQLi, NoSQLi sẽ sử dụng toán tử ! hay $ne để bypass

Trong câu lệnh truy vấn trên, mình đã truy vấn đến lên sever 1 tài khoản có username và password khác rỗng tức là luôn luôn đúng. Sau khi bypass thành công, thấy web hiện ra câu: "Welcome: bob!", có vẻ như đây là username duy nhất không phải admin của web này, thế thì mình sẽ chỉ cần sửa username khác với bob là ok:

Đến đây thì mình xin tạm dừng write up, 1 phần vì chưa kiếm được nơi upload code phần crypto cho trực quan, 1 phần vì lười :v. Phần crypto thì mình sẽ để khi khác :)). Như thường lệ, cảm ơn bạn đã đọc bài viết khô như ngói và cần thêm vài kg muối này. Mong các anh, các bạn có kinh nghiệm trong ctf góp ý thêm vì mình cũng mới chỉ là newbie trong thi ctf nói riêng và ngành bảo mật nói chung :))