Linux基础
基础知识
系统结构
- Kernel(内核):Linux内核是操作系统的核心部分,负责管理系统的资源、提供硬件与软件的接口、调度进程等。它是Linux系统最基本的组件,也是与硬件交互的桥梁。
- Shell(命令解释器):Shell是用户与Linux系统交互的主要方式,用户通过Shell可以输入命令来操作系统、管理文件、启动程序等。常见的Shell包括Bash、Zsh等。
- File System(文件系统):Linux系统采用类Unix的文件系统结构,文件系统是Linux系统中用来管理文件和目录的机制。普通文件、目录、进程(/proc)、输入输出设备(/dev)、网络字节流socket、链接文件、管道文件。
- System Libraries(系统库):Linux系统提供了一系列的系统库,用于支持应用程序的运行。这些系统库包括C标准库、动态链接库等。
- System Utilities(系统工具):Linux系统提供了大量的系统工具,用于管理系统资源、监控系统状态、配置系统参数等。常见的系统工具包括ps、top、ifconfig等。
- Applications(应用程序):Linux系统支持各种各样的应用程序,包括办公软件、开发工具、数据库等。用户可以根据自己的需求安装和使用各种应用程序。
常用操作
命令帮助:man command(manual)——具体参数和使用方法
关机重启(root用户):关机:poweroff 重启:reboot
通配符:
通配符是在Linux系统中用于匹配文件名或路径名的特殊字符。通配符可以用于查找、删除、复制等操作,方便用户对文件进行批量处理。
常见的通配符包括:
*:匹配任意长度的任意字符,可以用于匹配零个或多个字符。例如,*.txt可以匹配所有以.txt结尾的文件。
?:匹配单个字符。例如,file?.txt可以匹配file1.txt、file2.txt等文件。
[]:匹配指定范围内的字符。例如,[abc]可以匹配a、b、c中的任意一个字符。
{}:匹配多个模式中的一个。例如,{file1,file2}.txt可以匹配file1.txt和file2.txt。
!:排除某个模式。例如,!*.txt可以匹配除了以.txt结尾的文件之外的所有文件。
文件描述符和重定向
在Linux系统中,文件描述符是用来标识和操作文件的整数。标准的文件描述符包括:
- 0:标准输入(stdin)
- 1:标准输出(stdout)
- 2:标准错误输出(stderr)
重定向是一种将标准输入、标准输出和标准错误输出从一个文件或设备转向另一个文件或设备的操作。在Linux中,可以使用重定向符号来实现重定向操作:
>
:将标准输出重定向到指定文件,会覆盖文件原有内容。>>
:将标准输出追加到指定文件末尾。<
:将文件内容作为标准输入。2>
:将标准错误输出重定向到指定文件。2>&1
:将标准错误输出重定向到标准输出。
例如,可以使用以下命令将命令的输出重定向到文件中:
ls > file.txt
这将ls
命令的输出内容写入到file.txt
文件中。如果要同时将标准输出和标准错误输出都写入到文件中,可以使用以下命令:
command > file.txt 2>&1
2>&1的含义:将标准错误输出重定向到标准输出,符号 >& 是一个整体,不可分
开,分开后就不是上述含义了
2>1的写法其实是将标准错误输出重定向到名为"1"的文件里去了
这将command
命令的标准输出和标准错误输出都写入到file.txt
文件中。
Linux基础命令
文件和目录管理
文件
查看文件 作用
lsof /bin/bash 查找某个文件相关的进程
lsof -u root 列出某个用户打开的文件信息
lsof -c redis 列出某个程序进程所打开的文件信息
lsof -i tcp 列出所有tcp 网络连接信息
以下是一些常见的Linux文件和目录管理命令:
ls
:列出目录内容。ls -l
:以详细列表形式显示文件和目录的信息。ls -a
:显示所有文件,包括隐藏文件。ls -h
:以人类可读的格式显示文件大小。
cd
:切换目录。cd ..
:返回上一级目录。cd ~
:切换到当前用户的主目录。cd -
:切换到上次所在的目录。
pwd
:显示当前工作目录的绝对路径。mkdir
:创建新目录。mkdir directory_name
:创建名为directory_name
的目录。
rmdir
:删除空目录。rm
:删除文件或目录。rm file_name
:删除名为file_name
的文件。rm -r directory_name
:递归删除目录及其内容。
cp
:复制文件或目录。cp file1 file2
:将file1
复制为file2
。cp -r directory1 directory2
:递归复制目录及其内容。
mv
:移动文件或目录,也可以用于重命名文件或目录。mv file1 file2
:将file1
移动或重命名为file2
。mv directory1 directory2
:将directory1
移动或重命名为directory2
。
touch
:创建空文件或修改文件的访问和修改时间戳。ln
:创建链接文件或硬链接。
目录
目录
目录 作用 备注
bin 存放普通用户可执行的指令 即使在单用户模式下也能够执行处理
boot 开机引导目录 包括Linux内核文件与开机所需要的文件
dev 设备目录 所有的硬件设备及周边均放置在这个设备目录中,比如声卡、磁盘
etc 各种配置文件目录 大部分配置属性均存放在这里
lib 库文件存放地,bin和sbin需要的库文件 类似windows的DLL
media 可移除设备挂载目录 类似U盘、光盘、移动硬盘等临时挂放目录
mnt 用户临时挂载其他的文件系统 额外的设备可挂载在这里,相对临时而言
opt 第三方软件安装目录 现在习惯性的放置在/usr/local中
proc 虚拟文件系统通常是内存中的映射,特别注意在误删除数据文件后,比如DB,只要系统不重启,还是有很大几率能将数据找回来
root 系统管理员主目录 除root之外,其他用户均放置在/home目录下
run 系统运行时所需文件以前防止在/var/run中,后来拆分成独立的/run目录。 重启后重新生成对应的目录数据
sbin 只有root才能运行的管理指令跟bin类似,但只属于root管理员
srv 服务启动后需要访问的数据目录
sys 跟proc一样,虚拟文件系统 记录核心系统硬件信息
tmp 存放临时文件目录 所有用户对该目录均可读写
usr 应用程序放置目录
var 存放系统执行过程经常改变的文件
用户主目录
主目录:home directory
root用户的主目录是 /root
其他用户的主目录是 /home/用户名
cd 空格 或者 cd ~
工作目录:working directory
目录指代
符号 指代
绝对路径 由根目录 / 开始写起
相对路径 从当前所在的工作目录开始写起
/ 根目录
. 代表当前目录
~ 代表用户工作目录,vim ~/.bashrc
../ 代表上一级目录
../../ 上上一级目录,以此类推,超出范围的时候代表根目录
文件压缩和解压
文件压缩:
- tar命令:
tar
命令通常用于打包和压缩文件或目录。- 压缩为
.tar
文件:tar -cvf archive.tar file1 file2 ...
- 压缩为
.tar.gz
文件:tar -czvf archive.tar.gz file1 file2 ...
- 压缩为
.tar.bz2
文件:tar -cjvf archive.tar.bz2 file1 file2 ...
- 压缩为
- gzip命令:
gzip
命令用于压缩文件。- 压缩为
.gz
文件:gzip file
- 压缩为
- bzip2命令:
bzip2
命令用于更高效的文件压缩。- 压缩为
.bz2
文件:bzip2 file
- 压缩为
文件解压缩:
- tar命令:
tar
命令也可以用于解压缩.tar
、.tar.gz
、.tar.bz2
文件。- 解压
.tar
文件:tar -xvf archive.tar
- 解压
.tar.gz
文件:tar -xzvf archive.tar.gz
- 解压
.tar.bz2
文件:tar -xjvf archive.tar.bz2
- 解压
- gzip命令:
gzip
命令用于解压缩.gz
文件。- 解压
.gz
文件:gzip -d file.gz
- 解压
- bzip2命令:
bzip2
命令用于解压缩.bz2
文件。- 解压
.bz2
文件:bzip2 -d file.bz2
- 解压
查看文件和处理文件
以下是一些常用的命令:
- cat:用于查看文件内容。
cat filename
:显示文件filename
的内容。
- more 和 less:用于逐页查看文件内容。
more filename
:逐页查看文件filename
的内容。less filename
:逐页查看文件filename
的内容,支持向前和向后翻页。
- head 和 tail:用于查看文件的开头和结尾部分。
head -n filename
:显示文件filename
的前n
行。tail -n filename
:显示文件filename
的末尾n
行。
- grep:用于在文件中搜索指定模式。
grep pattern filename
:在文件filename
中搜索pattern
。
- wc:统计文件的行数、单词数和字符数。
wc filename
:统计文件filename
的行数、单词数和字符数。
文本编辑器
VIM
运行Vim:
- 在终端中输入
vim
命令即可打开Vim编辑器。
Vim的模式:
命令模式:通过命令操作文本文件
编辑模式:对文本的内容进行编辑
底行模式:结束操作的时候使用
常用命令:
- 移动光标:命令模式
h
:向左移动光标。j
:向下移动光标。k
:向上移动光标。l
:向右移动光标。0
:移动到行首。$
:移动到行尾。gg
:移动到文件开头。G
:移动到文件末尾。
- 插入文本:编辑模式
i
:在光标前插入文本。a
:在光标后插入文本。o
:在当前行下插入新行并进入插入模式。O
:在当前行上插入新行并进入插入模式。
- 保存和退出:底行模式
:w
:保存文件。:q
:退出Vim。:wq
:保存并退出。
软件安装
-
APT (Advanced Package Tool):
- 适用于Debian、Ubuntu等基于Debian的发行版。
- 常用命令:
sudo apt update
:更新软件包列表。sudo apt install package_name
:安装软件包。sudo apt remove package_name
:移除软件包。
-
YUM (Yellowdog Updater, Modified):
- 适用于CentOS、Fedora等基于Red Hat的发行版。
- 常用命令:
sudo yum update
:更新软件包。sudo yum install package_name
:安装软件包。sudo yum remove package_name
:移除软件包。
用户权限管理
用户管理:
- 添加用户:
- 使用
useradd
命令添加用户:sudo useradd username
- 使用
adduser
命令添加用户:sudo adduser username
- 使用
- 删除用户:
- 使用
userdel
命令删除用户:sudo userdel username
- 使用
- 修改用户密码:
- 使用
passwd
命令修改用户密码:sudo passwd username
- 使用
- 切换用户:
- 使用
su
命令切换用户:su username
- 使用
用户组管理:
- 创建用户组:
- 使用
groupadd
命令创建用户组:sudo groupadd groupname
- 使用
- 添加用户到用户组:
- 使用
usermod
命令将用户添加到用户组:sudo usermod -aG groupname username
- 使用
- 删除用户组:
- 使用
groupdel
命令删除用户组:sudo groupdel groupname
- 使用
文件权限管理
-
查看文件权限:
- 使用
ls -l
命令查看文件权限:ls -l filename
- 使用
-
修改文件权限:
修改文件权限的数字表示法:
-
chmod
命令的数字表示法可以用来直接设置文件的权限。每个权限位对应一个数字,分别表示读(4)、写(2)和执行(1)权限。可以通过将这些数字相加来设置权限。 -
例如,要将文件
example.txt
的所有者设置为读写执行权限,组用户设置为只读权限,其他用户设置为无权限,可以使用以下命令:
chmod 740 example.txt
-
这里的数字
7
表示所有者有读写执行权限(4+2+1),数字4
表示组用户有只读权限(4),数字0
表示其他用户没有权限。
-
网络管理
-
查看网络配置:
- 使用
ifconfig
或ip addr
命令查看网络接口的IP地址、子网掩码、网关等信息。 - 使用
route -n
或ip route
命令查看路由表信息。
- 使用
-
配置网络接口:
-
使用
ifconfig
或
ip addr
命令配置网络接口的IP地址、子网掩码等信息。
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0
-
使用
route
或ip route
命令添加或删除路由表项。:
-
-
网络连接状态:
-
使用
ping
命令测试网络连接:
ping google.com
-
使用
netstat
或ss
命令查看网络连接状态。
-
-
telnet
-
连接到远程主机:
-
使用 telnet命令连接到远程主机:
telnet remote_host_ip_or_domain
-
例如,要连接到IP地址为192.168.1.100的远程主机,可以使用以下命令:
telnet 192.168.1.100
-
-
-
netstat
查看程序的网络连接情况: netstat -ap | grep ssh 查看端口的网络连接情况: netstat -ap | grep 3306
-
防火墙管理:
-
使用
iptables
或firewalld
命令配置防火墙规则。 -
例如,允许特定端口通过防火墙:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
-
-
下载
wget wget https://download.redis.io/releases/redis-6.0.9.tar.gz curl curl https://www.baidu.com
系统状态管理
查 看 系 统 信 息
系统版本
cat /etc/redhat-release
uname -a
cat /proc/version
进 程 管 理
查看进程信息
-
ps命令
命令用于显示当前系统上的进程信息。常见选项包括:
-e
:显示所有进程。-f
:显示详细的进程信息。-aux
:显示所有进程的详细信息。
-
例如,
ps aux
命令可以显示所有进程的详细信息。
定 时 任 务
1.cron基本概念:
- cron是一个在Unix和类Unix系统上运行的定时任务调度程序,允许用户在特定时间执行命令或脚本。
- crontab是用于编辑、安装、卸载和列出用户定时任务的命令。
- crontab命令:
crontab -e
:编辑当前用户的定时任务。如果没有定时任务,会新建一个。crontab -l
:列出当前用户的定时任务。crontab -r
:移除当前用户的所有定时任务。
- 定时任务格式:
- 定时任务文件包含多行,每行表示一个定时任务。
- 每行的格式为:
分钟 小时 日 月 周 命令
。 - 例如,
* * * * * command
表示每分钟执行一次command
命令。
- 定时任务示例:
-
每天凌晨执行脚本
0 0 * * * /path/to/script.sh
-
每小时执行命令
0 * * * * /path/to/command
-
每周五晚上8点执行任务
0 20 * * 5 /path/to/task.sh
- 特殊符号说明:
*
:匹配任意值。*/n
:每隔n执行一次。-
:范围。,
:多个值。
- 注意事项:
- 系统定时任务文件通常位于
/etc/crontab
和/etc/cron.d/
目录下。 - 定时任务执行时会将输出发送到邮件,可以使用
MAILTO
变量指定接收邮件的邮箱。 - 定时任务执行时的环境变量可能不同于交互式shell的环境变量,需要注意路径等问题。
at命令
at
命令是一个用于在指定时间执行一次性任务的 Linux 命令。通过 at
命令,用户可以将某个指令或脚本安排在将来的某个时间点执行。
at <时间> # 在指定的时间点执行任务
at -f <脚本文件> <时间> # 执行指定的脚本文件
at -c <任务编号> # 查看任务内容
at -l # 列出所有待执行的任务
at -r <任务编号> # 移除指定任务
在未来的某个时间执行命令:
at 10:00 PM
ls -l /var/log > log_files.txt
[Ctrl+D]
在未来的某个时间执行脚本:
echo "echo 'Hello, World'" > my_script.sh
at -f my_script.sh 2:00 AM
Linux敏感文件
用户权限文件
/etc/group
1、组名 2、组密码 3、GID 4、用户列表
/etc/passwd
1、用户名 2、密码 3、UID 4、GID5、全名 6、home路径 7、shell工具
/etc/shadow
1、用户名 2、密码3、最后修改时间(1970 年 1 月 1 日以后的多少天)4、最小修改间隔时间 5、密码有效期
6、密码需要变更前的警告天数7、密码过期后的宽限天数 8、账号失效时间9、保留
密码格式
命令:openssl passwd -1 -salt admin 123456
格式:$id$salt$encrypted
示例:$1$admin$LClYcRe.ee8dQwgrFc5nz.
网络配置文件
文件 作用
/etc/sysconfig/network-scripts/ifcfg- ens33 网卡配置文件
/etc/sysconfig/network-scripts/ifcfg-lo 环回地址配置文件
/etc/hosts 主机名与IP的映射
/etc/resolv.conf DNS配置,由ens33自动覆盖
/etc/network/interfaces 配置网络接口
/etc/networks 用于存储网络名称和对应的网络地址范围
定时任务
/etc/anacrontab anacron 定时任务的配置文件。
控制 at 命令的访问权限的文件。
/etc/at.allow
/etc/at.deny
/etc/cron.allow 有在此文件中列出的用户才能使用 crontab 命令
/etc/cron.deny 如果该文件存在且包含用户列表,将被禁止使用 crontab 命令。
/etc/crontab 系统定时任务通常在 /etc/crontab 文件中定义
SSH
SSH 服务器使用的 DSA 密钥对,分别包含了私钥和公钥。这些密钥对用于 SSH 服务器和客户端之间的身份验证和数据加密。
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_dsa_key.pub
SSH 服务器使用的通用密钥对,分别包含了私钥和公钥。类似于上面的 DSA 密钥对
/etc/ssh/ssh_host_key
/etc/ssh/ssh_host_key.pub
SSH 服务器使用的 RSA 密钥对,分别包含了私钥和公钥
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub
History
history是一条命令,用于查看历史命令,以下是一些命令/程序的历史命令
/root/.atftp_history
/root/.bash_history
/root/.mysql_history
/root/.nano_history
/root/.php_history
Bandit通关
https://overthewire.org/
Level 0
使用xshell ssh远程连接主机
ssh bandit0@bandit.labs.overthewire.org -p 2220
密码:bandit0
Level 0–>Level 1
读取当前文件夹下文件
ssh bandit1@bandit.labs.overthewire.org -p 2220
NH2SXQwcBdpmTEzi3bvBHMM9H66vVXjL
Level 1 - Level 2
读取特定文件夹下的文件,文件名为-,和root目录名一样,所以要使用相对路径访问
ssh bandit2@bandit.labs.overthewire.org -p 2220
rRGizSaX8Mk1RTb1CNQoXTcYZWU6lgzi
Level 2 → Level 3
访问带有空格的文件名,用转义字符\来转义空格即可
ssh bandit3@bandit.labs.overthewire.org -p 2220
aBZ0W5EmUfAf7kHTQeOwd8bauFJ2lAiG
Level 3 → Level 4
访问隐藏文件
ssh bandit4@bandit.labs.overthewire.org -p 2220
2EW7BBsr6aMMoJ2HjW067dm8EgX26xNe
Level 4 → Level 5
file命令判断文件类型
ssh bandit5@bandit.labs.overthewire.org -p 2220
lrIWWI6bB37kxfiCQZqUdOIYfr6eEeqR
Level 5 → Level 6
find命令查找size=1033bytes
ssh bandit6@bandit.labs.overthewire.org -p 2220
P4L4vucdmLnm8I7Vl7jG1ApGSfjYKqJU
Level 6 → Level 7
查找被用户bandit7所有,被用户组bandit6所有,并且拥有33字节
ssh bandit7@bandit.labs.overthewire.org -p 2220
z7WtoNQU2XfjmMtWA8u5rN4vzqu4v99S
Level 7 → Level 8
grep命令匹配文件中的字符
ssh bandit8@bandit.labs.overthewire.org -p 2220
TESKZC0XvTetK0S9xNwm25STk5iWrBvP
Level 8 → Level 9
密码在data.txt文件中,只出现了一次.使用uniq命令比较上下行字符串来判断是否重复,sort对文件内容进行排序
ssh bandit9@bandit.labs.overthewire.org -p 2220
EN632PlfYiZbn3PhVK3XOGSlNInNE00t
Level 9 → Level 10
这一关的密码在很多个‘=’的后面,先用cat查看文件信息,输出是非常多的,但是很多不是human-readable的字符,可以用strings来过滤,strings命令在对象文件或二进制文件中查找可打印的字符串
strings ./data.txt
ssh bandit10@bandit.labs.overthewire.org -p 2220
G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
Level 10 → Level 11
base64解码
ssh bandit11@bandit.labs.overthewire.org -p 2220
6zPeziLdR2RKNdNYFNb6nVCKzphlXHBM
Level 11 → Level 12
rot13解密
cat ./data.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'
ssh bandit12@bandit.labs.overthewire.org -p 2220
JVNBBFSmZwKKOP0XbFXOoW8chDz5yVRv
Level 12 → Level 13
用cat查看文件,是16进制文件
Level 13 → Level 14
解压与打包
bandit12@bandit:~$ mkdir /tmp/bandit12
mkdir: cannot create directory ‘/tmp/bandit12’: File exists
bandit12@bandit:~$ mkdir /tmp/bandit12new
bandit12@bandit:~$ cp ./data.txt /tmp/bandit12new/data
bandit12@bandit:~$ cd /tmp/bandit12new/
bandit12@bandit:/tmp/bandit12new$ ls
data
bandit12@bandit:/tmp/bandit12new$ xxd -r ./data ./data.out
bandit12@bandit:/tmp/bandit12new$ file data.out
data.out: gzip compressed data, was "data2.bin", last modified: Thu Oct 5 06:19:20 2023, max compression, from Unix, original size modulo 2^32 573
bandit12@bandit:/tmp/bandit12new$ mv data.out ./data.gz
bandit12@bandit:/tmp/bandit12new$ gzip -d ./data.gz ./data.out
gzip: ./data already exists; do you wish to overwrite (y or n)? n
not overwritten
gzip: ./data.out.gz: No such file or directory
bandit12@bandit:/tmp/bandit12new$ ls
data data.gz
bandit12@bandit:/tmp/bandit12new$ gzip -d ./data.gz
gzip: ./data already exists; do you wish to overwrite (y or n)? y
bandit12@bandit:/tmp/bandit12new$ ls
data
bandit12@bandit:/tmp/bandit12new$ file data
data: bzip2 compressed data, block size = 900k
bandit12@bandit:/tmp/bandit12new$ mv ./data ./data.bz2
bandit12@bandit:/tmp/bandit12new$ ls
data.bz2
bandit12@bandit:/tmp/bandit12new$ bunzip2 -d ./data.bz2
bandit12@bandit:/tmp/bandit12new$ ls
data
bandit12@bandit:/tmp/bandit12new$ file data
data: gzip compressed data, was "data4.bin", last modified: Thu Oct 5 06:19:20 2023, max compression, from Unix, original size modulo 2^32 20480
bandit12@bandit:/tmp/bandit12new$ mv ./data ./data.gz
bandit12@bandit:/tmp/bandit12new$ gzip -d data.gz
bandit12@bandit:/tmp/bandit12new$ ls
data
bandit12@bandit:/tmp/bandit12new$ file data
data: POSIX tar archive (GNU)
bandit12@bandit:/tmp/bandit12new$ mv data data.tar
bandit12@bandit:/tmp/bandit12new$ ls
data.tar
bandit12@bandit:/tmp/bandit12new$ tar xvf data.tar
data5.bin
bandit12@bandit:/tmp/bandit12new$ file data5.bin
data5.bin: POSIX tar archive (GNU)
bandit12@bandit:/tmp/bandit12new$ mv data5.bin data.tar
bandit12@bandit:/tmp/bandit12new$ l
data.tar
bandit12@bandit:/tmp/bandit12new$ tar xvf data.tar
data6.bin
bandit12@bandit:/tmp/bandit12new$ mv data6.bin data.tar
bandit12@bandit:/tmp/bandit12new$ tar xvf data.tar
data8.bin
bandit12@bandit:/tmp/bandit12new$ file data8.bin
data8.bin: gzip compressed data, was "data9.bin", last modified: Thu Oct 5 06:19:20 2023, max compression, from Unix, original size modulo 2^32 49
bandit12@bandit:/tmp/bandit12new$ ls
data8.bin data.tar
bandit12@bandit:/tmp/bandit12new$ mv data8.bin data.gz
bandit12@bandit:/tmp/bandit12new$ ls
data.gz data.tar
bandit12@bandit:/tmp/bandit12new$ gzip -d data.gz
bandit12@bandit:/tmp/bandit12new$ ls
data data.tar
bandit12@bandit:/tmp/bandit12new$ file data
data: ASCII text
bandit12@bandit:/tmp/bandit12new$ cat data
The password is wbWdlBxEir4CaE8LaPhauuOo6pwRmrDw
ssh bandit13@bandit.labs.overthewire.org -p 2220
wbWdlBxEir4CaE8LaPhauuOo6pwRmrDw
Level 13 → Level 14
ssh远程登陆
ssh bandit14@bandit.labs.overthewire.org -p 2220
fGrHPx402xGC7U7rXKDaxiWFTOiF0ENq
Level 14 → Level 15
用nc把14的密码发送到30000这个端口
nc localhost 30000
ssh bandit15@bandit.labs.overthewire.org -p 2220
jN2kgmIXJ6fShzhT2avhotn4Zcka6tnt
Level 15 → Level 16
通过openssl连接30001端口,发送当前关卡的密码就可以获得16的密码
openssl s_client -connect localhost:30001 -ign_eof
ssh bandit16@bandit.labs.overthewire.org -p 2220
JQttfApK4SeyHwDlI9SXGR50qclOAil1
Level 16 → Level 17
要求我们先扫描31000到32000端口,并且找到ssl的端口,通过openssl连接端口,返回ssh_privatekey。用private key登录bandit17,我们在/tmp目录下新建一个目录,然后把私钥写到一个文件里面.
openssl s_client -connect localhost:31790 -ign_eof
mkdir /tmp/bandit16
cd /tmp/bandit16
vim key
chmod 700 key
ssh -i ./newkey bandit17@localhost -p2220
Level 17 → Level 18
diff命令查看不同
hga5tuuCLF6fFzUpnagiMN8ssu9LFrdg
p6ggwdNHncnmCNxuAt0KtKVq185ZU7AW
Level 18 → Level 19
这一关直接登录的话,会显示一个“Byebye”,然后会话被关闭,原因是.bashrc被改动了,我们可以用带命令的ssh来查看文件
ssh bandit19@bandit.labs.overthewire.org -p 2220
awhqfNnAbc1naukrpqDYcF95h7HoMTrC
Level 19 → Level 20
setuid可以查看到用户权限,ls -al列出所有文件及权限,注意到bandit20-do是-rws-r-x---,这个文件有suid权限,也就是可以运行与创建者相同权限来运行程序,用它来读取Level 20的文件
ssh bandit20@bandit.labs.overthewire.org -p 2220
VxCazJaVykI6W36BkBU0mJTCM8rR95XT
Level 20 → Level 21
题目里有个描述,it makes a connection to localhost on the port you specify as a commandline argument, 也就是说这个suconnect可以连接指定的端口,但是我们要把密码给到这个端口
这个命令将在本地主机上创建一个监听端口 30088,并将传入的字符串 "VxCazJaVykI6W36BkBU0mJTCM8rR95XT" 发送给连接到该端口的任何客户端。通过在命令末尾使用 &,这将使该命令在后台以守护进程的方式运行,并且会返回一个进程 ID。
echo "VxCazJaVykI6W36BkBU0mJTCM8rR95XT" |nc -l -p 30088 &
[1] 21523
NvEJF7oVjkddltPSrdKEFOllh9V1IBcq
Level 21 → Level 22
cron.d 定时任务,查看一下cron.d这个文件夹,找到定时任务,我们找到bandit22执行了什么,继续查看.sh件,找到/tmp里面的文档,然后查看这个文件。
WdDozAdTM2z9DiFEQ2mGlwngMfj4EZff
Level 22 → Level 23
先到/etc/cron.d查看定时任务,看看bandit23这个用户写了啥,然后查看脚本里面执行了什么命令,最后找到密码
bandit22@bandit:~$ cd /etc/cron.d
bandit22@bandit:/etc/cron.d$ cat *
@reboot bandit23 /usr/bin/cronjob_bandit23.sh &> /dev/null
* * * * * bandit23 /usr/bin/cronjob_bandit23.sh &> /dev/null
bandit22@bandit:/etc/cron.d$ cat /usr/bin/cronjob_bandit23.sh
#!/bin/bash
myname=$(whoami)
mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)
echo "Copying passwordfile /etc/bandit_pass/$myname to /tmp/$mytarget"
cat /etc/bandit_pass/$myname > /tmp/$mytarget
bandit22@bandit:/tmp$ echo I am user bandit23 | md5sum |cut -d ' ' -f 1
8ca319486bfbbc3663ea0fbe81326349
bandit22@bandit:/tmp$ cat /tmp/8ca319486bfbbc3663ea0fbe81326349
QYw0Y2aiA672PsMmh9puTQuhoz8SyR2G
ssh bandit23@bandit.labs.overthewire.org -p 2220
QYw0Y2aiA672PsMmh9puTQuhoz8SyR2G
Level 23 → Level 24
andit22@bandit:~$ cd /etc/cron.d
bandit22@bandit:/etc/cron.d$ cat *
cat /usr/bin/cronjob_bandit24.sh
切换到/var/spool/bandit24文件夹,然后遍历所有文件,并且执行这个文件,如果遇到用户是bandit23的话,先执行,持续一段时间,然后再删除文件。
#!/bin/bash
myname=$(whoami)
cd /var/spool/$myname/foo
echo "Executing and deleting all scripts in /var/spool/$myname/foo:"
for i in * .*;
do
if [ "$i" != "." -a "$i" != ".." ];
then
echo "Handling $i"
owner="$(stat --format "%U" ./$i)"
if [ "${owner}" = "bandit23" ]; then
timeout -s 9 60 ./$i
fi
rm -f ./$i
fi
done
由于我们当前以 bandit23 用户身份登录,因此我们可以创建一个脚本来为我们提供 bandit24 的密码。首先,在“tmp”文件夹中创建一个文件。这样可以防止提前删除文件,并且您有一个副本,以防出现问题。然后将文件移动到文件夹“/var/spool/bandit24”,它将被执行。
vim ./get_pass.sh
#!/bin/bash
cat /etc/bandit_pass/bandit24 > /tmp/bandit24pass
拷贝到/var/spool/bandit24/foo里面,cp ./get_pass.sh /var/spool/bandit24/
ssh bandit24@bandit.labs.overthewire.org -p 2220
然后我们就等待执行,执行结束之后,获得密码VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar
Level 24 → Level 25
这一关的提示是暴力破解,这里可以用好几种方式生成爆破密码,最简单的方式而且在很多机器上都可以执行的话
#!/bin/bash
bandit24='VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar'
for i in {0..9}{0..9}{0..9}{0..9}
do
echo $bandit24' '$i >> bandit25pin
done
cat ./bandit25pin | nc localhost 30002 >> ./bandit25pass
tail -n 5 ./bandit25pass
ssh bandit25@bandit.labs.overthewire.org -p 2220
p7TaowMYrmu23Ol8hiZh9UvD0O9hpx8d
Level 25 → Level 26
每个用户都有一个用户默认 shell。这在使用 时尤为重要,因为这是将要显示的 shell。该信息,即用户的默认 shell 是什么,可以在“/etc/passwd”文件中用户的行末尾找到。
more是一个 shell 命令,允许在交互模式下显示文件。具体来说,仅当文件内容太大而无法完全显示在终端窗口中时,此交互模式才有效。交互模式下允许的一个命令是 。此命令将在编辑器“vim”中打开文件。`v
Vim 是一个文本编辑器。它还使您能够运行 shell 命令。可以使用 vim 来突破受限的环境并生成 shell。要生成用户的默认 shell,请使用该命令。要将 shell 更改为 '/bin/bash',命令为 。:shell``:set shell=/bin/sh
首先,我们需要检查用户 bandit26 使用的 shell。我们通过查看“passwd”文件中的正确行来做到这一点
因此,这个脚本的作用是打开一个终端,设置终端类型为 Linux,然后使用 more 命令查看 ~/text.txt 文件的内容,并最终正常退出脚本。
我们可以看到它指的是一个名为“showtext”的脚本,该脚本使用程序打开一个名为“text.txt”的文件。more
接下来,当我们查看当前用户的主目录时,我们会找到一个私有 ssh 密钥。我们可以将私钥复制粘贴到我们机器上的文件中。为了能够登录,我们需要限制对密钥的权限。
尝试登录时,我们看到连接已关闭,因为执行了“/usr/bin/showtext”。
究竟发生了什么?“text.txt”中的文本非常短,这意味着可以立即显示整个文本。不需要进入命令/交互模式。如果我们使终端窗口变小,将进入命令模式。然后,我们可以用来进入 vim。现在我们可以重新缩放窗口。
c7GvcKlw9mC7aUQaPx7nwFstuAIBw1o1
Level 26 → Level 27
同上
Level 27 → Level 31
27:用git把repo拖到本地 git clone ssh://bandit27-git@localhost/home/bandit27-git/repo
28:git show查看一下版本变更记录
29:git branch -a 用于列出所有本地和远程分支的信息
30:git show-ref 显示引用(包括分支和标签)的完整引用名和对象的 SHA-1 校验和
31:git commit -m "Add new feature" 用于提交代码更改的命令
标签:tmp,文件,Level,基础,bandit,命令,Linux,data
From: https://www.cnblogs.com/SuZhe-blog/p/18215092