护网自动化脚本
Posted 雷神众测
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了护网自动化脚本相关的知识,希望对你有一定的参考价值。
声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
前言
为了护网需要写了这么个小脚本,本文主要介绍下这个自动化工具的实现思路,以及这个工具的使用方法。
No.1
本文主要内容
1、Masscan与NMAP联动
2、扫描结果解析工具
3、几款开源工具 Eyewitness、tomcat-weak-password-scanner、漏洞发现、brutespray
NMAP是渗透测试人员广泛使用的老牌开源工具,功能强大,但扫描速度较慢。Masscan号称是世界上最快的扫描器,但功能较单一。很多经验丰富的渗透大佬都会将这两个东西结合在一起使用。
我们在红队前期充分收集目标企业的IP资产后,即可以使用CIDR等IP的表示方法导入扫描器。目前暂不支持目标域名的导入方式有两个原因:
1、DNS信息收集的过程有点慢
2、为了尽量保证精准度,暂时不想加入太多功能
在开始之前先介绍一下Masscan的设置,--rate这个参数代表 packets/second 每秒发送的数据包,这个和带宽没啥关系。
Masscan -p1-65535 10.0.0.0/24 --rate 100000 -oX scan.xml
--rate <packets-per-second>: specifies the desired rate for trans‐
mitting packets. This can be very small numbers, like 0.1 for
transmitting packets at rates of one every 10 seconds, for very
large numbers like 10000000, which attempts to transmit at 10 mil‐
lion packets/second. In my experience, Windows and can do 250 thou‐
sand packets per second, and latest versions of Linux can do 2.5
million packets per second. The PF_RING driver is needed to get to
25 million packets/second.
那么如何计算出适用于自己带宽的--rate设置呢?我算了一下Masscan的扫描一个数据包是68byte:
Masscan的一个包是68字节,如果我们每秒钟要发送10w/秒,就需要6.48M,68*100000/1024/1024=6.48M以上的带宽。通常windows每秒能发25W/秒,linux250W/秒。PF_RING可以达到2500W/秒。我在脚本中使用的是--rate 30000,也就是需要1M的带宽。
下面说说VPS的相关选择,在国内的阿里云/腾讯云虽然带宽足够,但是我发现机房使用Masscan等发包太快的工具是会导致丢包的,效果一点不好。而国外的服务器过于拥挤,通常一般的线路丢包有点严重,但一般目标企业的网络线路都还可以,所以我选择了不限制使用Masscan的国外vps。
No.2
Masscan与NMAP联动
BASH脚本:
sudo masscan -p1-65535 --rate 30000 --open -iL $TARGET -oX $NRESULTS_PATH/masscan.xml
sudo rm $WORKING_DIR/paused.conf
open_ports=$(cat $NRESULTS_PATH/masscan.xml | grep portid | cut -d """ -f 10 | sort -n | uniq | paste -sd,)
cat $NRESULTS_PATH/masscan.xml | grep portid | cut -d """ -f 4 | sort -V | uniq > $WORKING_DIR/nmap_targets.tmp
sudo nmap -sVC -p $open_ports --open -v -Pn -n -T4 -iL $WORKING_DIR/nmap_targets.tmp -oX $NRESULTS_PATH/nmap.xml
sudo rm $WORKING_DIR/nmap_targets.tmp
xsltproc -o $NRESULTS_PATH/nmap-bootstrap.html $WORKING_DIR/bootstrap-nmap.xsl $NRESULTS_PATH/nmap.xml
No.3
扫描结果解析工具
有了nmap的xml,就可以提取出来里面的信息,进行下一步自动化测试了。在自动化测试之前需要了解一下这个开源的nmap结果解析工具nmap-parse-output:
检查并安装Nmap-parse-output解析工具:
if [ -d "nmap-parse-output" ];then
echo -e "${BLUE}[-] Latest version of Nmap-parse-output already installed. Skipping...${RESET}"
else
echo -e "${GREEN}[+] Installing nmap-parse-output.${RESET}"
git clone https://github.com/ernw/nmap-parse-output
fi
提取http/https的url
nmap-parse-output nmap.xml http-ports
nmap-parse-output nmap.xml tls-ports | awk '{print "https://"$1}'
提取服务/产品名称
nmap-parse-output nmap.xml service-names
nmap-parse-output nmap.xml product
提取所有Tomcat URL
nmap-parse-output nmap.xml search-product "Apache Tomcat"
提取title
nmap-parse-output nmap.xml http-title"
我们把nmap识别出来的http/https的端口、以及所有Apache Tomcat应用全部导入到临时文件url.tmp和ip.txt/port.txt中方便下一步的Web自动化测试,再保存http-title、product、service-names方便查看,了解目标信息。
$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml http-ports | tee url.tmp
$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml tls-ports | awk '{print "https://"$1}'|tee -a url.tmp
cat url.tmp |sort|uniq >url_list && rm -rf url.tmp
$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml service-names > $NRESULTS_PATH/service-names.txt
$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml product > $NRESULTS_PATH/product.txt
IFS_old=$IFS;IFS=$' '
for line in `$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml http-title`;do echo -e $line;done | tee $NRESULTS_PATH/http-title.txt
IFS=$IFS_old
$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml search-product "Apache Tomcat" | awk -F : '{print $1}'>tomcat-weak-password-scanner/ip.txt
$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml search-product "Apache Tomcat" | awk -F : '{print $2}'>tomcat-weak-password-scanner/port.txt
No.4
Eyewitness
EyeWitness功能:
1、它的快照可以让我们更直观地识别资产,通过网站类型快速判断网段是否属于目标。
2、更直观的看所使用的到应用是什么。
3、判断是否存在登陆页面,识别常见登陆后台。
4、RDP登陆账户显示。
检查并安装Eyewitness工具:
if [ -d "EyeWitness" ];then
echo -e "${BLUE}[-] Latest version of Eyewitness already installed. Skipping...${RESET}"
else
echo -e "${GREEN}[+] Installing EyeWitness.${RESET}"
git clone https://github.com/FortyNorthSecurity/EyeWitness && sudo ./EyeWitness/setup/setup.sh
fi
if [ -d "tomcat-weak-password-scanner" ];then
echo -e "${BLUE}[-] Latest version of tomcat-weak-password-scanner already installed. Skipping...${RESET}"
else
echo -e "${GREEN}[+] Installing tomcat-weak-password-scanner.${RESET}"
git clone https://github.com/magicming200/tomcat-weak-password-scanner
fi
判断是否存在登录页面,识别网络设备/后台等
判断高价值目标
更直观的展示资产
识别rdp登录用户名
sudo -i python3 $WORKING_DIR/EyeWitness/EyeWitness.py -x $NRESULTS_PATH/nmap.xml --no-prompt -d $ERESULTS_PATH --no-dns --ocr
No.5
漏洞检测
1、漏洞指纹(Weblogic、Shiro、Strust2、Solr等...)
2、CMS识别(Seeyon、通达、泛微、Discuz、DeDeCms等...)
3、服务爆破(MSSQL、SSH、VNC、FTP、TELNET等...)
漏洞检测使用的是伟刚写的漏洞检测插件,模版如下:
主程序
import sys
import threading
from plugins import *
from termcolor import cprint
from queue import Queue
vul_list = []
web_queue = []
with open(sys.argv[1], "r") as f:
for i in f.readlines():
web_queue.append(i.strip())
f.close()
for vulClass in [shiro,weblogic,struts2,jboss]:
detect = vulClass.Detect
try:
alive_Web_queue = Queue(-1)
for _ in web_queue:
alive_Web_queue.put(_)
threads = []
thread_num = 30
for num in range(1, thread_num + 1):
t = detect(alive_Web_queue, vul_list)
threads.append(t)
t.start()
for t in threads:
t.join()
except Exception as e:
print(r'[-] Load Vul [{}] Error: {}'.format(detect.name, e.args))
continue
插件模版
import requests
import threading
from termcolor import cprint
from urllib.parse import urlparse
class Detect(threading.Thread):
def __init__(self, alive_Web_queue, vul_list):
threading.Thread.__init__(self)
self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0'}
self.alive_Web_queue = alive_Web_queue
self.vul_list = vul_list
def run(self):
while not self.alive_Web_queue.empty():
alive_web = self.alive_Web_queue.get()
self.run_detect(alive_web)
def CVE_2017_10271(self,url):
weblogic_url = url + '/wls-wsat/CoordinatorPortType'
try:
res = requests.get(url=weblogic_url, headers=self.headers, allow_redirects=False, timeout=10)
if 'CoordinatorPortType?wsdl' in res.text:
cprint('[CVE_2017_10271] {}'.format(url), 'red')
self.vul_list.append(['weblogic', url])
else:
print('[-] {}'.format(url))
except Exception as e:
pass
def CVE_2019_2725(self,url):
weblogic_url = url + '/_async/AsyncResponseService'
try:
res = requests.get(url=weblogic_url, headers=self.headers, allow_redirects=False, timeout=10)
if 'AsyncResponseService home page' in res.text:
cprint('[CVE-2019-2725] {}'.format(url), 'red')
self.vul_list.append(['weblogic', url])
else:
print('[-] {}'.format(url))
except Exception as e:
pass
def CVE_2019_2729(self,url):
weblogic_url = url + '/wls-wsat/CoordinatorPortType11'
try:
res = requests.get(url=weblogic_url, headers=self.headers, allow_redirects=False, timeout=10)
if 'CoordinatorPortType11?wsdl' in res.text:
cprint('[CVE-2019-2729] {}'.format(url), 'red')
self.vul_list.append(['weblogic', url])
else:
print('[-] {}'.format(url))
except Exception as e:
pass
def run_detect(self, url):
if not urlparse(url).scheme:
url = 'https://' + url
else:
url = url
self.CVE_2017_10271(url)
self.CVE_2019_2725(url)
self.CVE_2019_2729(url)
演示效果
No.6
服务爆破
爆破使用的是brutespray开源工具,可以直接提取nmap的xml扫描结果,然后进行对应的服务爆破。
还有tomcat-weak-password-scanner:
No.7
工具使用
#!/bin/bash
TARGET="$1"
TIME=`date +"%Y%m%d%H%M"`
WORKING_DIR="$(cd "$(dirname "$0")" ; pwd -P)"
NRESULTS_PATH="$WORKING_DIR/$TIME/nresults"
ERESULTS_PATH="$WORKING_DIR/$TIME/eresults"
RED=" 33[1;31m"
GREEN=" 33[1;32m"
BLUE=" 33[1;36m"
YELLOW=" 33[1;33m"
RESET=" 33[0m"
checkArgs(){
if [[ $# -eq 0 ]]; then
echo -e " ${RED}[!] ERROR:${RESET} Invalid argument! "
echo -e " ${GREEN}[+] USAGE:${RESET}$0 ip.txt "
exit 1
elif [ ! -s $1 ]; then
echo -e " ${RED}[!] ERROR:${RESET} File is empty and/or does not exists! "
echo -e " ${GREEN}[+] USAGE:${RESET}$0 ip.txt "
exit 1
fi
}
setupTools(){
echo -e "${GREEN}[+] Setting things up.${RESET}"
sudo apt update -y
#sudo apt upgrade -y
#sudo apt autoremove -y
#sudo apt clean
sudo apt install -y gcc g++ make libpcap-dev xsltproc
echo -e "${GREEN}[+] Creating results directory.${RESET}"
mkdir -p $NRESULTS_PATH
}
installTools(){
LATEST_MASSCAN="1.0.6"
if [ ! -x "$(command -v masscan)" ]; then
echo -e "${GREEN}[+] Installing Masscan.${RESET}"
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make -j
sudo make -j install
cd $WORKING_DIR
rm -rf masscan
else
if [ "$LATEST_MASSCAN" == "$(masscan -V | grep "Masscan version" | cut -d " " -f 3)" ]; then
echo -e "${BLUE}[-] Latest version of Masscan already installed. Skipping...${RESET}"
else
echo -e "${GREEN}[+] Upgrading Masscan to the latest version.${RESET}"
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make -j
sudo make -j install
cd $WORKING_DIR
rm -rf masscan*
fi
fi
LATEST_NMAP="$(wget -qO- https://nmap.org/dist/ | grep -oP 'nmap-([0-9.]+).tar.bz2'| tail -n 1 | grep -oP 'nmap-[0-9.]+' | grep -oP '[0-9.]+' | head -c -2)"
if [ ! -x "$(command -v nmap)" ]; then
echo -e "${GREEN}[+] Installing Nmap.${RESET}"
wget https://nmap.org/dist/nmap-$LATEST_NMAP.tar.bz2
bzip2 -cd nmap-$LATEST_NMAP.tar.bz2 | tar xvf -
cd nmap-$LATEST_NMAP
./configure
make -j
sudo make -j install
cd $WORKING_DIR
rm -rf nmap-$LATEST_NMAP*
else
if [ "$LATEST_NMAP" == "$(nmap -V | grep "Nmap version" | cut -d " " -f 3)" ]; then
echo -e "${BLUE}[-] Latest version of Nmap already installed. Skipping...${RESET}"
else
echo -e "${GREEN}[+] Upgrading Nmap to the latest version.${RESET}"
wget https://nmap.org/dist/nmap-$LATEST_NMAP.tar.bz2
bzip2 -cd nmap-$LATEST_NMAP.tar.bz2 | tar xvf -
cd nmap-$LATEST_NMAP
./configure
make -j
sudo make -j install
cd $WORKING_DIR
rm -rf nmap-$LATEST_NMAP*
fi
fi
if [ -d "nmap-parse-output" ];then
echo -e "${BLUE}[-] Latest version of Nmap-parse-output already installed. Skipping...${RESET}"
else
echo -e "${GREEN}[+] Installing nmap-parse-output.${RESET}"
git clone https://github.com/ernw/nmap-parse-output
fi
if [ -d "EyeWitness" ];then
echo -e "${BLUE}[-] Latest version of Eyewitness already installed. Skipping...${RESET}"
else
echo -e "${GREEN}[+] Installing EyeWitness.${RESET}"
git clone https://github.com/FortyNorthSecurity/EyeWitness && sudo ./EyeWitness/setup/setup.sh
fi
if [ -d "tomcat-weak-password-scanner" ];then
echo -e "${BLUE}[-] Latest version of tomcat-weak-password-scanner already installed. Skipping...${RESET}"
else
echo -e "${GREEN}[+] Installing tomcat-weak-password-scanner.${RESET}"
git clone https://github.com/magicming200/tomcat-weak-password-scanner
fi
}
portScan(){
echo -e "${GREEN}[+] Running Masscan.${RESET}"
sudo masscan -p1-65535 --rate 30000 --open -iL $TARGET -oX $NRESULTS_PATH/masscan.xml
sudo rm $WORKING_DIR/paused.conf
xsltproc -o $NRESULTS_PATH/masscan.html $WORKING_DIR/bootstrap-masscan.xsl $RESULTS_PATH/masscan.xml
open_ports=$(cat $NRESULTS_PATH/masscan.xml | grep portid | cut -d """ -f 10 | sort -n | uniq | paste -sd,)
cat $NRESULTS_PATH/masscan.xml | grep portid | cut -d """ -f 4 | sort -V | uniq > $WORKING_DIR/nmap_targets.tmp
echo -e "${RED}[*] Masscan Done! View the HTML report at $NRESULTS_PATH${RESET}"
echo -e "${GREEN}[+] Running Nmap.${RESET}"
sudo nmap -sVC -p $open_ports --open -v -Pn -n -T4 -iL $WORKING_DIR/nmap_targets.tmp -oX $NRESULTS_PATH/nmap.xml
sudo rm $WORKING_DIR/nmap_targets.tmp
xsltproc -o $NRESULTS_PATH/nmap-bootstrap.html $WORKING_DIR/bootstrap-nmap.xsl $NRESULTS_PATH/nmap.xml
echo -e "${RED}[*] Nmap Done! View the HTML reports at $NRESULTS_PATH${RESET}"
echo -e "${RED}[*] Nmap-parse-output Done!${RESET}"
echo -e "${GREEN}[+] Running Nmap-parse-output.${RESET}"
$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml http-ports | tee url.tmp
$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml tls-ports | awk '{print "https://"$1}'|tee -a url.tmp
cat url.tmp |sort|uniq >url_list && rm -rf url.tmp
$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml service-names > $NRESULTS_PATH/service-names.txt
$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml product > $NRESULTS_PATH/product.txt
IFS_old=$IFS;IFS=$' '
for line in `$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml http-title`;do echo -e $line;done | tee $NRESULTS_PATH/http-title.txt
IFS=$IFS_old
$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml search-product "Apache Tomcat" | awk -F : '{print $1}'>tomcat-weak-password-scanner/ip.txt
$WORKING_DIR/nmap-parse-output/nmap-parse-output $NRESULTS_PATH/nmap.xml search-product "Apache Tomcat" | awk -F : '{print $2}'>tomcat-weak-password-scanner/port.txt
}
vulScanner(){
sudo pip install -r requrement.txt
echo -e "${GREEN}[+] Running vul-scanner.${RESET}"
python3 $WORKING_DIR/epfa.py url_list | tee $NRESULTS_PATH/vul_result.txt
echo -e "${GREEN}[+] Running Eyewitness.${RESET}"
sudo -i python3 $WORKING_DIR/EyeWitness/EyeWitness.py -x $NRESULTS_PATH/nmap.xml --no-prompt -d $ERESULTS_PATH --no-dns --ocr
echo -e "${GREEN}[+] Running weak-password-scanner.${RESET}"
cd $WORKING_DIR/tomcat-weak-password-scanner/ && python koala_tomcat_cmd.py -h ip.txt -p port.txt && cd -
}
checkArgs $TARGET
setupTools
installTools
portScan
vulScanner
No.8
使用方法
echo ip > ip.txt
chmod +x ./recon.sh
./recon.sh ip.txt
招聘启事
简历投递至 strategy@dbappsecurity.com.cn
设计师(实习生)
————————
【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。
【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;精通photoshop/illustrator/coreldrew/等设计制作软件;
3、有品牌传播、产品设计或新媒体视觉工作经历;
【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽
简历投递至 strategy@dbappsecurity.com.cn
安全招聘
————————
公司:安恒信息
岗位:Web安全 安全研究员
部门:战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京
工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…
【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案
【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)
【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;
岗位:安全红队武器自动化工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)
【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。
【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。
【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。
简历投递至 strategy@dbappsecurity.com.cn
岗位:红队武器化Golang开发工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)
【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。
【岗位要求】
1.掌握C/C++/Java/Go/Python/javascript等至少一门语言作为主要开发语言;
2.熟练使用Gin、Beego、Echo等常用web开发框架、熟悉MySQL、Redis、MongoDB等主流数据库结构的设计,有独立部署调优经验;
3.了解docker,能进行简单的项目部署;
3.熟悉常见web漏洞原理,并能写出对应的利用工具;
4.熟悉TCP/IP协议的基本运作原理;
5.对安全技术与开发技术有浓厚的兴趣及热情,有主观研究和学习的动力,具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。
【加分项】
1.有高并发tcp服务、分布式、消息队列等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。
简历投递至 strategy@dbappsecurity.com.cn
专注渗透测试技术
全球最新网络攻击技术
END
以上是关于护网自动化脚本的主要内容,如果未能解决你的问题,请参考以下文章