24-25下半学年第一次线上赛 | Writeup

MISC 签到 发现每个emoji的英文的首字母就代表了真实的字符 例如home->🏠->h,以此类推出hello ctf -> 🏠🦅🍋🍋🍊 🐈🌮🍟 Spa 根据提示可知,和斯巴达密码棒有关,搜索之后了解过后得知其实就是字符移位,也就是栅栏密码 搜索栅栏密码解密工具,通过不断测试栏数后就能得到答案 因为存在空格,个别在线工具可能解不出来,这里附上我使用的工具栅栏密码在线加密解密 - 千千秀字 CRYPTO ezRsa exp如下 from Crypto.Util.number import * import gmpy2 n = e = 65537 c = def factor(n): pq_list = [] a = gmpy2.iroot(n, 2)[0] while 1: B_2 = pow(a, 2) - n if gmpy2.is_square(B_2): b = gmpy2.iroot(B_2, 2)[0] p1q1= a - b p2q2 = a + b pq_list.append([p1q1, p2q2]) if len(pq_list) == 2: break a += 1 return pq_list pq_list = factor(n) X1, Y1 = pq_list[0] X2, Y2 = pq_list[1] p1 = gmpy2.gcd(X1, X2) q1 = gmpy2.gcd(Y1, Y2) p2 = X2 // p1 q2 = Y2 // q1 phi = (p1 - 1)*(q1 - 1)*(p2 - 1)*(q2 - 1) d = gmpy2.invert(e,phi) m = pow(c,d,n) flag = long_to_bytes(m) print(flag) WEB 打赏 详情见下一篇博客HKcert CTF 2024 final mini-ad | Writeup | Red的小屋 ...

March 2, 2025 · 2 min · Red

[HTB]第六章

本章靶机为Cat、Backfire、Titanic。(本章踩坑细节比较多) apache2 access.log 这个文件下会有好东西,一般碰到用GET传敏感数据的地方都可以关注一下 PDO语句 一般在做数据库交互的地方都会用PDO语句防止sql注入,像下面这样 出现这种sql执行一般可以直接略过,不会出现注入。什么样的地方才可能出现注入呢?像下面这样 这里只有delete语句做PDO处理,insert语句使用直接拼接的方式。sqlmap就能扫出来 登录框、表单提交和邮件 都是xss出现的重灾区,多发发 邮箱 在/var/mail目录,linpeas能扫出可以访问的邮箱目录 Gitea 一个能让你搭建类似github一样的代码托管仓库的开源项目。当然需要注意它的版本,可能会有xss漏洞 https://www.exploit-db.com/exploits/52077 另外,如果能直接读文件,就要关注一些Gitea的敏感文件。比如data/gitea/gitea.db、data/gitea.db、custom/conf/app.ini和data/conf/app.ini swaks 简易邮件发送小工具,格式如下 swaks --to "aka@redshome.com" --from "sunny@localhost" --header "Subject: click link" --body "http://localhost:3000/" --server localhost --port 25 --timeout 30s wss协议 ws套上了tls就是wss。包体也不太一样,不能直接用ws连wss ssh-keygen 用来生成私钥。有些靶机不吃ed25519,rsa比较通用 ssh-keygen -t rsa -b 4096 或者 ssh-keygen -t ed25519 字节长度其实无所谓,打靶机能用就行 iptables-save提权 和gobuster提权有点类似。把ssh公钥通过iptables规则保存到authorized_keys里。具体操作如下 首先把公钥写到一个input链里 iptables -A INPUT -i lo -j ACCEPT -m comment --comment $'nssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFafyRywbrdQjXxVMl1rKsXLVdY4xnkFTNAAkDGRPsiJ root@akared' 再保存即可 iptables-save -f /root/.ssh/authorized_keys 接口的权限 有时候像download、filename这种接口的权限就足够读user.txt,多试试 一个john的小坑 john在指定wordlist的时候记得要加=或者:,不然会扫不出来 ...

February 27, 2025 · 1 min · Red

HTB CDNio | Writeup

