今年来和小伙伴们参加了BCTF,ALICTF,HCTF和SCTF,前几次基本上都是准备不充分,很多东西看到题目才去找资源,而且好些题过后看了Writeup才发现和真正解法擦肩而过。这次SCTF终于有所贡献,撸出了两题,其中有一题差一点就是FirstBlood。

以下是题解:

Misc300

用wireshark打开提供的pcap文件,大概可以看出这是一个smb认证过程,先设置过滤器,过滤出smb流量。从Negotiate Protocol Response报文可以看到smb版本和challenge:
misc300-1

从Session Setup AndX Request报文可以看到syclover用户所属的域以及ANSI Password和Unicode Password:
misc300-2

ANSI Password的生成过程是在syclover用户长度为16字节的LM Hash后补充5字节的0x00,得到21字节的Hash,再分成3组,每组7字节。将每组的7字节经过str_to_key函数处理成8字节的DES Key,对服务器返回的challenge进行标准DES加密,得到3组8字节的密文,最后将加密后的密文拼接在一起。Unicode Password生成过程类似,只不过DES密钥是经过NTLM Hash处理后得到的。

而根据LM Hash的生成过程,LM Hash的前8字节是将用户明文密码的前7位转为大写,再经过str_to_ket和标准DES加密处理得到的。

综上,ANSI Password的前8字节与用户明文密码的前7位的大写形式以及服务器响应的challenge有关。本例中,challenge为0x1122334455667788,因此可以通过challenge为0x1122334455667788的HALFLM彩虹表来查出syclover用户明文密码的前7位大写形式。
misc300-3

跑出明文密码前7位为NETLMIS后,再用msf tools目录下的脚本halflm_second.rb来穷举第二部分密码。
misc300-4

得到明文密码的大写形式后,用netntlm.pl脚本来根据NTLM Hash调整大小写。旧版本的BackTrack linux自带netntlm.pl脚本,新版本的kali linux需自行下载该脚本。
misc300-5

至此,得到syclover用户的明文密码,故flag为 SCTF{NetLMis666}

Misc400a

用winshark打开提供的pcap文件,大致看了一下,发现一个config.php文件的POST动作,故设置过滤器,过滤出https流量。

点开一个POST包,发现eval、base64等关键字,初步判断config.php为一句话客户端
Misc400a-1

分别对各个POST包的数据进行base64解码,得到关键部分操作:

1
2
3
cd /d “c:\inetpub\wwwroot\”
copy \\192.168.30.184\C$\windows\tasks\funnydata .\backup\1.gif
C:\progra~1\WinRAR\rar a C:\Inetpub\wwwroot\backup\wwwroot.rar C:\Inetpub\wwwroot\backup\1.gif –hpJJBoom

并从17729号报文中发现请求wwwroot.rar的http响应:
misc400a-2

直接保存二进制流到rar文件,winhex删掉https头部和php一句话客户端附加在头部的->|3字节,即可用密码JJBoom解压。

用winhex打开解压得到的1.gif,文件头部有MDMP文件头,判断为minidump文件,用windbg打开,使用 | 命令得到该minidump的进程名:
misc400a-3

得知为lsass.exe进程的dump,接下来直接用mimikatz读取密码:

mimikatz.exe log “sekurlsa::minidump funnydata.mdmp” sekurlsa::logonPasswords exit

打开日志文件得到密码,注意密码后面有5个空格(真是坑,看到已经在怀疑是不是密码里有tab键和空格键,直接输入这个不过。后来发发现有空格。)
misc400a-4

故本题flag为 SCTF{<TAB><SPACE> }

这PS:这题有个小插曲,我的mimikatz不知道干嘛大小变成0k了,还以为环境问题,找了台win7x64的机子来弄,还是不行。就这折腾一下,别人做出来了,哭晕在厕所。