Linux基础知识(持续更新)

Linux基础知识

VPN 连接

这个当时搞了好一会,首先先从hackbox中下载好vpn文件,然后放到kali里面中去

先加好代理

1
source proxy.sh

然后进入root权限,再去使用

1
openvpn 加上你的文件名

image-20250323143355951

出现这个之后就代表你成功了,然后进行ssh连接

ssh+用户名+@+你的靶机 ssh htb-student@10.10.15.208, 然后再输入密钥就可以连接成功了

image-20250323143840515

这样子就是连接成功了

系统信息

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
whoami 		显示当前用户名
id 返回用户身份
hostname 设置或打印当前主机系统的名称
pwd 返回工作目录名称
ifconfig 实用程序(ip)用于为网络接口分配或查看地址和/或配置网络接口参数
ip Ip 是一种用于显示或作路由、网络设备、接口和隧道的实用程序
netstat 显示网络状态
ss 另一个用于调查套接字的实用程序
ps 显示进程状态
who 显示登录者
env 打印环境或设置并执行命令
lsblk 列出阻止设备
lsusb 列出usb设备
lsof 列出打开的文件
lspci 列出pci设备
uname 打印某些系统信息,没有选项的话与-s相同
-a,按照以下顺序打印所有信息,但省略-p和-i(如果未知)除外
-s,打印内核名称
-n,打印网络节点主机名
-r,打印内核版本
-v,会输出内核的版本号和编译时的详细信息,如内核编译的日期、时间等
-m,打印机器硬件名称
-p,打印处理器类型(非便携式)
-i,打印硬件平台(不可移植)
-o,操作系统

题目

找出机器硬件名称并将其作为答案提交。

使用

1
uname -m

image-20250323145914144

htb-student 的主目录的路径是什么?

直接使用

1
pwd

image-20250323150108207

htb-student 邮件的路径是什么?

使用env 查看环境变量,|(管道符):将 env 输出的内容传递给 grep 命令,grep mail:在 env 输出中查找包含 “mail” 字符串的行

1
env |grep mail(MAIL)

image-20250323150341940

为 htb-student 用户指定了哪个 shell?

根据上面同理可得

1
env |grep SHELL

image-20250323150459665

系统上安装了哪个内核版本?(格式:1.22.3

根据刚刚的表可知

1
uname -r

image-20250323150647622

MTU 设置为 1500 的网络接口的名称是什么?

MTU是什么?最大传输单元MTU(Maximum Transmission Unit,MTU),是指网络能够传输的最大数据包大小,以字节为单位。MTU的大小决定了发送端一次能够发送报文的最大字节数。如果MTU超过了接收端所能够承受的最大值,或者是超过了发送路径上途经的某台设备所能够承受的最大值,就会造成报文分片甚至丢弃,加重网络传输的负担。如果太小,那实际传送的数据量就会过小,影响传输效率。)

使用命令

1
ifconfig -a

image-20250323150958918

得到答案 ens192

导航

1
ls -l 		可以列出文件的信息就比如

image-20250323151442531

image-20250323151449009

1
ls -a		可以列出以.开头的隐藏的文件

当然两个可以一起并用

题目

htb-user 的主目录中隐藏的 “history” 文件的名称是什么?

image-20250323152118603

“/etc” 目录中的 “sudoers” 文件的索引号是什么?

首先先移动到这个文件夹再去搜索

ls -i:列出当前目录下的文件,并显示它们的 inode 号

1
2
cd etc
ls -i |grep sudoers

image-20250323152603311

使用文件和目录

mv命令

image-20250323152833622

touch 命令 用来创建新文档

image-20250323153023610

mkdir 命令用来创建目录 使用 -p参数 可以用来创建多个目录

题目

“/var/backups” 目录中最后修改的文件的名称是什么?

1
2
cd /var/backups
ls -lt 列出来并排序

image-20250323153705687

可以很清晰的看清楚时间

“/var/backups” 目录中的 “shadow.bak” 文件的 inode 编号是多少?

又是查看编号,那跟之前那题目一样

1
ls -i |grep shadow.bak

image-20250323153843545

编辑文件

了解一下vim等的基本指令

image-20250323173902716

