OverTheWire Bandit wargame clearance record


https://overthewire.org/wargames

Level 0
账号密码都在网页直接给出了

Level 0 → Level 1

按页面提示,以SSH,账号,密码都是bandit0链接服务器,下一关密码直接在/home/bandit0/readme里面
密码:ZjLjTmM6FvvyRnrb2rfNWOZOTa6ip5If

Level 1 → Level 2

以 bandit1 和密码 ZjLjTmM6FvvyRnrb2rfNWOZOTa6ip5If 登录
按页面提示,文件在/home目录里面,
find . -name readme 2>/dev/null
2>/dev/null 是一个让报错不显示的写法
试了一下,要不是没权限的文件,要不就是上一关的文件
看到一个名为“-”的文件,用的SSH终端是windterm,直接右键打开来看:
263JGJPfgU6LtdEvgfWU1XP5yac29mFx

Level 2 → Level 3

以 bandit2 和密码 263JGJPfgU6LtdEvgfWU1XP5yac29mFx 登录
按页面提示的文件名,

cat ./'--spaces in this filename--' 
或者 
cat './--spaces in this filename--'
或者
cat -- --spaces in this filename--

获得密码
MNk8KNH3Usiio41PRUEoDFPqfxLPlSmx

Level 3 → Level 4

bandit3 MNk8KNH3Usiio41PRUEoDFPqfxLPlSmx登录
按页面提示的目录名
cat '/home/bandit3/inhere/...Hiding-From-You'

获得密码:2WmrDFRmJIq3IPxneAaMGhap0pFhF3NJ

Level 4 → Level 5

bandit4 2WmrDFRmJIq3IPxneAaMGhap0pFhF3NJ
按页面提示:下一关的密码存储在inhere目录中唯一一个人类可读的文件中
cd inhere
由于看到的文件名都使用了“-”开头,使用命令打印第一行看看:

for file in *; do [ -f "$file" ] && head -n 1 -- "$file"; done
# 或者
find . -type f -exec head -n 1 {} +
# 寻找,本目录,-type f (普通文件),head -n 1(第一行),{} 是 find 的占位符,代表当前找到的文件路径,+ 是find -exec的一种结尾形式,
# 用 \;结尾:简单直观,但对每个文件都要启动一次命令,效率低(特别是几千几万个文件时)。
# 用 +:更高效,能减少进程数量。

获得密码:4oQYVPkxZOOEOO5pTW81FB8j8lxXGUQw

Level 5 → Level 6

bandit5 4oQYVPkxZOOEOO5pTW81FB8j8lxXGUQw
按照页面提示:
·inhere目录下
·人类可读
·大小为 1033 字节
·权限是不可执行
尝试:

cd inhere && ls -a

发现好多目录,继续:

find . -type f -size 1033c
出来好多文件,继续加限制条件:
find . -type f -size 1033c ! -perm /111 -exec cat -- {} +
# 或者
find . -type f -size 1033c ! -perm /111 -exec sh -c '
# 用 sh -c 包一层,就可以在 -exec ... + 里写循环
  for file do
    printf "%s:\n" "$file"
    head -n 5 -- "$file"
    echo "----------------"
  done
' sh {} +

获得密码:HWasnPhtq9AVKe0dmk45nxy20cvUa6EG

Level 6 → Level 7

bandit6 HWasnPhtq9AVKe0dmk45nxy20cvUa6EG

按照页面提示,密码文件:
·归用户 bandit7 所有
·归 bandit6 组所有
·大小为 33 字节

cd /
find / -type f -user bandit7 -group bandit6 -size 33c 2>/dev/null -exec cat -- {} +
显示密码为:morbNTDkSW6jIlUc0ymOdMaLnOlFVAaj

Level 7 → Level 8

bandit7 morbNTDkSW6jIlUc0ymOdMaLnOlFVAaj

按照页面提示:
下一关的密码存储在文件data.txt中,位于单词millionth旁边

find . -name 'data.txt' 2>/dev/null -print0 | xargs -0 grep -Hn 'millionth'
或用更少的做法
grep -Hn 'millionth'  ./data.txt

显示密码为:dfwvzFQi4mU0wfNbFOe9RoWskMLg7eEc

Level 8 → Level 9

bandit8 dfwvzFQi4mU0wfNbFOe9RoWskMLg7eEc
按照页面提示:
下一关的密码存储在文件data.txt中,密码是某行字符在文件中只出现过一次,而其他行都有重复的
则,排序(sort),输出出现一次的行(uniq -u):
sort data.txt | uniq -u

Level 9 → Level 10

bandit9 4CKMh1JI91bUIZZPXDqGanal4xvAg0JM

按照页面提示:
下一关的密码存储在文件data.txt中,密码是以一些‘=’开头的

grep ^==' ./data.txt  # 没有回显,查文件类型
file data # 显示data.txt: data 文件为2进制文件
grep -Hn '^=*'  ./data.txt # 显示 grep: ./data.txt: binary file matches
strings data.txt | grep '^==*'  # 显示密码为:FGUW5ilLVJrxX9kMYMmlN4MgbpfMiqey

