经过了长达29篇的文章,可以看到非常精彩的提权行为。作为一个主机入侵测试系统的码农,很多时候需要对于这种行为进行检测,从而保证系统的安全。
那么,从哪些方面来保证呢?
从这个系列来看,大多数时候提权的突破口或攻击面,都由于一些敏感文件的权限设置不当,如/etc/passwd
,/etc/shadow
, /etc/groups
, /etc/sudoers
,/etc/sudoers.d/
目录下的文件,/etc/ld.so.conf
, /etc/ld.so.conf.d/
下的文件。这些文件的权限由于设置为其它人可写或组可写,从而让攻击者篡改内容,从而获取想要的权限。
其实,还有不少文件这个系列是没有提到的,
/etc/profile
, /etc/profile.d
, /etc/bashrc
,(各种shell的初始化脚本或xwindow和桌面环境初始配置脚本): 如果是全局可写,攻击者就可以把自己东西写进去。/var/spool/cron/root
或其它用户的定时任务:如果全局可写,攻击者可以执行想要的任务,从而达到目的。从这个系列来看,很多也是由于suid
,sgid
位设置不对,从而给攻击提升了权限。
但这一块的检测,却是非常困难。一般是两种方法:
libmagic
来判断二进制文件,再检查它的标志位。ruid/rgid
和euid/egid
是否一致。如果不一致,就上报。第一种方法实现简单,但非常耗时,且读取磁盘,会对系统性能存在极大影响。
第二种方法一般是使用ebpf
或audit
来做。这种方法对性能影响不大,但是比较滞后。因为这时候程序已经运行了。
/etc/sudoers
,/etc/sudoers.d/
目录下的文件是否开启了NOPASSWD
。如果有,立马上报,防止有水平或垂直提权。env_keep
的设置是否合理。这里检测主要是两块:
web
服务器的用户配置,是否以root
运行。web
目录的属主和权限是否合理。主要是针对一些有漏洞的第三方程序。需要采集rpm
或deb
之类包管理信息,并且在管理端需要拉取漏洞信息,进行对比管理。
同时也要检测系统是否安装了gcc, llvm之类的编译器。如果有,则上报。
用户配置文件检测,主要是看一些环境变量的设置。
PATH
LD_PRELOAD
LD_LIBRARY_PATH
DOCKER_HOST
root
和cwd
这个主要是程序是否会二次chroot
。主要是做法,是看子进程和父子进程的/proc/<pid>/root
是否满足如下关系:子进程的/proc/<pid>/root
和父进程/proc/<pid>/root
相同或是它的子目录。
这一块检测分为静态和动态检测。
/etc/profile
,各种shell
的初始化脚本,xwindow
和桌面环境初始化脚本,用户主目录下的初始化脚本。/proc/<pid>/environ
为什么不是直接执行capsh --print
呢?因为,HIDS
运行时只能获取它当前用户的linux
能力,要获取所有用户的呢?特别是那些容器里的呢?
由于在docker
环境运行的进程,都可以在宿主机看到。所以,可以直接读取所有进程的status
文件里Cap
开头的字段,然后再进行解码即可。这样就可以获取所有用户和所有容器的linux
能力。
在这里,读取/etc/fstab
配置是没意义的。因为这只是系统启动时挂载的设置。但用户可以自己挂载分区。应该是读取/proc/mounts
。
这个系列中,容器被突破,很多时候是因为它的unix socket
权限设置不对。
但是,如果找到所有的unix socket
呢?这貌似是一个问题。
其实,这并不是一种难事。在/proc/net/unix
下,就可以找到宿主机的所有unix socket
。