查找文件和目录

1
which   		此工具返回应执行的文件或链接的路径。这使我们能够确定作系统上是否提供了特定程序
1
find 			除了查找文件和文件夹的功能外,此工具还包含过滤结果的功能。我们可以使用过滤器参数,例如文件大小或日期。我们还可以指定是否只搜索文件或文件夹

过滤器功能如下

1
find / -type f -name *.conf -user root -size +20k -newermt 2020-03-03 -exec ls -al {} \; 2>/dev/null

image-20250323201748424

1
locate  		这个工具没有我们可以使用的那么多过滤器选项,但是还有好处和坏处

image-20250323202025872

题目

1.2020 年 3 月 3 日之后创建的小于 28k 但大于 25k 的配置文件名称是什么?

这个题目条件比较多,于是我们可以用find命令 去查看usr下的

/usr/bin:存放大部分用户级别的程序(例如常用的命令和应用程序)。

/usr/lib:存放共享库文件,这些库文件是程序运行时需要的。

/usr/local:存放本地安装的程序和数据,通常是管理员手动安装的软件。

/usr/share:存放共享的只读数据,例如文档、帮助文件、图标等。

/usr/include:存放头文件(通常是 C 程序的头文件),用于编译程序时引用。

1
find /usr -type f -name "*.conf" -size +25k -size -28k -newermt 2020-03-03

image-20250323202521939

2.系统上存在多少个扩展名为 “.bak” 的文件?

这个就一个条件

使用locate命令

image-20250323202601831

3.提交 “xxd” 二进制文件的完整路径。

让我们查找路径于是用 which命令去搜索得到答案

image-20250323202707899

文件描述和重定向

1.用于输入的数据流 STDIN – 0

2.用于输出的数据流 STDOUT – 1

3.Data Stream (用于与发生的错误相关的 Output) STDERR – 2

这里使用案例来会比较好理解一些

这里的大于符号 将标准输出重定向到文件,如果文件存在,会覆盖原有内容

如果是两个大于符号 将标准输出追加到文件的末尾,如果文件存在,内容会被追加到文件末尾

假如使用命令

1
find /etc/ -name shadow

终端会出现以下情况

image-20250323211009207

1.在这种情况下,将错误标记显示,我们可以通过对错误的重定向到“null device”,这样就会丢弃数据

1
find /etc/ -name shadow 2>/dev/null

image-20250323211302970

这样就不会报错了

2.我们也可以将输出的地方写进一个文件

1
2
find /etc/ -name shadow 2>/dev/null > results.txt
cat results.txt

image-20250323212551519

3.然后我们也可以将输出和报错都重定向到单独的文件

1
2
3
find /etc/ -name shadow 2> stderr.txt 1> stdout.txt
cat stdout.txt
cat stderr.txt

image-20250323212751515

输入重定向(<):

小于号的基本作用是将一个文件的内容传递给一个命令作为输入。

4.我们可以用来重定向输入

1
cat < stdout.txt

image-20250323213543224

总感觉没有区别,于是去搜了一下

image-20250323213609124

5.重定向stdout并附加文件

当我们使用大于号 () 重定向 时,如果 文件尚不存在,则会自动创建一个新文件。如果此文件存在,则无需确认即可覆盖该文件。如果我们想附加到现有文件,我们可以使用双 greater-than 号

1
2
find /etc/ -name passwd >> stdout.txt 2>/dev/null
cat stdout.txt

image-20250323215523601

6.将STDIN流重定向到文件

我们还可以使用双小字符 () 通过流添加我们的标准输入。我们可以使用 Linux 系统文件的所谓 () 函数,它定义了输入的结束。在下一个示例中,我们将使用命令通过流读取流输入,并将其定向到名为 “.” 的文件

1
2
cat << EOF > stream.txt
cat steam.txt

image-20250323215818262

7.pips

使用文件重定向 + 过滤符

1
find /etc/ -name *.conf 2>/dev/null | grep systemd

image-20250323231743230

可以再使用指令计算获得的结果的总数

1
find /etc/ -name *.conf 2>/dev/null | grep systemd | wc -l

image-20250323231840205

题目

系统上存在多少个文件扩展名为 “.log” 的文件?

