本关告诉我们在localhost的31000-32000端口中的某个端口提交本关密码就会获得下一关的密码。首先我们要找到哪些端口是开放的,然后再查看端口是否支持SSL。其中只有一个端口可以获得下一关的密码。
这关的目的就是练习端口扫描
bandit16@bandit:~$ nmap -p 31000-32000 localhost
Starting Nmap 7.40 ( https://nmap.org ) at 2018-10-18 09:05 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00021s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
31518/tcp open unknown
31790/tcp open unknown
可以看出来有两个端口开放着的,现在尝试哪一个支持SSL。
bandit16@bandit:~$ echo cluFn7wTiGryunymYOu4RcffSxQluehd | openssl s_client -quiet -connect localhost:31790
depth=0 CN = localhost
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = localhost
verify return:1
Correct!
-----BEGIN RSA PRIVATE KEY-----
.........省略..........
-----END RSA PRIVATE KEY-----
找到了连接下一关的ssh
的私钥。因为权限问题还是现在/tmp
目录下建立文件夹,将私钥放在a.txt
中。
ssh -i a.txt bandit17@localhost
进行ssh连接,会有个警告,没有连接成功,是因为我们新建的a.txt
文件的权限问题。因为ssh是私钥不允许别人可以访问。chmod 400 a.txt
将权限改为只有自己可读就行了。
连接到bandit17后
bandit17@bandit:~$ cat /etc/bandit_pass/bandit17
xLYVMN9WE5zQ5vHacb0sZEVqbrp7nBTn
home目录有两个文件**passwords.old 和 passwords.new.**下一关密码就在new文件里,这两个文件只有一行不同就是密码哪一行。很简单使用diff
命令即可。
bandit17@bandit:~$ diff passwords.old passwords.new
42c42
< hlbSBPAWJmL6WFDb06gpTx1pPButblOA
---
> kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd
下一关密码就在home目录下的readme文件中。但是我们连接的时候发现,连接进去直接byebye断开了,没看懂什么操作。后来发现ssh
命令可以后面跟一个命令执行。
bandit17@bandit:~$ ssh bandit18@localhost cat readme
IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x
这一关很有意思,在home
目录下面有一个二进制文件,而这个文件运行命令就和你在bandit20运行一样。提示说密码通常在/etc/bandit_pass/
目录下面
bandit19@bandit:~$ ./bandit20-do cat /etc/bandit_pass/bandit20
GbKksEFF4yrVs6il55v6gwY5aVje5f0j
本关home目录下面的执行文件会做下面的事情:连接到本地一个你指定的端口,从连接的地方读取一行数据和上一关(bandit20)的密码进行比较,如果正确就向远程端口发送下一关的密码。
所以本关需要自己设置一个监听端口来接收home目录下二进制文件的连接。所以先用nmap看一下都有哪些端口是开放的。为了防止端口冲突
bandit20@bandit:~$ nmap localhost
Starting Nmap 7.40 ( https://nmap.org ) at 2018-10-19 05:23 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00020s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
113/tcp open ident
30000/tcp open ndmps
这一关我们需要两个ssh连接。
ssh1
用来监听,设置监听54321端口,有连接过来就回复上一关的密码
bandit20@bandit:~$ echo "GbKksEFF4yrVs6il55v6gwY5aVje5f0j" | nc -l -p 54321
ssh2
用来连接,先用nmap
查看一下现在54321端口是否开放。
bandit20@bandit:~$ nmap localhost -p 54321
Starting Nmap 7.40 ( https://nmap.org ) at 2018-10-19 05:27 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00011s latency).
PORT STATE SERVICE
54321/tcp open unknown
查看home目录下可执行文件的用法
bandit20@bandit:~$ ./suconnect
Usage: ./suconnect <portnumber>
This program will connect to the given port on localhost using TCP. If it receives the correct password from the other side, the next password is transmitted back.
在ssh2
运行
bandit20@bandit:~$ ./suconnect 54321
Read: GbKksEFF4yrVs6il55v6gwY5aVje5f0j
Password matches, sending next password
在ssh1
得到密码
bandit20@bandit:~$ echo "GbKksEFF4yrVs6il55v6gwY5aVje5f0j" | nc -l -p 54321
gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr
本关告诉我们一个程序定期自动运行,让我们查看配置文件/etc/cron.d/
看执行了什么命令。根据提示,我们先查看配置文件内容
bandit21@bandit:~$ cat /etc/cron.d/cronjob_bandit22
@reboot bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
* * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
可以看到将一个sh文件运行的输出重定向到空设备文件
所以没有显示到终端,接下来我们查看这个文件中的内容是什么。
bandit21@bandit:~$ cat /usr/bin/cronjob_bandit22.sh
#!/bin/bash
chmod 644 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
cat /etc/bandit_pass/bandit22 > /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
将内容输出到/tmp
下的一个文件,直接查看,得到密码
bandit21@bandit:~$ cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI
和上一关一样,还是在/etc/cron.d/
查看。多了一个提示,告诉我们查看别人写的shell
脚本是一个非常有用的技能。本关的脚本有意写得容易让人看懂,如果你不懂可以尝试调试运行看一下输出结果。
bandit22@bandit:~$ cat /etc/cron.d/cronjob_bandit23
@reboot bandit23 /usr/bin/cronjob_bandit23.sh &> /dev/null
* * * * * bandit23 /usr/bin/cronjob_bandit23.sh &> /dev/null
查看脚本内容。
bandit22@bandit:~$ cat /usr/bin/cronjob_bandit23.sh
#!/bin/bash
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
脚本先定义一个变量myname
保存用户名,为了得到bandit23
的密码,myname的值就是bandit23
。然后把密码保存到了/tmp/$mytarget
中去。所以我们只要知道mytarget
是什么就可以找到密码文件了。
mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)
这行代码意思就是将字符串I am user bandit23md5加密,然后用cut -d
是分隔一个字符串,指定分隔符。-f
表示取分隔后的第几段内容。我们自己执行这行命令就可以得到文件名称,然后得到密码。
bandit22@bandit:~$ echo I am user bandit23 | md5sum | cut -d ' ' -f 1
8ca319486bfbbc3663ea0fbe81326349
bandit22@bandit:~$ cat /tmp/8ca319486bfbbc3663ea0fbe81326349
jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n
还是让我们查看/etc/cron.d/
。提示1本关需要我们创建自己的第一个shell脚本,这将是你的一大进步。2.shell脚本一旦运行就会被删除,所以需要备份。
bandit23@bandit:~$ 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
echo "Handling $i"
timeout -s 9 60 ./$i
rm -f ./$i
fi
done
这个shell文件会被定期执行,这个shell脚本又会一分钟执行一次:它会执行/var/spool/$myname
目录下的所有脚本文件并删除。这就是我们突破的地方,我们需要写一个脚本放在这里,然后让文件执行我们的脚本。所以我们写的脚本要有将密码保存在一个我们可以读的地方的功能
先建立shell脚本文件。
bandit23@bandit:~$ mkdir /tmp/my_test_sh
bandit23@bandit:~$ cd /tmp/my_test_sh
bandit23@bandit:/tmp/my_test_sh$ touch the_pass
bandit23@bandit:/tmp/my_test_sh$ vim thepass.sh
脚本中的内容。将密码追加到当前目录下the_pass
中。
#!/bin/bash
cat /etc/bandit_pass/bandit24 >> /tmp/my_test_sh/the_pass
现在查看当前文件下面应该有两个文件,一个脚本,一个用来接收密码的文件。
bandit23@bandit:/tmp/my_test_sh$ ls
the_pass thepass.sh
注意需要修改两个文件的权限,否则其他人无法执行和读写。修改权限后,将脚本文件复制到/var/spool/bandit24/
,在一分钟内就会被执行然后删除,查看the_pass就会看到密码
bandit23@bandit:/tmp/my_test_sh$ chmod 777 the_pass
bandit23@bandit:/tmp/my_test_sh$ chmod 777 thepass.sh
bandit23@bandit:/tmp/my_test_sh$ cp thepass.sh /var/spool/bandit24/
bandit23@bandit:/tmp/my_test_sh$ cat the_pass
UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