bandit介绍

Bandit 是 OverTheWire 平台推出的一款经典的 Linux 命令行安全闯关游戏,专为学习和练习 Linux 系统安全、命令行操作、权限管理及网络基础知识 设计。通过一系列一系列关卡,玩家需要利用各种系统工具和安全知识,从当前关卡用户逐步获取下一关的密码,最终完成所有挑战。

地址:https://overthewire.org/wargames/bandit/

通关过程

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 中包含了强制退出会话的命令(如 exitlogout),或触发了导致会话终止的错误逻辑。

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

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