在线游戏靶场【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 1033c
,c
表示字节
不可执行,表示该文件没有执行权限,具有执行权限的是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
用户
查看当前目录下,发现bandit26
的ssh
私钥,直接复制到/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
,发现这是结束了
总结
可以学习到以下内容
- 各种
linux
常用的命令 - 一些文本的筛选
- 编码
- 端口连接
ssh
公私钥的使用ssl
连接- 各种解压缩
- 定时脚本
bash
代码理解git
的学习
这些都只是初步的学习,但是要会