Linux内核从2.1版本开始,就开始支持Capabilities的安全机制。Capabilities安全机制提出的目的在于实现系统特权操作的更加细粒度的访问控制,使用户能够根据实际的安全需求来控制root进程拥有的权限范围,从而取消root进程多余权限带来的安全隐患。在Capabilities机制中,所有权限被分割成比较具体和细小的权限(并将分割出来的每种细小权限称为权能),每种权能代表着root用户进行某种特权操作的权限;系统中只有进程和可执行文件具有权能,系统根据一定的安全策略来赋予进程权能,并根据进程拥有的权能来进行特权操作的访问控制。

第一步:环境搭建

Libcap库能够使用户级别的程序与capability特性做交互,一些Linux发行版不包括这个库,在环境中已经有、usr/include/sys/capability.h这个文件,为了避免老版本的影响,我们还是删掉以前的,然后重新下载一个。代码如下:

在实验楼中运行如下:

编译完成后将make生成的文件安装到系统目录中

第二步:登录运行

安装完成后,我们首先以普通用户登录并运行以下命令:

从上图可以看出,ping命令成功运行。如果ping命令中包含漏洞,那么整个系统可能会被入侵,我们能否移除这些权限 ?

现在让我们关闭程序的suid位:



显示当前目录下文件详细信息:文件所有者具有读取写入执行的所有权限,同组用户具有读取执行的权限、其他用户具有读取执行的权限.

我们将其关闭后,我们现在再ping百度看会发生什么

它会提示你操作不被允许。这是因为ping命令需要打开RAW套接字,该操作需要root权限,这就是为什么ping是Set-UID程序了。现在我们分配cap_net_raw给ping:

发现此时又可以连接到baidu.com

接着我们进行修改密码, seed 用户的密码是 dees



这步证明一开始无法修改密码试了好几次还以为做错了

接着我们分配了cap之后就可以成功修改密码

现在切换到 /home/shiyanlou/libcap-2.21/libcap目录下,编辑 cap_proc.c文件,在该文件下加入下列代码:

int cap_disable(cap_value_t capflag)
{
cap_t mycaps; mycaps = cap_get_proc();
if (mycaps == NULL)
return -1;
if (cap_set_flag(mycaps, CAP_EFFECTIVE, 1, &capflag, CAP_CLEAR) != 0)
return -1;
if (cap_set_proc(mycaps) != 0)
return -1;
return 0;
}
/* Enalbe a cap on current process */
int cap_enable(cap_value_t capflag)
{
cap_t mycaps; mycaps = cap_get_proc();
if (mycaps == NULL)
return -1;
if (cap_set_flag(mycaps, CAP_EFFECTIVE, 1, &capflag, CAP_SET) != 0)
return -1;
if (cap_set_proc(mycaps) != 0)
return -1;
return 0;
}
/* Drop a cap on current process */
int cap_drop(cap_value_t capflag)
{
cap_t mycaps; mycaps = cap_get_proc();
if (mycaps == NULL)
return -1;
if (cap_set_flag(mycaps, CAP_EFFECTIVE, 1, &capflag, CAP_CLEAR) != 0)
return -1;
if (cap_set_flag(mycaps, CAP_PERMITTED, 1, &capflag, CAP_CLEAR) != 0)
return -1;
if (cap_set_proc(mycaps) != 0)
return -1;
return 0;
}

运行以下命令编译安装libcap:

$ sudo make
$ sudo make install



编译安装完成之后,我们在 /home/shiyanlou/libcap-2.21/libcap 目录下新建一个 use_cap.c 文件,

在该文件下加入如下代码:

#include <fcntl.h>
#include <sys/types.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/capability.h>
#include <sys/capability.h>
int main( void )
{
if ( open( "/etc/shadow", O_RDONLY ) < 0 )
printf( "(a) Open failed\n" ); if ( cap_disable( CAP_DAC_READ_SEARCH ) < 0 )
return(-1);
if ( open( "/etc/shadow", O_RDONLY ) < 0 )
printf( "(b) Open failed\n" ); if ( cap_enable( CAP_DAC_READ_SEARCH ) < 0 )
return(-1);
if ( open( "/etc/shadow", O_RDONLY ) < 0 )
printf( "(c) Open failed\n" ); if ( cap_drop( CAP_DAC_READ_SEARCH ) < 0 )
return(-1);
if ( open( "/etc/shadow", O_RDONLY ) < 0 )
printf( "(d) Open failed\n" ); if ( cap_enable( CAP_DAC_READ_SEARCH ) == 0 )
return(-1);
if ( open( "/etc/shadow", O_RDONLY ) < 0 )
printf( "(e) Open failed\n" ); }

之后,使用以下命令编译运行:

$ gcc -c use_cap.c
$ gcc -o use_cap use_cap.o -lcap
$ ./use_cap

结果如下:

整个程序运行完毕.

课后问题

问题一、当我们想动态调整基于ACL访问控制权限的数量时,应该怎么做?与capabilities比较哪种更加便捷?

