OverTheWire的bandit游戏2

bandit16

本关告诉我们在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

bandit17

home目录有两个文件**passwords.old 和 passwords.new.**下一关密码就在new文件里,这两个文件只有一行不同就是密码哪一行。很简单使用diff命令即可。

bandit17@bandit:~$ diff passwords.old passwords.new
42c42
< hlbSBPAWJmL6WFDb06gpTx1pPButblOA
---
> kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd

bandit18

下一关密码就在home目录下的readme文件中。但是我们连接的时候发现,连接进去直接byebye断开了,没看懂什么操作。后来发现ssh命令可以后面跟一个命令执行。

bandit17@bandit:~$ ssh bandit18@localhost cat readme
IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x

bandit19

这一关很有意思,在home目录下面有一个二进制文件,而这个文件运行命令就和你在bandit20运行一样。提示说密码通常在/etc/bandit_pass/目录下面

bandit19@bandit:~$ ./bandit20-do cat /etc/bandit_pass/bandit20
GbKksEFF4yrVs6il55v6gwY5aVje5f0j

bandit20

本关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

bandit21

本关告诉我们一个程序定期自动运行,让我们查看配置文件/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

bandit22

和上一关一样,还是在/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

bandit23

还是让我们查看/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

bandit24

猜你喜欢

转载自blog.csdn.net/John_lain/article/details/83147531