『 BangMaple's Blog 』

BangMaple's Blog. Nơi sẻ chia kiến thức!

Bảo mật Java Web Application thông qua Apache HTTP Server như là Reverse-Proxy


Chào các bạn,

Trong bài viết này mình sẽ hướng dẫn các bạn các bảo mật ứng dụng Java Web thông qua Apache HTTP Server, cụ thể là sẽ thực hành trên phần mềm XAMPP.

Trong lập trình Java Web, chúng ta khá là vất vả trong việc xử lý dữ liệu ở tầng Business Logic. Việc thiết lập thêm cho việc kiểm tra request và lọc dữ liệu từ request khá là khó khăn trong việc mở rộng một dự án hoặc thậm chí có thể làm chậm máy chủ và có nguy cơ làm tăng rủi ro an ninh an toàn thông tin.

Organize your application code in three-tier architecture - Create ...
Hình 1 - Mô hình 3 lớp

Tại bài viết này mình chỉ tập trung vào Reverse-Proxy, nên khái niệm về Proxy thông thường bạn có thể dễ dàng tìm kiếm được tài nguyên có sẵn trên Google Search.
Hình 2 - Mô phỏng Reverse-Proxy
Đầu tiên nhìn vào tấm hình, ta có thể dễ dàng nhận biết được Reverse-Proxy có thể được coi như là một lớp "phòng thủ" bổ sung cho server chạy ứng dụng Java Web.

Nó có thể giúp bạn che giấu được địa chỉ IP của máy chủ chạy ứng dụng Java Web. Reserve-Proxy Server có thể được tích hợp nhiều hơn một tính năng để nâng cao tính bảo mật và phòng thủ trước những mối nguy hại trong môi trường Internet như là tấn công DDoS, tránh những công cụ dò lỗ hỏng bảo mật tự động, ... 

Ngoài ra Reserve-Proxy còn có thể đảm nhiệm thêm nhiệm vụ Caching giúp cho việc người dùng yêu cầu dữ liệu bên phía máy chủ Web Application nhưng không nhất thiết phải yêu cầu lần 2 tới máy chủ khi dữ liệu ở máy chủ chạy Web Application không thay đổi và việc trả dữ liệu được diễn ra ở Reserve-Proxy nên việc yêu cầu dữ liệu nhanh hơn khá nhiều.
What is Web Cache Poisoning? | Acunetix
Hình 3 - Caching

Tăng cường tính sẵn sàng (Availability) là điều tất yếu đối với những máy chủ chạy 24/7. Bạn sẽ cảm thấy không hài lòng với dịch vụ khi mà một máy chủ chính chạy ứng dụng Web bị sập, việc có những máy chủ cạnh bên hỗ trợ cung cấp các dịch vụ web là cần thiết kết hợp với Reverse-Proxy và bạn sẽ có thể có thêm được tính năng Cân bằng tải (Load Balancing) cho máy chủ của mình. 
Khi gặp một lượng lướng request từ người dùng, Reserve-Proxy có thể chuyển giao một phần request cho các máy chủ khác giúp tăng tính sẵn sàng của nó.

Hiệu năng của máy chủ chạy Web Application càng tăng vì bây giờ máy chủ chạy Java Web Application sẽ không cần phải làm thêm nhiệm vụ mã hoá và giải mã SSL.

High availability
Hình 4 - Tính sẵn sàng

Từ bây giờ, mình sẽ minh hoạ máy chủ chạy Java Web Application là Apache Tomcat.
Trong XAMPP có sẵn Apache HTTP Server, bạn có thể host ứng dụng Web PHP lên trên đây, trong bài viết này chúng ta sẽ bỏ qua cơ chế host ứng dụng Web của PHP mà làm thành Reverse-Proxy.

WAF] Hướng dẫn cài đặt compile module ModSecurity với Apache Linux ...
Hình 5 - ModSecurity
Mình sẽ giới thiệu một module của Apache HTTP Server đó là ModSecurity. Theo cơ chế hoạt động của Apache HTTP Server là khi request được gửi lên thì các module có quyền thao tác trên các request đó.

Còn ModSecurity là một Apache HTTP Server module dạng tường lửa cho ứng dụng web có dạng mã nguồn mở. Chủ yếu để tăng cường bảo mật đối với các dạng lỗ hỏng bảo mật chung sử dụng bộ rules của OWASP ModSecurity. 