因为是.log后缀,然后又要计算所以用命令

1
find / -type f -name "*.log" 2>/dev/null | wc -l

image-20250323232114649

目标系统上总共安装了多少个软件包?

1
dpkg -l |grep ^ii |wc -l 

dpkg -l:列出系统中安装的所有软件包及其状态。

grep ^ii:过滤出所有已安装的包(ii表示安装的包状态)。

wc -l:统计输出结果的行数,即已安装的包的数量

ii(installed installed):已安装的包

rc(removed config-files):已卸载但配置文件仍然保留的包

un(unknown):从未安装过的包

筛选内容

Linux more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中的说明文件,请按 h 。

1
more /etc/passwd

image-20250325011228765

image-20250325011306465

less 命令

less 与 more 类似,less 可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页。

1
less /etc/passwd

image-20250325011633318

顺便去搜了下他两的区别

image-20250325011714519

head 命令

有时我们只对文件开头或结尾的特定问题感兴趣。如果我们只想获取文件的行数,我们可以使用 工具 .默认情况下,如果未另行指定,则打印给定文件或输入的前十行

1
head /etc/passwd

image-20250325011836006

tail命令

如果我们只想查看文件或结果的最后部分,我们可以使用 called 的对应项,它返回十行

1
tail /etc/passwd

image-20250325011931512

sort命令

根据处理的结果和文件,它们很少被排序。通常有必要按字母或数字顺序对所需的结果进行排序,以获得更好的概览。为此,我们可以使用一个名为 的工具

1
2
cat /etc/passwd | sort
or sort /etc/passwd

grep命令

在许多情况下,我们需要搜索与我们定义的模式匹配的特定结果。用于此目的的最常用工具之一是 grep,它为模式搜索提供了广泛的强大功能。例如,我们可以使用 grep 来搜索默认 shell 设置为 ./bin/bash

1
cat /etc/passwd | grep "/bin/bash"

image-20250325012159640

这只是如何应用 grep 根据预定义模式有效筛选数据的一个示例。另一种可能性是排除特定结果。为此,选项 “” 与 一起使用。在下一个示例中,我们排除了禁用了名称为 “” 或 “” 的标准 shell 的所有用户

1
cat /etc/passwd | grep -v "false\|nologin"

image-20250325012303916

cut命令

具有不同字符的特定结果可以分隔为分隔符。在这里,了解如何删除特定的分隔符并在指定位置的行上显示单词很方便。可用于此目的的工具之一是 。因此,我们使用选项 “” 并将分隔符设置为冒号 () 并使用选项 “” 定义我们想要输出的行中的位置

1
cat /etc/passwd | grep -v "false\|nologin" | cut -d":" -f1

cut -d":" -f1 的作用是从文本中提取以 : 分隔的第一列

image-20250325012624294

tr命令

用我们定义的字符替换一行中的某些字符的另一种可能性是 工具 .作为第一个选项,我们定义要替换的字符,作为第二个选项,我们定义要替换它的字符。在下一个示例中,我们将冒号字符替换为空格

1
cat /etc/passwd | grep -v "false\|nologin" | tr ":" " "

image-20250325012716015

column 命令

由于搜索结果通常具有不明确的表示形式,因此该工具非常适合使用 “.” 以表格形式显示此类结果

1
cat /etc/passwd | grep -v "false\|nologin" | tr ":" " " | column -t

image-20250325012825083

awk命令

正如我们可能已经注意到的,用户 “” 的行有一列太多了。为了尽可能简单地整理出这样的结果,() 编程是有益的,它允许我们显示该行的第一个 () 和最后一个 () 结果

1
cat /etc/passwd | grep -v "false\|nologin" | tr ":" " " | awk '{print $1, $NF}'

awk 处理文本数据,$1 代表第一列(用户名),$NF 代表最后一列(默认 shell)。

作用:只输出用户名和其对应的默认 shell。

image-20250325013110025

sed命令

有时我们想更改整个文件或标准输入中的特定名称。我们可以为此使用的工具之一是名为 .最常见的用途之一是替换文本。在这里,查找我们以正则表达式 (regex) 形式定义的模式,并将其替换为我们也定义的另一个模式。让我们坚持最后的结果,并假设我们想将单词 “” 替换为 “”

