vulnhub-Symfonos5

下载地址:https://www.vulnhub.com/entry/symfonos-5,415/

前言:

文中提到的工具和漏洞仅供学习。此文较长看起来有点费时间,并且靶机做起来的时候思维有点混乱,所以也写得不是很有逻辑性。作为小白(省略)

Kali:192.168.109.129

目标机:192.168.109.142

端口扫描:

TCP:

漏洞挖掘:

从扫描信息来看,先访问80端口。

一般这种情况是选择查看页面源码和爆破目录。查看页面源码:

页面源码没有任何提示。爆破目录即可,也可以盲猜robots.txt(这里确实不存在robots.txt文件)。

发现admin.php,先访问一下static文件夹。先访问static文件夹,没有任何提示,只有几张图片,可以下载下来,看看是否藏着东西,查看后没有任何发现,跳过该目录。

访问admin.php,发现一个登录窗口。

对于登录框,先考虑一下admin等弱密码,但是没有结果,且底部有正误判断。

结合nmap的扫描信息,出现ldap服务,它是轻量级目录访问协议,用于在目录的资源中搜索和查询,类似理解为数据库。既然需要查询,就有它自己的查询语句,就像关系型数据库有sql语句来查询,此时就想到了sql注入,对于登录框,也许也存在类似于sql注入的漏洞。于是特意查了一下是否存在ldap的注入,也确实存在这样的注入漏洞。

此处断开,简(我)单(也)介(只)绍(会)一(这)下(些)ldap注入漏洞,内容不一定正确,都是我自己的理解:

既然类似于sql注入,学会sql注入,就要先了解sql语句。学习ldap注入漏洞,就要学会其基本语法。

先介绍基本语法:

“()”:语句的起始,例如(attribute=value)。

“=”:某个属性等于某个值,查找姓名为a的对象,可写为(name=a)

“&”:与,查找符合所有过滤条件(语句)的对象。

“!”:非,查找都不符合过滤条件(语句)的对象。

“|”:或,查找至少符合一个过滤条件(语句)的对象。

“*”:通配符,无论属性值是什么,全部匹配(这个赶觉很有用)。

“>=”:大于等于。

“<=”:小于等于。

最后举几个例子:

查询账号是admin且密码是password的对象:(&(account=admin)(passwd=password))

查询账号是admin或密码是password的对象:(|(account=admin)(passwd=password))

查询账号不是admin的对象:(!(account=admin))

接下来就是漏洞的产生原理:

和sql注入相似,就是让用户输入构成查询语句,查询我们想要的东西,对于用户的输入,程序没有进行很好的过滤,导致用户可以输入恶意语句以构造查询语句,以此进行恶意活动。

利用方法(针对openldap):

利用方法也和sql注入相似,唯一区别是它没有注释符。利用该漏洞就是加入字符,闭合语句,比如(&(account=admin)(passwd=password)),攻击语句对account点进行注入,输入为admin)(attack),此时结合成的语句就是(&(account=admin)(attack))(passwd=password)),这句 语句是不对的,但是还是会从左往右执行,并且忽略掉(passwd=password))这个语句。

检测办法:看回显,无论是报错回显还是正确回显。

注入类型:有回显和盲注。

因为没有现成的靶场,所以具体盲注和有回显注入也只能遇到了就自己体会吧。看到了其他好多博客,只能总结出几个语句,没有实图,有的可能会在该靶场用到。

有回显型:

And注入,查询语句:(&(account=admin)(passwd=password)),注入语句admin)(&),形成(&(account=admin)(&))(passwd=password)),此时形成登录万能钥匙,前提是用户名得真实存在。

Or注入,查询语句:(|(account=admin)(passwd=password)),注入语句可为admin)(uid=*),形成(|(account=admin)(uid=*))(passwd=password)),此时应该可以查出所有的用户(别问,上面说过了)。

盲注(常用通配符*),利用方法和上面差不多:

And盲注:查询语句:(&(account=admin)(passwd=password)),注入语句*)(account=*),形成(&(account=*)(account=*))(passwd=password))。

Or盲注:查询语句:(|(account=admin)(passwd=password)),注入语句可为admin)(uid=1*),形成(|(account=admin)(uid=1*))(passwd=password))。

通配符可以用于猜解信息。对于这个漏洞。总之就是闭合就对了。

注:经过我在该靶机上的多次实践后发现,无论用万能钥匙怎么登录,都是失败。终于再次阅读了一些博客后,终于找到了一个解决办法,就是在注入语句后加入%00截断。也许这个靶机的openldap检查了语义,语义不正确则不让放行。当然万能密码前提是不变,那就是前提是用户名得正确。

漏洞介绍到此结束。

接下来回到靶机。针对这个登录页面,只能说猜测可能存在ldap注入漏洞,于是我尝试了一下万能钥匙。

但是,突然想起,这个万能钥匙要确保用户名正确啊,用户名去哪弄呢,突然想到通配符,但是万能钥匙登不进去。也不确定人家是不是ldap注入漏洞。会不会是sql注入。于是又试了试sql注入的万能钥匙admin’ or 1=1#,但是也没有反映。此时陷入沉思。之前只是简单爆破了一下目录文件,现在可以动用目录字典爆破一下。使用dirb自带的big.txt爆破目录。

都访问一遍看看。portraits.php。

home.php没有任何反映,直接回到登录框。使用bp抓包看看。最终在home.php响应包里面发现了一个url网址。