Để có thể nhận diện được mối nguy hại, ModSecurity được nhúng vào trong Apache HTTP Server cho phép nó có thể rà soát những giao tiếp HTTP thông qua các luồng yêu cầu và gửi trả dữ liệu đến điểm cuối. Được dựa trên việc cấu hình các rule mà công cụ sẽ quyết định nên xử lý các trường hợp đó như thế nào như là cho phép, loại bỏ, chuyển đi, trả về status code, ...
How ModSecurity protects Wordpress websites - Sysally
Hình 6 - Minh hoạ các hoạt động của ModSecurity
Bây giờ hãy thiết lập nó lên thôi nào!

Đầu tiên bạn cần tải xuống XAMPP thông qua đường dẫn: https://www.apachefriends.org/. Bạn không nên bỏ cài đặt Apache Web Server và Apache Tomcat vì là cần thiết.
Hình 7 - Giao diện sau khi cài đặt XAMPP.
Thông qua đường dẫn C:\xampp\apache\modules là nơi chứa các module của Apache HTTP Server, nơi chúng ta sẽ cài đặt ModSecurity lên đó.
Hình 8 - Nơi chứa Apache HTTP Server modules
Chúng ta sẽ tải xuống module ModSecurity thông qua đường dẫn: https://www.apachelounge.com/download/
Hình 9 - Những tập tin cần chú ý
Chúng ta sẽ đưa tệp tin mod_security2.so vào đường dẫn Nơi_cài_đặt_XAMPP\apache\modules, tệp tin yajl.dll vào đường dẫn Nơi_cài_đặt_XAMPP\apache\bin, tệp tin modsecurity.conf-recommended vào đường dẫn Nơi_cài_đặt_XAMPP\apache\conf.

Sau khi import module thì chúng ta sẽ phải sử dụng module bằng cách LoadModule, chúng ta vào đường dẫn Nơi_cài_đặt_XAMPP\apache\conf\ và mở tệp tin httpd.conf và tìm để xác nhận module sẽ được load.
Hình 10 - Xác nhận các module trong hình sẽ được load
Chúng ta sẽ phải có những tệp tin như hình dưới và tệp httpd.conf đã được chỉnh sửa như trên. Và đỡ mất công đôi bên cấu hình những thứ mất thời gian gỡ lỗi thì mình sẽ cung cấp cho bạn các tệp tin cần thiết ấy tại đây: https://drive.google.com/file/d/1fDd-O8G4FeCDrTmAjbIFlIatO42e4_wM/
Hình 11 - Các tệp tin thiết yếu
Hãy đặt các tệp tin trong tệp nén vào đúng vị trí này.

Để có thể kết nối qua Java Web Application của Apache Tomcat, chúng ta kết nối gián tiếp qua Apache HTTP Server thông qua giao thức AJP, mở tệp tin ajp.conf để xem chi tiết như sau để xác nhận và chỉnh sửa sau này.
Hình 12 - Cấu hình chi tiết tệp tin ajp.conf
Chúng ta cần tệp ajp.conf để có thể chạy chung khi tệp httpd.conf được load. Giao thức AJP có port mặc định là 8009 nên chúng ta cần phải bật giao thức AJP bên Apache Tomcat với tệp tin server.xml bên đó.

Vào Nơi_cài_đặt_XAMPP\tomcat\conf\server.xml để bật port 8009 của giao thức AJP.
Hình 13 - Xác nhận giao thức AJP đã được bật
Đến đây là gần như hoàn tất, bạn có thể tải xuống project Java Web đơn giản để thử các lỗ hỏng bảo mật tại đây: https://drive.google.com/file/d/1rYdtnjURcIZCngBJcIHnQ8mKU_o-8LZ1/

Sau đó bạn đổi tên gói .war đã tải về thành ROOT.war rồi sau đó đặt vào đường dẫn Nơi_cài_đặt_XAMPP\tomcat\webapps\ và cuối cùng là xoá thư mục ROOT đi. Kết quả sẽ được như hình dưới.
Hình 14 - Xác nhận thư mục webapps của Apache Tomcat
Sau đó hãy khởi động Apache HTTP Server và Apache Tomcat lên. Bạn sẽ thấy có thêm một port 8009.
Hình 15 - XAMPP sau khi cấu hình AJP

