symfonos-5

来源:Vulnhub

难度:Intermediate

nmap -O -A -Pn -sV -sS -p- 192.168.36.0/24 -vv -exclude 192.168.36.132
# 对除了192.168.36.132之外的目标进行全端口SYN半开扫描,探测系统和服务

发现目标192.168.36.137开启了80,22,389,636端口,对应web,ssh,ldap,ldap_ssl服务
使用dirb扫描发现登录口,结合ldap服务,猜测是ldap注入漏洞,此处简要做一下漏洞介绍:


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注入*)(&))%00(这里的%00有时需要有时不需要,实际操作时可以都测试一下),在密码处随意输入,即可登录,登陆后发现文件包含,尝试后发现只能回显文件内容,不能执行,于是尝试包含网页文件查看其源代码,在源代码中发现登录ldap的相关信息:

如图,cn=admin,dc=symfonos,dc=local(有cn)即为账号,qMDdyZh3cT6eeAWD即为密码,而dc=symfonos,dc=local则是初始目录,利用这些信息通过工具登录ldap,发现用户zeus的密码:

尝试ssh登录成功登录,使用提权脚本发现当前用户可以使用sudo来执行dpkg,遂尝试安装恶意软件包来提权,我们可以使用fpm将恶意sh脚本打包为包括deb在内的各种格式并安装,具体过程如下:

mkdir debname  # 创建一个与包名相同的文件夹

echo '#!/bin/bash' > debname/debname.sh
echo 'exec /bin/bash' >> debname/debname.sh   # 为恶意脚本写入内容,这里的命令可以是反弹shell,也可以是像例子这样直接获取一个rootshell

fpm -n debname -s dir -t deb --before-install ./debname/debname.sh ./debname

创建好恶意deb包后即可使用sudo dpkg -i debname.deb来安装恶意包并提权:

⬆︎TOP