ACL访问控制即通过查询访问控制列表来获得访问主体权限的访问控制。当我们想动态调整基于ACL访问控制权限的数量时,我们通过修改访问控制列表中用户的访问权限来进行调整。ACL方式与capabilities相比,capabilities更便捷。Linux提供了直接修改进程权能的系统调用sys_capset(),进程可以通过sys_capset()调用来直接修改除init进程以外的任何进程的各权能集。而ACL需要调整访问控制列表中文件的安全域和权限等进行权限调整。

问题二、当程序(以普通用户运行)禁用cap A时,它遭到了缓冲区溢出攻击。攻击者成功注入恶意代码并运行。他可以使用cap A么?如果线程删除了cap A呢,可以使用cap A么?

当程序(以普通用户运行)禁用cap A时,它遭到了缓冲区溢出攻击。导致cap A没有成功禁用,攻击者成功注入恶意代码并运行,可以使用capA。如果线程删除了capA,则capA已经成功禁用,攻击者不可以使用capA。

问题三、问题如上,改用竞态条件攻击。他可以使用cap A么?如果线程删除了cap A呢,可以使用cap A么?

改用竟态条件攻击,程序禁用cap A,竟态攻击者抢占资源,可以获得capA使用权限。如果线程删除了capA,竟态攻击者依然可以抢占资源,取得capA的使用权限。

Linux Capability探索实验的更多相关文章

  1. 拾遗:『Linux Capability』

    『Linux Capability』 For the purpose of performing permission checks, traditional UNIX implementations ...

  2. 转载:linux capability深入分析

    转至http://www.cnblogs.com/iamfy/archive/2012/09/20/2694977.html 一)概述:  1)从2.1版开始,Linux内核有了能力(capabili ...

  3. Linux内核分析实验六

    Linux内核分析实验六 进程控制块PCB——task_struct(进程描述符) 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_s ...

  4. Linux系统日志清除实验

    实验目的 1.了解Linux日志的作用. 2.掌握删除Linux日志的方法. 实验原理 所谓日志(Log)是指系统所指定对象的某些操作和其操作结果按时间有序的集合.每个日志文件由日志记录组成,每条日志 ...

  5. 【MOOC EXP】Linux内核分析实验一报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  [反汇编一个简单的C程序]   实验 ...

  6. Linux磁盘配额实验

    1.实现磁盘限额的条件 *需要Linux内核支持 *安装quota软件包2.Linux磁盘限额的特点 作用范围:针对指定 文件系统(分区) 限制对象:普通用户帐号.组帐号 限制类型:磁盘容量(默认单位 ...

  7. Wireshark:couldn't run dumpcap in child process(附带Linux下探索过程)

    之前都是直接使用Kali里面安装好的Wireshark和Win下的,Ubuntu的来个小计 PS:解决方法不重要,我觉得更重要的是这个摸索的过程 解决方法 # 安装wireshark sudo apt ...

  8. 【MOOC EXP】Linux内核分析实验八报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的切换和系统的一般执行过程 知识点 ...

  9. 【MOOC EXP】Linux内核分析实验七报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 可执行程序的装载 知识点梳理 一.预处 ...

随机推荐

  1. zookeeper及kafka集群搭建

    zookeeper及kafka集群搭建 1.有关zookeeper的介绍可参考:http://www.cnblogs.com/wuxl360/p/5817471.html 2.zookeeper安装 ...

  2. Python 运行uiKLine.py ,PyQt4错误

    python 开发环境tool: 在运行项目中出现 NO module name PyQt4 错误 解决:

  3. Dagger2

    一.理解Dagger2原理 原文链接 二.Dagger2例子实战 原文链接 Demo地址 注:关于错误:IncompleteAnnotationException: dagger.Provides m ...

  4. The `android.dexOptions.incremental` property is deprecated and it has no effect on the build process.

    编译报错:The android.dexOptions.incremental property is deprecated and it has no effect on the build pro ...

  5. 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支

    下图Github地址:Mask_RCNN       Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...

  6. MVC实战之排球计分(五)—— Controller的设计与实现

    控制器 控制器接受用户的输入并调用模型和视图去完成用户的需求.所以当单击Web页面中的超链接和发送HTML表单时, 控制器本身不输出任何东西和做任何处理.它只是接收请求并决定调用哪个模型构件去处理请求 ...

  7. 为iframe添加onclick事件

    如果页面上有iframe时,鼠标点击在iframe内时,包含iframe的document是不响应任何事件的, 例如: $("#iframe1").click(function() ...

  8. spring boot 添加客户端负载均衡

    1.pom.xml文件中,添加依赖包 <dependency> <groupId>org.springframework.cloud</groupId> <a ...

  9. 阶段01Java基础day17集合框架03

    17.01_集合框架(HashSet存储字符串并遍历) A:Set集合概述及特点 通过API查看即可 B:案例演示 HashSet存储字符串并遍历 HashSet<String> hs = ...

  10. SQL Server--------SQL Server问题错误解决

    1.错误提示: 修改字段属性时,提示: 消息 5074,级别 16,状态 1,第 1 行对象'DF__dms_deliv__sync___51BAE991' 依赖于 列'sync_ff_result_ ...