Bạn truy cập Web Application thông qua địa chỉ http://localhost:80 thay vì phải vào :8080 để thông qua Proxy.
Hình 16 - Sau khi vào localhost
Chúng ta sẽ thử tấn công dạng XSS (Reflected) như sau để lấy cookie: <script>alert(document.cookie)</script> 

Ngay lập tức chúng ta sẽ "ăn" HTTP Status Code 403 là không có quyền truy cập vì ModSecurity đã filter đi và không thể đến Apache Tomcat Server được.

Hình 17 - Lỗi 403
Chúng ta mở tệp modsec_audit.log trong đường dẫn Nơi_cài_đặt_XAMPP\apache\logs và thấy ModSecurity đã nhận ra được đây là tấn công dạng XSS và từ chối.
Hình 18 - Log của ModSecurity
Tệp nén mình cung cấp có bao gồm thêm kho rules OWASP dành cho ModSecurity:  https://github.com/coreruleset/coreruleset

Ngoài ra, bạn cũng có thể chỉnh sửa cấu hình của ModSecurity trong tệp modsecurity.conf. Cụ thể là nếu bạn muốn vô hiệu hoá các chức năng của ModSecurity thì chỉ cần set dòng số 7 giống hình dưới thành SecRuleEngine Off hoặc SecRuleEngine DetectionOnly là xong.
Hình 19 - Configuration của ModSecurity
Bạn cũng có thể tận dụng tệp log để tạo API cho việc quản lý mở rộng sau này.

Việc áp dụng các rules tự tạo khả thi nên bạn hoàn toàn có thể phát triển thêm cho ModSecurity rules.

Nhưng bạn sẽ không thể sử dụng module ModSecurity nếu bạn không thông qua port 80 mà qua port 8080 vì nó vẫn còn hiệu lực hoá nên kết quả sẽ như sau nếu bạn thử tấn công XSS.
Hình 20 - Tấn công XSS thành công
Nên bạn cần phải vô hiệu hoá port 8080 của Apache Tomcat bằng cách vào conf\server.xml của Tomcat và comment lại block như hình dưới.
Hình 21 - Vô hiệu hoá port 8080
Việc làm này sẽ làm XAMPP không nhận diện được Apache Tomcat Server của bạn có hoạt động hay không nên từ nay chúng ta sẽ mở tệp catalina_start.bat để chạy và bạn thấy port 8009 được hoạt động.
Hình 22 - Console của Apache Tomcat
Sau khi disable port 8080. Bạn sẽ không thể nào kết nối đến Apache Tomcat Server trực tiếp được nữa, điều này sẽ tăng phần nào về tính bảo mật. Test truy cập port 8080.
Hình 23 - Port 8080 đã bị shutdown
Hi vọng bạn sẽ học được cách để tăng tính bảo mật cho ứng dụng Java Web của mình mà không phải làm giảm hiệu năng của Apache Tomcat.

Cảm ơn bạn đã theo dõi bài này.
-------------------
Tài liệu tham khảo thêm:

Xây dựng và kiểm thử hệ thống phát hiện xâm nhập Suricata với tường lửa pfSense


Chào các bạn.

Trong bài viết này, mình sẽ hướng dẫn các bạn:

Cấu hình card mạng trên máy ảo Parallels Desktop.
Cấu hình pfSense cho việc định tuyến.
Cấu hình dịch vụ Suricata trên pfSense.
Tạo bộ Rules tuỳ chọn cho việc kiểm thử cụ thể.

Yêu cầu cài đặt sẵn:
- 1 máy Client cho việc kiểm thử và cấu hình giao diện cho pfSense.
- 1 máy Kali Linux sử dụng cho việc xâm nhập máy Client.
- 1 máy ảo cho việc cài đặt pfSense có 2 card mạng. (1 cho NAT để kết nối ra ngoài Internet và 1 là VMNet2 cho việc nội bộ bên phía máy ảo).


