ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。(編集:株式会社ラック・デジタルペンテスト部)
/ セキュリティブログ / セキュリティエンジニア /
当ウェブサイトをご利用の際には、こちらの「サイトのご利用条件」をご確認ください。

デジタルペンテスト部提供サービス:
ペネトレーションテスト
セキュリティ診断

OSCPにも役立つ!Kali Linux環境構築(tmux&ログ管理)を解説

デジタルペンテスト部の渡邉です。
2年ほど前にOSCP受験期を書かせていただき、今回が2回目の投稿となります。
前回の投稿からおよそ2年がたち、その間にOSEPにも合格できました。
まだまだ学ぶことは多いものの、当時に比べれば少しは成長できたのではないかと思います。

そこで今回は、当時OSCPを勉強し始めた時から今に至るまで、私が気に入っているkaliのセットアップの一部を紹介しようと思います。

zshrcの設定

私は普段、zshrcファイルに下記の設定を追記し、tmuxとロギングの設定を行っています。

# tmux
if [ "$SHLVL" = "1" ] && [ -z "$TMUX" ]; then
    tmux
    return
fi

# logging
if [ -z "$SCRIPT_LOGGING_STARTED" ]; then
    export SCRIPT_LOGGING_STARTED=1
    mkdir -p "$HOME/.logs"
    exec script -f $HOME/.logs/`date "+%Y_%m_%d_%H%M%S_%N"`.log
fi

ペンテスト中はツール単体のログもさることながら、調査を続けていくうちに出力が大量になり、スクロールが面倒です。
また仮想マシン上のスクロールバーでは、細かい操作が難しい場合があるため、tmuxを使っています。
tmuxの細かな設定については後ほど紹介します。

続いてscriptコマンドを使ったロギングですが、心配性の私が特に気に入っている設定で、これを設定しておくことでzshを起動したタイミングでscriptコマンドが実行され、~/.logs フォルダに自動でログをバックアップすることが可能です。

ロギングの開始

┌──(kali㉿kali)-[~]
└─$ ls -1 ~/.logs
2099_01_01_130125_949117671.log
2099_01_01_130247_061183868.log
2099_01_01_130248_053481870.log
2099_01_01_130248_846345855.log
2099_01_01_130249_606605719.log

調査中、ログやレポートに記載するテキスト・スクリーンショットなどの証跡はその場で確保するようにしています。
しかし、コマンドは実行したはずなのに結果が残せていなかった、レポートを書いている途中にあのログがやっぱりほしくなった、と思うことが稀にあります。
そのため活躍の場面は少ないですが、この設定を入れておくことで万が一の際でもログを回収できるようにしています。

ただし注意点があり、ログを出力した際に若干表示がおかしくなる場合もあるため、本設定を過信しすぎず、基本的にはログや証跡はその場で確保するようにしましょう。

保存したログは以下のようにcatすることで当時の作業を再現することができます。
色まで再現されるため若干わかりづらいですが、Script started から Script done までがファイルの中身で、その間に出力されているのは別のシェル上で実行されたログになります。

慣れないうちは、どれがログなのか判断が難しく頭が混乱するため、ログを確認する際は新しいシェルを立ち上げて、必要ならプロンプトを変更してからcatするとよいと思います。
kaliであれば Ctrl + p でプロンプトが変更できます。

ログファイルの出力
このようにログを残しておくことで、ログの取り忘れがあった場合などでも当時のログをターミナル上に再現し、必要なログを回収することができます。

tmuxの設定

続いてtmuxの設定です。以下は、私が普段利用している設定です。
下記の設定を ~/.tmux.conf に記載することで設定を有効にできます。
各設定の解説は省きますが、後ほど実際の操作方法と一緒にどんなことができるのか紹介しようと思います。

なお、以降の説明はすべて下記設定が有効化された状態をもとに記載しています。
デフォルトでは有効化されていないショートカットキーなどもあるため、同じ動作を試したい方はぜひこちらを有効化してから試してみてください。

# prefixキーをC-kに変更
set -g prefix C-k

# C-bのキーバインドを解除
unbind C-b

# 設定ファイルをリロードする
bind r source-file ~/.tmux.conf \; display "Reloaded!"

# ウィンドウ履歴の最大行数
set-option -g history-limit 1000000

# tmux起動時のシェルをzshにする
set-option -g default-shell /bin/zsh

# tmuxを256色表示できるようにする
set -g default-terminal screen-256color
set -g terminal-overrides 'xterm:colors=256'

# 左右のステータスバーの長さを決定する
set-option -g status-left-length 80
set-option -g status-right-length 80

# ステータスバー最左にホスト名・ペイン番号を表示する
set-option -g status-left '#H:[#P]'

# ステータスバー右側にホスト名・時刻・日付を表示する
set-option -g status-right '"#H" %H:%M %d-%b-%y'

# ステータスバーを1秒毎に描画し直す
set-option -g status-interval 1

# センタライズ(主にウィンドウ番号など)
set-option -g status-justify centre

# ステータスバーの中央に現在のウインドウ名を表示する
set -g window-status-format ''
set -g window-status-current-format '#I:#W'

# ステータスバーの色を設定する
set -g status-fg white
set -g status-bg black

# vimのキーバインドでペインを移動する
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# vimのキーバインドでペインをリサイズする
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

# 新規ウインドを作成する
bind c new-window -c '#{pane_current_path}'

# | でペインを左右分割する
bind | split-window -h -c '#{pane_current_path}'

# - でペインを上下分割する
bind - split-window -v -c '#{pane_current_path}'

# マウス操作を有効にする
set-option -g mouse on
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"

# コピーモードでvimキーバインドを使う
setw -g mode-keys vi

# 'v' で選択を始める
bind -T copy-mode-vi v send -X begin-selection

# 'V' で行選択する
bind -T copy-mode-vi V send -X select-line

# 'C-v' で矩形選択する
bind -T copy-mode-vi C-v send-keys -X begin-selection \; send-keys -X rectangle-toggle

# 'y' で選択範囲をクリップボードにコピーする
bind -T copy-mode-vi y send-keys -X copy-pipe "xsel -bi"

# 'Enter' でキャンセルする
bind -T copy-mode-vi Enter send-keys -X cancel

文字列のコピーで利用するため xsel のインストールが必要です。
利用シーンは後ほど改めて紹介します。

$ sudo apt install -y xsel

tmuxの基本操作

私もそこまで多くのショートカットを覚えているわけではありませんが、よく使うものを中心にここでは紹介したいと思います。

tmuxはprefixキーと呼ばれる特定のキーを押した後、任意のキーを押すことで機能を実行できます。
デフォルトでは Ctrl + b がprefixキーになりますが、私はBキーが苦手なのでKに変更しています。
以降、もし私の設定をまねされる方がいたら、prefixキーと書かれている場所は Ctrl + k と読み替えてください。

# prefixキーをC-kに変更
set -g prefix C-k

余談ですが、最初は押しやすさからprefixキーを Ctrl + j にしていたのですが、Claude Codeなどを使う際、プロンプトの改行に Ctrl + j が必要だと判明し、そこから Ctrl + k に移行しました。

ペインの分割と移動

続いてペインの話になります。ペインの説明は省きます。まずは使ってみましょう。

ターミナルを起動しペインの分割を試します。
zshrcにtmuxの起動を設定していない方は tmux コマンドを実行して起動してください。

ペインは prefixキーを押した後に |(パイプ) を押すことで左右に分割、 -(ハイフン) を押すことで上下に分割できます。
縦線を引きたいなら | 、横線を引きたいなら - ということです。

ペインの分割機能を活用することで、例えば左上でferoxbusterを実行しながら、右側でnmapの結果を再確認、左下でhttpサーバーを立てるなど、様々な操作を一つのウインドウで同時に実行することができます。
ちなみにロギングの設定を入れている場合、各ペインでそれぞれ異なるファイルにログがバックアップされます。そのためログが混ざったりする心配はありません。

ペインの分割

そして次にペインの移動です。画像では左上のペインでカーソルがアクティブな状態になっています。
左下や右を使いたいとき、マウスでクリックしてもよいですが、私の設定の場合vimのキーバインドでカーソルも移動できます。
どういうことかというと、画像の状態で右側に行きたいなら prefix → l、左下に行きたいなら prefix → j で移動ができます。
こうすることでホームポジションから手を動かさず移動ができます。
ちなみに prefix → 矢印キー でも移動できます。

ペインの終了は、終了したいペインを選択した状態で prefix → x を押すとできます。

ペインのサイズを変更したい場合は、マウスで境界線を移動できるのでお好みの位置へ調整してください。
または prefix → (HJKL) でも、上下左右好きなようにサイズを変更できます。

ウインドウの作成

ペインの分割だけだと段々と作業スペースが狭くなって逆に使いづらくなってしまいます。
では次にどうするかというと今度はウインドウを作成します。
ウインドウの作成は prefix → c で可能です。
作成すると分割もされていない新しいウインドウが立ち上がります。

prefix → w を押すことでウインドウの一覧を表示できます。
矢印キーもしくは j(上)k(下) でウインドウを選択し、Enterキーでウインドウを切り替えられます。

私はOSCP受験の際、下記の画像のようにある程度作業場所・ウインドウを整理してからスタートしていました。
名前を変えたいウインドウを選択した状態で、: を押してから rename-window <ウインドウ名> で名前を変更できます。

openvpnのウインドウは、そのままの意味でopenvpnを実行しているだけです。
たまにここでhttpサーバーを立てたり、mtuの調整をしたりすることもあります。

その他は各ホスト1ウインドウを基本としています。
絶対1ウインドウというわけではなく、適宜追加することもあります。
追加すると大抵の場合ぐちゃぐちゃになってしまうので、マシンの攻略完了や行き詰まったタイミングなどで追加したウインドウはこまめに消すようにしています。

ウインドウの選択

※ ホスト名やIPはダミーの値を使用しております。

ここまで丁寧にする必要はありませんが、攻略が順調でない時というのは、得てして攻略マシンをちょこちょこ切り替えてしまいたくなるものです。
そして最終的にどのマシンがどこまで進んだのかわからずに嫌になる、という負のループに陥ります。
ですので、初心者の方ほど、ある程度スタートは整えておいた方がいいと思います。

