这次和好兄弟组队了一只叫做Root的队伍打陇剑杯,最终半决赛逐日组第三、总榜第八晋级决赛,在决赛逐日组第四、总榜第八获得三等奖,应该是获一、二、三等奖里唯二由在校学生组成的战队(另一只是信工大)。不过写wp的时候比赛问了哪些题都忘的差不多了,测,所以只写了我记得到的。
半决赛
我们队应该是场上为数不多ak了的队伍,最后两个多小时全队直接开始植物大战僵尸了,难绷
easy
第一问
问test用户登录的密码是多少
第二问
图片中隐藏的数字是多少
把这个流的数据提取出来保存成zip
解压后得到一个宽高明显不正常的11.bmp,puzzlesolver爆破即可
第三问
被加密的字符串是多少
私钥
公钥
加密算法
密文
写脚本解密即可:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
def decrypt_message(encrypted_message, private_key_path):
with open(private_key_path, 'rb') as f:
private_key = RSA.import_key(f.read())
cipher = PKCS1_OAEP.new(private_key)
decrypted_message = cipher.decrypt(encrypted_message)
return decrypted_message.decode()
# 加密消息的示例代码
def encrypt_message(message, public_key_path):
with open(public_key_path, 'rb') as f:
public_key = RSA.import_key(f.read())
cipher = PKCS1_OAEP.new(public_key)
encrypted_message = cipher.encrypt(message.encode())
return encrypted_message
private_key_path = "./PRIVATEKEY.txt"#私钥
encrypted_message=open('./encrypted_file', 'rb').read()#把密文原始数据导出成文件
# 解密消息
decrypted_message = decrypt_message(encrypted_message, private_key_path)
print("解密后的消息:", decrypted_message)
session
第一问
通过注入得到的username是?
虽然那个注入语句比较抽象,不大看得出来怎么盲注的,但我们可以通过注入的最后一个字符判断正确的字符,比如一个一个看包,发现依次是abcdefabcd……,那么显然f就是正确的字符,因为它的下一个字符从头开始遍历了。当时注入得到的好像是.adminadmin111….,点号显然是注入失败了,所以用户名就是adminadmin111
第二问
除了root用户,还有哪个用户含有root权限
第三问
通过debug读取的哪个文件没有找到
这个文件没找到,所以是/etc/1
第四问
通过什么命令反弹的shell,提交md5加密的32位小写字符串
只有这个是200,解码后md5就是答案
easyshiro
第一问
系统的shiro key是多少,提交格式flag{xxxx}
爆破一下即可
flag{4AvVhmFLUs0KTA3Kprsdag==}
第二问
溯源攻击者的操作,其中有flag
把有一个一长串的remember=xxx提取出来:
用key解密后获得反序列化后的.class字节码:(https://potato.gold/navbar/tool/shiro/ShiroTool.html)(这个站纯前端实现的,ctrl+s了就能保存到本地了)
把这个class文件用Idea进行反编译:
中间这一段显然就是执行的代码,只是简单混淆过了,本地输出一下就可以了:
public class Main {
public static void main(String[] args) {
int[] var21 = new int[]{118, 120, 113, 59, 112, 109, 112, 53, 58, 86, 53, 55, 112, 118, 125, 122, 53, 115, 121, 116, 114, 110, 35, 113, 115, 113, 118, 38, 45, 33, 113, 35, 37, 39, 32, 119, 39, 116, 119, 44, 119, 34, 36, 112, 118, 36, 32, 44, 34, 36, 116, 116, 36, 36, 104, 55};
byte[] var22 = new byte[var21.length];
for(int var23 = 0; var23 < var21.length; ++var23) {
var22[var23] = (byte)(var21[var23] ^ 21);
}
System.out.println(new String(var22));
}
}
flag{6dfdc384d6025b2ab9b71ec15971aa11}
第三问
攻击者植入了内存webshell,使用这个webshell做了什么,其中有flag
解密内存马数据可以发现key为eac9fa38330a7535,然后aes解密
flag{1198be3b489ae0ddf88d0e6733e88fa6}
决赛
Win7
一个windows镜像取证题。
第一问
问的是镜像密码,因为这个镜像被wmware加密了,但题目题干提示了rockyou,所以用pyvmx-cracker爆破即可,最后密码是somewhere,用密码可以把虚拟机的加密取消,然后就能用取证工具一把梭了。
第二问
问的是windows上xshell的密码,火眼一把梭即可, 依稀记得密码是123456a
第三问
问的是登录脚本运行的程序路径,你打开那个windows虚拟机会弹计算器,排查一下文件会发现是有个叫2333.bat的文件在搞鬼,它里面写着calc,所以弹计算器了,因此答案是2333.bat的绝对路径(全小写)。
第四问
问的是访问www.baidu.com的次数,用浏览器历史记录看或者取证大师一把梭都能出来,依稀记得答案是10。
mid
第一问
问最先写入木马的连接密码,一个一个找,第一个是写入.1ndex.php那个,密码是1,不是写入1ndex.php那个:
第二问
问黑客从通过读取哪个文件获取了账号密码
那串base解码出来就是账号密码,所以是通过读取robots.txt
第三问
admin密码是通过哪个函数加密的
第四问
问hack用户的密码。
观察有一个包,这里黑客执行的命令是cat了/etc/shadow,但是很奇怪一个用户都看不懂:
我们在自己本地看看正常的/etc/shadow输出是什么:
很明显ebbg其实是root,qnrzba其实是daemon,jjj-qngn其实是www-data以此照推,所以unpx其实就是hack往前偏移13位后的结果,所以hack用户密码就是这个哈希解出来,但我们在场上最后没跑出来,测。
现在再来看没跑出来hash的原因其实很简单,因为这个输出的哈希应该也是偏移过了,我们把黑客执行的命令解码一下:
fdc4afba5b变成了sqp4nson5o,也就是说数字不偏移,字母偏移,写个还原脚本:
string = "unpx:$6$fpW3Kt1dCVadIIgT$WnsrSrGpdFOzKGpoANbTFlg4GxiMcijYuYl89SZ9p1snxYqxljs5rYmhSyrqg01CcBKapFHPUeJ83CW0IYP370:19586:0:99999:7:::"
offset = 13
encrypted_string = ""
for char in string:
if char.islower():
encrypted_string += chr((ord(char)-ord('a') + offset) % 26 + ord('a'))
elif char.isupper():
encrypted_string += chr((ord(char)-ord('A')+ offset) % 26 + ord('A'))
else:
encrypted_string += char
print("加密后的字符串为:", encrypted_string)
hack:$6$scJ3Xg1qPInqVVtG$JafeFeTcqSBmXTcbNAoGSyt4TkvZpvwLhLy89FM9c1fakLdkywf5eLzuFledt01PpOXncSUCHrW83PJ0VLC370:19586:0:99999:7:::
把这个文件保存为result.txt,然后john爆破即可‘
sudo john ./result.txt --format=crypt
ransom
第一问
问的是勒索病毒的哈希,流量包里翻一下可以看到有个test.exe,估计就是这个了,certutil 计算即可
certutil -hashfile test.exe sha256
SHA256 的 test.exe 哈希:
223ea13efd517d185708aff1da8b9cbbd9d1b97d1cb3e7b9107cda2ffcb599c9
CertUtil: -hashfile 命令成功完成。
第二问
问的是加密了多少文件,慢慢翻,在TCP第358个流可以看到一堆base64
解码出来就是具体加密了哪些文件
慢慢数呗
第三问
让你还原被加密的secret.txt。
看到有个老哥发的wp上有做法,照着复现一下
拖进去shift f12可以看到这里有个E:/tmp.txt文件
看到第277个流
这里读取了tmp.txt
输出是464ROI2+9sM+kxbMBiaBog==,但是base64完乱码了,base64后转16进制的值为e3ae11388dbef6c33e9316cc062681a2
282查看了secret.txt.enc
输出是P4m0zim6ISDKTc8yamhuNMqrgoCR3kB9cVFvhRvMFt0rVIS4zboCsF/Q/PLV0dH0,base64然后转16进制得到3f89b4ce29ba2120ca4dcf326a686e34caab828091de407d71516f851bcc16dd2b5484b8cdba02b05fd0fcf2d5d1d1f4
逆向源码得到病毒加密使用了aes加密的cbc模式,并且加密前还用文件名异或了文件内容(不知道咋分析的,那个微信文章这么写的)
from Crypto.Cipher import AES
from pwn import xor
key = bytes.fromhex('e3ae11388dbef6c33e9316cc062681a2')
c =bytes.fromhex('3f89b4ce29ba2120ca4dcf326a686e34caab828091de407d71516f851bcc16dd2b5484b8cdba02b05fd0fcf2d5d1d1f4')
enc = AES.new(key=key, mode=AES.MODE_CBC, iv=b'1234567890abcdef')
print(xor(enc.decrypt(c)[:-6], b"secret.txt"))
#flag{84bc7475-13e4-4177-92a1-00bb1d476442}