该url参数可能存在一个本地文件包含漏洞,也可能存在远程文件包含漏洞,也可能存在ssrf漏洞。因为此处是单靶机,就算有内网也不知道ip,所以可以忽略掉这个漏洞。先看看是否存在远程文件包含漏洞。下面这个文件夹有几张图片,在该文件夹开启简单服务器,访问该文件,看是否被访问。

确切的说是可以包含的,但是不执行,是个假文件包含漏洞。

那看看是否可以包含本地文件/etc/passwd。

据此可以包含好多文件啊,先看看刚刚的登录页面的代码吧。

上图是admin.php的主要代码,确实是ldap服务,并且也确实存在ldap注入漏洞,也知道了连接密码。最直接的办法就是直接包含木马,可以看看home.php的代码。

确实不能执行。只能从ldap服务下手,先尝试远程连接,主要是看到了代码中ip居然和现在不对,感觉是不是又存在内网,这个可以先放一放。那就直接在ldap注入上下手吧。注入虽然不知道用户名,但是可以通配符啊。一下为url。

先尝试登录上去看看,使用永真条件。

登录成功:

成功后发现这是home.php,突然想起之前的文件包含漏洞,但是作为ctf,应该包含哪个文件呢,有些不知所措。我不禁怀疑,难道作者是想让我万能密码登录,然后根据文件包含漏洞来包含有用文件,然后从ssh登录靶机,然后提权?说的好,先试试包含几个文件吧。Passwd之前是包含过了,其他敏感文件包含不出来,没啥用。看样子还是要从注入下手。猜解用户名和密码,就目前条件来看只能做这个。猜解办法就是配合通配符,使用万能钥匙,看是否可以登录成功。先猜用户名的首字母,ascii码表中的字符全来一遍,第二个字母一样,这种情况当时是写脚本啦。例子如下:

登录失败,没有反应。突然想到26个字母,我靠。挑个z试试。

登录成功,说明至少有一个用户名首字母是z(爆破用户名和密码是想看看获取的登录密码会不会是ssh的登录密码,这个思路之前也讲过,在包含/etc/passwd文件的时候,我也很奇怪,为什么里面没有z开头的用户,但还是想试试)。但是,千万别用上面的思想写脚本。因为之前的文件包含漏洞发现了ldap的用户名和连接密码,并且端口可以扫描出来,一定可以远程连接,远程连接后,尝试读取内部内容,可以写个脚本,也可以采用客户端连接。

此处简单说一下kali如何安装Python-ldap:

首先先pip install python-ldap。会报错,不存在lber.h。

执行apt-get install -y libldap2-dev。再次pip install python-ldap,报错,不存在sasl.h。

执行apt-get install -y liblsasl2-dev。再次pip install python-ldap。一切正常。

最后给一个官方的教程网址:https://www.python-ldap.org/en/python-ldap-3.2.0/installing.html#build-prerequisites。里面有需要的所有依赖。

导入成功:

到此介绍结束。

继续回到写脚本的地方。脚本如下,连接上后,查询用户 信息,获取用户名和密码信息(里面也包含很多其他信息,比如邮件地址等,此处只需要账户):

接下来尝试ssh登录。连接成功:

提权:

因为知道密码,所以采用sudo -l的方式提权。因为采取的ssh登录,相当于已经使用了一次密码,所以此时sudo -l不需要再次使用密码。

从内容看以root执行dpkg不需要密码。该命令是用来安装、删除、管理和构建软件包的。此时以root权限。我第一反应是可以安装一个存在越权漏洞的软件,比如nmap2.02到5.12版本,但是事情应该没有那么简单,因为可能安装上来不让运行。并且在该用户目录下发现了两个可以文件:

也许是利用它来提取。dpkg可以安装这两个文件,先安装试试。安装完后没有变化。

突然想到,既然是可以安装deb包,那能不能构造一个deb包实现提权呢,提权其实是调用root的bash,在这里sudo以root用户去执行,那么就可以调用他的root的bash,只是是否可以在deb包中使用命令,所以去了解一下deb包。

此处简单介绍一下啊deb包结构:

deb包基本结构:

control文件(必须存在):描述包的基本信息,字段有:

    Package:包名称(不能有空格);

    Version:版本;

    Description:软件的描述

    Section:软件类别描述,如text,mail

    Priority:对系统的重要程度,有required,standard,optional,extra;

    Depends:软件需要的依赖;

    Suggests:建议安装的其他依赖;

    Architecture:所支持的平台,有i386,amd64,m68k等;

    Essential:是否为系统基本包,取值有yes/no,yes则不允许卸载;

    Source:软件包的源代码名称;

    Pre-Depends:安装前,必须安装的依赖、软件等;

    Recommends:推荐安装的其他软件包和库文件。

    Maintrainer:打包者名称

perinst文件:软件安装前需运行的shell脚本。

postinst文件:软件安装后需要运行的shell脚本。

perrm文件:软件删除前需要执行的shell脚本。

postrm文件:软件删除后需要执行的shell脚本。

注:shell脚本中,必须以#!/bin/sh开头。

制作简易deb包:

先创建一个总文件夹,名称为shell,创建DEBIAN文件夹(必须大写),在DEBIAN文件夹下创建control和几个可执行文件,比如创建一个postinst。在shell文件夹下创建软件安装路径信息,比如创建/tmp,意思是安装到tmp文件夹。

执行dpkg -b shell shell.deb即可。

到此介绍结束。

编写control文件,内容如下:

写入shell进postinst文件,调用bash,内容如下(记得赋权):

打包:

上传脚本到靶机(图略)。执行,提权成功。

获取flag

 

 

 

  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值