当前位置: 首页 > article >正文

在线游戏靶场【overthewire.org】之linux基础练兵场

前言

这里是bandit系列从1-33所有关卡,所以内容很多,大家可以慢慢观看,或者跳着看

靶场游戏网站: https://overthewire.org/wargames/bandit
ssh连接主机 : bandit.labs.overthewire.org

ssh连接端口 : 2220
password : 密码都存储在/etc/bandit_pass/ 中

从第一个账户bandit0开始,后面获取的密码都是下一个用户的密码

这里是考察linux的,使用ssh进行连接并发现的

这里的密码,作者应该是定期进行随机,所以这里的密码只做参考

解题

bandit0

直接输入用户名bandit0和密码bandit0即可

在这里获取到bandit1的密码

获取方式cat readme

ZjLjTmM6FvvyRnrb2rfNWOZOTa6ip5If

进入下一个登录

bandit1

直接输入用户名bandit1和前面获取的密码

然后查看ls,并使用命令(cat)vim ./-获取下一个密码

特殊字符为文件名,如破折号(-)等,可以使用./ 就可以访问文件。

263JGJPfgU6LtdEvgfWU1XP5yac29mFx

这个就是下一个用户bandit2的密码

bandit2

输入用户名bandit2和上面的密码即可登录

使用命令cat "{filename}" 或者 cat spaces\ in\ this\ filename

使用 "" 把空格文件名包含进去,即可获取。或者对文件名中包含的空格进行转义(使用 \进行转义)

MNk8KNH3Usiio41PRUEoDFPqfxLPlSmx

这就是下一个用户bandit3的密码

bandit3

输入用户名bandit3和上面获取的密码登录即可

使用命令ls -al可以显示隐藏文件,在linux中以.开头的是隐藏文件的格式,cat ...Hiding-From-You

2WmrDFRmJIq3IPxneAaMGhap0pFhF3NJ

这就是下一个用户bandit4的密码

bandit4

使用用户名bandit4和上面获取的密码进行登录

