Linux

Parad0x7e Lv1

Linux基础

查看Linux内核版本
uname -a 或 hostnamectl

Kali

kali 普通用户
root 管理员用户 uid=0

终端快捷键

tab 补全命令
ctrl + shift + + 放大终端字体
ctrl + - 缩小终端字体
ctrl + c 终止程序强制退出
ctrl + a 光标移动到行首
ctrl + e 光标移动到行尾
ctrl + alt + t 打开一个终端
ctrl + z 将程序放在后台并且暂停程序
ctrl + l 清屏 等价 clear

1
jobs 查看Linux放在后台的命令
1
fg %工作号 将标识为1的后台作业移动到前台终端运行

1
2
bg %工作号 将标识为1的前台终端作业移动到后台运行
kill -9 %工作号 终止掉放在后台的标识为1的程序

文件传输

  1. 直接拖动
    直接从物理机拖到虚拟里
  2. 监听 + 下载
    物理机 python -m http.server port
    虚拟机 wget http://你的ip地址/要下载的文件名

Linux文件结构

  • 无盘符
  • 根目录 /
  • bin 二进制文件存放的位置
  • dev 设备目录 io设备
  • home 普通用户家目录 如kali的家目录 /home/kali
  • lib lib32 lib64 动态链接库文件
  • mnt 挂载目录
  • proc 进程目录
  • sys 系统目录
  • usr 用户目录
  • boot 启动目录
  • etc 配置目录
  • media 多媒体目录
  • opt 第三方软件目录
  • root 管理员的家目录
  • tmp 缓存目录 [临时文件]
  • var 可变文件目录 [记录日志]

命令

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
cd 切换目录(windows上称为切换文件夹)
cd ~ ~代表家目录
cd /home/kali 从跟目录(/)开始的叫做绝对路径
cd ../../kali ../代表上一级目录,从当前路径开始
cd ./ ./ 代表当前目录

ls 列出所有的目录和文件
ls -l 列出详细信息
ls -a 列出隐藏的文件或目录(Linux中以.开头的是隐藏文件或隐藏目录)
ls -h 以可读大小显示文件大小

pwd 显示自己当前的位置

touch 1.txt 创建文件

cat 1.txt 查看文件
cat -n 1.txt 添加行号查看文件
more 分页查看
less 分屏上下翻页查看和more类似
head -n 5 查看头部的前5行
tail -n 5 查看末尾的5行
nl 为文件添加行号
sort 对文本文件中所有行进行排序

echo "hello" > 1.txt >输出重定向 把hello保存到1.txt

mkdir 创建文件夹
mkdir -p dir/dir1/dir2 递归创建文件夹
rmdir 删除文件夹

rm 删除
rm 1.txt 删除文件
rm -f 1.txt 强制删除文件
rm -r mydir 删除空文件夹【mydir】
rm -rf mydir 强制递归删除文件夹

cp 复制
cp 1.txt /tmp 将1.txt复制到

mv 移动,剪切 可以更改文件名字
mv 1.txt /tmp/2.txt

whereis 查看文件在哪(一般看的都是命令/二进制文件的相关文件)
whereis cat

which 查找并显示给定命令的绝对路径
which cat

jobs 查看Linux放在后台的命令
[1] + suspended ping 192.168.79.1
fg %1 将后台作业移动到前台终端运行
bg %1 将前台终端作业移动到后台运行

file 查看文件类型
file /usr/bin/cat

find 查找文件
find / -name "1.txt" 在整个磁盘中搜索文件名为1.txt的文件
find / -name "1.txt" 2>/dev/null 将标准错误重定向到/dev/null 空设备
find / -name "*.txt" 2>/dev/null 搜索系统中所有txt文件
find / -iname "flag.txt" 2>/dev/null -iname(忽略大小写)
find / -perm -u=s 2>/dev/null 搜索系统中所有具有suid权限的文件

grep 文本检索
cat 1.txt | grep "hello" 在1.txt中搜索hello在那一行
grep -rn "hello" / 2>/dev/null 在整个系统找有hello字符的所有文件

tar 打包/压缩
打包/压缩 tar -czvf
tar -czvf 123.tar 1.txt 2.txt 3.txt 把1~3.txt打包进123.tar文件
解包/解压缩 tar -xzvf
tar -xzvf 123.tar

zip 压缩
zip 123.zip 1.txt 2.txt 3.txt

unzip 解压
unzip 123.zip

vim 编辑器
在命令模式下
i a o 编辑文件
创建/打开现有的文件
nyy 复制n行
p 粘贴
ndd 删除n行
G 到行尾
u 撤销
在底线命令模式下
wq! 强制保存退出
q! 强制退出
wq 保存退出
q 退出
set nu 显示行号
set nonu 关闭行号显示
%! command 在当前文件上执行命令
%表示当前文件的所有内容
mousepad kali的记事本

用户及权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
whoami 返回当前的用户名

id 查看当前用户的uid(用户标识号)gid(用户组标识号)

poweroff 关机

reboot 重启

shutdown 系统关机
shutdown -h now 关机
shutdown -r now 重启

init 指定Linux下的进程初始化工具
参数 Linux系统要切换到的运行等级
init 0 关机
init 6 重启

用户管理

  • /etc/passwd

用户名:密码占位符:uid:gid:标识符:家目录:登录的shell

  • 密码:
    • 其中一种情况直接存放密码的hash (已经比较少见了)
    • 另一种情况如果是x密码占位符,就代表密码存放在/etc/shadow文件中
      早期 Unix 系统中,x 的位置直接存储密码的加密哈希值。密码因历史遗留原因,只留下了占位符,密码已经存放在了/etc/shadow文件中我们称之为影子口令机制

[!tip] 影子口令
最早出现在 20 世纪 80 年代中期,用于增强系统安全性,将加密后的密码从所有人都可读的/etc/passwd文件转移到只有 root 用户可读的/etc/shadow文件中,同时在/etc/passwd文件的密码字段用x作为占位符

  • 登录shell:/usr/bin/zsh 常见的登录shell还有bash,sh,csh,如果是/usr/sbin/nologin就代表该用户不能登陆和切换(一般用作服务账户)
  • /etc/shadow
1
2
sudo cat /etc/shadow
在终端中第一次使用sudo命令,需要输入当前用户的密码


