:
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}'
后来发现这样的匹配效果有三点不好:
- 没找到
ls
命令有显示以byte为单位的文件大小的,所以1K的范围取得有点宽了 - 通过
awk
输出的只有文件名,并不知道该文件的完整路径,所以文件定位困难 - 通过
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
中看到密码了。