Đầu tiên hãy cùng cài đặt máy ảo pfSense:
Chờ một vài giây để khởi động bộ cài đặt pfSense..
Hình 1 - Boot vào bộ cài đặt pfSense
Sau khi boot vào thì các bạn nhấn Enter chọn Accept để chấp nhận điều khoản của phần mềm này.
Hình 2 - Giao diện trình cài đặt pfSense
Nhấn Enter lần nữa để tiếp tục cài đặt.
Hình 3 - Cài đặt pfSense
Nhấn Enter để Select nếu bạn muốn sử dụng bộ gõ mặc định.
Hình 4 - Cài đặt pfSense
Nhấn Enter để trình cài đặt tự động phân vùng cho bạn hoặc bạn có thể chọn Manual nếu muốn tự phân vùng ổ đĩa.
Hình 5 - Cài đặt pfSense
Chờ một vài phút để trình cài đặt có thể tiến hành việc cài đặt.
Hình 6 - Cài đặt pfSense
Giờ đây pfSense đã cài đặt hoàn tất và muốn hỏi bạn muốn mở shell để tinh chỉnh sau khi cài đặt không, mình không cần nên chọn No.
Hình 6 - Cài đặt pfSense
Chọn Reboot để khởi động lại máy.
Hình 7 - Cài đặt pfSense
Hình 8 - Giao diện sau khi cài đặt pfSense
Nếu giao diện card mạng của bạn được thiết lập sẵn IP như thế này là quá tốt. Nhưng nếu bạn muốn tự thiết lập IP cho mình nếu thêm card mạng mới hoặc tinh chỉnh địa chỉ IP?

Chọn số 1 để thiết lập giao diện card mạng.
Hình 9 - Thiết lập giao diện
Ở đây mình không cần thiết lập VLAN trước nên chọn n.

Sau đó chọn giao diện cho mạng WAN, ở đây mình sẽ chọn em0 cho WAN.
Hình 10 - Thiết lập giao diện
Đối với mạng LAN thì mình để em1 là card mạng thứ 2. Bạn nào muốn thiết lập cho vùng DMZ thì có thể thêm card mạng nữa..
Hình 11 - Thiết lập giao diện
Để xác nhận thiết lập giao diện thì mình chọn y để hoàn tất.
Hình 12 - Thiết lập giao diện
Thế là hoàn tất thiết lập cho giao diện card mạng. 
Giờ mình sẽ thiết lập IP cho từng card mạng.
Hình 13 - Thiết lập IP cho giao diện
Mình sẽ chọn giao diện WAN để cấu hình IP đầu tiên.
Hình 14 - Thiết lập IP cho giao diện
Để cho khỏi bị trùng hoặc sai cấu trúc địa chỉ IP WAN thì mình sẽ để thiết lập thông qua DHCP để ra ngoài Internet. Mình chọn y.
Hình 15 - Thiết lập IP cho giao diện
Mình không dùng IPv6 nên không cần thiết lập và không cần revert sang HTTP nên chọn n.
Hình 16 - Thiết lập IP cho giao diện
Thành công. Sau đó mình sẽ thiết lập IP cho giao diện mạng LAN.
Hình 17 - Thiết lập IP cho giao diện
Thiết lập IPv4 cho giao diện mạng LAN, mình sẽ nhập địa chỉ 172.16.205.1

Làm như thế nào mình biết được nhập IP như thế nào?
Các bạn vào cấu hình card mạng của máy ảo để xem. Ở đây địa chỉ đường mạng của mình là 172.16.205.0
Hình 18 - Card mạng VMNet2
Nhập địa chỉ IP vào đây.
Hình 19 - Thiết lập IP cho giao diện
Chọn Subnet mask cho giao diện, ở đây mình chọn 24 số bit.
Hình 20 - Thiết lập địa chỉ IP cho giao diện
Mình muốn hiệu lực hoá DHCP và chọn dãy IP 172.16.205.2 - 172.16.205.254 cho DHCP.
Hình 21 - Thiết lập địa chỉ IP cho giao diện
Hình 22 - Thiết lập địa chỉ IP cho giao diện
Bạn sẽ dùng địa chỉ https://172.16.205.1/ để truy cập vào trang giao diện web của pfSense để cài đặt và cấu hình các dịch vụ.

Mình sẽ qua máy ảo Client đang chạy Windows 7 để thiết lập cho cùng dãy địa chỉ với giao diện mạng LAN bên pfSense. Bằng cách chọn card mạng VMNet2 để dùng chung.
Hình 23 - Thay đổi card mạng của máy client
Kiểm tra xem Windows 7 có được cấp phát đúng dãy IP hay không. Nếu không thì bạn phải nhập IP thủ công và kiểm tra lại set card mạng ảo đúng chưa đấy.
Hình 24 - Kiểm tra IP cấp phát cho Windows 7
Sử dụng địa chỉ mình có đính ở trên hoặc theo của bạn được cấp phát, vào bằng trình duyệt.

