Writeup|1024羊群之谜

admin 2022年10月29日15:16:04评论22 views字数 3994阅读13分18秒阅读模式
Writeup|1024羊群之谜


周一(10.24)发布的羊群之谜,大家都顺利通关了吗

1024|秘密行动!你能破解羊群之谜,拿下财富密码吗?

小编在后台看到大家踊跃参与身影,甚是欣慰

这次,小编特地邀请到率先攻破所有题目并飞速肝出Writeup的不愿意透露姓名大佬,来为大家做一期分享~


第一关


题目给了一个域名berichyang.grou

直接查A地址是没有解析的,于是遍历一下A、CNAME、TXT等


而查询TXT会发现

;; ANSWER SECTION:
berichyang.group.       600     IN      TXT     "spf1 a mx ?all nice try, but this is not your flag, try another~"


注:我喜欢用Linux系的,所以用dig命令查询的,Windows的小伙伴可以使用nslookup


这里重点关注一下spf这个关键词,提示让人想到是邮件相关的解析协议,这一类解析通常用TXT来做。


大概有以下几种协议


SPF(Sender Policy Framework)

SPF的原理比较像白名单。假设A公司的邮箱域名是a.com,由于A公司树大招风,经常有小人伪造a.com的身份发邮件,让A公司的老板苦不堪言。于是乎,A公司向全社会宣布:大家注意啊,只有ip地址是XXX的发信服务器才有资格说自己发的邮件是a.com来的,其他都是假的!此番过后,收件方看到来源是a.com的邮件,只要对比发信服务器的ip与a.com的SPF记录就知道是不是伪造的了,美滋滋


DKIM(DomainKeys Identified Mail)

DKIM的原理比较像防伪码。还是刚才那个A公司,它又想到一个方案:他给所有发出的邮件中都附带上一个防伪码,然后向全社会宣布:大家拿到防伪码可以登陆我司网站输入防伪码验证!而且他们专门把防伪码粘在了信封口且一旦揭开就无法再粘贴,以此保证防伪码与邮件一一对应。此番过后,收件方看到来源是a.com的邮件,撕下信封口的防伪码,登陆网站验证一下就知道是不是伪造的了,美滋滋


DMARC(Domain-based Message Authentication, Reporting and Conformance)

A公司发明了SPF,向社会宣布了一次,之后发明了DKIM,又向社会宣布了一次。每一次都要开新闻发布会、买头条、写软文,成本可不低。老板想这以后如果每发明一个防伪技术都要这么折腾一次我可受不了,于是乎想了个办法,一次性告诉全社会:我们采用了防伪技术,究竟有什么防伪手段以及怎么用都白纸黑字贴在公司大门口了,大家以后如果要验证是不是伪造的,就去公司大门口看一下说明书吧。这个说明书就是DMARC


通过了解DMARC的解析记录是,在子域_dmarc上做TXT记录:

Writeup|1024羊群之谜


查询可得到flag M01N{_1024_b3_a_h4ppy_y4ng_}


第二关


这个关卡,感觉就有点烂大街的意思了,当时游戏火的时候,各种修改,网上的文章教程多如牛毛,后来协议增加了加密验证,才得到了一定的遏制


这里我们使用burp抓包就可以看到map_id这个参数,早期版本就存在这个漏洞,直接修改关卡地图,让难度都如第一关一样简单


所以,直接修改map关卡


修改两关的map_id=80001,这样第二关改成第一关的难度

Writeup|1024羊群之谜


轻松通关拿到flag

Writeup|1024羊群之谜


flag M01N{847973053207e1a715b0fc6921a0a4f4}


第三关

说实话,第三关我一开始没有看懂题,我以为是pwn呢,但是一看没有输入当时就懵了好一会


看提示说让用trace和异常。说实话异常暂时没想到如何让他触发异常形成内存转储,转而使用trace方案


trace的话,首先想到ptrace,也就注入hook方面的东西了

#include <stdio.h>
#include <unistd.h>

const char *flag = "M01N{**************************}"

int main(){

    printf("flag addr : %pn",flag);
    flag = "I hope you are very happy every day.nBut you should think of ptrace or unexpected";
    puts(flag);
    return 0;
}


代码十分简单,先赋值了flag,当时想到了强网杯还是啥的题,以为是有个先于main函数的异常处理,解密flag来着,但是仔细看了一下想复杂了,就是全局变量存储flag,然后main函数执行的时候会对它进行二次覆盖,而我们要做的就是在覆盖之前把他的内存读一下就好了


nc连上服务器

