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

ls 查看目录下文件,发现文件名为"-"
使用双引号是无法查看的,使用绝对路径或者是相对路径就可以查看了。
这里的问题是“-”跟root的目录缩写是一样的,cd - 是可以直接到root目录,所以需要用路径去查看。
cat ./-
rRGizSaX8Mk1RTb1CNQoXTcYZWU6lgzi

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

 进入到inhere目录后,可以看到很多文件,有一个文件藏着密码,用file命令查看一下文件
file ./*
cat ./-file07
lrIWWI6bB37kxfiCQZqUdOIYfr6eEeqR
 

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

 这个关卡的密码藏在millionth这个单词的后面

cat data.txt | grep millionth

TESKZC0XvTetK0S9xNwm25STk5iWrBvP

Bandit Level 8 → Level 9 

 题目,密码在data.txt文件中,只出现了一次,所以,只要用uniq命令就能找到这个密码,uniq要跟sort一起用,因为uniq是通过比较上下行字符串来判断是否重复,所以先sort再uniq
cat data.txt | sort | uniq -u
EN632PlfYiZbn3PhVK3XOGSlNInNE00t
 

Bandit Level 9 → Level 10

 这一关的密码在很多个‘=’的后面,先用cat查看文件信息,输出是非常多的,但是很多不是human-readable的字符,可以用strings来过滤,strings命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。 strings命令对识别随机对象文件很有用。

 

strings ./data.txt

G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s

 

Bandit Level 10 → Level 11

 这一关非常简单,用base64解码data.txt就行
cat data.txt | base64 -d
6zPeziLdR2RKNdNYFNb6nVCKzphlXHBM
 

Bandit Level 11 → Level 12

这一关考察是经典的ROT13加密

 cat data.txt | tr 'a-zA-Z' 'n-za-nN-ZA-M'
JVNBBFSmZwKKOP0XbFXOoW8chDz5yVRv
 

Bandit Level 12 → Level 13

 先查看这关的文件,又是data.txt,用cat查看文件,是16进制文件,看提示是repeatedly compressed,按照提示,我们先去tmp目录创建一个临时目录,因为权限的问题,我们只能在tmp目录下创建目录,然后我们把文件复制过去,注意,不要给后缀名
mktemp -d 创建tmp目录下的临时目录
利用xxd file 查看文件的属性,用相对的命令解压,然后得到密码
wbWdlBxEir4CaE8LaPhauuOo6pwRmrDw
 

Bandit Level 13 → Level 14

 登录之后有ssh私钥使用私钥登录
ssh -i ./sshkey.private bandit14@localhost -p2220
cat /etc/bandit_pass/bandit14
fGrHPx402xGC7U7rXKDaxiWFTOiF0ENq
 

Bandit Level 14 → Level 15

 这一关用nc把14的密码发送到30000这个端口
nc localhost 30000
发送 fGrHPx402xGC7U7rXKDaxiWFTOiF0ENq
jN2kgmIXJ6fShzhT2avhotn4Zcka6tnt
 

Bandit Level 15 → Level 16

 题目要求加密通信,使用openssl命令
openssl s_client -connect localhost:30001
发送 jN2kgmIXJ6fShzhT2avhotn4Zcka6tnt
JQttfApK4SeyHwDlI9SXGR50qclOAil1
 

Bandit Level 16 → Level 17

看题目,要求我们先扫描31000到32000端口,并且找到ssl的端口,用nmap可以扫描
nmap -sV localhost -p 31000-3200


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

 登录17之后,查看目录,发现有两个文件,看提示说,修改过的一行就是密码,用diff命令查看修改过的一行
diff -d passwords.new passwords.old
 
hga5tuuCLF6fFzUpnagiMN8ssu9LFrdg
 

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

 setuid可以查看到用户权限,ls -al列出所有文件及权限,注意到bandit20-do是-rws-r-x---,这个文件有suid权限,也就是可以运行与创建者相同权限来运行程序,用它来读取Level 20的文件
运行文件提示 
bandit20-do id
所以我们知道setuid是怎么用来提权的。
bandit20-do cat /etc/bandit_pass/bandit20 #获取bandit20密码
VxCazJaVykI6W36BkBU0mJTCM8rR95XT
 

Bandit Level 20 → Level 21

 题目里有个描述,it makes a connection to localhost on the port you specify as a commandline argument, 也就是说这个suconnect可以连接指定的端口,但是我们要把密码给到这个端口
nc -lv < /etc/bandit_pass/bandit20 &
./suconnect 37469
发送 VxCazJaVykI6W36BkBU0mJTCM8rR95XT
NvEJF7oVjkddltPSrdKEFOllh9V1IBcq

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

查看定时任务,利用里面的脚本获取密码

 cat /etc/cron.d/cronjob_bandit23
* * * * * bandit23 /usr/bin/cronjob_bandit23.sh &> /dev/null
cat /usr/bin/cronjob_bandit23.sh


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

 同样的,查看定时任务,利用里面的脚本获取密码,其实就是Linux提权的方法
 cat /etc/cron.d/cronjob_bandit24
 bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null

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

 这一关的提示是暴力破解,这里可以用好几种方式生成爆破密码,最简单的方式而且在很多机器上都可以执行的话,建议还是使用shell脚本或者python脚本,shell脚本在linux服务器上可以被顺利执行的可能性比较大,产生爆破密码的脚本如下

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

 直接用密码登录26会出现跟25一样的情况,bash直接被退出,同样继续利用more的特性,我们缩小terminal,然后按v进入vi模式,这里,我们要用vi模式来呼唤出shell,这种方式也是一个经典的提权问题,只要系统给了一个可用vim编辑的sudo权限的文本,也可以通过这个文本的vi模式来提权。

: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 show 可以查看commit记录,最近的一次提交记录把密码改掉了,找到密码tQKvmcwNYcFS6vmPHIUSI3ShmsrQZK8S
 
cd $(mktemp -d)

git clone ssh://bandit28-git@localhost:2220/home/bandit27-git/repo

cd repo
git show
 
 
 

Bandit Level 29 → Level 30

 考察点是查看git的分支
cd $(mktemp -d)

git clone ssh://bandit29-git@localhost:2220/home/bandit27-git/repo

cd repo
git branch -a
git checkout dev
cat README.md
 xbhV3HpNGlTIdnjUrdAlPzc2L6y9EOnS

Bandit Level 30 → Level 31

 考察点是git的引用

同样,克隆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

 考察点是提交文件到git


#生成文件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

 $0可以到正常的shell,然后cat找密码

$ cat /etc/bandit_pass/bandit33
odHo63fHiFqcWWJG9rLiLDtPm45KzUKy

Q:为什么$0可以返回正常的shell
A:

$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。

 
参考文章:
 
posted @ 2024-05-05 16:08  日月的阿金  阅读(106)  评论(0编辑  收藏  举报