Trao đổi với tôi

http://www.buidao.com

2/6/10

[Hacking] Local hack và cách phòng tránh

Bài này viết với mục đích để các quản trị và các bạn làm bảo mật hiểu một cách rõ hơn về cách tấn local hack. Cách này tuy rằng phổ biến đã lâu nhưng tôi nghĩ rằng không chỉ ở Việt Nam mà rất nhiều server nước ngoài vẫn bị lỗi này, mà đôi khi có bug mới là có thể dùng lại được. Tôi cũng tin rằng rất nhiều bạn biết tấn công local nhưng không biết fix lỗi này như thế nào ?

Local hack là gì ?

Hiểu một cách nôm na là tấn công cục bộ. Cục bộ ở đây có nghĩa là trên cùng một máy chủ (server). Tấn công này được thực hiện như thế nào ?

Ví dụ ta cần tấn công site mục site1.com, nhưng sau khi phân tích tình hình thì thấy rằng việc tấn công trực tiếp site này là rất khó. Và cũng qua khảo sát ta biết được rằng trên server này có rất nhiều site khác. Ý tưởng : tấn công một site khác cùng server sau đó lấy site này làm bàn đạp tấn công site mục tiêu.

Có những loại hack local nào ? Tôi tạm thời chia làm 3 loại : Unix local, windows local, FTP local. Có lẽ rất nhiều bạn chỉ biết đến local hack trên Unix mà chưa biết đến 2 loại sau happy. Unix Local có nghĩa là máy chủ là Unix, tương tự đối với windows local, còn FTP local có nghĩa là local qua FTP.

Phần chung nhất của các loại trên là ở bước 1, bước tìm các site cùng server. Cái này có thuật ngữ chung là : Reverse IP. Ta có thể dùng tool sau để xác định các site cùng server :

http://www.domaintools.com/reverse-ip/ --> cái này mới thu phí rồi

http://www.seologs.com/ip-domains.html -> cái này có lợi thế là lưu cả tên miền Việt Nam, nhưng sô lượng ít hơn site trên

Sau khi làm xong bước trên, đến bước tìm site bị lỗi để dùng làm bàn đạp tấn công. Bước này thì ở các loại đã có sự phân hóa. Tôi sẽ trình bày riêng từng phần.

\u003cp\>\u003cstrong\>1. Unix local\u003c/strong\>\u003c/p\> \u003cp\>Có lẽ bây giờ chỉ phổ biến site php-mysql trên Unix, nên tôi tập chung vào cái này. Cách tìm bug được tiến hành theo tư duy như sau :\u003c/p\> \u003cp\>- Nếu site đó sử sụng một loại mã nguồn đã được xác định, ví dụ dùng mã nguồn mở, thì đầu tiên là vào các site thông báo bug để kiểm tra xem bản code đang dùng có dính bug nào không. Có thể vào \u003ca href\u003d\"http://milw0rm.com/\" target\u003d\"_blank\" onclick\u003d\"return top.js.OpenExtLink(window,event,this)\"\>http://milw0rm.com/\u003c/a\> hay \u003ca href\u003d\"http://www.securityfocus.com/\" target\u003d\"_blank\" onclick\u003d\"return top.js.OpenExtLink(window,event,this)\"\>http://www.securityfocus.com/\u003c/a\> ... để tìm bug.\u003c/p\> \u003cp\>- Nếu ở bước trên không thành công hoặc code do họ tự phát triển thì cách duy nhất là phải tự ngồi mò xem. Lúc này dựa vào kinh nghiệm và khả năng của người hack là chính. Các lỗi hay được sử dụng và khá dễ để phát hiện : SQL injection, PHP file include, lỗi cài mặc định các ứng dụng như các bộ editor, lỗi không chứng thực phần upload file, upload file không filter, hoặc có filter + apache unknow extension,... rất nhiều lỗi có thể khai thác được. Tôi sẽ không đi vào chi tiết các lỗi này sử dụng và khai thác như thế nào.\u003c/p\> \u003cp\>Sau khi tìm ra lỗi, mục tiêu là phải upload được một con shell lên để có thể tiến hành tiếp bước sau. Việc upload được shell hay không phụ thuộc rất nhiều vào việc admin site đó CHMOD có tốt không. Các bạn có thể tham khảo bài : \u003ca title\u003d\"CHMOD là gì ?\" href\u003d\"http://www.guru.net.vn/PermaLink.aspx?guid\u003d1a18fa31-b5c7-4f94-b6c9-b1a77a6a05bb\" target\u003d\"_blank\" onclick\u003d\"return top.js.OpenExtLink(window,event,this)\"\>CHMOD là gì ?\u003c/a\> . Tôi giả sử là đã upload được shell rồi. Đến đây ta bắt đầu thử local sang site mục tiêu. Nếu Safe mode OFF và local dễ dàng thì không có gì đáng nói, site mục tiêu đã có thể xâm nhập. Nếu Safe mode ON và local gặp khó khăn, lúc này cần phải biết về các bug safe mode by pass. Các lỗi này tùy thuộc vào phiên bản của PHP và phụ thuộc vào các hàm có thể sử dụng có bị cấm hay không. Nếu không dùng PHP safe mode by pass ta có thể dùng LOAD DATA LOCAL INFINE, về cái này thì chị Yến đã có bài viết rồi.",1] ); //-->

1. Unix local

Có lẽ bây giờ chỉ phổ biến site php-mysql trên Unix, nên tôi tập chung vào cái này. Cách tìm bug được tiến hành theo tư duy như sau :

- Nếu site đó sử sụng một loại mã nguồn đã được xác định, ví dụ dùng mã nguồn mở, thì đầu tiên là vào các site thông báo bug để kiểm tra xem bản code đang dùng có dính bug nào không. Có thể vào http://milw0rm.com/ hay http://www.securityfocus.com/ ... để tìm bug.

- Nếu ở bước trên không thành công hoặc code do họ tự phát triển thì cách duy nhất là phải tự ngồi mò xem. Lúc này dựa vào kinh nghiệm và khả năng của người hack là chính. Các lỗi hay được sử dụng và khá dễ để phát hiện : SQL injection, PHP file include, lỗi cài mặc định các ứng dụng như các bộ editor, lỗi không chứng thực phần upload file, upload file không filter, hoặc có filter + apache unknow extension,... rất nhiều lỗi có thể khai thác được. Tôi sẽ không đi vào chi tiết các lỗi này sử dụng và khai thác như thế nào.

Sau khi tìm ra lỗi, mục tiêu là phải upload được một con shell lên để có thể tiến hành tiếp bước sau. Việc upload được shell hay không phụ thuộc rất nhiều vào việc admin site đó CHMOD có tốt không. Các bạn có thể tham khảo bài : CHMOD là gì ? . Tôi giả sử là đã upload được shell rồi. Đến đây ta bắt đầu thử local sang site mục tiêu. Nếu Safe mode OFF và local dễ dàng thì không có gì đáng nói, site mục tiêu đã có thể xâm nhập. Nếu Safe mode ON và local gặp khó khăn, lúc này cần phải biết về các bug safe mode by pass. Các lỗi này tùy thuộc vào phiên bản của PHP và phụ thuộc vào các hàm có thể sử dụng có bị cấm hay không. Nếu không dùng PHP safe mode by pass ta có thể dùng LOAD DATA LOCAL INFINE, về cái này thì chị Yến đã có bài viết rồi. \u003cp\>Nếu tất cả các cách trên không được, ta xoay sang xem có khả năng get root - chiếm quyền kiểm soát server hay không, cái này tùy thuộc vào kernel của hệ điều hành và tùy thuộc vào phần mền cài trên máy chủ có dính bug overflow hay không ? ... Nói tóm lại là khi có shell rồi mỗi người có một cách tùy thuộc khả nẳng.\u003c/p\> \u003cp\>\u003cstrong\>-->Cách fix ?\u003c/strong\>\u003c/p\> \u003cp\>Để không bị dính các lỗi trên thì phải update phần mềm và config đúng (tôi sẽ nói chi tiết ở bài khác).\u003c/p\> \u003cp\>- Bật safe mode ON\u003c/p\> \u003cp\>- Trong php.ini Cấm các hàm nhạy cảm + các hàm có thể safe mode by pass (đòi hỏi admin phải cập nhật thông tin liên lục)\u003c/p\> \u003cp\>- Đối với virtual host thì tham số open_basedir là rất quan trọng, cần phải đặt tham số này đúng với thư mục web của từng site\u003c/p\> \u003cp\>- CHMOD kỹ cẩn thận (CHMOD như thế nào thì phải đọc)\u003c/p\> \u003cp\>- Các form upload cần phải lọc file...\u003c/p\> \u003cp\>- Trong file my.conf thêm dòng \u003cstrong\>set-variable\u003dlocal-infile\u003d0 \u003c/strong\>để tránh lỗi LOAD DATA LOCAL INFINE\u003c/p\> \u003cp\>\u003cstrong\>2. Windows local\u003c/strong\>\u003c/p\> \u003cp\>Cách tìm site lỗi về cơ bản là giống phần trên, chỉ khác ở đặc tính ngôn ngữ lập trình, cần phải xem xét kỹ hơn ở khía cạnh này.\u003c/p\> \u003cp\>Để có thể local được có các khả năng sau : phân quyền bị không tốt (thường là dùng chung group, group phân quyền không cẩn thận),server chưa cấm command execute. Tất cả các shell chạy trên windows đều có một đặc tính là sử dụng FSO (File System Object) - nếu cái này làm cẩn thận mà move cmd.exe đi thì không có cách gì chạy được cmd. Ở đây là còn chưa nói đến chương trình diệt virus rất nhạy cảm với FSO, nên rất dễ bị phát hiện.\u003c/p\> \u003cp\>\u003cstrong\>-->Cách khắc phục ?\u003c/strong\>\u003c/p\> \u003cp\>Phân quyền tốt : tốt nhất là nên dùng windows 2003 server, mỗi một site chạy một pool là tốt nhất, nhưng như thế tốn tài nguyên hơn. Account chạy web của mỗi site là riêng biệt và account chạy \u003ca href\u003d\"http://ASP.NET\" target\u003d\"_blank\" onclick\u003d\"return top.js.OpenExtLink(window,event,this)\"\>ASP.NET\u003c/a\> khác account chạy asp, php,... Việc set permission là cựu kỳ quan trọng, để làm tốt việc này, cần phải đọc thêm tài liệu và làm tốt các security check list của Microsoft. Lưu ý là không dùng Default pool để chạy. Thường là các server riêng rất hay gặp lỗi này vì admin những server này chỉ cần cài cho chạy được là xong nhưng ngược lại server riêng thường chỉ chạy 1 vài site. Cái nguy hiểm chính là ở chỗ này, nếu mà server riêng bị tấn công khả năng mất quyền kiểm soát và mất mát dữ liệu nhiều là rất cao.",1] ); //-->