また、ウインドウを切り替えても処理は止まらないので、行き詰まった対象があれば、長めのリストでferoxbusterを回しつつ、ウインドウを切り替えて別のマシンの攻略を進めるということができます。
私はそれ以外にも試験開始時に複数のウインドウでnmapをとりあえず回してからメインのマシンを攻略するということをよくやっていました。
本当は全台回したかったですが、メインに影響を出したくないのとオープンポートの見逃しがないように、数台ずつで回していました。分割スキャンに関しては、どれほど効果があったかはわかりません。

コピーモード

tmuxにはコピーモードと呼ばれるペインの出力をコピーできる機能があります。
設定ファイルではvimライクな操作に設定しており、またxselを組み合わせることでクリップボードへのコピーも可能にしています。

例えば、linuxマシンでよく使われるlinpeasですが、便利な反面ログが大量に出力されるため、マウスでコピペしてログを保存しようとすると大変です。
ほとんどの方は必要な部分のみ抜き出すか、teeコマンドでログを保存していると思います。
それでも十分だとは思いますが、teeコマンドだと結果は保存できても実行時のコマンドが保存できないなどの問題が出てきます。
そこでこのコピーモードが活躍します。

コピーモードを使うにはまず prefix → [ か、もしくは上にスクロールをします。
すると画面の右上に黄色い枠が表示されます。
この状態がコピーモードです。

Enterを押すことでコピーモードは解除されます。

コピーモード

コピーモード中はペイン内を自由に移動することができます。
移動は hjkl もしくは矢印キーで行えます。
そしてvimと同じキーが使えるため gg で一番上、Shift + g で一番下に移動できます。
そのため、linpeasで出力が大量になっても、gg と打てば出力の一番上に移動できます。

ただしいつもlinpeasがログの一番上にくるとは限りません。
SSHの接続ログなどから始まる場合もあれば、/etc/passwd の確認などもしているかもしれません。
そういったときは、これもvim同様 /<検索ワード> で文字列を検索することができます。
そして n(次へ)N(前へ) で検索ワードを逐次確認できます。

慣れていない人はとりあえず次のコマンドを試してみてください。実行すると最初のlinpeasの実行箇所に移動できるはずです。

prefix [ → gg → /linpeas

前置きが少し長くなりましたが、次は実際にコピーする方法を紹介します。
私の設定ではコピーモード状態で v を押すと範囲選択、 Shift + v を押すことで行選択、 Ctrl + v を押すことで矩形選択できるようになります。
そして文字列を選択中に y を押すことでその文字列をコピーできます。
クリップボードへのコピーはxselを利用しているため追加のインストールが必要です。
コピーされないときは下記を試してみてください。デフォルトではインストールされていないため注意が必要です。

$ sudo apt install -y xsel

では、実際にlinpeasの結果をコピーするところまでの流れを紹介します。
まずはlinpeasの実行地点に移動します。

prefix [ → gg → /linpeas → Shift+v

開始地点の選択
linpeasのコマンド部分が行選択され、黄色くマークされた状態になっています。
これはつまりどういうことかというと、先ほどのコマンドは下記を実行していた、ということになります。

コピーモードへ遷移 → 先頭へ移動 → linpeasを検索/移動 → 行選択開始

そしてこの状態で Shift + g を押すと、下記の画像のように背景全体が黄色くなります。
これは、先ほどコマンドの先頭を行選択していた状態から、Shift + g で一番下まで選択範囲を広げたためこのようになっています。
これでコマンドラインを含むすべての出力を選択できました。

コピー範囲の選択

この状態で y を押すと選択範囲全てをコピーすることができます。
あとはテキストエディタでファイルを開きペーストすればコマンドラインも含めたすべての結果が保存できます。

もちろん、通常の範囲選択でも同様に出力全体のコピーが可能です。
私の場合、ログのコピーは行選択、コマンドラインのオプションやパスワードのコピーなどは範囲選択、と使い分けることが多い気がします。
ファイル探索中に、パスワードはコピーしたいけど行全体はいらないなという時があるので、そういったときは行選択ではなく通常の範囲選択を使います。

下記は P@ssw0rdP の位置で v を押し、末尾までカーソルを移動した例になります。
これも行選択同様に背景が黄色くなり、選択箇所が表示されます。
この状態で同じように y を押せば、今度はパスワードの値(P@ssw0rd)だけコピーすることが可能です。

範囲選択
そして最後に、これまでの操作は便利だけどやっぱりマウスでもコピーしたいという方は下記の設定を追加してみてください。
私は利用したことありませんが、これでマウスで選択した範囲をコピーできるようです。

bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xsel -bi"

まとめ

インターネット上には多くの合格体験記が公開されていますが、このような環境の話を載せている方はあまり多くないかと思います。
そのため、OSCP合格を目指している方の参考になればと思い、当時私が使用していた設定の一部を公開してみました。
OSCPに限らず、読んでくださった方のペンテストや試験の一助となれたら嬉しいです。