strings命令是在对象文件或二进制文件中查找可打印的字符串

Level 10 → Level 11

bandit10 FGUW5ilLVJrxX9kMYMmlN4MgbpfMiqey

按照页面提示:
下一关的密码存储在文件data.txt中,密码是以base64编码的(文件总共就一行,是base64编码)
cat data.txt | base64 -d
(居然有base64的命令,我以前没听说过,本来想复制到浏览器解码的)
显示 The password is dtR173fZKb0RRsDFSGsg2RWnpNVj3qRr

Level 11 → Level 12

bandit11 dtR173fZKb0RRsDFSGsg2RWnpNVj3qRr

按照页面提示:
下一关的密码存储在文件data.txt中,密码是由字母偏移13位而加密成的(即a变n,b变o)
由于字母表共26个字母,13恰好是在中间,则无论向前或后偏移都是一样

function rot13(str) {
    return str.replace(/[A-Za-z]/g, function(char) { // 对 str 进行 全局(/g 返回每一次匹配的结果,如无/g这只会返回第一个字母)调用 function(char),即把没一个字母分次传入char函数
        let code = char.charCodeAt(0);  // 每次传入的char是一个长度为1的字符串(单个字符),它的索引只有0
        if (code >= 65 && code <= 90) { // 如果是大写字母(根据大写字母的ASCII码元)
        // code - 65:将字母转换为0-25的索引,方便计算(A=0, Z=25),因为A的ASCII码元是65,从A开始算
        // + 13:向后数13位。
        // % 26:模26确保索引在0-25范围内,因为字母表是循环的:Z(索引25)向后13位是M(索引12)
        // + 65:转回ASCII码,生成新的大写字母。
        // 小写字母类似
            return String.fromCharCode(((code - 65 + 13) % 26) + 65);
        } else if (code >= 97 && code <= 122) {
            return String.fromCharCode(((code - 97 + 13) % 26) + 97);
        }
        return char;
    });
}
console.log(rot13("Gur cnffjbeq vf 7k16JArUVv5LxVuJfsSVdbbtaHGlw9D4")); 

输出:The password is 7x16WNeHIi5YkIhWsfFIqoognUTyj9Q4

Level 12 → Level 13

bandit12 7x16WNeHIi5YkIhWsfFIqoognUTyj9Q4
不多说,看代码,这关卡真是能折腾人,压缩套了好多层

bandit12@bandit:~$ mktemp -d  # 生成临时目录
/tmp/tmp.FonipETdmj
bandit12@bandit:~$ cd /tmp/tmp.FonipETdmj
bandit12@bandit:/tmp/tmp.FonipETdmj$ cp ~/data.txt .
# 按照页面提示,密码文件是十六进制,必须还原成原始二进制,经查,linux系统有xxd小工具可以转换
bandit12@bandit:/tmp/tmp.FonipETdmj$ xxd -r data.txt > data.bin
# 转换完了看看是什么东西,原来是gzip压缩
bandit12@bandit:/tmp/tmp.FonipETdmj$ file data.bin
data.bin: gzip compressed data, was "data2.bin", last modified: Fri Aug 15 13:15:53 2025, max compression, from Unix, original size modulo 2^32 584
# 由于不正确的文件后缀不能被压缩软件识别,所以要改名
bandit12@bandit:/tmp/tmp.FonipETdmj$ mv data.bin data.gz
# 解压看看
bandit12@bandit:/tmp/tmp.FonipETdmj$ gunzip data.gz
# 解压出来一个data,用file看看是什么东西
bandit12@bandit:/tmp/tmp.FonipETdmj$ file data
data: bzip2 compressed data, block size = 900k
# 一直重复以上步骤
bandit12@bandit:/tmp/tmp.FonipETdmj$ mv data data.bz2
bandit12@bandit:/tmp/tmp.FonipETdmj$ bunzip2 data.bz2
bandit12@bandit:/tmp/tmp.FonipETdmj$ ls
data  data.txt
bandit12@bandit:/tmp/tmp.FonipETdmj$ file data
data: gzip compressed data, was "data4.bin", last modified: Fri Aug 15 13:15:53 2025, max compression, from Unix, original size modulo 2^32 20480
bandit12@bandit:/tmp/tmp.FonipETdmj$ mv data data.gz
bandit12@bandit:/tmp/tmp.FonipETdmj$ gunzip data.gz
bandit12@bandit:/tmp/tmp.FonipETdmj$ file data
data: POSIX tar archive (GNU)
bandit12@bandit:/tmp/tmp.FonipETdmj$ mv data data.tar
bandit12@bandit:/tmp/tmp.FonipETdmj$ tar -xf data.tar
bandit12@bandit:/tmp/tmp.FonipETdmj$ ls
data5.bin  data.tar  data.txt
bandit12@bandit:/tmp/tmp.FonipETdmj$ file data5.bin
data5.bin: POSIX tar archive (GNU)
bandit12@bandit:/tmp/tmp.FonipETdmj$ tar -xf data5.bin
bandit12@bandit:/tmp/tmp.FonipETdmj$ ls
data5.bin  data6.bin  data.tar  data.txt
bandit12@bandit:/tmp/tmp.FonipETdmj$ file data6.bin
data6.bin: bzip2 compressed data, block size = 900k
bandit12@bandit:/tmp/tmp.FonipETdmj$ mv data6.bin data6.bz2
bandit12@bandit:/tmp/tmp.FonipETdmj$ ls
data5.bin  data6.bz2  data.tar  data.txt
bandit12@bandit:/tmp/tmp.FonipETdmj$ bunzip2 data6.bz2
bandit12@bandit:/tmp/tmp.FonipETdmj$ ls
data5.bin  data6  data.tar  data.txt
bandit12@bandit:/tmp/tmp.FonipETdmj$ file data6
data6: POSIX tar archive (GNU)
bandit12@bandit:/tmp/tmp.FonipETdmj$ mv data6 data6.tar
bandit12@bandit:/tmp/tmp.FonipETdmj$ ls
data5.bin  data6.tar  data.tar  data.txt
bandit12@bandit:/tmp/tmp.FonipETdmj$ tar -xf data6.tar
bandit12@bandit:/tmp/tmp.FonipETdmj$ ls
data5.bin  data6.tar  data8.bin  data.tar  data.txt
bandit12@bandit:/tmp/tmp.FonipETdmj$ file data8.bin
data8.bin: gzip compressed data, was "data9.bin", last modified: Fri Aug 15 13:15:53 2025, max compression, from Unix, original size modulo 2^32 49
bandit12@bandit:/tmp/tmp.FonipETdmj$ mv data8.bin data8.gz
bandit12@bandit:/tmp/tmp.FonipETdmj$ gunzip data8.gz
bandit12@bandit:/tmp/tmp.FonipETdmj$ ls
data5.bin  data6.tar  data8  data.tar  data.txt
# 凭直觉file一个, 终于看到text文件了
bandit12@bandit:/tmp/tmp.FonipETdmj$ file data8
data8: ASCII text
bandit12@bandit:/tmp/tmp.FonipETdmj$ cat data8
The password is FO5dwFsc0cbaIiH0h8J2eUks2vdTDwAn