1
2
3
4
5
6
7
8
9
10
11
Username :与 /etc/passwd 中的用户名对应。 
Encrypted Password :密码的哈希值。
! 或 *:账户被锁定或无法通过密码登录。
哈希格式示例:$6$salt$hash($6 表示 SHA-512 加密)。
Last Change :上次修改密码的日期(自 1970-01-01 的天数)。
Min Age :密码最短使用期限(天数,0 表示可随时更改)。
Max Age :密码最长有效期(天数,99999 表示永不过期)。
Warn :密码过期前的警告天数(通常为 7 天)。
Inactive :密码过期后允许登录的宽限期(天数,超时后账户失效)。
Expire :账户绝对失效日期(自 1970-01-01 的天数)。
Reserved :保留字段,未使用。
  • /etc/group 用户组的信息
  • /etc/gshadow 用户组的策略信息
  • useradd 添加用户 (必须是管理员权限执行)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
创建用户zhangsan (默认没有密码,也没有家目录)
sudo useradd zhangsan

sudo useradd zhangsan -d /home/zhangsan
-d 用户家目录
-m 自动创建用户家目录,配合-d使用

sudo useradd zs -s /usr/sbin/nologin 创建用户zs时指定登录shell

必须使用passwd 或者 chpasswd 添加密码
chpasswd
是批量更新用户口令的工具,是把一个文件内容重新定向添加到/etc/shadow
文件内容必须是 username:passwd格式
如abc:abc123,必须以这种格式来书写,并且不能有空行,保存成文本文件
执行命令 chpasswd < user.txt
  • userdel 删除用户
1
2
userdel -r -f zhangsan     强制删除zhangsan用户及其所有文件           
-r 删除所有相关文件 -f 强制删除
  • passwd 修改密码
1
2
passwd 改自己密码
sudo passwd root 修改其他用户密码,必须有root权限
  • su 切换用户
1
2
3
4
su root       也可以直接写su
su zhangsan
su - root 切换用户时改变环境变量
root用户切换到其他用户是不需要密码的
  • sudo 以管理员权限执行命令

[!important] sudo的延伸
如果是新创建的用户,是无法直接使用sudo来执行命令的
sudo配置文件位置:/etc/sudoers
sudo -l 查看自己的sudo配置行

1
2
3
4
5
6
# User privilege specification
root ALL=(ALL:ALL) ALL
用户 所有的终端都能使用sudo 所有的用户

# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL

四个ALL的含义

  1. 在任何主机上
  2. 可以切换到任何用户
  3. 可以切换到任何组
  4. 执行任何命令
    在ubuntu,debian,kali默认安装后,root用户是空密码不能直接登录。可以sudo su并输入当前用户的密码,切换到root用户

任务:新建用户zs,把zs添加到/etc/sudoers配置文件中,要求zs可以使用sudo执行cat命令

步骤:

  1. 切换root用户
  2. 修改/etc/sudoers的权限,默认440,改为640
  3. 修改配置文件内容,加如下一行
1
zs      ALL=(ALL:ALL) /usr/bin/cat 可以使用的命令必须填写绝对路径
  1. 还原/etc/sudoers配置文件的权限
  2. 测试

    sudo无密码执行[linux sudo 提权]

    zs用户不需要密码,就能使用sudo执行cat命令,且只能使用cat命令

文件权限

文件创建时权限664 ,通常是 666 - umask (其实啊,在二进制层面是按位与操作),但”666减去umask”这个说法更容易理解
计算机很笨!计算机不会四则运算,只会位运算!

1
最终权限 = 默认权限 & (~umask)

实际上

umask是什么呢?用户文件创建掩码。它决定了新创建文件和目录的默认权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0-9位说明
第0位确定文件类型(d,-,l,c,b)
l是链接,相当于windows的快捷方式
d是目录,相当于windows的文件夹
c是字符设备文件,鼠标,键盘
b是块设备,比如硬盘
第1-3位确定所有者(该文件的所有者)拥有该文件的权限 --User 属主
第4-6位确定所属组(同用户组的)拥有该文件的权限 --Group 属组
第7-9位确定其他用户拥有该文件的权限 --Other 其他人

rwx权限解释 (数字表示 r=4,w=2,x=1)一个文件权限最高是7
rwx作用到文件
r:read 可以读,查看
w:write 可以修改,但是不代表可以删除文件,删除文件的前提是对该文件所在的目录有写权限,才能删除该文件。
个人理解:Linux一切皆文件,我们把目录看作是一个文件,那么就相当目录里的文件就相当于目录的一个条目
x:execute 可以被执行
rwx作用到目录
r:可以读取,ls查看目录内容
w:可以修改(对目录内创建+删除+重命名目录)
x:可以进入该目录

给除了elf及shell脚本之外的文件赋予可执行权限是没有意义的

修改权限

  • chmod 修改权限
1
2
3
4
5
6
7
8
-R 递归赋予权限
通过权限标识符修改
chmod 777 1.txt 给所有用户赋予可读可写可执行
chmod 664 1.txt 给属主和组读写权限,其他人可读
通过字母修改
chmod u+x,g+w 1.txt 给1.txt的属主加执行权限,属组加上写权限
chmod +x 1.txt 给所有用户添加1.txt的执行权限 (chmod a+x 1.txt)
chmod o+w 1.txt 给其他用户添加1.txt的写权限
  • chown 变更文件或目录的拥有者或所属群组
1
chown kali:kali 1.txt 修改1.txt的拥有者或所属群组为kali,kali

权限拓展位

权限计算器: https://chmodcommand.com/

  • setuid(suid)位:4xxx s

    [!question] 思考
    1.普通用户zhangsan能不能修改zhangsan自己的密码?可以
    2.改密码其实是改哪个文件?/etc/shadow(/etc/passwd 占位符)
    3.普通用户zhangsan能不能修改/etc/shadow?不可以


产生悖论

==suid权限的文件,在执行的时候,运行的权限为属主用户的权限==
/usr/bin/passwd属主是root,任何人执行passwd运行的权限都是root

suid权限赋予除elf文件和shell文件之外的文件是无意义的

  • setgid(sgid)位: 2xxx s
    ==sgid权限的文件,在执行的时候,运行的权限为属组用户的权限==
  • sticky bit 粘滞位:1xxx t
    /tmp文件夹的权限是777,黑客经常把恶意文件上传到这个目录(不需要考虑权限问题)
    /tmp目录实际的权限是1777权限
    ==限制文件的权限与属主用户相关,root用户不受该限制==

    粘滞位只有赋予给文件夹才有意义,赋予给文件无任何意义