Nếu tất cả các cách trên không được, ta xoay sang xem có khả năng get root - chiếm quyền kiểm soát server hay không, cái này tùy thuộc vào kernel của hệ điều hành và tùy thuộc vào phần mền cài trên máy chủ có dính bug overflow hay không ? ... Nói tóm lại là khi có shell rồi mỗi người có một cách tùy thuộc khả nẳng.

-->Cách fix ?

Để không bị dính các lỗi trên thì phải update phần mềm và config đúng (tôi sẽ nói chi tiết ở bài khác).

- Bật safe mode ON

- Trong php.ini Cấm các hàm nhạy cảm + các hàm có thể safe mode by pass (đòi hỏi admin phải cập nhật thông tin liên lục)

- Đối với virtual host thì tham số open_basedir là rất quan trọng, cần phải đặt tham số này đúng với thư mục web của từng site

- CHMOD kỹ cẩn thận (CHMOD như thế nào thì phải đọc)

- Các form upload cần phải lọc file...

- Trong file my.conf thêm dòng set-variable=local-infile=0 để tránh lỗi LOAD DATA LOCAL INFINE

2. Windows local

Cách tìm site lỗi về cơ bản là giống phần trên, chỉ khác ở đặc tính ngôn ngữ lập trình, cần phải xem xét kỹ hơn ở khía cạnh này.

Để có thể local được có các khả năng sau : phân quyền bị không tốt (thường là dùng chung group, group phân quyền không cẩn thận),server chưa cấm command execute. Tất cả các shell chạy trên windows đều có một đặc tính là sử dụng FSO (File System Object) - nếu cái này làm cẩn thận mà move cmd.exe đi thì không có cách gì chạy được cmd. Ở đây là còn chưa nói đến chương trình diệt virus rất nhạy cảm với FSO, nên rất dễ bị phát hiện.

-->Cách khắc phục ?

