Bước đầu, có vẻ đây là 1 chall nói về Malicious Chrome Extension, nên mình search google thì có ra wu về bài này
https://medium.com/@cezary.goluch/malicious-chrome-extension-letsdefend-challenge-93ecdf62e7ac
Oke, vì vậy nên mình check từng file trong path Extension của file đã được giải nén.
Với flow như sau: Chrome -> UserData -> Default -> Extensions.
Check từng file một thì mình đã tìm ra được Extension có vẻ khá khả nghi
Chúng ta sẽ phân tích từng đoạn code của file script này nhé:
Phần code đầu:
Có vẻ đây là đoạn check đăng nhập khi login vào web,
chúng ta có thể thấy email.input và password.input và các phần in ra như là Email or password is invalid.
Ngoài ra, còn có một biến khá là sus: const bruhh =
${check(atob(getStr(stR,StR,sTr)), apiKey)}`
Tiếp theo là đoạn mã này:
Đoạn mã này đang xử lý sự kiện tìm kiếm thời tiết của một thành phố bằng API OpenWeatherMap
searchButton
, khúc này nhập tên thành phố vào để check thời tiết
fetchWeather(city):
Gọi API OpenWeatherMap để lấy thông tin thời tiết của thành phố.
Nếu phản hồi không thành công (!response.ok), báo lỗi "Location not found".
Nếu thành công sẽ trả về thời tiết.
Kế tiếp:
Hàm sendMessage(ssus, suss) thực hiện việc gửi một yêu cầu POST đến một URL được giải mã từ chuỗi mã hóa bằng Base64 (url1 và url2), với dữ liệu dạng FormData chứa hai trường:
chat_id (mã hóa bằng h2s) và giá trị ssus.
text (mã hóa bằng h2s) và giá trị suss.
Tóm lại, hàm này gửi dữ liệu tới một URL (sau khi giải mã) dưới dạng FormData, có vẻ như nhằm mục đích truyền đi thông điệp hoặc thông tin đăng nhập.
Nhìn vào phát biết ngay base64 nên mình ném lên cyberchef để xem có gì không
VGhlIGZsYWcgaXMgbm90IGhlcmUgbG1hbywgdHJ5IGhhcmRlciwgbWF5YmUgdGhlIGxpbmsgYmVsb3c
-> The flag is not here lmao, try harder, maybe the link below
aHR0cHM6Ly93d3cueW91dHViZS5jb20vQElSeVMvdmlkZW9z
-> https://www.youtube.com/@IRyS/videos
Có vẻ tác giả đang pr cho Youtuber yêu thích của mình -> simp
Tiếp theo:
đầu tiên là hàm check(str1, str2):
Hàm này thực hiện phép XOR trên từng ký tự của str1 với str2.
Dùng vòng lặp để duyệt qua từng ký tự của str1, lấy mã ASCII và XOR với mã của ký tự tương ứng từ str2 (lặp lại str2 nếu str1 dài hơn).
Kết quả của mỗi phép XOR được chuyển thành ký tự và cộng vào biến result.
Trả về chuỗi result sau khi kết thúc vòng lặp.
Hàm validateEmail(email):
Kiểm tra định dạng email có hợp lệ không.
Email được chuyển thành chữ thường và kiểm tra bằng biểu thức chính quy (regex).
Trả về kết quả true nếu email hợp lệ, ngược lại là null.
Và cuối cùng là các biến stR, StR, sTr. Chúng ta đã gặp các biến này một lần ở trên, biến bruhh : const bruhh =${check(atob(getStr(stR,StR,sTr)), apiKey)}
Hàm h2s(input) chuyển đổi chuỗi hex thành chuỗi ký tự ASCII.
Tổng kết, nhìn sơ qua một lượt thì đoạn mã này thực hiện đăng nhập, tìm kiếm thời tiết, kiểm tra tính hợp lệ của email, mã hóa/giải mã thông tin, và gửi dữ liệu đến máy chủ.
Ở đây, ngoài các message ở function sendMessage
bị mã hóa base64 chúng ta đã giải mã được thì còn có các biến stR, StR, sTr, cũng có vẻ được mã hóa bằng base64.
Thêm nữa, biến bruhh: const bruhh = ${check(atob(getStr(stR,StR,sTr)), apiKey)}
này đang gọi đến check
mà hàm check ở đây là hàm XOR, vì vậy ta đã biết rằng 3 đoạn strings này đã được XOR với apiKey
Từ đây chúng ta có đoạn code giải mã:
Chúng ta đã nhận được đoạn đầu tiên của flag:
h4pp1_b1rtH_d4y_HISC!!!
Phần tiếp theo của thử thách là tìm username và password bị đánh cắp,
Từ những bằng chứng có được từ cuộc tìm kiếm part 1 của flag, chúng ta có thể biết đây là một Extension để xem thời tiết, vì vậy nên để tìm user và pass thì chúng ta cần tìm log liên quan đến lịch sử đăng nhập, các web liên quan đến thời tiết.
Mình các path theo flow như sau: Chrome -> User Data -> Default.
Tại path này, mình đã thấy một số file SQL nhắc về lịch sử và login data, login data for account,
Vì chúng ta đang tìm user và pass nên mình sẽ check file Login data for account
trước.
Mình dùng SQLiteStudio
để kiểm tra file này:
Mình đã kiểm tra các table trong file này nhưng không tìm thấy thông tin mình muốn
Vì vậy, mình sẽ check file Login data
:
Mình đã tìm thấy username và password ở table logins
của file này
Người dùng đã đăng nhập vào web thời tiết -> đúng với suy luận của chúng ta ở trên.
Vì vậy có thể kết luận đây là username và password đã bị đánh cắp mà chúng ta đang tìm.
Như vậy username là: Raviel_HISC
, password là: b31dc5a5257b0c294e76a4297701c90d
Có vẻ như mật khẩu đã được hệ thống lưu dữ liệu này bảo vệ mật khẩu khỏi bị lộ bằng cách băm hoặc mã hóa. Khi người dùng đăng nhập, hệ thống sẽ băm/mã hóa mật khẩu nhập vào và so sánh với giá trị này.
Chúng ta có thể sử dụng một số công cụ online như https://crackstation.net/
để crack mật khẩu này:
Vậy flag của challenge này là:
UTECTF{h4pp1_b1rtH_d4y_HISC!!!_Raviel_HISC_whatthehelldoyouthinkyouaredoing}
Tổng kết:
Đây là challenge nhằm cảnh báo cho chúng ta nên cảnh giác khi sử dụng các extension.
Trong challenge này, extension này đang gửi thông tin tới URL ẩn: https://www.youtube.com/@IRyS/videos
Hàm sendMessage gửi thông tin (bao gồm cả email và password) đến một URL được giải mã từ chuỗi Base64 (url1 và url2). Điều này có thể là một cách ẩn URL độc hại nhằm lấy cắp thông tin người dùng.
Sau khi tải về và giải nén file For2.rar
Mình nhận được một folder về cái app Music player
và file final
là một tập tin dạng capture về dữ liệu được bắt lại từ mạng (có thể là khi đang sử dụng ứng dụng âm nhạc này)
Mình sẽ kiểm tra mã nguồn của cái app music này trước:
Ở function call
này nó sẽ tải về và thực thi trực tiếp một tập tin PowerShell từ Internet
Có thể nhận thấy hàm này thực hiện hành vi cực kì nguy hiểm, bởi vì:
iex
cho phép thực thi mã mà không qua bất kỳ kiểm tra nào.Mình sẽ vào URL này và kiểm tra mã nguồn của đường dẫn nothing.ps1
này.
Có thể thấy đoạn mã này đang sử dụng kỹ thuật Obfuscation
nhằm che giấu và gây khó hiểu cho chúng ta.
Mình sẽ làm đoạn mã này trở nên dễ hiểu hơn bằng cách đặt lại các tên biến:
function đầu tiên
:
Hàm này là hàm được tạo ra để mã hóa dữ liệu sử dụng thuật toán AES (Advanced Encryption Standard) trong chế độ CBC (Cipher Block Chaining)
Function 2:
Hàm này mã hóa tất cả các file trong một thư mục bằng thuật toán AES (CBC mode) đã được viết từ hàm đầu tiên với:
Quy trình:
.enc
.Kết quả:
.enc
.Function cuối cùng
Hàm này gửi toàn bộ file trong một thư mục tới một máy chủ qua kết nối TCP.
Quy trình:
Kiểm tra thư mục: Dừng nếu thư mục không tồn tại.
Lấy danh sách file trong thư mục.
Với mỗi file:
Hiển thị trạng thái gửi thành công hoặc lỗi.
Kết quả:
Tổng kết: như vậy, đoạn code này đang mã hóa các file trong folder chỉ định và lưu lại dưới dạng .enc sau đó xóa file gốc và gửi đến ip được chỉ định.
Vậy tiếp theo, mình sẽ check file final
capture lại lưu lượng mạng khi sử dụng đoạn app music kia.
Vì các file được gửi qua tcp nên mình đã filter tcp
và tìm ra được 2 file đã bị mã hóa.
Tiếp đó, chúng ta cần tìm key
và iv
để thực hiện giải mã 2 file này:
Từ đoạn code trên, mình thiết kế code bằng C để sắp xếp lại đoạn key kia sao cho đúng:
Đây là đoạn base64 đã được lấy ra
Nzk2ZDJmNDM2NDA1OTYxNTYyZTI4NzY2NmU2ZmNlMzBmNjU2M2I0OTY0Zjc1NzI2OGNkODJmOWRlNzA2NmJjZTYzZTYxYTY1NmY2ODc5NjUyMWY2NzQ3ZmQyMzBmODUw
Mình sẽ dùng CyberChef để giải mã đoạn base64 này:
796d2f436405961562e287666e6fce30f6563b4964f757268cd82f9de7066bce63e61a656f68796521f6747fd230f850
Sau khi tìm ra plaintext của Key rồi, chúng ta sẽ chuyển nó thành hex vì hiện tại nó đang ở dạng text.
373936643266343336343035393631353632653238373636366536666365333066363536336234393634663735373236386364383266396465373036366263653633653631613635366636383739363532316636373437666432333066383530
Mình sẽ thiết kế đoạn code C để lấy key
và iv
Vì 2 kí tự là 1 bytes nên mình nhân đôi lên để lấy cho chuẩn.
Output:
Oke sau khi đã có key và iv thì mình ném lên CyberChef
để decrypt thôi
Đây là format gửi data, chúng ta cần lưu ý nó để decrypt đúng đoạn thông tin chúng ta cần decrypt:
Ở file flag1.txt.enc, chúng ta chỉ cần lấy các hex sau tên file:
Vậy từ đoạn ebb2b
trở đi chính là đoạn nội dung của file flag1.txt
N3v3r_tRuSt_th3_1nt3rn3T
Và flag2.jpg.enc là từ 236042
:
Vậy flag là : UTECTF{N3v3r_tRuSt_th3_1nt3rn3T_c0nGrAtz_br0!_192.168.189.132_1337}
-From Raviel with love <3 -