Level 13 → Level 14

bandit13 FO5dwFsc0cbaIiH0h8J2eUks2vdTDwAn
按照页面提示,没有密码文件,只有ssh key
登录cd ls cat xxxxxxxxxx 把ssh key复制下来随便保存

Level 14 → Level 15

bandit14 ssh key登录
按上一关的提示,直接打开

cat /etc/bandit_pass/bandit14

获得Level 14(本关)的登录密码:MU4VWeTyJk8ROof1qqmcBPaLh7lDCPvS
按网页提示,给本地端口30000發这个字符串,来获得下一关的密码
nc localhost 30000回车,再粘贴密码,回车

显示:Correct!
8xCjnmgoKbGLhHFAZlGE5Tmu4M2tKJQo

Level 15 → Level 16

bandit15 8xCjnmgoKbGLhHFAZlGE5Tmu4M2tKJQo

网页上说:通过使用 SSL/TLS 加密将当前级别的密码提交到localhost 上的端口 30001,可以检索下一级别的密码

bandit14@bandit:~$ openssl s_client -connect localhost:30001
# 回车
# 粘贴:8xCjnmgoKbGLhHFAZlGE5Tmu4M2tKJQo 
# 回车

Correct!
kSkvUpMQ7lBYyCM4GBPvCvT1BfWRy0Dx

Level 16 → Level 17

bandit16 kSkvUpMQ7lBYyCM4GBPvCvT1BfWRy0Dx
按网页提示:31000 到 32000端口
写脚本测:

for port in {31000..32000}; do
  (echo > /dev/tcp/localhost/$port) >/dev/null 2>&1 && echo "端口 $port open"
done

输出:
端口 xxx open
端口 xxx open
端口 xxx open
端口 xxx open

明文测端口(回车,粘贴密码,回车):
nc localhost 31046 断开
nc localhost 31518 断开
nc localhost 31691 回复同样
nc localhost 31790 断开
nc localhost 31960 回复同样

测断开的(回车,粘贴密码,回车):
openssl s_client -connect localhost:31046 报错
openssl s_client -connect localhost:31518 报错
openssl s_client -connect localhost:31790 返回了ssh keygen

最后一个 返回了一堆代码,以及ssh keygen
复制ssh keygen下来保存

Level 17 → Level 18

bandit17 SSH key登录

Level 18 → Level 19

Level 19 → Level 20

Level 20 → Level 21

Level 21 → Level 22

Level 22 → Level 23

Level 23 → Level 24

Level 24 → Level 25

Level 25 → Level 26

Level 26 → Level 27

Level 27 → Level 28

Level 28 → Level 29

Level 29 → Level 30

Level 30 → Level 31

Level 31 → Level 32

Level 32 → Level 33


文章作者: Alan Work
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alan Work !
  目录