ctf@9033f7730e96:~$ ls -al
ls -al
total 40
drwxr-xr-x 1 root ctf  4096 Oct 24 08:50 .
drwxr-xr-x 1 root root 4096 Oct 20 12:54 ..
-rw-r--r-- 1 root ctf   220 Apr  4  2018 .bash_logout
-rw-r--r-- 1 root ctf  3771 Apr  4  2018 .bashrc
-rw-r--r-- 1 root ctf   807 Apr  4  2018 .profile
-rw-r--r-- 1 root ctf    44 Oct 24 08:48 hint.txt
---s--x--x 1 root ctf  8688 Oct 19 07:56 play
-rw-r--r-- 1 root ctf   293 Oct 21 02:13 play.c


看了一下权限,具有s属性,这里让我摔了一跤


最初的写法是直接用ptrace找一个切入点,在main函数附近,覆盖之前。因为是全局变量,所以进入main函数的时候全局变量已经装载完成了,且地址固定。write的系统调用很多,也是比较频繁的,通过hook这个的一瞬间去直接print

printf("flag:%s"0x400638);


但是这里有一个非常大的问题,我就没注意,进程是我没有权限的,我的权限是非root用户,此时的内存是不可读不可写,就令人非常尴尬,也尝试过使用LD_PRELOAD去hook mai函数,或者说是去hook__libc_start_main这个,但是同样问题,本机ok,因为本机都是root权限,到了服务器上就疯狂报错


对了这里要提一点很灵性的东西,出题人专门给安装了wget,就是让你写程序去搞他的,但是我最初甚至妄想直接wget上传拖回来看看


通过多次尝试,发现这里内存不可读写,但是寄存器是可以操作的


虽然有源码,不太喜欢看源码,这样情况下,看源码很难看出来利用思路

Writeup|1024羊群之谜


这里正好有一个调用,我们把他提前不就成了吗


所以考虑修改寄存器,将地址劫持到puts

Writeup|1024羊群之谜


相当于跳过了给flag替换赋值的步骤,当第一次调用write的时候肯定还没有对flag进行覆盖,所以直接劫持,在进入write的时候强制跳转到0x40058E


程序就直接变成了

#include <stdio.h>
#include <unistd.h>

const char *flag = "M01N{**************************}"
    ……
    puts(flag);
    ……
int main(){
    ……
    puts(flag);
    ……
    printf("flag addr : %pn",flag);
    flag = "I hope you are very happy every day.nBut you should think of ptrace or unexpected";
    puts(flag);
    return 0;
    return 0;
}


(由于会有多处调用write,上述伪代码只是简要的作为描述理解。)


直接puts(flag)


直接输出了没有被替换的flag

Writeup|1024羊群之谜


如此轻松拿到

Writeup|1024羊群之谜


flag M01N{w1sh_y0u_happiness_forever}


当时做题的时候,还没有出hint,目前官方已经给的非常详细了

ctf@64ec566022a6:~$ cat hint.txt
cat hint.txt

https://clubby789.me/zer0pts2022/#readflag


官方的思路是劫持read系统调用,让读取随机字符的时候覆盖flag无法覆盖,导致输出的时候会是原样输出


后记


不愿意透露姓名的大佬:

Ok,终于婆婆妈妈,啰里啰唆的说完了。希望别嫌弃吧,为了鼠标垫折腰。而且文笔就这样,当年要是文科好,也去不了计算机专业,就这样吧


熄灯~


小编:

看了本期Writeup,大家是不是茅塞顿开,想亲自来复现一遍


好消息来了!小编特地将题目环境保留至本周五,欢迎感兴趣的同学来学习复现交流


感谢粉丝对本次活动的热情参与


也非常感谢这位不愿意透露姓名的大佬提供如此优秀的Writeup


欢迎大家在评论区留下你对“羊群之谜”的想法、疑惑、解题过程中的奇思妙想和有趣的故事~


Writeup|1024羊群之谜

绿盟科技M01N战队专注于Red Team、APT等高级攻击技术、战术及威胁研究,涉及Web安全、终端安全、AD安全、云安全等相关领域。通过研判现网攻击技术发展方向,以攻促防,为风险识别及威胁对抗提供决策支撑,全面提升安全防护能力。


Writeup|1024羊群之谜

M01N Team公众号

聚焦高级攻防对抗热点技术

绿盟科技蓝军技术研究战队

Writeup|1024羊群之谜

官方攻防交流群

网络安全一手资讯

攻防技术答疑解惑

扫码加好友即可拉群


原文始发于微信公众号(M01N Team):Writeup|1024羊群之谜

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月29日15:16:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Writeup|1024羊群之谜http://cn-sec.com/archives/1373352.html

发表评论

匿名网友 填写信息