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/null2>/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登录