Đăng nhập với tên người dùng: admin, mật khẩu là: pfsense
Hình 25 - Truy cập web giao diện pfSense
Nhấn Next để tiếp tục.
Hình 26 - Cửa sổ thiết lập pfSense
Hình 27 - Cửa sổ thiết lập pfSense
Mình sẽ đặt DNS theo IP LAN máy pfSense và IP của Cloudflare.
Hình 28 - Cửa sổ thiết lập pfSense
Chuyển múi giờ nếu bạn muốn.
Hình 29 - Cửa sổ thiết lập pfSense
Kéo xuống dưới cùng và nhấn Next.
Hình 30 - Cửa sổ thiết lập pfSense


Hình 31 - Cửa sổ thiết lập pfSense
Thiết lập mật khẩu cho giao diện web pfSense, ở đây mình sẽ đặt là: admin
Hình 32 - Cửa sổ thiét lập pfSense
Sau khi thiết lập hoàn tất thì hãy nhấn Reload để áp dụng thay đổi mới.
Hình 32 - Cửa sổ thiết lập pfSense
Hình 33 - Cửa sổ thiết lập pfSense
Cấu hình hoàn tất. Bạn sẽ được đưa về trang chính.
Hình 34 - Cửa số thiết lập pfSense
Ngay ở màn hình chính, chọn mục System và sau đó chọn Package Manager
Hình 35 - Cài đặt dịch vụ
Qua mục Available packages và tìm kiếm "suricata" và sau đó chọn Install.

Hình 36 - Cài đặt dịch vụ
Xác nhận cài đặt dịch vụ Suricata.
Hình 37 - Cài đặt dịch vụ
Hãy chờ một vài phút để dịch vụ Suricata được cài đặt.
Hình 38 - Cài đặt dịch vụ
Dịch vụ Suricata được cài đặt hoàn tất.
Hình 39 - Cài đặt dịch vụ
Sau khi cài đặt thành công dịch vụ Suricata, bạn hãy nhìn lên thanh menu chọn Services và chọn Suricata để bắt đầu cấu hình dịch vụ.
Hình 40 - Thiết lập dịch vụ Suricata
Trong phần Interfaces, hãy chọn Add để thêm giao diện cho Suricata quản lý.
Hình 41 - Thiết lập dịch vụ Suricata
Ở đây mình sẽ quản lý qua mạng LAN nên là sẽ sửa Interface thành LAN và Description cũng vậy,
Hình 42 - Thiết lập giao diện LAN cho dịch vụ
Kéo xuống dưới cùng và nhấn Save.
Hình 43 - Thiết lập giao diện LAN cho dịch vụ
Mình chọn qua tab Global Settings, tích vào phần Snort free Registered User or paid Subscribe rules rồi chọn Sign up for a free Registered Users Account để lấy Oinkcode cho phần dưới.
Hình 44 - Thiết lập dịch vụ Suricata
Sau khi đăng ký và xác nhận tài khoản Snort thì bạn vào đường dẫn https://www.snort.org/oinkcodes để lấy Oinkcode như hình.
Hình 45 - Lấy Oinkcode
Dán oinkcode và rules filename vào và sau đó bật luôn Install Snort GPLV2 Community Rules.
Hình 46 - Thiết lập dịch vụ Suricata
Kéo xuống cùng và nhấn Save để lưu lại cấu hình.
Hình 47 - Thiết lập dịch vụ Suricata
Bạn đã nhận được màn hình trắng, nhưng không sao hãy quay lại trang chủ của pfSense và quay lại Suricata.

Qua tab Update và sau đó nhấn Force Update để cập nhật Rules của Suricata.
Hình 48 - Thiết lập dịch vụ Suricata
Chờ giây lát để Suricata cập nhật Rules.
Hình 49 - Thiết lập dịch vụ Suricata
Cập nhật thành công Rules.
Hình 50 - Thiết lập dịch vụ Suricata
Quay về tab Interface, sau đó sửa Interface LAN này bằng cách chọn vào icon bút chì.
Hình 50 - Thiết lập dịch vụ Suricata
Sau đó qua tab LAN Rules, chọn Category để thêm một số Rules custom.
Hình 51 - Thiết lập dịch vụ Suricata

