Solar应急响应月赛-7月 WP
【题目信息】VOL_EASY
某企业服务器近日遭受隐秘入侵。安全团队通过日志溯源发现,黑客利用Web应用漏洞植入恶意后门,根据溯源的信息配合警方逮捕了黑客,安全团队已经紧急保存了黑客电脑的内存转储文件,请你开始取证以便固定证据。请根据题目文件,找出下面10条证据让罪犯服软吧!
这里用 volatility2 来做,练习一下命令
首先 imageinfo
vol2 -f vol_easy.vmem imageinfo
profile 用 Win7SP1x64
【任务1】VOL_EASY
黑客上传的一句话木马密码是多少?
filescan 扫描文件,保存结果
vol2 -f vol_easy.vmem --profile=Win7SP1x64 filescan > filescan.txt
用 notepad-- 打开,文件中搜索,排查一下桌面,发现很多感兴趣的文件
dumpfiles 导出 ezshell.php.txt ,-Q 指定 offset,-D 指定保存目录
vol2 -f vol_easy.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000007ddf2280 -D .
solar
【任务2】VOL_EASY
黑客使用的木马连接工具叫什么(比如xx.exe)?(仅首字母大写)
pslist 列出进程
vol2 -f vol_easy.vmem --profile=Win7SP1x64 pslist > pslist.txt
Antsword.exe
【任务3】VOL_EASY
黑客使用的木马连接工具的位置在哪里(比如C:\xxxx\xx.exe) ?
cmdline 列一下程序启动的命令行
vol2 -f vol_easy.vmem --profile=Win7SP1x64 cmdline > cmdline.txt
C:\Tools\AntSword-Loader-v4.0.3-win32-x64\AntSword.exe
【任务4】VOL_EASY
黑客获取到的FLAG是什么?
同【任务 1】导出 flag.txt 即可
flag{ok!get_webshell_is_good_idea~}
【任务5】VOL_EASY
黑客入侵的网站地址是多少(只需要http://xxxxx/)?
iehistory 导出浏览记录
vol2 -f vol_easy.vmem --profile=Win7SP1x64 iehistory > iehistory.txt
http://192.168.186.140/
【任务6】VOL_EASY
黑客入侵时,使用的系统用户名是什么?
由 iehistory 得知
Administrator
【任务7】VOL_EASY
黑客创建隐藏账户的密码是多少?
dump 蚁剑内存看看
vol2 -f vol_easy.vmem --profile=Win7SP1x64 memdump -p 1716 -D .
创建用户猜测执行了 net user,010 打开搜索一下
solar2025
【任务8】VOL_EASY
黑客首次操作靶机的关键程序是什么?
桌面中看到了 dump_lass.bat,导出
lsass.exe
【任务9】VOL_EASY
该关键程序的PID是多少?
根据 bat 脚本中的关键字,010 检索得
456
【任务10】VOL_EASY
该关键程序的内存文件保存到了什么地方?
同上题,可更改 010 编码为 UTF-8 方便检索
C:\phpstudy_pro\WWW\lsass.dmp
【题目信息】应急大师
这是一台被黑客入侵的服务器,安全团队有进行一些基础溯源。目前服务器已经断网处理,请你继续协助安全团队进行溯源分析,将整个证据链补充完整。服务器密码是qsnctf。
【任务1】应急大师
请提交隐藏用户的名称?
启动靶机即可看到
solar$
【任务2】应急大师
请提交黑客的IP地址?
在 nginx 日志中即可看到,此 ip 有大量 post 请求,检查响应 php 文件,确定为木马
192.168.186.139
【任务3】应急大师
请提交黑客的一句话木马密码?
solar2025
【任务4】应急大师
请提交黑客创建隐藏用户的TargetSid(目标账户安全ID)?
在 windows 安全日志中,筛选创建用户事件ID 4720
S-1-5-21-3845547894-970975367-1760185533-1000
【任务5】应急大师
请提交黑客创建隐藏账户的事件(格式为 年/月/日 时:分:秒)?
2025/7/23 17:05:45
【任务6】应急大师
黑客将这个隐藏用户先后加入了哪几个用户组?提交格式为 第一个用户组-第二个用户组,如student-teacher
筛选加入本地组事件 ID 4732
Users-Administrators
【任务7】应急大师
黑客通过远程桌面成功登陆系统管理员账号的网络地址及端口号?提交格式为 IP:PORT 如 127.0.0.1:41110
筛选登陆成功事 ID 4624,排查得到
192.168.186.139:49197
【题目信息】公交车系统攻击事件排查
思而听公交系统被黑客攻击,黑客通过web进行了攻击并获取了数据,然后获取了其中一位驾校师傅在FTP服务中的私密文件,其后黑客找到了任意文件上传漏洞进行了GETshell,控制了主机权限并植入了挖矿网页挖矿病毒,接下来你需要逐步排查。
【任务1】公交车系统攻击事件排查
分析环境内的中间件日志,找到第一个漏洞(黑客获取数据的漏洞),然后通过分析日志、流量,通过脚本解出黑客获取的用户密码数据,提交获取的前两个用户名,提交格式:flag
在 /var/log/apache2 目录下导出日志 access.log
base64 解码后观察发现为 sqlmap 执行的 sql 盲注,且每个正确的字符都执行了 != 的判断,所以只匹配 != 的即可
写脚本简单处理一下,首先正则提取所有 query 请求参数,然后尝试 base64 解码,最后正则提取三个值
import re
import urllib.parse
import base64
# 日志中提取 GET 请求的 query 参数
query_pattern = re.compile(r'search\.php\?query=([^ ]+)')
# 只匹配 != 的 payload
payload_pattern = re.compile(r'LIMIT (\d+),1\),(\d+),1\)\)!=(\d+)')
# 解码 query
def decode_query(q):
q = urllib.parse.unquote(q)
#忽略非base64
try:
q = base64.b64decode(q).decode("utf-8")
except:
pass
# print(q)
return q
# 打开日志分析
with open("access.log", "r", encoding="utf-8") as f:
for line in f:
m = query_pattern.search(line)
if not m:
continue
decoded = decode_query(m.group(1))
p = payload_pattern.search(decoded)
if p:
row = int(p.group(1))
pos = int(p.group(2))
if(pos == 1):
print()
val = int(p.group(3))
print(chr(val),end='')
flag{sunyue-chenhao}
【任务2】公交车系统攻击事件排查
黑客通过获取的用户名密码,利用密码复用技术,爆破了FTP服务,分析流量以后找到开放的FTP端口,并找到黑客登录成功后获取的私密文件,提交其文件中内容,提交格式:flag
排查 home 目录,在 /home/wangqiang/ftp 下发现 FTP 文件
INTERNAL_FTP_ADMIN_PASSWORD=FtpP@ssw0rd_For_Admin_Backup_2025
【任务3】公交车系统攻击事件排查
可恶的黑客找到了任意文件上传点,你需要分析日志和流量以及web开放的程序找到黑客上传的文件,提交木马使用的密码,提交格式:flag
在 /var/www/html/uploads 目录下发现 shell1. php
flag{woaiwojia}
【任务4】公交车系统攻击事件排查
分析流量,黑客植入了一个web挖矿木马,这个木马现实情况下会在用户访问后消耗用户的资源进行挖矿(本环境已做无害化处理),提交黑客上传这个文件时的初始名称,提交格式:flag
根据上题得到的 shell1. php,响应为md5前十六位+base64+md5后十六位,推测为哥斯拉流量
使用 BlueTeamTools 解密哥斯拉流量,在 NO.72211 流量包中找到上传文件的流量包,解密得到文件名
flag{map.php}
【任务5】公交车系统攻击事件排查
分析流量并上机排查,黑客植入的网页挖矿木马所使用的矿池地址是什么,提交矿池地址(排查完毕后可以尝试删除它)提交格式:flag
木马在 index. php,js 代码混淆了,找到了一串数字,跟踪一下函数发现调用了 fromCharCode,ascii 码解码得到矿池地址
flag{gulf.moneroocean.stream:10128}
B02-奇怪的加密器
糟糕!一个客户的服务器的一个文件被加密了,为了防止感染,我将其放入了回收站,请你快点恢复我的 flag 生成器!这非常重要!!!服务器密码是:qsnctf
import sys
from Crypto.Cipher import AES
from Crypto.Hash import SHA1, SHA256
from Crypto.Util.Padding import unpad
def try_decrypt(ciphertext, key, iv):
for hash_algo in [SHA1, SHA256]:
for encoding in ['utf-16le', 'utf-8']:
try:
h = hash_algo.new()
h.update(key.encode(encoding))
derived_key = h.digest()[:16]
cipher = AES.new(derived_key, AES.MODE_CBC, iv)
decrypted = unpad(cipher.decrypt(ciphertext), AES.block_size)
if decrypted[:2] == b'MZ':
return decrypted, f"Success with {hash_algo.__name__} and {encoding}"
except (ValueError, KeyError):
continue
return None, "All attempts failed"
def decrypt_file(encrypted_file, output_file, key):
with open(encrypted_file, 'rb') as f:
data = f.read()
for iv_size in [16, 32, 0]:
if iv_size == 0:
iv = bytes(16)
ciphertext = data
else:
iv = data[:iv_size]
ciphertext = data[iv_size:]
decrypted, msg = try_decrypt(ciphertext, key, iv)
if decrypted:
print(msg)
with open(output_file, 'wb') as f:
f.write(decrypted)
print(f"Successfully decrypted to {output_file}")
return
print(data[:32].hex())
if __name__ == "__main__":
print("Usage: python decrypt.py <encrypted_file> <output_file>")
encrypted_file = sys.argv[1]
output_file = sys.argv[2]
key = "secret_key_1234"
decrypt_file(encrypted_file, output_file, key)