2019 SANS假日黑客挑战赛完整解题攻略

本文详细记录了2019年 SANS假日黑客挑战赛的全部解题过程,涵盖Windows日志分析、网络流量分析、SQL注入、机器学习破解验证码、逆向工程加密算法等多个网络安全技术领域。

SANS Holiday Hack Challenge 2019: 解题报告

目标0 - 在广场与圣诞老人交谈

进入校园广场并与圣诞老人交谈。

只需离开车站,与站在院子里的圣诞老人交谈即可。

目标1 - 找到斑鸠

找到失踪的斑鸠。

在校园里走动,最终在学生会的内部找到了斑鸠。

目标2 - 还原被涂黑的威胁文档

有人给精灵大学发送了一封威胁信。信件主题行中全部大写的第一个单词是什么?请在广场找到这封信。

在院子的左上角,可以找到放在地上的PDF文件。 该文档通过简单地在文本上方添加矩形来进行涂黑,但文本数据仍然存在于文档中。 解决这个问题的一种方法是直接在PDF阅读器中打开文档,选择并复制所有文本(CTRL+A,CTRL+C),然后粘贴到文本编辑器中。 文本包括主题行:

主题:要求:将节日欢乐传播到其他节日和神话人物……否则后果自负!

因此得到最终答案“DEMAND”。

目标3 - Windows日志分析:评估攻击结果

我们发现针对Elf U域的攻击!使用事件日志数据,识别攻击者使用密码喷洒攻击入侵的用户帐户。Bushy Evergreen在火车站,可能能够帮助你。

我们可以使用Python库“python-evtx”分析事件日志,该库可以通过pip安装,并 accompanying 日志转储脚本从GitHub仓库下载:

1
2
$ pip3 install --user python-evtx
$ wget https://github.com/williballenthin/python-evtx/blob/master/scripts/evtx_dump.py

使用这个,我们寻找成功登录的帐户,并获取已登录的用户名列表。

1
2
3
4
5
6
7
$ python3 evtx-dump.py Security.evtx | grep -C20  4624 | grep 'TargetUserName' | sort | uniq
<Data Name="TargetUserName">DC1$</Data>
<Data Name="TargetUserName">gchocolatewine</Data>
<Data Name="TargetUserName">mstripysleigh</Data>
<Data Name="TargetUserName">pminstix</Data>
<Data Name="TargetUserName">sgreenbells</Data>
<Data Name="TargetUserName">supatree</Data>

然后我们可以查看每个用户名的登录尝试次数(事件4648)和失败次数(4625)

 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
$ python3 evtx-dump.py Security.evtx | grep -C20 supatree | grep 'EventID' | sort | uniq -c | sort -nr
    154 <EventID Qualifiers="">4648</EventID> <-- 登录尝试
     76 <EventID Qualifiers="">4625</EventID> <-- 登录失败
      3 <EventID Qualifiers="">4672</EventID>
      2 <EventID Qualifiers="">4776</EventID>
      2 <EventID Qualifiers="">4634</EventID>
      2 <EventID Qualifiers="">4624</EventID>

$ python3 evtx-dump.py Security.evtx | grep -C20 sgreenbells | grep 'EventID' | sort | uniq -c | sort -nr
    154 <EventID Qualifiers="">4648</EventID>
     77 <EventID Qualifiers="">4625</EventID>

$ python3 evtx-dump.py Security.evtx | grep -C20 gchocolatewine | grep 'EventID' | sort | uniq -c | sort -rn
    154 <EventID Qualifiers="">4648</EventID>
     77 <EventID Qualifiers="">4625</EventID>

$ python3 evtx-dump.py Security.evtx | grep -C20 mstripysleigh | grep 'EventID' | sort | uniq -c | sort -rn
    152 <EventID Qualifiers="">4648</EventID>
     77 <EventID Qualifiers="">4625</EventID>
      1 <EventID Qualifiers="">4769</EventID>
      1 <EventID Qualifiers="">4634</EventID>