使用命令cat ./*查看当前目录下的所有文件,并输出在屏幕上

4oQYVPkxZOOEOO5pTW81FB8j8lxXGUQw

这就是下一个用户bandit5的密码

bandit5

使用bandit5和上面获取的密码进行登录

查看目录后,发现内容太多了,那么怎么我们想要的是什么

查看官方给出的提示

那么就需要使用find了,首先需要知道,大小为1033字节,在find中可使用-size 1033cc表示字节

不可执行,表示该文件没有执行权限,具有执行权限的是111没有就取!

find . -type f -size 1033c ! -perm 111
# . 表示当前目录下
#-type f 指定搜索的文件类型为普通文件
b —— 块(512字节)
c —— 字节
w —— 字(2字节)
k —— 千字节
M —— 兆字节
G —— 吉字节

HWasnPhtq9AVKe0dmk45nxy20cvUa6EG

这就是下一个用户bandit6的密码

bandit6

使用用户名bandit6和上面获取的密码进行登录

登录后发现当前目录下没有任何东西,查看官方提示

那么根据提示构造语句

find / -user bandit7 -group bandit6 -size 33c 2>/dev/null
#-user 指定文件的所有者
#-group 指定文件的所属组

#find使用后可能有权限被拒等信息,正确的查找信息被淹没其中,所以在命令后加上 2>/dev/null,即可去除权限被拒的错误信息,只显示查找到的位置

morbNTDkSW6jIlUc0ymOdMaLnOlFVAaj

这就是下一个用户bandit7的密码

bandit7

使用用户名bandit7和上面获取的密码登录

查看官方提示

先查看一下data.txt中的数据是什么样的,然后再配合grep筛选出指定的一行

head -5 data.txt		#查看data.txt的前5行数据
cat data.txt | grep millionth	
#查看data.txt数据,并把数据交给grep进行过滤,只留下有millionth的那一行

dfwvzFQi4mU0wfNbFOe9RoWskMLg7eEc

这就是下一个用户bandit8的密码

bandit8

使用用户名bandit8和上面获取的密码进行登录

查看官方给出的提示

是只出现一次的文本行

那么可以构造语句

cat data.txt | sort | uniq -u
#这种方式通过把所有数据交给sort进行排序,就是按照英文字母那种进行排序,然后交给uniq进行统计,-u就是只出现一次的文本行

sort data.txt | uniq -c | grep -w 1
#这种方式是先进行排序,然后交给uniq处理,-c是对出现的文本行进行统计并去重,在每一行前,标出出现次数,然后使用grep -w 处理,也就是筛选1的那一行出来

4CKMh1JI91bUIZZPXDqGanal4xvAg0JM

这就是下一个用户bandit9的密码

bandit9

使用用户名bandit9和上面获取的密码进行登录

查看官方给出的提示

这里直接查看data.txt,发现内容乱码,所以构造语句

strings data.txt | grep ==
#strings可以把乱码中的一些字符显示出来,不会显示乱码

FGUW5ilLVJrxX9kMYMmlN4MgbpfMiqey

这就是下一个用户bandit10的密码

bandit10

输入用户名bandit10和上面获取的密码登录

查看官方给出的提示,说是有base64编码

构造语句

base64 -d data.txt
或者
cat data.txt | base64 -d
#base64 -d 是把前面获取的结果进行base64解码

dtR173fZKb0RRsDFSGsg2RWnpNVj3qRr

这个就是下个用户bandit11的密码

bandit11

使用用户名bandit11和上面获取的密码登录

查看官方给出的提示

那么可以借助命令tr,该命令是可以进行字符替换的,那么原本的a-z就需要分成两段了,构造语句

cat data.txt | tr [a-zA-Z] [n-za-mN-ZA-M]

#应用ROT13到一段文字上仅仅只需要检查字母顺序并取代它在13位之后的对应字母
#有需要超过时则重新绕回26英文字母开头即可。A换成N、B换成O、依此类推到M换成Z,然后串行反转:N换成A、O换成B、最后Z换成M
#只有这些出现在英文字母里的字符受影响;数字、符号、空白字符以及所有其他字符都不变。替换后的字母大小写保持不变。

7x16WNeHIi5YkIhWsfFIqoognUTyj9Q4

这就是下个用户bandit12的密码

bandit12

使用用户名bandit12和上面获取的密码登录

查看官方给出的提示

构造语句

mktemp -d	#直接在/tmp目录下创建一个目录,并且是唯一的

cp data.txt /tmp/tmp.gA5Mfk5YeT	#这个目录是上面生成的,是随机的
cd /tmp/tmp.gA5Mfk5YeT
xxd -r data.txt > test

这里后面太多了,简单来说,这里可以知道各种解压方式及命令

#每次需要使用file查看文件是什么类型的,然后具体根据类型操作

#bzip2压缩的文件,文件需要为 .bz2格式,若不是,需要使用mv更改
bzip2 -d test.bz2
#gzip压缩的文件,文件需要 .gz格式
gzip -d test.gz
#tar压缩的文件,文件需要为 .tar格式
tar -xvf test.tar

#最终使用file确定文件为 ASCII text,即可以查看了

FO5dwFsc0cbaIiH0h8J2eUks2vdTDwAn

这就是下一个用户bandit13的密码

bandit13

使用用户名bandit13和上面获取的密码登录

查看官方提示

这里是翻译问题,这里大概意思就是使用密钥连接,没有密码

查看当前目录,发现私钥文件

把这个文件中的内容复制,不过需要修改这个密钥文件的权限为400,但是在windows中很是麻烦,所以后面采用linux,我这里是使用wsl安装的kali,因为这个启动方便,也小巧,所以直接使用这个

#在kali中执行,下载到当前目录
scp -P 2220 bandit13@bandit.labs.overthewire.org:/home/bandit13/sshkey.p
rivate ./

chmod 400 sshkey.private
ssh -i sshkey.private bandit13@bandit.labs.overthewire.org -p 2220

登录成功,之前官方提示,密码在/etc/bandit_pass/bandit14

MU4VWeTyJk8ROof1qqmcBPaLh7lDCPvS

这就是当前bandit14 的密码

bandit15

之前并未获取到bandit15的密码,查看官方提示

那么保持bandit14的登录状态,然后构造语句

nc 127.0.0.1 30000
#然后输入上面的bandit14的密码

8xCjnmgoKbGLhHFAZlGE5Tmu4M2tKJQo

这是bandit15的密码

这时候,不行啊,对于bandit16未获取到内容,这里查看官方提示

那么需要以bandit15再登录,然后进行操作,因为涉及ssl/tls加密,所以构造以下语句

openssl s_client -connect 127.0.0.1:30001
#然后在进行读取的时候,输入上面的bandit15密码

或者使用ncat也是可以的,不过建议使用openssl,这个对于验证是比较更全面的

ncat --ssl localhost 30001

kSkvUpMQ7lBYyCM4GBPvCvT1BfWRy0Dx

这是bandit16的密码

bandit16

使用用户名bandit16和上面获取的密码登录

查看官方提示

所以这里需要进行扫描端口了,指定提供的端口范围

nmap -sV 127.0.0.1 -p 31000-32000

测试,31518端口是输入什么就输出什么,所以另一个ssl端口31790可用

构造语句

ncat --ssl 127.0.0.1 31790
或者
openssl s_client -connect 127.0.0.1:31790
#两个其中一个即可

获取到的是密钥

把这个密钥复制到kali或者直接复制在当前机器也是可以的,不过若是在当前机器,需要在/tmp目录,这样才能修改权限

chmod 400 conn
ssh -i conn bandit17@bandit.labs.overthewire.org -p 2220

登录成功后,可以查看文件/etc/bandit_pass/bandit17获取当前用户的密码

EReVavePLFHtFlFsjn3hyzMlvSuSAcRD

这是bandit17的密码

bandit17

可以在上面的基础上保持登录状态,或者使用获取的密码再登录

查看官方给出的提示

就是比较两个文件,可以使用diff,列出两个文件中的不同,是对应关系的

diff passwords.new passwords.old

所以根据文件名new代表新密码,所以,密码为

x2gLTTjFwMOhQ8oWNbMN362QKxfRqGlO

这就是bandit18的密码

bandit18

使用上面获取的密码登录用户bandit18

但是在尝试登录时,直接被退出,并提示之前官方给出的关键字byebye

那么在进行登录的时候尝试能否执行操作,并有返回吗,测试命令ls返回了readme

ssh bandit18@bandit.labs.overthewire.org -p 2220 ls

那么再测试能否使用其他命令,比如这里查看这个文件,获取到密码

ssh bandit18@bandit.labs.overthewire.org -p 2220 cat readme

cGWpMaKXVwDUNgPAVJbWYuGHVn9zl3j8

这个密码就是bandit19的密码

bandit19

使用上面获取的密码登录bandit19

查看官方提示

查看当前用户的家目录下,发现一个具有SUID权限的文件,并且所属组bandit19有执行权限的,该文件也是可执行文件,测试,发现可以以所属者的身份执行命令,执行查看密码文件

./bandit20-do cat /etc/bandit_pass/bandit20

0qXahG8ZjOVMN9Ghs7iOWsCfZyXOUbYO

这是bandit20的密码

bandit20

使用上面获取的密码登录bandit20用户

查看当前用户的家目录,发现还是一个SUID权限的文件,所以猜测还是与上面一样

借助nc开启一个监听,用于接收,不过这里经过测试,其实是进行的比较

因为/etc/bandit_pass/bandit20中的密码与输入的一样,所以会返回成功的

nc -lvvp 50000 < /etc/bandit_pass/bandit20 &
#这里是开启一个监听端口,然后当有人访问这个端口,就会把bandit20密码输出,然后会进行验证的
#这里的&是指后台执行任务

./suconnect 50000 0qXahG8ZjOVMN9Ghs7iOWsCfZyXOUbYO
#执行脚本连接指定端口,然后把用户输入的密码与上面的输出进行比较
#正确就返回下一个用户的密码

或者可以这样

echo "0qXahG8ZjOVMN9Ghs7iOWsCfZyXOUbYO" > /tmp/1.txt

nc -lvvp 8888 < /tmp/1.txt &
./suconnect 8888 0qXahG8ZjOVMN9Ghs7iOWsCfZyXOUbYO

EeoULMCra2q0dSkYj561DX7s1CpBuOBt

这就是bandit21的密码

bandit21

使用上面获取的密码登录bandit21用户

查看官方提示

这里就开始涉及到定时任务了,一般可以查看/etc/crontab,直接查看有无定时任务。

或者在/etc/cron.d目录下,一般都放置着定时任务

cd /etc/cron.d
ls -al

这里还可以看到其他两个用户,说明后面可能都是这样获取的,不过这里还是需要一级一级的向上,有权限限制

tRae0UfB9v0UzbCdn9cY0gQnds9GF58Q

这就是bandit22的密码

bandit22

使用上面获取的密码登录用户bandit22

直接查看定时任务,发现脚本,查看脚本内容

这里主要就是路径进行了md5加密

尝试复原脚本,这里只需要获取路径即可

这时候就直接查看即可发现密码

cat /tmp/8ca319486bfbbc3663ea0fbe81326349

0Zf11ioIjMVN551jX3CmStKLYqjk54Ga

这就是bandit23的密码

bandit23

以上面获取的密码登录bandit23用户

直接查看脚本文件

既然可以执行,那么查看能否在那个目录可否写入,其他用户具有写入和执行权限

那么在foo目录下写入一个脚本,等待执行

echo "cat /etc/bandit_pass/bandit24 > /tmp/pass_24" > 1.sh
chmod +x 1.sh

这时候等待一分钟,执行后,就可以去/tmp/pass_24查看获取的密码

gb8KRRCsshuZXI0tUuR6ypOFjiZbf3G8

这就是bandit24的密码

bandit24

使用上面获取的密码登录bandit24用户

查看官方提示

测试这个端口,确实需要bandit24的密码和一个四位的pin码,中间以空格隔开

直接在终端编写代码,使用bash循环使密码加上四位pin,当然,也可以直接编写一个.sh脚本,然后执行,效果是一样的

for i in {0000..9999}; do echo gb8KRRCsshuZXI0tUuR6ypOFjiZbf3G8 $i; done | nc localhost 30002 > result.txt

然后根据前面测试的,错误的话,会提示Wrong!......,那么使用grep进行筛选

cat /tmp/result.txt | grep -v "Wrong"

iCi86ttT4KSNe1armKiwbQNmB3YJP3q4

这就是bandit25的密码

bandit25

使用上面获取的密码登录bandit25用户

查看当前目录下,发现bandit26ssh私钥,直接复制到/tmp/ss文件中,然后指定进行连接

chmod 400 /tmp/ss
ssh bandit26@localhost -p 2220 -i /tmp/ss

但是出现连接成功的标志后,又断开连接了

一般more命令是信息过多,导致窗口无法显示完全使用的,那么这里是因为我的窗口过大,导致信息一下都显示了,那么这里把窗口缩写,越小越好,或者把字体越调越大

ssh bandit26@localhost -p 2220 -i /tmp/ss

然后这时候出现more,就可以直接使用,按着v键,进入vim编辑

这时候,键入:e /etc/bandit_pass/bandit26,再回车,即可获取密码

s0773xxkk0MXfdqOfPRVr9L3jJBUOgCZ

这就是bantid26的密码

bandit26

使用上面获取的密码登录bandit26即可

这里还是与上面一样,把窗口设置小或者字体设置大

进入more后,按着v进入vim编辑,但是这里是处于bandit26,需要知道其它的信息,以获得bandit27的信息,所以需要获取shell,这里的bash终端只是临时的

:set shell=/bin/bash	#设置临时变量shell的值为这个命令
:shell					#执行这个临时变量,获取bash终端

进入bash后,查看当前目录,发现具有SUID权限文件

upsNCc7vzaRDx6oZC6GiR6ERwe1MowGB

这就是bandit27的密码

bandit27

使用上面获取的密码登录bandit27用户

查看官方提示

这里给出的提示有点乱码,大致是

通过端口2220有一个存储库,bandit27-git用户的密码与bandit27用户的密码相同,克隆存储库ssh://bandit27-git@localhost/home/bandit27-git/repo并查找下一级别的密码

使用命令创建一个随机唯一的临时目录

mktemp -d
cd /tmp/tmp.cn83fNY2dd
git clone ssh://bandit27-git@localhost:2220/home/bandit27-git/repo
#这里注意localhost:2220,指定端口了

执行克隆命令后,就会发现当前的结果

或者使用git show查看历史记录

Yz9IpL0sBcCeuG7m9uQFt8ZNpS4HZRcN

这就是bandit28的密码

bandit28

使用上面获取的密码登录bandit28用户

查看官方提示,还是和刚刚一样的乱序

整理

通过端口2220有一个存储库,bandit28-git用户的密码与bandit28用户的密码相同,克隆存储库ssh://bandit28-git@localhost/home/bandit28-git/repo并查找下一级别的密码

执行命令

mktemp -d
cd cd /tmp/tmp.hkZb9CizY1
git clone ssh://bandit28-git@localhost:2220/home/bandit28-git/repo

这里是熟悉git的简单命令, 也就是查看记录,还有git log查看日志记录

4pT1t5DENaYuqnqvadYs1oE4QLCdjmJ7

这就是bandit29的密码

bandit29

使用上面的密码登录bandit29

和上面一样,也是git相关,并且也是乱序的

通过端口2220有一个存储库,bandit29-git用户的密码与bandit29用户的密码相同,克隆存储库ssh://bandit29-git@localhost/home/bandit29-git/repo并查找下一级别的密码

mktemp -d
cd /tmp/tmp.ZZk6iYc1kz
git clone ssh://bandit29-git@localhost:2220/home/bandit29-git/repo

再次深入查看每一个分支的情况

git show-branch --all

发现分支中的dev有修改记录,切换该分支去查看

git checkout dev	#切换到dev分支
git show	#查看当前分支下的记录

git

这就是bandit30的密码

bandit30

使用上面获取的密码登录用户bandit30

这里官方提示还是git,并且乱序

通过端口2220有一个存储库,bandit30-git用户的密码与bandit30用户的密码相同,克隆存储库ssh://bandit30-git@localhost/home/bandit30-git/repo并查找下一级别的密码

mktemp -d
cd /tmp/tmp.9ax3orBmch
git clone ssh://bandit30-git@localhost:2220/home/bandit30-git/repo

把上面的查看记录都测试一般了,并且分支也查看,暂无内容

git log
git show
git branch -a		#查看所有分支
git branch -v		#查看所有分支详细信息
git checkout [分支]	#切换分支

git tag				#获取标签
git show secret		#查看标签中的内容

fb5S2xb7bRyFmAvQYQGEqsbhVyJqhnDy		

这就是bandit31的密码

bandit31

使用上面获取的密码登录bandit31

也是git,并且乱序

通过端口2220有一个存储库,bandit31-git用户的密码与bandit31用户的密码相同,克隆存储库ssh://bandit31-git@localhost/home/bandit31-git/repo并查找下一级别的密码

mktemp -d
cd /tmp/tmp.bVpxLebddr
git clone ssh://bandit31-git@localhost:2220/home/bandit31-git/repo

考察上传仓库的代码使用,这里指定了分支是master

echo "May I come in?" > key.txt
git remote -v		#查看远程仓库分支
git branch -v		#查看本地分支信息
git add key.txt		#添加文件到暂存区域
git add -f key.txt	#强制添加文件到暂存区域
git commit -m "key"	
#将暂存区文件提交到本地仓库,这里提交到本地分支master,key是信息,可以理解为注释
git push origin master:master
#将本地分支master提交到远程分支origin中的master

上传成功就会返回密码

3O9RfhqyAlVBEZpVb6LYStshZoqoSx5K

这就是bandit32的密码

bandit32

使用上面获取的密码进行登录用户bandit32

查看官方提示

测试发现,这可能是一个shell脚本

尝试输入在shell脚本编写中的一些特殊含义,如$1

测试发现,在执行$0,也就是脚本本身的时候,退出脚本了,并可以执行命令

变量	含义
$0	当前脚本的文件名
$n	传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2$#	传递给脚本或函数的参数个数。
$*	传递给脚本或函数的所有参数。
$@	传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?	上个命令的退出状态,或函数的返回值。
$$	当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
tQdtbs5D5i2vJwkO8mEyYEyTL8izoeJ0

这就是bandit33的密码了

bandit33

使用上面获取的密码登录bandit33

查看当前目录下的README.md,发现这是结束了

总结

可以学习到以下内容

  1. 各种linux常用的命令
  2. 一些文本的筛选
  3. 编码
  4. 端口连接
  5. ssh公私钥的使用
  6. ssl连接
  7. 各种解压缩
  8. 定时脚本
  9. bash代码理解
  10. git的学习

这些都只是初步的学习,但是要会


http://www.kler.cn/a/501474.html

相关文章:

  • Redis持久化双雄
  • STM32 FreeRTOS的任务创建和删除
  • Observability:将 OpenTelemetry 添加到你的 Flask 应用程序
  • 使用Python实现基于大数据的市场趋势预测
  • 【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法
  • matlab编写分段Hermite插值多项式
  • Github 2025-01-09 Go开源项目日报 Top10
  • docker--小白--导入timescaledb
  • 使用 WPF 和 C# 绘制图形
  • 稀疏编码 (Sparse Coding) 算法详解与PyTorch实现
  • linux:文件的创建/删除/复制/移动/查看/查找/权限/类型/压缩/打包
  • Android RIL(Radio Interface Layer)全面概述和知识要点(3万字长文)
  • webpack常见优化方法
  • 2024信息安全网络安全等安全意识(附培训PPT下载)
  • Go语言开发高效的RPC服务的方法
  • 基于nginx实现正向代理(linux版本)
  • C#/.NET/.NET Core技术前沿周刊 | 第 20 期(2025年1.1-1.5)
  • 2.Numpy练习(1)
  • web-前端小实验6
  • 完全自定义Qt翻译功能,不使用Qt Linguist的.ts 和 .qm类型翻译
  • Flask-SQLAlchemy 基础用法
  • 如何使用CSS让页面文本两行显示,超出省略号表示
  • 【k8s】scc权限 restricted、anyuid、privileged
  • 微软发布AIOpsLab:一个开源的全面AI框架,用于AIOps代理
  • 【Linux系列】Curl 参数详解与实践应用
  • ASRPRO核心板一款针对低成本离线语音识别开发板