Dưới đây là bộ Rules của phần Scan:
alert tcp any any -> any any (msg:"SYN FIN Scan"; flags: SF;sid:9000000;)
alert tcp any any -> any any (msg:"FIN Scan"; flags: F;sid:9000001;)
alert tcp any any -> any any (msg:"NULL Scan"; flags: 0;sid:9000002;)
alert tcp any any -> any any (msg:"XMAS Scan"; flags: FPU;sid:9000003;)
alert tcp any any -> any any (msg:"Full XMAS Scan"; flags: SRAFPU;sid:9000004;)
alert tcp any any -> any any (msg:"URG Scan"; flags: U;sid:9000005;)
alert tcp any any -> any any (msg:"URG FIN Scan"; flags: FU;sid:9000006;)
alert tcp any any -> any any (msg:"PUSH FIN Scan"; flags: FP;sid:9000007;)
alert tcp any any -> any any (msg:"URG PUSH Scan"; flags: PU;sid:9000008;)
alert tcp any any -> any any (flags: A; ack: 0; msg:"NMAP TCP ping!";sid:9000009;)

Dưới đây là bộ Rules của phần Ping:
alert icmp any any -> any any (msg:"ICMP Packet found";sid:9000000;)
alert icmp any any -> any any (itype: 0; msg: "ICMP Echo Reply";sid:9000001;)
alert icmp any any -> any any (itype: 3; msg: "ICMP Destination Unreachable";sid:9000002;)
alert icmp any any -> any any (itype: 4; msg: "ICMP Source Quench Message received";sid:9000003;)
alert icmp any any -> any any (itype: 5; msg: "ICMP Redirect message";sid:9000004;)
alert icmp any any -> any any (itype: 8; msg: "ICMP Echo Request";sid:9000005;)
alert icmp any any -> any any (itype: 11; msg: "ICMP Time Exceeded";sid:9000006;)

Bạn dán bộ Rules vào cho việc kiểm thử xâm nhập, mình sẽ dán bộ Rules cho phần Scan vào và sau đó nhấn Save để lưu rules.

Sau đó chọn Category: Active Rules để kiểm tra xem rules được thêm chưa nhé.
Hình 52 - Thiết lập dịch vụ Suricata
Mình đã thành công thiết lập custom rules cho dịch vụ Suricata, hãy cùng mở máy để tấn công. Mình sẽ mở máy Kali Linux, lưu ý là phải để cùng card mạng nhé! (VMNet2).

Khởi động ZenMap lên. Mình biết được địa chỉ IP của máy Client Windows 7 là 172.16.205.3.

Mình có một số lệnh dùng cho nmap:

NULL Scan: nmap -sN -T4 -v 172.16.205.3
SYN FIN Scan: nmap -sS --scanflag SYNFIN -T4 -v 172.16.205.3
FIN Scan: nmap -sS --scanflag FIN -T4 -v 172.16.205.3
XMAS Scan: nmap -sX -T4 -v 172.16.205.3
URG Scan: nmap -sS --scanflag URG -T4 -v 172.16.205.3
URG FIN Scan: nmap -sS --scanflag URG -T4 -v 172.16.205.3
PUSH FIN Scan: nmap -sS --scanflag PSHFIN -T4 -v 172.16.205.3
URG PUSH Scan: nmap -sS --scanflag URGPSH -T4 -v 172.16.205.3

Hình 51 - Thực hiện lệnh nmap
Quay lại cửa sổ web pfSense và vào tab Alerts để xem ai xâm nhập.
Hình 52 - Cảnh báo xâm nhập
Bạn cũng có thể vào Logs View để xem ghi nhận lại sự cố xâm nhập nữa đấy.
Hình 53 - Xem ghi nhận xâm nhập
Bạn có thể kiểm thử tiếp các lệnh nmap ở trên mình cung cấp nhé.

Và thế là bạn đã hoàn tất xây dựng và kiểm thử hệ thống phát hiện xâm nhập với dịch vụ Suricata bằng tường lửa pfSense rồi đó.

Chúc các bạn học tốt!