$ python3 evtx-dump.py Security.evtx | grep -C20 pminstix | grep 'EventID' | sort | uniq -c | sort -nr 
      2 <EventID Qualifiers="">4776</EventID>
      2 <EventID Qualifiers="">4672</EventID>
      2 <EventID Qualifiers="">4634</EventID>
      2 <EventID Qualifiers="">4624</EventID>
      1 <EventID Qualifiers="">4769</EventID>
      1 <EventID Qualifiers="">4768</EventID>

我们看到“supatree”、“sgreenbells”、“gchocolatewine”和“mstripysleigh”都成为了大量登录尝试的目标。 然而,“supatree”的失败登录次数比其他帐户少一次,并且有额外的登录相关事件。因此,这是攻击者成功登录的帐户。 这给出了最终答案:“supatree”

目标4 - Windows日志分析:确定攻击者技术

使用这些标准化的Sysmon日志,识别攻击者用于从lsass.exe进程检索域密码哈希的工具。

在日志中搜索“lsass.exe”返回一个时间戳为132186398356220000的事件。随后的事件显示运行了以下可疑命令:

1
$ ntdsutil.exe  "ac i ntds" ifm "create full c:\hive" q q

谷歌搜索此命令显示这是转储Active Directory凭据的常用方法,因此使用的工具是“ntdsutil.exe”。 这给出了最终答案:“ntdsutil”

目标5 - 网络日志分析:确定受感染系统

攻击没有停止!你能帮助使用这些Zeek日志识别恶意软件感染系统的IP地址吗?

通过打开zip文件中的“index.html”文件,我们找到了一些关于日志的统计信息。点击“ELFU”,然后点击“Beacons”,即查看“elfu-zeeklogs/ELFU/ELFU/beacons.html”,显示有一台计算机与特定IP地址有可疑数量的连接。

分数 目标 连接数 平均字节 间隔范围 大小范围 间隔模式 大小模式
0.998 192.168.134.130 144.202.46.214 7660 1156.000 10 683 10 563

此外,通过查看“长连接”页面,即查看“elfu-zeeklogs/ELFU/ELFU/long-conns.html”,我们再次发现相同的IP地址有一个运行时间非常长的连接。

目标 目标端口:协议:服务 持续时间
192.168.134.130 148.69.64.76 443:tcp:-, 443:tcp:ssl 1035.9001

这两点都导致怀疑这是恶意软件感染系统。 这给出了最终答案:“192.168.134.130”

目标6 - Splunk

以elf身份访问https://splunk.elfu.org/,密码为elfsocks。对手在这次攻击中为Kent嵌入的消息是什么?该链接的SOC人员将帮助你!

登录SOC系统后,我们可以阅读聊天记录,发现有一个名为“sweetums”的系统与一个奇怪的IP通信。该系统属于“Banas教授”。 遵循Alice的建议,我们可以搜索“index=main santa”以找到与“大人物”(圣诞老人)相关的数据。这显示一些混淆的PowerShell脚本访问了一个名为“Naughty_and_Nice_2019_draft.txt”的文件。 再次遵循Alice的建议,使用搜索“index=main sourcetype=XmlWinEventLog:Microsoft-Windows-Sysmon/Operational powershell EventCode=3”并检查“dest_host”字段,我们找到一个名为“144.202.46.214.vultr.com”的主机。 下一步是找到启动恶意PowerShell代码的文档。遵循Alice的指导,并记住PID是十六进制还是十进制,最终引导我们到以下命令:

1
C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE” /n “C:\Windows\Temp\Temp1_Buttercups_HOL404_assignment (002).zip\19th Century Holiday Cheer Assignment.docm” /o “

然后我们可以使用stoQ搜索唯一的电子邮件地址。使用以下查询按发件人分组电子邮件(不区分大小写):

1
2
3
4
index=main sourcetype=stoq
rename results{}.workers.smtp.from as from
eval from=lower(from)
top limit=100 from

