# 11/3 低レイヤ 勉強会 --- ## 事務連絡 ### 活動時間について 10月活動してみて、私(小俣)のキャパシティ的に週2回勉強会の準備をするのは大変だったので、 勝手ながら - 水曜3限:CTF勉強会(全員参加) - 1コマ(時間未定):OS勉強会(2年生のみ) で進めていきたいと考えています。 ### 来週について 来週 11/11はセンターで活動します ## One-gadget RCE について 基本配布した参考書を使って読み合わせる感じで進めていきます。 ただ、ここからの内容は、メモリの値など、環境によって出力される値が異なる場面が多くみられ、テキストの文を自分で読み替えること必要になってくるので、ここではヒントを書いていきます。 コマンドを打ったら、スクショやメモを取る習慣をつけていきましょう ### one-gadget RCEの検索プログラム ```test.sh sudo apt -y install ruby sudo gem install one_gadget ``` ### libc について printf(),fopen(),fread()... など 「よく使われるC言語関数」がまとめられてライブラリとなったもの #include <stdio.h>のように読み込んで使ってるアレ ### 4.2 one_gadget で One-gadget RCE のアドレスを検索 ```test.sh $ one_gadget /lib/x86_64-linux-gnu/libc.so.6 //以下の値は環境によって異なります。 //各自の出力結果を、メモするなりして使うようにしてください 0xcbdda execve("/bin/sh", r12, r13) constraints: [r12] == NULL || r12 == NULL [r13] == NULL || r13 == NULL 0xcbddd execve("/bin/sh", r12, rdx) constraints: [r12] == NULL || r12 == NULL [rdx] == NULL || rdx == NULL // ここが重要!! ------------------------- 0xcbde0 execve("/bin/sh", rsi, rdx) constraints: [rsi] == NULL || rsi == NULL [rdx] == NULL || rdx == NULL // ------------------------------------- ``` ### libc ライブラリが配置されるアドレスの調べ方 ```test.sh $ sudo sysctl -w kernel.randomize_va_space=0 kernel.randomize_va_space = 0 $ echo "int main(){}" | gcc -x c - -o rce_test $ LD_TRACE_LOADED_OBJECTS=1 ./rce_test linux-vdso.so.1 (0x00007ffff7fd0000) // libc が配置されるアドレス。//特に重要!! libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7dfd000) /lib64/ld-linux-x86-64.so.2 (0x00007ffff7fd2000) ``` ### シェルを起動するCコード ```test.c int main() { void (*rce)(int, int, int) = (void *)([libcが配置されるアドレス]LL + [one_gadget RCE("/bin/sh", rsi, rdx)のアドレス]); rce(0, 0, 0); } ``` 例: ```test.c int main(){ void (*rce)(int, int, int) = (void *)(0x00007ffff7dfd000LL + 0xcbde0); rce(0, 0, 0); } ``` ### 4.3 次のコマンドで表示します: ```a.sh $ objdump -d -M intel login3 > login3.txt $ cat login3.txt ``` ### libc中のprintfのアドレス ```a.sh $ gdb login3 gdb-peda$ b *0x40121f gdb-peda$ r gdb-peda$ x/1xg 0x404020 0x404020 <printf@got.plt>: 0x0000000000401046 gdb-peda$ ni gdb-peda$ x/1xg 0x404020 # ----------------------------------------- 0x404020 <printf@got.plt>: 0x00007ffff7e2ae10 # (printf 関数を呼び出した後で)アドレス 0x404020 の値を出力して出てくる # libc 中のprintf 関数のアドレス # 環境によって変わるのでメモしておきましょう #------------------------------------------ ``` ## WSLについて Windows上で手軽にLinuxを扱えるようにする機能。 GUIはないが、PwnにおいてはGUIはあまり必要なく、その分軽量。 それに加え、ファイルのやり取りなどが仮想マシンに比べて飛躍的に楽になる(Windows上のDiscord,LINEで配布されたファイルをそのまま扱える)。 このような理由で、WSLの利用を推奨したいです。 WSL1とWSL2があり、2は1より限りなく挙動がLinuxに近づくが、他の仮想機能(VirtualBox等)のパフォーマンスが若干劣化する(動作は確認済み)。またWindows10 Ver.1903 以上,VirtualBox 6 以上が必要 ![](https://i.imgur.com/5BIP0Xf.png) Malleus Pwn の著者はWSL 1を使っており、互換性や性能の観点から、使っても問題ないと思われるので、未導入の人がなるべく楽に環境構築を済ませられるようにWSL 1のインストール方法・注意点だけ簡単に載せておきます 1. 以下のコマンドを管理者権限のPowershell で実行 ```test.ps1 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all ``` 2. 再起動 3. Windows ストアから KALI Linux をインストール 4. Kali Linuxを開き、ユーザー名とパスワードを設定 5. 次のスクリプトを実行: ```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 ``` 6. explorer.exe . と打ち込み、Linux内のディレクトリがWindows エクスプローラーからみられることを確認。ここからファイルを出し入れできる ## Docker について コンテナという仕組みを用いた、きわめて軽量な仮想マシン なるべく問題プログラムは自分のほうから配布していきますが、 問題サーバーを各自で用意したくなった場合、これを使います **WSL 2が必須です。** 先にPowershellで次のコマンドを打ちます: ```a.ps1 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all ``` https://desktop.docker.com/win/stable/Docker%20Desktop%20Installer.exe ここからDockerをダウンロードした後、powershellから ```a.ps1 docker run --rm -it -p 10080:80 -p 10001-10012:10001-10012 kusanok/ctfpwn:2 ``` と打ってください その後 localhost:10080 にアクセスすると問題サイトに飛べます