Tumgik
t-rekttt · 7 years
Text
Writeup WhiteHat Challenge 03
Đây là lần đầu tiên mình tham gia vào WhiteHat challenge, và chơi hẳn luôn một mình một team :v. Vì phải đi học sáng nên mình không thể tham gia khi cuộc thi bắt đầu vào lúc 9h sáng, nhưng những trải nghiệm mà cuộc thi đem lại cho mình phải nói là cực kì thú vị và phấn khích :D. Cũng không rõ nhờ năng lực nào mà mình có thể giải được 7/10 flags, thời điểm cao nhất có lúc nằm trong top 10 xếp hạng rồi :v, mà tiếc là thời gian khá ngắn ngủi, mình cũng không solve được thêm nữa nên đành chịu tụt xuống #20.
Đây là team mình, EHS là viết tắt tên trường mình :3.
Tumblr media
Web001
Sign in and get the flag in the following site.
URL: http://web001-chal03.wargame.whitehat.vn
Submit WhiteHat{sha1(flag)}
Mở url, ta được một form đăng nhập
Tumblr media
Xem source trang, lấy được username/password: test/test
Tumblr media
Đăng nhập thử, trang web báo không có quyền admin
Tumblr media
Xem thử cookie, thấy có giá trị "user=test", thử đổi lại thành "user=admin" xem có hổng session không
Tumblr media
Flag :3
Tumblr media
Flag: WhiteHat{sha1(don't_believe_cookies_at_all)}
Web002
Input right password in the following site and get you can the flag.
URL: http://web002-chal03.wargame.whitehat.vn
Submit WhiteHat{sha1(flag)}
Mở url, được form yêu cầu nhập password
Tumblr media
Mình xem source site, thấy có đoạn javascript rất dài, nghi là JSFuck. Kiểm tra bằng cách xóa đoạn "()" ở cuối đi, thêm toString() vào và chạy thử. Được 1 đoạn function
Tumblr media
Format lại script cho đúng chuẩn
Tumblr media
Chạy đoạn script tìm giá trị của biến wellplayed để lấy password
Tumblr media
Tìm thấy flag :))
Tumblr media
Đoạn JSFuck ở bước 2: here
Flag: WhiteHat{sha1(easy_javascript_right?)}
Crypto001
I happen to get this text, but it seems to be encrypted. Decrypt it and find the hidden flag.
HJXAJY GPHTPR HPL P CPBDG APGTCTV SCP CPXRXIXADE DWL LTGWIGTKD TWI CPBDG RXAQJETG SCP STWHXAQPIHT TWI TAJG UD TWI HGDGTEBT. GPHTPR STHJ TWI HBTAQDGE SCP HEXWHSGPW UD TWI SDXGTE DI TIPTGR HXW CLD TBTGEJH APRXIXADE SCP NGPIXAXB GTLDE. VPAU HX TWI GPTN IPWI GPHPTR HPL CGDQ. CPBDG GDGTEBT HJXAJY GPHTPR HX STSGPVTG HP TCD UD TWI IHDB AJUGTLDE SCP AJUHHTRRJH HGTSPTA CX TWI NGDIHXW UD TWI SAGDL. HXW TUXA SCP HXW ICTADXK WIPTS TKPW CTTQ NATSXL STIPGQTATR CX TGJIPGTIXA SCP BAXU.
Submit WhiteHat{sha1(flag)}
Nghi ngờ đoạn văn bản được mã hóa bằng Caesar/Subtitution, nên mình tiến hành phân tích bằng phần mềm CrypTool. Mở CrypTool, paste đoạn văn bản ban đầu, chọn Analysis -> Symmetric Encryption (basic) -> Ciphertext-Only -> Caesar. Phần mềm trả về kết quả tốt nhất (phần khoanh đỏ)
Tumblr media
Sau khi kiểm tra vài từ thì mình nhận ra rằng đoạn văn bản đã được đảo lại hết các từ và các tiếng trong câu. Viết 1 đoạn JS để đảo lại câu.
Tìm thấy gợi ý flag:
FLAG IS THE YEAR THAT CAESAR WAS BORN
Google theo gợi ý là ra flag ngay :3
Flag: WhiteHat(sha1(100))
Crypto002
We have components of an RSA cryptosystem. Decrypt the cipher to get the flag.
RSA info:
https://vi.wikipedia.org/wiki/RSA_(m%C3%A3_h%C3%B3a) Vietnamese
https://en.wikipedia.org/wiki/RSA_(cryptosystem) English"
Download RSA-info file here:
http://material.wargame.whitehat.vn/challenges/3/Crypto002_c576122a778397b48fa2d0368e2e02a14df1db41.zip
Submit WhiteHat{sha1(flag)}
Sau khi tải file info về, mở lên được một số giá trị: n, p, q, e, c. Đây là các giá trị tham gia vào quá trình mã hóa RSA.
Tumblr media
Để giải mã được cần tìm private key (d). Mình dùng công cụ rsatool để xử lý
Tumblr media
Sau khi có đủ giá trị, ta tiến hành giải mã. Input data như trong ảnh chính là giá trị e đã được chuyển thành dạng hex. Sau khi giải mã ta lại được một chuỗi hex khác
Tumblr media
Giải mã chuỗi hex, ta được flag
Tumblr media
Flag: WhiteHat{sha1(simple_rsa_decryption)}
For001
This piece of data is captured via USB port, look for the flag transferred through it.
You can use Wireshark to read the file pcapng.
Download file pcap here:
http://material.wargame.whitehat.vn/challenges/3/For001_61fb3e6d8aa22c75362af02e798331bbf5b73a4b.zip
Submit WhiteHat{sha1(flag)}
Mở file của btc cung cấp, được một file .pcapng chứa data
Tumblr media
Do quen tay nên mình click đúp mở luôn file .pcapng, và thật tình cờ thư mục Flag cũng được giấu bằng cách nén vào trong file đó :v :v
Tumblr media
Flag :3. Có lẽ ở bài này btc muốn làm khó bằng cách đánh lạc hướng người chơi vào việc đi tìm packet, nhưng may mắn thay vì mình không cài Wireshark nên mặc định Winrar được chọn để mở file, và mình vớ được flag =))
Tumblr media
Flag: WhiteHat{sha1(Life is short, Smile while you still have teeth !)}
For002
We have eavesdropped a piece of network data when a user signed in a website. Find the flag as his password.
You can use Wireshark to read the file pcapng.
Download file pcap here:
http://material.wargame.whitehat.vn/challenges/3/For002_ca60a166cf35f9f0567826b31a457df75017bfbb.zip
Submit WhiteHat{sha1(flag)}
Việc phân tích packet bằng Fiddler thì đã quá quen thuộc với mình, thành một ngón nghề rồi :3, nên mở file lên là mình search ngay các requests có chứa từ "password". Trong 3 requests chứa từ đó lại chỉ có đúng 1 request có response header là 302 (header này để redirect khi user đăng nhập thành công). Nên nhìn cái là mình ra luôn flag :))
Tumblr media
Flag: WhiteHat{sha1(@Bkav123#$challange3)}
Pwn002
You are lucky, you can try your luck to pass our guessing game. Google search for something interesting.
Play game by using netcat: nc 103.237.98.32 25032
Submit WhiteHat{sha1(flag)}
Thử kết nối đến server, nhận được yêu cầu đoán 2 số. Mình nhập bừa thử 1 số thì nhận được thông báo nhập số trong giới hạn từ 100-1000
Tumblr media
Mình viết 1 đoạn bash script để bruteforce số đầu tiên
Tumblr media
Sau khi tìm được số đầu tiên là 576, server lại tiếp tục yêu cầu nhập số thứ 2, gợi ý là dùng hàm srand với time(0) trong C
Tumblr media
Mình tiếp tục viết 1 chương trình C theo yêu cầu để tìm số tiếp theo
Craft 2 đoạn script lại thành 1 command: (echo "576"; sleep 1s; ./a.out) | nc 103.237.98.32 25032. Flag đây rồi :3
Flag: WhiteHat{sha1(Life_is_a_story_make_yours_the_best_seller.)}
1 note · View note
t-rekttt · 7 years
Text
Tôi đã qua mặt hệ thống chấm điểm của Violympic như thế nào? - Phần 2
Phần trước: https://goo.gl/1uiaVc
Sau khi đọc phần đầu tiên của bài viết, có lẽ các bạn sẽ thắc mắc rằng Violympic đã nâng cấp thuật toán mã hóa thế nào và liệu nó đã đủ an toàn chưa? Đó là lý do mình tiếp tục nghiên cứu chủ đề này.
Tumblr media
Violympic đã thay đổi như thế nào?
Thay đổi đầu tiên rất dễ nhận biết và đã được thông báo trước, đó là hệ thống thi cũ sẽ được cập nhật thành 10 bài thi hoàn toàn mới. Và khi vào trang thi để thử nghiệm thì mình nhận ra rằng các bài thi không còn sử dụng Flash nữa mà chuyển sang dùng HTML5 được nhúng trong iFrame, và khi inspect mã HTML thì cả khung bài thi sẽ liền thành 1 khối như thế này:
Tumblr media
- Mình loại bỏ được ý định check đáp án bằng cách xem HTML Element.
Còn một thay đổi khác đó là vì trang chuyển sang HTM5 nên Javascript được sử dụng để viết hàm mã hóa, và mình cũng không mất nhiều thời gian để kiếm và tách riêng đoạn mã hóa ra vì nó nằm ngay trên trang rồi.
Tumblr media
Khai thác kẽ hở: Mã hóa
Sau khi có hàm mã hóa thì mình viết lại thành Python để tiện làm script PoC, hàm này mô phỏng lại Javascript chứ chưa tối ưu :D
Tumblr media
Nói sơ qua về tác dụng của từng hàm mã hóa: Hàm pressl dùng để đảo ngược xâu a nhập vào, hàm presst để đảo ngược xâu a và nối với một chuỗi random có độ dài b, hàm press nối 6 xâu và sử dụng 2 hàm kia để đưa ra đoạn mã cuối cùng.
Vì nối thêm xâu random vào thì tất nhiên server sẽ không đọc xâu đó rồi, vì nó chẳng chưa tí thông tin nào cả, nên mình thay nó thành xâu “0.aaaaa...”
Test thử mã hóa với từ khóa “T-Rekt”, có thể nhận thấy rằng sau khi mã hóa thì các chữ cái trong từ vẫn xuất hiện rải rác trong xâu đã mã hóa, và thực tế muốn giải mã chỉ cần bỏ đoạn “0.aaa” đi và đảo lại xâu thôi.
Tumblr media
Sau khi nghiên cứu mã hóa và thử nghiệm thành công, mình viết thành script PoC hoạt động theo sơ đồ sau:
Tumblr media
PoC Video:
youtube
1 note · View note
t-rekttt · 7 years
Text
ChatFuel: Trang web miễn phí giúp bạn tạo ra những chatbot “siêu phẩm”
Tumblr media
Xin chào các bạn. Trong thời đại công nghệ thông tin hiện nay thì việc tạo ra những tương tác tốt trên mạng xã hội là một phần không thể thiếu. Nhất là đối với những shop bán hàng, việc tương tác tốt không những giúp shop thu hút được nhiều khách hàng tiềm năng hơn, mà nó còn giúp tạo ra ấn tượng tốt trong mắt những người đã và đang có ý định mua hàng của bạn, tạo ra lợi thế tất yếu trong việc cạnh tranh trên thị trường. Và gần đây Facebook đã ra mắt một nền tảng mới cực kì mạnh mẽ để hỗ trợ cho việc này, đó chính là Messenger Platform API.
TỔNG QUAN VỀ MESSENGER PLATFORM API
Messenger Platform API được mô tả là bộ công cụ hỗ trợ bạn tạo ra những chatbot sử dụng những lệnh được cài đặt sẵn, hoặc thậm chí là trí tuệ nhân tạo (AI) để trực tiếp tương tác với người dùng qua Messenger hoặc Web messages của Facebook.
Có lẽ đối tượng đầu tiên mà Facebook nhắm đến khi ra mắt bộ công cụ này là những fanpage bán hàng vì nó được trang bị đầy đủ những công nghệ giúp người ta mua hàng mà thậm chí không cần rời khỏi Messenger. 
Điều đó được mô tả qua bức ảnh dưới đây:
Tumblr media
TẠI SAO NÓ CHƯA THỰC SỰ PHỔ BIẾN?
Có thể thấy mặc dù việc ra mắt bộ công cụ là một bước tiến lớn với những tính năng vô cùng thích hợp với sự phát triển của thương mại điện tử ngày nay, nhưng nó lại chưa thực sự được nghiên cứu áp dụng một cách có hiệu quả. 
Lý do đầu tiên theo mình thấy là việc tiếp cận nền tảng này đòi hỏi ít nhiều những hiểu biết về kiến thức lập trình, một điều kiện khó đối với những người dùng phổ thông. Và chỉ riêng phần hướng dẫn cơ bản của Facebook thì để nhận tin nhắn thôi cũng đã tốn mất gần này giấy mực rồi:
Tumblr media
Tiếp đến lại là quá trình xét duyệt app của Facebook để đưa bot vào hoạt động cũng khá tốn thời gian và dễ khiến cho người ta nản lòng.
Tumblr media
Nhưng mà, cái khó ló cái khôn, trong muôn vàn những khó khăn trong việc tìm hiểu bộ công cụ này của Facebook, mình (người viết) lại tìm ra cả một bầu trời rực rỡ, đó chính là ChatFuel, cái công cụ được viết lù lù ở tên bài kia kìa :D.
VÀ CHATFUEL XUẤT HIỆN
Sau nhiều cố gắng phát triển cũng như gửi xét duyệt Messenger app mà không thành công thì bỗng một ngày lang thang trên mạng mình tìm được trang web hay ho này.
Link trang web đó đây: https://chatfuel.com/
Tumblr media
Sau đây là những ưu điểm tuyệt với của ChatFuel:
- Hoàn toàn miễn phí.
- Giao diện lập trình trực quan qua các block, mỗi block tượng trưng cho một chức năng, không sử dụng code.
- Kết nối trực tiếp với fanpage, không cần tạo app lằng nhằng.
- Không cần gửi xét duyệt với Facebook.
- Không giới hạn số bot được tạo ra.
- Có sẵn nhiều plugins kết nối với những dịch vụ khác: Instagram, Twitter, Youtube...
- Đặc biệt nhất nữa là tính năng JSON API cho bạn khả năg tích hợp mọi loại API vào trong 1 con chatbot, mình sẽ đề cập riêng phần này ở dưới.
Có lẽ kể ra gần đó đặc điểm thôi cũng khá mệt rồi nhỉ, có thể nói ChatFuel tích hợp với Messenger giống như là hổ mọc thêm cánh vậy :D.
Đây là cách bạn sẽ tạo và tương tác với bot trên ChatFuel:
youtube
Phân tích trực quan các chức năng trên workspace của ChatFuel:
Tumblr media
Test nhanh một chức năng đơn giản:
Tumblr media
Giao diện trực quan rất dễ để làm quen và tiếp cận phải không? Và như đã đề cập ở trên thì JSON API cũng là một chức năng làm nên thương hiệu của ChatFuel. 
JSON API - ĐIỂM SÁNG
Tumblr media
Nếu bạn “nằm vùng” trên group J2TeaM Community thì chắc hẳn cũng biết chatbot J2TeaM chính là một chatbot điển hình được tích hợp API Simsimi qua JSON API. Bạn có thể thử trò chuyện với bot tại đây.
Để sử dụng JSON API thì bạn cần có hiểu biết về cây JSON cũng như đọc tài liệu của ChatFuel để biết cách tạo những tin nhắn được tạo nên từ JSON API tại đây.
Hiện tại bọn mình đang tích hợp các dịch vụ với JSON API bằng cách viết thêm 1 app nhỏ ở giữa làm trung gian giữa ChatFuel và dịch vụ cần tích hợp, mỗi khi block bên ChatFuel được kích hoạt thì app trung gian sẽ tiến hành xử lý những dữ liệu cần thiết và trả về ChatFuel. 
Điểm ưu việt của cách này là nó giúp cho chúng mình có thể tích hợp mọi API bên thứ ba miễn là có thể viết được app ra cho nó.
Đây là demo một chatbot tra bảng xếp hạng và bài hát trên Zing MP3 mà mình tích hợp qua JSON API:
Tumblr media
Phần này nghe có vẻ hơi “nâng cao” chăng, vì nó liên quan đến lập trình? Nhưng cũng đừng lo nếu bạn chưa có tí kinh nghiệm nào, vì bạn có thể sử dụng lại những API được viết sẵn và share trên group một cách dễ dàng. 
Rất may mắn với những bạn chưa có cơ hội gia nhập group là đã có sẵn một bài tổng hợp API viết sẵn tại đây.
Một video demo tích hợp Simsimi với JSON API của anh Juno Okyo, cách làm với các API khác cũng tương tự như vậy.
youtube
Qua bài viết này mong rằng bạn đã hiểu biết thêm ít nhiều và có thể tự xây dựng cho bản thân một chatbot qua ChatFuel. (Nếu có thì hãy chia sẻ cho mình biết với nha :D)
2 notes · View notes
t-rekttt · 7 years
Text
Phân tích biến thể mã độc phishing chiếm quyền tài khoản  Facebook - 12/2016
Cũng giống như phishing thông thường, kẻ xấu tìm cách lừa nạn nhân click vào đường link của những trang tin giả với những cái title rất “kêu”, nhưng thủ đoạn được sử dụng lần này lại nguy hiểm hơn nhiều...
Câu chuyện bắt đầu vào một buổi chiều, khi đang lượn lờ trên page team thì mình bắt gặp bài này:
Tumblr media
Khi mình comment hỏi xin link thì được anh Juno cung cấp ngay một số thông tin như sau:
Tumblr media
Đi theo đường link của anh Juno, cảm nhận đầu tiên của mình khi vào trang web là nó chẳng có gì đặc biệt ngoài bài viết và 1 đống quảng cáo trông khá là vô hại.
Tumblr media
Nhưng mình cũng chưa đi vào phân tích file js kia vội. Nếu biết về phishing thì chắc hẳn bạn cũng thấy rằng để lừa người dùng điền thông tin của mình vào thì cần có một cái form chứ? Vậy sao nó chưa xuất hiện? 
Lập tức mình mở cái link ấy lên điện thoại.
Và cái form huyền thoại hiện lên...
Tumblr media
Lý do mình phản xạ rất nhanh ở đoạn này là do trước đó mình cũng đã nhìn thấy form này khi click vào link tương tự trên điện thoại, nhưng khi đó không để ý cho lắm (tất nhiên là mình chẳng dại gì đi đăng nhập vào rồi :v )
Từ đây mình phỏng đoán được lần tấn công này nhắm vào trình duyệt trên điện thoại, giả thiết sau đó được khẳng định khi anh Juno thử chế độ responsive mode để giả lập độ phân giải điện thoại và cái form xuất hiện.
Sau khi kiếm được phishing form, mình tạo test account để đăng nhập thử và capture HTTP Requests bằng Fiddler.
Tumblr media
Từ những requests thu được, mình rút ra 5 endpoints thiết yếu sau:
http://api.cit.vn/get.php
https://z-m-graph.facebook.com/v1.0/
https://z-m-api.facebook.com/v1.0/
https://z-m-graph.facebook.com/v2.8/me/feed
http://m.dantrivideo.com/savelogin.php
Tất cả requests log mình để tại đây.
Dựa vào đó mình rút ra được cách thức tấn công:
1. Sau khi form được điền, javascript trên trang web query đến endpoint (1) với dữ liệu gồm:
+ username: Tên đăng nhập hoặc email, sđt mà nạn nhân nhập vào.
+ password: Mật khẩu của nạn nhân.
-> Lấy api_key, sig, và sigv2 từ dữ liệu trả về.
2. Dùng api_key, sig và sigv2 từ bước 1 để đăng nhập tài khoản nạn nhân vào app qua endpoint (3)
- Nếu mật khẩu đúng -> access_token được trả về -> Lấy access_token và session_cookies.
- Nếu mật khẩu sai: Báo sai mật khẩu và yêu cầu nhập lại -> Lặp lại bước 1
3. Dùng access_token -> Lấy friends list của nạn nhân từ endpoint (2)
4. Gửi yêu cầu đăng bài đến endpoint (4), các thành phần quan trọng nhất trong dữ liệu request gồm:
+ link: Đường link chia sẻ trên status (Ở đây là link chứa mã độc)
+ message: Nội dung status.
+ privacy: Quyền riêng tư. (Ở đây được đặt là  {'value':'EVERYONE'} -> Công khai)
+ tags: Những người được tag trong friendlist.
+ timeline_visibility: Ẩn/hiện trên timeline. (Ở đây giá trị là hidden -> bài viết sẽ được ẩn trên timeline của nạn nhân).
-> Lấy id bài đăng
5. Gửi yêu cầu đến endpoint (2) kèm id bài đăng và access_token để tắt thông báo bài viết và ẩn thông báo bài viết, gây khó khăn trong việc phát hiện và xóa bài đăng của nạn nhân.
6. Gửi thông tin của nạn nhân đến endpoint (5) để lưu lại.
Mức độ nguy hiểm:
- Nói về cách tấn công thì đây là phương thức phishing cơ bản đánh vào tâm lý tò mò và chủ quan nhằm đánh cắp thông tin người dùng.
- Tuy nhiên lần tấn công này nguy hiểm hơn nhiều ở chỗ nó có khả năng trực tiếp xác nhận và can thiệp vào phiên đăng nhập người dùng. Thay vì phải gián tiếp xác nhận thông tin được gửi lên thì giờ đây kẻ tấn công có được những thông tin đảm bảo chính xác do người dùng đã đăng nhập qua Facebook API, hơn nữa là tự đăng bài và ẩn nó đi qua API luôn. Nói cách khác, người dùng tự tấn công mình.
Làm sao để tự bảo vệ mình?
- Cẩn trọng khi click vào những đường link lạ. Đừng bao giờ điền form đăng nhập ở những trang ngoài không rõ nguồn gốc, không có chứng chỉ bảo mật.
- Nếu đã lỡ điền form thì phải đổi mật khẩu ngay lập tức, cài đặt xác thực từ điện thoại nếu có thể.
- Sử dụng J2TeaM Security, một sản phẩm do J2TeaM phát triển.
Phân tích bởi T-Rekt và Juno_okyo
0 notes
t-rekttt · 7 years
Photo
Tumblr media
I’m T-Rekt from #J2TeaM
1 note · View note
t-rekttt · 7 years
Text
Cách gỡ bỏ mã độc lây lan qua tin nhắn trên Facebook
Trong thời gian gần đây, trên Facebook đã xuất hiện một biến thể mã độc mới với khả năng lây lan qua tin nhắn bằng việc gửi các file đính kèm có chứa mã thực thi để lừa người dùng cài extension trên Chrome. Ứng dụng mở rộng này sau khi được cài đặt thành công sẽ can thiệp trực tiếp vào phiên làm việc của người dùng, và dù cho người dùng có đổi mật khẩu hay thực hiện các biện pháp bảo vệ tài khoản, chỉ cần extension còn được cài ở đó thì mã độc còn có thể được thực thi.
Xem bài phân tích chi tiết tại đây.
- 1 đoạn mã độc dùng để thực hiện cài đặt extension vào webstore của Chrome:
Tumblr media
Lưu ý: Hình thức tấn công này chỉ nhắm đến các trình duyệt sử dụng mã nguồn Chrome như Google Chrome, Cốc cốc,...bạn sẽ an toàn với những trình duyệt không sử dụng mã nguồn này (VD: Firefox, Edge,...).
Với Chrome, nếu bạn có thử mở file đính kèm thì trình duyệt sẽ đưa bạn đến 1 trang giả mạo Youtube và đưa ra thông báo thế này:
Tumblr media
Và trong trường hợp xấu nhất nếu bạn đã trót cài đặt extension, thì đây là các bước để gỡ bỏ nó ra khỏi trình duyệt:
- Truy cập trang chrome://extensions/ bằng cách paste URL lên thanh địa chỉ hoặc mở menu như hình sau:
Tumblr media
- Tìm extension One và làm theo các bước như hình:
Tumblr media
Đây chỉ là hướng dẫn gỡ bỏ đối với 1 ứng dụng cụ thể, ngoài ra bạn có thể nhận biết và gỡ bỏ các ứng dụng tương tự qua các đặc điểm như ứng dụng không có logo, không có phần giới thiệu rõ ràng, ví dụ như ở đây mình so sánh:
Tumblr media
Có một cách để tránh bị lây nhiễm mã độc kiểu này mà theo mình thấy là hiệu quả, đó là sử dụng các trình duyệt không dùng mã nguồn Chrome như Firefox, Edge, hay tệ nhất là IE,...
Hãy chia sẻ bài viết này với người thân và bạn bè của bạn để giúp họ giữ an toàn trên Facebook nhé! 😉
0 notes
t-rekttt · 8 years
Text
Tôi đã qua mặt hệ thống chấm điểm của Violympic như thế nào?
- Chắc hẳn với nhiều người trong chúng ta, nhất là với các thế hệ học sinh, sinh viên thì Violympic đã không còn là một cái tên quá xa lạ. Với mình thì Violympic là một cuộc thi vừa “dễ” lại vừa thú vị. Nó dễ ở chỗ mọi thứ trong bài thi đều là trắc nghiệm, không quan trọng cách bạn làm, chỉ quan tâm đến kết quả, còn thú vị ở chỗ bạn có thể tham dự kì thi ở bất cứ nơi đâu chỉ với một cái máy tính kêt nối internet. Hơn nữa, cuộc thi còn được nhiều đơn vị lớn tham dự tổ chức. 
Tumblr media
Mới đây, khi tìm hiểu thuật toán của Violympic, mình đã tìm ra được kẽ hở cho phép gian lận điểm bài thi, và nhân đây khi Violympic đã sửa đổi và nâng cấp thuật toán, mình xin được chia sẻ lại câu chuyện này.
Tumblr media
Lý do mình chọn Violympic?
- Mình chọn Violympic để nghiên cứu là vì một hôm tình cờ đọc được bình luận trên một bài viết nói về việc Violympic sử dụng mã hóa trên trang bài thi khiến cho thí sinh không thể gian lận bằng cách đọc mã nguồn trang thi để lấy đáp án như trước nữa. Điều đó khiến mình tò mò về thuật toán mã hóa đang được Violympic sử dụng.
Đầu tiên, mời các bạn xem video PoC của mình:
youtube
- 2 đoạn script khai thác như trong video PoC mình để ở cuối bài viết, vì Violympic đã thay đổi thuật toán chấm điểm nên cách này không còn áp dụng được nữa, chỉ sử dụng cho mục đích nghiên cứu thôi.
Sau đây là cách mình thực hiện nghiên cứu:
- Theo thói quen khi thực hiện nghiên cứu các ứng dụng web, mình bắt các gói tin bằng Fiddler trong khi làm bài thi để xem Violympic trao đổi những gì với máy chủ.
Có 5 endpoints chính mà mình tìm được:
Tumblr media
- /Play*, /Exam*: 2 endpoints này dùng để tải trang bài thi.
- /GetXmlData*: Lấy nội dung bài thi.
- /Timer*: Tính giờ
- /SendExamScore*: Gửi kết quả bài thi
(*.aspx)
- Nói sơ qua thì mình thấy cách chấm bài của hệ thống khá ngược, vì thường kết quả bài làm phải được chấm trên server, nhưng ở đây đáp án bài làm lại được gửi về cho client tự chấm, sau đó client mã hóa điểm và gửi lên cho server lưu lại. Điều này nghĩa là nếu client tìm được hàm mã hóa thì có thể tùy ý chọn điểm.
- Và vì thế nên mình đi sâu vào việc nghiên cứu dữ liệu đã mã hóa được gửi đến endpoint /SendExamScore* (nó chính là tham số encrypt ở trên bức ảnh kia).
- Đây là giá trị đã được mã hóa của tham số encrypt:
939df49b94c58e4b20b5d0a3a47ba40aea33a80058e9146dc2a81de695238e57191340dbbf9129136e2e7465a2898e398af2a6920cb1bfde9e06895dec080759cc17fd93d130e5c980902fb91c14811a9712c5f6c45cb1fc0c9d9d4fc0115cf1d72243329d1b55e572b7e49f00c9ad09d0a1b730e9898fec027c8775963c55a5d011fff43384ac7e2d96d2e8465b0da0e744e2fb767c104b219450e8d717f3043cfaa410f11ace998217a37943525994a2c38a36d3f7b310300878265462739a
- Ban đầu mình nghĩ rằng có thể tham số này được mã hóa bằng Javascript nên đã thử tìm kiếm trong các file Javascript trên trang.
- Nhưng mình không tìm được dấu tích nào của hàm mã hóa này, thậm chí cả cụm từ encrypt cũng không có luôn @@.
Tumblr media
- Sau một hồi tìm nhưng không ra, mình quyết định dịch ngược file Flash được nhúng trong bài thi.
- Dấu hiệu đầu tiên cho biết mình đang đi đúng hướng đó chính là cái endpoint gửi bài có chứa tham số encrypt.
Tumblr media
- Tiếp theo là tìm được hàm mã hóa
public function hmweb_Encrypt(_arg1:String, _arg2:String):String{            var _local3 = "ECB";            var _local4:Rijndael = new Rijndael(192, 128);            return (_local4.encrypt(_arg2, _arg1, _local3));        }
Từ đây mình rút ra được phương thức mã hóa là AES, mode ECB, và để giải mã thì cần phải có key mã hóa nữa.
- Key mã hóa này được biến đổi từ một tham số lưu trên trang dưới cái tên token
Tumblr media
- Từ token biến thành key mã hóa thì nó còn phải trải qua 1 loạt bước replace kí tự nữa, để cho khỏi dài dòng thì tất cả các đoạn code được sử dụng mình sẽ để ở cuối bài.
- Và đây là key mã hóa cuối cùng:
ejjvfxzwsjfftjfd72duytrf
- Dịch ngược lại được kết quả:
score=100&time=80&hash=552c086d708dcc5062b364caa27b4fe7&which_round=2&block=11&key=&examscore=100&doneexam=2&which_exam=2&strpoint=YELVE&userid=47988663&point=20&subpoint=0&realtime=85&
Tumblr media
- Bạn có thể tự kiểm chứng bằng cách test trên trang web: https://www.tools4noobs.com/online_tools/decrypt/
- Phần lớn dữ liệu sau khi dịch ra đã có thể hiểu được, trừ tham số hash, qua việc thử nghiệm mình thấy rằng hash sai thì kết quả bài thi không được công nhận. Vì vậy mình phải tìm thêm cách tạo hash
Tumblr media
- hash được tạo ra bằng cách nối chuỗi 5 giá trị gồm TotalPoint (tổng điểm) + totalUsedTime (tổng thời gian) + round (vòng thi) + key (key này khác key mã hóa) + "DrAgOnItE" (làm rối), sau khi nối chuỗi thì mã hóa lại bằng md5.
- Vậy là những thứ cần thiết đã có đủ, mình đã tổng hợp chúng lại thành 2 đoạn script khai thác và sử dụng như video PoC ở trên.
Sau đây là 2 đoạn script khai thác:
- Chrome snippet: https://gist.github.com/t-rekttt/0ba25221d5ef6dfcd5d462a26547eb76
- Encrypt.py: https://gist.github.com/t-rekttt/f8f38652a1ecc946d57f6b5f0b70a10c
4 notes · View notes