OverTheWire之bandit(level0-level34)
Bandit是OverTheWire平台推出的Linux命令行安全闯关游戏,通过33个关卡系统训练Linux系统安全技能。本文总结了通关过程中的关键技巧:1)基础命令操作(ls/cat/find处理特殊文件名);2)权限管理(setuid机制和cronjob分析);3)加密工具使用(openssl/nc);4)信息提取(strings/xxd处理二进制文件);5)自动化脚本编写(Bash循环和gi
bandit介绍
Bandit 是 OverTheWire 平台推出的一款经典的 Linux 命令行安全闯关游戏,专为学习和练习 Linux 系统安全、命令行操作、权限管理及网络基础知识 设计。通过一系列一系列关卡,玩家需要利用各种系统工具和安全知识,从当前关卡用户逐步获取下一关的密码,最终完成所有挑战。
通关过程
Note
- 账号是bandit<X>,X是当前level数
- 密码是从上一关获得的信息
level0

通过bandit0登录就好了
level0→level1

通过ls等命令列出当前目录下的文件,通过cat命令来查看文件内容
level1→level2

发现一个‘-’文件,通常在命令后跟破折号(小横杠)表示接收命令的选项
如man -h 表示输出man命令的帮助信息(完整命令为:man --help),大部分工具命令都有这个选项
所以查看这类文件都需要带上文件的绝对或相对路径
level2→level3

由于这个文件名包含空格,所以需要‘\’反斜杠转义,不然命令会认为读取多个文件。
level3→level4

ll命令为ls -al的缩写,列出所有文件的详细信息。
-a:列出隐藏文件
-l:列出文件的相信信息
‘.’,‘./’和‘../’的区别
点:表示隐藏文件
./:表示当前目录
../:表示父级目录(上一级目录)
level4→level5

file命令为查看文件类型
‘*’为通配符表示所有
level5→level6

文件类型是可读文本,大小为1033字节

find . -type f -size 1033c:查找当前目录下,文件类型为普通文件,文件大小为1033字节的文件
find为查找命令
level6→level7

文件特点,用户bandit7拥有,属于bandit6组,大小为33字节

find / -user bandit7 -group bandit6 -size 33c:查找符合要求的
2>/dev/null:表示将错误输出(文件描述符 2)丢弃,只保留标准输出传递给grep
|:管道命令,将左边的输出做为右边的输入
grep "pass":过滤出含有pass的文件
level7→level8


通过grep过滤出millionth从而获得密码
level8→level9


sort data.txt | uniq -u:表示data.txt文件中仅出现一次的唯一行
sort:对文本内容进行排序的命令
uniq:用于处理文本中重复行的命令
level9→level10


strings:用于从二进制文件或非文本文件中提取可打印字符串(人类可识别的文本)的命令。
level10→level11

有base64编码,通过在线解码或者命令直接解码

level11→level12

ROT13加密,可以用在线解密或者命令

tr是 translate(转换)的缩写,用于字符替换- 第一个字符集
'a-zA-Z'表示所有大小写字母- 第二个字符集
'n-za-mN-ZA-M'是替换规则:
- 小写字母 a-m 被替换为 n-z
- 小写字母 n-z 被替换为 a-m
- 大写字母 A-M 被替换为 N-Z
- 大写字母 N-Z 被替换为 A-M
ROT13:将字母表中的每个字母替换为它后面第 13 个字母,如果超过了字母表的末尾则循环到开头。(约等于凯撒密码的k为13)
level12→level13

反复使用gz,bz2,tar等压缩打包命令去解压解包
第一步:在/tmp下用mkdir命令创建一个目录,并将data.txt使用cp命令复制过来

第二步:由于是十六进制转储,通过cat命令查看为bin文件,转回原文件


xxd:用于在二进制数据和十六进制文本表示之间进行转换。
-r是xxd的一个重要选项,表示 "reverse"(反向转换):
- 正常情况下(不加
-r),xxd会将二进制文件转换为十六进制文本表示- 加上
-r选项后,xxd会将十六进制文本转换回二进制数据
第三步:通过file查看是什么文件,用对于的命令解压

注意:虽然可以不用该后缀直接解压,但是由于轮数多,改完会比较清晰,不易绕晕
第四步:重复第三步操作
gzip -d filename
bzip2 -d filename
tar -xvf filename
第五步:cat最后解压出来的文件

level13→level14

通过私钥,你可以无需输入密码就能安全登录远程服务器

确实有个私钥文件,通过-i传入这个文件登录bandit14

登录到bandit14,通过bandit14来查看bandit14的密码

level14→level15


传入bandit14的密码,收到bandit15密码
这个命令的主要目的是与运行在本地 30000 端口的服务建立 TCP 连接。连接成功后:
- 你可以在终端输入文本,这些文本会发送到 30000 端口的服务。
- 同时,你也能接收来自该服务返回的数据并显示在终端上。
level15→level16



openssl:开源的加密工具包,提供了丰富的加密、解密、证书管理等功能。s_client:OpenSSL 中用于模拟 SSL/TLS 客户端的模块,专门用于测试 SSL/TLS 服务器连接。-connect localhost:30001:指定要连接的目标服务器地址和端口,这里是本地的 30001 端口。
level16→level17

需要用nmap来查询开放的端口

![]()
-ign_eof选项,用于与本地 31790 端口建立 SSL/TLS 连接并保持连接不自动关闭。

输入密码得到私钥

把私钥保存在/tmp目录下给600的权限,连接上bandit17,查看bandit17密码

level17→level18


- 前缀符号表示差异类型:
a(add):新增行d(delete):删除行c(change):修改行- 数字表示行号(如
3c3表示第 3 行有修改)<开头的行来自第一个文件(passwords.old)>开头的行来自第二个文件(passwords.new)---分隔两个文件的内容
在.git泄露中,也用diff来比较文件差异
level18→level19

核心原因是修改后的
.bashrc中包含了强制退出会话的命令(如exit、logout),或触发了导致会话终止的错误逻辑。

后面跟个bash,或者是用-t获得个伪终端
level19→level20

setuid:是一种特殊权限的可执行文件,在 Unix/Linux 系统中具有特殊的安全特性,允许用户以文件所有者的权限执行该程序,而非执行用户自身的权限。

level20→level21


建议开两个终端,一个nc开监听发密码,一个运行脚本
level21→level22

本质上是读配置脚本

cronjob_bandit22
@reboot bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
@reboot:表示系统重启后立即执行一次任务bandit22:指定以bandit22用户的权限运行该任务/usr/bin/cronjob_bandit22.sh:要执行的脚本路径&> /dev/null:将脚本的所有输出(标准输出和错误输出)重定向到/dev/null(即不保存任何输出)
* * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
* * * * *: cron 时间格式,五个星号分别代表「分、时、日、月、周」,这里表示「每分钟执行一次」- 其余部分含义同上,即每分钟以
bandit22权限执行脚本,并丢弃所有输出
#!/bin/bash #声明,指定脚本使用 Bash 解释器执行
chmod 644 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
#为/tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv设置644的权限
cat /etc/bandit_pass/bandit22 > /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
#读取/etc/bandit_pass/bandit22的内容重定向到/tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv中
level22→level23

#!/bin/bash
myname=$(whoami)
#将当前执行whoami脚本的用户名保存到变量 myname 中
mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)
#echo I am user $myname:输出字符串
#md5sum:通过管道命令,计算左边输出的字符串md5值
#cut -d ' ' -f 1:提取哈希值部分(去除后面的空格和文件名)
#最终结果保存到变量 mytarget 中
echo "Copying passwordfile /etc/bandit_pass/$myname to /tmp/$mytarget"
#输出一条提示信息,说明正在将密码文件复制到哪个目标文件
cat /etc/bandit_pass/$myname > /tmp/$mytarget
#读取当前用户的密码文件,内容写入到 /tmp 目录下以 MD5 哈希命名的文件中
level23→level24