开头的 “” 标志代表 substitute 命令。然后我们指定要替换的模式。在斜杠 () 之后,我们在第三个位置输入要用作替换的模式。最后,我们使用 “” 标志,它代表替换所有匹配项

1
cat /etc/passwd | grep -v "false\|nologin" | tr ":" " " | awk '{print $1, $NF}' | sed 's/bin/HTB/g'

image-20250325013219027

wc -l 命令

最后但并非最不重要的一点是,了解我们有多少成功的比赛通常很有用。为避免手动计算行数或字符,我们可以使用 工具 .使用 “” 选项,我们指定仅计算行数

1
cat /etc/passwd | grep -v "false\|nologin" | tr ":" " " | awk '{print $1, $NF}' | wc -l

image-20250325013321964

题目

在所有接口上侦听目标系统上有多少个服务?(不仅仅是在 localhost 和 IPv4 上

哈哈,完全不会啊,然后去搜了一下

1
ss -l -4 | grep -v "127\.0\.0" | grep "LISTEN" | wc -l

ss -l -4

ss 是 Linux 系统下的一个网络工具,用于显示套接字(socket)信息。它比 netstat 更加高效和快速。

  • -l 选项表示显示当前系统中所有处于 监听(LISTEN) 状态的网络连接。监听状态通常指的是那些等待进入连接的服务端口,比如 HTTP 服务(80 端口)或 SSH 服务(22 端口)。
  • -4 选项表示只显示 IPv4 地址的网络连接。如果没有这个选项,它默认会显示所有协议(IPv4 和 IPv6)。在此命令中,使用了 -4,所以它只会列出 IPv4 地址相关的连接

grep -v "127\.0\.0"

grep 是 Linux 下常用的文本搜索工具,用来筛选符合条件的行。

  • -v 选项表示 反向匹配,即排除包含某些文本的行。
  • "127\.0\.0" 代表 IP 地址 127.0.0.x(本地回环地址)。回环地址通常用于网络进程之间的通信,比如一个程序与同一台机器上的服务进行交互。因此,这个命令通过 grep -v 排除了所有包含 127.0.0(即本地回环地址)的行

wc -l

wc 是 Linux 下的一个命令,用来统计行数、字数、字符数等。

  • -l 选项表示只输出行数。它会统计前面所有命令输出的行数。

确定 ProFTPd 服务器在哪个用户下运行。提交用户名作为答案。

1
cat /etc/proftpd/proftpd.conf | grep "User"

查找这个文件中的字符

image-20250325113508166

嘿嘿第三个题目不会写

正则表达式

1
2
3
4
5
(a) --圆括号用于分组  圆括号用于将正则表达式的一部分分组,表示这一部分可以作为一个整体进行处理。它们常用于将多个字符或模式组合成一个子模式,并且可以与量词或其他操作符一起使用
[a - z] --方括号用于字符类 方括号用于定义一个字符类,表示在方括号内列出的任意一个字符。它们可以用来匹配某个字符集中的任意字符
{1,10} --大括号用于定义量词 大括号用于指定上一个模式应重复的次数。它通常与其他模式一起使用,用于控制某个模式出现的频率
| 在这里表示逻辑“或” | 表示 逻辑“或”,用于在两个表达式之间进行选择。它表示模式的两个部分之一可以匹配
.* --通配符与量词组合 是一个非常常见的正则表达式组合,表示匹配任意字符(".")零次或多次(*)。它非常强大,用来匹配任意长度的任意字符,常常被用于查找某个模式之后的任意字符或匹配任意内容
1
grep -E "(my|false)" /etc/passwd

a1c1dadb06a4cd213445ee6531432865

AND运算符

1
grep -E "(my.*false)" /etc/passwd

image-20250325203505492

1
grep -E "my" /etc/passwd | grep -E "false"

在etc/passwd 中查找存在my的行,然后在这基础上再去寻找false的行

image-20250325203934974

权限管理

在linux系统中,如果没有目录的权限,用户将无法访问目录的内容,而是会看到 “” 错误消息

image-20250325204700632

跟windows系统差不多,权限差不多,就是可读,可写,可执行 对应英文字母分别是 r,w,s

更改权限

我们可以使用命令来修改权限,比如先查看权限

image-20250325205047999

image-20250325205111791

image-20250325205127601

更改所有者

image-20250325205225898

image-20250325205243799

题目

用户管理

在这里先讲一下一些文件存放的东西

/etc/passwd 是 Linux/Unix 系统中 用户账号信息 的存放文件。它包含了系统中的 所有用户,包括普通用户、系统用户(如 rootdaemon)、服务账户等

/etc/shadow : 该文件是一个关键的系统文件,用于存储所有用户帐户的加密密码信息。出于安全原因,它只能由 root 用户读取和写入,以防止未经授权访问敏感的身份验证数据

当读取一些重要的文件,或执行一些重要的指令的时候,就不能只用普通的权限了,就要进入到最高管理权限也就是root

image-20250325215412921

按道理我本来应该是能够运行的,但是密码总输入不对

image-20250325215441282

1
2
3
4
5
6
7
8
sudo  		以其他用户身份执行命令
su 该实用程序通过 PAM 请求适当的用户凭证,并切换到该用户 ID(默认用户是超级用户)。然后执行 shell。
useradd 创建新用户或更新默认的新用户的信息
userdel 删除用户账户和相关文件
usermod 修改用户账户
addgroup 将组添加到系统
delgroup 从系统中删除组
passwd 更改用户密码

useradd于 创建新用户*。当你需要添加一个新的用户时,使用 useradd 来创建账户及其相关的目录、组等。

-m:自动创建用户的主目录。

-d:指定用户的主目录。

-s:指定用户的登录 shell。

-G:指定附加组。

-u:指定用户的 UID(用户 ID)。

usermod 是用来修改已经存在的用户账户的配置,如更改用户的主目录、组、shell 等。

-l:修改用户名。

-d:修改用户的主目录。

-m:移动主目录中的文件到新目录。

-s:修改用户的登录 shell。

-G:修改用户的附加组。

-u:修改用户的 UID。

-a:将用户追加到附加组(与 -G 配合使用)

-L--lock 锁定用户账户,防止该用户登录。锁定后,用户无法使用密码进行身份验证。这个选项常用于临时禁用某个账户。

-U--unlock 解锁用户账户,使其可以重新登录。解锁后,用户可以再次通过密码登录。

-aG <组名>--append --groups <组名> 将用户添加到附加组。-a 选项表示将用户追加到指定组,而不是替换掉用户原有的附加组。如果没有使用 -a,则会替换用户的所有附加组。

-r--system 修改用户为系统账户。系统账户通常不需要登录功能,主要用于运行系统服务和守护进程。通常,系统账户的 UID 比较低,一般用于没有登录需求的用户。

su -c ‘命令’ <用户名>

-c–command:该选项后面跟着你要执行的命令。su` 命令将会以指定的用户身份执行此命令,执行完后会退出该用户的环境,返回到原来的用户。

<用户名>:如果不指定用户名,su默认为root` 用户。若要以其他用户身份执行命令,指定目标用户名即可。

所以三个答案的答案就是

需要设置哪个选项才能使用 “useradd” 命令为新用户创建主目录? -m

需要设置哪个选项才能使用 “usermod” 命令锁定用户帐户?(选项的加长版) –lock

需要设置哪个选项才能使用 “su” 命令以其他用户身份执行命令?(选项的加长版) –command

执行流程管理

systemctl 是一个用于管理 systemd 系统和服务管理器的命令。systemd 是现代 Linux 系统(如 Ubuntu、Debian、CentOS、Fedora 等)中广泛使用的初始化系统和服务管理器,负责启动和管理系统中的服务、进程、网络、硬件和日志等

这是一个很强大的命令,但是对现在我来说还运用不到,以后再详细理解

有三种方法可以一个接一个地运行多个命令

分号 双字符(&&) 和 管道(|)

题目

使用“systemctl”命令列出所有服务单元,并提交单元名称,并提交描述为“加载由 snapd 内部管理的 AppArmor 配置文件”作为答案。

1
systemctl list-units --all | grep "Load AppArmor profiles managed internally by snapd"

image-20250326214641173

任务调度

不嘻嘻又是一个不太懂的章节

Systemd 与 Cron

Systemd 和 Cron 都是可以在 Linux 系统中用于调度和自动化流程的工具。这两个工具之间的主要区别在于它们的配置方式。使用 Systemd,您需要创建一个计时器和服务脚本,告诉作系统何时运行任务。另一方面,使用 Cron,您需要创建一个文件来告诉 cron 守护进程何时运行任务

题目

“dconf.service” 的服务类型是什么?

1
2
systemctl show dconf.service -p Type
-p Type 是 systemctl show 命令中的一个选项,用于指定显示某个特定属性。

但是我这里没显示不知道为什么

systemd 中,服务类型通常分为以下几种:

  1. simple:默认的服务类型,指示服务会立即启动并保持运行,且没有依赖其他进程。
  2. forking:服务会在启动时创建一个子进程来运行,主进程在完成启动后会退出。
  3. oneshot:用于执行一次性任务的服务,执行完后会退出。
  4. dbus:用于与 D-Bus 系统进行交互的服务。
  5. notify:服务会通知 systemd 启动成功。
  6. idle:服务会等待所有其他服务启动完成后才会启动。

image-20250326215850907

但是答案是 dbus

求下列函数是否在0,0处连续 z=sin(x的三次方 + y的三次方)/x的平方+y的平方 x的平方+y的平方不等于0 0

x的平方+y的平方=0

web服务

简单了解一下apache

Apache 的真正优势在于其模块化 — 它可以通过各种模块进行自定义和扩展以执行特定任务。例如,它的作用类似于密码箱,通过加密数据来保护浏览器和 Web 服务器之间的通信。该模块就像一个流量控制器,将请求定向到正确的目的地,在设置代理服务器时特别有用。其他模块(例如 and)可让您精细控制在浏览器和服务器之间传输的数据,从而允许您动态修改 HTTP 标头和 URL,例如调整流的路线。除了处理静态web内容外,apache还支持通过服务器端脚本语言创建动态 Web 页面

先启动apache

1
sudo systemctl start apache2

Apache 启动后,我们使用浏览器导航到默认页面 (http://localhost)。默认情况下,Apache 将在 HTTP 端口 80 上提供服务,只要您输入 HTTP URI,您的浏览器也将默认使用此端口(除非另有说明)

一般是80端口,启动之后打开本地网页

image-20250328163259404

出现这个就是成功了

cURL是一种工具,它允许我们通过 、 、 、 或 等协议从 shell 传输文件,通常,它使我们能够通过命令行远程控制和测试网站。除了远程服务器的内容外,我们还可以查看单个请求以查看客户端和服务器的通信

1
curl http://localhost

image-20250328163509537

可以用本地测试一下

curl 的替代方案是 工具 .使用此工具,我们可以直接从终端从 FTP 或 HTTP 服务器下载文件,它是一个可靠的下载管理器。如果我们以相同的方式使用 wget,则与 curl 的不同之处在于网站内容是在本地下载和存储的,

题目

找到一种方法,在 Pwnbox 或本地 VM 中使用 “npm” 启动一个简单的 HTTP 服务器。提交在端口 8080 上启动 Web 服务器的命令(使用 short 参数指定端口号)

http-server 是一个 Node.js 工具,用于在本地启动一个简单的 HTTP 服务器,通常用于开发和测试静态网站 -p 这个参数就是指定端口号的

所以构造payload

1
http-server -p 8080

找到一种方法,在 Pwnbox 或本地 VM 中使用 “php” 启动一个简单的 HTTP 服务器。提交在 localhost (127.0.0.1) 端口 8080 上启动 Web 服务器的命令

你可以使用 PHP 自带的 内置 HTTP 服务器 来启动一个本地 Web 服务器。

-S参数用来启动PHP内置服务器

1
php -S 127.0.0.1:8080

文件系统管理

不嘻嘻看不懂

题目

我们的 Pwnbox 中有多少个分区?(格式: 0)

  • lsblk 会列出系统上的所有块设备(如硬盘和分区),并显示它们的挂载点和大小。

image-20250328171825273

发现有三个