这显示了22个唯一地址,但其中一个是教授本人,剩下21个唯一发件人。 为了找到zip的密码,我们在电子邮件正文中搜索“password”,使用以下查询:

1
2
index=main sourcetype=stoq password
table results{}.workers.smtp.from results{}.workers.smtp.body

这显示密码是“123456789”,并由“bradly.buttercups@eifu.org”与zip文件一起发送。 为了获取实际文件,我们按照Alice的建议使用以下stoQ查询:

1
2
3
4
5
6
index=main sourcetype=stoq  “results{}.workers.smtp.from”=”bradly buttercups bradly.buttercups@eifu.org”
eval results = spath(_raw, “results{})
mvexpand results
eval path=spath(results, “archivers.filedir.path”), filename=spath(results, “payload_meta.extra_data.filename”), fullpath=path.”/”.filename
search fullpath!=””
table filename,fullpath

但当我们尝试下载文件时,得到以下消息:

1
$ curl -v 'https://elfu-soc.s3.amazonaws.com/stoQ%20Artifacts/home/ubuntu/archive/c/6/e/1/7/c6e175f5b8048c771b3a3fac5f3295d2032524af'

在现实世界中,这将是一个很好的工件供你调查,但它当然包含恶意软件,所以没有发布在这里。 别担心!由于stoQ,原始启用宏的Word文档的组件core.xml文件仍然在这个文件存档中。 找到它,你会成为一个快乐的精灵:-)

因此,我们改为查看“core.xml”文件

1
$ curl -v 'https://elfu-soc.s3.amazonaws.com/stoQ%20Artifacts/home/ubuntu/archive/f/f/1/e/a/ff1ea6f13be3faabd0da728f514deb7fe3577cc4'

节日欢乐作业19世纪欢乐Bradly ButtercupsKent你太不公平了。我们本来要让你成为冬季嘉年华的国王。Tim Edwards42019-11-19T14:54:00Z2019-11-19T17:50:00Z

我们找到消息:“Kent你太不公平了。我们本来要让你成为冬季嘉年华的国王。” 总之,问题的答案是: 培训1:sweetums 培训2:C:\Users\cbanas\Documents\Naughty_and_Nice_2019_draft.txt 培训3:144.202.46.214.vultr.com 培训4:19th Century Holiday Cheer Assignment.docm 培训5:21 培训6:123456789 培训7:bradly.buttercups@eifu.org 消息:“Kent你太不公平了。我们本来要让你成为冬季嘉年华的国王。”

目标7 - 进入蒸汽隧道

获得进入蒸汽隧道的权限。谁拿走了斑鸠?请告诉我们他们的名字和姓氏。

当我们进入“Minty的宿舍房间”时,我们注意到一个人进入了壁橱。使用Chrome开发者工具的“网络”选项卡,我们可以抓取可疑个人的图片:

他携带的钥匙似乎有六个凹槽,第六个几乎看不见。通过使用钥匙切割工具并尝试各种深度设置,最终我们可以制作以下钥匙:

提交此钥匙给锁打开门,我们可以去和那个人交谈,他自我介绍为“Krampus Hollyfeld”,这是目标的答案。

目标8 - 绕过Frido雪橇CAPTEHA

帮助Krampus赢得Frido雪橇比赛。

为了解决这个挑战,我们首先查看Chris Davis的演讲“机器学习在网络安全中的用例”。 使用他在GitHub上发布的工具,我们可以几乎直接将Krampus提供的图像放入工具中,并让它为圣诞主题图像训练分类模型。 有了完成的模型,我们然后将Chris脚本中的一些示例代码与Krampus构建的模板脚本“capteha_api.py”结合起来。 本质上,我们在他的脚本的“机器学习代码在这里”部分添加类似以下内容。

 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
types_lower = [x.lower() for x in challenge_image_types]

# 加载通过运行retrain.py在training_images目录上创建的训练好的机器学习模型
graph = load_graph('/tmp/retrain_tmp/output_graph.pb')
labels = load_labels("/tmp/retrain_tmp/output_labels.txt")

