分析|CVE-2021-3156-sudo堆溢出高危漏洞
編輯前言
Qualys的安全研究人員于1月13日發文稱,攻擊者無需知道用戶密碼即可成功利用此漏洞,在眾多基于 Linux 的發行版本中獲得最高的 root 權限。受影響的 Sudo 漏洞版本包括從 1.8.2 到 1.8.32p2 的經典版本,以及從 1.9.0 到 1.9.5p1 所有穩定版本。
調試方式
首先從github下載代碼:
https://github.com/sudo-project/sudo/archive/SUDO_1_9_5p1.tar.gz
編譯
tar xf sudo-SUDO_1_9_5p1.tar.gz cd sudo-SUDO_1_9_5p1/ mkdir build cd build/ ../configure --enable-env-debug make -j sudo make install調試(請以root方式執行gdb)
gdb --args sudoedit -s '\' `perl -e 'print "A" x 65536'`gdb加載執行后進程會crash,這時候就可以對有漏洞的源碼位置下斷點,因為漏洞diamante貌似是動態加載的,直接下斷點下不到,crash之后就可以下了
斷點命令:
b ../../../plugins/sudoers/sudoers/sudoers.c:964 b ../../../plugins/sudoers/sudoers/sudoers.c:978漏洞成因
調試用poc:
sudoedit -s '\' 112233445566?
漏洞位于 set_cmnd 函數中,關鍵代碼如下:
/* Alloc and build up user_args */ for (size = 0, av = NewArgv + 1; *av; av++) size += strlen(*av) + 1;if (size == 0 || (user_args = malloc(size)) == NULL) {if (ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL)) {for (to = user_args, av = NewArgv + 1; (from = *av); av++) {while (*from) {if (from[0] == '\\' && !isspace((unsigned char)from[1])) //關鍵邏輯!!!from++;*to++ = *from++;}*to++ = ' ';}*--to = '\0';}進入該函數時NewArgv的結構如下:
NewArgv[0]: sudoexit
NewArgv[1]: \
NewArgv[2]: 112233445566
首先會計算NewArgv 1-2兩個參數的長度 2 + 13 = 15.
因此user_args分配的內存大小為 15 字節。
然后會把NewArgv 1-2的數據拷貝到user_args里面。
拷貝過程中如果from[0]為\,且from[1]不是空格就會from++。
if (from[0] == '\\' && !isspace((unsigned char)from[1])) //關鍵邏輯!!!from++;所以在處理NewArgv[1]時,from[0]就是\,from[1]為\x00,會通過這個判斷讓from++,然后后面會再次from++。
*to++ = *from++;
之后from就指向了NewArgv[1]字符串\x00后面一個字符的位置,我們看看調試時NewArgv[1]后面是什么。
可以看到NewArgv[1]?(0x5c 0x00)后面緊跟著的是NewArgv[2](?0x31 0x31 ...),所以此時 from 執行的就是 NewArgv[2]?的開頭。
?
從而會再次進入while循環把NewArgv[2]拷貝到user_args。
?
然后處理NewArgv[2]會再次把NewArgv[2]拷貝到user_args。
?
因此最終結果就是 NewArgv[2]?被拷貝了兩次,實際的寫入數據長度為26字節。
這個漏洞是一個堆溢出,不過寫的數據需要是非\x00,如果user_args分配的內存比較小(比如15字節)的話,其后面是unsorted bin,如果分配的比較大的話(使用原始的poc)其后面跟的是top chunk,感覺都不是很好利用。
感覺需要花一些事件捋一捋代碼的邏輯,看看有沒有什么其他的想法。
修改NewArgv[1]和NewArgv[2]的長度可以控制user_args堆塊后面的空閑堆塊的大小。
此外到達漏洞代碼的poc構造過程也很精彩,這部分可以去發布漏洞的博客查看。
參考鏈接:
https://blog.qualys.com/vulnerabilities-research/2021/01/26/cve-2021-3156-heap-based-buffer-overflow-in-sudo-baron-samedit
總結
以上是生活随笔為你收集整理的分析|CVE-2021-3156-sudo堆溢出高危漏洞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux应急响应实战
- 下一篇: 对某自习室系统的一次渗透测试(从iot到