overthewire - Bandit

news/2024/5/19 0:38:29

随笔记

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。

 
参考文章:
OverTheWire: Bandit通关指引-CSDN博客
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/28246.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

对C语言符号的一些冷门知识运用的剖析和总结

把概念和原理讲清楚、进阶、C语言符号符号 目录符号注释奇怪的注释C风格的注释无法嵌套一些特殊的注释注释的规则建议反斜杠\反斜杠有续行的作用,但要注意续行后不能添加空格回车也能起到换行的作用,那续行符的意义在哪?反斜杠的转义功能单引号和双引号字面值,字符串,字符,字…

k8s核心组件详解和分层架构

k8s核心组件master中的核心组件api-server(接口服务,基于rest风格开放k8s接口的服务) kube-controller-manager(管理各个类型的控制器,针对k8s中的各种资源进行管理)cloud-controller-manager(云控制管理器,第三方云平台提供的控制器,api对接管理功能) kube-scheduler…

前端框架开发之Niu框架——从零学框架的小白

起因: 从2018年6月一直到我重新提笔,6年时间。这六年时间,我见证了IT的兴衰,见证了小众框架LayUI框架的重新更新,见证了vue、angular、react等框架的主流。----博客园老牛大讲堂初衷: 今年我突发灵感,想要设计一个网站,作为程序员却"提笔忘字",就连最基本的…

Blazor流程编排的艺术:深入Z.Blazor.Diagrams库的使用与实践

为现代网页应用开发提供动力的其中一个重要方面就是前端框架的强大功能与灵活性。而在.NET生态中,Blazor以其独特的工作方式和优势逐渐获得了开发者们的青睐。今天,在这篇文章中,我将带你深入探索一个基于Blazor的优秀库——Z.Blazor.Diagrams,我们将了解它是如何帮助开发者…

【未整合】数学 day4.2

博弈论 Nim游戏 对于 \(n=2\),\(a_1=a_2\),后手可以“模仿”先手,使得后手必胜。 对于 \(a_1\ne a_2\),先手可以让自己进入“模仿期”,使得先手必胜。 结论:若 \(\oplus a_i=0\),先手必败,否则必胜。很神奇的东西,证明需要群论知识。 发现石子的合并满足上面四条性质,…

Jmeter内存溢出:java.lang.OutOfMemoryError: Java heap space解决思路

一、问题原因 用JMeter压测,有时候当模拟并发请求较大或者脚本运行时间较长时,JMeter会停止,报OOM(内存溢出)错误。原因是JMeter是一个纯Java开发的工具,内存由java虚拟机JVM管理,当内存回收不及时,堆内存不足时,就会报内存溢错误。 概念补充: 内存泄露:应用使用资源…

ABC352

A link\(x\)停不到,\(y\)能停到。 要先判断是从前往后还是从后往前。点击查看代码 #include<bits/stdc++.h>using namespace std;signed main(){int n,x,y,z;cin >> n >> x >> y >> z;if(x <= y){if(z > x&&z <= y) cout <…

深度学习相关理论

一、深度学习相关理论 1.神经网络概述 2. 卷积神经网络CNN ①卷积层——计算方法是大矩阵内部小矩阵=较小矩阵,作用是特征提取 ②池化层——计算方法是大矩阵通过选取最大值或是平均值变成小矩阵,作用是降维、提高计算效率 3. 激活函数