# 加载我们的会话
input_operation = graph.get_operation_by_name("import/Placeholder")
output_operation = graph.get_operation_by_name("import/final_result")
sess = tf.compat.v1.Session(graph=graph)

# 可以使用队列和线程加速处理
q = queue.Queue()
for image in b64_images:
    print('Processing Image {}'.format(image['uuid']))
    # 我们不想一次处理太多图像。最多10个线程
    while len(threading.enumerate()) > 10:
        time.sleep(0.0001)

    image_bytes = base64.b64decode(image['base64'])
    img_full_path = image['uuid']
    threading.Thread(target=predict_image, args=(q, sess, graph, 
                       image_bytes, img_full_path, labels, input_operation, 
                       output_operation)).start()

print('Waiting For Threads to Finish...')
while q.qsize() < len(b64_images):
    time.sleep(0.001)

prediction_results = [q.get() for x in range(q.qsize())]

message = '{img_full_path} is a {prediction} with {percent:.2%} Accuracy'
for prediction in prediction_results:
    print(message.format(**prediction))


final_answer = [x for x in final_answer if x['prediction'] in types_lower])
final_answer = [x['img_full_path'].split('/') for x in final_answer]
final_answer = ','.join([x[-1].split('.')[0] for x in final_answer])

最初,当尝试运行脚本时,我的虚拟机太慢,无法在验证码超时之前完成。 相反,我将代码和分类模型上传到一个96核的AWS虚拟机(感谢按秒计费)并在那里运行。 这产生了以下输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ python3 capteha_api.py 
WARNING:tensorflow:From capteha_api.py:11: The name tf.logging.set_verbosity is deprecated. Please use tf.compat.v1.logging.set_verbosity instead.
WARNING:tensorflow:From capteha_api.py:11: The name tf.logging.ERROR is deprecated. Please use tf.compat.v1.logging.ERROR instead.

Processing Image b7bd0ca2-e584-11e9-97c1-309c23aaf0ac
Processing Image bf16f3fe-e584-11e9-97c1-309c23aaf0ac
...
Processing Image 30e14fb6-e588-11e9-97c1-309c23aaf0ac
Processing Image 450b158a-e588-11e9-97c1-309c23aaf0ac
Waiting For Threads to Finish...
TensorFlow Predicted c3a916e7-e584-11e9-97c1-309c23aaf0ac is a Stockings with 95.03% Accuracy
...
TensorFlow Predicted 21da2ca1-e588-11e9-97c1-309c23aaf0ac is a Stockings with 99.97% Accuracy
TensorFlow Predicted 30e14fb6-e588-11e9-97c1-309c23aaf0ac is a Stockings with 99.81% Accuracy
77325d4a-e587-11e9-97c1-309c23aaf0ac,0bc4fa46-e588-11e9-97c1-309c23aaf0ac,f8f84d37-e587-11e9-97c1-309c23aaf0ac,90401425-e585-11e9-97c1-309c23aaf0ac,90f2902a-e586-11e9-97c1-309c23aaf0ac,3d906293-e587-11e9-97c1-309c23aaf0ac,b6370b2a-e586-11e9-97c1-309c23aaf0ac,78234a66-e586-11e9-97c1-309c23aaf0ac,4ca13fd4-e587-11e9-97c1-309c23aaf0ac,928db7c2-e587-11e9-97c1-309c23aaf0ac,f8080294-e585-11e9-97c1-309c23aaf0ac,6ac79637-e587-11e9-97c1-309c23aaf0ac,303a3180-e588-11e9-97c1-309c23aaf0ac,6469d904-e585-11e9-97c1-309c23aaf0ac,acce385e-e586-11e9-97c1-309c23aaf0ac,71610c5b-e585-11e9-97c1-309c23aaf0ac,eb360396-e587-11e9-97c1-309c23aaf0ac,8e57d269-e587-11e9-97c1-309c23aaf0ac,50f0a2c2-e587-11e9-97c1-309c23a
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计