系统管理命令

  • ifconfig 配置和显示Linux系统网卡的网络参数
1
2
3
属于第三方的软件包net-tools,部分Linux操作系统没有安装
localhost 本地回环地址 127.0.0.1
ethx / ensxx 以太网地址

  • ip address (ip a) 查看ip
  • ping 测试主机之间网络的连通性
1
2
ping -c 4 www.baidu.com        ping4下www.baidu.com结束ping
使用 -c 指定次数 (Windows中指定次数是 -n)

Linux:

Windows:

ping 命令的小细节
首先,大家都知道ping 命令基于 ICMP(Internet Control Message Protocol)协议 因特网控制消息协议 这里附上一张图,介绍了它的type和code,了解这个能让我们快速的通过ping的报错,抓包分析快速定位到错误原因

pc上ping不通的几种情况原因及解决方法 (经验之谈 一般情况,不全

  • 无法访问目标主机
    • 原因:网关没有路由,没有获取到MAC地址 arp解析失败…

      解决方法:检查pc的路由表,检查arp表项,检查网关配置是否正确…
  • 传输失败
    • 原因:当主机尝试去访问其它网络内的主机,而本身没有配置网关

      解决方法:检查网关,是否配置,配置网关…
  • 请求超时
    • 原因:对方主机不在线、屏蔽等…

      解决方法:一般来说无需解决,只是ping不通而已,这跟windows防火墙策略有关,想要通,检查双方防火墙,高级防火墙设置。对方pc打开icmp入站规则,我方pc打开出站规则,即可通…
      通常是这样,实际情况需一步步排错
  • ttl: 生存时间,每经过一个路由器减1 (了解即可)
    • TTL默认值 (只是默认值,可以改的)
      • Linux 64
      • Windows 128
      • MacOS 64

linux系统中的ping是无线循环的
ping 127.1 ,0,127.0.0.1 是一样的效果
在命令执行中,限制payload的长度时,可以使用这个小技巧

  • nslookup 查询域名DNS信息
1
nslookup 域名 dns服务器的地址


为什么有多个ip地址出现
1.网站使用CDN负载均衡
2.网站服务器有不同的公网出口

网络状态

dns www.baidu.com => ip
netbios 主机名 => ip (局域网)

网络管理

  • netstat
1
2
3
4
5
6
7
8
属于第三方的软件包net-tools,说明部分Linux操作系统没有安装
netstat -anltup
a all所有的
n 不要进行netbios解析
l 显示listen
t 显示tcp
u 显示udp
p 显示进程id pid


proto 协议
local address 本地地址
foreign address 外部地址
state 状态
TCP常用状态

  • ESTABLISHED 已连接
  • LISTEN 监听
  • TIME-WAIT 时间等待
    额外小拓展:
    tcp 从建立到关闭连接过程草图

    pid 进程号/program name 程序名

    如果在Local Address中看到0.0.0.0代表ifconfig看到的所有ipv4网络地址
    端口返回0~65535 tcp/udp
    Foreign Address外部地址(目标地址)中的0.0.0.0 表示所有ipv4地址(任意)
    源端口随机(port >= 40000),目的端口固定

    80端口的监听允许所有的ipv4地址连接(前提是能连的上,公网默认不能连接内网)

1
2
3
4
5
Windows中是netstat -ano    netstat -anob(必须管理员权限)
a all -b 查看进程对应的可执行程序(exe)
n no netbios
o 进程id pid
macos:netstat -anl -ptcp

请注意这里我能使用grep,是因为我在windows中配置过,通常情况下是无法结合使用grep的!
查找445端口有没有被占用:netstat -ano | grep ":445"

在Windows中常规方法为:netstat -ano | findstr ":445"

[::] ipv6 等价于 ipv4的0.0.0.0

  • ss -antup 兼容netstat
1
比 netstat 好用的socket统计信息,iproute2 包附带的另一个工具,允许你查询 socket 的有关统计信息

  • lsof -n -i
    • -n 阻止 lsof 将 IP 地址反向解析为域名
    • -i 只显示与网络相关的“文件”
      列出系统中所有正在使用的网络连接,并以纯 IP 地址的形式显示

      如果不加 -n
1
2
lsof 用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)
lsof -p pid 列出指定进程当前打开的所有文件

进程管理

  • ps -elf / ps -aux 查看进程
1
2
3
-e:显示所有程序
-l:采用详细的格式来显示程序状况
-f:显示UID,PPIP,C与STIME栏位


ps -aux 查看进程详细信息

1
2
3
-a:显示所有终端机下执行的程序,除了阶段作业领导者之外
-u:列出属于该用户的程序的状况,也可使用用户名称来指定
x:显示所有程序,不以终端机来区分。

[!NOTE] 如何查看pid运行对应的程序 (木马排查)
方法一:
lsof -p pid

方法二:
cd /proc/pid
ls -l exe

如何终止程序

  • kill 结束进程
1
2
3
4
5
kill -9 想终止进程的PID
-9 强制终止程序
为什么是-9?
-9 是 SIGKILL 这个信号的编号。SIGKILL 信号的含义是“立即、无条件地终止进程”,进程无法捕获、忽略或阻止这个信号
操作系统课程的内容,了解即可
  • top 实时显示进程 每5秒刷新一下
    按q退出
1
2
3
4
5
6
7
top交互时命令
m:切换显示内存信息
t:切换显示进程和CPU状态信息
c:切换显示命令名称和完整命令行
M:根据驻留内存大小进行排序
P:根据CPU使用百分比大小进行排序
T:根据时间/累计时间进行排序

网络配置

ip地址

kali & ubuntu

配置文件:/etc/network/interfaces
kali/debian/ubuntu都是这个配置文件

1
2
3
4
5
auto eth0
iface eth0 inet static
address 192.168.79.79
netmask 255.255.255.0
gateway 192.168.79.254 #网关设置NAT设置里网关的ip地址
新版本ubuntu
1
2
3
安装vim
apt update
apt install vim

在/etc/netplan/01-network-manager-all.yaml 修改配置文件前,切记备份

1
sudo cp -p /etc/netplan/01-network-manager-all.yaml /etc/netplan/01-network-manager-all.yaml.bak 

