本笔记为 泷羽sec 《红队全栈课程》学习笔记,课程请可自行前往B站学习,课程/笔记主要涉及网络安全相关知识、系统以及工具的介绍等,请使用该课程、本笔记以及课程和笔记中提及工具的读者,遵守网络安全相关法律法规,切勿进行违法违规违纪的操作。
写在最前面的话,我们为什么要学习网络安全这门技术:
- 维护国家安全
防范网络攻击:网络安全威胁已成为国家安全的重要挑战。学习网络安全有助于识别和防范来自国内外的网络攻击,防止敌对势力通过网络手段窃取敏感信息、破坏关键基础设施或干扰社会正常运作。
保护关键基础设施:现代社会高度依赖网络技术,金融系统、交通网络、电力供应等关键基础设施都依赖于稳定的网络环境。掌握网络安全知识有助于保护这些基础设施免受网络攻击,确保国家的正常运转。
- 促进经济发展
保障数字经济安全:数字经济已成为国家经济增长的重要引擎。通过学习网络安全,可以保障数字经济的健康发展,防止数据泄露和网络犯罪对经济活动的干扰。
增强国际竞争力:在全球化的背景下,网络安全技术水平直接影响国家的国际竞争力。掌握先进的网络安全技术和策略,有助于提升国家在全球数字经济中的地位。
- 提升社会稳定
防范社会风险:网络犯罪和网络恐怖主义对社会稳定构成严重威胁。学习网络安全有助于及时发现和应对这些风险,维护社会的和谐与稳定。
保护公民权益:网络安全直接关系到公民的隐私权和信息安全。通过学习网络安全,可以更好地保护公民的合法权益,增强公众对政府和企业的信任。
- 推动科技进步
创新安全技术:网络安全领域的技术创新不断推动信息技术的进步。学习网络安全有助于推动新技术的研发和应用,提升国家在科技领域的整体实力。
促进国际合作:网络安全是全球性问题,需要各国共同努力应对。通过学习网络安全,可以参与国际网络安全合作,共同制定国际标准和规范,提升全球网络安全水平。
- 强化法治建设
完善法律法规:学习网络安全有助于推动和完善相关法律法规的制定和实施,确保网络安全工作有法可依、有章可循。
提升执法能力:掌握网络安全知识可以提升执法部门的网络侦查和取证能力,有效打击网络犯罪,维护法律权威。
- 培养专业人才
构建人才梯队:网络安全领域需要大量高素质的专业人才。通过系统学习和培训,可以培养出一批具备专业知识和实战经验的网络安全专家,为国家的网络安全事业提供坚实的人才保障。
总之,学习网络安全不仅是个人职业发展的需要,更是维护国家安全、促进经济发展、保障社会稳定和推动科技进步的重要手段。通过不断提升网络安全意识和能力,我们可以更好地应对日益复杂的网络安全挑战,为实现国家的长期稳定和发展贡献力量。
以下为linux基础(1)视频对应的内容 视频传送门 ==> linux基础(1)_哔哩哔哩_bilibili 约23分钟左右处
一、Linux 账户数据相关文件
/etc/passwd
/etc/shadow
/etc/group
1、/etc/passwd
该文件在 Linux 系统中用于存储关于系统用户账户的信息。每一行代表一个用户账户,每一行由多个字段组成,我们使用cat 等命令可以查看到文件的内容,具体如下:
┌──(kali㉿kali)-[~] # head -3 表示读取文件前3行
└─$ sudo head -3 /etc/passwd
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
| 1 | 用户名(Username) | 用户登录系统时使用的名字 |
| 2 | 密码占位符(Password) | 现代 Linux 系统通常不在 /etc/passwd 文件中直接存储用户密码。取而代之的是,这里通常会有一个占位符(如 x),而实际的加密密码存储在 /etc/shadow 文件中 |
| 3 | 用户ID(User ID, UID) | 这是系统内部用于识别用户的数字ID。0 通常表示 root 用户(超级用户),1-999 通常用于系统账户,1000 及以上通常用于普通用户账户。 |
| 4 | 组ID(Group ID, GID) | 这是用户所属的主要组的ID。用户还可以属于其他组,但这些信息存储在 /etc/group 文件中。 |
| 5 | 用户全名或描述(Full Name or Description) | 这通常是用户的全名或者是对用户账户的简短描述。 |
| 6 | 用户主目录(Home Directory) | 一般也叫家目录,这是用户登录系统后默认进入的目录,也是用户个人文件通常存放的地方。 |
| 7 | 默认Shell(Default Shell) | 这是用户登录系统后默认运行的命令解释器或程序。对于普通用户,这通常是一个 Shell(如 /bin/bash, /usr/bin/zsh 等)。对于某些系统账户(如 daemon, bin),这可能是 /usr/sbin/nologin,表示不允许这些账户通过常规方式登录。 |
2、/etc/shadow
该文件在 Linux 系统中用于存储关于系统用户账户的密码信息。与 /etc/passwd 文件类似,每一行代表一个用户账户,每一行由多个字段组成,这些字段由冒号 (:) 分隔。
┌──(kali㉿kali)-[~]
└─$ sudo head -3 /etc/shadow
root:*:19953:0:99999:7:::
daemon:*:19953:0:99999:7:::
bin:*:19953:0:99999:7:::
| 1 | 用户名(Username) | 这是与 /etc/passwd 文件中的用户名相对应的用户登录名 |
| 2 | 加密密码(Encrypted Password) | 这个字段存储用户密码的加密表示。如果字段是 * 或 !,通常表示账户被禁用了密码登录(例如,对于不允许通过密码登录的系统账户)。实际的加密密码是一个复杂的字符串,由密码加密算法生成。 |
| 3 | 密码最后更改的日期(Last Password Change) | 这个字段表示自 Unix 纪元(1970 年 1 月 1 日)以来密码最后被更改的天数。 |
| 4 | 密码更改的最小间隔(Minimum Password Age) | :这个字段表示用户必须等待多少天才能再次更改密码。0 表示用户可以随时更改密码。 |
| 5 | 密码更改的最大间隔(Maximum Password Age) | 这个字段表示密码在多少天后必须被更改。99999 通常是一个很大的值,意味着密码几乎不需要更改(在实际应用中,管理员可能会设置更合理的值来确保密码的安全性)。 |
| 6 | 密码过期警告天数(Password Warning Period) | 这个字段表示在密码到期前的多少天开始警告用户。7 表示在密码到期前 7 天开始警告用户。 |
| 7 | 密码过期后的宽限期(Password Inactivity Period) | 这个字段表示密码过期后多少天账户被禁用。如果这个字段为空,通常意味着账户在密码过期后立即被禁用(取决于系统的配置)。 |
| 8 | 账户到期日期(Account Expiration Date) | 这个字段表示账户到期的日期(以自 Unix 纪元以来的天数表示)。如果这个字段为空,表示账户永不过期。 |
| 9 | 保留字段(Unused Field) | 这是一个保留字段,目前未使用,用于将来的扩展。 |
3、/etc/group
该文件在 Linux 系统中用于存储关于系统组的信息。每一行代表一个组,每一行由多个字段组成,这些字段由冒号 (:) 分隔。
┌──(kali㉿kali)-[~]
└─$ head -3 /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
| 1 | 组名(Group Name) | 这是组的名称,用于标识和引用系统中的组。 |
| 2 | 密码占位符(Password) | 现代 Linux 系统通常不在 /etc/group 文件中直接存储组密码。取而代之的是,这里通常会有一个占位符(如 x)。在早期的 Unix 系统中,这个字段可能包含组的加密密码,但现在这种做法已经很少见了。 |
| 3 | 组ID(Group ID, GID) | 这是系统内部用于识别组的数字ID。0 通常表示 root 组(超级用户组),其他数字则表示普通用户组或系统组。 |
| 4 | 组成员(Group Members) | 这个字段列出属于该组的所有用户的用户名。多个用户名之间用逗号(,)分隔。如果这个字段为空,表示该组当前没有成员(这在实际情况中比较少见)。 |
二、Linux用户和组相关命令(部分)
1、useradd/deladd
添加或者删除一个用户,下面做个小实验,添加一个叫mali的用户,再删除这个用户,期间跟踪下/etc/passwd 文件最后2行的情况。
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo useradd mali
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo tail -2 /etc/passwd # tail 表示查看文件后面几行 -2表示2行
kali:x:1000:1000:,,,:/home/kali:/usr/bin/zsh
mali:x:1001:1001::/home/mali:/bin/sh # passwd文件中可以看到该用户
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo tail -2 /etc/group
kaboxer:x:137:kali
mali:x:1001: # group文件中可以看到添加了mali组
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo userdel mali
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo tail -2 /etc/passwd
_gvm:x:132:135::/var/lib/openvas:/usr/sbin/nologin
kali:x:1000:1000:,,,:/home/kali:/usr/bin/zsh # 该用户已经被删除
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo tail -2 /etc/group
kali:x:1000:
kaboxer:x:137:kali # 组也同步被删除
| 1 | -h, --help | 显示帮助信息并退出。 |
| 2 | --badname | 在创建用户时,不检查用户名是否包含不良字符或格式。 |
| 3 | -b, --base-dir BASE_DIR | 为新账户的家目录指定一个基础目录。新用户的家目录将会在这个基础目录下创建。 |
| 4 | --btrfs-subvolume-home | 使用 BTRFS 子卷作为家目录(这需要系统支持 BTRFS 文件系统)。 |
| 5 | -c, --comment COMMENT | 为新账户设置 GECOS 字段(通常包含用户的全名、电话等信息)。 |
| 6 | -d, --home-dir HOME_DIR | 指定新账户的家目录路径。 |
| 7 | -D, --defaults | 打印或更改 useradd 的默认配置。 |
| 8 | -e, --expiredate EXPIRE_DATE | 设置新账户的过期日期(格式通常为 YYYY-MM-DD)。 |
| 9 | -f, --inactive INACTIVE | 设置新账户密码的不活动期限(以天为单位)。如果用户在指定的天数内没有登录,他们的密码将过期。 |
| 10 | -F, --add-subids-for-system | 即使添加的是系统用户,也会为子用户和子组添加条目(这与用户命名空间有关)。 |
| 11 | -g, --gid GROUP | 指定新账户的主组的名称或 ID。 |
| 12 | -G, --groups GROUPS | 指定新账户的附加组的列表(这些组将作为用户的次要组)。 |
| 13 | -k, --skel SKEL_DIR | 使用指定的骨架目录(skeleton directory)来创建新用户的家目录内容。骨架目录通常包含一些默认的配置文件和目录。 |
| 14 | -K, --key KEY=VALUE | 覆盖 /etc/login.defs 文件中的默认值。 |
| 15 | -m, --create-home | 为新用户创建家目录(如果家目录不存在)。 |
| 16 | -M, --no-create-home | 不为新用户创建家目录。 |
| 17 | -N, --no-user-group | 不创建一个与新用户名称相同的组。 |
| 18 | -o, --non-unique | 允许创建具有重复(非唯一)UID 的用户。 |
| 19 | -p, --password PASSWORD | 为新账户指定一个加密的密码。 |
| 20 | -r, --system | 创建一个系统账户(这些账户通常不会用于登录,而是用于运行系统服务)。 |
| 21 | -R, --root CHROOT_DIR | 指定一个目录,将 useradd 命令限制在该目录中运行(即 chroot 环境)。 |
| 22 | -P, --prefix PREFIX_DIR | 指定一个前缀目录,其中包含 /etc/* 文件(这通常用于在特定前缀下安装系统时)。 |
| 23 | -s, --shell SHELL | 指定新用户的登录 shell |
2、chage
该条命令是用于检查和更改用户密码过期信息的工具,主要参数如下:
| 1 | -d, --lastday LAST_DAY | 设置用户最后一次更改密码的日期为 LAST_DAY。LAST_DAY 应该是一个有效的日期字符串,如 YYYY-MM-DD |
| 2 | -E, --expiredate EXPIRE_DATE | 设置用户账户的到期日期为 EXPIRE_DATE。到期后,用户将无法登录,除非账户被重新激活。EXPIRE_DATE 也应该是一个有效的日期字符串。 |
| 3 | -h, --help | 显示帮助信息并退出。这是用于获取 chage 命令使用方法的快速途径。 |
| 4 | -i , --iso8601 | 当打印日期时,使用 YYYY-MM-DD 的格式。这有助于确保日期的格式是一致的,并且易于阅读。 |
| 5 | -I, --inactive INACTIVE | 设置密码在过期后保持无效的天数为 INACTIVE。一旦密码过期,用户将有 INACTIVE 天的时间来更改他们的密码。如果在这段时间内没有更改密码,账户将被锁定。 |
| 6 | -l 【注:L的小写】, --list | 显示用户账户的密码和过期信息。这包括最后一次更改密码的日期、密码到期的日期、密码无效的天数、账户到期的日期等。 |
| 7 | -m, --mindays MIN_DAYS | 设置用户更改密码之前必须等待的最小天数为 MIN_DAYS。这是为了防止用户频繁更改密码。 |
| 8 | -M, --maxdays MAX_DAYS | 设置用户密码有效的最大天数为 MAX_DAYS。在这个天数之后,用户必须更改他们的密码。 |
| 9 | -R, --root CHROOT_DIR | 指定在执行 chage 命令时应该使用的 chroot 目录。chroot 是一种将进程和其子进程限制在指定目录及其子目录中的方法,通常用于提高安全性。 |
| 10 | -P, --prefix PREFIX_DIR | 指定用于查找用户账户信息的目录前缀。这通常与 /etc/* 文件(如 /etc/passwd 和 /etc/shadow)一起使用,以确定用户账户的位置。 |
| 11 | -W, --warndays WARN_DAYS | 设置密码到期前的警告天数为 WARN_DAYS。在密码到期前的这些天内,用户将会收到警告提示,提醒他们更改密码。 |
做个小实验,修改下一些用户的到期日
# 创建个叫 kkkk ,useradd 可以-e参数设置用户到期时间
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo useradd -e 2024-11-17 kkkk
# 查看下shadow用户,可以看到到期时间列是20044,Unix纪元+20044天
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo tail -2 /etc/shadow
kali:$y$j9T$zY1oKFxJlTgP2WcJhzbNl1$xhkUmB8R9fzETc/1kgL/nOPcWFTvhn17clxXCgyFjpC:19953:0:99999:7:::
kkkk:!:20041:0:99999:7::20044:
# 我们使用 date -d 命令计算下时间,且采用 xxxx-xx-xx 输出格式
┌──(kali㉿kali)-[~/Desktop]
└─$ date -d "1970-01-01 +20044day" +"%Y-%m-%d" # 其中1970-01-01就是Unix纪元
2024-11-17
# 我们同步使用 chage 命令查看下kkkk账户的信息,其中expires行就是到期时间,和上面一致
┌──(kali㉿kali)-[~/Desktop]
└─$ chage -l -i kkkk
chage: Permission denied.
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo chage -l -i kkkk # -i 采用xxxx-xx-xx这种易阅读模式输出
Last password change : 2024-11-14
Password expires : never
Password inactive : never
Account expires : 2024-11-17
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
#我们直接使用 chage -E 修改用户到期时间,增加1天
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo chage -E 2024-11-18 kkkk
# 我们看到shadow文件中的20044增加了1天
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo tail -2 /etc/shadow
kali:$y$j9T$zY1oKFxJlTgP2WcJhzbNl1$xhkUmB8R9fzETc/1kgL/nOPcWFTvhn17clxXCgyFjpC:19953:0:99999:7:::
kkkk:!:20041:0:99999:7::20045:
# 用chage -l -i 参数检查下
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo chage -l -i kkkk
Last password change : 2024-11-14
Password expires : never
Password inactive : never
Account expires : 2024-11-18
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
# 此外,用 usermod -e 也可以修改到期时间
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo usermod -e 2024-11-20 kkkk
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo chage -l -i kkkk | grep Account
Account expires : 2024-11-20
3、passwd
该命令在Linux系统中用于更改用户的认证信息,包括用户密码、密码过期时间、锁定或解锁用户密码等。
| 1 | -l(注:lock的l) | 锁定用户账号,禁止用户登录系统。 |
| 2 | -u | 解锁用户账号,恢复用户登录权限。 |
| 3 | -d | 删除用户密码,使用户无需密码即可登录,但通常不安全。 |
| 4 | -e | 要求用户在下次登录时更改密码。 |
| 5 | -S | 显示用户账号的密码状态信息。 |
| 6 | -n | 设置密码的最小使用天数。 |
| 7 | -x | 设置密码的最大有效天数。 |
| 8 | -w | 设置密码过期前的警告天数。 |
| 9 | -i | 设置密码过期后的不活动期限。 |
| 10 | --stdin | 从标准输入读取密码,通常用于脚本中。 |
下面根据passwd参数,部分参数进行一些小实验
# 我们可以看到 kkkk 用户在
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo tail -1 /etc/shadow
[sudo] password for kali:
kkkk:!:20041:0:99999:7::20047:
# 给 kkkk 用户设置密码
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo passwd kkkk
New password:
Retype new password:
passwd: password updated successfully
# 切换到kkkk用户,因为没有特地设置过shell,故使用的了sh
┌──(kali㉿kali)-[~/Desktop]
└─$ su kkkk
Password:
$ su kali <-- 这里是sh的shell
Password:
# 切换回kali用户,使用 -l (小写的L) 锁定kkkk用户账户
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo passwd -l kkkk
passwd: password changed.
# 此时 切换kkkk就会出错
┌──(kali㉿kali)-[~/Desktop]
└─$ su kkkk
Password:
su: Authentication failure
# 使用 -u 参数解锁kkkk
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo passwd -u kkkk
passwd: password changed.
# kkkk用户又可以正常使用了
┌──(kali㉿kali)-[~/Desktop]
└─$ su kkkk
Password:
$ whoami
kkkk
$ su kali
Password:
# 留意下面使用-S参数的输出
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo tail -3 /etc/passwd
_gvm:x:132:135::/var/lib/openvas:/usr/sbin/nologin
kali:x:1000:1000:,,,:/home/kali:/usr/bin/zsh
kkkk:x:1001:1001::/home/kkkk:/bin/sh
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo passwd -S kkkk
kkkk P 2024-11-14 0 99999 7 -1
# 以下是使用 --stdin 参数讲文本文件中的内容传入passwd命令作为用户的密码
┌──(kali㉿kali)-[~/Desktop]
└─$ echo 12345>passwd.txt
┌──(kali㉿kali)-[~/Desktop]
└─$ cat passwd.txt
12345
┌──(kali㉿kali)-[~/Desktop]
└─$ cat passwd.txt | sudo passwd --stdin kkkk
┌──(kali㉿kali)-[~/Desktop]
└─$ su kkkk
Password:
$ whoami
kkkk
$
三、Linux文件/文件夹权限部分
1、Linux文件权限介绍
┌──(kali㉿kali)-[~/Desktop]
└─$ ls -la
total 12
drwxr-xr-x 2 kali kali 4096 Nov 14 08:42 .
drwx------ 17 kali kali 4096 Nov 14 08:29 ..
-rw-rw-r-- 1 kali kali 6 Nov 14 08:42 passwd.txt
当我们使用普通的ls -a 参数,会列出上面的“.”和“..”,其中1个点表示当前文件夹,2个点表示上级文件夹。
第一列中的d,表示是文件夹,否则的话一般都是文件;
第二列rwx为一组,表示文件或者文件夹对文件所有者的权限,是读、写、执行。
第二列rwx为一组,表示文件或者文件夹对文件组用户的权限,是读、写、执行。
第三列rwx为一组,表表示文件或者文件夹对其他用户的权限,是读、写、执行。
另外,r/w/x 在给文件夹权限的时候一般可以用4/2/1的和来代替,所以rwx就是7,r-x是5,r--就是4。
值得注意的是,如果要进入文件夹或者读取里面的文件的时候,该文件夹的其他用户权限必须为r-x,我们借用kkkk用户来进行实验,桌面有个test文件夹:
当文件夹权限为xx4的时候也就是r--的时候,其他用户无法读取这个文件夹内的文件;
当文件夹权限调整为xx5也就是r-x的时候,其他用户就可以读取文件夹内的文件。
关于权限操作的在下面一节。

2、chmod命令
该命令用于更改文件或目录的权限,具体参数如下:
| 1 | --help | 显示帮助信息并退出。这是用户寻求命令使用帮助时常用的参数。 |
| 2 | -c, --changes | 像-v(verbose,详细模式)一样,但只在实际更改了文件权限时才报告。这有助于减少不必要的输出。 |
| 3 | -f, --silent, --quiet | 抑制大多数错误消息。当你不希望命令执行过程中出现太多干扰信息时,可以使用这个参数。 |
| 4 | -v, --verbose | 为每个处理的文件输出诊断信息。这有助于你了解命令正在执行哪些操作。 |
| 5 | --no-preserve-root | 不特别处理根目录/。默认情况下,chmod会避免对根目录进行递归操作,使用这个参数可以覆盖这个行为。 |
| 6 | --preserve-root | 失败于对根目录/进行递归操作。这是默认行为,用于防止意外更改根目录及其子目录的权限。 |
| 7 | --reference=RFILE | 使用参考文件RFILE的权限,而不是指定MODE值。这允许你复制另一个文件的权限到目标文件上。如果RFILE是符号链接,那么它总是会被解引用(即跟随链接到实际文件)。 |
| 8 | -R, --recursive | 递归地更改文件和目录的权限。这意味着命令将应用于指定目录及其所有子目录和文件。 |
| 9 | --version | 输出版本信息并退出。这有助于你了解当前使用的chmod命令的版本。 |
| 10 | MODE | 权限模式,可以是符号模式(如rwxr-xr-x)或八进制模式(如755)。符号模式由字符组合而成,表示不同用户和类型的权限;八进制模式则使用数字表示权限,每个数字对应一组三位二进制数,分别代表读、写和执行权限。 |
下面我们来做几个小实验,使用u/g/o/a和rwx来调整文件的权限。当前桌面新建了2个txt文件,权限都是-rw-rw-r,我们给所有用户都赋上可执行权限,使用的事u+/g+/o+,这种情况下可以用a+来代替,a表示对三种用户及组一起操作。
┌──(kali㉿kali)-[~/Desktop]
└─$ ls -lian
total 8
435738 drwxr-xr-x 2 1000 1000 4096 Nov 14 09:52 .
393218 drwx---r-x 17 1000 1000 4096 Nov 14 09:33 ..
436036 -rw-rw-r-- 1 1000 1000 0 Nov 14 09:52 111.txt
436039 -rw-rw-r-- 1 1000 1000 0 Nov 14 09:52 222.txt
┌──(kali㉿kali)-[~/Desktop]
└─$ chmod u+x,g+x,o+x 111.txt
┌──(kali㉿kali)-[~/Desktop]
└─$ chmod a+x 222.txt
┌──(kali㉿kali)-[~/Desktop]
└─$ ls -lian
total 8
435738 drwxr-xr-x 2 1000 1000 4096 Nov 14 09:52 .
393218 drwx---r-x 17 1000 1000 4096 Nov 14 09:33 ..
436036 -rwxrwxr-x 1 1000 1000 0 Nov 14 09:52 111.txt
436039 -rwxrwxr-x 1 1000 1000 0 Nov 14 09:52 222.txt
除了使用u/g/o/a 和 +-= 对文件或者文件夹进行权限调整操作以外,还可以使用r=4,w=2,x=1的数值对权限进行操作,如果需要如下权限的话,按照下面表格,只要使用chmod 754 file即可完成权限设置:
| u | g | o |
| rwx | r-x | r-- |
| 4+2+1=7 | 4+0+1=5 | 4+0+0=4 |
┌──(kali㉿kali)-[~/Desktop]
└─$ touch 1.txt
┌──(kali㉿kali)-[~/Desktop]
└─$ ls -l
total 0
-rw-rw-r-- 1 kali kali 0 Nov 14 14:24 1.txt
┌──(kali㉿kali)-[~/Desktop]
└─$ chmod 754 1.txt
┌──(kali㉿kali)-[~/Desktop]
└─$ ls -l
total 0
-rwxr-xr-- 1 kali kali 0 Nov 14 14:24 1.txt
根据上面试验可以看出,使用 chmod 754 file 这种方法调整权限,命令输入量会大幅减少,缺点是需要少量计算,但对于学习渗透的我们来说几乎没有什么难度,只不过是在输入前思维稍许需要拐个弯。
关于x权限的特别说明:
x是执行权限,如果没有x权限的情况下,可执行文件或者shell脚本都会无法运行。由于上述试验中用到的均非可执行文件,接下来我们做个小实验,创建个shell脚本(可以当成是一串Linux命令的集合),并进行运行。
┌──(kali㉿kali)-[~/Desktop] # 这里偷懒了直接用echo加重定向符把脚本写入文件,\n是换行
└─$ echo '#/bin/bash\na="hello world"\necho $a' >1.sh
┌──(kali㉿kali)-[~/Desktop] # cat 命令查看下脚本,情况正常
└─$ cat 1.sh
#/bin/bash # 告诉系统用/bin/bash这个shell执行
a="hello world" # 把hello world字符串赋值给变量a
echo $a # echo 变量a,输出变量的内容
┌──(kali㉿kali)-[~/Desktop] # 先看下,刚创建后的这个shell脚本是没有x权限的
└─$ ls -l 1.sh
-rw-rw-r-- 1 kali kali 35 Nov 14 14:07 1.sh
┌──(kali㉿kali)-[~/Desktop] # 无x权限的情况下,shell脚本无法运行
└─$ ./1.sh # 脚本要运行的话,一定要用./做开头,给到一个绝对或者相对路径
zsh: permission denied: ./1.sh # 这里是出错提示
┌──(kali㉿kali)-[~/Desktop] # 给shell脚本可执行权限
└─$ chmod +x 1.sh
┌──(kali㉿kali)-[~/Desktop] # 权限调整后,该脚本可以顺利运行
└─$ ./1.sh
hello world
除了rwx权限外,还有X/s/t三种权限,其中关于s权限,s(setuid/setgid):特殊权限,允许普通用户以文件或目录所有者的身份运行程序或命令。当s权限在用户的x权限上时,称为Set UID(SUID),程序执行时拥有文件所有者的权限;当s权限在用户组的x权限上时,称为Set GID(SGID),程序执行时拥有文件所属组的权限。s权限情况比较特殊,一般给这个权限的时候必须谨慎又谨慎,后续涉及到suid权限提权会有很多的利用,本处先略。
另外除了 rwxs权限外,还有X权限、t权限,目前暂时用不到。
3、chown 命令
该命令用于更改文件或目录的所有者(owner)和所属用户组(group)。它可以帮助用户管理和维护文件系统的安全性与访问控制。
| 1 | -c, --changes | 只在有更改生效时才显示更改信息。 |
| 2 | -f, --silent, --quiet | 忽略大部分错误信息。 |
| 3 | -v, --verbose | 显示指令详细的执行过程。 |
| 4 | -R, --recursive | 递归地更改指定目录下所有文件和子目录的所有者。 |
| 5 | --dereference | 修改符号链接指向的实际文件的属主和所属用户组,而非符号链接文件本身(默认选项)。 |
| 6 | -h, --no-dereference | 修改符号链接文件本身的属主和所属用户组。 |
| 7 | --from=CURRENT_OWNER | 只有当文件的属主和所属组符合选项所指定的才更改。 |
做个小实验,桌面test文件夹,及其内部的文件的所有者全部变更到root和root组。
┌──(kali㉿kali)-[~/Desktop]
└─$ mkdir test
┌──(kali㉿kali)-[~/Desktop]
└─$ touch 111 222 333
┌──(kali㉿kali)-[~/Desktop]
└─$ mv * test
mv: cannot move 'test' to a subdirectory of itself, 'test/test'
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo chown root:root test -R -v
changed ownership of 'test/333' from kali:kali to root:root
changed ownership of 'test/222' from kali:kali to root:root
changed ownership of 'test/111' from kali:kali to root:root
changed ownership of 'test' from kali:kali to root:root
┌──(kali㉿kali)-[~/Desktop]
└─$ ls test -la
total 8
drwxrwxr-x 2 root root 4096 Nov 14 10:47 .
drwxr-xr-x 3 kali kali 4096 Nov 14 10:47 ..
-rw-rw-r-- 1 root root 0 Nov 14 10:47 111
-rw-rw-r-- 1 root root 0 Nov 14 10:47 222
-rw-rw-r-- 1 root root 0 Nov 14 10:47 333
四、Linux日志
1、先说下为什么有些Linux系统没有 lastb / lastlog 命令,以及没有 /var/log/auth.log文件
a、关于没有 lasb / lastlog
视频演示中,泷师傅视频中用的系统有 lastb / lastlog 两条命令,另外也有 /var/log/auth.log文件,但如果是使用2403pre-build版本的kali(预装或预构建虚拟机镜像版),没有上述两条命令,也没 auth.log 文件。主要因为两条命令是util-linux(Linux一个基本工具套件)版本的问题,util-linux 2.40 版貌似没有把 lastb / lastlog 两条命令装进去,不过我们可以在debian的最新的docker 容器内体验下,同时可以用下面这条命令检查 util-linux 的版本:
dpkg -l | grep util-linux
# 注意kali2403的预装版没有下面2条命令,运行报错是正常的
┌──(kali㉿kali)-[~]
└─$ lastb
Command 'lastb' not found, did you mean:
command 'last' from deb wtmpdb
command 'lasts' from deb multicat
command 'lastdb' from deb last-align
command 'lastz' from deb lastz
Try: sudo apt install <deb name>
┌──(kali㉿kali)-[~]
└─$ lastlog
Command 'lastlog' not found, did you mean:
command 'lastlog2' from deb lastlog2
Try: sudo apt install <deb name>
# 我们用这条命令检查下util-linux套件包,看到kali内置的包版本是2.40
┌──(kali㉿kali)-[~]
└─$ dpkg -l | grep util-linux
ii util-linux 2.40.2-9 amd64 miscellaneous system utilities
ii util-linux-extra 2.40.2-9 amd64 interactive login tools
# 我们找个最新版本的debian容器进去看下
┌──(kali㉿kali)-[~]
└─$ sudo docker exec -it debian bash
root@1efdc60857c9:/# lastb # lastb 因为没登录故没内容,但是命令可以正常执行
btmp begins Wed Nov 13 16:17:58 2024
root@1efdc60857c9:/# lastlog # lastlog 可以正常允许
Username Port From Latest
root **Never logged in**
daemon **Never logged in**
(当中较长省略了)
nobody **Never logged in**
root@1efdc60857c9:/# dpkg -l | grep util-linux # 这里看下util-linux版本是2.38,所以有这两条命令
ii util-linux 2.38.1-5+deb12u2 amd64 miscellaneous system utilities
ii util-linux-extra 2.38.1-5+deb12u2 amd64 interactive login tools
root@1efdc60857c9:/#
b、关于没有 /var/log/auth.log
这个文件,需要我们安装一个 rsyslog 程序,该程序是一个开源的日志处理工具,用于在IP网络中转发和处理来自各种来源的日志信息。可使用如下命令进行安装:
sudo apt update
sudo apt install rsyslog
安装完毕后,重新启动下,再到 /var/log 目录下,就可以找到该文件了,该程序具体使用本教程略。
# 注意,安装 rsyslog 后需要重启再有该文件
┌──(kali㉿kali)-[~]
└─$ cat /var/log/auth.log
2024-11-16T13:54:20.944303-05:00 kali sudo: pam_unix(sudo:session): session closed for user root
2024-11-16T13:54:26.527620-05:00 kali systemd-logind[632]: The system will reboot now!
2024-11-16T13:54:26.530776-05:00 kali systemd-logind[632]: System is rebooting.
2024-11-16T13:54:26.564609-05:00 kali ssh-agent[1276]: exiting on signal 15
2024-11-16T13:54:50.203009-05:00 kali systemd-logind[641]: New seat seat0.
2024-11-16T13:54:50.203014-05:00 kali systemd-logind[641]: Watching system buttons on /dev/input/event1 (Power Button)
2024-11-16T13:54:50.203023-05:00 kali systemd-logind[641]: Watching system buttons on /dev/input/event6 (VMware VMware Virtual USB Keyboard)
2、/var/log/文件夹中的wtmp、btmp、lastlog文件
三个文件具体用途如下:
| /var/log/wtmp | 记录系统中所有成功登录和注销的信息,以及系统启动、重启和关机的时间 |
| /var/log/btmp | 专门记录系统中失败的登录尝试信息 |
| /var/log/lastlog | 记录每个用户最后一次登录的时间、登录源(如终端或远程IP地址)以及登录会话的持续时间。 |
a、关于 /var/log/wtmp
这个文件和 last 命令对应,而且一般 Linux 系统全部都有,如果ssh到Linux服务器,那么使用last命令可以显示登陆情况,而如果用户退出服务器,则命令也会显示离开。
下面做个小实验,创建 debian 容器开启ssh服务,然后我们用ssh连接容器。

但是,目前的 Kali Linux 又是一种新的情况,我们可以尝试在新的Kali Linux中运行last命令,会发现如下的提示:
┌──(kali㉿kali)-[~]
└─$ last
kali tty7 :0 Sat Nov 16 15:05 - still logged in
lightdm tty7 :0 Sat Nov 16 15:05 - 15:05 (00:00)
/var/lib/wtmpdb/wtmp.db begins Sat Nov 16 15:05:05 2024
这说明目前 Kali Linux 是把这些信息存储在了 /var/lib/wtmpdb/wtmp.db 数据库中,这个数据库是个sqlite数据库,我们可以直接用下面的命令打开:
sqlite3 /var/lib/wtmpdb/wtmp.db
此时,我们可以看到wtmp.db数据库文件中的内容,和 last 显示的信息完全一样。
┌──(kali㉿kali)-[~]
└─$ sqlite3 /var/lib/wtmpdb/wtmp.db
SQLite version 3.46.1 2024-08-13 09:16:08
Enter ".help" for usage hints.
sqlite> .tables
wtmp
sqlite> select * from wtmp;
1|3|lightdm|1731787505993287|1731787540132261|tty7|:0|lightdm-greeter
2|3|kali|1731787540141312||tty7|:0|lightdm
b、关于/var/log/btmp
这个文件记录记录登录系统失败的用户相关信息。因为目前最新的 Kali Linux 没有 lastb 命令,我们可以直接用 cat / tail 等命令查看。
我们做个小实验,用ssh连接 Kali Linux 且故意输错密码,在btmp中留下记录,另外直接在kali终端内新建个用户,用 su 切换用户,故意输错密码,也在btmp中留下记录:


我们可以使用utmpdump 获得更好的视觉效果
┌──(kali㉿kali)-[~]
└─$ sudo utmpdump /var/log/btmp
Utmp dump of /var/log/btmp
[6] [02789] [ ] [kali ] [ssh:notty ] [192.168.203.1 ] [192.168.203.1 ] [2024-11-15T08:57:10,000000+00:00]
[6] [02789] [ ] [kali ] [ssh:notty ] [192.168.203.1 ] [192.168.203.1 ] [2024-11-15T08:57:20,000000+00:00]
[6] [02789] [ ] [kali ] [ssh:notty ] [192.168.203.1 ] [192.168.203.1 ] [2024-11-15T08:57:31,000000+00:00]
[6] [06119] [0 ] [test ] [pts/0 ] [ ] [0.0.0.0 ] [2024-11-15T09:03:18,895785+00:00]
[6] [06350] [0 ] [test ] [pts/0 ] [ ] [0.0.0.0 ] [2024-11-15T09:03:42,624544+00:00]
c、关于lastlog
老的情况就不说了,Kali Linux 目前可以安装 lastlog2 ,我们可以使用这条命令查看登录情况。
sudo apt install lastlog2
┌──(kali㉿kali)-[/var/log]
└─$ lastlog2
Username Port From Latest
kali tty7 :0 Sat Nov 16 15:36:50 -0500 2024
lightdm tty7 :0 Sat Nov 16 15:36:23 -0500 2024
test pts/1 Sat Nov 16 15:35:25 -0500 2024
同样,这条命令后面实际有个db数据库文件,和上面查看wtmpdb.db类似,我们可以在/var/lib/lastlog的文件夹中,用sqlite查看到数据库内容:
┌──(kali㉿kali)-[/var/lib/lastlog]
└─$ sqlite3 lastlog2.db
SQLite version 3.46.1 2024-08-13 09:16:08
Enter ".help" for usage hints.
sqlite> .tables
Lastlog2
sqlite> select * from Lastlog2;
test|1731789325|pts/1||su
lightdm|1731789383|tty7|:0|lightdm-greeter
kali|1731789410|tty7|:0|lightdm
3、journalctl
journalctl 是一个用于查询和管理系统日志文件的命令行工具。它允许用户查看、过滤和导出由 systemd 管理的系统日志。假设要查看ssh登录失败的日志:
┌──(kali㉿kali)-[/var/log/journal/30e662c5c81d4191bd2444a79c97d2e0]
└─$ journalctl -u ssh | grep "Failed password"
Nov 16 15:21:54 kali sshd-session[9982]: Failed password for kali from 172.17.0.2 port 38150 ssh2
Nov 16 15:21:59 kali sshd-session[9982]: Failed password for kali from 172.17.0.2 port 38150 ssh2
Nov 16 15:22:03 kali sshd-session[9982]: Failed password for kali from 172.17.0.2 port 38150 ssh2
journalctl 功能非常强大,此处不再具体展开。
4、dmesg
dmesg(display message)命令用于显示和控制Linux内核的环形缓冲区(ring buffer)。作用:内核在启动和运行过程中会将各种信息(如系统架构、CPU、挂载的硬件、RAM等)存储在这个缓冲区中。通过dmesg命令,用户可以查看这些系统信息,进行设备故障的诊断,或确认服务器安装的硬件。
这条命令我们渗透测试人员貌似、可能、大概、或许初级阶段不太会用到,故细节略。
1万+

被折叠的 条评论
为什么被折叠?



