第一步,打开网络拓扑,启动实验虚拟机,查看虚拟机IP地址
第二步,在只知道靶机所在网段的情况下,可以通过一些其他方法获取靶机的IP地址,首先进行信息探测,使用命令netdiscover -r 172.16.1.0/24对靶机所在的网段地址进行探测
根据扫描结果也可以发现靶机为172.16.1.200
第三步,使用命令nmap -sV 172.16.1.200探测目标靶机的服务版本信息
扫描完毕,目标靶机开放了两个http服务和一个ssh服务。
第四步,根据扫描结果,可以先从开放http服务的31377端口切入,在浏览器中输入http://172.16.1.200(靶机IP):port/,访问成功,查看网站的源码,查找有关flag的信息,80端口的访问结果
再返回的对应界面中没有任何有效的信息,于是我们尝试去访问31337端口
在网页的空白处点击鼠标右键,选择View Page Source来查看网站源码
源码结果如下
此时我们发现在源码中也不存在flag信息,我们就得使用工具来进一步的探测隐藏的页面,接下来使用命令dirb http://172.16.1.200:31337/这个服务的隐藏文件进行探测,运行此命令后dirb会对当前网站的目录进行基于字典的探测
返回的探测结果中出现5个返回值为200的页面,其中有两个探测结果比较醒目.ssh和robots.txt。我们知道robots协议也叫robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为一些系统中的URL是大小写敏感的,所以robots.txt的文件名应统一为小写。robots.txt应放置于网站的根目录下。如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的robots.txt,或者使用robots元数据(Metadata,又称元数据)。
第五步,接下来我们打开robots.txt,直接鼠标定位到http://172.16.1.200:31337/robots.txt的url上,然后右键选择打开链接将调用火狐浏览器打开此链接
结果如下:
此时我们发现网站不允许探测根目录下的.bashrc\.profile\taxes这三个文件
第六步,在浏览器中去访问/taxes这一路径,
此时我们发现了一个flag文件,其flag的信息为一句比较有趣的句子:flag1{make_america_great_again}。对于robots.txt文件的探测就告一段落,接下来我们尝试在.ssh文件上下功夫。
第七步,使用火狐继续访问http://172.16.1.200:31337/.ssh
打开后我们发现上图中的信息,我们知道ssh服务的作用是:让远程计算机能够通过ssh登录到本地进行远程管理,我们把上面的信息拆分开分析一下:
SSH之所以能够保证安全,原因在于它采用了公钥加密。
整个过程是这样的:
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
既然在网页里给出了这样的一个提示信息,那么我们就可以尝试一下,在/.ssh/后面加上id_rsa来看看目录中是否存在ssh的私钥。
弹出了下载页面,我们点击Save File,将SSH的私钥文件保存到本地。
继续,访问authorized_keys尝试下载认证关键字文件,
结果让人很出乎意料,由于管理员的失误,将SSH服务器的私钥和主机认证数据文件直接暴露在了网站上,接下来我们的操作将会围绕私钥认证展开。
第八步,使用命令ls -lah来查看私钥文件是否具有可读可写的权限
发现已有rw权限,那么我们可以直接尝试使用ssh -i 指定私钥文件来访问ssh服务,我们所需要的目标服务器的用户名在authorized_keys认证文件中通常会存储,使用gvim authorized_keys来查看一下
在文件的末尾我们发现了,用户名simon以及主机名covfefe,接下来,直接使用命令ssh -i id_rsa [email protected]来访问目标靶机的ssh端口
根据回显信息我们发现,服务器返回了一条消息,提示无法建立连接,需要进行指纹识别。
我们可以使用命令chmod 600 id_rsa来对私钥进行赋权
再次使用命令ssh -i id_rsa [email protected]发现提示我们输入密码:
到这里由于没有靶机服务器的明文密码是不能登录的,所以到这一步我们需要进一步的来探测ssh秘钥信息。
第九步,接下来我们使用命令ssh2john id_rsa > crackrsa,将id_rsa秘钥信息转换为john可以识别的信息。
第十步,下面我们需要对crackrsa文件中的rsa秘钥信息进行解密,解密需要用到一个字典文件/usr/share/wordlists/rockyou.txt.gz,以及john解密工具。由于字典是压缩文件,我们可以通过zcat来直接显示压缩包中的文件内容命令如下:zcat /usr/share/wordlists/rockyou.txt.gz | john --pipe --rules crackrsa
成功破解出密码starwars。下面我们继续刚才的登录,按方向键上找到历史记录中ssh登录命令,输入破解出来的密码starwars
登录成功!
第十一步,但这一步,虽然我们已经登录到主机上了,但是并不是root权限,那么我们需要更深入的探测靶机的目录,我们尝试使用命令cd /root切换到根目录,对目录下的文件进行查看
发现当前权限不够无法查看。由于我们的simon用户不在管理员的组中,所以此时就需要我们通过一些方法来提升用户的权限。
第十二步,此时我们的思路应该是提升权限,在提升权限之前我们先来查找一下在靶机中那些文件具有root权限,使用命令find / -perm -4000 2> /dev/null查找根目录一下的所有文件中具有执行权限的文件
发现具有root权限的可执行文件有很多,且其中的一个名为read_message比较令人关注,因为我们在根目录下同样也发现了这一文件。
第十三步,使用cat命令查看一下根目录下的read_message.c这个文件,我们逐行来阅读一下这个C程序
同时发现此处还存在有靶机环境中的第二个flag,flag2{use_the_source_luke}
第十四步,下面我们将代码贴出来,进行代码审计,挖掘内部隐藏的信息
通过对上面的代码进行审计我们会发现,当我们输入的指令错误的时候会执行message程序,由于message是具有root权限的可执行程序,我们思路应该是,尝试对这个二进制的程序进行溢出操作,来执行我们希望执行的操作。在命令行终端执行read_message,然后输入使程序判断为真的信息:Simon
下面我们要针对这一代码来进行溢出。直接在read_message的程序中输入大于20个字符的信息,且前五个字符满足判断条件与字符串Simon相同即可。溢出的payload为:SimonAAAAAAAAAAAAAAA/bin/sh,跳转至/bin/sh中来提升权限。
此时,我们成功获取到了root权限,然后使用命令cat flag.txt来查看/root下的flag文件
成功拿到了第三个flag文件:flag3{das_bof_meister}