CheckSec查看二进制文件安全属性

基础使用

apt-get install checksec安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# checksec -h
Usage: checksec [--format={cli,csv,xml,json}] [OPTION]

Options:

## Checksec Options
--file={file}
--dir={directory}
--listfile={text file with one file per line}
--proc={process name}
--proc-all
--proc-libs={process ID}
--kernel[=kconfig]
--fortify-file={executable-file}
--fortify-proc={process ID}
--version
--help
--update or --upgrade

## Modifiers
--debug
--verbose
--format={cli,csv,xml,json}
--output={cli,csv,xml,json}
--extended

For more information, see:
http://github.com/slimm609/checksec.sh

常见用法:

1
2
3
4
5
6
7
8
9
10
11
checksec --file=/path/file //查看单个程序安全属性

checksec --dir=/path //查看目录下所有文件的属性

checksec --file=/path/file --output=json | jq //查看单个文件属性,以json格式输出

checksec --proc-all //查找系统上所有正在运行的程序的安全属性

checksec --proc=bash //查看指定进程名称的安全属性

checksec --kernel //检查系统内置的内核属性(kernel properties)

https://zebpic-1301715962.cos.ap-nanjing.myqcloud.com//blog/202311091026696.png

https://zebpic-1301715962.cos.ap-nanjing.myqcloud.com//blog/202311091026893.png

https://zebpic-1301715962.cos.ap-nanjing.myqcloud.com//blog/202311091025961.png

https://zebpic-1301715962.cos.ap-nanjing.myqcloud.com//blog/202311091320353.png

安全属性

RELRO-GOT 写保护

RELRO代表重定位只读(Relocation Read-Only)。可执行链接格式(ELF)二进制文件使用全局偏移表(GOT)来动态地解析函数。启用 RELRO 后,会设置二进制文件中的 GOT 表为只读,从而防止重定位攻击

  • Partial RELRO,代表启用了RELRO 属性中的一个属性
  • full,代表启用了所有属性
  • no relro,代表没有启用属性

STACK CANARY

Canary 是放置在缓冲区和 栈(stack) 上的控制数据之间的已知值,它用于监视缓冲区是否溢出。当应用程序执行时,会为其分配两种内存,其中之一就是 栈。栈是一个具有两个操作的数据结构:第一个操作 push,将数据压入堆栈;第二个操作 pop,以后进先出的顺序从栈中弹出数据。恶意的输入可能会导致栈溢出,或使用特制的输入破坏栈,并导致程序崩溃

  • Canary found,代表开启了防止栈溢出
  • No canary found,代表没有开启防止栈溢出

NX-堆栈禁止执行

NX 代表 不可执行(non-executable)。它通常在 CPU 层面上启用,因此启用 NX 的操作系统可以将某些内存区域标记为不可执行。通常,缓冲区溢出漏洞将恶意代码放在堆栈上,然后尝试执行它。但是,让堆栈这些可写区域变得不可执行,可以防止这种攻击

  • NX enabled,代表启用了NX属性
  • NX disabled,代表禁用了NX属性

PIE-位置无关可执行文件

位置无关可执行文件(Position-Independent Executable)(PIE),顾名思义,它指的是放置在内存中某处执行的代码,不管其绝对地址的位置,即代码段、数据段地址随机化(ASLR)

  • PIE enabled,开启随机化
  • No PIE,没有随机化

RPATH/RUNPATH-运行时环境变量

程序运行时的环境变量,运行时所需要的共享库文件优先从该目录寻找,可以fake lib造成攻击

  • No RPATH/No RUNPATH,没有环境变量
  • RUNPATH,存在环境变量

Symbols-符号

在编译期间,某些 符号(symbols)包含在二进制文件中,这些符号主要用作于调试。开发软件时,需要用到这些符号,来调试和修复错误。

这些符号通常会从供用户普遍使用的最终二进制文件中删除。删除这些符号不会影响到二进制文件的执行。删除符号通常是为了节省空间,因为一旦符号被删除了,二进制文件就会稍微小一些。在闭源或专有软件中,符号通常都会被删除,因为把这些符号放在二进制文件中,可以很容易地推断出软件的内部工作原理

  • No Symbols,符号已去除
  • 45824 Symbols,代表存在45824个符号,符号未去除

FORTIFY-源码级别保护机制

这是一个由GCC实现的源码级别的保护机制,其功能是在编译的时候检查源码以避免潜在的缓冲区溢出等错误。

一些敏感函数如read,fgets,memcpy,printf等等可能导致漏洞出现的函数会替换成__read_chk,__fgets_chk等。这些带了chk的函数 会检查读取/复制的字节长度是否超过缓冲区长度,通过检查诸如%n之类的字符串位是否位于可能被用户修改的可写地址,避免了格式化字符串跳过某些函数如直接(%7$x)等方式来避免漏洞出现,开启FORTIFT保护的程序会被checksec检出。此外,在反编译时直接查看got表也会发现chk函数的存在,这种检查是默认不开启的,可以通过

  • No,没有开启,默认状态,不算风险
  • Yes,开启了保护机制

SECCOMP

Seccomp(全称 Secure Computing Mode)是 Linux 内核中的一项安全功能。它的目的是限制一个进程中所能使用的系统调用,以降低攻击者利用该进程对系统造成损害的风险。当启用 Seccomp 后,每个进程都有自己的调用规则集,其中定义了该进程中允许或禁止的系统调用及其参数范围。如果某个进程尝试使用被禁止的系统调用,那么内核将立即终止该进程并记录一条错误消息

  • Seccomp BPF,用于限制进程能够进行的系统调用。它允许进程在运行时安装一个 BPF 过滤器程序来控制进程的系统调用,从而提高整个系统的安全性。这可以防止恶意软件对系统进行攻击,并且可以在不影响正常程序执行的情况下提高系统安全性

Refrence

在 Linux 上使用 Checksec 识别二进制文件的安全属性