Bandit破解


http://overthewire.org/wargames/bandit/

ssh地址:bandit.labs.overthewire.org


bandit0密码:bandit0


bandit1密码:boJ9jbbUNNfktd78OOpsqOltutMc3MY1


bandit2密码:CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9

可以用scp命令将该文件下载到有图形界面的本地,然后打开。

但是这个渠道不是官方希望做的方式,所以最好学习一下怎么在命令行下操作“-”文件。
(-。-;),可以通过在“-”文件前面加上绝对/相对路径的方式。比如~/-的文件,可以用/home/user/-来使用cat访问,这样就不会出现歧义的情况了。不过关于如何处理特殊字符的文章还是需要好好看一下:http://tldp.org/LDP/abs/html/special-chars.html


bandit3密码:UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK

这次的文件是带空格的,直接用Tab键就可以了,或者空格前面加上转义字符“\”


bandit4密码:pIwrPrtPN36QITSp3EQaw936yaFoFgAB

隐藏文件而已。


bandit5密码:koReBOKuIDDepwhWk7jZC0RTdopnAYKh

事实上是这些文件里面包含了有用的密码信息,我不知道是不是应该做转码,不过在vi下用”set encoding=utf-8”这类的转码命令并没有看到什么东西,后来想到用cat命令将文件整合:

