overthewire - Bandit
随笔记
overthewire的密码会在一定周期更换。
Bandit Level 0
直接SSH连接2220端口
ssh -p 2220 bandit0@localhost
密码:bandit0
ls 查看目录,看到readme,读取文件。
cat readme
获取bandit1密码
NH2SXQwcBdpmTEzi3bvBHMM9H66vVXjL
Bandit Level 0 → Level 1
Bandit Level 2 → Level 3
访问带有空格的文件名,用转义字符\来转义空格即可,或者直接将文件名用双引号括住
cat "spaces in this filename"
cat spaces\ in\ this\ filename
aBZ0W5EmUfAf7kHTQeOwd8bauFJ2lAiG
Bandit Level 3 → Level 4
访问隐藏文件的技巧,先用cd进入文件夹,再用ls -al列出所有文件,
cat .hidden
2EW7BBsr6aMMoJ2HjW067dm8EgX26xNe
Bandit Level 4 → Level 5
Bandit Level 5 → Level 6
进入到Bandit5的目录后发现目录里面有很多文件,根据提示,找到1033bytes的文件,用如下命令
find . -type -f -size 1033c
P4L4vucdmLnm8I7Vl7jG1ApGSfjYKqJU
Bandit Level 6 → Level 7
首先看题目的要求,bandit7的密码文件有3个属性:被用户bandit7所有,被用户组bandit6所有,并且拥有33字节,但是这个文件在哪里,我们不知道,这关还是考察find工具的使用,这三个属性都可以放到find命令的参数中去,如下
find / -user bandit7 -group bandit6 -size 33c
z7WtoNQU2XfjmMtWA8u5rN4vzqu4v99S
Bandit Level 7 → Level 8
cat data.txt | grep millionth
TESKZC0XvTetK0S9xNwm25STk5iWrBvP
Bandit Level 8 → Level 9
Bandit Level 9 → Level 10
这一关的密码在很多个‘=’的后面,先用cat查看文件信息,输出是非常多的,但是很多不是human-readable的字符,可以用strings来过滤,strings命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。 strings命令对识别随机对象文件很有用。
strings ./data.txt
G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
Bandit Level 10 → Level 11
Bandit Level 11 → Level 12
这一关考察是经典的ROT13加密
Bandit Level 12 → Level 13
Bandit Level 13 → Level 14
Bandit Level 14 → Level 15
Bandit Level 15 → Level 16
Bandit Level 16 → Level 17
PORT STATE SERVICE VERSION
31046/tcp open echo
31518/tcp open ssl/echo
31691/tcp open echo
31790/tcp open ssl/unknown
31960/tcp open echo
openssl s_client -connect localhost:31790 -ign_eof
获取到bandit17的ssh私钥,在tmp目录下创建临时目录,创建文件写入私钥。
赋权644,不赋权或者赋权777无法正常使用私钥。
chmod 644 key
ssh -i key bandit17@localhost -p 2220
cat /etc/bandit_pass/bandit17
VwOSWtCA7lRKkTfbr2IDh6awj9RNZM5e
Bandit Level 17 → Level 18
Bandit Level 18 → Level 19
这一关直接登录的话,会显示一个“Byebye”,然后会话被关闭,原因是.bashrc被改动了,我们可以用带命令的ssh来查看文件或者是伪终端。
ssh -p 2220 bandit18@bandit.labs.overthewire.org "cat ./readme"
ssh -p 2220 bandit18@bandit.labs.overthewire.org -T
ssh -p 2220 bandit18@bandit.labs.overthewire.org "/bin/bash"
ssh -p 2220 bandit18@bandit.labs.overthewire.org "/bin/sh"
ssh -p 2220 bandit18@bandit.labs.overthewire.org "export TERM=xterm;python -c 'import pty;pty.spawn(\"/bin/bash\")'"
awhqfNnAbc1naukrpqDYcF95h7HoMTrC
Bandit Level 19 → Level 20
Bandit Level 20 → Level 21
Bandit Level 21 → Level 22
这里我们查看一下cron.d这个文件夹,找到定时任务,我们找到bandit22执行了什么,继续查看.sh件,找到/tmp里面的文档,然后查看这个文件。
bandit21@bandit:~$ cat /etc/cron.d/cronjob_bandit22 #查看bandit22定时任务
@reboot bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
* * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
bandit21@bandit:~$ cat /usr/bin/cronjob_bandit22.sh #读取bandit22定时任务的脚本
#!/bin/bash
chmod 644 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
cat /etc/bandit_pass/bandit22 > /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
bandit21@bandit:~$ cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv #获取密码
WdDozAdTM2z9DiFEQ2mGlwngMfj4EZff
Bandit Level 22 → Level 23
查看定时任务,利用里面的脚本获取密码
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
bandit22@bandit:/etc/cron.d$ echo I am user bandit23 | md5sum |cut -d ' ' -f 1
QYw0Y2aiA672PsMmh9puTQuhoz8SyR2G
Bandit Level 23 → Level 24
bandit23@bandit:/etc/cron.d$ 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
1 #!/bin/bash
echo "Handling $i"
owner="$(stat --format "%U" ./$i)"
if [ "${owner}" = "bandit23" ]; then
timeout -s 9 60 ./$i
fi
rm -f ./$i
fi
done
这里,我们看到这个脚本执行的任务是:切换到/var/spool/bandit24文件夹,然后遍历所有文件,并且执行这个文件,如果遇到用户是bandit23的话,先执行,持续一段时间,然后再删除文件。
我们先看一下/var/spool/bandit24这个文件的属性
drwxrwx-wx 62 root bandit24 4096 Jan 19 12:46 bandit24
bandit24同一个group是可以读写的,我们写一个脚本,把脚本拷贝到这个文件夹下,脚本很简单,如下,写完脚本后,一定要记得chmod +x ./get_pass.sh,不然不运行。
bandit23@bandit:/tmp$ vim ./get_pass.sh
#!/bin/bash
cat /etc/bandit_pass/bandit24 > /tmp/bandit24pass
cp ./get_pass.sh /var/spool/bandit24/foo
等待一段时间,获取密码
VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar
Bandit Level 24 → Level 25
cd $(mktemp -d)
vim get_pass.sh
#!/bin/bash
b24='VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar'
for i in {0000..9999};do
echo "$b24 $i"
done | nc localhost 30002
chmod 644
bash get_pass.sh
爆破成功之后获取密码
p7TaowMYrmu23Ol8hiZh9UvD0O9hpx8d
Bandit Level 25 → Level 26
登录bandit25,在主目录下面有bandit26的sshkey,用ssh -i 连接到bandit26,显示connection closed,重新看题目,shell有问题,不是/bin/bash,所以查看一下/etc/passwd,找一下bandit26的shell。
有个exit 0,被退出了…
这里要想办法,从这个shell的配置看,有一个more给我们用,所以我们把terminal缩小一点,这个时候more不会结束,然后我们按v,进入编辑模式,输入:e /etc/bandit_pass/bandit26
获取密码
c7GvcKlw9mC7aUQaPx7nwFstuAIBw1o1
Bandit Level 26 → Level 27
:set shell sh=/bin/sh
:sh
$ ls
bandit27-do text.txt
$ ls -al
total 36
drwxr-xr-x 3 root root 4096 May 7 2020 .
drwxr-xr-x 41 root root 4096 May 7 2020 ..
-rwsr-x--- 1 bandit27 bandit26 7296 May 7 2020 bandit27-do
-rw-r--r-- 1 root root 220 May 15 2017 .bash_logout
-rw-r--r-- 1 root root 3526 May 15 2017 .bashrc
-rw-r--r-- 1 root root 675 May 15 2017 .profile
drwxr-xr-x 2 root root 4096 May 7 2020 .ssh
-rw-r----- 1 bandit26 bandit26 258 May 7 2020 text.txt
$ ./bandit27-do cat /etc/bandit_pass/bandit27
YnQpBuifNMas1hcUFk70ZmqkhUU2EuaS
Bandit Level 27 → Level 28
接下来的几个问题都跟git有关,git是非常重要的工具,git功能比较多,可以到git官方网站下载电子版的学习资料,官方提供了中文简体的版本。
这道题是用git把repo拖到本地,我们用git clone
cd $(mktemp -d)
git clone ssh://bandit27-git@localhost:2220/home/bandit27-git/repo
查看readme文件获取密码
AVanL161y9rsbcJIsFHuw35rjaOM19nR
Bandit Level 28 → Level 29
git clone ssh://bandit28-git@localhost:2220/home/bandit27-git/repo
Bandit Level 29 → Level 30
git clone ssh://bandit29-git@localhost:2220/home/bandit27-git/repo
Bandit Level 30 → Level 31
同样,克隆repo到本地,然后看文件,这次好像什么都没有
bandit30@bandit:/tmp/tmp.Yi6XwaEdw7/repo$ git show-ref
d39631d73f786269b895ae9a7b14760cbf40a99f refs/heads/master
d39631d73f786269b895ae9a7b14760cbf40a99f refs/remotes/origin/HEAD
d39631d73f786269b895ae9a7b14760cbf40a99f refs/remotes/origin/master
831aac2e2341f009e40e46392a4f5dd318483019 refs/tags/secret
git show 831aac2e2341f009e40e46392a4f5dd318483019
获取密码
OoffzGDlzhAlerFJ2cAiz1D41JW1Mhmt
Bandit Level 31 → Level 32
#生成文件key.txt
bandit31@bandit:/tmp/bandit31/repo$ echo 'May I come in?' >> key.txt
#加到本地文件
bandit31@bandit:/tmp/bandit31/repo$ git add -f ./key.txt
#查看一下是否是master
bandit31@bandit:/tmp/bandit31/repo$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: key.txt
#commit到本地仓库
bandit31@bandit:/tmp/bandit31/repo$ git commit -m 'key.txt'
[master 088ccca] key.txt
1 file changed, 1 insertion(+)
create mode 100644 key.txt
#push到远程origin master
bandit31@bandit:/tmp/bandit31/repo$ git push origin master
Could not create directory '/home/bandit31/.ssh'.
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:98UL0ZWr85496EtCRkKlo20X3OPnyPSB5tB5RPbhczc.
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/home/bandit31/.ssh/known_hosts).
This is a OverTheWire game server. More information on http://www.overthewire.org/wargames
bandit31-git@localhost's password:
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 319 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: ### Attempting to validate files... ####
remote:
remote: .oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
remote:
remote: Well done! Here is the password for the next level:
remote: rmCBvG56y58BXzv98yZGdO7ATVL5dW8y
remote:
remote: .oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
remote:
To ssh://localhost/home/bandit31-git/repo
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'ssh://bandit31-git@localhost/home/bandit31-git/repo'
找到密码
rmCBvG56y58BXzv98yZGdO7ATVL5dW8y
Bandit Level 32 → Level 33
$ cat /etc/bandit_pass/bandit33
odHo63fHiFqcWWJG9rLiLDtPm45KzUKy
$0
的含义
在 Unix-like 系统的 shell 环境中,$0
是一个特殊的变量,用来表示当前正在执行的脚本或命令的名称。如果是在一个脚本中,$0
将显示该脚本的名称;如果是在命令行直接执行的命令,$0
通常显示 shell 的名称或路径。
如何使用 $0
返回正常的 shell
当你在 shell 中输入 $0
并执行时,实际上你是在请求启动一个新的 shell 实例,该实例的类型或路径由 $0
的值决定。例如,如果你在 bash 环境下输入 $0
,通常会启动一个新的 bash shell。
示例
假设你的默认 shell 是 bash,并且你在终端中执行以下命令:
echo $0
这可能会输出:
/bin/bash
然后,如果你直接执行:
$0
这将启动一个新的 bash shell 实例。在这个新的 shell 中,你可以执行所有正常的命令,直到你退出这个 shell。