欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

如何编写基于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: bolo@autistici.org / iambolo@protonmail.com
 
 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。看一下man 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.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载