歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

如何編寫基于Linux x86的TCP Bind Shell

來源:本站整理 作者:佚名 時間:2020-01-28 TAG: 我要投稿

0x01  概述
使用msfvenom命令可以創建綁定shell,要做的就是為msfvenom提供正確的輸入和使用,它可以立即創建shellcode。本文將檢查Shellcode進程,以深入制作tcp綁定shell,以分析編譯x86 Linux shellocode所需的組件。
第一部分創建具有以下屬性的Shell_Bind_TCP Shellcode:
· 綁定到端口
· 在傳入連接上執行Shell
第二部分要求創建腳本以使端口號易于配置。
綁定shell是一種shell,其中目標計算機在受害者計算機上打開通信端口或偵聽器,并等待傳入連接。然后,攻擊者連接到受害機器的偵聽器,該偵聽器隨后導致在服務器上執行代碼或命令。
本文記錄了使用以下命令獲取有關tcp綁定shell所需的所有syscall的信息,linux內核,unistd.h header文件和man 2命令。還將使用《Unix網絡編程》一書 ,這是基礎知識,以學習某些系統調用中所需的子結構,通過這些信息,可以提取編寫綁定shellcode所需的syscall:
· socket
· bind
· listen
· accept
· dup2 (3 times)
· execve
可以簡單地復制匯編代碼,但這不屬于本文討論范圍,從學習linux syscalls開始,了解應該如何開發shellcode,完成分配需要什么,以及如何在匯編代碼中轉換syscall及其參數。
0x02 socket
可以通過在Linux內核中設置unistd_32 headers來搜索socketsyscall,然后查看socket syscall手冊。

 man 2 socket
 int socket(int domain, int type, int protocol);
socket接受了3個參數,現在還可以查看man手冊以了解參數的作用。 int domain指定一個通信域,它指定了將用于通信的地址族(AF_xxxx)。 int type指定通信語義。 并非socket域和類型的所有組合都是有效的,需要一個TCP綁定shell,因此AF_INET必須是域和SOCKET_STREAM類型。

Syscall號必須放在EAX寄存器中,int domain應該是AF_INET,EBX寄存器中保存的值為2,int type應該為SOCK_STREAM,保存在ECX寄存器中的值為1,最后int protocol應該為0并放置在EDX寄存器中。


現在已經確定了socketsyscall參數,它們必須是什么值,必須將它們壓入哪個寄存器,可以繼續編寫匯編代碼。socketsyscall返回一個輸出,該輸出是指向socket本身的指針,并將存儲在EAX寄存器中,因此,為了恢復指向該socket的指針以備將來使用,必須將其移至更安全的位置,例如EDI寄存器。
 ; Filename: bind_shell.nasm
 ; Author:  SLAE-1476
 ; twitter: @bolonobolo
 ; email: [email protected] / [email protected]
 
 global _start
 
 section .text
 _start:
 
     ; SOCKET
     ; xoring the registers
     xor eax, eax
     xor ebx, ebx
     xor ecx, ecx
     xor edx, edx
     mov cl, 0x01
     mov bl, 0x02
     mov ax, 0x167
     int 0x80
 
     ; move the return value of socket from EAX to EDI
     mov edi, eax
好了,可以轉到下一個系統調用。
0x03  bind
bind需要找到syscall的值并查閱手冊頁。

bind系統調用代碼為361,十六進制為0x169?匆幌耺an 2 bind
 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
非常有趣,這里有一個數據結構sockaddr。
許多BSD網絡系統調用都需要一個指向socket地址結構的指針作為參數。該結構的定義在sys / socket.h中
檢查man 2 bind,看到這樣sockaddr定義結構
 struct sockaddr {
  sa_family_t sa_family;
  char        sa_data[14];
 }
協議特定地址的14個字節的內容根據地址的類型進行解釋。已經在socket系統調用中選擇了AF_INET類型, 因此由sockaddr_in結構定義地址族INtErneT 。檢查man 7 ip并學習如何編譯sockaddr_in結構
 struct sockaddr_in {
  sa_family_t    sin_family; /* address family: AF_INET */
  in_port_t      sin_port;   /* port in network byte order */
  struct in_addr sin_addr;   /* internet address */
 };
 
 /* Internet address. */
 struct in_addr {
  uint32_t sin_addr;   /* address in network byte order */

[1] [2] [3] [4] [5]  下一頁

【聲明】:黑吧安全網(http://www.650547.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        安徽快3自由的百科 欢乐生肖大遗漏分析 吉林股票配资公司招聘 涨停打开再涨停后续走势 最近股票为什么大跌 北京十一选五一定牛走 吉林11选5开奖助手 安徽快三开奖结果 电视股票推荐 pk10五码一把中的方法 今天双色球开奖号码