#!/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 用户拥有的脚本文件,执行后立即删除这些文件(即使执行超时或失败,也会删除)。

注意:1.需要进入的是bandit24,不是bandit23
2.需要等定时任务启动,马上cat会显示找不到文件
level24→level25

本质上还是和之前一样写个脚本,只是涉及到循环了

level25→level26

进入bandit25 发现有bandit26.sshkey文件
尝试ssh bandit26@localhost -p 2200 -i bandit26.sshkey后
连接不进去
缩小命令框,继续ssh连接
运行命令出现more时按V
在底行命令模式下“:set shell=/bin/bash”":shell"
进入bandit26终端

注意:需要使用自带终端,不能用终端连接工具
level26→level27
继续上一关拿到的bandit26终端,有个和level19→level20一样的文件,一样的方法

level27→level28



将文件克隆就好了
level28→level29
和上一关一样克隆下来,发现password被修改了,结合diff那到题目



查看log,对比差异password就出来了
level29→level30
同上两题一样,只不过这题是查看分支


level30→level31
这个是看git的tag(标签)

level31→level32
这个就是需要push文件上远程仓库了(注意.gitignore过滤)




level32→level33
$0逃逸

思想逃逸(模糊匹配)

level33→level34
恭喜过关

个人总结
一、Linux 命令行与工具的熟练应用
-
基础文件操作
- 掌握
ls(查看文件)、cd(切换目录)、cat(读取文件)、cp/mv(复制 / 移动)、rm(删除)等基础命令的灵活使用,包括处理特殊文件名(如含空格、-开头的文件)。 - 学会用
find按名称、权限、所有者、大小等条件搜索文件(如find / -name "xxx" 2>/dev/null过滤错误信息)。
- 掌握
-
文本处理工具
- 熟练使用
grep过滤文本(如grep -v反向匹配、grep -E正则匹配)、cat/head/tail查看文件片段、cut提取列(如cut -d ' ' -f 1按空格分割取第一列)。 - 掌握管道(
|)和重定向(>/>>/2>/dev/null)组合命令,处理复杂输出(如cat file | grep "key" | cut -d ':' -f 2)。
- 熟练使用
-
权限与用户管理
- 理解 Linux 文件权限模型(
rwx读 / 写 / 执行,chmod权限修改),能通过ls -l分析文件所有者、所属组及权限(如-rwsr-xr--中s表示 setuid 权限)。 - 掌握
chmod数字权限(如644表示rw-r--r--)、chown更改所有者的用法,理解权限对文件操作的限制。
- 理解 Linux 文件权限模型(
二、安全基础与漏洞利用思维
-
权限提升与绕过
- 理解 setuid 机制:通过带有 setuid 权限的程序(如
bandit20-do),临时获取文件所有者权限执行命令(如./bandit20-do cat /etc/bandit_pass/bandit20)。 - 利用定时任务(cron job):分析
/etc/cron.d中的定时任务脚本,找到其执行逻辑漏洞(如将密码写入可访问的临时文件/tmp/xxx)。
- 理解 setuid 机制:通过带有 setuid 权限的程序(如
-
信息泄露与隐蔽数据查找
- 学会挖掘隐藏信息:如
.bashrc等配置文件、/etc/passwd等系统文件、环境变量(echo $PATH)、历史命令(history)中的线索。 - 处理特殊文件:如符号链接(
ln -s)、不可见文件(.hidden)、二进制文件中的字符串(strings命令)。
- 学会挖掘隐藏信息:如
-
网络与加密工具使用
- 掌握
nc(Netcat)进行网络连接与数据传输(如nc localhost 30000连接服务,发送 / 接收数据)。 - 用
openssl s_client测试 SSL/TLS 连接,查看证书信息(如openssl s_client -connect localhost:30001)。
- 掌握
三、脚本与自动化思维
-
简单脚本编写
- 用 Bash 循环(
for i in {1000..9999})和条件判断(if [ ... ])实现自动化操作,如暴力破解 PIN 码(遍历 4 位数字并通过nc验证)。 - 理解脚本中变量(如
$0表示脚本名、$i循环变量)的用法及潜在安全风险(如$0注入)。
- 用 Bash 循环(
-
版本控制工具基础
- 用
git查看仓库历史(git log)、切换分支(git checkout)、查看标签(git tag),从代码仓库中提取隐藏的密码或信息。
- 用
更多推荐



所有评论(0)