Bài tập 1: Lập trình Ruby Cơ bản

Mục tiêu

  • Tạo các đoạn mã Ruby cơ bản và trích xuất dữ liệu, khám phá các tính năng và thành phần của Ruby.

Các công việc trong bài tập

  1. Nhấp vào Ruby Machine để đến Ruby-Machine. Nhấp vào hồ sơ Student, nhập password vào trường Password và nhấn Enter.[Hình ảnh màn hình đăng nhập với tên người dùng “Student” và trường mật khẩu]
  2. Tạo chương trình đơn giản đầu tiên của bạn, mở một cửa sổ đầu cuối và nhập irb. Sau đó, nhập đoạn mã được hiển thị tiếp theo: puts "Đây là chuỗi đầu tiên của tôi trong Ruby"
  1. Use code with caution.Ruby
  2. Một ví dụ về kết quả đầu ra từ lệnh được hiển thị trong ảnh chụp màn hình.[Hình ảnh màn hình đầu cuối hiển thị lệnh irb, lệnh puts “Đây là chuỗi đầu tiên của tôi trong Ruby” và kết quả đầu ra “Đây là chuỗi đầu tiên của tôi trong Ruby”]
  3. Đây là một phương pháp đơn giản để tạo một chương trình tạo ra một chuỗi.
  4. Lưu ý rằng irb sẽ thực hiện các phép tính khi được nhập. Nhập 3*5 trong cửa sổ irb và nhấn Enter, sau đó nhập 3**2 và nhấn Enter. Kết quả đầu ra từ cả hai lệnh được hiển thị trong ảnh chụp màn hình.[Hình ảnh màn hình đầu cuối hiển thị lệnh irb, các lệnh 3*5 và 3**2, và kết quả đầu ra tương ứng là 15 và 9]
  5. Như ảnh chụp màn hình cho thấy, ** là lũy thừa. Tiếp theo, hãy khám phá các khả năng mở rộng khác nhau của Ruby. Thoát khỏi irb.
  6. Nhập irb –prompt-mode simple. Sau đó, nhập những điều sau:a. char “A”
    b. char = “A”
    c. char.unpack(“C”)
    d. char.unpack(“C”).first
    e. char.unpack(“C”).first.to_s(16)
    f. char.unpack(“C”).first.to_s(2)
    g. char.unpack(“C”).first.to_s(2).to_i
    h. “%08d” % char.unpack(“C”).first.to_s(2).to_i[Hình ảnh màn hình đầu cuối hiển thị các lệnh và kết quả đầu ra của chúng]
  7. Bây giờ bạn đã khám phá các phần mở rộng khác nhau này, hãy khám phá một ví dụ khác.
  8. Mục tiêu của bạn là xây dựng một trình quét Giao thức phân giải địa chỉ đơn giản (ARP) trong Ruby. Lưu ý rằng Ruby không có mô-đun ARP, vì vậy bạn có thể sử dụng quyền truy cập vào thư mục /proc để lấy dữ liệu.
  9. Trong trình soạn thảo bạn chọn, hãy nhập đoạn mã sau:[Hình ảnh màn hình trình soạn thảo văn bản chứa mã Ruby cho trình quét ARP]
  10. Khi bạn đã nhập mã, hãy lưu tệp dưới tên arpscanner.rb.[Hình ảnh màn hình hộp thoại lưu tệp với tên tệp “arpscanner.rb”]
  11. Chạy arpscanner.rb bằng lệnh sau:ruby arpscanner.rb[Hình ảnh hộp thoại lưu, hiển thị việc lưu tệp với tên arpscanner.rb]
  12. Đoạn mã được giải thích bên dưới.o Đoạn mã bắt đầu bằng các lệnh gọi chuẩn để tạo một socket. Sau đó, sử dụng khả năng send để gửi dữ liệu vào cổng Giao thức Đồ thị Người dùng (UDP) 53, vì bạn cần truy xuất các phản hồi ARP, được lưu trữ trong loại socket s.o Nếu máy chủ đang hoạt động, mục nhập ARP sẽ được thêm vào bộ đệm ARP của hệ điều hành và sẽ có địa chỉ nhà cung cấp dịch vụ internet (IP) được gán cho nó. Duyệt bộ đệm ARP này cho thấy máy chủ nào đang hoạt động.o Để liệt kê không gian IP, hãy sử dụng toán tử times của lớp Fixnum — lớp cho các số chưa được gán cho biến. Toán tử times lặp từ 0 đến 254 và gán giá trị hiện tại cho biến i của chúng ta. Nếu i bằng 0, hãy bỏ qua nó, vì bạn chỉ muốn các địa chỉ IP có thể sử dụng trong mạng con. Đối với các lần lặp tiếp theo, hãy thêm nó vào mạng con 192.168.177.o Khi các gói UDP được gửi, hãy sử dụng hệ thống tệp proc để truy cập trực tiếp vào bảng ARP của hệ thống. Đối với bước này, bạn cần chạy hệ thống Linux hoặc UNIX.o Vì bạn đã tách kết quả đầu ra trên các ký tự xuống dòng, bạn sẽ có một mảng, với mỗi giá trị là một mục nhập ARP. Tạo một mảng trống mới có tên up_hosts bằng cú pháp mảng của []. Lặp qua từng dòng, mỗi lần gán dòng từ bộ đệm ARP cho biến line.o Cuối cùng, nếu bạn có một mục nhập ARP tốt, hãy tạo một hash bằng cú pháp {} và sử dụng các ký hiệu :ip và mac làm khóa cho các giá trị được phân tích cú pháp. Gán mỗi khóa giá trị với toán tử =>. Hai trường bạn muốn là địa chỉ IP, là phần tử đầu tiên trong trường và địa chỉ MAC, là phần tử thứ tư. Vì mảng bắt đầu bằng chỉ số 0, hãy đếm từ 0, tạo ra các trường mảng là 0 và 3. Bây giờ bạn đã có hash, hãy thêm nó vào cuối mảng up_hosts bằng cú pháp thêm <<, dẫn đến hash xuất hiện dưới dạng phần tử cuối cùng của mảng đó.o Bây giờ bạn có một mảng các hash chứa các máy chủ được tìm thấy thông qua phân giải ARP. In chúng theo định dạng dễ xem. Bắt đầu bằng cách in tiêu đề bằng chuỗi định dạng in. Sử dụng %s để biểu thị chuỗi và %-12s để biểu thị chuỗi 12 ký tự được căn chỉnh trái.
  13. Tiếp theo, khám phá các câu lệnh điều khiển. Mở một trình soạn thảo văn bản mới và nhập mã, như được hiển thị trong ảnh chụp màn hình.[Hình ảnh màn hình trình soạn thảo văn bản chứa mã Ruby với các câu lệnh điều khiển]
  14. Đoạn mã này là để hiển thị một ví dụ về các câu lệnh “if else”, hoạt động giống như các câu lệnh khác.
  15. Lưu tệp dưới tên control_statements.rb.[Hình ảnh hộp thoại lưu tệp với tên tệp “control_statements.rb”]
  16. Chạy lệnh ruby control_statements.rb, liệt kê các lần đăng nhập cuối cùng cho hệ thống. Đặt lệnh cuối cùng trong dấu trọng âm hoặc dấu ngoặc kép ngược (`) để hướng dẫn Ruby chạy lệnh trong hệ điều hành và sau đó trả về stdout cho ứng dụng. Việc thực thi trả về một chuỗi; tách nó dựa trên các dòng mới và gán cho mảng dữ liệu.[Hình ảnh màn hình đầu cuối hiển thị lệnh ruby control_statements.rb và kết quả đầu ra của nó]
  17. Tạo một đoạn mã để kết nối và lấy banner web; nhập mã được hiển thị trong ảnh chụp màn hình. Lưu tệp dưới tên web.rb.[Hình ảnh màn hình trình soạn thảo văn bản chứa mã Ruby cho đoạn mã web]
  18. Chạy lệnh ruby web.rb. Một ví dụ về kết quả khi đoạn mã được chạy được hiển thị trong ảnh chụp màn hình.[Hình ảnh màn hình đầu cuối hiển thị lệnh ruby web.rb 192.168.177.200 và kết quả đầu ra của nó]
  19. Đoạn mã cuối cùng trong bài tập này sẽ là đoạn mã Thao tác Tệp để trích xuất thông tin về hệ thống tệp.
  20. Lưu ý rằng trình thông dịch Ruby không mạnh mẽ như một số ngôn ngữ khác theo mặc định.
  21. Trong trình soạn thảo bạn chọn, hãy nhập đoạn mã sau và lưu nó dưới tên file-man.rb.[Hình ảnh màn hình trình soạn thảo văn bản chứa mã Ruby cho đoạn mã thao tác tệp]
  22. Khi bạn chạy lệnh này, hãy đảm bảo là root. Nhập sudo -i.
  23. Sau đó, quay lại “home for student” bằng cách nhập cd /home/student.
  24. Nhập ruby file-man.rb 1.
  25. Đầu tiên tham chiếu số PID 1, sau đó xuất chi tiết.[Hình ảnh màn hình đầu cuối hiển thị các lệnh sudo -i, cd /home/student, ruby file-man.rb 1 và kết quả đầu ra của chúng]
  26. Bài tập này kết thúc tại đây.

Bài tập 2: Lập trình Socket Ruby Cơ bản

Mục tiêu

  • Tạo các đoạn mã Ruby kết nối mạng và trích xuất dữ liệu, khám phá các tính năng và thành phần của socket Ruby.

Các công việc trong bài tập

  1. Đối với bài tập tiếp theo, hãy xây dựng máy khách và máy chủ của bạn. Nhập mã được hiển thị trong ảnh chụp màn hình và lưu nó dưới tên client.rb.[Hình ảnh màn hình trình soạn thảo văn bản chứa mã Ruby cho máy khách]
  2. Thiết lập đoạn mã Ruby của bạn và bao gồm mô-đun socket. Sau đó, xác định máy chủ để kết nối và chèn HTML độc hại. Để HTML hợp lệ, hãy sử dụng dấu ngoặc đơn. Apache sẽ thoát dấu ngoặc kép, nhưng không phải dấu ngoặc đơn. Cuối cùng, thiết lập yêu cầu độc hại của bạn. Yêu cầu của bạn đưa ra lệnh GET cho máy chủ yêu cầu trang gốc của máy chủ web bằng cú pháp HTTP 1.1. Bao gồm tên máy chủ của máy chủ đích của bạn và thêm trường Tác nhân người dùng với HTML độc hại trong đó.
  3. Sau đó, tạo một đối tượng socket bằng phương thức TCPSocket open bằng cách sử dụng tên máy chủ và cổng cho máy chủ đích. Socket sẽ hoạt động giống như bất kỳ socket chung nào. Bất kể loại socket bạn mở là gì, các lệnh này sẽ giống hệt nhau. Sử dụng phương thức print của socket để gửi dữ liệu đến máy chủ từ xa. Trong trường hợp này, bạn đang gửi yêu cầu HTTP độc hại đến máy chủ. Quan sát những gì quay trở lại, để bạn biết yêu cầu của mình có hoạt động hay không. Để làm điều này, hãy thiết lập một vòng lặp truy xuất dữ liệu từ máy chủ từ xa một chuỗi tại một thời điểm bằng phương thức “gets” và in nó ra màn hình cho đến khi bạn nhận được thẻ HTML đóng. Khi bạn nhận được thẻ HTML đóng, hãy dừng đọc và đóng kết nối.
  4. Tiếp theo, hãy nhập mã máy chủ của bạn và lưu nó dưới tên server.rb.[Hình ảnh màn hình trình soạn thảo văn bản chứa mã Ruby cho máy chủ]
  5. Tạo một máy chủ sẽ lắng nghe trên cổng 8080. Khi một kết nối đến xảy ra, hãy ghi lại thông tin yêu cầu và trả về một cái gì đó cho trình duyệt để cho nó biết không có nội dung. Điều này cho phép trang web đã gọi đoạn mã của bạn hoàn thành việc hiển thị. Tiếp theo, tạo một socket lắng nghe. Sử dụng lớp TCPServer, vì nó sẽ cho phép bạn chấp nhận các kết nối mới dưới dạng các đối tượng socket.
  6. Bao gồm mô-đun socket của bạn và tạo một banner trả về thông báo 200 OK. Điều này cho trình duyệt web biết rằng truy vấn đã được chấp nhận suôn sẻ. Tiếp theo, thiết lập tiêu đề để cho biết không có nội dung, cung cấp thông tin ngày tháng và loại nội dung để làm cho trình duyệt hài lòng. Kết thúc bằng hai dòng mới, để trình duyệt biết rằng thông báo của bạn đã hoàn thành. Thông báo banner là những gì bạn cung cấp cho bất kỳ kết nối nào bất kể những gì được yêu cầu. Điều thú vị ở đây là ai đã yêu cầu trang của bạn và từ đâu họ được giới thiệu đến bạn. Khi bạn biết thông tin này, hãy tiếp tục. Phương thức TCPServer open nhận hai tùy chọn: máy chủ để liên kết socket và cổng.
  7. Tiếp theo, tạo một vòng lặp sẽ chấp nhận các yêu cầu đến. Xử lý yêu cầu cho thông tin bạn muốn ghi lại và gửi máy khách trên đường đi của nó. Khi bạn có thông tin bạn muốn, hãy in nó ra màn hình cho mục đích ghi nhật ký và đợi kết nối tiếp theo. Để làm điều này, hãy tạo một vòng lặp vô tận chờ các kết nối đến. Cách duy nhất để dừng đoạn mã sẽ là phát ra chuỗi Ctrl+c.
  8. Tạo một vòng lặp vô tận và sử dụng phương thức TCPServer accept để chấp nhận các kết nối mới. Đoạn mã sẽ bị treo cho đến khi một kết nối mới xuất hiện.
  9. Tạo một hash mới có tên là headers và xử lý các dòng yêu cầu bằng cách gán từng dòng trong vòng lặp cho biến line. Mỗi dòng của tiêu đề sẽ là một chuỗi chứa một cặp khóa-giá trị được phân tách bằng dấu hai chấm. Sử dụng phương thức split của lớp String để tạo các cặp khóa-giá trị và gán chúng cho k và v, tương ứng. Sau đó, sử dụng hash để lưu trữ cặp khóa-giá trị, vì vậy bạn có thể trực tiếp truy cập vào các trường cần thiết. Khi tiêu đề được phân tích cú pháp, hãy in thời gian và địa chỉ từ xa của máy khách
  10. Tạo một đoạn mã PHP cho phép bạn chạy đoạn mã; nhập nội dung sau và lưu nó dưới tên test.php:[Hình ảnh màn hình trình soạn thảo văn bản chứa mã PHP]
  11. Đoạn mã PHP này in ra thẻ pre-HTML để cho biết rằng đầu ra đã được định dạng trước. Sau đó, nó thực thi lệnh cat trên nhật ký truy cập web và sử dụng lệnh passthru của PHP để in đầu ra ra màn hình. Đây là một trình xem nhật ký nhanh chóng và dễ dàng với lỗ hổng nghiêm trọng. Nó không làm sạch đầu ra. Nếu bạn tạo một đoạn mã chèn HTML vào nhật ký, đoạn mã PHP sẽ vui vẻ hiển thị nó trong trình duyệt web của quản trị viên không nghi ngờ. Để điều này hoạt động, quản trị viên hệ thống cũng phải thay đổi chế độ trên thư mục nhật ký Apache để có thể đọc được trên toàn thế giới.
  12. Sao chép tệp vào thư mục /var/www/html, sau đó nhập các lệnh chmod 755 /var/log/apache2 và chmod 644 /var/log/apache2/. Xác minh rằng máy chủ web đang chạy bằng cách nhập netstat -atn | grep 80.Nếu Apache không chạy, hãy nhập service apache2 start.[Hình ảnh màn hình đầu cuối hiển thị các lệnh cp, chmod, netstat và kết quả đầu ra của chúng]
  13. Chuỗi sự kiện cho cuộc tấn công như sau:a. Mã máy khách i. Mở kết nối đến máy chủ web dễ bị tấn công ii. Tạo yêu cầu cho trang với đoạn mã độc hại trong trường Tác nhân người dùng iii. Truy xuất và in kết quả đầu ra từ yêu cầu ra màn hình iv. Đợi quản trị viên chạy đoạn mã

Use code with caution.

b. Mã máy chủ

      i. Mở một socket và đợi quản trị viên chạy đoạn mã



ii. Nhận yêu cầu HTTP từ trình duyệt web của quản trị viên và in dữ liệu ra màn hình




iii. Trả về mã 200 cho trình duyệt web của quản trị viên, cho biết mọi thứ đều ổn
    

Use code with caution.

Khi quản trị viên của bạn tiếp theo xem nhật ký, trình duyệt sẽ thấy HTML độc hại và thực hiện yêu cầu trong nền để lấy đoạn mã từ localhost trên cổng 8080. Bạn có thể phân phối hầu hết mọi đoạn mã cho trình duyệt. Với mục đích của ví dụ này, bạn sẽ cần một máy chủ ghi nhật ký kết nối, để bạn biết những gì đã được thực thi, sau đó trả về một thông báo trống. Bằng cách này, trình duyệt tiếp tục hiển thị và quản trị viên hệ thống không biết gì hơn.

Tạo một máy chủ sẽ lắng nghe trên cổng 8080. Khi một kết nối đến xảy ra, hãy ghi lại thông tin yêu cầu và trả về một cái gì đó cho trình duyệt để cho nó biết không có nội dung. Điều này cho phép trang web đã gọi đoạn mã của bạn hoàn thành việc hiển thị.

Khi bạn đã chạy máy chủ, hãy kết nối với trang web và xử lý đoạn mã.

[Hình ảnh màn hình đầu cuối hiển thị lệnh ruby server.rb và kết quả đầu ra của nó]

[Hình ảnh màn hình trình duyệt web hiển thị kết quả của đoạn mã]

Một ví dụ về việc chạy đoạn mã in quyền truy cập từ tệp access.log được hiển thị trong ảnh chụp màn hình.

[Hình ảnh màn hình đầu cuối hiển thị lệnh ruby server.rb và đầu ra của nó, bao gồm thông tin từ tệp access.log]

Các trình duyệt hiện đại có thể loại bỏ các thẻ. Vào thời điểm bạn đọc bài viết này, trình duyệt có thể bảo vệ khỏi điều này và chuỗi sẽ yêu cầu sửa đổi. Đây có thể là một thách thức nữa, điều này đòi hỏi phải sử dụng Metasploit.

Bài tập này kết thúc tại đây.

Bình luận về bài viết này

Thịnh hành