Phân quyền tốt : tốt nhất là nên dùng windows 2003 server, mỗi một site chạy một pool là tốt nhất, nhưng như thế tốn tài nguyên hơn. Account chạy web của mỗi site là riêng biệt và account chạy ASP.NET khác account chạy asp, php,... Việc set permission là cựu kỳ quan trọng, để làm tốt việc này, cần phải đọc thêm tài liệu và làm tốt các security check list của Microsoft. Lưu ý là không dùng Default pool để chạy. Thường là các server riêng rất hay gặp lỗi này vì admin những server này chỉ cần cài cho chạy được là xong nhưng ngược lại server riêng thường chỉ chạy 1 vài site. Cái nguy hiểm chính là ở chỗ này, nếu mà server riêng bị tấn công khả năng mất quyền kiểm soát và mất mát dữ liệu nhiều là rất cao. \u003cp\>\u003cstrong\>3. FTP local\u003c/strong\>\u003c/p\> \u003cp\>Cái này nghe có vẻ lạ nhưng cách khai thác lại cực kỳ đơn giản, tôi lấy chính site của tôi làm VD. Vì lỗi này tôi đã thông báo và chỉ cho admin cách fix. (mới fix thôi nhé, không biết đã hết chưa, không khéo chỉ fix mỗi acc của tôi, hôm sau lỗ source là toi happy)\u003c/p\> \u003cp\>\u003cstrong\>\u003ca href\u003d\"http://www.guru.net.vn/content/binary/WindowsLiveWriter/Localhackvcchphngtrch_EC14/ftp2%5B2%5D.jpg\" target\u003d\"_blank\" onclick\u003d\"return top.js.OpenExtLink(window,event,this)\"\>\u003cimg style\u003d\"border-right:0px;border-top:0px;border-left:0px;border-bottom:0px\" height\u003d\"480\" src\u003d\"http://www.guru.net.vn/content/binary/WindowsLiveWriter/Localhackvcchphngtrch_EC14/ftp2_thumb.jpg\" width\u003d\"640\" border\u003d\"0\"\>\u003c/a\> \u003c/strong\>\u003c/p\> \u003cp\>Trên hình bạn đã nhìn thấy rồi đó, cái FTP trên là tôi login vào acc FTP của tôi, nhưng tôi có thể vào tất cả các FTP khác cùng server.\u003c/p\> \u003cp\>Vậy lỗi ở đâu ? Lỗi có thể do 2 khả năng : \u003c/p\> \u003cp\>- Tham số Fix Home dir (ko nhớ rõ) không được set\u003c/p\> \u003cp\>- Tất cả các user FTP chung group và group này có quyền đối với tất cả các thư mục của các acc thành phần.\u003c/p\> \u003cp\>\u003cstrong\>--> Cách fix ? \u003c/strong\>như tôi trình bày như trên thì bạn đã biết fix rồi chứ happy.\u003c/p\> \u003cp\>Bài này tôi viết mang tính chất tổng hợp, 2 phần trên tôi không lấy hình minh họa vì nó khá phổ biến và có nhiều bài minh họa rồi. Nếu bạn cảm thấy chỗ nào cần chi tiết hơn tôi sẽ viết tiếp.\u003c/p\> \u003cp\>Mong các bạn góp ý để bài viết đầy đủ hơn.\u003c/p\>\u003cp\>Post page: \u003ca href\u003d\"http://www.guru.net.vn/PermaLink.aspx?guid\u003d8184ec13-efac-44ed-b4f9-d3d65272cc9e\" target\u003d\"_blank\" onclick\u003d\"return top.js.OpenExtLink(window,event,this)\"\>http://www.guru.net.vn\u003cWBR\>/PermaLink.aspx?guid\u003d8184ec13\u003cWBR\>-efac-44ed-b4f9-d3d65272cc9e\u003c/a\>\u003c/p\>",0] ); //-->

3. FTP local

Cái này nghe có vẻ lạ nhưng cách khai thác lại cực kỳ đơn giản, tôi lấy chính site của tôi làm VD. Vì lỗi này tôi đã thông báo và chỉ cho admin cách fix. (mới fix thôi nhé, không biết đã hết chưa, không khéo chỉ fix mỗi acc của tôi, hôm sau lỗ source là toi happy)

Trên hình bạn đã nhìn thấy rồi đó, cái FTP trên là tôi login vào acc FTP của tôi, nhưng tôi có thể vào tất cả các FTP khác cùng server.

Vậy lỗi ở đâu ? Lỗi có thể do 2 khả năng :

- Tham số Fix Home dir (ko nhớ rõ) không được set

- Tất cả các user FTP chung group và group này có quyền đối với tất cả các thư mục của các acc thành phần.

--> Cách fix ? như tôi trình bày như trên thì bạn đã biết fix rồi chứ happy.

Bài này tôi viết mang tính chất tổng hợp, 2 phần trên tôi không lấy hình minh họa vì nó khá phổ biến và có nhiều bài minh họa rồi. Nếu bạn cảm thấy chỗ nào cần chi tiết hơn tôi sẽ viết tiếp.

reflink:http://ceh.vn/ceh3/index.php?option=com_content&view=article&id=129:local-hack-va-cach-phong-tranh-&catid=17:gii-phap-bo-mt&Itemid=106