veritas501/pipe-primitive

不能覆写/proc/sys/kernel/modprobe

Closed this issue · 5 comments

师傅好,我的想法是利用pipe-primitive将/proc/sys/kernel/modprobe文件修改,然后用类似劫持modprob_path的方法来做发现失败了。
按理来说应该会覆写成功,但是却没有,覆写其他文件可以,不太清楚什么原因
image
image
image

因为这种“文件”没有page cache。具体的话去看一眼dirtypipe的分析或是啃一遍splice的实现就懂了。

具体来说,你可以用这种方式去修改有实体的文件。比如常规思路的suid程序或者/etc/shadow等。你也可以通过修改ELF文件的text段从而影响正在运行的程序代码。此外memfd的内存也可以(因为shm底层的实现),所以可以通过这种方式往runc注入代码。

好的感谢师傅,但是我还是有点疑问就是如何确定某种文件有没有page cache呢,因为在我splice之后pipe_buffer确实更新了
image
”比如常规思路的suid程序或者/etc/shadow等。你也可以通过修改ELF文件的text段从而影响正在运行的程序代码“这句,假设是用busybox搭建的是不是就可以直接劫持busybox里面的函数功能也可以达到一样的效果

确实可以,但是比较麻烦的是需要将busybox下载下来然后再ida里面确定偏移,比如poweroff函数的偏移然后将其劫持成shellcode

https://elixir.bootlin.com/linux/latest/source/fs/splice.c#L773

注意do_splice_to()中in->f_op->splice_read()的调用