在渗透测试过程,经常发现当前用户不能访问(read/write/execute)他们没有权限访问的文件。但是,超级用户(root)可以访问系统所有文件。为了修改任何重要的配置或执行进一步的攻击,我们需要获得root访问权限。
- 修改基本权限
修改所有者和所属组为root:
chown root:root <filename>
chown root: <filename>
将文件所有者修改为root:
chown root <filename>
将文件的所属组修改为root:
chown :root <filename>
修改文件权限,4,2,1分别对应r(读),w(写),x(执行)。
给当前用户赋予读,写,执行权限:
chmod u+rwx
取消当前用户的读,写,执行权限:
chmod u-rwx
取消文件所属组的读,写,执行权限:
chmod g-rwx
关于文件权限的详细操作,可参考网上其他文章,这里就不详细介绍。下面主要介绍下setuid和setgid。
- suid
通过对可执行文件设置suid位,当文件执行时,会以设置suid位时用户的权限执行,而不是当前用户的权限。
下面的示例代码setuid_demo.c输出可执行程序执行时的实际uid和有效uid:
#include <stdio.h>
#include<unistd.h>
int main() {
int real = getuid();
int euid = geteuid();
printf("The real UID = %d\n",real);
printf("The effective UID = %d\n",euid);
}
对源文件进行编译:
gcc -o setuid_demo setuid_demo.c
设置suid位:
chmod u+s setuid_demo
或者
chmod 4755 setuid_demo
在下图,setuid_demo和setuid_demo_no_suid的属主为root,使用低权限用户执行时,setuid_demo的有效uid为0,即此时程序拥有root的权限,setuid_demo_no_suid的实际uid和有效uid都为1000:
- sgid
通过对可执行程序设置sgid位,当程序执行时,有效的组id变成文件所属的组的id,而不是当前执行程序用户所属的组的id。
下面源代setgid_demo.c会打印程序执行时的实际gid和有效gid:
#include <stdio.h>
#include<unistd.h>
int main() {
int real = getgid();
int egid = getegid();
printf("The real GID = %d\n",real);
printf("The effective GID = %d\n",egid);
}
编译程序:
gcc -o setgid_demo setgid_demo.c
设置gid位:
chmod g+s setgid_demo
或
chmod 2755 setgid_demo
在下图,setgid_demo和setgid_demo_no_sgid的属主为root,使用低权限用户执行时,setuid_demo的有效gid为0,即程序此时拥有root组的权限,setuid_demo_no_suid的实际gid和有效gid都为1000:
- 粘滞位(Sticky bit)
sticky位指定只有属主能够删除文件,同一组之间不能删除/修改其他用户的文件。
设置sticky 位:
chmod +t <dirname>
或者chmod 1777 <dirname>
例如,/tmp目录就设置了sticky位: