# 应急
# 应急1
Administrator/P@ssword

查看可疑进程a.exe

36.50.226.121
# 应急2


C:\Windows下有一个svchost.exe,正常的系统文件应该是在C:\Windows\System32目录下
# 应急3

搜索exe程序,发现f.exe,可以根据同目录下的results.txt推断是fscan


# 应急4

查看系统日志,存在sqlserver爆破行为

192.168.88.12
# 谁知盘中餐
L-codes/Neo-reGeorg: Neo-reGeorg is a project that seeks to aggressively refactor reGeorg
# 谁知盘中餐-1


一共两个aspx,一个流量数据
流量数据访问了这两个URL,答案是其中之一

# 谁知盘中餐-2

Template.aspx中找到key和iv的读取方式

GetStr()及相关函数的实现部分

分析逻辑,实际上是取数组xs的内容,然后对字母做移位-3位处理


# 谁知盘中餐-3

编写解密Template.aspx流量脚本
请求数据格式如下,其中loginCa字段是有效数据

GetStr(6)对应loginCa

数据解密部分

关键函数RD()
先做一次b64decode,如果开头是sign:,则将后面的内容反转后再b64decode,不断循环

def RD(data):
tmp = base64.b64decode(data)
while tmp.startswith(b'sign:'):
tmp = base64.b64decode(tmp[5:][::-1])
return tmp
其次是AES解密
from Crypto.Cipher import AES
key, iv = b'79bec9b8470119f5', b'9220dc6228514959'
cipher = AES.new(key, AES.MODE_CBC, iv)
data = cipher.decrypt(sdata)

此时虽然大部分都是不可见字符,但是头尾都有一些规律
如果熟悉数据的头部1f8b可知是gz格式的文件头,或者可以尝试用cyberchef分析


如果用python解压gzip数据流,需要去掉AES加密的填充字节
import gzip
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
key, iv = b'79bec9b8470119f5', b'9220dc6228514959'
cipher = AES.new(key, AES.MODE_CBC, iv)
sdata = cipher.decrypt(sdata)
plaintext = unpad(sdata, AES.block_size)
data = gzip.decompress(plaintext)
最终解密的数据
# 3号数据包
dbUsername dish
execSql SELECT * FROM `dish`.`card` LIMIT 0,10
dbType mysql
methodName execSql
dbCharset UTF-8
sessionId bf405e2fd97cddd3
execType select
connectString server=127.0.0.1;port=3301;uid=dish;pwd=Sovell$))!79959;database=dish;
dbPassword Sovell$))!79959
dbDriver MySql.Data.MySqlClient.MySqlConnection
# 4号数据包
destFileName D:/sovell2/api/ExcelTemplate/Template.aspx
methodName moveFile
sessionId 99eb31ed466a5e42
srcFileName D:/sovell2/api/ExcelTemplate/1111.xls.aspx
# 谁知盘中餐-5
4的题目没截图

解密Global.aspx流量
解密逻辑比较明显,首先进行FromBase64String(),然后blv_decode()

但是这里的FromBase64String()是自定义函数

用python重写
en = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
de = "o5n/OZUfAMhHmcyXK9wD1uvgdEQ64sBGlbTxqLRC2+YJk3zj8trWNVIiSe7pFPa0"
dec_dict = {ord(de[i]): en[i] for i in range(len(de))}
def from_base64_string(b64str):
b64str = b64str.decode()
b64str = b64str[1:].replace(",", "+").replace(".", "/").replace("}", "=")
b64str = padding(b64str)
b64str = b64str.translate(dec_dict)
return base64.b64decode(b64str)
重写blv_decode()函数

info_dict = {
1: 'DATA',
2: 'CMD',
3: 'MARK',
4: 'STATUS',
5: 'ERROR',
6: 'IP',
7: 'PORT',
8: 'REDIRECTURL',
9: 'FORCEREDIRECT'
}
def blv_decode(data):
i = 0
info = {}
while i < len(data):
b = data[i]
i += 1
l = int.from_bytes(data[i:i+4]) - 257191907
i += 4
v = data[i:i+l]
i += l
if b > 1 and b <= 9:
info[info_dict[b]] = v.decode()
else:
info[b] = v
return info
解密请求数据可得到

{
0: b'MaksLUs8rQwmUxvbqQ2MTr6lwPz3pujuxpo4pVfYXmqhdSbB4xTBQYw3A4KC90F6fz2RJIw0SYzw3i84yaJ9R6yqAZKp7pXAIp47qpLB40OZ2aLjBVA3GHaS0vBxMcH2Ae5sb5QEHAz399wxG5bbQQa7rSvPlJtUySODBcZCC',
'CMD': 'CONNECT',
'MARK': '4m.OtmDqNmWd3c',
'IP': '10.148.254.17',
'PORT': '6100',
39: b'E9tJC4vjxCzlbjZmnWjO5MDFrOmaVAs0LtP7KTwmJmnCEUzLp9QASBKWWXWSkNqVroRP0YMACYTs8v1lSFqxqMNKR0vgNbccLPcyCaD9p6iNwEzf8a2mDuC7lyUKXRlP5ZSBDub9Ryi39V45x3Rik0KnkQWEtSU7T7gW8RoZrHf4ura6zjJLYlN1WSOMBFTIHNdPraFwG3uRDff'
}
其中0和39是占位数据,没用
对应的响应数据是OK

# RAT_TRACER

附件有一个流量包和一个.p12证书文件,打开流量包发现都是TLS协议,需要提取对应密钥
通过openssl提取私钥,提示输入密码时直接回车
openssl pkcs12 -in ST.p12 -nocerts -out private.key -nodes
在Wireshark中配置密钥,编辑-首选项-Protocol-TLS
先删除红框部分的SSL Log

编辑RSA keys list,添加刚才导出的私钥

点击确定后就能解密TLS流量,翻找到存在一些明文数据的数据包,追踪TCP流

观察发现这里存在很多个1f8b的gzip文件头,追踪流查看
看到头部前还有几字节的数据,与末尾的长度对应


去掉头部的长度后可以gzip解压

(或者) 可以全部导出后用binwalk提取

binwalk -e extract.bin
提取的70号文件对应这个流量的数据(binwalk已经自动解压)

解压第一层后,其中是一个msgpack格式数据,用python解包(cyberchef不行)
import msgpack
data = open('extract.bin', 'rb').read()
obj = msgpack.unpackb(buffer, raw=True)
print(obj.keys())
print(obj[b'Msgpack'][:100])
print(obj[b'Msgpack'][-100:])
解包后有三个字段,其中Msgpack字段的数据又是一个gzip压缩数据

去掉头部4字节长度,解压缩+解包
data2 = gzip.decompress(obj[b'Msgpack'][4:])
obj2 = msgpack.unpackb(data2, raw=True)
print(obj2.keys())
print(obj2[b'File'][:100])

四个字段,其中File字段又是一个gzip压缩数据
再次提取,解压,得到一个jpg文件
data3 = gzip.decompress(obj2[b'File'][4:])
print(data3[:100])

查看文件,应该是一个正常的JPG

找到流量中第二个大段传输的数据,用相同的方法gzip解压+msgpack解包
解第一层后仍然是一个嵌套

解第二层,得到真正的dll文件
data4 = gzip.decompress(buffer[4:])
obj4 = msgpack.unpackb(data4, raw=True)
print(obj4.keys())
# print(obj4[b'Dll'][:100])
data5 = gzip.decompress(obj4[b'Dll'][4:])
print(data5[:100])

IDA打开,提示可能是.NET的dll

改用dnSpy打开,里面代码有混淆

搜索AES

查找这个函数的调用


找到key和iv,根据代码判断应该就是这个地方,但是不知道对不对
# 客服小可

附件压缩包打开查看

查看快捷方式属性

C:\WINDOWS\system32\cmd.exe /c msiexec.exe /qn /i 获奖作品.zip TRANSFORMS=个人荣誉证明.zip && timeout /t 1 /nobreak && start winword /f C:\Users\Public\1.docx
恶意文件是msi installer格式
根据快捷方式执行的命令,获奖作品.zip是一个msi安装包,个人荣誉证明.zip是附加组件
用orca打开分析,CustomAction表中新增一项,调用了WixUI_Bmp_Down的Init函数

提取对应的文件,IDA打开分析


其中有释放文件操作,对应了三段硬编码数据
提取数据保存
base = 0x180041f20
with open(r'shellcode', 'wb') as f:
f.write(idc.get_bytes(base, 240354))
base = 0x18001a520
with open(r'shellcode0', 'wb') as f:
f.write(idc.get_bytes(base, 162304))
base = 0x180001000
with open(r'shellcode_func', 'wb') as f:
f.write(idc.get_bytes(base, 196))
第一段数据是word文件格式,经过分析是正常文件

第二段和第三段数据经过了加密,无法静态提取
第二段数据在Init函数执行解密后写入到文件C:\Users\Public\OneDrive.exe,在虚拟机中运行后可以复制出
第三段数据需要动态调试下断点查看

运行完红框部分的解密流程后,查看BaseAddress(0xCC0000),长度0xc4(196)
通过快捷键c转换为汇编代码,可以看到实际上是执行了刚才释放的OneDrive.exe

OneDrive.exe直接运行后会有一个cmd窗口输出Good!!!

微步沙箱分析没有网络连接的结果,提示有反逆向功能


ida打开OneDrive.exe分析,搜索字符串Good!!!找到对应函数

同时可以看到函数后续还有很多字节交换的操作

尝试动态调试,发现在调用输出Good的函数后程序就退出了,应该是反调试或者需要某些条件才会触发C2连接

重新调试,在调用177CC0函数之前直接设置RIP到下一行,直接走后续的数据解密流程
在CreateThread创建线程之前翻找一下内存,可以看到RAX已经指向了解密出来的shellcode的地址

双击跳转查看,按快捷键C成功转换成汇编

往下翻可以看到winhttp等字符串

继续往下找可以看到有字节数据,存放了C2通信地址

继续往下调试,创建进程后可以监控到进程连接了C2地址

简单总结
