【CpawCTF】Q7.[Reversing] Can you execute ?
今回は「CpawCTF - Main page」の「Level 1 - Q7.[Reversing] Can you execute ?」を解きたいと思います。
環境
- Windows10
- Google Chrome
- VirtualBox(6.0.10)
- Ubuntu server 16.04
Q7.[Reversing] Can you execute ?
Q7.[Reversing] Can you execute ?にアクセスすると、このような説明書きと問題ファイルのダウンロードリングがありました。
拡張子がないファイルを貰ってこのファイルを実行しろと言われたが、どうしたら実行出来るのだろうか。 この場合、UnixやLinuxのとあるコマンドを使ってファイルの種類を調べて、適切なOSで実行するのが一般的らしいが… 問題ファイル: exec_me
説明文に『UnixやLinuxのとあるコマンド』とあるので、Linuxで試したいところですが、私のPCのOSはWindowsです。
Windowsで他のOSを扱うには、仮想化技術を利用するのが良いと思います。また、仮想化技術を利用するのは他のOSを扱う以外に、内容が知れないファイルを実行するときに、PCに影響を及ぼさない(サンドボックス)という利点もあります。
そして、仮想化技術で有名なものに「VirtualBox」があります。PCにVirtualBoxをインストールしていない方はインストールしてください。
「VirtualBox」については、過去記事でも紹介していますので、インストール手順が分からない方は参考程度にどうぞ。
また、VirtualBoxでOSを立ち上げる手順が分からない方は、過去記事の「Ubuntu 16.04のインストール【Windows10】」を参考にして、Ubuntu 16.04のVMを作成してください。その際に、「OpenSSH Server」のインストールも併せて行ってください。
では、Ubuntuでファイルの種類などを確認するために、Windows側でファイルをダウンロードしましょう。
問題ファイルのリンクをクリックします。
デフォルトであれば「ダウンロード」フォルダにファイルがあるはずです。
ダウンロードした「exec_me」をUbuntuにSCPでコピーします。
UbuntuにSCPを行うには、Windows(ホストOS)にループバックしてポート転送を使います。
この設定は、下記の手順で行ってください。
- VitrualBoxを起動します。
- 起動したら作成したUbuntuを選択します。
- Ubuntuを選択した状態で「設定(S)」をクリックします。
- 左側「ネットワーク」を選択します。
- ネットワークの項目にある「高度(D)」を開いて、「ポートフォワード(P)」をクリックします。
- 右側の「+」をクリックして、ルールを追加します。
名前を「ssh」、ホストポートを「10022」、ゲストポートを「22」で作成します。 - 「ポートフォワーディングルール」と「設定」を「OK」で閉じます。
- Ubuntuを起動します。
これで、Ubuntuにファイルをコピーする準備が整ったのでさっそくコピーします。 SCPは下記の二つの方法があります。
コマンドプロンプトやパワーシェルでSCPコマンドが使える場合は、コマンドで行いましょう。コマンドプロンプトで「scp」と入力して、下図のように表示されればコマンドが利用できます。
では、UbuntuにSCPします。
書式は下記です。
scp [-P 送信先ポート番号] 送信したいファイルパス 送信先ユーザ名@送信先:送信先ディレクトリ
デフォルトの設定であれば、下記のユーザ名1、2を修正するだけで大丈夫です。
ユーザ名1には「Windows」のユーザ名、ユーザ名2には「Ubuntu」のユーザ名を入れてください。
C:\Users> scp -P 10022 C:\Users\ユーザ名1\Downloads\exec_me ユーザ名2@localhost:~/
コマンドを実行すると下記のように「yes/no」と聞かれるので「yes」と入力してください。
The authenticity of host '[localhost]:10022 ([127.0.0.1]:10022)' can't be established. ECDSA key fingerprint is SHA256:KiLXecxA9g87ZZfEnG3hvFYYoVgoTNpT8Zq2uFXwM78. Are you sure you want to continue connecting (yes/no)? Warning: Permanently added '[localhost]:10022' (ECDSA) to the list of known hosts.
Ubuntuユーザのパスワードを聞かれますので、パスワードを入力します。
これで、コピーできました。
ユーザ名@localhost's password: exec_me 100% 8556 4.2MB/s 00:00
ここからはUbuntuの操作に移ります。
まずは、Ubuntuにログインしましょう。
ログインしたら「ls」コマンドでコピーできているか確認します。
ファイルを確認出来たら「file」コマンドを使って、ファイルの種類を確認します。
exec_me: ELF 64-bit LSB executable~
という箇所でググってみるとわかりますが、これはLinuxでの実行ファイルを意味します。(WindowsでいうEXEファイルですね)
では実行してみましょう。実行するときはそのファイル自体を記述してEnterを押下します。(※「./」はカレントディレクトリという意味です)
./exec_me
日本語でインストールしたので、文字化けして何が何だか分かりません笑
エラーを見るためにコマンドプロンプトかパワーシェルで、Ubuntuに「SSH」をしたいと思います。
SSHコマンドが使えない場合は、SSHコマンドを使えるようにするか「Tera Term」などを利用してください。ちなみに、Tera TermはSCPも簡単にできます。
では、コマンドプロンプトでSSHしてみます。SSHコマンドの書式は下記のとおりです。
ssh [-p 接続先ポート番号] 接続先ユーザ名@接続先
今回のように、PC上で稼働しているVMにSSHする場合は、下記のように記述します。
ssh -p 10022 接続先ユーザ名@localhost
私の場合は、Ubuntuの「user」というユーザにSSHします。
接続時にユーザのパスワードを求められるので、入力してください。
SSHできたので、再度「exec_me」を実行してみます。
先程文字化けしていたエラーが出ました。
おそらくパーミッション(権限)の問題でしょう。
「ls -l」コマンドでパーミッションを確認します。
やはり、実行権限が付与されていません。
パーミッションは下記のような順番になっています。
-rw-rw-r-- 種類 所有者 グループ 他ユーザ
種類
ファイルの場合は「-」、ディレクトリなら「d」などと記載されます。所有者
対象のファイルやディレクトリの所有者(ユーザ)に対する権限を表します。
「rwx」の順で表示され「読み込み、書き込み、実行」という意味です。
「-」になっている所は権限がないという意味です。
また、「rwx」をよく10進数の「7」で表現します。(7=2進数「111」、「rw-」なら「6(110)」)グループ
所有者(ユーザ)が所属するグループに対する権限を表します。
権限の表示は所有者と同じです。他ユーザ
所有者でもなく、所有者と同じグループにも所属しないユーザ、に対する権限を表します。
権限の表示は所有者と同じです。
ということで、「chmod」コマンドでパーミッションを「777」に変更したいと思います。
「chmod」コマンドの書式は下記です。
chmod 権限 対象のファイル or ディレクトリ
では、実行しましょう。出力はありません。
実行したら再度「ls -l」でパーミッションを確認します。
これで実行できるようになったはずです。
再度実行しましょう。
フラグが出ました!(※わざと、塗りつぶしています)
あとはこれを入力します。
今回はこれで完了です。
参考:
https://ctf.cpaw.site/index.php
https://ryasshi.hatenablog.com/entry/2019/07/21/111023
https://ryasshi.hatenablog.com/entry/2019/08/10/201204
https://forest.watch.impress.co.jp/library/software/utf8teraterm/