漏洞挖掘前言

题目

  1. 写出一行linux命令列出根目录下所有suid程序。描述linux下setuid/seteuid/setreuid/getenv这几个函数的功能和差异。
  2. 有些入侵者入侵系统后,喜欢隐藏一个suid root shell文件以便下次再进入。对于这种后门应该如何进行检测?
  3. (选做)Gdb一个suid程序,该程序在被gdb调试执行时是否依然拥有文件owner权限?解释原因。
  4. (2018).解释Linux环境变量PATH的作用,如何显示和修改这个环境变量?解释linux用root执行下面这条命令 chmod 4755 file的含义和用途。
  5. (2018).描述system、execve、fork这几个函数的功能和差异。

解答

1、写出一行linux命令列出根目录下所有suid程序。描述linux下setuid/ seteuid/ setreuid/ getenv这几个函数的功能和差异。

(1)写出一行linux命令列出根目录下所有suid程序。

SUID是Set User ID的缩写,是一种特殊权限,设置了SUID的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限。例如程序文件的属主是root,那么执行该程序的用户就将暂时获得root账户的权限。

和SUID类似的有一种SGID的特殊权限。SGID是Set Group ID的缩写。两者不同的是SGID是执行程序时获得的是文件属组的权限。

 

使用以下命令列出根目录下所有SUID程序:

find / -perm -4000 -type f -ls

执行结果如下:

 

下面解释一下权限表示的具体含义,如上图中-rwsr-xr-x.

从左到右,第1位表示文件类型,第2-4位、5-7位、8-10位分别表示文件所有者的权限、同组用户的权限、其他用户的权限,其形式为rwx。

如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上。-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置,-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置。

根据以上解释可以看出,执行命令列出的根目录下所有SUID程序,确实都具有SUID权限,体现在所有者权限中可执行位上(即图中s位)。

 

 

(2)描述linux下setuid/seteuid/setreuid/getenv这几个函数的功能和差异

首先需要说明一下内核为每个进程维护的三个UID值。这三个UID分别是实际用户ID(real uid)、有效用户ID(effective uid)、保存的设置用户ID(saved set-user-ID)。

RUID, 用于在系统中标识一个用户是谁,当用户使用用户名和密码成功登录后一个UNIX系统后就唯一确定了他的RUID。

EUID, 用于系统决定用户对系统资源的访问权限,通常情况下等于RUID。如果可执行文件具有了SUID权限,那么它的有效用户ID就是可执行文件的拥有者。

SUID,用于对外权限的开放。跟RUID及EUID是用一个用户绑定不同,它是跟文件而不是跟用户绑定。

 

setuid()用来重新设置执行目前进程的用户识别码。如果原来的euid==0,则该函数将会设置所有的id都等于新的id。如果原来的euid!=0,但是新的id等于原来ruid和suid中的一个,那么也是可以执行的。否则就不能执行。

seteuid()用来重新设置执行目前进程的有效用户识别码。它只改变进程euid,而不改变ruid和suid。如果原来的euid==0,则新的euid随意设,都可以成功改变。如果原来的euid!=0,只允许新的euid等于原来三个id中的任意一个,否则就不能执行。

setreuid()用来设定真实用户ID(real uid)和有效用户ID(effective uid),这个函数在由有效用户ID符为0的进程调用时,不会改变已保存用户ID。

getenv()用来取得参数envvar环境变量的内容。参数envvar为环境变量的名称,如果该变量存在则会返回指向该内容的指针。执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。如果变量存在但无关联值,它将运行成功并返回一个空字符串,即该字符的第一个字节是null。

在Linux下,当root 使用setuid()来变换成其他用户识别码时,root权限会被抛弃,完全转换成该用户身份,也就是说,该进程往后将不再具有可setuid()的权 利,如果只是向暂时抛弃root 权限,稍后想重新取回权限,则必须使用seteuid()。而且,函数seteuid(uid_t uid)等价于setreuid(-1,uid),只改变有效用户ID(effective uid)。

 

2、有些入侵者入侵系统后,喜欢隐藏一个suid root shell文件以便下次再进入。对于这种后门应该如何进行检测?

为防止此类入侵,系统管理员应该定期查看系统中有哪些 SUID 和 SGID文件。执行以下命令:
find / -type f -perm -4000 -o -perm -2000

执行结果如下:

 

3、Gdb一个suid程序,该程序在被gdb调试执行时是否依然拥有文件owner权限?解释原因。

该程序在被gdb调试执行时依然拥有文件owner权限。根据第1 题中对SUID的解释,在执行gdb时,EUID(有效用户ID)将被置为owner ID。

 

4、解释Linux环境变量PATH的作用,如何显示和修改这个环境变量?解释linux用root执行下面这条命令chmod 4755 file的含义和用途。

(1)解释Linux环境变量PATH的作用,如何显示和修改这个环境变量?

Linux环境变量PATH的作用就是在运行脚本文件时能识别出写在脚本中的一些指令。PATH可以说是一个字符串变量,当输入命令的时候LINUX会去查找PATH里面记录的路径。比如在根目录/下可以输入命令ls,在/usr目录下也可以输入ls,但其实ls这个命令根本不在这个两个目录下,事实上当输入命令的时候LINUX会去/bin,/usr/bin,/sbin等目录下面去找此时输入的命令。

可以使用export命令查看PATH值,执行结果如下:

可以直接在命令行输入语句来修改PATH。执行如下语句,并用echo $PATH检查修改结果:

此外还可以通过通过修改.bashrc文件、通过修改profile文件、通过修改environment文件实现对PATH不同程度不同对象的修改。

 

(2)解释linux用root执行这条命令chmod 4755 file的含义和用途。

chmod是Linux下设置文件权限的命令,后面的数字表示不同用户或用户组的权限。根据题1中对权限表示格式的解释,将4755写成二进制100 111 101 101,即:
    1.给予此文件SUID特殊权限;2.文件所有者可读可写可执行;3.与文件所有者同属一个用户组的其他用户可读可执行;4.其它用户组可读可执行

 

5、描述system、execve、fork这几个函数的功能和差异。

system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命>令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。

返回值:=-1:出现错误;=0:调用成功但是没有出现子进程;>0:成功退出的子进程的id

 

execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。

返回值:如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

 

fork()函数是计算机程序设计中的分叉函数,它将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。

返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;否则,出错返回-1。

Logo

更多推荐