可能是这题的全网第一篇简中wp( 分析 按照惯例,先找flag在哪 在数据库,并且在admin用户同一条记录下。再分析一下功能,主要就四个 根路由,查询输入的用户是否存在(app/blueprints/auth/routes.py) /register,注册(app/blueprints/auth/routes.py) /visit,分析功能后发现可以直接携带admin用户的token并请求任意路由(app/blueprints/bot/routes.py和app/utils/bot.py) 带有profile字样的任意路由或其他路由,输出保存在数据库里的详细数据(app/blueprints/main/routes.py) 其中第四个功能的路由比较特殊 @main_bp.route('/<path:subpath>', methods=['GET']) 意思就是什么uri他都吃,再分析下面具体的实现代码 if re.match(r'.*^profile', subpath): # Django perfection ... ... else: return jsonify({"error": "No match"}), 404 就可以得知,除了在其他代码里定义好的路由外,没有’profile’字样的uri最后都会被丢个No match 分析完功能,思路就很清晰了,应该就是想办法利用visit路由携带好的token去读profile。 但分析完后发现,虽然能请求profile,但上面这段代码很明显只能访问但不能回显携带的内容 所以要想个办法把请求的内容带出来。 我很少看题目附件里给的nginx配置文件,除非真的没有思路继续下去。而这题就正好是这种少数题目之一 看起来nginx在实现一种和CDN一样的效果,把前端访问过的静态文件存下来,如果在他的缓存路径里就直接读缓存,如果不在就把请求交给gunicorn做正常访问。 根据上面的分析也可以知道,很明显后端对/profile这个路由的访问处理并不是很严格,不管我访问什么稀奇古怪的路径,只要路径里带有profile就都会被判定为/profile。所以当我访问profile/1.css时,/profile的内容就会被缓存到profile/1.css里,我再正常地去访问profile/1.css就能够拿到/profile的内容。这种攻击方式被叫做缓存欺骗 实操 来看看具体题目,首先我想要访问/visit就需要有一个token。不过这个token是什么无所谓,只要有就行。所以需要先注册一个 接着拿去登陆,获取token(ip地址不一样别在意,就是拿平台靶场试的而已) 最后就可以拿去访问visit,出现下面字样说明访问成果 不过,完全一样的请求包也有可能在你访问后给你丢个invalid token,这种情况只要多发几次就行。原因不明,感觉像是HS256导致的某种神奇反应导致token间歇性不识别= = 最后正常访问即可

February 10, 2025 · 1 min · Red

[HTB]第五章

本篇靶机Certified,Cicada,EscapeTwo。环境都为windows AS-REPRoasting 一种针对 Windows AD的密码攻击技术,它的目标是从AD中抓取和破解弱密码的用户凭据。这种技术特别针对使用 Kerberos 认证协议 的环境 其实有点类似像批量尝试匿名登陆,攻击脚本如下 impacket-GetNPUsers -dc-ip 10.10.11.41 -no-pass -request -usersfile user_list certified.htb/ nxc smb常用攻击参数 --rid-brute:用rid爆破用户名,爆破出来的可能比实际少,一般是在只有匿名用户的时候用 --continue-on-success:用来测试用户名和密码,直到成功也不停下。也就是密码喷洒 --shares:用来查看当前用户能够访问的smb目录 --users:查看当前用户能看到的用户名,会比rid-brute准确。而且能看到desc,说不定会有特殊收获 --local-auth:使用当前被攻击机器自带的本地身份验证,而不使用域验证 SeBackupPrivilege和SeRestorePrivilege权限 当使用whoami /pri查看用户有SeBackupPrivilege和SeRestorePrivilege权限时,就可以用PTH 步骤是先将注册表中的sam和system存下来 接着用secretsdump dump出hash 最后拿着hash登陆就行 或者用nxc smbclient 使用格式如下 smbclient '\\11.4.5.14\' -U akared 进入后再输入密码就行 windows server常用端口服务对照表 445:smb(共享文件服务) 5985:winrm(远程命令执行) 135:rpcclient (搜集用户名和组名) 1433:mssql(数据库) awk妙用 除了常规的-F分割外,还有一个就是NR。这个表示当前行数,从1开始计数。下面是个例子 awk -F' ' 'NR>1 {print $5}' 这样就能去掉首行内容。另外,awk还有一个特殊元素是$0,表示当前行的整行内容 awk经常被用在和paste配套使用,paste是用来对输出内容进行分割的,这样awk处理完的端口数据就可以直接丢到nmap Writeowner权限修改密码 理论上说,有这个权限应该就能修改被控用户的密码。但这位博主没有成功,不知道为什么,就顺手记录一下吧https://cn-sec.com/archives/3623739.html bloodhound信息收集 除了传统的上传exe和ps1搜集,还有一种是直接通过bloodhound-python,这种方法可以不需要拿到shell,但用户名密码还是得提供。适用于shell不方便使用的时候 bloodhound-python -c All -u oscar -p 86LxLBMgEWaKUnBG -ns 10.10.11.51 -d sequel.htb -dc DC01.sequel.htb --zip bloodAD 一个可以修改用户AD中保存的权限的工具,下面示例如何修改用户ca_svc的owner为ryan ...

February 4, 2025 · 1 min · Red

[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