cat inhere/*

bandit6密码:DXjZPULLxYr17uwoI01bNLQbtFemEgo7

提示说密码放在了human-readable,大小是1033b,不能执行的文件里。所以要对文件做过滤操作,human-readable就不说了,文件大小和不可知性的属性这两点要能够过滤掉,而且如果返回结果比较多的话,最好还能用返回完整的文件路径,这样方便统一定位文件做cat

刚开始,试了ls+grep+awk的组合:

ls -la --block-size=K maybe* | grep -v "x" | grep "1K" | awk '{print $1, $9}'

后来发现这样的匹配效果有三点不好:

  1. 没找到ls命令有显示以byte为单位的文件大小的,所以1K的范围取得有点宽了
  2. 通过awk输出的只有文件名,并不知道该文件的完整路径,所以文件定位困难
  3. 通过grep的逆向过滤选项-v将表示可执行权限的关键字母“x”过滤掉了,这里属于特殊情况,因为如果文件名中包含“x”,则也会被过滤掉。

在网上搜了一下,发现可以通过ls -l | awk '{print i$0}' i=`pwd`这样的命令显示文件完整路径,因此改进上述的命令:

ls -la --block-size=K maybe* | grep -v "x" | grep "1K" | awk '{print $1, i$9}' i=`pwd`

发现这样仍然不能准确定位。后来就想换一种方法,使用find命令。初步使用了:

find . -depth -size 1033c 
# -depth表示往目录下搜索,-size表示文件大小,1033c表示1033bytes

其实这个仍然没有过滤掉可执行文件属性,但是尝试出来的结果只有一个,所以就直接看这个文件内容了。


bandit7密码:HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs

所属用户是bandit6,所属用户组是bandit7,大小是33bytes的文件。

find / -size 33c -group 'bandit6' -user 'bandit7' | grep -v 'denied'

上面的命令使用grep的逆向匹配企图过滤掉“Permission denied”的输出,但是这个输出是标准错误输出,grep简单命令不能处理。因此,采用了下述的方法:

find / -user bandit7 -group bandit6 -size 33c -type f 2>/dev/null

其中-type f表示类型是文件,2>/dev/null表示将标准错误输出重定向到/dev/null设备,也就是丢弃。


bandit8密码:cvX2JJa4CFALtqS87jk27qwqGhBM9plV

cat data.txt | grep millionth -n1


bandit9密码:UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR

要求是找出data.txt文件中不重复出现的一行。首先,要对文件中的行做排序,使得重复出现的行能够相邻出现,然后才能用uniq命令的-u选项去除重复的行。

sort data.txt | uniq -u

bandit10密码:truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk

之前一直没理解human-readable什么意思,刚发现有一个strings的命令,可以从文本中找到可读的文字。同时,用到了正则表达式,匹配开始字符是“=”的行。

cat data.txt | strings | grep '^[=]'

bandit11密码:IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR

提示要用base64解码出有意义的内容,命令如下:

cat data.txt | base64 -d | strings

bandit12密码:5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu

看起来是凯撒密码的简单解密,大小写字母分别是其后的第13个循环的字母,不知道循环+12怎么弄,就直接写上了字母对应的字符串,用tr命令做了替换。

cat data.txt | tr [a-zA-Z] "mnopqrstuvwxyzabcdefghijklMNOPQRSTUVWXYZABCDEFGHIJKL"

突然想起来,也可以这么表示。。。

cat data.txt | tr [a-z] [n-za-m] | tr [A-Z] [N-ZA-M]

这两个都能输出正确结果,不过不明白的是为什么一个是从m开始,另一个是从n开始?


bandit13密码:8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL

打开文件,发现内容是xxd导出的文件格式。其实也不是我发现,这是新技能get。我刚开始还想着把里面中间几列的16进制数据拿出来作为十六进制文件呢。不过我忘了里面的所谓16进制内容是用ascii码表示的。所以,先用xxd命令:

xxd -r data.txt data

然后用hexdump或者xxd命令查看文件头:

  • 如果是0x1f8b开头的,就是gz压缩,使用gzip -d data.gz
  • 如果是0x425a开头的,就是bzip2压缩,使用bzip2 -d data.bz2
  • 如果两者都不是,则应该是tar打包,使用tar -xvf data.tar

如此层层循环,最终就能解出来最终的密码了。

注意,每次判断出文件类型以后最好用mv命令给文件重命名,加上其后缀名,这样便于识别。其次,把data.txt文件放到/tmp目录下,再新建一个目录,这样方便进行文件等的操作。因为远程主机已经关闭了查看其他文件的权限,直接在/tmp下是无法使用ls命令的。


bandit14密码:4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e

这次要求使用私钥登陆bandit14,然后获取目录/etc/bandit_pass/bandit14文件中存储的bandit14的密码。由于没有存储其他地址主机的公钥,因此只能本地登陆bandit14账户,命令为:

ssh bandit14@localhost -i .sshkey.private # -i选项指定私钥文件
# 成功登录到bandit14以后
cat /etc/bandit_pass/bandit14

bandit15密码:BfMYroe26WYalil77FoDi9qh59eK5xNr

提示向端口30000提交bandit14的密码。刚开始没搞明白怎么提交,用ssh和telnet都试过了,telnet通过,然后获取到了密码。

telnet localhost 30000

命令提示有让用nmap,不过没有用到。用tcp连接扫描端口的命令:

nmap -v -sT localhost # -v表示显示更多信息,-sT表示TCP connect scan。此外,还有-sS表示TCP SYN scan,-sU表示UDP scans

bandit16密码:cluFn7wTiGryunymYOu4RcffSxQluehd

是因为提示太明确了吗?我基本上都没有用到什么openssl的功能。

openssl s_client -connect localhost:30001
# openssl命令的用法格式是 openssl 
# s_client是一种command,模拟了一个通用的SSL/TLS客户端,能够和远端服务器使用SSL/TLS建立连接。这个仅仅是做连接测试用的,只实现了基本的功能。此外,还有模拟服务器的s_server

提示里说:Helpful note: Getting “HEARTBEATING” and “Read R BLOCK”? Use -ign_eof and read the “CONNECTED COMMANDS” section in the manpage. Next to ‘R’ and ‘Q’, the ‘B’ command also works in this version of that command…


bandit17密码:

首先,扫描端口:

nmap -v -sT localhost -p31000-32000

得到如下结果:

Not shown: 996 closed ports
PORT      STATE SERVICE
31046/tcp open  unknown
31518/tcp open  unknown
31691/tcp open  unknown
31790/tcp open  unknown
31960/tcp open  unknown

然后挨个测试端口的ssl连接。然后发现31790端口回复了一个私钥,用这个私钥本地登录bandit17用户即可。


bandit18密码:kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd

简单使用diff passwords.old passwords.new即拿到了密码。


bandit19密码:IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x

在这个地方陷入了思维误区,提示说.bashrc中写入了只要登陆就会被强制登出的功能,所以通过ssh登陆,然后进行操作是不行的,要想拿到正确结果,可以直接用scp拷贝文件到本地。此外,还能在登录的时候直接进行操作,这个真是新技能get:

ssh [email protected] 'cat readme'

bandit20密码:GbKksEFF4yrVs6il55v6gwY5aVje5f0j

使用一个脚本而已。


bandit21密码:gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr

就是让联系nc命令的使用的。要建立服务器监听端口,然后手动传送内容。

nc -lp 9999 # 监听9999端口,等待tcp连接
./suconnect 9999 # 里面提供的脚本,可以进行tcp连接
# 其实也可以直接用 nc localhost 9999进行连接。

bandit22密码:Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI

定时任务cron,crontab的使用。其实也没用,就是看了一下而已。发现定时把密码放到/tmp下的一个文件中去,直接cat查看即可。


bandit23密码:jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n

同上一个方法一样,追查到脚本,发现脚本的内容是对一句话做了md5sum,然后用cut命令切出了以空格为分隔符的第一部分的字符串作为/tmp下的文件名。


bandit24密码:UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ

看到会定期执行/var/spool/bandit24/目录下的所有文件。所以新建一个脚本,将脚本放到该目录下,在脚本中实现bandit24密码的输出:

#!/bin/bash

cat /etc/bandit_pass/bandit24 > /tmp/yyy

稍等片刻就可以在/tmp/yyy中看到密码了。


bandit25密码:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章