注意:语法要求相当严格,多一个少一个空格都不行

1
2
3
4
5
6
7
8
9
10
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: no
addresses: [192.168.79.111/24]
gateway4: 192.168.79.254
nameservers:
addresses: [223.5.5.5]


补充小知识:yaml文件格式 参考文章: https://www.cnblogs.com/wxmdevelop/p/7341292.html

1
2
3
4
5
6
7
8
9
YAML基本语法规则
大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
YAML支持的数据结构
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的、不可再分的值

配置完成后
netplan try 检查语法错误
netplan apply 应用网络配置

centos

配置文件:/etc/sysconfig/network-scripts/ifcfg-ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33

1
2
3
4
5
6
7
8
9
# 这里说一些比较重要的配置项
# 将BOOTPROTO=dhcp 改为 static
# ONBOOT=yes 开机就自动启动网卡
IPADDR=192.168.79.234
NETMASK=255.255.255.0
GATEWAY=192.168.79.254
# 下面是配置dns,可以配置多个
DNS1=223.5.5.5
DNS2=114.114.114.114


重启网络
法一:

  • ifdown 网卡名称 关闭
  • ifup 网卡名称 启动
    法二:
  • systemctl restart network.service
    法三:
  • service network restart

dns地址

1
2
3
4
5
6
配置文件:/etc/resolv.conf 临时配置,重启后还原
vim /etc/resolv.conf
nameserver 223.5.5.5
解决重启后还原的办法
chattr +i /etc/resolv.conf
i:不得任意更动文件或目录

软件及服务的配置

安装软件

  • apt / apt-get
    apt换源 vim /etc/apt/sources.list 一次配置就行
1
2
3
4
5
6
7
8
9
10
查看ubuntu/debian/kali的系统版本
lsb_release -a 查看发行版本
uname -a / hostnamectl 查看内核版本
apt ubuntu/debian/kali 软件包管理器
apt update 更新软件源列表
apt upgrade 升级所有的软件 (尽量不要使用)
apt install 软件包名 安装软件
apt search xxx 搜索软件包名
apt autoremove 包名 删除所有未使用的软件包
remove
  • yum
    软件包管理CentOS Redhat 系列发行版本使用
1
2
3
4
5
cat /etc/readhat-release 查看系统发行版本 CentOS Redhat
yum makecache 生成缓存
yum clean all 清除缓存
yum remove 删除软件包
erasure

服务配置

  • systemctl 系统服务管理
    它实际上将 service 和 chkconfig 这两个命令组合到一起
1
2
3
4
5
6
systemctl start 服务名 启动服务
disable 关闭开机自启动
enable 开启开机自启动
restart 重启服务
stop 停止
status 查看服务状态
  • /etc/init.d/服务的名字
1
2
3
4
/etc/init.d/mysqld start
stop
restart
status
  • service
    现在的操作系统,使用service命令,实际是转到systemctl命令的
1
2
3
4
service 服务名 start
stop
restart
status

操作系统信息

  • 操作系统主机名
1
hostname
  • 系统版本(发行版)
1
2
3
4
5
6
Kali/Ubuntu/Debian
cat /etc/os-release
Centos/Redhat
cat /etc/redhat-release

cat /etc/*-release
  • 系统版本(内核版本)
1
2
3
4
5
uname -a 所有信息

uname -r 内核版本
uname -p 架构
uname -n 等价 hostname
  • 历史记录
1
2
3
4
5
6
history 查看历史记录
-c 清除记录
-a 保存记录
!历史记录号 执行该条命令

echo $SHELL 查看当前用户使用的shell是什么 zsh bash

历史记录保存在那里?

1
2
3
cat /当前用户家目录/.当前用户shell类型_history

cat ~/.*_history 查看当前用户历史记录
  • 常见其他命令
1
2
3
4
df -h 磁盘占用空间
free 查看内存空间
man 帮助文档
chown 属主:属组 file_name

后台运行程序

程序默认情况是在前台运行,如果让程序一开始就放到后台运行,需要在程序结尾加 &

1
2
3
4
5
6
7
8
ping 114.114.114.114 > test.txt 默认情况,前台运行

ping 114.114.114.114 > test.txt & 在后台运行,如果终端关闭,后台程序也会被关闭

nohup 将程序以忽略挂起信号的方式运行起来
nohup ping 114.114.114.114 > test.txt & 在后台运行,终端关闭,后台程序也不受影响,jobs 看不见, 需要看进程才能看见
ps -elf | grep ping
kill -9 pid 终止掉进程


nohup 运行时就能看见pid

ssh

ssh服务

默认端口22
kali / ubuntu 默认情况没有开启服务

1
2
3
4
5
6
7
8
9
10
11
systemctl start ssh
开机自启动服务
systemctl enable ssh
update-rc.d ssh enable
原理:在/etc/rc[2-5].d/ 创建服务软链接
如/etc/init.d/ssh 链接到 /etc/rc2.d/S01ssh
rc3.d 是命令行多用户模式
rc5.d 是图像化多用户模式

安装ssh
apt install openssh-server

配置文件:/etc/ssh/sshd_config 服务配置文件
常见配置项:

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
29
30
31
32
33
34
35
36
37
38
39
# ========================
# SSH 服务配置文件示例
# 路径: /etc/ssh/sshd_config
# 生效命令: sudo systemctl restart ssh
# ========================

# ----- 基础配置 -----
Port 22222 # 修改默认端口(建议1024-65535)
ListenAddress 0.0.0.0 # 监听所有IP(如需限制可改为服务器内网IP)
Protocol 2 # 仅使用SSHv2

# ----- 认证配置 -----
PermitRootLogin no # 禁止root直接登录
PasswordAuthentication no # 禁用密码认证(推荐密钥登录)
PubkeyAuthentication yes # 启用公钥认证
AuthorizedKeysFile .ssh/authorized_keys # 公钥存储路径
PermitEmptyPasswords no # 禁止空密码
MaxAuthTries 3 # 限制登录尝试次数

# ----- 用户限制 -----
AllowUsers user1 user2 # 白名单用户(空格分隔)
#DenyUsers hacker # 黑名单用户

# ----- 会话管理 -----
LoginGraceTime 2m # 登录超时时间
ClientAliveInterval 300 # 客户端活动检查(秒)
ClientAliveCountMax 3 # 断开无响应客户端
MaxSessions 10 # 每个IP最大会话数

# ----- 安全增强 -----
UseDNS no # 禁用DNS解析(加速登录)
X11Forwarding no # 禁用X11转发
AllowTcpForwarding no # 禁用TCP端口转发
Compression no # 禁用压缩(防攻击)

# ----- 日志与提示 -----
LogLevel INFO # 日志级别
PrintMotd yes # 显示登录后消息
PrintLastLog yes # 显示上次登录信息


配置文件(修改了任何内容,需要重启服务后才生效)


开启密码登录

配置完成后,重启服务systemctl restart ssh
ssh检查配置文件语法

1
sudo sshd -t  # 测试配置是否正确


修改成错误的配置如下:

ssh客户端

1
2
3
4
ssh 用户名@主机ip
ssh kali@192.168.79.79
ssh kali@192.168.79.79 -p 11022 -p 指定端口
ssh kali@192.168.79.79 -i /root/.ssh/id_rsa -i 指定身份文件


==在同一个主机中端口不能冲突,同一局域网中ip不能冲突==

scp/sftp 文件传输

scp

scp是基于ssh服务的文件的复制工具

1
scp 本地的文件路径 用户名@IP地址:服务器绝对路径

本地 -> 服务器
传输:

在/tmp目录找到该文件

服务器 -> 本地

1
scp 用户名@IP地址:服务器绝对路径 本地的文件路径

下载:

sftp

sftp是基于ssh的文件传输

1
sftp 用户名@IP地址

支持功能:

1
2
3
4
5
6
7
8
9
10
ls 列出服务器上的文件
cd 切换服务器目录
pwd 查看服务器当前路径
get 文件路径 下载服务器到本地
put 文件路径 把本地文件上传到服务器
rm 文件路径 删除服务器上的文件
退出sftp
quit
exit
bye

密钥对登录

密钥默认路径:~/.ssh/

  • public key 公钥 id_rsa.pub
  • private key 私钥 id_rsa
    密钥连接步骤
  1. 生成密钥 ssh-keygen -t rsa -t:指定要创建的密钥类型 在哪生成都可以
  2. 把公钥写入到服务器的~/.ssh/authorized_keys ~用户家目录
1
2
3
4
5
echo "\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCm7I8g2E3XEoeUvoI6g57kLCznoGkeM+FG5qsiMsVZ7OSFQq8WfRPy3XtTiZfILBg61iQpd0JNl+sgoBi73tGNH8Ty2tstZBdmLWOmZAgtOZW0vJj8PpsjW2dCPFS/PvYP3Z5Fd6uy9U3p66KRGq1lXVKoD3HhE8jAai11doiJ68i6j/0NebktV8SHEmL6+xkMHp4mnlGdtLA/RszxH3ZFBkFiPkeiCVD+QEx4U9RnGVViWxF8/i8vbquS+jpqlJI1anZgJeYIk/bZVXYe5aMFETOn9hn7KSQBrfREZXHlRwBOLBz7c9uD/GOuAi8MWFjkRi4EAmsvZs/GdGWpBZ0FlBF0bQXGcqRwXQOUNQu1GB/gRsOJUQflZPV2KVhXh7qJ5f1Fq2h5mw3BtG+bjQD3eskx1LV40qKYLdQAost76q47XZB4x0+pD0ctNn6iuqaWJw71HEap4rPlRqpJ2O1iQjcCmwXWEYxAETbt7yByxg5pDfRg2XOwe1wtderq3RE= root@kali" >> /root/.ssh/authorized_keys

> 为覆盖写,慎用!
>> 追加写
\n 转义字符,代表回车符
  1. 用私钥连接ssh服务
1
ssh root@ip -i 私钥路径 -p port

在Windows上使用Linux上生成的公钥进行连接

  1. 把私钥文件放在Windows上
1
2
3
cp -p /root/.ssh/id_rsa /home/kali/Desktop
chmod 777 id_rsa
直接将id_rsa文件拖到Windows上
  1. 用私钥连接ssh服务 ssh root@ip -i 私钥路径 -p port
    使用刚刚高权限的私钥连接,kali中报错情况如下:

    使用刚刚高权限的私钥连接,Windows中报错情况如下:

    这个报错是说id_rsa文件权限有问题,ssh服务识别id_rsa权限为600时,才能正常工作
    在windows中修改id_rsa权限的方法



    点击添加,选择主体,添加系统登录的用户


    即可使用,再次尝试,发现登录成功

第三方工具连接ssh

开机自启动

方法1:

1
systemctl enable ssh

方法2:

1
update-rc.d ssh enable

多用户的图形化模式开机自启动,就是把服务链接到/etc/rc5.d文件夹中

计划任务

定时任务在哪?

  • 系统计划任务 /etc/crontab
  • 用户计划任务
    • centos / redhat系列:/var/spool/cron/用户名
    • debian / ubuntu / kali系列:/var/spool/cron/crontabs/用户名
1
2
3
4
5
6
crontab 选项 参数
选项
-e:编辑该用户的计时器设置;
-l:列出该用户的计时器设置;
-r:删除该用户的计时器设置;
-u<用户名称>:指定要设定计时器的用户名称。

计划任务怎么看懂?
系统计划任务

1
2
3
分钟 小时 日期 月份 星期 执行该定时任务的用户 要执行的命令或脚本
每周一早晨8:00 以root权限 执行 /root/1.sh 脚本
* 8 * * 1 root /root/1.sh

用户计划任务

谁来执行该计划任务,是通过计划任务的文件名确定的
比如/var/spool/cron/crontab/root

1
2
3
分钟 小时 日期 月份 星期 要执行的命令或脚本
每周一早晨8:00 以root权限 执行 /root/1.sh 脚本
* 8 * * 1 /root/1.sh

系统重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
文件描述符(File Descriptors)
0 标准输入 (默认的位置 IO设备:键盘)
1 标准输出 (默认的位置:当前终端输出到屏幕上)
2 标准错误 (默认的位置:当前终端输出到屏幕上)
通过 /proc 文件系统查看
ls -l /proc/[PID]/fd

> 重定向符 (覆盖写) >> 重定向符 (追加)
# 把whoami的执行输出保存到1.txt
whoami 1 > 1.txt

# 把echo "Hello World!"的执行输出保存到2.txt
echo "Hello World!" 1 > 2.txt

# 把 how命令的报错保存到1.txt
how 2 > 1.txt
# 忽略报错
how 2 > /dev/null


输入错误的命令 使用2>1.txt,观察1.txt的内容

Linux常见服务

ssh

22/tcp /etc/ssh/sshd_config ~/.ssh/authorized_keys

cron

/etc/crontab /var/spool/cron/[username] /var/spool/cron/crontabs/[username]

smb / samba

centos
445/tcp 文件共享/打印机服务
运行级别 3 代表Linux命令行模式(多用户)
运行级别 5 代表Linux图形化模式(多用户)
init 3 切换至命令行模式
init 5 切换至图形化模式

安装和启动

小技巧:yum install 软件包,找不到怎么办
  1. 换yum源
1
2
3
4
5
6
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

解释:
wget 下载命令
-O (大写的O) 下载后的文件保存的路径
yum clean all && yum makecache
  1. epel 源(为centos提供更多的软件包)
    ==EPEL(Extra Packages for Enterprise Linux), 是由Fedora Special Interest Group维护的Enterprise Linux(RHEL、CentOS)中经常用到的包==
1
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

安装samba

1
yum install samba

启动samba

1
systemctl start smb

检测smb服务是否启用(看445端口有没有开启)

1
netstat -anltup | grep 445

配置smb服务

1
配置文件:/etc/samba/smb.conf
  • [global] 全局配置
    • security:share[匿名访问,不需要身份验证] user[需要用户登录才能访问]
  • [homes] 用户家目录共享设置
  • [printers]/[print$] 默认的打印共享服务

1.创建一个smb服务用户

服务用户,不需要登录,可以不要密码

1
2
3
4
5
6
7
useradd zssmb -s /sbin/nologin
指定刚刚创建的zssmb用户为smb用户
pdbedit -a -u zssmb
-a 添加用户
-u 指定用户
密码:123456 (通过pdbedit设置的密码是smb服务用户密码)
不是Linux系统密码 /etc/shadow的内容zssmb:!!:20306:0:99999:7:::


添加一个共享文件夹mkdir /opt/tools
在配置文件/etc/samba/smb.conf中添加一个新的项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[public_smb]
# 注释
comment = public smb tools
# 共享文件夹的路径
path = /opt/tools
# 设置共享文件夹不是所有用户都能访问
public = No
# 设置共享文件夹是否为只读模式
read only = No
# 设置允许访问的用户
valid users = zssmb
#设置那些用户对共享文件夹有写权限
#(忽略read only的配置)
write list = zssmb
# 用户新建文件的默认权限是多少
create mask = 0664
# 用户新建文件夹的默认权限是多少
directory mask = 0775


重启服务systemctl restart smb

连接和使用smb

  • Linux连接smb
    如果没有smbclient命令,就需要安装samba-client软件包
1
2
smbclient -U 用户 //服务器ip/共享名称
smbclient -U 用户 -L 服务器ip 查看所有的共享文件夹(如果没有隐藏的话)

如果连接不上就关闭selinux和防火墙,在Centos7中防火墙是firewalld

[!help] Selinux
临时关闭selinux: setenforce 0
查看selinux状态: getenforce
关闭防火墙: systemctl stop firewalld
永久关闭selinux:需要修改配置文件/etc/seconfig
将SELINUX=enforcing 修改为SELINUX=disabled

查看共享文件夹

在这个命令行里输入help,查看samba的命令行帮助

  • Linux挂载smb (默认只读)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mount -o username=用户名 //服务器ip/共享文件夹 要挂载的目录
-o 指定挂载文件系统时的额外参数
username=用户名 指定访问 SMB 共享的用户名
password=密码 指定密码
credentials=/path/to/file 从文件读取用户名和密码(更安全)
uid=用户ID 设置挂载后的文件所有者(如 uid=1000)
gid=组ID 设置挂载后的文件所属组
file_mode=权限 设置文件权限(如 file_mode=0644)
dir_mode=权限 设置目录权限(如 dir_mode=0755)
vers=协议版本 指定 SMB 版本(如 vers=3.0)
ro 或 rw 只读挂载(ro)或读写挂载(rw,默认)
noserverino 防止 inode 问题(某些旧 SMB 服务器需要)
sec=安全模式 指定安全认证方式(如 sec=ntlmssp)

umount -v 挂载点 取消挂载

此时已经挂载成功,可以看见一个flag.txt

卸载挂载点,验证/mnt/下是否有内容

  • Windows连接smb
  1. win + r输入smb访问路径,输入账户密码,点击确定
  2. 在资源管理器输入访问路径 ,输入账户密码(注意是反斜杠,称为UNC路径)

    在Windows建立smb连接后,凭证会被缓存到系统中
  3. windows cmd命令连接smb
1
2
3
4
5
6
7
net use 查看已经建立的网络连接
net use \\192.168.79.131\public_smb /del 删除已经建立的连接
net use \\192.168.79.131\public_smb /user:zssmb "123456"
# 将smb共享文件夹映射到z盘,需要写一个不存在的盘符
net use z: \\192.168.79.131\public_smb /user:zssmb "123456"
# 删除共享映射的磁盘
net use z: /del

查看已经建立的网络连接

删除一句建立的网络连接,并验证是否删除成功

使用命令去连接smb
net use \\192.168.79.131\public_smb /user:zssmb "123456"

将smb共享文件夹映射到z盘
net use z: \\192.168.79.131\public_smb /user:zssmb "123456"

Windows smb服务默认是开启的,无法连接:

  • 防火墙默认阻止smb 连接
  • 所有的杀毒软件也会阻止smb连接
  • Windows本身限制windows smb服务,用户必须是administrator,但是这个用户在个人电脑上是默认禁用的

网络磁盘 nas
smb历史漏洞很多

  • 永恒之蓝 ms17-010(windows smb)
  • CVE-2017-7494(ubuntu smb)

FTP

文件传输协议
20/21 tcp
20 上传,下载端口
21 发送命令,身份验证端口

安装

需要安装vsftpd软件包

  • yum安装 yum install vsftpd -y
  • rpm安装
1
2
3
4
5
6
7
8
# 下载rpm包
wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/vsftpd-3.0.2-28.el7.x86_64.rpm
# 安装rpm包
rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm
# 显示已经安装的软件包
rpm -qa
# 显示一个rpm包中的文件安装到那里去了
rpm -ql 包名

使用wget下载rpm如下图:

使用rpm安装vsftpd如下图:

配置

启动服务

1
systemctl start vsftpd

配置文件/etc/vsftpd/vsftpd.conf
特点:anon匿名用户的相关配置;local本地用户的相关配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
anonymous_enable=YES:设置是否允许匿名用户登录FTP服务器。
local_enable=YES:设置是否允许本地用户登录FTP服务器。
write_enable=YES:全局性设置,设置是否对登录用户开启写权限。
ftp_username=ftp:设置匿名用户的帐户名称,默认值为ftp。
file_open_mode=644:设置上传文档的权限。

# 指定用户列表文件路径
userlist_file=/etc/vsftpd/vsftpd.userlist
# 启用黑名单
userlist_enable=YES
userlist_deny=YES 指定用户列表文件中的用户是允许登录还是不允许

# 启用白名单
userlist_enable=YES
userlist_deny=NO
  1. 无需配置即可匿名登录
  2. 身份验证登陆
1
2
3
4
5
6
anonymous_enable=YES  拒绝匿名用户登录
local_enable=YES 允许本地系统用户登录
write_enable=YES 是否对登录用户开启写权限
userlist_file=路径 指定用户列表文件的路径
userlist_enable=YES 开启用户列表
userlist_deny=NO 指定文件中的用户是否允许登陆(黑/白名单)

创建一个普通用户作为ftp的登录用户,用户家目录设置为你登录ftp时访问的目录

1
2
3
4
5
6
mkdir /opt/ftpdir
useradd ftp_test -d /opt/ftpdir
把用户家目录属主和属组设置为ftp_test
chown ftp_test:ftp_test /opt/ftpdir
设置密码
passwd ftp_test

有用的配置项如下,过滤出主配置文件的所有有效行:
grep -v "^#" /etc/vsftpd/vsftpd.conf |grep -v "^$"

这样配置是不安全的,登录上ftp后,可以离开登录目录

限制用户无法离开家目录

1
2
3
# 限制ftp登录的用户只能访问家目录和及其子目录
chroot_local_user=YES
如果设置后直接访问,会报错


ftp服务器认为,ftp登录后的文件夹要不具备写权限,只有子文件夹才能写

1
chmod -w /opt/ftpdir

修改权限后,能够正常登录

使用

python快速开启ftp服务

原因是没有这个模块,解决办法:pip install pyftpdlib

下载时报错,这个错误是因为你的系统(如 Kali Linux)启用了 PEP 668(Python 外部包管理保护机制),禁止直接使用 pip 安装 Python 包到系统目录,以避免破坏系统依赖,有以下几种解决方式

使用虚拟环境

首先git clone 下载这个脚本

1
git clone https://gitee.com/yijingsec/LinuxEnvConfig.git

在LinuxEnvConfig目录中bash LinuxEnvConfig.sh运行脚本
安装Miniconda3来管理python的虚拟环境

接下来按着提示一步步安装完成,需要等待几分钟,输入conda -V有类似的结果说明安装成功,如果没有conda命令,重启一下电脑就好了

conda取消自动进入base虚拟环境
conda config –set auto_activate_base false
新版使用
conda config –set auto_activate false
常用命令

1
2
3
4
5
6
conda activate 虚拟环境名称        进入虚拟环境
conda deactivate 退出虚拟环境
conda env list 列出所有虚拟环境
conda create -n 环境名 python=版本 创建指定 Python 版本的虚拟环境
conda remove -n 环境名 --all 删除整个虚拟环境
conda list 列出当前环境所有包


进入虚拟环境,使用pip安装pyftpdlib

安装完成,使用python开启ftp服务

1
2
3
4
5
6
7
8
9
10
# 使用官方的源会有点慢,这里可以使用-i选项临时更改pypi镜像源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyftpdlib

# 使用python在21端口开启一个ftp服务,用户是anonymous
# 密码是空密码,访问路径是当前路径
python -m pyftpdlib -p 21

# 使用python在21端口开启一个ftp服务,用户是admin,密码为123456
# -u 指定用户(虚拟的用户) -P 指定密码
python -m pyftpdlib -p 21 -u admin -P 123456

使用包管理器apt安装

apt install python3-包名


源码编译安装

灵活,想安装什么版本就安装什么版本

安装编译Python所需的依赖包

1
yum install -y gcc openssl-devel bzip2-devel libffi-devel
1
2
3
4
5
6
7
源码编译安装
1.到python官网上选择对应的python版本
2.解压tar -xvf 压缩包
3.执行 ./configure --enable-optimizations
4.编译安装 make install
5.测试结果python3.8 -V
6.创建软链接 ln -s 源文件 目的文件
在windows上连接ftp
  1. 使用命令连接与Linux一致
  2. 在Windows资源管理器
1
ftp://服务器IP
  1. 第三方FTP客户端
    使用FileZilla

Linux防火墙

iptables

老版本的防火墙应用,基于netfilter,是CentOS 6 之前的默认防火墙
iptables命令主要由表(table)、链(chain)、规则(rule)三部分组成

    • filter:过滤数据包,最常用的表
    • nat表:用于网络地址转换(NAT),主要用于路由器等设备上
    • mangle表:用于修改数据包的TTL值、TOS值等
    • raw表:用于指定不被连接跟踪的数据包
    • INPUT链:处理进入本地主机的数据包
    • OUTPUT链:处理从本地主机发出的数据包
    • FORWARD链:处理转发到其他主机的数据包
    • PREROUTING链:在路由前对数据包进行处理
    • POSTROUTING链:在路由后对数据包进行处理
  • 规则
    • 匹配条件
      • 网络协议
      • 源IP地址
      • 目标IP地址
      • 源端口号
      • 目标端口号
    • 动作
      • ACCEPT:允许数据包通过
      • DROP:丢弃数据包
      • REJECT:拒绝数据包
      • SNAT:源地址转换
      • DNAT:目标地址转换
常用命令
1
2
3
4
5
6
7
iptables -L -n --line-numbers
-L 列出所有的规则(filter表)
-n 显示ip地址
--line-numbers 显示行号
iptables -t nat -L -n --line-numbers 看nat表的规则

iptables -L -n -v --line-numbers 显示网卡名称
添加规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
iptables -I 或 -A
-I 链的头部添加一个规则
-A 链的尾部添加一个规则
丢弃来自192.168.79.131的icmp流量
iptables -I INPUT -s 192.168.79.79 -p icmp -j DROP
-I 在链头添加
-s 来源ip
-p 协议
-j 动作
iptables -I INPUT -p icmp -j DROP
禁用ping
iptables -I INPUT -s 192.168.79.79 -j DROP
完全禁止 192.168.79.79连接

--sport 源端口
--dport 目的端口
iptables -I INPUT -s 192.168.79.79 -p tcp --dport 80 -j DROP

为什么是丢弃目的端口的包如下图所示

丢弃kali的目的端口,源端口无法封,因为源端口随机
CentOS ip:192.168.79.131

Kali ip:192.168.79.79

设置防火墙规则前Kali ping CentOS

设置防火墙规则后Kali ping CentOS

1
2
3
4
5
iptables -I INPUT -s 192.168.79.79 -p tcp -m multiport --dport 20,21 -j DROP
-m multiport 在一条规则中指定多个端口
iptables -I INPUT -s 192.168.79.79/24 -p tcp --dport 80 -j DROP
拦截192.168.79.x 整个网段
iptables -I INPUT -m iprange --src-range 192.168.79.100-192.168.79.110 -p tcp --dport 80 -j DROP
添加规则(出方向)
1
2
3
4
5
6
7
8
9
10
11
12
13
iptables -I OUTPUT -p icmp  -j DROP
给自己禁用ping
备注:拦截了icmp的出方向,入方向也是无法通信的
为什么?
kali ping centos
1. kali向centos发送ping请求(icmp request)
2. centos 收到请求后,给kali一个回复(icmp reply)
iptables -I OUTPUT -p tcp --dport 443 -j DROP
禁止centos访问任何网站的443端口,简称 禁止访问https
(https不出网,tls不出网)
iptables -I OUTPUT -p icmp -o ens33 -j DROP
-o 针对网卡,要有多个网卡才有意义
禁止ens33这个网卡ping
删除规则
1
2
3
4
5
6
iptables -D
-D 删除规则
iptables -D INPUT 1
删除INPUT链的第一条规则
iptables -F
-F 删除filter表的所有规则

ufw

debian / ubuntu防火墙,基于iptables,其实还是iptables,但是ufw更简单,默认允许所有出方向流量,且默认禁止所有入方向流量
在kali中安装ufw

1
apt install ufw
基础使用
1
2
3
4
5
6
7
8
9
10
11
开启ufw服务
systemctl start ufw

开启ufw防火墙
ufw enable

关闭ufw防火墙
ufw disable

查看
ufw status

配置规则
1
2
3
4
5
6
7
8
9
10
11
12
ufw allow 端口/tcp
设置规则后,ufw会自动生效,不用重启
如果没有生效,ufw reload 重新加载规则
ufw allow 服务名

ufw status 查看规则
ufw status numbered 查看规则(加上标号)

删除规则
ufw delete allow 端口/tcp 默认把对应的ipv4和ipv6两条规则都删掉
ufw delete 标号 删除标号对应的规则
如:ufw delete 2 删除2号对应的规则

使用服务名称进行配置

1
2
ufw allow from 192.168.79.131 to any port 80 proto tcp
允许192.168.79.131 访问自己的80端口

配置规则(出方向)
1
2
3
4
5
6
ufw deny out 服务名
拒绝22出
ufw deny out ssh
ufw deny out 22/tcp
ufw deny out to 192.168.79.131 port 80 proto tcp
拒绝连接 192.168.79.131的80

firewalld

redhat / centos 7之后的防火墙,firewalld不是iptables

基础操作
1
2
3
4
systemctl start/stop/restart/status firewalld

查看firewalld的运行状态
firewall-cmd --state
1
2
查看public区所有的规则
firewall-cmd --list-all

1
2
3
4
查看开放的端口
firewall-cmd --list-ports
查看开放的服务
firewall-cmd --list-services

配置规则

firewalld 的出方向配置和指定ip地址配置都需要使用富规则,可以改用iptables

1
2
3
4
5
6
7
8
9
10
11
12
firewall-cmd --add-port=8000/tcp
入方向8000端口允许连接
firewall-cmd --remove-port=8000/tcp
删除规则

firewall-cmd --add-service=ftp
允许ftp连接(和firewall-cmd --add-port=21/tcp 是不一样的)

firewall-cmd --add-icmp-block-inversion
禁止icmp流量
firewall-cmd --remove-icmp-block-inversion
允许icmp流量

添加允许规则后,访问

删除规则再次访问


访问失败,说明防火墙配置生效

firewalld 应急模式
1
2
3
4
firewall-cmd --panic-on  开启应急模式
关闭所有连接,并禁止出方向,入方向所有流量
firewall-cmd --panic-on 关闭应急模式,恢复默认的配置
firewall-cmd --query-panic 查询是否开启应急模式

SELinux

SELinux(Security-Enhanced Linux)是一个内置于Linux内核中的安全子系统,它通过强制访问控制机制来增强系统的安全性。SELinux的工作原理是定义每个人对系统上的应用、进程和文件的访问控制,利用安全策略来强制执行允许的访问。SELinux有三种模式:Disabled(禁用),Permissive(宽容模式),和Enforcing(强制模式)。
不是传统意义的防火墙 selinux

1
sestatus 查看selinux的状态

临时关闭

PermissiveEnforcing之间可以通过命令setenforce进行临时切换

1
2
3
4
setenforce 0 设置selinux模式为Permissive 宽容模式,仅记录违规不阻止
setenforce 1 设置selinux模式为Enforcing 强制执行模式

getenforce 显示当前SELinux的应用模式

永久关闭

要在DisabledPermissiveEnforcing之间切换,需要修改配置文件/etc/sysconfig/selinux并重启系统
SELinux的模式和状态切换

  • Disabled:SELinux功能完全关闭,系统不会执行任何SELinux安全策略。
  • Permissive:SELinux处于警告模式,违反策略的行为不会被阻止,但会被记录在日志中。
  • Enforcing:SELinux处于强制模式,违反策略的行为将被禁止。
1
2
SELINUX=disabled
SELINUXTYPE=targeted
  • 标题: Linux
  • 作者: Parad0x7e
  • 创建于 : 2025-11-19 20:56:05
  • 更新于 : 2025-11-11 23:29:04
  • 链接: https://note.easyctf.top/2025/11/19/Linux/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。